spree_core 6.0.0.beta4 → 6.0.0.rc2
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 +5 -5
- 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/search_provider/index_job.rb +4 -0
- data/app/jobs/spree/seller_payouts/sweep_seller_job.rb +2 -0
- data/app/jobs/spree/uploads/purge_unattached_job.rb +49 -0
- data/app/mailers/spree/admin_user_mailer.rb +4 -19
- data/app/mailers/spree/base_mailer.rb +97 -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 +15 -1
- data/app/models/concerns/spree/api_typed.rb +91 -0
- data/app/models/concerns/spree/calculated_adjustments.rb +41 -13
- data/app/models/concerns/spree/calculator/currency_amounts.rb +1 -1
- data/app/models/concerns/spree/calculator/tiers.rb +63 -0
- data/app/models/concerns/spree/canonical_decimals.rb +61 -0
- data/app/models/concerns/spree/customer_methods.rb +23 -18
- data/app/models/concerns/spree/derived_number.rb +11 -13
- 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/json_schema.rb +139 -0
- data/app/models/concerns/spree/preference_schema.rb +62 -32
- data/app/models/concerns/spree/product_scopes.rb +16 -2
- 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 +8 -4
- data/app/models/concerns/spree/purchase/purchase_order.rb +9 -4
- data/app/models/concerns/spree/purchase/store_credits.rb +36 -1
- data/app/models/concerns/spree/purchase/totals.rb +49 -8
- data/app/models/concerns/spree/ransackable_attributes.rb +46 -0
- 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/signed_id_attachments.rb +54 -0
- data/app/models/concerns/spree/single_store_resource.rb +1 -1
- data/app/models/concerns/spree/stores/email_branding.rb +32 -0
- data/app/models/concerns/spree/stores/markets.rb +5 -2
- data/app/models/concerns/spree/type_labels.rb +38 -0
- data/app/models/concerns/spree/typed_adjustment_line.rb +5 -6
- data/app/models/concerns/spree/typed_associations.rb +12 -18
- data/app/models/concerns/spree/vat_price_calculation.rb +5 -6
- data/app/models/spree/address.rb +12 -2
- data/app/models/spree/adjusters/largest_remainder.rb +14 -1
- data/app/models/spree/adjusters/promotion.rb +4 -19
- data/app/models/spree/allowed_origin.rb +3 -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 +99 -22
- data/app/models/spree/calculator/flat_percent_item_total.rb +2 -4
- data/app/models/spree/calculator/flat_rate.rb +3 -5
- data/app/models/spree/calculator/flexi_rate.rb +4 -6
- data/app/models/spree/calculator/percent_on_line_item.rb +2 -2
- data/app/models/spree/calculator/price_sack.rb +5 -7
- data/app/models/spree/calculator/shipping/digital_delivery.rb +3 -5
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +7 -7
- data/app/models/spree/calculator/shipping/flat_rate.rb +5 -7
- data/app/models/spree/calculator/shipping/flexi_rate.rb +4 -6
- data/app/models/spree/calculator/shipping/per_item.rb +3 -5
- data/app/models/spree/calculator/shipping/price_sack.rb +5 -7
- data/app/models/spree/calculator/tiered_flat_rate.rb +7 -24
- data/app/models/spree/calculator/tiered_percent.rb +7 -25
- data/app/models/spree/cart.rb +78 -18
- data/app/models/spree/catalog.rb +1 -0
- data/app/models/spree/catalog_price.rb +0 -7
- data/app/models/spree/catalog_price_tier.rb +0 -8
- data/app/models/spree/category.rb +3 -1
- data/app/models/spree/channel/gating.rb +3 -2
- data/app/models/spree/channel.rb +6 -4
- data/app/models/spree/claim.rb +22 -1
- data/app/models/spree/claim_line_item.rb +41 -6
- data/app/models/spree/collection.rb +2 -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 +7 -4
- 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/category_rule.rb +2 -5
- data/app/models/spree/commission_rules/item_total_rule.rb +2 -2
- data/app/models/spree/commission_rules/product_rule.rb +1 -1
- data/app/models/spree/commission_rules/seller_rule.rb +2 -5
- data/app/models/spree/company.rb +1 -0
- 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 +20 -35
- data/app/models/spree/custom_fields/boolean.rb +1 -1
- data/app/models/spree/custom_fields/json.rb +1 -1
- data/app/models/spree/customer_group.rb +1 -0
- data/app/models/spree/data_feed/google.rb +0 -2
- data/app/models/spree/data_request.rb +2 -1
- data/app/models/spree/delivery_method.rb +36 -14
- data/app/models/spree/delivery_method_rule.rb +4 -11
- data/app/models/spree/delivery_method_rules/channel_rule.rb +2 -5
- data/app/models/spree/delivery_method_rules/item_total_rule.rb +2 -2
- data/app/models/spree/delivery_profile.rb +1 -0
- data/app/models/spree/delivery_rate.rb +7 -8
- data/app/models/spree/delivery_rate_provider/base.rb +1 -0
- data/app/models/spree/delivery_zone.rb +1 -2
- 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 +16 -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 +3 -3
- data/app/models/spree/fee.rb +4 -2
- data/app/models/spree/file_upload.rb +155 -0
- data/app/models/spree/fulfillment.rb +66 -30
- data/app/models/spree/fulfillment_changer.rb +2 -2
- data/app/models/spree/fulfillment_group.rb +6 -1
- 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 +6 -0
- data/app/models/spree/gateway/custom_payment_source_method.rb +5 -0
- data/app/models/spree/gateway.rb +6 -2
- data/app/models/spree/gift_card.rb +18 -8
- data/app/models/spree/gift_card_batch.rb +3 -5
- data/app/models/spree/import.rb +5 -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 +9 -19
- data/app/models/spree/invitation.rb +5 -5
- data/app/models/spree/line_item.rb +15 -4
- data/app/models/spree/locale.rb +11 -8
- data/app/models/spree/market.rb +8 -2
- data/app/models/spree/media.rb +1 -9
- data/app/models/spree/newsletter_subscriber.rb +4 -0
- data/app/models/spree/option_type.rb +2 -1
- data/app/models/spree/option_value.rb +2 -1
- data/app/models/spree/order.rb +60 -142
- data/app/models/spree/order_group.rb +18 -4
- 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 +2 -2
- data/app/models/spree/payment/gateway_options.rb +15 -53
- data/app/models/spree/payment/processing.rb +2 -4
- data/app/models/spree/payment.rb +21 -13
- data/app/models/spree/payment_method/check.rb +2 -0
- data/app/models/spree/payment_method/session_instrumentation.rb +1 -0
- data/app/models/spree/payment_method/store_credit.rb +15 -13
- data/app/models/spree/payment_method.rb +78 -6
- 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/policy.rb +1 -0
- data/app/models/spree/price.rb +17 -14
- data/app/models/spree/price_adjustment_tier.rb +4 -0
- data/app/models/spree/price_list.rb +14 -9
- data/app/models/spree/price_rules/channel_rule.rb +3 -6
- data/app/models/spree/price_rules/customer_group_rule.rb +3 -6
- data/app/models/spree/price_rules/market_rule.rb +2 -5
- data/app/models/spree/price_rules/user_rule.rb +1 -3
- data/app/models/spree/product/channels.rb +9 -2
- data/app/models/spree/product.rb +54 -30
- data/app/models/spree/product_submission.rb +0 -12
- data/app/models/spree/product_type.rb +1 -1
- data/app/models/spree/promotion/actions/create_line_items.rb +28 -18
- data/app/models/spree/promotion/rules/category.rb +1 -5
- data/app/models/spree/promotion/rules/channel.rb +2 -9
- data/app/models/spree/promotion/rules/country.rb +3 -8
- data/app/models/spree/promotion/rules/currency.rb +1 -5
- data/app/models/spree/promotion/rules/customer_group.rb +2 -9
- data/app/models/spree/promotion/rules/first_order.rb +0 -4
- data/app/models/spree/promotion/rules/item_total.rb +6 -10
- data/app/models/spree/promotion/rules/market.rb +2 -9
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -4
- data/app/models/spree/promotion/rules/option_value.rb +2 -6
- data/app/models/spree/promotion/rules/product.rb +1 -5
- 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 +36 -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 +3 -0
- data/app/models/spree/quantity_rule.rb +1 -1
- data/app/models/spree/refund.rb +41 -18
- data/app/models/spree/return.rb +31 -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 +2 -1
- data/app/models/spree/search_provider/base.rb +4 -0
- data/app/models/spree/seller.rb +10 -2
- data/app/models/spree/seller_payout.rb +8 -0
- data/app/models/spree/seller_requirement.rb +5 -12
- data/app/models/spree/seller_requirement_custom_field.rb +1 -2
- data/app/models/spree/seller_requirement_submission.rb +3 -2
- data/app/models/spree/seller_requirements/accept_terms.rb +2 -3
- data/app/models/spree/seller_transfer.rb +6 -0
- data/app/models/spree/shipping_label.rb +2 -0
- data/app/models/spree/stock/availability_validator.rb +2 -2
- data/app/models/spree/stock/estimator.rb +1 -1
- 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 +3 -1
- data/app/models/spree/stock_location.rb +1 -0
- 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 +6 -2
- data/app/models/spree/store.rb +70 -19
- data/app/models/spree/store_credit.rb +13 -13
- data/app/models/spree/store_credit_event.rb +5 -5
- data/app/models/spree/supplier.rb +1 -0
- data/app/models/spree/tax_category.rb +1 -0
- data/app/models/spree/tax_exemption_certificate.rb +3 -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 +70 -41
- data/app/models/spree/tax_provider/recorded_share.rb +114 -0
- data/app/models/spree/tax_rate.rb +30 -8
- data/app/models/spree/taxon.rb +1 -1
- data/app/models/spree/taxonomy.rb +0 -1
- data/app/models/spree/update_status.rb +25 -0
- data/app/models/spree/variant.rb +10 -12
- data/app/models/spree/variant_media.rb +1 -1
- data/app/models/spree/webhook_delivery.rb +1 -0
- data/app/models/spree/webhook_endpoint.rb +46 -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 +10 -6
- data/app/presenters/spree/csv/price_list_price_presenter.rb +3 -8
- data/app/presenters/spree/csv/product_variant_presenter.rb +59 -20
- data/app/presenters/spree/csv/purchase_order_item_presenter.rb +1 -3
- 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 +22 -8
- 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 +77 -34
- data/app/services/spree/imports/row_processors/purchase_order.rb +13 -13
- data/app/services/spree/locales.rb +43 -10
- 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 +5 -4
- data/app/services/spree/orders/discounts/create.rb +14 -11
- 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/prices/bulk_upsert.rb +32 -25
- 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/seeds/stores.rb +1 -1
- 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 +23 -25
- data/app/services/spree/update_check.rb +160 -0
- data/app/services/spree/uploads/assign_stores.rb +92 -0
- data/app/subscribers/spree/seller_onboarding_subscriber.rb +1 -1
- data/app/validators/spree/attachment_content_type_validator.rb +19 -2
- data/app/validators/spree/locale_codes_validator.rb +22 -0
- 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 +53 -49
- 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/capture.rb +20 -5
- data/app/workflows/spree/payments/process.rb +5 -3
- 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/price_lists/update.rb +4 -4
- 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/create.rb +3 -1
- 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 +7 -7
- 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/create.rb +3 -1
- 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/currency_exponents.json +180 -0
- 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/content_locales.rb +9 -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 +47 -505
- 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/db/migrate/20261009000001_change_money_columns_to_decimal_19_4.rb +116 -0
- data/db/migrate/20261010000001_add_store_id_to_active_storage_blobs.rb +12 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +0 -9
- data/lib/generators/spree/dummy/templates/rails/test.rb +26 -0
- data/lib/spree/checkout/default_requirements.rb +37 -13
- data/lib/spree/core/configuration.rb +19 -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 +72 -165
- data/lib/spree/core/permissions/default_catalog.rb +5 -0
- data/lib/spree/core/preferences/invalid_preferences.rb +18 -0
- data/lib/spree/core/preferences/json_conversion.rb +186 -0
- data/lib/spree/core/preferences/masking.rb +55 -2
- data/lib/spree/core/preferences/preferable.rb +343 -103
- data/lib/spree/core/preferences/preferable_class_methods.rb +188 -136
- data/lib/spree/core/previews/import_preview.rb +10 -0
- data/lib/spree/core/ransack_configuration.rb +13 -2
- data/lib/spree/core/tax/provider_error.rb +37 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +91 -373
- 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/iso_data.rb +7 -0
- data/lib/spree/localized_number.rb +6 -0
- data/lib/spree/migrations.rb +4 -1
- data/lib/spree/money.rb +196 -15
- data/lib/spree/reporting/adapters/base.rb +7 -6
- 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/registry.rb +13 -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/product_factory.rb +9 -0
- 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 +67 -1
- data/lib/spree/uploads.rb +101 -0
- data/lib/tasks/categories_and_collections.rake +3 -3
- data/lib/tasks/core.rake +6 -4
- data/lib/tasks/markets.rake +2 -1
- data/lib/tasks/media.rake +3 -3
- data/lib/tasks/migrate_users_to_customers.rake +23 -18
- data/lib/tasks/money.rake +46 -0
- data/lib/tasks/package_types.rake +1 -1
- data/lib/tasks/preferences_json.rake +101 -0
- data/lib/tasks/seller_sample_data.rake +2 -2
- data/lib/tasks/store_settings.rake +13 -6
- data/lib/tasks/typed_adjustments_migration.rake +1 -1
- data/lib/tasks/uploads.rake +19 -0
- data/spec/fixtures/mailer_views/custom_views_probe_mailer/welcome_email.html.erb +4 -0
- metadata +219 -46
- data/app/jobs/spree/products/touch_categories_job.rb +0 -15
- data/app/jobs/spree/products/touch_taxons_job.rb +0 -13
- 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
data/app/models/spree/order.rb
CHANGED
|
@@ -45,11 +45,15 @@ module Spree
|
|
|
45
45
|
include Spree::Purchase::Validations
|
|
46
46
|
include Spree::Purchase::Totals
|
|
47
47
|
include Spree::Purchase::Lifecycle
|
|
48
|
+
include Spree::Purchase::DeprecatedAliases
|
|
48
49
|
has_spree_number prefix: 'R'
|
|
49
50
|
|
|
50
51
|
include Spree::NumberIdentifier
|
|
51
52
|
|
|
52
53
|
publishes_lifecycle_events
|
|
54
|
+
publishes_events :approved, :canceled, :delivered, :fulfilled, :paid, :placed, :shipped,
|
|
55
|
+
:resend_confirmation_email, :resend_digital_links_email
|
|
56
|
+
publishes_event :completed, deprecated_alias_of: 'order.placed'
|
|
53
57
|
include Spree::HasCustomFields
|
|
54
58
|
include Spree::Metadata
|
|
55
59
|
include Spree::HasExternalReferences
|
|
@@ -69,8 +73,6 @@ module Spree
|
|
|
69
73
|
:payment_total, :amount_due, :fee_total,
|
|
70
74
|
:commission_amount_total, :commission_tax_total, :commission_total
|
|
71
75
|
|
|
72
|
-
alias display_ship_total display_delivery_total
|
|
73
|
-
alias_attribute :ship_total, :delivery_total
|
|
74
76
|
|
|
75
77
|
# Transient warnings populated by remove_out_of_stock_items! and ensure_available_delivery_rates
|
|
76
78
|
attribute :warnings, default: -> { [] }
|
|
@@ -84,7 +86,7 @@ module Spree
|
|
|
84
86
|
Spree::Deprecation.warn('Spree::Order#remove_out_of_stock_items! is deprecated and will be removed in Spree 6.1. This method now works only on Spree::Cart objects')
|
|
85
87
|
|
|
86
88
|
existing_warnings = warnings
|
|
87
|
-
result = Spree
|
|
89
|
+
result = Spree.cart_remove_out_of_stock_items_service.call(cart: self)
|
|
88
90
|
return self unless result.success?
|
|
89
91
|
|
|
90
92
|
order, _messages, new_warnings = result.value
|
|
@@ -140,24 +142,6 @@ module Spree
|
|
|
140
142
|
Spree::Checkout::Registry.step_names_for(self).reject { |step| step == 'complete' }
|
|
141
143
|
end
|
|
142
144
|
|
|
143
|
-
# Standardized column names (renamed in 6.0); legacy readers stay as
|
|
144
|
-
# aliases one release.
|
|
145
|
-
alias_attribute :promo_total, :discount_total
|
|
146
|
-
alias display_promo_total display_discount_total
|
|
147
|
-
alias_attribute :item_count, :total_quantity
|
|
148
|
-
|
|
149
|
-
# @deprecated The column is +customer_note+ since 6.0; removed in 6.1.
|
|
150
|
-
def special_instructions
|
|
151
|
-
Spree::Deprecation.warn('Spree::Order#special_instructions is deprecated and will be removed in Spree 6.1. Use #customer_note instead.')
|
|
152
|
-
customer_note
|
|
153
|
-
end
|
|
154
|
-
|
|
155
|
-
# @deprecated See {#special_instructions}; removed in 6.1.
|
|
156
|
-
def special_instructions=(value)
|
|
157
|
-
Spree::Deprecation.warn('Spree::Order#special_instructions= is deprecated and will be removed in Spree 6.1. Use #customer_note= instead.')
|
|
158
|
-
self.customer_note = value
|
|
159
|
-
end
|
|
160
|
-
|
|
161
145
|
# lock_version (renamed from state_lock_version) drives the API's manual
|
|
162
146
|
# optimistic concurrency (compare client-sent version, 409 on mismatch) —
|
|
163
147
|
# Rails auto-locking must not raise on internal saves.
|
|
@@ -169,7 +153,8 @@ module Spree
|
|
|
169
153
|
total item_total total_quantity considered_risky channel_id currency coupon_code customer_id seller_id
|
|
170
154
|
order_group_id po_number
|
|
171
155
|
]
|
|
172
|
-
self.whitelisted_ransackable_scopes = %w[complete incomplete refunded partially_refunded search
|
|
156
|
+
self.whitelisted_ransackable_scopes = %w[complete incomplete refunded partially_refunded search]
|
|
157
|
+
self.ransackable_scope_types = %w[complete incomplete refunded partially_refunded].index_with('boolean')
|
|
173
158
|
# A seller never sees the buyer's email, and a company member filtering the
|
|
174
159
|
# company's orders must not learn a colleague's; the risk flag and coupon
|
|
175
160
|
# are back-office data. `search` matches on the email too.
|
|
@@ -178,8 +163,8 @@ module Spree
|
|
|
178
163
|
seller: %w[email considered_risky coupon_code]
|
|
179
164
|
}
|
|
180
165
|
self.private_ransackable_scopes = {
|
|
181
|
-
store: %w[search
|
|
182
|
-
seller: %w[search
|
|
166
|
+
store: %w[search],
|
|
167
|
+
seller: %w[search]
|
|
183
168
|
}
|
|
184
169
|
|
|
185
170
|
# Set to false on admin-initiated flows to suppress customer-facing emails.
|
|
@@ -209,14 +194,6 @@ module Spree
|
|
|
209
194
|
|
|
210
195
|
ASSOCIATED_CUSTOMER_ATTRIBUTES = [:customer_id, :email, :bill_address_id, :ship_address_id]
|
|
211
196
|
|
|
212
|
-
# @deprecated Use {Spree::Purchase::PaymentProcessing#payment_methods};
|
|
213
|
-
# removed in 6.1.
|
|
214
|
-
def collect_frontend_payment_methods
|
|
215
|
-
Spree::Deprecation.warn('Spree::Order#collect_frontend_payment_methods is deprecated and will be removed in Spree 6.1. Use #payment_methods instead.')
|
|
216
|
-
payment_methods
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
include Spree::DeprecatedCustomerAlias
|
|
220
197
|
|
|
221
198
|
belongs_to :customer, class_name: "::#{Spree.customer_class}", optional: true, autosave: true
|
|
222
199
|
# The cart this order was completed from (unique — the completion
|
|
@@ -261,7 +238,10 @@ module Spree
|
|
|
261
238
|
|
|
262
239
|
# Typed adjustment rows owned by this order (line-, fulfillment- and
|
|
263
240
|
# order-level). See docs/plans/6.0-6.1-split-adjustments.md.
|
|
264
|
-
|
|
241
|
+
# Sale rows only: the order's totals are re-summed from this association,
|
|
242
|
+
# and tax given back on a return, claim or exchange is not tax charged.
|
|
243
|
+
has_many :tax_lines, -> { sale }, class_name: 'Spree::TaxLine', dependent: :destroy, inverse_of: :order
|
|
244
|
+
has_many :post_sale_tax_lines, -> { post_sale }, class_name: 'Spree::TaxLine', dependent: :destroy
|
|
265
245
|
# delete, not destroy: the snapshot is readonly once written, and destroy
|
|
266
246
|
# refuses readonly records. It has no dependents of its own.
|
|
267
247
|
has_one :tax_identifier, class_name: 'Spree::TaxIdentifier', as: :owner,
|
|
@@ -296,8 +276,6 @@ module Spree
|
|
|
296
276
|
# Legacy names — removed in 6.1 (real names: fulfillments, delivery_total,
|
|
297
277
|
# fulfillment_status since 6.0)
|
|
298
278
|
has_many :shipments, class_name: 'Spree::Fulfillment', inverse_of: :order, deprecated: true
|
|
299
|
-
alias_attribute :shipment_total, :delivery_total
|
|
300
|
-
alias display_shipment_total display_delivery_total
|
|
301
279
|
alias_attribute :shipment_state, :fulfillment_status
|
|
302
280
|
# Deprecated alias — the column is payment_status since 6.0; remove in 6.1.
|
|
303
281
|
alias_attribute :payment_state, :payment_status
|
|
@@ -382,9 +360,6 @@ module Spree
|
|
|
382
360
|
left_joins(:bill_address).where(arel_table[:email].lower.eq(query.downcase)).or(where(conditions.reduce(:or)))
|
|
383
361
|
end
|
|
384
362
|
|
|
385
|
-
# Backward compatibility alias — remove in Spree 6.0
|
|
386
|
-
def self.multi_search(query) = search(query)
|
|
387
|
-
|
|
388
363
|
# Find an order by prefixed ID first, falling back to number, then integer id for backwards compatibility
|
|
389
364
|
# @param param [String] the prefixed ID, number, or integer id to search for
|
|
390
365
|
# @return [Spree::Order, nil] the found order or nil
|
|
@@ -441,17 +416,12 @@ module Spree
|
|
|
441
416
|
|
|
442
417
|
# Returns the subtotal used for analytics integrations
|
|
443
418
|
# It's a sum of the item total and the promo total
|
|
444
|
-
# @return [Float]
|
|
419
|
+
# @return [Float] a JSON number, as analytics providers expect
|
|
445
420
|
def analytics_subtotal
|
|
446
421
|
(item_total + line_items.sum(:discount_total)).to_f
|
|
447
422
|
end
|
|
448
423
|
|
|
449
424
|
|
|
450
|
-
# @deprecated Use {#fulfillment_discount}; removed in 6.1.
|
|
451
|
-
def shipping_discount
|
|
452
|
-
Spree::Deprecation.warn('Spree::Order#shipping_discount is deprecated and will be removed in Spree 6.1. Use #fulfillment_discount instead.')
|
|
453
|
-
fulfillment_discount
|
|
454
|
-
end
|
|
455
425
|
|
|
456
426
|
|
|
457
427
|
|
|
@@ -489,7 +459,7 @@ module Spree
|
|
|
489
459
|
end
|
|
490
460
|
|
|
491
461
|
def refunds_total
|
|
492
|
-
refunds
|
|
462
|
+
read_association_in_memory?(:refunds) ? refunds.sum(0.to_d, &:amount) : refunds.sum(:amount)
|
|
493
463
|
end
|
|
494
464
|
|
|
495
465
|
# Checks if the order is partially refunded
|
|
@@ -651,12 +621,6 @@ module Spree
|
|
|
651
621
|
Spree.order_update_statuses_service.call(order: self)
|
|
652
622
|
end
|
|
653
623
|
|
|
654
|
-
# @deprecated Use {#recalculate_totals!}; removed in 6.1.
|
|
655
|
-
def update_with_updater!
|
|
656
|
-
Spree::Deprecation.warn('Spree::Order#update_with_updater! is deprecated and will be removed in Spree 6.1. Use #recalculate_totals! instead.')
|
|
657
|
-
recalculate_totals!
|
|
658
|
-
end
|
|
659
|
-
|
|
660
624
|
# @deprecated Use {Spree::Carts::Merge}; removed in 6.1.
|
|
661
625
|
def merger
|
|
662
626
|
@merger ||= Spree::OrderMerger.new(self)
|
|
@@ -684,12 +648,6 @@ module Spree
|
|
|
684
648
|
Spree.cart_associate_service.call(guest_cart: self, customer: customer, override_email: override_email)
|
|
685
649
|
end
|
|
686
650
|
|
|
687
|
-
# @deprecated Use {#associate_customer!}; removed in 6.1.
|
|
688
|
-
def associate_user!(user, override_email = true)
|
|
689
|
-
Spree::Deprecation.warn('Spree::Order#associate_user! is deprecated and will be removed in Spree 6.1. Use #associate_customer! instead.')
|
|
690
|
-
associate_customer!(user, override_email)
|
|
691
|
-
end
|
|
692
|
-
|
|
693
651
|
def disassociate_customer!
|
|
694
652
|
nullified_attributes = ASSOCIATED_CUSTOMER_ATTRIBUTES.index_with(nil)
|
|
695
653
|
|
|
@@ -730,18 +688,31 @@ module Spree
|
|
|
730
688
|
end
|
|
731
689
|
end
|
|
732
690
|
|
|
733
|
-
# Refunds are
|
|
734
|
-
#
|
|
735
|
-
#
|
|
736
|
-
#
|
|
691
|
+
# Refunds are netted out of payment_total by Spree::Carts::RecalculateTotals,
|
|
692
|
+
# which is right for money handed back for nothing. A refund for goods that
|
|
693
|
+
# came back on a return, claim or exchange also settles what the customer
|
|
694
|
+
# owed for them, so it is added back here — the job the legacy
|
|
695
|
+
# reimbursement total did. Without it every refunded return read as a
|
|
696
|
+
# balance due, and the payment dialog offered to charge it again.
|
|
737
697
|
def outstanding_balance
|
|
738
698
|
if canceled?
|
|
739
699
|
-1 * payment_total
|
|
740
700
|
else
|
|
741
|
-
total - payment_total
|
|
701
|
+
total - payment_total - returned_items_refund_total
|
|
742
702
|
end
|
|
743
703
|
end
|
|
744
704
|
|
|
705
|
+
# What refunds for returns, claims and exchanges have given back. Read off
|
|
706
|
+
# loaded refunds when a list preloaded them, as {#refunds_total} is, since
|
|
707
|
+
# every order serializer asks for it.
|
|
708
|
+
#
|
|
709
|
+
# @return [BigDecimal]
|
|
710
|
+
def returned_items_refund_total
|
|
711
|
+
return refunds.select(&:for_returned_items?).sum(0.to_d, &:amount) if read_association_in_memory?(:refunds)
|
|
712
|
+
|
|
713
|
+
refunds.for_returned_items.sum(:amount)
|
|
714
|
+
end
|
|
715
|
+
|
|
745
716
|
|
|
746
717
|
# The payments that settle this order.
|
|
747
718
|
#
|
|
@@ -859,19 +830,12 @@ module Spree
|
|
|
859
830
|
end
|
|
860
831
|
|
|
861
832
|
def fulfill!
|
|
862
|
-
fulfillments.each { |shipment| shipment.update!(self) if shipment.persisted? }
|
|
863
833
|
save!
|
|
864
834
|
update_statuses!
|
|
865
835
|
end
|
|
866
836
|
|
|
867
837
|
|
|
868
838
|
|
|
869
|
-
def available_payment_methods(store = nil)
|
|
870
|
-
Spree::Deprecation.warn('`Order#available_payment_methods` is deprecated and will be removed in Spree 6.1. Use `payment_methods` instead.')
|
|
871
|
-
|
|
872
|
-
@available_payment_methods ||= collect_payment_methods(store)
|
|
873
|
-
end
|
|
874
|
-
|
|
875
839
|
def insufficient_stock_lines
|
|
876
840
|
line_items.select(&:insufficient_stock?)
|
|
877
841
|
end
|
|
@@ -885,7 +849,7 @@ module Spree
|
|
|
885
849
|
def ensure_line_item_variants_are_not_discontinued
|
|
886
850
|
Spree::Deprecation.warn('Spree::Order#ensure_line_item_variants_are_not_discontinued is deprecated and will be removed in Spree 6.1. Completion validation lives in Spree::Checkout::Requirements.')
|
|
887
851
|
if line_items.any? { |li| !li.variant || li.variant.discontinued? }
|
|
888
|
-
errors.add(:base, :discontinued_variants_present, message:
|
|
852
|
+
errors.add(:base, :discontinued_variants_present, message: I18n.t('spree.discontinued_variants_present'))
|
|
889
853
|
false
|
|
890
854
|
else
|
|
891
855
|
true
|
|
@@ -898,7 +862,7 @@ module Spree
|
|
|
898
862
|
def ensure_line_items_are_in_stock
|
|
899
863
|
Spree::Deprecation.warn('Spree::Order#ensure_line_items_are_in_stock is deprecated and will be removed in Spree 6.1. Completion validation lives in Spree::Checkout::Requirements.')
|
|
900
864
|
if insufficient_stock_lines.present?
|
|
901
|
-
errors.add(:base, :insufficient_stock_lines_present, message:
|
|
865
|
+
errors.add(:base, :insufficient_stock_lines_present, message: I18n.t('spree.insufficient_stock_lines_present'))
|
|
902
866
|
false
|
|
903
867
|
else
|
|
904
868
|
true
|
|
@@ -941,7 +905,15 @@ module Spree
|
|
|
941
905
|
fully_fulfilled?
|
|
942
906
|
end
|
|
943
907
|
|
|
944
|
-
|
|
908
|
+
# @param keep_selection [Boolean] false when the destination changed, so
|
|
909
|
+
# the new proposals start from the default rate
|
|
910
|
+
def rebuild_fulfillments!(keep_selection: true)
|
|
911
|
+
# A placed order's delivery was charged at placement; re-pricing it
|
|
912
|
+
# belongs to the post-placement edit path, not to a rebuild.
|
|
913
|
+
unless completed?
|
|
914
|
+
previous_selections = keep_selection ? fulfillments.selected_rates_by_stock_location : {}
|
|
915
|
+
end
|
|
916
|
+
|
|
945
917
|
discounts.for_fulfillments.delete_all
|
|
946
918
|
tax_lines.for_fulfillments.delete_all
|
|
947
919
|
fees.for_fulfillments.delete_all
|
|
@@ -956,34 +928,13 @@ module Spree
|
|
|
956
928
|
fulfillment_items.on_hand_or_backordered.delete_all
|
|
957
929
|
|
|
958
930
|
self.fulfillments = order_routing_strategy.for_allocation.map do |package|
|
|
959
|
-
package.to_fulfillment.tap
|
|
931
|
+
package.to_fulfillment.tap do |fulfillment|
|
|
932
|
+
fulfillment.address_id = ship_address_id
|
|
933
|
+
fulfillment.carry_over_selection(previous_selections.fetch(fulfillment.stock_location_id, [])) if previous_selections
|
|
934
|
+
end
|
|
960
935
|
end
|
|
961
936
|
end
|
|
962
937
|
|
|
963
|
-
# @deprecated Use {#rebuild_fulfillments!}; removed in 6.1.
|
|
964
|
-
def create_proposed_fulfillments
|
|
965
|
-
Spree::Deprecation.warn('Spree::Order#create_proposed_fulfillments is deprecated and will be removed in Spree 6.1. Use #rebuild_fulfillments! instead.')
|
|
966
|
-
rebuild_fulfillments!
|
|
967
|
-
end
|
|
968
|
-
|
|
969
|
-
# @deprecated Use {#rebuild_fulfillments!}; removed in 6.1.
|
|
970
|
-
def create_proposed_shipments
|
|
971
|
-
Spree::Deprecation.warn('Spree::Order#create_proposed_shipments is deprecated and will be removed in Spree 6.1. Use #rebuild_fulfillments! instead.')
|
|
972
|
-
rebuild_fulfillments!
|
|
973
|
-
end
|
|
974
|
-
|
|
975
|
-
# @deprecated Use {#delivery_step_required?}; removed in 6.1.
|
|
976
|
-
def delivery_required?
|
|
977
|
-
Spree::Deprecation.warn('Spree::Order#delivery_required? is deprecated and will be removed in Spree 6.1. Use #delivery_step_required? (delivery-step applicability) or #shipping_address_required? (address collection) instead.')
|
|
978
|
-
delivery_step_required?
|
|
979
|
-
end
|
|
980
|
-
|
|
981
|
-
# @deprecated Use {#shipping_address_required?}; removed in 6.1.
|
|
982
|
-
def requires_ship_address?
|
|
983
|
-
Spree::Deprecation.warn('Spree::Order#requires_ship_address? is deprecated and will be removed in Spree 6.1. Use #shipping_address_required? instead.')
|
|
984
|
-
shipping_address_required?
|
|
985
|
-
end
|
|
986
|
-
|
|
987
938
|
# Resolves the routing strategy from the channel override first, then the
|
|
988
939
|
# store default. Only a registered Spree::OrderRouting::Strategy::Base
|
|
989
940
|
# subclass is used; any other value (an unregistered/typo'd class, or a
|
|
@@ -1053,23 +1004,17 @@ module Spree
|
|
|
1053
1004
|
::Spree::PromotionHandler::Cart.new(self).activate
|
|
1054
1005
|
end
|
|
1055
1006
|
|
|
1056
|
-
#
|
|
1007
|
+
# Rebuilds stale fulfillments from the current items, keeping the chosen
|
|
1008
|
+
# rates. The first ones are Spree::Orders::BuildFulfillments' to build.
|
|
1057
1009
|
def ensure_updated_fulfillments
|
|
1058
1010
|
if fulfillments.any? && !completed?
|
|
1059
|
-
|
|
1060
|
-
update_column(:delivery_total, 0)
|
|
1011
|
+
rebuild_fulfillments!
|
|
1061
1012
|
|
|
1062
|
-
#
|
|
1013
|
+
# Nothing here saves the order, so its update event is published by hand.
|
|
1063
1014
|
publish_event('order.updated')
|
|
1064
1015
|
end
|
|
1065
1016
|
end
|
|
1066
1017
|
|
|
1067
|
-
# @deprecated Use {#ensure_updated_fulfillments}; removed in 6.1.
|
|
1068
|
-
def ensure_updated_shipments
|
|
1069
|
-
Spree::Deprecation.warn('Spree::Order#ensure_updated_fulfillments is deprecated and will be removed in Spree 6.1. Use #ensure_updated_fulfillments instead.')
|
|
1070
|
-
ensure_updated_fulfillments
|
|
1071
|
-
end
|
|
1072
|
-
|
|
1073
1018
|
# Re-quotes every fulfillment for the given audience.
|
|
1074
1019
|
#
|
|
1075
1020
|
# @param audience [Symbol] {Spree::DeliveryMethod::STOREFRONT} (default)
|
|
@@ -1085,11 +1030,6 @@ module Spree
|
|
|
1085
1030
|
refresh_delivery_rates(audience)
|
|
1086
1031
|
end
|
|
1087
1032
|
|
|
1088
|
-
def set_shipments_cost
|
|
1089
|
-
Spree::Deprecation.warn('Spree::Order#set_shipments_cost is deprecated and will be removed in Spree 6.1l. Please use set_fulfillments_cost instead')
|
|
1090
|
-
set_fulfillments_cost
|
|
1091
|
-
end
|
|
1092
|
-
|
|
1093
1033
|
def set_fulfillments_cost
|
|
1094
1034
|
fulfillments.each(&:update_amounts)
|
|
1095
1035
|
recalculate_totals!
|
|
@@ -1249,11 +1189,6 @@ module Spree
|
|
|
1249
1189
|
csv_lines
|
|
1250
1190
|
end
|
|
1251
1191
|
|
|
1252
|
-
def all_line_items
|
|
1253
|
-
Spree::Deprecation.warn('Spree::Order#all_line_items is deprecated and will be removed in Spree 6.1. Please use Spree::Order#line_items instead')
|
|
1254
|
-
line_items
|
|
1255
|
-
end
|
|
1256
|
-
|
|
1257
1192
|
private
|
|
1258
1193
|
|
|
1259
1194
|
# An order placed in a split checkout owns no payments, so its money is
|
|
@@ -1274,14 +1209,14 @@ module Spree
|
|
|
1274
1209
|
def ensure_can_be_deleted
|
|
1275
1210
|
return true if can_be_deleted?
|
|
1276
1211
|
|
|
1277
|
-
errors.add(:base, :order_cannot_be_deleted, message:
|
|
1212
|
+
errors.add(:base, :order_cannot_be_deleted, message: I18n.t('spree.order_cannot_be_deleted'))
|
|
1278
1213
|
throw :abort
|
|
1279
1214
|
end
|
|
1280
1215
|
|
|
1281
1216
|
def valid_order_routing_strategy_class(klass_name)
|
|
1282
1217
|
return if klass_name.blank?
|
|
1283
1218
|
|
|
1284
|
-
klass = Spree.order_routing.strategies
|
|
1219
|
+
klass = Spree::ApiTyped.registered_class(Spree.order_routing.strategies, klass_name)
|
|
1285
1220
|
return klass if klass
|
|
1286
1221
|
|
|
1287
1222
|
Rails.logger.warn(
|
|
@@ -1303,7 +1238,7 @@ module Spree
|
|
|
1303
1238
|
|
|
1304
1239
|
def ensure_line_items_present
|
|
1305
1240
|
unless line_items.present?
|
|
1306
|
-
errors.add(:base, :there_are_no_items_for_this_order, message:
|
|
1241
|
+
errors.add(:base, :there_are_no_items_for_this_order, message: I18n.t('spree.there_are_no_items_for_this_order')) && (return false)
|
|
1307
1242
|
end
|
|
1308
1243
|
end
|
|
1309
1244
|
|
|
@@ -1320,43 +1255,26 @@ module Spree
|
|
|
1320
1255
|
if undeliverable_line_items.present?
|
|
1321
1256
|
product_names = undeliverable_line_items.map(&:name).to_sentence
|
|
1322
1257
|
errors.add(:base, :products_cannot_be_shipped, product_names: product_names,
|
|
1323
|
-
message:
|
|
1258
|
+
message: I18n.t('spree.products_cannot_be_shipped', product_names: product_names))
|
|
1324
1259
|
self.warnings |= undeliverable_line_items.map do |line_item|
|
|
1325
1260
|
{
|
|
1326
1261
|
code: 'delivery_unavailable',
|
|
1327
|
-
message:
|
|
1262
|
+
message: I18n.t('spree.cart_line_item.delivery_unavailable', li_name: line_item.name),
|
|
1328
1263
|
line_item_id: line_item.prefixed_id,
|
|
1329
1264
|
variant_id: line_item.variant&.prefixed_id
|
|
1330
1265
|
}
|
|
1331
1266
|
end
|
|
1332
1267
|
else
|
|
1333
|
-
errors.add(:base, :items_cannot_be_shipped, message:
|
|
1334
|
-
self.warnings |= [{ code: 'delivery_unavailable', message:
|
|
1268
|
+
errors.add(:base, :items_cannot_be_shipped, message: I18n.t('spree.items_cannot_be_shipped'))
|
|
1269
|
+
self.warnings |= [{ code: 'delivery_unavailable', message: I18n.t('spree.items_cannot_be_shipped') }]
|
|
1335
1270
|
end
|
|
1336
1271
|
|
|
1337
1272
|
false
|
|
1338
1273
|
end
|
|
1339
1274
|
end
|
|
1340
1275
|
|
|
1341
|
-
def collect_payment_methods
|
|
1342
|
-
Spree::Deprecation.warn('`Order#collect_payment_methods` is deprecated and will be removed in Spree 6.1. Use `payment_methods` instead.')
|
|
1343
|
-
|
|
1344
|
-
store.payment_methods.active.storefront_visible.select { |pm| pm.available_for_order?(self) }
|
|
1345
|
-
end
|
|
1346
|
-
|
|
1347
1276
|
def credit_card_nil_payment?(attributes)
|
|
1348
|
-
payments.store_credits.present? && attributes[:amount]
|
|
1349
|
-
end
|
|
1350
|
-
|
|
1351
|
-
def recalculate_store_credit_payment
|
|
1352
|
-
recalculate_totals! if using_store_credit?
|
|
1353
|
-
|
|
1354
|
-
if gift_card.present?
|
|
1355
|
-
recalculate_gift_card
|
|
1356
|
-
elsif using_store_credit?
|
|
1357
|
-
Spree.store_credit_apply_service.call(order: self)
|
|
1358
|
-
end
|
|
1277
|
+
payments.store_credits.present? && Spree::Money::Rounding.blank_or_zero?(attributes[:amount])
|
|
1359
1278
|
end
|
|
1360
|
-
|
|
1361
1279
|
end
|
|
1362
1280
|
end
|
|
@@ -39,11 +39,11 @@ module Spree
|
|
|
39
39
|
has_spree_number prefix: 'R', key: :order
|
|
40
40
|
|
|
41
41
|
publishes_lifecycle_events
|
|
42
|
+
publishes_events :completed, :resend_confirmation_email
|
|
42
43
|
|
|
43
44
|
#
|
|
44
45
|
# Associations
|
|
45
46
|
#
|
|
46
|
-
belongs_to :store, class_name: 'Spree::Store'
|
|
47
47
|
belongs_to :customer, class_name: "::#{Spree.customer_class}", optional: true
|
|
48
48
|
# The cart this group was completed from — unique, and the replay key that
|
|
49
49
|
# makes a retried completion return this group instead of building another.
|
|
@@ -100,9 +100,14 @@ module Spree
|
|
|
100
100
|
# the children loaded already (a serializer renders them, a gateway call
|
|
101
101
|
# reads four of these in a row), and an aggregate per figure would issue a
|
|
102
102
|
# query each time even against rows sitting in memory.
|
|
103
|
+
#
|
|
104
|
+
# +tax_total+ is each child's own derivation rather than a column, summed
|
|
105
|
+
# like the rest: asking the children keeps the group's answer the one they
|
|
106
|
+
# gave, where re-deriving it here from the two halves above would be a
|
|
107
|
+
# second way to reach the same figure.
|
|
103
108
|
ROLLED_UP_TOTALS = %i[
|
|
104
109
|
total item_total delivery_total additional_tax_total included_tax_total
|
|
105
|
-
discount_total fee_total
|
|
110
|
+
tax_total discount_total fee_total
|
|
106
111
|
].freeze
|
|
107
112
|
|
|
108
113
|
ROLLED_UP_TOTALS.each do |figure|
|
|
@@ -112,7 +117,7 @@ module Spree
|
|
|
112
117
|
end
|
|
113
118
|
|
|
114
119
|
money_methods(*ROLLED_UP_TOTALS)
|
|
115
|
-
money_methods :gift_card_total
|
|
120
|
+
money_methods :gift_card_total, :amount_due
|
|
116
121
|
|
|
117
122
|
alias ship_total delivery_total
|
|
118
123
|
|
|
@@ -255,9 +260,18 @@ module Spree
|
|
|
255
260
|
association(:orders).reset
|
|
256
261
|
end
|
|
257
262
|
|
|
263
|
+
# Refunds for goods that came back settle what was owed for them, as on
|
|
264
|
+
# {Spree::Order#outstanding_balance}, so they do not count as uncollected.
|
|
265
|
+
#
|
|
258
266
|
# @return [BigDecimal] still to collect across the whole checkout
|
|
259
267
|
def outstanding_balance
|
|
260
|
-
total - payment_total
|
|
268
|
+
total - payment_total - returned_items_refund_total
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
# @return [BigDecimal] what refunds for returns, claims and exchanges on
|
|
272
|
+
# this checkout's payments have given back
|
|
273
|
+
def returned_items_refund_total
|
|
274
|
+
Spree::Refund.for_returned_items.where(payment_id: payments.completed.select(:id)).sum(:amount)
|
|
261
275
|
end
|
|
262
276
|
|
|
263
277
|
# @return [Boolean]
|
|
@@ -26,7 +26,10 @@ module Spree
|
|
|
26
26
|
def verify(shipment = nil, is_updated: false, removing: false)
|
|
27
27
|
return unless order.completed? || shipment.present?
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
# A replacement sent by an exchange or claim stands in for a unit the
|
|
30
|
+
# quantity already paid for, so only a line being destroyed counts it.
|
|
31
|
+
units = fulfillment_items.reload
|
|
32
|
+
units_count = (removing ? units : units.reject(&:replacement?)).sum(&:quantity)
|
|
30
33
|
line_item_changed = is_updated ? !line_item.saved_changes? : !line_item.changed?
|
|
31
34
|
|
|
32
35
|
if removing
|
|
@@ -67,12 +70,12 @@ module Spree
|
|
|
67
70
|
|
|
68
71
|
def remove_all_units(quantity, target_fulfillment = nil)
|
|
69
72
|
if target_fulfillment.present?
|
|
70
|
-
remove_from_shipment(target_fulfillment, quantity)
|
|
73
|
+
remove_from_shipment(target_fulfillment, quantity, include_replacements: true)
|
|
71
74
|
else
|
|
72
75
|
order.fulfillments.each do |shipment|
|
|
73
76
|
break if quantity.zero?
|
|
74
77
|
|
|
75
|
-
quantity -= remove_from_shipment(shipment, quantity)
|
|
78
|
+
quantity -= remove_from_shipment(shipment, quantity, include_replacements: true)
|
|
76
79
|
end
|
|
77
80
|
end
|
|
78
81
|
end
|
|
@@ -120,10 +123,12 @@ module Spree
|
|
|
120
123
|
quantity
|
|
121
124
|
end
|
|
122
125
|
|
|
123
|
-
def remove_from_shipment(shipment, quantity)
|
|
126
|
+
def remove_from_shipment(shipment, quantity, include_replacements: false)
|
|
124
127
|
return 0 if quantity.zero? || shipment.fulfilled?
|
|
125
128
|
|
|
126
|
-
shipment_units = shipment.inventory_units_for_item(line_item, variant).reject
|
|
129
|
+
shipment_units = shipment.inventory_units_for_item(line_item, variant).reject do |unit|
|
|
130
|
+
unit.shipped? || (unit.replacement? && !include_replacements)
|
|
131
|
+
end.sort_by(&:status)
|
|
127
132
|
|
|
128
133
|
removed_quantity = 0
|
|
129
134
|
removed_backordered = 0
|
|
@@ -41,7 +41,7 @@ module Spree
|
|
|
41
41
|
private
|
|
42
42
|
|
|
43
43
|
def exactly_one_owner
|
|
44
|
-
errors.add(:base, :exactly_one_of_cart_or_order, message:
|
|
44
|
+
errors.add(:base, :exactly_one_of_cart_or_order, message: I18n.t('spree.errors.messages.exactly_one_of_cart_or_order')) unless [order, cart].compact.one?
|
|
45
45
|
end
|
|
46
46
|
end
|
|
47
47
|
end
|
|
@@ -19,7 +19,7 @@ module Spree
|
|
|
19
19
|
return if Spree.order_routing.strategies.any? { |strategy| strategy.to_s == value.to_s }
|
|
20
20
|
|
|
21
21
|
errors.add(
|
|
22
|
-
:preferred_order_routing_strategy, :invalid_order_routing_strategy, message:
|
|
22
|
+
:preferred_order_routing_strategy, :invalid_order_routing_strategy, message: I18n.t('spree.errors.messages.invalid_order_routing_strategy')
|
|
23
23
|
)
|
|
24
24
|
end
|
|
25
25
|
end
|
|
@@ -10,6 +10,8 @@ module Spree
|
|
|
10
10
|
# Selected per Order via Spree::Order#order_routing_strategy.
|
|
11
11
|
# See docs/plans/6.0-order-routing.md.
|
|
12
12
|
class Base
|
|
13
|
+
extend Spree::ApiTyped
|
|
14
|
+
|
|
13
15
|
attr_reader :order
|
|
14
16
|
|
|
15
17
|
# Human label for admin strategy pickers. Override in a subclass or add
|
|
@@ -17,7 +19,7 @@ module Spree
|
|
|
17
19
|
#
|
|
18
20
|
# @return [String]
|
|
19
21
|
def self.display_name
|
|
20
|
-
|
|
22
|
+
I18n.t("spree.order_routing.strategies.#{name.demodulize.underscore}", default: name.demodulize.titleize)
|
|
21
23
|
end
|
|
22
24
|
|
|
23
25
|
def initialize(order:)
|
|
@@ -29,7 +31,7 @@ module Spree
|
|
|
29
31
|
raise NotImplementedError, "#{self.class} must implement #for_allocation"
|
|
30
32
|
end
|
|
31
33
|
|
|
32
|
-
# @param fulfillment [Spree::
|
|
34
|
+
# @param fulfillment [Spree::Fulfillment]
|
|
33
35
|
def for_sale(fulfillment:)
|
|
34
36
|
raise NotImplementedError, "#{self.class} must implement #for_sale"
|
|
35
37
|
end
|
|
@@ -23,7 +23,7 @@ module Spree
|
|
|
23
23
|
estimate_rates(packages)
|
|
24
24
|
end
|
|
25
25
|
|
|
26
|
-
# Stock decrement / restock today happens via Spree::
|
|
26
|
+
# Stock decrement / restock today happens via Spree::Fulfillment's state
|
|
27
27
|
# machine (after_ship / after_cancel). The strategy methods below are
|
|
28
28
|
# part of the contract for the future reservation + typed-movement
|
|
29
29
|
# phase — see 6.0-stock-reservations.md and 6.0-typed-stock-movements.md.
|
|
@@ -14,6 +14,10 @@ module Spree
|
|
|
14
14
|
#
|
|
15
15
|
# See docs/plans/6.0-order-routing.md.
|
|
16
16
|
class OrderRoutingRule < Spree.base_class
|
|
17
|
+
include Spree::TypeLabels
|
|
18
|
+
|
|
19
|
+
self.type_labels_scope = 'spree.order_routing_rule_types'
|
|
20
|
+
|
|
17
21
|
self.table_name = 'spree_order_routing_rules'
|
|
18
22
|
|
|
19
23
|
# `rank` is integer (lower = better) when the rule has an opinion,
|
|
@@ -25,7 +29,6 @@ module Spree
|
|
|
25
29
|
include Spree::SingleStoreResource
|
|
26
30
|
include Spree::HasListPosition
|
|
27
31
|
|
|
28
|
-
belongs_to :store, class_name: 'Spree::Store'
|
|
29
32
|
belongs_to :channel, class_name: 'Spree::Channel'
|
|
30
33
|
|
|
31
34
|
attribute :active, :boolean, default: true
|
|
@@ -51,25 +54,6 @@ module Spree
|
|
|
51
54
|
|
|
52
55
|
validate :type_must_be_registered
|
|
53
56
|
|
|
54
|
-
# @return [String] localized display name for the rule kind, used by admin pickers
|
|
55
|
-
def self.human_name
|
|
56
|
-
Spree.t("order_routing_rule_types.#{api_type}.name", default: api_type.titleize)
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
# @return [String] localized description for the rule kind
|
|
60
|
-
def self.human_description
|
|
61
|
-
Spree.t("order_routing_rule_types.#{api_type}.description", default: '')
|
|
62
|
-
end
|
|
63
|
-
|
|
64
|
-
# Feeds the `description` field of `subclasses_with_preference_schema`
|
|
65
|
-
# (the `/types` discovery payload), which only reads `.description`.
|
|
66
|
-
def self.description
|
|
67
|
-
human_description
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def human_name = self.class.human_name
|
|
71
|
-
def human_description = self.class.human_description
|
|
72
|
-
|
|
73
57
|
# Subclasses override. Returns an Array<LocationRanking> — one per location,
|
|
74
58
|
# with rank=nil to abstain.
|
|
75
59
|
#
|
|
@@ -95,14 +79,14 @@ module Spree
|
|
|
95
79
|
return if type.blank?
|
|
96
80
|
return if Spree.order_routing.rules.any? { |rule| rule.to_s == type }
|
|
97
81
|
|
|
98
|
-
errors.add(:type, :invalid_order_routing_rule, message:
|
|
82
|
+
errors.add(:type, :invalid_order_routing_rule, message: I18n.t('spree.errors.messages.invalid_order_routing_rule'))
|
|
99
83
|
end
|
|
100
84
|
|
|
101
85
|
def channel_belongs_to_store
|
|
102
86
|
return if channel.nil? || store_id.nil?
|
|
103
87
|
return if channel.store_id == store_id
|
|
104
88
|
|
|
105
|
-
errors.add(:channel, :channel_store_mismatch, message:
|
|
89
|
+
errors.add(:channel, :channel_store_mismatch, message: I18n.t('spree.errors.messages.channel_store_mismatch'))
|
|
106
90
|
end
|
|
107
91
|
end
|
|
108
92
|
end
|
|
@@ -18,7 +18,6 @@ module Spree
|
|
|
18
18
|
include Spree::SingleStoreResource
|
|
19
19
|
include Spree::Metadata
|
|
20
20
|
|
|
21
|
-
belongs_to :store, class_name: 'Spree::Store'
|
|
22
21
|
|
|
23
22
|
# Whose packaging this is. Nil is the marketplace's own row — the shared
|
|
24
23
|
# vocabulary every seller may pack into — and a seller's rows are theirs
|
|
@@ -95,6 +94,7 @@ module Spree
|
|
|
95
94
|
# `seller_id` is what the operator's list filters by to see one seller's
|
|
96
95
|
# packaging, or (blank) the marketplace's own.
|
|
97
96
|
self.whitelisted_ransackable_attributes = %w[name kind default seller_id]
|
|
97
|
+
search_by :name
|
|
98
98
|
self.whitelisted_ransackable_associations = %w[seller]
|
|
99
99
|
|
|
100
100
|
# The unit the geometry is expressed in, falling back to what the store's
|
|
@@ -150,7 +150,7 @@ module Spree
|
|
|
150
150
|
return unless default?
|
|
151
151
|
return if destroyed_by_association.present?
|
|
152
152
|
|
|
153
|
-
errors.add(:base,
|
|
153
|
+
errors.add(:base, I18n.t('spree.errors.messages.cannot_delete_default_package_type'))
|
|
154
154
|
throw(:abort)
|
|
155
155
|
end
|
|
156
156
|
|