spree_core 6.0.0.beta3 → 6.0.0.rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +2 -2
- data/app/helpers/spree/images_helper.rb +0 -57
- data/app/jobs/spree/base_job.rb +21 -0
- data/app/jobs/spree/carts/reap_expired_job.rb +2 -2
- data/app/jobs/spree/collections/regenerate_time_based_job.rb +6 -3
- data/app/jobs/spree/orders/finalize_stale_drafts_job.rb +8 -5
- data/app/jobs/spree/payments/cancel_unused_sessions_job.rb +61 -0
- data/app/jobs/spree/seller_payouts/sweep_seller_job.rb +2 -0
- data/app/mailers/spree/admin_user_mailer.rb +4 -19
- data/app/mailers/spree/base_mailer.rb +96 -13
- data/app/mailers/spree/email_template_mailer.rb +27 -0
- data/app/mailers/spree/export_mailer.rb +3 -4
- data/app/mailers/spree/import_mailer.rb +3 -4
- data/app/mailers/spree/invitation_mailer.rb +24 -7
- data/app/mailers/spree/seller_user_mailer.rb +4 -16
- data/app/mailers/spree/webhook_mailer.rb +2 -2
- data/app/models/concerns/spree/acted_by.rb +1 -1
- data/app/models/concerns/spree/admin_user_methods.rb +13 -1
- data/app/models/concerns/spree/api_typed.rb +91 -0
- data/app/models/concerns/spree/calculator/tiers.rb +76 -0
- data/app/models/concerns/spree/customer_methods.rb +15 -14
- data/app/models/concerns/spree/email_template_identity.rb +52 -0
- data/app/models/concerns/spree/parameterizable_name.rb +2 -0
- data/app/models/concerns/spree/payment_session_transitions.rb +8 -2
- data/app/models/concerns/spree/post_sale/taxation.rb +54 -0
- data/app/models/concerns/spree/post_sale/taxed_line.rb +51 -0
- data/app/models/concerns/spree/preference_schema.rb +4 -12
- data/app/models/concerns/spree/product_scopes.rb +11 -1
- data/app/models/concerns/spree/provider_listing.rb +41 -0
- data/app/models/concerns/spree/publishable.rb +82 -14
- data/app/models/concerns/spree/purchase/addresses.rb +23 -10
- data/app/models/concerns/spree/purchase/currency.rb +1 -1
- data/app/models/concerns/spree/purchase/deprecated_aliases.rb +87 -0
- data/app/models/concerns/spree/purchase/gift_cards.rb +10 -4
- data/app/models/concerns/spree/purchase/locale.rb +1 -1
- data/app/models/concerns/spree/purchase/payment_processing.rb +7 -3
- data/app/models/concerns/spree/purchase/purchase_order.rb +2 -2
- data/app/models/concerns/spree/purchase/totals.rb +49 -1
- data/app/models/concerns/spree/receivable.rb +1 -1
- data/app/models/concerns/spree/searchable.rb +0 -4
- data/app/models/concerns/spree/secret_preferences.rb +59 -0
- data/app/models/concerns/spree/single_store_resource.rb +1 -1
- data/app/models/concerns/spree/stores/email_branding.rb +31 -0
- data/app/models/concerns/spree/type_labels.rb +38 -0
- data/app/models/concerns/spree/typed_adjustment_line.rb +1 -1
- data/app/models/concerns/spree/typed_associations.rb +6 -0
- data/app/models/spree/address.rb +11 -1
- data/app/models/spree/adjusters/promotion.rb +1 -15
- data/app/models/spree/allowed_origin.rb +0 -1
- data/app/models/spree/api_key.rb +5 -6
- data/app/models/spree/authentication/strategies/oidc_strategy.rb +5 -5
- data/app/models/spree/base.rb +70 -22
- data/app/models/spree/calculator/flat_percent_item_total.rb +1 -3
- data/app/models/spree/calculator/flat_rate.rb +1 -3
- data/app/models/spree/calculator/flexi_rate.rb +1 -3
- data/app/models/spree/calculator/percent_on_line_item.rb +1 -1
- data/app/models/spree/calculator/price_sack.rb +1 -3
- data/app/models/spree/calculator/shipping/digital_delivery.rb +1 -3
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -3
- data/app/models/spree/calculator/shipping/flat_rate.rb +1 -3
- data/app/models/spree/calculator/shipping/flexi_rate.rb +1 -3
- data/app/models/spree/calculator/shipping/per_item.rb +1 -3
- data/app/models/spree/calculator/shipping/price_sack.rb +1 -3
- data/app/models/spree/calculator/tiered_flat_rate.rb +6 -23
- data/app/models/spree/calculator/tiered_percent.rb +7 -25
- data/app/models/spree/cart.rb +78 -18
- data/app/models/spree/channel/gating.rb +1 -1
- data/app/models/spree/channel.rb +4 -4
- data/app/models/spree/claim.rb +21 -1
- data/app/models/spree/claim_line_item.rb +41 -6
- data/app/models/spree/collection.rb +0 -1
- data/app/models/spree/collection_rule.rb +5 -21
- data/app/models/spree/commission_line.rb +1 -1
- data/app/models/spree/commission_rate.rb +2 -3
- data/app/models/spree/commission_rate_value.rb +1 -1
- data/app/models/spree/commission_rule.rb +4 -11
- data/app/models/spree/commission_rules/product_rule.rb +1 -1
- data/app/models/spree/company_invitation.rb +1 -0
- data/app/models/spree/consent_record.rb +0 -1
- data/app/models/spree/credit_card.rb +1 -1
- data/app/models/spree/current.rb +23 -0
- data/app/models/spree/custom_field.rb +2 -2
- data/app/models/spree/custom_field_definition.rb +9 -23
- data/app/models/spree/custom_fields/boolean.rb +1 -1
- data/app/models/spree/custom_fields/json.rb +1 -1
- data/app/models/spree/data_feed/google.rb +0 -2
- data/app/models/spree/data_request.rb +1 -1
- data/app/models/spree/delivery_method.rb +30 -13
- data/app/models/spree/delivery_method_rule.rb +4 -11
- data/app/models/spree/delivery_rate.rb +4 -5
- data/app/models/spree/delivery_rate_provider/base.rb +1 -0
- data/app/models/spree/delivery_zone.rb +0 -1
- data/app/models/spree/delivery_zone_member.rb +4 -4
- data/app/models/spree/digital_asset.rb +7 -0
- data/app/models/spree/digital_asset_provider/base.rb +2 -0
- data/app/models/spree/digital_link.rb +2 -5
- data/app/models/spree/discount.rb +1 -1
- data/app/models/spree/email_template.rb +25 -0
- data/app/models/spree/email_template_draft.rb +13 -0
- data/app/models/spree/email_template_revision.rb +17 -0
- data/app/models/spree/email_templates/entry.rb +118 -0
- data/app/models/spree/email_templates/sample_record.rb +16 -0
- data/app/models/spree/emails/branding.rb +80 -0
- data/app/models/spree/exchange.rb +15 -1
- data/app/models/spree/exchange_line_item.rb +121 -5
- data/app/models/spree/export.rb +0 -1
- data/app/models/spree/exports/products.rb +10 -1
- data/app/models/spree/exports/report.rb +1 -1
- data/app/models/spree/fee.rb +4 -2
- data/app/models/spree/fulfillment.rb +53 -27
- data/app/models/spree/fulfillment_changer.rb +2 -2
- data/app/models/spree/fulfillment_item.rb +0 -4
- data/app/models/spree/fulfillment_provider/base.rb +1 -0
- data/app/models/spree/gateway/bogus.rb +4 -0
- data/app/models/spree/gateway/custom_payment_source_method.rb +5 -0
- data/app/models/spree/gateway.rb +5 -1
- data/app/models/spree/gift_card.rb +12 -1
- data/app/models/spree/gift_card_batch.rb +0 -1
- data/app/models/spree/import.rb +2 -7
- data/app/models/spree/import_mapping.rb +1 -2
- data/app/models/spree/import_row.rb +2 -2
- data/app/models/spree/import_schemas/products.rb +1 -0
- data/app/models/spree/integration.rb +8 -18
- data/app/models/spree/invitation.rb +5 -5
- data/app/models/spree/line_item.rb +13 -2
- data/app/models/spree/locale.rb +11 -8
- data/app/models/spree/market.rb +1 -0
- data/app/models/spree/newsletter_subscriber.rb +3 -0
- data/app/models/spree/order.rb +56 -138
- data/app/models/spree/order_group.rb +11 -2
- data/app/models/spree/order_inventory.rb +10 -5
- data/app/models/spree/order_promotion.rb +1 -1
- data/app/models/spree/order_routing/has_strategy_preference.rb +1 -1
- data/app/models/spree/order_routing/strategy/base.rb +4 -2
- data/app/models/spree/order_routing/strategy/rules.rb +1 -1
- data/app/models/spree/order_routing_rule.rb +6 -22
- data/app/models/spree/package_type.rb +1 -2
- data/app/models/spree/payment/gateway_options.rb +14 -52
- data/app/models/spree/payment/processing.rb +2 -4
- data/app/models/spree/payment.rb +20 -5
- data/app/models/spree/payment_method/session_instrumentation.rb +1 -0
- data/app/models/spree/payment_method/store_credit.rb +4 -4
- data/app/models/spree/payment_method.rb +36 -4
- data/app/models/spree/payment_session.rb +5 -1
- data/app/models/spree/payment_setup_session.rb +1 -0
- data/app/models/spree/payout_provider/base.rb +3 -1
- data/app/models/spree/pickup_point_provider/base.rb +2 -0
- data/app/models/spree/price_list.rb +1 -2
- data/app/models/spree/price_rules/channel_rule.rb +1 -1
- data/app/models/spree/price_rules/customer_group_rule.rb +1 -1
- data/app/models/spree/product.rb +31 -7
- data/app/models/spree/product_submission.rb +0 -12
- data/app/models/spree/product_type.rb +0 -1
- data/app/models/spree/promotion/actions/create_line_items.rb +27 -17
- data/app/models/spree/promotion/rules/category.rb +0 -4
- data/app/models/spree/promotion/rules/channel.rb +0 -4
- data/app/models/spree/promotion/rules/country.rb +0 -4
- data/app/models/spree/promotion/rules/currency.rb +0 -4
- data/app/models/spree/promotion/rules/customer_group.rb +0 -4
- data/app/models/spree/promotion/rules/first_order.rb +0 -4
- data/app/models/spree/promotion/rules/item_total.rb +4 -8
- data/app/models/spree/promotion/rules/market.rb +0 -4
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -4
- data/app/models/spree/promotion/rules/option_value.rb +0 -3
- data/app/models/spree/promotion/rules/product.rb +0 -4
- data/app/models/spree/promotion/rules/user.rb +0 -4
- data/app/models/spree/promotion/rules/user_logged_in.rb +0 -4
- data/app/models/spree/promotion.rb +35 -6
- data/app/models/spree/promotion_action.rb +7 -14
- data/app/models/spree/promotion_action_line_item.rb +1 -1
- data/app/models/spree/promotion_handler/coupon.rb +59 -27
- data/app/models/spree/promotion_rule.rb +7 -14
- data/app/models/spree/purchase_order.rb +1 -0
- data/app/models/spree/quantity_rule.rb +1 -1
- data/app/models/spree/refund.rb +28 -3
- data/app/models/spree/return.rb +30 -2
- data/app/models/spree/return_line_item.rb +65 -14
- data/app/models/spree/role.rb +7 -7
- data/app/models/spree/saved_report.rb +1 -1
- data/app/models/spree/seller.rb +2 -1
- data/app/models/spree/seller_payout.rb +7 -0
- data/app/models/spree/seller_requirement.rb +4 -12
- data/app/models/spree/seller_requirement_custom_field.rb +1 -2
- data/app/models/spree/seller_requirement_submission.rb +2 -2
- data/app/models/spree/seller_requirements/accept_terms.rb +2 -3
- data/app/models/spree/seller_transfer.rb +5 -0
- data/app/models/spree/shipping_label.rb +1 -0
- data/app/models/spree/stock/availability_validator.rb +2 -2
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/packer.rb +2 -2
- data/app/models/spree/stock/splitter/weight.rb +1 -1
- data/app/models/spree/stock_level/custom_events.rb +6 -0
- data/app/models/spree/stock_level.rb +1 -1
- data/app/models/spree/stock_movement.rb +1 -1
- data/app/models/spree/stock_receipt_item.rb +1 -1
- data/app/models/spree/stock_reservation.rb +2 -2
- data/app/models/spree/stock_transfer.rb +4 -2
- data/app/models/spree/store.rb +33 -7
- data/app/models/spree/store_credit.rb +8 -9
- data/app/models/spree/store_credit_event.rb +5 -5
- data/app/models/spree/tax_exemption_certificate.rb +2 -0
- data/app/models/spree/tax_identifier.rb +3 -1
- data/app/models/spree/tax_line.rb +53 -3
- data/app/models/spree/tax_provider/base.rb +71 -14
- data/app/models/spree/tax_provider/internal.rb +59 -33
- data/app/models/spree/tax_provider/recorded_share.rb +114 -0
- data/app/models/spree/tax_rate.rb +1 -2
- data/app/models/spree/taxonomy.rb +0 -1
- data/app/models/spree/variant.rb +4 -3
- data/app/models/spree/variant_media.rb +1 -1
- data/app/models/spree/webhook_endpoint.rb +10 -13
- data/app/models/spree/wishlist.rb +1 -6
- data/app/models/spree/wishlist_item/custom_events.rb +6 -0
- data/app/presenters/spree/csv/customer_presenter.rb +1 -1
- data/app/presenters/spree/csv/newsletter_subscriber_presenter.rb +1 -1
- data/app/presenters/spree/csv/order_line_item_presenter.rb +1 -1
- data/app/presenters/spree/csv/product_variant_presenter.rb +42 -12
- data/app/serializers/spree/emails/base_serializer.rb +14 -0
- data/app/serializers/spree/emails/export_serializer.rb +13 -0
- data/app/serializers/spree/emails/import_serializer.rb +19 -0
- data/app/serializers/spree/emails/invitation_serializer.rb +28 -0
- data/app/serializers/spree/emails/store_serializer.rb +31 -0
- data/app/serializers/spree/emails/user_serializer.rb +12 -0
- data/app/serializers/spree/emails/webhook_endpoint_serializer.rb +16 -0
- data/app/services/spree/carts/create.rb +8 -2
- data/app/services/spree/carts/destroy.rb +2 -2
- data/app/services/spree/carts/remove_out_of_stock_items.rb +2 -2
- data/app/services/spree/carts/split_by_seller.rb +1 -1
- data/app/services/spree/carts/update.rb +19 -5
- data/app/services/spree/catalogs/set_product_terms.rb +1 -1
- data/app/services/spree/categories/add_products.rb +13 -31
- data/app/services/spree/categories/remove_products.rb +12 -51
- data/app/services/spree/checkout/advance.rb +1 -4
- data/app/services/spree/collections/add_products.rb +10 -23
- data/app/services/spree/collections/remove_products.rb +7 -43
- data/app/services/spree/coupon_codes/bulk_generate.rb +8 -14
- data/app/services/spree/data_requests/create.rb +1 -1
- data/app/services/spree/deliveries/destroy.rb +2 -2
- data/app/services/spree/email_templates/check.rb +58 -0
- data/app/services/spree/email_templates/no_sample_record.rb +7 -0
- data/app/services/spree/email_templates/preview.rb +99 -0
- data/app/services/spree/emails/file_system.rb +23 -0
- data/app/services/spree/emails/filters.rb +84 -0
- data/app/services/spree/emails/liquid_context.rb +48 -0
- data/app/services/spree/emails/rendered_email.rb +14 -0
- data/app/services/spree/emails/renderer.rb +125 -0
- data/app/services/spree/emails/template.rb +51 -0
- data/app/services/spree/emails/template_data.rb +23 -0
- data/app/services/spree/emails/template_resolver.rb +109 -0
- data/app/services/spree/emails/text_converter.rb +72 -0
- data/app/services/spree/emails/translation_inliner.rb +134 -0
- data/app/services/spree/imports/row_processors/price_list_price.rb +10 -10
- data/app/services/spree/imports/row_processors/product_variant.rb +65 -34
- data/app/services/spree/imports/row_processors/purchase_order.rb +13 -13
- data/app/services/spree/locales.rb +4 -5
- data/app/services/spree/newsletter/subscribe.rb +8 -12
- data/app/services/spree/orders/build_fulfillments.rb +3 -2
- data/app/services/spree/orders/create.rb +2 -1
- data/app/services/spree/orders/discounts/create.rb +7 -4
- data/app/services/spree/orders/discounts/destroy.rb +1 -0
- data/app/services/spree/orders/discounts/update.rb +1 -0
- data/app/services/spree/orders/fees/create.rb +1 -0
- data/app/services/spree/orders/fees/destroy.rb +1 -0
- data/app/services/spree/orders/fees/update.rb +1 -0
- data/app/services/spree/orders/remove_line_item.rb +13 -3
- data/app/services/spree/orders/update.rb +10 -6
- data/app/services/spree/orders/update_item.rb +6 -3
- data/app/services/spree/orders/update_statuses.rb +3 -1
- data/app/services/spree/product_memberships.rb +61 -0
- data/app/services/spree/returns/eligibility_validator.rb +1 -1
- data/app/services/spree/search_provider/custom_field_schema.rb +2 -2
- data/app/services/spree/seeds/commission_rates.rb +1 -1
- data/app/services/spree/seeds/digital_delivery.rb +1 -1
- data/app/services/spree/seeds/payment_methods.rb +2 -2
- data/app/services/spree/seeds/saved_reports.rb +3 -3
- data/app/services/spree/sellers/requirements.rb +1 -2
- data/app/services/spree/shipping_labels/confirm_refund.rb +1 -1
- data/app/services/spree/shipping_labels/store_file.rb +3 -3
- data/app/services/spree/stock_levels/correct.rb +3 -3
- data/app/services/spree/stock_reservations/reserve.rb +2 -3
- data/app/services/spree/store_credits/apply.rb +15 -13
- data/app/services/spree/stores/provision_defaults.rb +15 -14
- data/app/subscribers/spree/seller_onboarding_subscriber.rb +1 -1
- data/app/views/layouts/spree/base_mailer.html.erb +2 -43
- data/app/views/layouts/spree/base_mailer.liquid +79 -0
- data/app/views/spree/admin_user_mailer/password_reset_email.liquid +14 -0
- data/app/views/spree/export_mailer/export_done.liquid +12 -0
- data/app/views/spree/import_mailer/import_done.liquid +15 -0
- data/app/views/spree/invitation_mailer/invitation_accepted.liquid +9 -0
- data/app/views/spree/invitation_mailer/invitation_email.liquid +13 -0
- data/app/views/spree/seller_user_mailer/password_reset_email.liquid +14 -0
- data/app/views/spree/shared/_mailer_button.html.erb +4 -5
- data/app/views/spree/shared/_mailer_hero.html.erb +6 -5
- data/app/views/spree/shared/_summary_row.liquid +8 -0
- data/app/views/spree/webhook_mailer/endpoint_disabled.liquid +21 -0
- data/app/workflows/spree/carts/add_item.rb +4 -4
- data/app/workflows/spree/carts/complete.rb +13 -3
- data/app/workflows/spree/carts/merge.rb +1 -1
- data/app/workflows/spree/carts/recalculate_totals.rb +5 -0
- data/app/workflows/spree/carts/upsert_items.rb +18 -9
- data/app/workflows/spree/claims/approve.rb +5 -22
- data/app/workflows/spree/claims/cancel.rb +5 -21
- data/app/workflows/spree/claims/create.rb +15 -0
- data/app/workflows/spree/claims/deny.rb +7 -0
- data/app/workflows/spree/claims/resolve.rb +34 -31
- data/app/workflows/spree/customers/anonymize.rb +3 -4
- data/app/workflows/spree/customers/create.rb +1 -1
- data/app/workflows/spree/data_requests/fulfill.rb +2 -2
- data/app/workflows/spree/deliveries/update_tracking.rb +1 -1
- data/app/workflows/spree/email_templates/discard_draft.rb +20 -0
- data/app/workflows/spree/email_templates/publish.rb +70 -0
- data/app/workflows/spree/email_templates/restore_revision.rb +33 -0
- data/app/workflows/spree/email_templates/revert.rb +29 -0
- data/app/workflows/spree/email_templates/save_draft.rb +85 -0
- data/app/workflows/spree/exchanges/approve.rb +5 -22
- data/app/workflows/spree/exchanges/cancel.rb +5 -21
- data/app/workflows/spree/exchanges/create.rb +6 -0
- data/app/workflows/spree/exchanges/fulfill.rb +75 -51
- data/app/workflows/spree/exchanges/receive.rb +6 -65
- data/app/workflows/spree/fulfillments/cancel.rb +1 -1
- data/app/workflows/spree/fulfillments/create.rb +51 -47
- data/app/workflows/spree/fulfillments/fulfill.rb +23 -27
- data/app/workflows/spree/fulfillments/mark_delivered.rb +1 -1
- data/app/workflows/spree/fulfillments/replacements.rb +59 -0
- data/app/workflows/spree/gift_cards/apply.rb +2 -2
- data/app/workflows/spree/orders/add_item.rb +5 -1
- data/app/workflows/spree/orders/cancel.rb +3 -3
- data/app/workflows/spree/orders/complete.rb +16 -8
- data/app/workflows/spree/payments/process.rb +2 -2
- data/app/workflows/spree/post_sale/approval.rb +35 -0
- data/app/workflows/spree/post_sale/cancellation.rb +44 -0
- data/app/workflows/spree/post_sale/receipt.rb +92 -0
- data/app/workflows/spree/products/nested_attributes.rb +1 -1
- data/app/workflows/spree/purchase_orders/cancel.rb +1 -1
- data/app/workflows/spree/purchase_orders/close.rb +3 -31
- data/app/workflows/spree/purchase_orders/mark_draft.rb +2 -2
- data/app/workflows/spree/purchase_orders/mark_ordered.rb +2 -2
- data/app/workflows/spree/purchase_orders/receive.rb +1 -1
- data/app/workflows/spree/purchase_orders/update.rb +5 -34
- data/app/workflows/spree/receivables/closing_short.rb +46 -0
- data/app/workflows/spree/receivables/draft_editing.rb +48 -0
- data/app/workflows/spree/refunds/create.rb +5 -2
- data/app/workflows/spree/refunds/order_payments.rb +14 -2
- data/app/workflows/spree/refunds/tax_credit.rb +67 -0
- data/app/workflows/spree/returns/approve.rb +5 -22
- data/app/workflows/spree/returns/cancel.rb +5 -22
- data/app/workflows/spree/returns/create.rb +8 -0
- data/app/workflows/spree/returns/receive.rb +5 -76
- data/app/workflows/spree/returns/refund.rb +31 -8
- data/app/workflows/spree/seller_requirement_submissions/create.rb +1 -2
- data/app/workflows/spree/seller_transfers/reverse.rb +28 -1
- data/app/workflows/spree/shipping_labels/purchase.rb +8 -8
- data/app/workflows/spree/shipping_labels/record.rb +5 -5
- data/app/workflows/spree/shipping_labels/refund.rb +2 -2
- data/app/workflows/spree/stock_receipts/recording.rb +4 -4
- data/app/workflows/spree/stock_transfers/cancel.rb +2 -2
- data/app/workflows/spree/stock_transfers/close.rb +3 -30
- data/app/workflows/spree/stock_transfers/mark_draft.rb +1 -1
- data/app/workflows/spree/stock_transfers/mark_in_transit.rb +3 -3
- data/app/workflows/spree/stock_transfers/mark_ready.rb +2 -2
- data/app/workflows/spree/stock_transfers/receive.rb +1 -1
- data/app/workflows/spree/stock_transfers/update.rb +5 -33
- data/config/i18n-tasks.yml +32 -18
- data/config/initializers/alba.rb +7 -0
- data/config/language_names.csv +264 -0
- data/config/locales/ar.yml +811 -0
- data/config/locales/be.yml +855 -0
- data/config/locales/bg.yml +723 -0
- data/config/locales/ca.yml +689 -0
- data/config/locales/cs.yml +855 -0
- data/config/locales/da.yml +771 -0
- data/config/locales/de-CH.yml +248 -0
- data/config/locales/de.yml +835 -0
- data/config/locales/el.yml +769 -0
- data/config/locales/en.yml +37 -503
- data/config/locales/es-CL.yml +301 -0
- data/config/locales/es-EC.yml +186 -0
- data/config/locales/es-MX.yml +334 -0
- data/config/locales/es.yml +831 -0
- data/config/locales/et.yml +644 -0
- data/config/locales/fa.yml +709 -0
- data/config/locales/fi.yml +771 -0
- data/config/locales/fr.yml +830 -0
- data/config/locales/hu.yml +751 -0
- data/config/locales/id.yml +756 -0
- data/config/locales/it.yml +833 -0
- data/config/locales/ja.yml +726 -0
- data/config/locales/km.yml +759 -0
- data/config/locales/ko.yml +575 -0
- data/config/locales/ku.yml +753 -0
- data/config/locales/lt.yml +821 -0
- data/config/locales/lv.yml +685 -0
- data/config/locales/nb.yml +824 -0
- data/config/locales/ne.yml +823 -0
- data/config/locales/nl.yml +826 -0
- data/config/locales/pl.yml +835 -0
- data/config/locales/pt-BR.yml +547 -0
- data/config/locales/pt.yml +636 -0
- data/config/locales/ro.yml +750 -0
- data/config/locales/ru.yml +834 -0
- data/config/locales/sk.yml +680 -0
- data/config/locales/sl-SI.yml +600 -0
- data/config/locales/sv.yml +827 -0
- data/config/locales/th.yml +745 -0
- data/config/locales/tr.yml +777 -0
- data/config/locales/uk.yml +836 -0
- data/config/locales/vi.yml +768 -0
- data/config/locales/zh-CN.yml +786 -0
- data/config/locales/zh-TW.yml +834 -0
- data/db/migrate/20260925000001_add_replacement_to_spree_fulfillment_items.rb +5 -0
- data/db/migrate/20261001000001_add_post_sale_tax.rb +30 -0
- data/db/migrate/20261001000001_convert_preferences_to_json.rb +166 -0
- data/db/migrate/20261001000001_create_spree_email_templates.rb +52 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +0 -9
- data/lib/generators/spree/dummy/templates/rails/test.rb +7 -0
- data/lib/spree/checkout/default_requirements.rb +37 -13
- data/lib/spree/core/configuration.rb +1 -1
- data/lib/spree/core/controller_helpers/store.rb +1 -1
- data/lib/spree/core/dependencies.rb +5 -4
- data/lib/spree/core/emails/escaped_output.rb +60 -0
- data/lib/spree/core/engine.rb +48 -167
- data/lib/spree/core/permissions/default_catalog.rb +5 -0
- data/lib/spree/core/preferences/json_conversion.rb +182 -0
- data/lib/spree/core/preferences/masking.rb +4 -1
- data/lib/spree/core/preferences/preferable.rb +137 -83
- data/lib/spree/core/preferences/preferable_class_methods.rb +81 -146
- data/lib/spree/core/previews/import_preview.rb +10 -0
- data/lib/spree/core/tax/provider_error.rb +37 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +85 -370
- data/lib/spree/emails/editable_templates.rb +82 -0
- data/lib/spree/events/catalog.rb +189 -0
- data/lib/spree/events.rb +21 -1
- data/lib/spree/hooks.rb +0 -17
- data/lib/spree/i18n.rb +32 -15
- data/lib/spree/reporting/adapters/live.rb +6 -6
- data/lib/spree/reporting/default_vocabulary.rb +22 -10
- data/lib/spree/reporting/hydration.rb +1 -1
- data/lib/spree/reporting/query.rb +8 -0
- data/lib/spree/reporting/schema.rb +10 -10
- data/lib/spree/testing_support/editable_email_templates.rb +61 -0
- data/lib/spree/testing_support/emails.rb +22 -0
- data/lib/spree/testing_support/factories/cart_factory.rb +1 -1
- data/lib/spree/testing_support/factories/email_template_factory.rb +28 -0
- data/lib/spree/testing_support/factories/order_factory.rb +2 -2
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
- data/lib/spree/testing_support/i18n.rb +3 -94
- data/lib/spree/testing_support/lifecycle_events.rb +1 -1
- data/lib/spree/testing_support/order_walkthrough.rb +1 -1
- data/lib/spree/testing_support/preferences.rb +0 -5
- data/lib/spree/testing_support/store.rb +9 -1
- data/lib/spree/upgrades/5_6_to_6_0/manifest.yml +45 -0
- data/lib/tasks/categories_and_collections.rake +3 -3
- data/lib/tasks/core.rake +6 -4
- data/lib/tasks/media.rake +3 -3
- data/lib/tasks/package_types.rake +1 -1
- data/lib/tasks/preferences_json.rake +101 -0
- data/spec/fixtures/mailer_views/custom_views_probe_mailer/welcome_email.html.erb +4 -0
- metadata +188 -44
- data/app/models/acts_as_taggable_on/tag_decorator.rb +0 -10
- data/app/models/concerns/spree/has_image_alt_text.rb +0 -18
- data/app/models/spree/base_analytics_event_handler.rb +0 -54
- data/app/models/spree/invitations/store.rb +0 -6
- data/app/models/spree/preference.rb +0 -14
- data/app/models/spree/promotion_handler/page.rb +0 -25
- data/app/models/spree/promotion_handler/promotion_duplicator.rb +0 -60
- data/app/models/spree/stock/differentiator.rb +0 -45
- data/app/presenters/spree/filters/options_presenter.rb +0 -47
- data/app/services/spree/carts/empty.rb +0 -42
- data/app/services/spree/country_to_timezone.rb +0 -273
- data/app/services/spree/payments/create.rb +0 -92
- data/app/validators/spree/url_validator.rb +0 -23
- data/app/views/active_storage/blobs/_blob.html.erb +0 -14
- data/app/views/spree/admin_user_mailer/password_reset_email.html.erb +0 -8
- data/app/views/spree/export_mailer/export_done.html.erb +0 -7
- data/app/views/spree/import_mailer/import_done.html.erb +0 -12
- data/app/views/spree/invitation_mailer/invitation_accepted.html.erb +0 -4
- data/app/views/spree/invitation_mailer/invitation_email.html.erb +0 -12
- data/app/views/spree/seller_user_mailer/password_reset_email.html.erb +0 -8
- data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -19
- data/app/views/spree/shared/_base_mailer_header.html.erb +0 -8
- data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -399
- data/app/views/spree/shared/_mailer_logo.html.erb +0 -41
- data/app/views/spree/shared/_purchased_items_styles.html.erb +0 -119
- data/app/views/spree/webhook_mailer/endpoint_disabled.html.erb +0 -51
- data/app/views/spree/webhook_mailer/endpoint_disabled.text.erb +0 -10
- data/app/workflows/spree/fulfillments/purchase_label.rb +0 -40
- data/app/workflows/spree/returns/purchase_label.rb +0 -32
- data/lib/spree/analytics.rb +0 -11
- data/lib/spree/core/preferences/scoped_store.rb +0 -34
- data/lib/spree/core/preferences/store.rb +0 -105
- data/lib/spree/translation_migrations.rb +0 -52
|
@@ -4,11 +4,10 @@ module Spree
|
|
|
4
4
|
# (Mobility-backed content such as product names, descriptions, taxons,
|
|
5
5
|
# option values, etc.).
|
|
6
6
|
#
|
|
7
|
-
# This is deliberately **independent of the
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
# must not be constrained by which admin chrome translations exist.
|
|
7
|
+
# This is deliberately **independent of the languages Spree ships
|
|
8
|
+
# translations for** (`Spree.available_locales`). In a headless setup the
|
|
9
|
+
# storefront ships its own UI translations, so the languages a merchant can
|
|
10
|
+
# store content in must not be constrained by Spree's own translations.
|
|
12
11
|
#
|
|
13
12
|
# Codes follow BCP-47 casing (lowercase language, uppercase region —
|
|
14
13
|
# `pt-BR`, `zh-CN`) so the browser's `Intl.DisplayNames` resolves a clean
|
|
@@ -26,7 +26,7 @@ module Spree
|
|
|
26
26
|
end
|
|
27
27
|
end
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
publish_subscription_requested unless subscriber.verified?
|
|
30
30
|
subscriber
|
|
31
31
|
end
|
|
32
32
|
|
|
@@ -34,17 +34,13 @@ module Spree
|
|
|
34
34
|
|
|
35
35
|
attr_reader :email, :current_user, :current_store, :redirect_url
|
|
36
36
|
|
|
37
|
-
def
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
customer_id: subscriber.customer&.prefixed_id
|
|
45
|
-
}
|
|
46
|
-
payload[:redirect_url] = redirect_url if redirect_url.present?
|
|
47
|
-
payload
|
|
37
|
+
def publish_subscription_requested
|
|
38
|
+
event_name = 'newsletter_subscriber.subscription_requested'
|
|
39
|
+
payload = subscriber.event_payload_for(
|
|
40
|
+
event_name,
|
|
41
|
+
include_verification_token: true, store: current_store, redirect_url: redirect_url.presence
|
|
42
|
+
)
|
|
43
|
+
subscriber.publish_event(event_name, payload)
|
|
48
44
|
end
|
|
49
45
|
|
|
50
46
|
def upsert_subscriber
|
|
@@ -17,13 +17,14 @@ module Spree
|
|
|
17
17
|
class BuildFulfillments
|
|
18
18
|
prepend Spree::ServiceModule::Base
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
# @param keep_selection [Boolean] false when the destination changed
|
|
21
|
+
def call(order:, keep_selection: true)
|
|
21
22
|
return success(order) if order.completed?
|
|
22
23
|
return success(order) unless order.ship_address_id.present?
|
|
23
24
|
return success(order) unless order.line_items.any?
|
|
24
25
|
return success(order) unless order.delivery_step_required?
|
|
25
26
|
|
|
26
|
-
order.rebuild_fulfillments!
|
|
27
|
+
order.rebuild_fulfillments!(keep_selection: keep_selection)
|
|
27
28
|
order.create_shipment_tax_charge!
|
|
28
29
|
order.set_fulfillments_cost
|
|
29
30
|
order.apply_free_shipping_promotions
|
|
@@ -49,7 +49,7 @@ module Spree
|
|
|
49
49
|
# ActiveStorage raises a message-less error for that, which would
|
|
50
50
|
# otherwise be an unhandled 500 on the Admin API.
|
|
51
51
|
order ||= @store.orders.new
|
|
52
|
-
order.errors.add(:po_document, :po_document_upload_incomplete, message:
|
|
52
|
+
order.errors.add(:po_document, :po_document_upload_incomplete, message: I18n.t('spree.po_document_upload_incomplete'))
|
|
53
53
|
failure(order, order.errors.full_messages.to_sentence)
|
|
54
54
|
end
|
|
55
55
|
|
|
@@ -170,6 +170,7 @@ module Spree
|
|
|
170
170
|
coupon_code: @params[:coupon_code]
|
|
171
171
|
}
|
|
172
172
|
order.coupon_code = nil
|
|
173
|
+
handler.release_stale_coupon_codes
|
|
173
174
|
end
|
|
174
175
|
end
|
|
175
176
|
end
|
|
@@ -18,16 +18,19 @@ module Spree
|
|
|
18
18
|
# @return [Spree::ServiceModule::Result] value is the created rows
|
|
19
19
|
def call(order:, label:, value:, value_type: 'flat', line_item: nil)
|
|
20
20
|
value = BigDecimal(value.to_s)
|
|
21
|
-
return failure(nil,
|
|
22
|
-
return failure(nil,
|
|
21
|
+
return failure(nil, I18n.t('spree.errors.messages.discount_value_must_be_positive')) unless value.positive?
|
|
22
|
+
return failure(nil, I18n.t('spree.errors.messages.discount_value_type_invalid')) unless %w[flat percent].include?(value_type)
|
|
23
23
|
|
|
24
24
|
rows = order.with_lock do
|
|
25
25
|
created = line_item ? [line_item_row(order, line_item, label, value, value_type)].compact : distributed_rows(order, label, value, value_type)
|
|
26
|
-
|
|
26
|
+
if created.any?
|
|
27
|
+
Spree.order_recalculate_totals_workflow.call(order: order)
|
|
28
|
+
order.update_statuses!
|
|
29
|
+
end
|
|
27
30
|
created
|
|
28
31
|
end
|
|
29
32
|
|
|
30
|
-
return failure(nil,
|
|
33
|
+
return failure(nil, I18n.t('spree.errors.messages.discount_has_no_effect')) if rows.empty?
|
|
31
34
|
|
|
32
35
|
success(rows)
|
|
33
36
|
end
|
|
@@ -1,12 +1,22 @@
|
|
|
1
1
|
module Spree
|
|
2
2
|
module Orders
|
|
3
|
-
# Draft-order twin of the cart service
|
|
4
|
-
#
|
|
3
|
+
# Draft-order twin of the cart service. Removing an item is an upsert with
|
|
4
|
+
# quantity zero, so the removal passes the same 'orders.upsert_items.validate'
|
|
5
|
+
# hook every other draft-order item edit does.
|
|
5
6
|
class RemoveLineItem
|
|
6
7
|
prepend Spree::ServiceModule::Base
|
|
7
8
|
|
|
9
|
+
# @param order [Spree::Order]
|
|
10
|
+
# @param line_item [Spree::LineItem]
|
|
11
|
+
# @param options [Hash] accepted for signature compatibility and ignored
|
|
12
|
+
# @return [Spree::ServiceModule::Result] value is the removed line item
|
|
8
13
|
def call(order:, line_item:, options: {})
|
|
9
|
-
Spree
|
|
14
|
+
result = Spree.order_upsert_items_workflow.call(
|
|
15
|
+
order: order,
|
|
16
|
+
items: [{ variant_id: line_item.variant_id, quantity: 0 }]
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
result.success? ? success(line_item) : failure(line_item, result.error)
|
|
10
20
|
end
|
|
11
21
|
end
|
|
12
22
|
end
|
|
@@ -15,7 +15,10 @@ module Spree
|
|
|
15
15
|
items_param = @params.delete(:items)
|
|
16
16
|
address_params = extract_address_params
|
|
17
17
|
|
|
18
|
-
|
|
18
|
+
# requires_new: the rescue below sits outside the block, so joining a
|
|
19
|
+
# caller's open transaction (the API's order lock) would let it commit
|
|
20
|
+
# the half-applied edit.
|
|
21
|
+
ApplicationRecord.transaction(requires_new: true) do
|
|
19
22
|
ship_address_id_before = @order.ship_address_id
|
|
20
23
|
assign_addresses(address_params)
|
|
21
24
|
|
|
@@ -25,11 +28,12 @@ module Spree
|
|
|
25
28
|
|
|
26
29
|
process_items(items_param) if items_param
|
|
27
30
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
+
# An address row edited in place keeps its id, so an edit to the fields a quote reads counts too.
|
|
32
|
+
destination_changed = @order.ship_address_id != ship_address_id_before || @order.ship_address&.saved_change_to_destination?
|
|
33
|
+
build_fulfillments(keep_selection: !destination_changed) if items_param || destination_changed
|
|
31
34
|
|
|
32
35
|
@order.recalculate_totals!
|
|
36
|
+
@order.update_statuses!
|
|
33
37
|
end
|
|
34
38
|
|
|
35
39
|
success(@order.reload)
|
|
@@ -70,8 +74,8 @@ module Spree
|
|
|
70
74
|
propagate_step_failure!(result, fallback: 'Failed to update items on order') if result.failure?
|
|
71
75
|
end
|
|
72
76
|
|
|
73
|
-
def build_fulfillments
|
|
74
|
-
result = Spree::Orders::BuildFulfillments.call(order: @order)
|
|
77
|
+
def build_fulfillments(keep_selection:)
|
|
78
|
+
result = Spree::Orders::BuildFulfillments.call(order: @order, keep_selection: keep_selection)
|
|
75
79
|
propagate_step_failure!(result, fallback: 'Failed to build shipments') if result.failure?
|
|
76
80
|
end
|
|
77
81
|
|
|
@@ -21,7 +21,7 @@ module Spree
|
|
|
21
21
|
price_provided = !price.equal?(PRICE_NOT_PROVIDED)
|
|
22
22
|
|
|
23
23
|
if price_provided && order.completed?
|
|
24
|
-
return reject_price(line_item, :price_override_not_allowed,
|
|
24
|
+
return reject_price(line_item, :price_override_not_allowed, I18n.t('spree.cart_line_item.price_override_not_allowed'))
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
attributes = {}
|
|
@@ -30,7 +30,7 @@ module Spree
|
|
|
30
30
|
|
|
31
31
|
if price_provided && !price.nil?
|
|
32
32
|
manual_price = parse_manual_price(price)
|
|
33
|
-
return reject_price(line_item, :invalid_price,
|
|
33
|
+
return reject_price(line_item, :invalid_price, I18n.t('spree.cart_line_item.invalid_price')) if manual_price.nil?
|
|
34
34
|
|
|
35
35
|
attributes[:price] = manual_price
|
|
36
36
|
attributes[:price_source] = Spree::LineItem::MANUAL_PRICE_SOURCE
|
|
@@ -47,7 +47,10 @@ module Spree
|
|
|
47
47
|
ActiveRecord::Base.transaction do
|
|
48
48
|
return failure(line_item) unless line_item.update(attributes)
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
if quantity_changing || price_provided
|
|
51
|
+
Spree::Orders::Recalculate.call(order: order, line_item: line_item)
|
|
52
|
+
order.update_statuses!
|
|
53
|
+
end
|
|
51
54
|
end
|
|
52
55
|
|
|
53
56
|
success(line_item)
|
|
@@ -4,7 +4,9 @@ module Spree
|
|
|
4
4
|
# Derive-then-persist: statuses are recomputed from payment/refund/
|
|
5
5
|
# fulfillment records and stored in indexed columns so admin filtering
|
|
6
6
|
# keeps working. Triggered from payment/refund/fulfillment/return event
|
|
7
|
-
# subscribers
|
|
7
|
+
# subscribers, and by each edit service that moves an order's total
|
|
8
|
+
# (fees, discounts, items) once it has re-summed — no event announces
|
|
9
|
+
# that change. Never inline from controllers.
|
|
8
10
|
class UpdateStatuses
|
|
9
11
|
prepend Spree::ServiceModule::Base
|
|
10
12
|
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
module Spree
|
|
2
|
+
# Bulk adding and removing products on categories or collections. The
|
|
3
|
+
# including service names the join model (`membership_class`), the grouping
|
|
4
|
+
# it belongs to (`group_class`, `group_key`) and refreshes the grouping's
|
|
5
|
+
# own counters in `refresh_group_counters`.
|
|
6
|
+
module ProductMemberships
|
|
7
|
+
private
|
|
8
|
+
|
|
9
|
+
def add_memberships(groups, products)
|
|
10
|
+
rows = groups.pluck(:id).flat_map do |group_id|
|
|
11
|
+
position = membership_class.where(group_key => group_id).count
|
|
12
|
+
products.pluck(:id).map do |product_id|
|
|
13
|
+
{
|
|
14
|
+
group_key => group_id, product_id: product_id, position: (position += 1),
|
|
15
|
+
created_at: Time.current, updated_at: Time.current
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
membership_class.insert_all(rows)
|
|
20
|
+
|
|
21
|
+
refresh_after_membership_change(groups.pluck(:id), products)
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Removes the products, then re-packs the remaining positions from 1.
|
|
25
|
+
def remove_memberships(groups, products)
|
|
26
|
+
group_ids = groups.pluck(:id)
|
|
27
|
+
|
|
28
|
+
ApplicationRecord.transaction do
|
|
29
|
+
membership_class.where(group_key => group_ids, product_id: products.pluck(:id)).delete_all
|
|
30
|
+
|
|
31
|
+
rows = group_ids.flat_map do |group_id|
|
|
32
|
+
membership_class.where(group_key => group_id).order(:position).pluck(:product_id).map.with_index(1) do |product_id, position|
|
|
33
|
+
{
|
|
34
|
+
group_key => group_id, product_id: product_id, position: position,
|
|
35
|
+
created_at: Time.current, updated_at: Time.current
|
|
36
|
+
}
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
membership_class.upsert_all(rows, unique_by: ([group_key, :product_id] unless Spree.mysql?)) if rows.any?
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
refresh_after_membership_change(group_ids, products)
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
# Bulk writes skip the join model's callbacks, so counters, caches and the
|
|
46
|
+
# search index are refreshed here.
|
|
47
|
+
def refresh_after_membership_change(group_ids, products)
|
|
48
|
+
product_ids = products.pluck(:id)
|
|
49
|
+
product_ids.each { |id| Spree::Product.reset_counters(id, membership_class.model_name.element.pluralize.to_sym) }
|
|
50
|
+
refresh_group_counters(group_ids)
|
|
51
|
+
|
|
52
|
+
Spree::Product.where(id: product_ids).touch_all
|
|
53
|
+
products.each(&:enqueue_search_index)
|
|
54
|
+
group_class.where(id: group_ids).touch_all
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def group_key
|
|
58
|
+
group_class.model_name.element.foreign_key.to_sym
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -142,9 +142,9 @@ module Spree
|
|
|
142
142
|
def sort_option_label(name, field_type, direction)
|
|
143
143
|
suffix =
|
|
144
144
|
if field_type == 'number'
|
|
145
|
-
direction == :asc ?
|
|
145
|
+
direction == :asc ? I18n.t('spree.sort_low_to_high') : I18n.t('spree.sort_high_to_low')
|
|
146
146
|
else
|
|
147
|
-
direction == :asc ?
|
|
147
|
+
direction == :asc ? I18n.t('spree.sort_a_to_z') : I18n.t('spree.sort_z_to_a')
|
|
148
148
|
end
|
|
149
149
|
"#{name} (#{suffix})"
|
|
150
150
|
end
|
|
@@ -35,7 +35,7 @@ module Spree
|
|
|
35
35
|
return if store.commission_rates.exists?(code: DEFAULT_CODE)
|
|
36
36
|
|
|
37
37
|
rate = store.commission_rates.create!(
|
|
38
|
-
name:
|
|
38
|
+
name: I18n.t('spree.seed.commission_rates.marketplace_default'),
|
|
39
39
|
code: DEFAULT_CODE,
|
|
40
40
|
kind: 'percentage',
|
|
41
41
|
value: 0,
|
|
@@ -12,7 +12,7 @@ module Spree
|
|
|
12
12
|
profile = Spree::DeliveryProfiles::Digital.find_by(store: store) ||
|
|
13
13
|
Spree::DeliveryProfiles::Digital.create!(store: store, name: I18n.t('spree.seed.delivery_profiles.digital'))
|
|
14
14
|
|
|
15
|
-
digital_delivery_method = Spree::DeliveryMethod.find_or_initialize_by(name:
|
|
15
|
+
digital_delivery_method = Spree::DeliveryMethod.find_or_initialize_by(name: I18n.t('spree.digital.digital_delivery'), store: store)
|
|
16
16
|
|
|
17
17
|
digital_delivery_method.delivery_profile = profile
|
|
18
18
|
digital_delivery_method.storefront_visible = true
|
|
@@ -12,8 +12,8 @@ module Spree
|
|
|
12
12
|
)
|
|
13
13
|
return if payment_method.persisted?
|
|
14
14
|
|
|
15
|
-
payment_method.name =
|
|
16
|
-
payment_method.description =
|
|
15
|
+
payment_method.name = I18n.t('spree.store_credit_name')
|
|
16
|
+
payment_method.description = I18n.t('spree.store_credit_name')
|
|
17
17
|
payment_method.active = true
|
|
18
18
|
payment_method.save!
|
|
19
19
|
end
|
|
@@ -86,8 +86,8 @@ module Spree
|
|
|
86
86
|
next if known_names(report[:key]).intersect?(existing)
|
|
87
87
|
|
|
88
88
|
store.saved_reports.create!(
|
|
89
|
-
name:
|
|
90
|
-
description:
|
|
89
|
+
name: I18n.t("spree.reporting.seeds.#{report[:key]}.name"),
|
|
90
|
+
description: I18n.t("spree.reporting.seeds.#{report[:key]}.description"),
|
|
91
91
|
query: report[:query],
|
|
92
92
|
seeded: true
|
|
93
93
|
)
|
|
@@ -98,7 +98,7 @@ module Spree
|
|
|
98
98
|
def known_names(key)
|
|
99
99
|
@known_names ||= {}
|
|
100
100
|
@known_names[key] ||= Spree.available_locales.filter_map do |locale|
|
|
101
|
-
|
|
101
|
+
I18n.t("spree.reporting.seeds.#{key}.name", locale: locale, default: nil)&.downcase
|
|
102
102
|
end.to_set
|
|
103
103
|
end
|
|
104
104
|
end
|
|
@@ -61,8 +61,7 @@ module Spree
|
|
|
61
61
|
def record_blocking(errors)
|
|
62
62
|
blocking.each do |requirement|
|
|
63
63
|
errors.add(:requirements, :incomplete,
|
|
64
|
-
message:
|
|
65
|
-
default: "#{requirement.name} is not complete"))
|
|
64
|
+
message: I18n.t('spree.seller_requirements.incomplete', name: requirement.name))
|
|
66
65
|
end
|
|
67
66
|
end
|
|
68
67
|
|
|
@@ -14,7 +14,7 @@ module Spree
|
|
|
14
14
|
return success(shipping_label) if shipping_label.refunded?
|
|
15
15
|
|
|
16
16
|
unless shipping_label.refund_requested?
|
|
17
|
-
shipping_label.errors.add(:base, :not_refund_requested, message:
|
|
17
|
+
shipping_label.errors.add(:base, :not_refund_requested, message: I18n.t('spree.shipping_labels.errors.not_refund_requested'))
|
|
18
18
|
return failure(shipping_label)
|
|
19
19
|
end
|
|
20
20
|
|
|
@@ -27,7 +27,7 @@ module Spree
|
|
|
27
27
|
|
|
28
28
|
url = shipping_label.file_url
|
|
29
29
|
if url.blank?
|
|
30
|
-
shipping_label.errors.add(:file, :no_file_url, message:
|
|
30
|
+
shipping_label.errors.add(:file, :no_file_url, message: I18n.t('spree.shipping_labels.errors.no_file_url'))
|
|
31
31
|
return failure(shipping_label)
|
|
32
32
|
end
|
|
33
33
|
|
|
@@ -38,13 +38,13 @@ module Spree
|
|
|
38
38
|
# ordinary outcome here, not an exception the caller should handle:
|
|
39
39
|
# the purchase behind it is already a fact, and the job retries.
|
|
40
40
|
shipping_label.errors.add(:file, :file_fetch_failed, status: e.message,
|
|
41
|
-
message:
|
|
41
|
+
message: I18n.t('spree.shipping_labels.errors.file_fetch_failed', status: e.message))
|
|
42
42
|
return failure(shipping_label)
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
unless response.is_a?(Net::HTTPSuccess)
|
|
46
46
|
shipping_label.errors.add(:file, :file_fetch_failed, status: response.code,
|
|
47
|
-
message:
|
|
47
|
+
message: I18n.t('spree.shipping_labels.errors.file_fetch_failed', status: response.code))
|
|
48
48
|
return failure(shipping_label)
|
|
49
49
|
end
|
|
50
50
|
|
|
@@ -24,13 +24,13 @@ module Spree
|
|
|
24
24
|
# @return [Spree::ServiceModule::Result] the corrected stock level
|
|
25
25
|
def call(stock_level:, count_on_hand: nil, adjustment: nil, reason: nil)
|
|
26
26
|
if count_on_hand.present? && adjustment.present?
|
|
27
|
-
return failure(stock_level,
|
|
27
|
+
return failure(stock_level, I18n.t('spree.stock_level.errors.adjustment_exclusive_with_count_on_hand'))
|
|
28
28
|
end
|
|
29
29
|
|
|
30
30
|
target = parse(count_on_hand)
|
|
31
31
|
delta = parse(adjustment)
|
|
32
|
-
return failure(stock_level,
|
|
33
|
-
return failure(stock_level,
|
|
32
|
+
return failure(stock_level, I18n.t('spree.stock_level.errors.count_on_hand_not_an_integer')) if count_on_hand.present? && target.nil?
|
|
33
|
+
return failure(stock_level, I18n.t('spree.stock_level.errors.adjustment_not_an_integer')) if adjustment.present? && delta.nil?
|
|
34
34
|
|
|
35
35
|
# Locked around the read: the delta is worked out from the count this
|
|
36
36
|
# caller first saw, so two admins correcting the same level at once
|
|
@@ -36,9 +36,8 @@ module Spree
|
|
|
36
36
|
if available < line_item.quantity
|
|
37
37
|
raise InsufficientStockError.new(
|
|
38
38
|
line_item,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
default: '%{item} has only %{available} available',
|
|
39
|
+
I18n.t(
|
|
40
|
+
'spree.insufficient_stock_for_reservation',
|
|
42
41
|
item: line_item.variant.name,
|
|
43
42
|
available: [available, 0].max
|
|
44
43
|
)
|
|
@@ -13,7 +13,10 @@ module Spree
|
|
|
13
13
|
# credit payment for a negative amount.
|
|
14
14
|
remaining_total = [amount ? [amount, @order.outstanding_balance].min : @order.outstanding_balance, 0].max
|
|
15
15
|
|
|
16
|
-
|
|
16
|
+
# Mirrors Spree::GiftCards::Apply, which refuses a gift card once store
|
|
17
|
+
# credit is in use: the two are never combined on one order.
|
|
18
|
+
return failure(nil, I18n.t('spree.store_credit_using_gift_card_error')) if @order.gift_card.present?
|
|
19
|
+
return failure(nil, I18n.t('spree.error_user_does_not_have_any_store_credits')) unless spendable_store_credits.exists?
|
|
17
20
|
|
|
18
21
|
ApplicationRecord.transaction do
|
|
19
22
|
existing = @order.payments.store_credits.where(status: :checkout)
|
|
@@ -40,12 +43,10 @@ module Spree
|
|
|
40
43
|
# creating unnecessary invalid payment records on every recalculation.
|
|
41
44
|
def update_existing_payments(payments, remaining_total)
|
|
42
45
|
payments.each do |payment|
|
|
43
|
-
|
|
44
|
-
available = credit.amount_remaining + payment.amount
|
|
45
|
-
new_amount = [available, remaining_total].min
|
|
46
|
+
new_amount = store_credit_amount(payment.source, remaining_total)
|
|
46
47
|
|
|
47
48
|
if new_amount.positive?
|
|
48
|
-
payment.
|
|
49
|
+
payment.update_store_credit_amount!(new_amount)
|
|
49
50
|
remaining_total -= new_amount
|
|
50
51
|
else
|
|
51
52
|
payment.invalidate!
|
|
@@ -53,19 +54,14 @@ module Spree
|
|
|
53
54
|
end
|
|
54
55
|
|
|
55
56
|
# If there's still remaining total, apply from additional store credits
|
|
56
|
-
apply_store_credits(remaining_total) if remaining_total.positive?
|
|
57
|
+
apply_store_credits(remaining_total, except: payments.map(&:source_id)) if remaining_total.positive?
|
|
57
58
|
end
|
|
58
59
|
|
|
59
|
-
def apply_store_credits(remaining_total)
|
|
60
|
+
def apply_store_credits(remaining_total, except: [])
|
|
60
61
|
payment_method = Spree::PaymentMethod::StoreCredit.available.first
|
|
61
62
|
raise 'Store credit payment method could not be found' unless payment_method
|
|
62
63
|
|
|
63
|
-
|
|
64
|
-
# currency would be drawn against first and, being unusable, either
|
|
65
|
-
# overshoot the allowed amount or persist a payment that fails later
|
|
66
|
-
# at authorization. This matches what the order already counts as
|
|
67
|
-
# available (Purchase::StoreCredits#total_available_store_credit).
|
|
68
|
-
@order.customer.store_credits.for_store(@order.store).where(currency: @order.currency).oldest_first.each do |credit|
|
|
64
|
+
spendable_store_credits.where.not(id: except).oldest_first.each do |credit|
|
|
69
65
|
break unless remaining_total.positive?
|
|
70
66
|
next if credit.amount_remaining.zero?
|
|
71
67
|
|
|
@@ -75,6 +71,12 @@ module Spree
|
|
|
75
71
|
end
|
|
76
72
|
end
|
|
77
73
|
|
|
74
|
+
def spendable_store_credits
|
|
75
|
+
return Spree::StoreCredit.none unless @order.customer
|
|
76
|
+
|
|
77
|
+
@order.customer.store_credits.without_gift_card.for_store(@order.store).where(currency: @order.currency)
|
|
78
|
+
end
|
|
79
|
+
|
|
78
80
|
def create_store_credit_payment(payment_method, credit, amount)
|
|
79
81
|
@order.payments.create!(
|
|
80
82
|
source: credit,
|
|
@@ -59,18 +59,17 @@ module Spree
|
|
|
59
59
|
# translations. Only the *derived* default is filtered: falling back to
|
|
60
60
|
# a country's official language that Spree has no strings for would set
|
|
61
61
|
# a storefront to a language with nothing behind it, and it is not one
|
|
62
|
-
# the setup screen ever offers.
|
|
63
|
-
# English, so filtering there would flatten every country to it.
|
|
62
|
+
# the setup screen ever offers.
|
|
64
63
|
def resolve_locale(requested, country)
|
|
65
64
|
return requested if requested.present?
|
|
66
65
|
|
|
67
66
|
derived = country.default_locale.presence
|
|
68
67
|
return 'en' if derived.blank?
|
|
69
68
|
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
locales = Spree.available_locales
|
|
70
|
+
Spree.locale_for_language(derived, locales) ||
|
|
71
|
+
country.official_locales.lazy.filter_map { |language| Spree.locale_for_language(language, locales) }.first ||
|
|
72
|
+
'en'
|
|
74
73
|
end
|
|
75
74
|
|
|
76
75
|
# The store's own country/currency/locale columns are not the source of
|
|
@@ -118,12 +117,12 @@ module Spree
|
|
|
118
117
|
end
|
|
119
118
|
|
|
120
119
|
# Match on identity alone: folding the other attributes into the finder
|
|
121
|
-
# made re-running fail once anything edited them.
|
|
120
|
+
# made re-running fail once anything edited them. The default flag is
|
|
121
|
+
# that identity; the name is translated and may have been edited.
|
|
122
122
|
def provision_stock_location
|
|
123
|
-
# first_party, so a seller
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
where(name: Spree.t(:default_stock_location_name)).first_or_initialize
|
|
123
|
+
# first_party, so a seller's location is never adopted as the store's own.
|
|
124
|
+
location = store.stock_locations.first_party.where(default: true).
|
|
125
|
+
first_or_initialize(name: I18n.t('spree.default_stock_location_name'))
|
|
127
126
|
location.propagate_all_variants = false if location.new_record?
|
|
128
127
|
location.country_code = country.iso
|
|
129
128
|
if location.persisted? && location.will_save_change_to_country_code?
|
|
@@ -206,7 +205,7 @@ module Spree
|
|
|
206
205
|
weight_unit = store.preferred_weight_unit
|
|
207
206
|
|
|
208
207
|
store.package_types.create!(
|
|
209
|
-
name:
|
|
208
|
+
name: I18n.t('spree.package_types.default_name'),
|
|
210
209
|
kind: 'box',
|
|
211
210
|
default: true,
|
|
212
211
|
length: metric ? 30 : 12,
|
|
@@ -237,10 +236,12 @@ module Spree
|
|
|
237
236
|
end
|
|
238
237
|
return if store.stock_locations.first_party.where(pickup_enabled: true).none?
|
|
239
238
|
|
|
240
|
-
|
|
239
|
+
# Matched by its provider, not its translated (and editable) name.
|
|
240
|
+
delivery_method = store.delivery_methods.first_party.
|
|
241
|
+
where(fulfillment_provider: 'Spree::FulfillmentProvider::Pickup').
|
|
242
|
+
first_or_initialize(name: I18n.t('spree.pickup.store_pickup'))
|
|
241
243
|
delivery_method.delivery_profile = profile
|
|
242
244
|
delivery_method.storefront_visible = true
|
|
243
|
-
delivery_method.fulfillment_provider = 'Spree::FulfillmentProvider::Pickup'
|
|
244
245
|
delivery_method.calculator ||= Spree::Calculator::Shipping::FlatRate.new
|
|
245
246
|
delivery_method.calculator.preferences = { amount: 0, currency: currency }
|
|
246
247
|
delivery_method.save!
|