spree_core 5.6.1 → 6.0.0.beta1
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/LICENSE +30 -0
- data/README.md +2 -3
- data/app/finders/spree/line_items/find_by_variant.rb +5 -3
- data/app/finders/spree/sellers/panel_url.rb +47 -0
- data/app/finders/spree/stores/dashboard_url.rb +76 -0
- data/app/helpers/spree/images_helper.rb +1 -1
- data/app/jobs/spree/carts/reap_expired_job.rb +43 -0
- data/app/jobs/spree/collections/regenerate_time_based_job.rb +18 -0
- data/app/jobs/spree/data_requests/process_job.rb +42 -0
- data/app/jobs/spree/events/subscriber_job.rb +1 -1
- data/app/jobs/spree/images/migrate_product_media_job.rb +80 -0
- data/app/jobs/spree/images/save_from_url_job.rb +70 -13
- data/app/jobs/spree/imports/create_categories_job.rb +23 -14
- data/app/jobs/spree/imports/create_rows_job.rb +3 -62
- data/app/jobs/spree/imports/process_group_job.rb +1 -1
- data/app/jobs/spree/imports/process_job.rb +164 -0
- data/app/jobs/spree/imports/process_rows_job.rb +4 -71
- data/app/jobs/spree/orders/finalize_stale_drafts_job.rb +29 -0
- data/app/jobs/spree/payments/handle_webhook_job.rb +1 -1
- data/app/jobs/spree/price_lists/sync_currencies_job.rb +42 -0
- data/app/jobs/spree/product_types/apply_to_products_job.rb +74 -0
- data/app/jobs/spree/products/auto_match_collections_job.rb +14 -0
- data/app/jobs/spree/products/auto_match_taxons_job.rb +6 -7
- data/app/jobs/spree/products/refresh_metrics_job.rb +1 -1
- data/app/jobs/spree/products/touch_categories_job.rb +15 -0
- data/app/jobs/spree/products/touch_taxons_job.rb +7 -6
- data/app/jobs/spree/seller_payouts/sweep_due_job.rb +57 -0
- data/app/jobs/spree/seller_payouts/sweep_seller_job.rb +70 -0
- data/app/jobs/spree/seller_transfers/execute_pending_due_job.rb +56 -0
- data/app/jobs/spree/seller_transfers/execute_pending_job.rb +52 -0
- data/app/jobs/spree/shipping_labels/store_file_job.rb +17 -0
- data/app/jobs/spree/stock_locations/stock_items/create_job.rb +7 -5
- data/app/jobs/spree/stock_locations/stock_levels/create_job.rb +13 -0
- data/app/jobs/spree/stock_reservations/expire_job.rb +1 -1
- data/app/jobs/spree/tax_identifiers/validate_job.rb +14 -0
- data/app/jobs/spree/variants/remove_line_item_job.rb +29 -1
- data/app/mailers/spree/admin_user_mailer.rb +6 -35
- data/app/mailers/spree/base_mailer.rb +1 -20
- data/app/mailers/spree/invitation_mailer.rb +1 -1
- data/app/mailers/spree/seller_user_mailer.rb +47 -0
- data/app/models/concerns/spree/account_lockout.rb +38 -0
- data/app/models/concerns/spree/admin_user_methods.rb +14 -34
- data/app/models/concerns/spree/calculated_adjustments.rb +8 -14
- data/app/models/concerns/spree/calculator/currency_amounts.rb +43 -0
- data/app/models/concerns/spree/capture_method.rb +33 -0
- data/app/models/concerns/spree/custom_field_filterable.rb +163 -0
- data/app/models/concerns/spree/customer_methods.rb +421 -0
- data/app/models/concerns/spree/deprecated_customer_alias.rb +22 -0
- data/app/models/concerns/spree/derived_number.rb +66 -0
- data/app/models/concerns/spree/has_address_book.rb +89 -0
- data/app/models/concerns/spree/has_custom_fields.rb +360 -0
- data/app/models/concerns/spree/has_external_references.rb +95 -0
- data/app/models/concerns/spree/has_iso_geography.rb +71 -0
- data/app/models/concerns/spree/has_library_media.rb +94 -0
- data/app/models/concerns/spree/has_list_position.rb +15 -0
- data/app/models/concerns/spree/has_number.rb +139 -0
- data/app/models/concerns/spree/has_status.rb +76 -0
- data/app/models/concerns/spree/has_tracking_carrier.rb +18 -0
- data/app/models/concerns/spree/instruments_gateway_calls.rb +20 -0
- data/app/models/concerns/spree/integration_backed_provider.rb +89 -0
- data/app/models/concerns/spree/integrations_concern.rb +15 -2
- data/app/models/concerns/spree/label_translatable.rb +37 -0
- data/app/models/concerns/spree/marketplace/order_group.rb +35 -0
- data/app/models/concerns/spree/metadata.rb +18 -22
- data/app/models/concerns/spree/named_type.rb +11 -1
- data/app/models/concerns/spree/parameterizable_name.rb +5 -5
- data/app/models/concerns/spree/password_policy.rb +37 -0
- data/app/models/concerns/spree/payment_session_transitions.rb +93 -0
- data/app/models/concerns/spree/payment_source_concern.rb +1 -1
- data/app/models/concerns/spree/personal_data_matching.rb +120 -0
- data/app/models/concerns/spree/preference_schema.rb +120 -19
- data/app/models/concerns/spree/prefixed_id.rb +25 -3
- data/app/models/concerns/spree/presentation_translatable.rb +4 -37
- data/app/models/concerns/spree/product_scopes.rb +51 -191
- data/app/models/concerns/spree/provider_failure_policy.rb +44 -0
- data/app/models/concerns/spree/publishable.rb +7 -7
- data/app/models/concerns/spree/purchase/addresses.rb +258 -0
- data/app/models/concerns/spree/purchase/channel.rb +19 -0
- data/app/models/concerns/spree/purchase/checkout_steps.rb +68 -0
- data/app/models/concerns/spree/purchase/company.rb +96 -0
- data/app/models/concerns/spree/purchase/currency.rb +29 -0
- data/app/models/concerns/spree/purchase/digital_items.rb +60 -0
- data/app/models/concerns/spree/purchase/freight.rb +52 -0
- data/app/models/concerns/spree/purchase/gift_cards.rb +70 -0
- data/app/models/concerns/spree/purchase/lifecycle.rb +53 -0
- data/app/models/concerns/spree/purchase/line_item_currencies.rb +38 -0
- data/app/models/concerns/spree/purchase/line_item_lookup.rb +25 -0
- data/app/models/concerns/spree/purchase/locale.rb +30 -0
- data/app/models/concerns/spree/purchase/market.rb +29 -0
- data/app/models/concerns/spree/purchase/payment_processing.rb +93 -0
- data/app/models/concerns/spree/purchase/purchase_order.rb +94 -0
- data/app/models/concerns/spree/purchase/quantity_rules.rb +136 -0
- data/app/models/concerns/spree/purchase/store_credits.rb +100 -0
- data/app/models/concerns/spree/purchase/taxation.rb +146 -0
- data/app/models/concerns/spree/purchase/totals.rb +116 -0
- data/app/models/concerns/spree/purchase/validations.rb +45 -0
- data/app/models/concerns/spree/receivable.rb +103 -0
- data/app/models/concerns/spree/receivable_item.rb +78 -0
- data/app/models/concerns/spree/refund_methods.rb +19 -0
- data/app/models/concerns/spree/sanitizable_rich_text.rb +109 -0
- data/app/models/concerns/spree/search_indexable.rb +5 -2
- data/app/models/concerns/spree/single_store_resource.rb +3 -1
- data/app/models/concerns/spree/store_data_sources.rb +75 -0
- data/app/models/concerns/spree/store_preferences.rb +49 -0
- data/app/models/concerns/spree/stores/markets.rb +75 -28
- data/app/models/concerns/spree/stores/setup.rb +10 -0
- data/app/models/concerns/spree/translatable_resource.rb +25 -6
- data/app/models/concerns/spree/typed_adjustment_line.rb +55 -0
- data/app/models/concerns/spree/user_address.rb +13 -3
- data/app/models/concerns/spree/user_management.rb +18 -6
- data/app/models/concerns/spree/user_methods.rb +5 -330
- data/app/models/concerns/spree/user_payment_source.rb +1 -1
- data/app/models/concerns/spree/user_roles.rb +18 -11
- data/app/models/concerns/spree/validates_store_uniqueness.rb +53 -0
- data/app/models/concerns/spree/vat_price_calculation.rb +58 -6
- data/app/models/concerns/spree/webhook_payload_redaction.rb +1 -1
- data/app/models/spree/ability.rb +147 -43
- data/app/models/spree/address.rb +387 -118
- data/app/models/spree/adjusters/base.rb +26 -0
- data/app/models/spree/adjusters/largest_remainder.rb +24 -0
- data/app/models/spree/adjusters/promotion.rb +253 -0
- data/app/models/spree/admin_user.rb +26 -0
- data/app/models/spree/allowed_origin.rb +1 -1
- data/app/models/spree/api_key.rb +29 -28
- data/app/models/spree/asset.rb +14 -211
- data/app/models/spree/authentication/strategies/base_strategy.rb +54 -3
- data/app/models/spree/authentication/strategies/email_password_strategy.rb +11 -3
- data/app/models/spree/authentication/strategies/oidc_strategy.rb +330 -0
- data/app/models/spree/authentication/strategy_registry.rb +83 -0
- data/app/models/spree/base.rb +83 -12
- data/app/models/spree/base_analytics_event_handler.rb +1 -1
- data/app/models/spree/calculator/shipping/digital_delivery.rb +5 -2
- data/app/models/spree/calculator/shipping/flat_rate.rb +10 -5
- data/app/models/spree/calculator/shipping/flexi_rate.rb +6 -0
- data/app/models/spree/calculator/shipping/per_item.rb +8 -3
- data/app/models/spree/calculator/shipping/price_sack.rb +6 -0
- data/app/models/spree/calculator/tiered_flat_rate.rb +5 -1
- data/app/models/spree/calculator.rb +10 -0
- data/app/models/spree/cart.rb +285 -0
- data/app/models/spree/carts/item_warning.rb +28 -0
- data/app/models/spree/carts/resolved_item.rb +37 -0
- data/app/models/spree/catalog.rb +466 -0
- data/app/models/spree/catalog_assignment.rb +41 -0
- data/app/models/spree/catalog_order_minimum.rb +26 -0
- data/app/models/spree/catalog_price.rb +100 -0
- data/app/models/spree/catalog_price_tier.rb +36 -0
- data/app/models/spree/catalog_product.rb +23 -0
- data/app/models/spree/catalog_quantity_rule.rb +46 -0
- data/app/models/spree/catalogs/product_term.rb +43 -0
- data/app/models/spree/category.rb +430 -12
- data/app/models/spree/channel/gating.rb +1 -2
- data/app/models/spree/channel.rb +38 -4
- data/app/models/spree/channel_stock_location.rb +8 -0
- data/app/models/spree/checkout/default_requirements.rb +105 -22
- data/app/models/spree/checkout/registry.rb +64 -12
- data/app/models/spree/checkout/requirement.rb +9 -9
- data/app/models/spree/checkout/requirements.rb +25 -20
- data/app/models/spree/checkout/step.rb +12 -12
- data/app/models/spree/claim.rb +68 -0
- data/app/models/spree/claim_line_item.rb +46 -0
- data/app/models/spree/claim_reason.rb +24 -0
- data/app/models/spree/classification.rb +7 -49
- data/app/models/spree/collection.rb +269 -0
- data/app/models/spree/collection_rule.rb +58 -0
- data/app/models/spree/collection_rules/available_on.rb +21 -0
- data/app/models/spree/collection_rules/sale.rb +18 -0
- data/app/models/spree/collection_rules/tag.rb +21 -0
- data/app/models/spree/commission_line.rb +85 -0
- data/app/models/spree/commission_rate.rb +370 -0
- data/app/models/spree/commission_rate_value.rb +47 -0
- data/app/models/spree/commission_rule.rb +77 -0
- data/app/models/spree/commission_rule_product.rb +19 -0
- data/app/models/spree/commission_rules/category_rule.rb +33 -0
- data/app/models/spree/commission_rules/item_total_rule.rb +31 -0
- data/app/models/spree/commission_rules/product_rule.rb +55 -0
- data/app/models/spree/commission_rules/seller_rule.rb +33 -0
- data/app/models/spree/commission_tax.rb +51 -0
- data/app/models/spree/commissions/context.rb +71 -0
- data/app/models/spree/company.rb +347 -0
- data/app/models/spree/company_invitation.rb +81 -0
- data/app/models/spree/company_membership.rb +25 -0
- data/app/models/spree/consent_record.rb +125 -0
- data/app/models/spree/country.rb +128 -52
- data/app/models/spree/coupon_code.rb +18 -5
- data/app/models/spree/credit_card.rb +10 -9
- data/app/models/spree/current.rb +124 -18
- data/app/models/spree/custom_field.rb +160 -7
- data/app/models/spree/custom_field_definition/search_capabilities.rb +98 -0
- data/app/models/spree/custom_field_definition.rb +219 -5
- data/app/models/spree/custom_fields/boolean.rb +15 -0
- data/app/models/spree/custom_fields/json.rb +38 -0
- data/app/models/spree/custom_fields/long_text.rb +11 -0
- data/app/models/spree/custom_fields/number.rb +23 -0
- data/app/models/spree/custom_fields/rich_text.rb +23 -0
- data/app/models/spree/custom_fields/short_text.rb +15 -0
- data/app/models/spree/customer.rb +34 -0
- data/app/models/spree/customer_group.rb +12 -12
- data/app/models/spree/customer_group_user.rb +6 -4
- data/app/models/spree/data_feed.rb +1 -1
- data/app/models/spree/data_request.rb +98 -0
- data/app/models/spree/delivery.rb +169 -0
- data/app/models/spree/delivery_method.rb +566 -0
- data/app/models/spree/delivery_method_rule.rb +55 -0
- data/app/models/spree/delivery_method_rule_product.rb +8 -0
- data/app/models/spree/delivery_method_rules/channel_rule.rb +41 -0
- data/app/models/spree/delivery_method_rules/company_rule.rb +24 -0
- data/app/models/spree/delivery_method_rules/excluded_products_rule.rb +48 -0
- data/app/models/spree/delivery_method_rules/item_total_rule.rb +19 -0
- data/app/models/spree/delivery_method_rules/volume_rule.rb +35 -0
- data/app/models/spree/delivery_method_rules/weight_rule.rb +19 -0
- data/app/models/spree/delivery_method_service.rb +24 -0
- data/app/models/spree/delivery_method_stock_location.rb +11 -0
- data/app/models/spree/delivery_origin_group.rb +73 -0
- data/app/models/spree/delivery_origin_group_location.rb +9 -0
- data/app/models/spree/delivery_profile.rb +141 -0
- data/app/models/spree/delivery_profiles/digital.rb +20 -0
- data/app/models/spree/delivery_profiles/shipping.rb +12 -0
- data/app/models/spree/delivery_rate.rb +164 -0
- data/app/models/spree/delivery_rate_provider/base.rb +120 -0
- data/app/models/spree/delivery_rate_provider/estimate.rb +44 -0
- data/app/models/spree/delivery_rate_provider/freight.rb +41 -0
- data/app/models/spree/delivery_rate_provider/internal.rb +28 -0
- data/app/models/spree/delivery_rate_provider/service_catalog.rb +48 -0
- data/app/models/spree/delivery_zone.rb +64 -0
- data/app/models/spree/delivery_zone_member.rb +98 -0
- data/app/models/spree/digital.rb +12 -16
- data/app/models/spree/digital_asset.rb +144 -0
- data/app/models/spree/digital_asset_provider/base.rb +95 -0
- data/app/models/spree/digital_asset_provider/file.rb +20 -0
- data/app/models/spree/digital_delivery.rb +28 -0
- data/app/models/spree/digital_link.rb +31 -11
- data/app/models/spree/discount.rb +51 -0
- data/app/models/spree/event.rb +6 -6
- data/app/models/spree/exchange.rb +49 -44
- data/app/models/spree/exchange_line_item.rb +52 -0
- data/app/models/spree/export.rb +128 -21
- data/app/models/spree/exports/customers.rb +2 -2
- data/app/models/spree/exports/gift_cards.rb +2 -2
- data/app/models/spree/exports/newsletter_subscribers.rb +2 -2
- data/app/models/spree/exports/orders.rb +35 -5
- data/app/models/spree/exports/price_list_prices.rb +107 -0
- data/app/models/spree/exports/products.rb +4 -4
- data/app/models/spree/exports/purchase_orders.rb +39 -0
- data/app/models/spree/exports/report.rb +95 -0
- data/app/models/spree/external_reference.rb +77 -0
- data/app/models/spree/external_video.rb +117 -0
- data/app/models/spree/fee.rb +40 -0
- data/app/models/spree/freight_summary/line.rb +257 -0
- data/app/models/spree/freight_summary.rb +180 -0
- data/app/models/spree/fulfillment/custom_events.rb +96 -0
- data/app/models/spree/fulfillment.rb +973 -0
- data/app/models/spree/fulfillment_changer.rb +170 -0
- data/app/models/spree/fulfillment_item.rb +148 -0
- data/app/models/spree/fulfillment_provider/base.rb +130 -0
- data/app/models/spree/fulfillment_provider/digital.rb +44 -0
- data/app/models/spree/fulfillment_provider/manual.rb +15 -0
- data/app/models/spree/fulfillment_provider/pickup.rb +38 -0
- data/app/models/spree/fulfillment_provider/pickup_point.rb +24 -0
- data/app/models/spree/fulfilment_changer.rb +3 -164
- data/app/models/spree/gateway/bogus.rb +5 -4
- data/app/models/spree/gateway/custom_payment_source_method.rb +5 -5
- data/app/models/spree/gateway.rb +2 -2
- data/app/models/spree/gateway_customer.rb +12 -4
- data/app/models/spree/gift_card.rb +140 -48
- data/app/models/spree/gift_card_batch.rb +2 -2
- data/app/models/spree/import.rb +136 -98
- data/app/models/spree/import_mapping.rb +1 -1
- data/app/models/spree/import_row.rb +35 -31
- data/app/models/spree/import_schemas/price_list_prices.rb +13 -0
- data/app/models/spree/import_schemas/products.rb +8 -1
- data/app/models/spree/import_schemas/purchase_orders.rb +19 -0
- data/app/models/spree/imports/price_list_prices.rb +72 -0
- data/app/models/spree/imports/purchase_orders.rb +28 -0
- data/app/models/spree/integration.rb +128 -5
- data/app/models/spree/inventory_provider/base.rb +30 -0
- data/app/models/spree/inventory_provider/internal.rb +22 -0
- data/app/models/spree/inventory_unit.rb +3 -139
- data/app/models/spree/invitation.rb +53 -47
- data/app/models/spree/label_purchase.rb +29 -0
- data/app/models/spree/line_item.rb +239 -105
- data/app/models/spree/market.rb +106 -15
- data/app/models/spree/market_country.rb +10 -5
- data/app/models/spree/media.rb +497 -0
- data/app/models/spree/media_usage_reference.rb +27 -0
- data/app/models/spree/metafield.rb +14 -102
- data/app/models/spree/metafield_definition.rb +11 -128
- data/app/models/spree/metafields.rb +32 -0
- data/app/models/spree/newsletter_subscriber.rb +10 -9
- data/app/models/spree/number_generators/base.rb +56 -0
- data/app/models/spree/number_generators/random.rb +23 -0
- data/app/models/spree/number_generators/sequential.rb +88 -0
- data/app/models/spree/number_sequence.rb +86 -0
- data/app/models/spree/option_type.rb +18 -32
- data/app/models/spree/option_type_product_type.rb +8 -0
- data/app/models/spree/option_value.rb +19 -13
- data/app/models/spree/option_value_variant.rb +0 -1
- data/app/models/spree/order.rb +628 -571
- data/app/models/spree/order_cancellation_reason.rb +25 -0
- data/app/models/spree/order_group.rb +244 -0
- data/app/models/spree/order_inventory.rb +42 -33
- data/app/models/spree/order_merger.rb +11 -6
- data/app/models/spree/order_promotion.rb +32 -6
- data/app/models/spree/order_routing/has_strategy_preference.rb +1 -2
- data/app/models/spree/order_routing/rules/minimize_splits.rb +6 -6
- data/app/models/spree/order_routing/strategy/rules.rb +12 -8
- data/app/models/spree/order_routing_rule.rb +5 -15
- data/app/models/spree/order_updater.rb +131 -163
- data/app/models/spree/package_type.rb +191 -0
- data/app/models/spree/payment/custom_events.rb +52 -5
- data/app/models/spree/payment/gateway_options.rb +20 -5
- data/app/models/spree/payment/processing.rb +95 -116
- data/app/models/spree/payment.rb +299 -123
- data/app/models/spree/payment_method/check.rb +4 -3
- data/app/models/spree/payment_method/session_instrumentation.rb +34 -0
- data/app/models/spree/payment_method/store_credit.rb +4 -2
- data/app/models/spree/payment_method.rb +106 -9
- data/app/models/spree/payment_session.rb +150 -53
- data/app/models/spree/payment_setup_session.rb +4 -37
- data/app/models/spree/payment_source.rb +5 -4
- data/app/models/spree/payment_split.rb +90 -0
- data/app/models/spree/payout_provider/base.rb +218 -0
- data/app/models/spree/payout_provider/system.rb +36 -0
- data/app/models/spree/permission_sets.rb +17 -0
- data/app/models/spree/pickup_point_option.rb +28 -0
- data/app/models/spree/pickup_point_provider/base.rb +24 -0
- data/app/models/spree/policy.rb +12 -11
- data/app/models/spree/price.rb +91 -5
- data/app/models/spree/price_adjustment_tier.rb +63 -0
- data/app/models/spree/price_history.rb +1 -1
- data/app/models/spree/price_list.rb +266 -142
- data/app/models/spree/price_rule.rb +51 -7
- data/app/models/spree/price_rules/channel_rule.rb +3 -0
- data/app/models/spree/price_rules/customer_group_rule.rb +10 -1
- data/app/models/spree/price_rules/market_rule.rb +6 -0
- data/app/models/spree/price_rules/user_rule.rb +12 -3
- data/app/models/spree/price_rules/volume_rule.rb +6 -0
- data/app/models/spree/price_rules/zone_rule.rb +5 -13
- data/app/models/spree/pricing_provider/base.rb +51 -0
- data/app/models/spree/pricing_provider/internal.rb +255 -0
- data/app/models/spree/pricing_provider.rb +28 -0
- data/app/models/spree/product.rb +528 -544
- data/app/models/spree/product_category.rb +65 -0
- data/app/models/spree/product_collection.rb +20 -0
- data/app/models/spree/product_option_type.rb +0 -1
- data/app/models/spree/product_promotion_rule.rb +0 -1
- data/app/models/spree/product_publication.rb +0 -1
- data/app/models/spree/product_submission.rb +72 -0
- data/app/models/spree/product_type.rb +116 -0
- data/app/models/spree/product_type_category.rb +8 -0
- data/app/models/spree/product_type_custom_field_definition.rb +39 -0
- data/app/models/spree/promotion/actions/create_adjustment.rb +9 -7
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +11 -16
- data/app/models/spree/promotion/actions/create_line_items.rb +19 -8
- data/app/models/spree/promotion/actions/free_shipping.rb +12 -18
- data/app/models/spree/promotion/rules/category.rb +181 -0
- data/app/models/spree/promotion/rules/channel.rb +3 -3
- data/app/models/spree/promotion/rules/country.rb +43 -17
- data/app/models/spree/promotion/rules/currency.rb +2 -2
- data/app/models/spree/promotion/rules/customer_group.rb +13 -5
- data/app/models/spree/promotion/rules/first_order.rb +3 -3
- data/app/models/spree/promotion/rules/item_total.rb +2 -2
- data/app/models/spree/promotion/rules/market.rb +3 -3
- data/app/models/spree/promotion/rules/one_use_per_user.rb +4 -4
- data/app/models/spree/promotion/rules/option_value.rb +34 -11
- data/app/models/spree/promotion/rules/product.rb +3 -5
- data/app/models/spree/promotion/rules/taxon.rb +10 -131
- data/app/models/spree/promotion/rules/user.rb +14 -22
- data/app/models/spree/promotion/rules/user_logged_in.rb +3 -3
- data/app/models/spree/promotion.rb +59 -21
- data/app/models/spree/promotion_action.rb +52 -11
- data/app/models/spree/promotion_action_line_item.rb +1 -1
- data/app/models/spree/promotion_handler/coupon.rb +44 -16
- data/app/models/spree/promotion_handler/free_shipping.rb +1 -1
- data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -1
- data/app/models/spree/promotion_rule.rb +2 -9
- data/app/models/spree/promotion_rule_category.rb +22 -0
- data/app/models/spree/promotion_rule_taxon.rb +7 -6
- data/app/models/spree/promotion_rule_user.rb +2 -2
- data/app/models/spree/prototype.rb +3 -13
- data/app/models/spree/purchase_order.rb +95 -0
- data/app/models/spree/purchase_order_item.rb +40 -0
- data/app/models/spree/quantity_rule.rb +114 -0
- data/app/models/spree/refresh_token.rb +20 -2
- data/app/models/spree/refund.rb +94 -41
- data/app/models/spree/refund_reason.rb +32 -11
- data/app/models/spree/return.rb +150 -0
- data/app/models/spree/return_authorization_reason.rb +11 -6
- data/app/models/spree/return_line_item.rb +42 -0
- data/app/models/spree/return_reason.rb +26 -0
- data/app/models/spree/rich_text_sanitizer.rb +99 -0
- data/app/models/spree/role.rb +179 -4
- data/app/models/spree/role_user.rb +5 -21
- data/app/models/spree/saved_report.rb +56 -0
- data/app/models/spree/search_provider/base.rb +8 -2
- data/app/models/spree/search_provider/database.rb +73 -22
- data/app/models/spree/search_provider.rb +29 -0
- data/app/models/spree/seller.rb +475 -0
- data/app/models/spree/seller_balance.rb +86 -0
- data/app/models/spree/seller_payout.rb +116 -0
- data/app/models/spree/seller_requirement.rb +274 -0
- data/app/models/spree/seller_requirement_custom_field.rb +38 -0
- data/app/models/spree/seller_requirement_status.rb +144 -0
- data/app/models/spree/seller_requirement_submission.rb +91 -0
- data/app/models/spree/seller_requirements/accept_terms.rb +104 -0
- data/app/models/spree/seller_requirements/attestation.rb +22 -0
- data/app/models/spree/seller_requirements/billing_address.rb +13 -0
- data/app/models/spree/seller_requirements/complete_profile.rb +26 -0
- data/app/models/spree/seller_requirements/delivery_method.rb +20 -0
- data/app/models/spree/seller_requirements/document.rb +62 -0
- data/app/models/spree/seller_requirements/minimum_products.rb +20 -0
- data/app/models/spree/seller_requirements/operator_review.rb +23 -0
- data/app/models/spree/seller_requirements/package_type.rb +40 -0
- data/app/models/spree/seller_requirements/payout_account.rb +55 -0
- data/app/models/spree/seller_requirements/policy.rb +43 -0
- data/app/models/spree/seller_requirements/required_custom_fields.rb +56 -0
- data/app/models/spree/seller_requirements/returns_address.rb +19 -0
- data/app/models/spree/seller_transfer.rb +166 -0
- data/app/models/spree/setup_tasks.rb +3 -6
- data/app/models/spree/shipment.rb +3 -560
- data/app/models/spree/shipping_calculator.rb +7 -0
- data/app/models/spree/shipping_document.rb +32 -0
- data/app/models/spree/shipping_label.rb +146 -0
- data/app/models/spree/shipping_method.rb +3 -146
- data/app/models/spree/shipping_rate.rb +3 -97
- data/app/models/spree/state.rb +57 -23
- data/app/models/spree/stock/availability_validator.rb +1 -1
- data/app/models/spree/stock/content_item.rb +1 -0
- data/app/models/spree/stock/coordinator.rb +69 -9
- data/app/models/spree/stock/estimator.rb +198 -33
- data/app/models/spree/stock/inventory_unit_builder.rb +6 -1
- data/app/models/spree/stock/package.rb +145 -14
- data/app/models/spree/stock/packer.rb +20 -3
- data/app/models/spree/stock/prioritizer.rb +27 -4
- data/app/models/spree/stock/quantifier.rb +63 -38
- data/app/models/spree/stock/splitter/base.rb +3 -1
- data/app/models/spree/stock/splitter/delivery_profile.rb +41 -0
- data/app/models/spree/stock_item.rb +3 -147
- data/app/models/spree/stock_level/custom_events.rb +48 -0
- data/app/models/spree/stock_level.rb +305 -0
- data/app/models/spree/stock_location.rb +165 -87
- data/app/models/spree/stock_movement/custom_events.rb +1 -1
- data/app/models/spree/stock_movement.rb +166 -22
- data/app/models/spree/stock_receipt.rb +56 -0
- data/app/models/spree/stock_receipt_item.rb +35 -0
- data/app/models/spree/stock_reservation.rb +114 -11
- data/app/models/spree/stock_transfer.rb +84 -59
- data/app/models/spree/stock_transfer_item.rb +25 -0
- data/app/models/spree/store.rb +427 -107
- data/app/models/spree/store_credit.rb +88 -21
- data/app/models/spree/store_credit_category.rb +21 -28
- data/app/models/spree/store_credit_event.rb +1 -1
- data/app/models/spree/store_credit_type.rb +10 -2
- data/app/models/spree/store_payment_method.rb +0 -1
- data/app/models/spree/store_product.rb +2 -2
- data/app/models/spree/store_promotion.rb +0 -1
- data/app/models/spree/storefront/access_denied.rb +22 -0
- data/app/models/spree/storefront/access_policy.rb +180 -0
- data/app/models/spree/subscriber.rb +6 -6
- data/app/models/spree/supplier.rb +76 -0
- data/app/models/spree/tax_category.rb +15 -5
- data/app/models/spree/tax_exemption/item_override.rb +22 -0
- data/app/models/spree/tax_exemption.rb +81 -0
- data/app/models/spree/tax_exemption_certificate.rb +95 -0
- data/app/models/spree/tax_identifier.rb +209 -0
- data/app/models/spree/tax_identifiers/validation_result.rb +41 -0
- data/app/models/spree/tax_identifiers/validator/base.rb +53 -0
- data/app/models/spree/tax_identifiers/validator/eu_vat.rb +76 -0
- data/app/models/spree/tax_line.rb +79 -0
- data/app/models/spree/tax_provider/base.rb +150 -0
- data/app/models/spree/tax_provider/internal.rb +227 -0
- data/app/models/spree/tax_rate.rb +63 -100
- data/app/models/spree/taxon.rb +13 -514
- data/app/models/spree/taxon_rule.rb +8 -9
- data/app/models/spree/taxonomy.rb +8 -42
- data/app/models/spree/user_identity.rb +2 -2
- data/app/models/spree/variant.rb +629 -150
- data/app/models/spree/variant_media.rb +6 -7
- data/app/models/spree/webhook_endpoint.rb +2 -1
- data/app/models/spree/wished_item.rb +3 -31
- data/app/models/spree/wishlist.rb +17 -10
- data/app/models/spree/wishlist_item/custom_events.rb +42 -0
- data/app/models/spree/wishlist_item.rb +37 -0
- data/app/models/spree/zone.rb +24 -182
- data/app/models/spree/zone_member.rb +5 -8
- data/app/presenters/spree/csv/custom_fields_helper.rb +25 -0
- data/app/presenters/spree/csv/customer_presenter.rb +7 -6
- data/app/presenters/spree/csv/gift_card_presenter.rb +9 -8
- data/app/presenters/spree/csv/newsletter_subscriber_presenter.rb +7 -6
- data/app/presenters/spree/csv/order_line_item_presenter.rb +53 -21
- data/app/presenters/spree/csv/price_list_price_presenter.rb +41 -0
- data/app/presenters/spree/csv/product_variant_presenter.rb +22 -21
- data/app/presenters/spree/csv/purchase_order_item_presenter.rb +50 -0
- data/app/presenters/spree/data_feeds/google_presenter.rb +24 -10
- data/app/presenters/spree/filters/options_presenter.rb +2 -2
- data/app/services/spree/addresses/create.rb +70 -27
- data/app/services/spree/addresses/helper.rb +17 -54
- data/app/services/spree/addresses/update.rb +53 -31
- data/app/services/spree/carts/associate.rb +46 -0
- data/app/services/spree/carts/check_availability.rb +72 -0
- data/app/services/spree/carts/create.rb +7 -1
- data/app/services/spree/carts/destroy.rb +71 -0
- data/app/services/spree/carts/empty.rb +42 -0
- data/app/services/spree/carts/partition_by_seller.rb +71 -0
- data/app/services/spree/carts/price_items.rb +119 -0
- data/app/services/spree/carts/remove_item.rb +42 -0
- data/app/services/spree/carts/remove_line_item.rb +42 -0
- data/app/services/spree/carts/remove_out_of_stock_items.rb +104 -0
- data/app/services/spree/carts/set_quantity.rb +39 -0
- data/app/services/spree/carts/split_by_seller.rb +475 -0
- data/app/services/spree/carts/update.rb +157 -51
- data/app/services/spree/catalogs/resolve_prices.rb +192 -0
- data/app/services/spree/catalogs/resolve_quantity_rules.rb +115 -0
- data/app/services/spree/catalogs/set_assignments.rb +59 -0
- data/app/services/spree/catalogs/set_order_minimums.rb +44 -0
- data/app/services/spree/catalogs/set_product_terms.rb +83 -0
- data/app/services/spree/categories/add_products.rb +51 -0
- data/app/services/spree/categories/remove_products.rb +72 -0
- data/app/services/spree/checkout/add_store_credit.rb +11 -79
- data/app/services/spree/checkout/advance.rb +38 -38
- data/app/services/spree/checkout/remove_store_credit.rb +7 -12
- data/app/services/spree/collections/add_products.rb +42 -0
- data/app/services/spree/collections/regenerate_products.rb +67 -0
- data/app/services/spree/collections/remove_products.rb +65 -0
- data/app/services/spree/commissions/calculate_line.rb +132 -0
- data/app/services/spree/commissions/commission_order.rb +185 -0
- data/app/services/spree/commissions/resolve_rate.rb +114 -0
- data/app/services/spree/commissions/resolve_tax_rate.rb +78 -0
- data/app/services/spree/companies/add_member.rb +38 -0
- data/app/services/spree/company_invitations/accept.rb +60 -0
- data/app/services/spree/coupon_codes/coupon_codes_handler.rb +14 -2
- data/app/services/spree/customers/data_export.rb +372 -0
- data/app/services/spree/data_requests/create.rb +77 -0
- data/app/services/spree/deliveries/create.rb +56 -0
- data/app/services/spree/deliveries/destroy.rb +39 -0
- data/app/services/spree/deliveries/upsert_primary.rb +43 -0
- data/app/services/spree/fulfillments/recalculate_delivery.rb +62 -0
- data/app/services/spree/fulfillments/stand_down_provider.rb +47 -0
- data/app/services/spree/imports/row_processors/customer.rb +8 -8
- data/app/services/spree/imports/row_processors/price_list_price.rb +164 -0
- data/app/services/spree/imports/row_processors/product_variant.rb +193 -57
- data/app/services/spree/imports/row_processors/purchase_order.rb +157 -0
- data/app/services/spree/media/destroy.rb +88 -0
- data/app/services/spree/media/usage.rb +175 -0
- data/app/services/spree/newsletter/link_user.rb +4 -3
- data/app/services/spree/newsletter/subscribe.rb +3 -3
- data/app/services/spree/newsletter/verify.rb +6 -2
- data/app/services/spree/order_groups/allocate_payments.rb +101 -0
- data/app/services/spree/orders/approve.rb +9 -23
- data/app/services/spree/orders/build_fulfillments.rb +29 -0
- data/app/services/spree/orders/create.rb +38 -17
- data/app/services/spree/orders/create_from_cart.rb +88 -0
- data/app/services/spree/orders/create_user_account.rb +14 -67
- data/app/services/spree/orders/discounts/create.rb +84 -0
- data/app/services/spree/orders/discounts/destroy.rb +25 -0
- data/app/services/spree/orders/discounts/update.rb +29 -0
- data/app/services/spree/orders/fees/create.rb +28 -0
- data/app/services/spree/orders/fees/destroy.rb +22 -0
- data/app/services/spree/orders/fees/update.rb +25 -0
- data/app/services/spree/orders/remove_item.rb +13 -0
- data/app/services/spree/orders/remove_line_item.rb +13 -0
- data/app/services/spree/orders/update.rb +56 -11
- data/app/services/spree/orders/update_item.rb +105 -0
- data/app/services/spree/orders/update_statuses.rb +109 -0
- data/app/services/spree/payments/create.rb +31 -5
- data/app/services/spree/prices/bulk_upsert.rb +156 -30
- data/app/services/spree/product_submissions/close.rb +46 -0
- data/app/services/spree/product_types/apply_to_products.rb +167 -0
- data/app/services/spree/products/auto_match_collections.rb +75 -0
- data/app/services/spree/products/auto_match_taxons.rb +7 -54
- data/app/services/spree/products/duplicator.rb +16 -22
- data/app/services/spree/products/for_context.rb +54 -0
- data/app/services/spree/products/select_buy_box.rb +98 -0
- data/app/services/spree/purchases/amount_due_at_checkout.rb +33 -0
- data/app/services/spree/returns/eligibility_validator.rb +53 -0
- data/app/services/spree/sample_data/helper.rb +3 -3
- data/app/services/spree/sample_data/import_builder.rb +8 -4
- data/app/services/spree/sample_data/import_runner.rb +7 -4
- data/app/services/spree/sample_data/loader.rb +15 -6
- data/app/services/spree/search_provider/custom_field_schema.rb +153 -0
- data/app/services/spree/seeds/admin_user.rb +72 -12
- data/app/services/spree/seeds/all.rb +24 -13
- data/app/services/spree/seeds/commission_rates.rb +53 -0
- data/app/services/spree/seeds/digital_delivery.rb +18 -8
- data/app/services/spree/seeds/product_types.rb +23 -0
- data/app/services/spree/seeds/returns_environment.rb +44 -16
- data/app/services/spree/seeds/roles.rb +6 -1
- data/app/services/spree/seeds/saved_reports.rb +107 -0
- data/app/services/spree/seeds/seller_requirements.rb +19 -0
- data/app/services/spree/seeds/stores.rb +1 -1
- data/app/services/spree/seeds/tax_categories.rb +9 -2
- data/app/services/spree/sellers/requirements.rb +129 -0
- data/app/services/spree/shipments/update.rb +4 -33
- data/app/services/spree/shipping_labels/confirm_refund.rb +47 -0
- data/app/services/spree/shipping_labels/store_file.rb +68 -0
- data/app/services/spree/stock_levels/bulk_upsert.rb +67 -0
- data/app/services/spree/stock_levels/correct.rb +69 -0
- data/app/services/spree/stock_levels/recount.rb +103 -0
- data/app/services/spree/stock_locations/stock_items/create.rb +8 -13
- data/app/services/spree/stock_locations/stock_levels/create.rb +25 -0
- data/app/services/spree/stock_reservations/extend.rb +9 -5
- data/app/services/spree/stock_reservations/release.rb +4 -3
- data/app/services/spree/stock_reservations/reserve.rb +43 -32
- data/app/services/spree/store_credits/apply.rb +93 -0
- data/app/services/spree/store_credits/remove.rb +17 -0
- data/app/services/spree/stores/provision_defaults.rb +269 -0
- data/app/services/spree/tax/resolve_exemptions.rb +44 -0
- data/app/services/spree/tax/unusable_exemption_error.rb +8 -0
- data/app/services/spree/tax_identifiers/validate.rb +77 -0
- data/app/services/spree/taxons/add_products.rb +6 -39
- data/app/services/spree/taxons/regenerate_products.rb +8 -53
- data/app/services/spree/taxons/remove_products.rb +6 -60
- data/app/services/spree/variants/remove_line_items.rb +6 -1
- data/app/subscribers/spree/event_log_subscriber.rb +1 -1
- data/app/subscribers/spree/order_commission_subscriber.rb +23 -0
- data/app/subscribers/spree/order_placed_subscriber.rb +58 -0
- data/app/subscribers/spree/order_status_subscriber.rb +82 -0
- data/app/subscribers/spree/payment_split_subscriber.rb +71 -0
- data/app/subscribers/spree/product_metrics_subscriber.rb +2 -2
- data/app/subscribers/spree/seller_onboarding_subscriber.rb +32 -0
- data/app/subscribers/spree/seller_transfer_reversal_subscriber.rb +26 -0
- data/app/subscribers/spree/seller_transfer_subscriber.rb +26 -0
- data/app/subscribers/spree/seller_user_email_subscriber.rb +27 -0
- data/app/subscribers/spree/tax_identifier_validation_subscriber.rb +26 -0
- data/app/validators/spree/addresses/phone_validator.rb +2 -2
- data/app/validators/spree/attachment_content_type_validator.rb +183 -0
- data/app/validators/spree/password_length_validator.rb +23 -0
- data/app/views/spree/seller_user_mailer/password_reset_email.html.erb +8 -0
- data/app/views/spree/shared/_purchased_items_styles.html.erb +7 -0
- data/app/workflows/spree/carts/add_item.rb +234 -0
- data/app/workflows/spree/carts/complete.rb +516 -0
- data/app/workflows/spree/carts/merge.rb +90 -0
- data/app/workflows/spree/carts/recalculate.rb +54 -0
- data/app/workflows/spree/carts/recalculate_totals.rb +233 -0
- data/app/workflows/spree/carts/upsert_items.rb +368 -0
- data/app/workflows/spree/catalogs/activate.rb +51 -0
- data/app/workflows/spree/catalogs/create.rb +83 -0
- data/app/workflows/spree/catalogs/deactivate.rb +35 -0
- data/app/workflows/spree/catalogs/set_price_list.rb +130 -0
- data/app/workflows/spree/catalogs/update.rb +85 -0
- data/app/workflows/spree/claims/approve.rb +38 -0
- data/app/workflows/spree/claims/cancel.rb +37 -0
- data/app/workflows/spree/claims/create.rb +82 -0
- data/app/workflows/spree/claims/deny.rb +35 -0
- data/app/workflows/spree/claims/resolve.rb +166 -0
- data/app/workflows/spree/customers/anonymize.rb +502 -0
- data/app/workflows/spree/customers/create.rb +247 -0
- data/app/workflows/spree/data_requests/fulfill.rb +165 -0
- data/app/workflows/spree/deliveries/update_tracking.rb +96 -0
- data/app/workflows/spree/exchanges/approve.rb +38 -0
- data/app/workflows/spree/exchanges/cancel.rb +40 -0
- data/app/workflows/spree/exchanges/create.rb +90 -0
- data/app/workflows/spree/exchanges/fulfill.rb +146 -0
- data/app/workflows/spree/exchanges/receive.rb +86 -0
- data/app/workflows/spree/fulfillments/cancel.rb +87 -0
- data/app/workflows/spree/fulfillments/create.rb +346 -0
- data/app/workflows/spree/fulfillments/fulfill.rb +354 -0
- data/app/workflows/spree/fulfillments/mark_delivered.rb +67 -0
- data/app/workflows/spree/fulfillments/purchase_label.rb +40 -0
- data/app/workflows/spree/fulfillments/update.rb +123 -0
- data/app/workflows/spree/gift_cards/apply.rb +235 -0
- data/app/workflows/spree/gift_cards/cancel.rb +43 -0
- data/app/workflows/spree/gift_cards/redeem.rb +59 -0
- data/app/workflows/spree/gift_cards/remove.rb +78 -0
- data/app/workflows/spree/imports/complete.rb +45 -0
- data/app/workflows/spree/imports/complete_mapping.rb +50 -0
- data/app/workflows/spree/imports/retry_failed_rows.rb +46 -0
- data/app/workflows/spree/imports/start_mapping.rb +48 -0
- data/app/workflows/spree/imports/start_processing.rb +36 -0
- data/app/workflows/spree/invitations/accept.rb +50 -0
- data/app/workflows/spree/orders/add_item.rb +12 -0
- data/app/workflows/spree/orders/cancel.rb +260 -0
- data/app/workflows/spree/orders/complete.rb +169 -0
- data/app/workflows/spree/orders/recalculate.rb +11 -0
- data/app/workflows/spree/orders/recalculate_totals.rb +12 -0
- data/app/workflows/spree/orders/upsert_items.rb +28 -0
- data/app/workflows/spree/payment_sessions/complete.rb +44 -0
- data/app/workflows/spree/payments/capture.rb +109 -0
- data/app/workflows/spree/payments/handle_webhook.rb +100 -0
- data/app/workflows/spree/payments/process.rb +73 -0
- data/app/workflows/spree/payments/void.rb +72 -0
- data/app/workflows/spree/price_lists/activate.rb +49 -0
- data/app/workflows/spree/price_lists/create.rb +57 -0
- data/app/workflows/spree/price_lists/deactivate.rb +30 -0
- data/app/workflows/spree/price_lists/update.rb +117 -0
- data/app/workflows/spree/products/activate.rb +33 -0
- data/app/workflows/spree/products/approve.rb +52 -0
- data/app/workflows/spree/products/archive.rb +44 -0
- data/app/workflows/spree/products/create.rb +82 -0
- data/app/workflows/spree/products/destroy.rb +35 -0
- data/app/workflows/spree/products/draft.rb +49 -0
- data/app/workflows/spree/products/nested_attributes.rb +242 -0
- data/app/workflows/spree/products/propose.rb +62 -0
- data/app/workflows/spree/products/reject.rb +54 -0
- data/app/workflows/spree/products/update.rb +83 -0
- data/app/workflows/spree/purchase_orders/cancel.rb +57 -0
- data/app/workflows/spree/purchase_orders/close.rb +57 -0
- data/app/workflows/spree/purchase_orders/create.rb +68 -0
- data/app/workflows/spree/purchase_orders/mark_draft.rb +49 -0
- data/app/workflows/spree/purchase_orders/mark_ordered.rb +50 -0
- data/app/workflows/spree/purchase_orders/receive.rb +65 -0
- data/app/workflows/spree/purchase_orders/update.rb +56 -0
- data/app/workflows/spree/receivables/incoming_counter.rb +50 -0
- data/app/workflows/spree/refunds/create.rb +136 -0
- data/app/workflows/spree/refunds/order_payments.rb +129 -0
- data/app/workflows/spree/returns/approve.rb +47 -0
- data/app/workflows/spree/returns/cancel.rb +52 -0
- data/app/workflows/spree/returns/create.rb +135 -0
- data/app/workflows/spree/returns/purchase_label.rb +32 -0
- data/app/workflows/spree/returns/receive.rb +94 -0
- data/app/workflows/spree/returns/refund.rb +134 -0
- data/app/workflows/spree/seller_payouts/complete.rb +80 -0
- data/app/workflows/spree/seller_payouts/sweep.rb +192 -0
- data/app/workflows/spree/seller_requirement_submissions/accept.rb +40 -0
- data/app/workflows/spree/seller_requirement_submissions/create.rb +104 -0
- data/app/workflows/spree/seller_requirement_submissions/reject.rb +45 -0
- data/app/workflows/spree/seller_requirement_submissions/reviewable.rb +19 -0
- data/app/workflows/spree/seller_requirement_submissions/waive.rb +64 -0
- data/app/workflows/spree/seller_transfers/create.rb +131 -0
- data/app/workflows/spree/seller_transfers/reverse.rb +241 -0
- data/app/workflows/spree/sellers/approve.rb +88 -0
- data/app/workflows/spree/sellers/create.rb +72 -0
- data/app/workflows/spree/sellers/invite.rb +61 -0
- data/app/workflows/spree/sellers/reject.rb +52 -0
- data/app/workflows/spree/sellers/reopen_onboarding.rb +55 -0
- data/app/workflows/spree/sellers/start_onboarding.rb +46 -0
- data/app/workflows/spree/sellers/submit_for_review.rb +76 -0
- data/app/workflows/spree/sellers/suspend.rb +55 -0
- data/app/workflows/spree/shipping_labels/purchase.rb +154 -0
- data/app/workflows/spree/shipping_labels/record.rb +102 -0
- data/app/workflows/spree/shipping_labels/refund.rb +77 -0
- data/app/workflows/spree/stock_receipts/recording.rb +165 -0
- data/app/workflows/spree/stock_transfers/cancel.rb +103 -0
- data/app/workflows/spree/stock_transfers/close.rb +56 -0
- data/app/workflows/spree/stock_transfers/create.rb +63 -0
- data/app/workflows/spree/stock_transfers/mark_draft.rb +41 -0
- data/app/workflows/spree/stock_transfers/mark_in_transit.rb +91 -0
- data/app/workflows/spree/stock_transfers/mark_ready.rb +36 -0
- data/app/workflows/spree/stock_transfers/receive.rb +62 -0
- data/app/workflows/spree/stock_transfers/update.rb +55 -0
- data/app/workflows/spree/tax_exemption_certificates/verify.rb +48 -0
- data/app/workflows/spree/variants/create.rb +66 -0
- data/app/workflows/spree/variants/nested_attributes.rb +90 -0
- data/app/workflows/spree/variants/update.rb +55 -0
- data/config/brakeman.ignore +79 -79
- data/config/i18n-tasks.yml +4 -3
- data/config/initializers/mobility.rb +0 -4
- data/config/initializers/spree_store_setup_tasks.rb +4 -0
- data/config/locales/en.yml +951 -189
- data/config/routes.rb +11 -4
- data/db/migrate/20220201103922_add_first_name_and_last_name_to_spree_users.rb +7 -5
- data/db/migrate/20221215151408_add_selected_locale_to_spree_users.rb +6 -4
- data/db/migrate/20250127151258_add_phone_to_spree_users.rb +3 -1
- data/db/migrate/20250207084000_add_accepts_email_marketing_field_to_spree_users_table.rb +4 -2
- data/db/migrate/20250410061306_create_spree_invitations.rb +1 -1
- data/db/migrate/20250605131334_add_missing_fields_to_users.rb +24 -20
- data/db/migrate/20260315100000_add_product_media_support.rb +4 -1
- data/db/migrate/20260613000001_add_store_id_to_spree_role_users.rb +6 -3
- data/db/migrate/20260630000001_add_default_variant_id_to_spree_products.rb +9 -0
- data/db/migrate/20260708160054_create_spree_collections.rb +69 -0
- data/db/migrate/20260710000001_rename_taxons_to_categories.rb +28 -0
- data/db/migrate/20260727000001_add_unique_country_abbr_index_to_spree_states.rb +27 -4
- data/db/migrate/20260728000000_create_spree_customers_and_admin_users.rb +59 -0
- data/db/migrate/20260728000001_rename_prototypes_to_product_types.rb +59 -0
- data/db/migrate/20260728000002_create_spree_delivery_zones.rb +29 -0
- data/db/migrate/20260728000003_create_spree_carts.rb +58 -0
- data/db/migrate/20260728000003_rename_user_id_to_customer_id.rb +30 -0
- data/db/migrate/20260728000004_rename_shipping_to_fulfillment_and_delivery.rb +83 -0
- data/db/migrate/20260728000005_add_fulfillment_type_columns.rb +33 -0
- data/db/migrate/20260729000001_create_typed_adjustment_tables.rb +87 -0
- data/db/migrate/20260729100001_add_checkout_columns_to_spree_carts.rb +15 -0
- data/db/migrate/20260729100002_relax_owner_null_constraints.rb +7 -0
- data/db/migrate/20260729120001_rename_order_totals_to_standard_names.rb +7 -0
- data/db/migrate/20260729130001_create_spree_delivery_method_rules.rb +19 -0
- data/db/migrate/20260729140001_add_coupon_code_to_spree_orders.rb +6 -0
- data/db/migrate/20260729150001_add_store_to_delivery_methods_and_stock_locations.rb +6 -0
- data/db/migrate/20260802190001_create_spree_returns.rb +49 -0
- data/db/migrate/20260802210001_create_spree_exchanges_and_claims.rb +80 -0
- data/db/migrate/20260805100001_rename_return_authorization_reasons_to_return_reasons.rb +109 -0
- data/db/migrate/20260806000001_add_store_id_to_spree_tax_rates_and_categories.rb +16 -0
- data/db/migrate/20260806000001_create_spree_delivery_method_rule_products.rb +22 -0
- data/db/migrate/20260806000002_add_treatment_columns_to_spree_tax_lines.rb +19 -0
- data/db/migrate/20260806000003_create_spree_tax_identifiers.rb +41 -0
- data/db/migrate/20260806000004_add_tax_provider_to_spree_markets.rb +9 -0
- data/db/migrate/20260806000005_add_country_and_state_to_spree_tax_rates.rb +20 -0
- data/db/migrate/20260806100001_create_spree_product_type_custom_field_definitions.rb +17 -0
- data/db/migrate/20260806120001_add_rate_provider_to_delivery_methods.rb +7 -0
- data/db/migrate/20260806120002_add_carrier_columns_to_delivery_rates.rb +13 -0
- data/db/migrate/20260806130001_add_unique_store_type_index_to_spree_integrations.rb +9 -0
- data/db/migrate/20260807000001_add_permissions_to_spree_roles.rb +14 -0
- data/db/migrate/20260807000001_create_spree_companies.rb +66 -0
- data/db/migrate/20260807000003_create_spree_tax_exemption_certificates.rb +31 -0
- data/db/migrate/20260807120001_remove_claim_type_from_spree_claims.rb +5 -0
- data/db/migrate/20260807130001_add_country_state_codes_to_consumers.rb +28 -0
- data/db/migrate/20260807150001_reindex_spree_categories_by_store.rb +42 -0
- data/db/migrate/20260809000001_rename_metafields_to_custom_fields.rb +126 -0
- data/db/migrate/20260809100001_support_multi_rate_delivery_methods.rb +35 -0
- data/db/migrate/20260809120001_consolidate_metadata_columns.rb +120 -0
- data/db/migrate/20260809150001_promote_shipping_categories_to_delivery_profiles.rb +153 -0
- data/db/migrate/20260809170001_create_spree_channel_stock_locations.rb +17 -0
- data/db/migrate/20260809200001_add_rich_text_columns_for_action_text_removal.rb +11 -0
- data/db/migrate/20260810000001_rename_digitals_to_digital_assets.rb +38 -0
- data/db/migrate/20260811000001_add_delivery_tracking_to_fulfillments.rb +17 -0
- data/db/migrate/20260812000001_add_provider_type_to_spree_digital_assets.rb +7 -0
- data/db/migrate/20260812000002_add_metadata_to_spree_digital_assets.rb +11 -0
- data/db/migrate/20260813000001_create_spree_number_sequences.rb +13 -0
- data/db/migrate/20260813120001_add_setup_token_to_spree_stores.rb +11 -0
- data/db/migrate/20260813130001_add_capture_method_to_payment_methods.rb +17 -0
- data/db/migrate/20260813130001_add_unique_indexes_to_spree_data_feeds.rb +10 -0
- data/db/migrate/20260814000001_add_customs_fields_to_spree_variants.rb +7 -0
- data/db/migrate/20260814000001_rename_stock_items_to_stock_levels.rb +72 -0
- data/db/migrate/20260814000002_add_typed_stock_movements.rb +25 -0
- data/db/migrate/20260815000001_add_audience_to_spree_refresh_tokens.rb +14 -0
- data/db/migrate/20260815000002_add_resource_to_spree_roles.rb +190 -0
- data/db/migrate/20260816000001_create_spree_sellers.rb +59 -0
- data/db/migrate/20260816000002_add_seller_to_spree_products.rb +10 -0
- data/db/migrate/20260816210001_create_spree_commission_rates.rb +229 -0
- data/db/migrate/20260816210002_create_spree_commission_lines.rb +72 -0
- data/db/migrate/20260817000001_add_seller_to_spree_line_items.rb +15 -0
- data/db/migrate/20260817000002_add_seller_and_delivery_profile_to_spree_variants.rb +17 -0
- data/db/migrate/20260818000001_create_spree_external_references.rb +33 -0
- data/db/migrate/20260818000001_create_spree_seller_requirements.rb +60 -0
- data/db/migrate/20260818000001_rename_spree_payments_state_to_status.rb +5 -0
- data/db/migrate/20260818000002_add_price_source_to_spree_line_items.rb +9 -0
- data/db/migrate/20260818090001_rename_assets_to_media.rb +10 -0
- data/db/migrate/20260819000001_create_spree_seller_requirement_custom_fields.rb +15 -0
- data/db/migrate/20260819000001_replace_payment_method_display_on_with_storefront_visible.rb +25 -0
- data/db/migrate/20260819000002_rename_spree_gift_cards_state_to_status.rb +5 -0
- data/db/migrate/20260820000001_add_seller_business_identity_and_stock_locations.rb +17 -0
- data/db/migrate/20260820000001_create_spree_order_groups.rb +33 -0
- data/db/migrate/20260820000002_add_order_group_to_spree_orders_and_payments.rb +14 -0
- data/db/migrate/20260820000003_create_spree_payment_splits.rb +21 -0
- data/db/migrate/20260820000004_add_order_to_spree_refunds.rb +32 -0
- data/db/migrate/20260821000001_add_claimed_amount_to_spree_payment_splits.rb +14 -0
- data/db/migrate/20260822000001_create_spree_seller_transfers.rb +94 -0
- data/db/migrate/20260822000002_create_spree_seller_payouts.rb +48 -0
- data/db/migrate/20260822000003_add_payout_account_to_spree_sellers.rb +11 -0
- data/db/migrate/20260824000001_add_store_to_spree_media.rb +16 -0
- data/db/migrate/20260825000001_create_spree_catalogs.rb +40 -0
- data/db/migrate/20260826000001_add_owner_to_spree_addresses.rb +30 -0
- data/db/migrate/20260826000002_create_spree_product_submissions.rb +28 -0
- data/db/migrate/20260827000001_add_seller_to_spree_exports.rb +5 -0
- data/db/migrate/20260828100001_unify_import_and_export_tenancy.rb +79 -0
- data/db/migrate/20260830000001_add_catalog_to_spree_price_lists.rb +47 -0
- data/db/migrate/20260830000002_add_po_number_to_purchases.rb +16 -0
- data/db/migrate/20260830000002_add_price_adjustment_to_spree_price_lists.rb +14 -0
- data/db/migrate/20260831000001_add_description_to_spree_catalogs.rb +7 -0
- data/db/migrate/20260831000002_add_quantity_rules_to_spree_variants.rb +18 -0
- data/db/migrate/20260831000003_create_spree_catalog_terms.rb +35 -0
- data/db/migrate/20260831100001_create_spree_package_types.rb +38 -0
- data/db/migrate/20260831100002_add_carton_details_to_spree_variants.rb +10 -0
- data/db/migrate/20260831100003_add_unpriced_to_spree_delivery_rates.rb +8 -0
- data/db/migrate/20260901000001_add_seller_to_spree_delivery_methods.rb +11 -0
- data/db/migrate/20260902000001_add_store_and_filter_key_to_custom_field_definitions.rb +143 -0
- data/db/migrate/20260902000002_add_eu_legal_compliance.rb +68 -0
- data/db/migrate/20260902000002_replace_order_cancellation_tables_with_cancel_columns.rb +88 -0
- data/db/migrate/20260902100001_rename_wished_items_to_wishlist_items.rb +8 -0
- data/db/migrate/20260902100002_rename_promo_total_to_discount_total.rb +9 -0
- data/db/migrate/20260902100003_rename_address_name_and_postal_code_columns.rb +24 -0
- data/db/migrate/20260902100004_rename_option_presentation_to_label.rb +13 -0
- data/db/migrate/20260903000001_create_spree_shipping_labels_and_deliveries.rb +73 -0
- data/db/migrate/20260903120000_create_spree_saved_reports.rb +57 -0
- data/db/migrate/20260904000001_add_returns_enabled_to_stock_locations.rb +14 -0
- data/db/migrate/20260906000001_add_commission_total_to_orders.rb +22 -0
- data/db/migrate/20260907000001_add_inventory_operations.rb +113 -0
- data/db/migrate/20260907000001_add_min_quantity_to_spree_prices.rb +28 -0
- data/db/migrate/20260907000002_create_spree_price_adjustment_tiers.rb +19 -0
- data/db/migrate/20260908000001_add_seller_to_spree_package_types.rb +78 -0
- data/db/migrate/20260910000001_add_stock_receipts.rb +44 -0
- data/db/migrate/20260910000002_add_counters_to_spree_stock_levels.rb +6 -0
- data/db/migrate/20260910120000_index_reporting_time_columns.rb +12 -0
- data/db/migrate/20260912120000_index_reporting_lifetime_and_promotion_columns.rb +19 -0
- data/db/migrate/20260914000001_add_settlement_to_spree_seller_transfers.rb +18 -0
- data/db/migrate/20260914230000_add_store_to_spree_option_types.rb +46 -0
- data/db/sample_data/collections.rb +58 -0
- data/db/sample_data/custom_field_definitions.rb +9 -0
- data/db/sample_data/digital_products.rb +26 -0
- data/db/sample_data/fulfillment.rb +88 -0
- data/db/sample_data/options.rb +25 -1
- data/db/sample_data/orders.rb +53 -30
- data/db/sample_data/payment_methods.rb +2 -2
- data/db/sample_data/price_list_prices.csv +25 -0
- data/db/sample_data/product_type_categories.rb +27 -0
- data/db/sample_data/product_types.rb +83 -0
- data/db/sample_data/products.csv +39 -38
- data/db/sample_data/wholesale.rb +42 -3
- data/lib/generators/spree/api_resource/api_resource_generator.rb +1 -1
- data/lib/generators/spree/authentication/dummy/templates/create_spree_admin_users.rb.tt +1 -0
- data/lib/generators/spree/controller_decorator/controller_decorator_generator.rb +4 -4
- data/lib/generators/spree/dummy/dummy_generator.rb +5 -12
- data/lib/generators/spree/dummy/templates/rails/test.rb +5 -0
- data/lib/generators/spree/model/model_generator.rb +6 -6
- data/lib/generators/spree/model/templates/model.rb.tt +7 -3
- data/lib/spree/category_permalink_deduplicator.rb +328 -0
- data/lib/spree/core/configuration.rb +96 -47
- data/lib/spree/core/controller_helpers/store.rb +8 -9
- data/lib/spree/core/dependencies.rb +324 -71
- data/lib/spree/core/dependencies_helper.rb +4 -0
- data/lib/spree/core/engine.rb +333 -75
- data/lib/spree/core/number_generator.rb +37 -33
- data/lib/spree/core/permission_configuration.rb +183 -91
- data/lib/spree/core/permissions/default_catalog.rb +236 -0
- data/lib/spree/core/permissions/entry.rb +15 -0
- data/lib/spree/core/permissions/scope.rb +76 -0
- data/lib/spree/core/preferences/masking.rb +24 -2
- data/lib/spree/core/preferences/preferable.rb +52 -2
- data/lib/spree/core/preferences/preferable_class_methods.rb +41 -2
- data/lib/spree/core/preferences/runtime_configuration.rb +68 -9
- data/lib/spree/core/previews/admin_user_preview.rb +0 -8
- data/lib/spree/core/previews/invitation_preview.rb +1 -1
- data/lib/spree/core/previews/preview_data.rb +2 -2
- data/lib/spree/core/previews/seller_user_preview.rb +14 -0
- data/lib/spree/core/pricing/context.rb +28 -8
- data/lib/spree/core/pricing/price_resolution.rb +150 -0
- data/lib/spree/core/pricing/resolver.rb +17 -107
- data/lib/spree/core/ransack_configuration.rb +3 -3
- data/lib/spree/core/routes.rb +4 -6
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +422 -62
- data/lib/spree/events/adapters/base.rb +42 -15
- data/lib/spree/hooks.rb +146 -0
- data/lib/spree/iso_data.rb +188 -0
- data/lib/spree/measurement.rb +113 -0
- data/lib/spree/money.rb +70 -0
- data/lib/spree/number_generators/registry.rb +80 -0
- data/lib/spree/reporting/adapters/base.rb +71 -0
- data/lib/spree/reporting/adapters/live.rb +677 -0
- data/lib/spree/reporting/counter_result.rb +19 -0
- data/lib/spree/reporting/counters.rb +33 -0
- data/lib/spree/reporting/default_vocabulary.rb +705 -0
- data/lib/spree/reporting/hydration.rb +64 -0
- data/lib/spree/reporting/query.rb +487 -0
- data/lib/spree/reporting/registry.rb +294 -0
- data/lib/spree/reporting/result.rb +10 -0
- data/lib/spree/reporting/schema.rb +124 -0
- data/lib/spree/reporting.rb +49 -0
- data/lib/spree/service_module.rb +6 -0
- data/lib/spree/store_scope_guard.rb +180 -0
- data/lib/spree/testing_support/action_text.rb +33 -0
- data/lib/spree/testing_support/common_rake.rb +4 -66
- data/lib/spree/testing_support/country_pool.rb +50 -0
- data/lib/spree/testing_support/extension_rake.rb +2 -6
- data/lib/spree/testing_support/factories/address_factory.rb +45 -15
- data/lib/spree/testing_support/factories/api_key_factory.rb +1 -1
- data/lib/spree/testing_support/factories/calculator_factory.rb +0 -3
- data/lib/spree/testing_support/factories/cart_factory.rb +60 -0
- data/lib/spree/testing_support/factories/catalog_factory.rb +37 -0
- data/lib/spree/testing_support/factories/category_factory.rb +21 -0
- data/lib/spree/testing_support/factories/claim_factory.rb +33 -0
- data/lib/spree/testing_support/factories/classification_factory.rb +3 -2
- data/lib/spree/testing_support/factories/collection_factory.rb +25 -0
- data/lib/spree/testing_support/factories/collection_rule_factory.rb +47 -0
- data/lib/spree/testing_support/factories/commission_rate_factory.rb +75 -0
- data/lib/spree/testing_support/factories/company_factory.rb +31 -0
- data/lib/spree/testing_support/factories/consent_record_factory.rb +10 -0
- data/lib/spree/testing_support/factories/country_factory.rb +28 -9
- data/lib/spree/testing_support/factories/custom_field_definition_factory.rb +79 -0
- data/lib/spree/testing_support/factories/custom_field_factory.rb +64 -0
- data/lib/spree/testing_support/factories/customer_group_user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/data_request_factory.rb +17 -0
- data/lib/spree/testing_support/factories/delivery_factory.rb +13 -0
- data/lib/spree/testing_support/factories/delivery_method_factory.rb +47 -0
- data/lib/spree/testing_support/factories/delivery_origin_group_factory.rb +5 -0
- data/lib/spree/testing_support/factories/delivery_profile_factory.rb +9 -0
- data/lib/spree/testing_support/factories/delivery_rate_factory.rb +7 -0
- data/lib/spree/testing_support/factories/delivery_zone_factory.rb +34 -0
- data/lib/spree/testing_support/factories/digital_asset_factory.rb +13 -0
- data/lib/spree/testing_support/factories/digital_link_factory.rb +1 -1
- data/lib/spree/testing_support/factories/discount_factory.rb +9 -0
- data/lib/spree/testing_support/factories/exchange_factory.rb +50 -0
- data/lib/spree/testing_support/factories/external_reference_factory.rb +8 -0
- data/lib/spree/testing_support/factories/fee_factory.rb +8 -0
- data/lib/spree/testing_support/factories/fulfillment_factory.rb +32 -0
- data/lib/spree/testing_support/factories/fulfillment_item_factory.rb +17 -0
- data/lib/spree/testing_support/factories/gateway_customer_factory.rb +1 -1
- data/lib/spree/testing_support/factories/gift_card_factory.rb +2 -2
- data/lib/spree/testing_support/factories/import_factory.rb +33 -1
- data/lib/spree/testing_support/factories/line_item_factory.rb +10 -5
- data/lib/spree/testing_support/factories/market_factory.rb +5 -12
- data/lib/spree/testing_support/factories/media_factory.rb +36 -0
- data/lib/spree/testing_support/factories/newsletter_subscriber_factory.rb +1 -1
- data/lib/spree/testing_support/factories/number_sequence_factory.rb +7 -0
- data/lib/spree/testing_support/factories/options_factory.rb +5 -5
- data/lib/spree/testing_support/factories/order_factory.rb +39 -23
- data/lib/spree/testing_support/factories/order_group_factory.rb +29 -0
- data/lib/spree/testing_support/factories/package_type_factory.rb +36 -0
- data/lib/spree/testing_support/factories/payment_factory.rb +7 -7
- data/lib/spree/testing_support/factories/payment_method_factory.rb +5 -5
- data/lib/spree/testing_support/factories/payment_session_factory.rb +10 -6
- data/lib/spree/testing_support/factories/payment_setup_session_factory.rb +2 -2
- data/lib/spree/testing_support/factories/payment_split_factory.rb +10 -0
- data/lib/spree/testing_support/factories/price_adjustment_tier_factory.rb +7 -0
- data/lib/spree/testing_support/factories/price_factory.rb +6 -0
- data/lib/spree/testing_support/factories/price_rule_factory.rb +0 -10
- data/lib/spree/testing_support/factories/product_collection_factory.rb +8 -0
- data/lib/spree/testing_support/factories/product_factory.rb +35 -7
- data/lib/spree/testing_support/factories/product_type_custom_field_definition_factory.rb +10 -0
- data/lib/spree/testing_support/factories/product_type_factory.rb +12 -0
- data/lib/spree/testing_support/factories/promotion_factory.rb +4 -0
- data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
- data/lib/spree/testing_support/factories/purchase_order_factory.rb +49 -0
- data/lib/spree/testing_support/factories/refresh_token_factory.rb +2 -0
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -2
- data/lib/spree/testing_support/factories/return_factory.rb +52 -0
- data/lib/spree/testing_support/factories/return_reason_factory.rb +19 -0
- data/lib/spree/testing_support/factories/role_factory.rb +1 -0
- data/lib/spree/testing_support/factories/saved_report_factory.rb +7 -0
- data/lib/spree/testing_support/factories/seller_factory.rb +34 -0
- data/lib/spree/testing_support/factories/seller_payout_factory.rb +14 -0
- data/lib/spree/testing_support/factories/seller_requirement_factory.rb +61 -0
- data/lib/spree/testing_support/factories/seller_requirement_submission_factory.rb +32 -0
- data/lib/spree/testing_support/factories/seller_transfer_factory.rb +21 -0
- data/lib/spree/testing_support/factories/shipping_label_factory.rb +44 -0
- data/lib/spree/testing_support/factories/state_factory.rb +18 -5
- data/lib/spree/testing_support/factories/stock_level_factory.rb +24 -0
- data/lib/spree/testing_support/factories/stock_location_factory.rb +12 -6
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +20 -3
- data/lib/spree/testing_support/factories/stock_receipt_factory.rb +37 -0
- data/lib/spree/testing_support/factories/stock_reservation_factory.rb +11 -8
- data/lib/spree/testing_support/factories/stock_transfer_factory.rb +53 -6
- data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -3
- data/lib/spree/testing_support/factories/supplier_factory.rb +17 -0
- data/lib/spree/testing_support/factories/tax_exemption_certificate_factory.rb +18 -0
- data/lib/spree/testing_support/factories/tax_identifier_factory.rb +33 -0
- data/lib/spree/testing_support/factories/tax_line_factory.rb +19 -0
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +5 -2
- data/lib/spree/testing_support/factories/taxon_factory.rb +6 -23
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +8 -0
- data/lib/spree/testing_support/factories/user_factory.rb +8 -12
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
- data/lib/spree/testing_support/factories/wishlist_factory.rb +1 -1
- data/lib/spree/testing_support/factories/wishlist_item_factory.rb +10 -0
- data/lib/spree/testing_support/factories/zone_factory.rb +2 -25
- data/lib/spree/testing_support/factories/zone_member_factory.rb +2 -1
- data/lib/spree/testing_support/factories.rb +1 -6
- data/lib/spree/testing_support/imports.rb +16 -0
- data/lib/spree/testing_support/label_provider.rb +49 -0
- data/lib/spree/testing_support/lifecycle_events.rb +6 -1
- data/lib/spree/testing_support/metadata.rb +38 -36
- data/lib/spree/testing_support/order_walkthrough.rb +46 -36
- data/lib/spree/testing_support/preferences.rb +39 -0
- data/lib/spree/testing_support/purchase_order.rb +111 -0
- data/lib/spree/testing_support/store.rb +6 -2
- data/lib/spree/testing_support/tax_identifier_validators.rb +68 -0
- data/lib/spree/translations.rb +139 -5
- data/lib/spree/upgrades/5_4_to_5_5/manifest.yml +1 -1
- data/lib/spree/upgrades/5_5_to_5_6/manifest.yml +17 -9
- data/lib/spree/upgrades/5_6_to_6_0/manifest.yml +683 -0
- data/lib/spree/validators.rb +74 -0
- data/lib/spree/workflow.rb +335 -0
- data/lib/tasks/backfill_custom_field_definition_stores.rake +82 -0
- data/lib/tasks/backfill_import_export_tenancy.rake +93 -0
- data/lib/tasks/backfill_library_media_placements.rake +29 -0
- data/lib/tasks/backfill_media_store_ids.rake +70 -0
- data/lib/tasks/backfill_reason_store_ids.rake +28 -0
- data/lib/tasks/capture_methods_migration.rake +30 -0
- data/lib/tasks/carts_migration.rake +113 -0
- data/lib/tasks/categories_and_collections.rake +188 -0
- data/lib/tasks/cli.rake +22 -3
- data/lib/tasks/consolidate_metadata.rake +73 -0
- data/lib/tasks/core.rake +1 -11
- data/lib/tasks/deliveries_migration.rake +52 -0
- data/lib/tasks/delivery_method_rules_migration.rake +51 -0
- data/lib/tasks/delivery_migration.rake +213 -0
- data/lib/tasks/delivery_profiles_migration.rake +109 -0
- data/lib/tasks/fold_store_credit_categories.rake +40 -0
- data/lib/tasks/fulfillment_statuses_migration.rake +59 -0
- data/lib/tasks/inventory_operations_migration.rake +223 -0
- data/lib/tasks/markets.rake +7 -2
- data/lib/tasks/media.rake +2 -2
- data/lib/tasks/media_class_rename.rake +56 -0
- data/lib/tasks/migrate_country_state_codes.rake +228 -0
- data/lib/tasks/migrate_promotion_option_value_rules.rake +124 -0
- data/lib/tasks/migrate_returns.rake +322 -0
- data/lib/tasks/migrate_rich_text_to_columns.rake +128 -0
- data/lib/tasks/migrate_users_to_customers.rake +161 -0
- data/lib/tasks/order_coupon_code_backfill.rake +32 -0
- data/lib/tasks/order_market_backfill.rake +27 -0
- data/lib/tasks/package_types.rake +62 -0
- data/lib/tasks/price_history.rake +49 -6
- data/lib/tasks/products.rake +21 -2
- data/lib/tasks/remove_master_variant.rake +58 -0
- data/lib/tasks/rich_text.rake +44 -0
- data/lib/tasks/seller_sample_data.rake +142 -0
- data/lib/tasks/setup.rake +18 -0
- data/lib/tasks/single_store_associations.rake +11 -0
- data/lib/tasks/stock.rake +15 -0
- data/lib/tasks/store_binding_migration.rake +33 -0
- data/lib/tasks/store_settings.rake +104 -0
- data/lib/tasks/tax_zones_migration.rake +147 -0
- data/lib/tasks/taxons.rake +9 -10
- data/lib/tasks/typed_adjustments_migration.rake +189 -0
- data/lib/tasks/typed_stock_movements_migration.rake +250 -0
- data/lib/tasks/upgrade.rake +13 -8
- data/spec/fixtures/files/eu_vat_numbers.txt +56 -0
- data/spec/fixtures/files/price_list_prices_import.csv +4 -0
- data/spec/fixtures/files/products_import.csv +1 -1
- data/spec/fixtures/tiny-video.mp4 +0 -0
- metadata +788 -541
- data/app/assets/config/spree_core_manifest.js +0 -4
- data/app/assets/images/google_on_white_hdpi.png +0 -0
- data/app/assets/images/logo.png +0 -0
- data/app/assets/images/payment_icons/ach.svg +0 -1
- data/app/assets/images/payment_icons/achdirectdebit.svg +0 -1
- data/app/assets/images/payment_icons/ada.svg +0 -1
- data/app/assets/images/payment_icons/adyen.svg +0 -1
- data/app/assets/images/payment_icons/affinbank.svg +0 -1
- data/app/assets/images/payment_icons/affirm.svg +0 -1
- data/app/assets/images/payment_icons/afterpay.svg +0 -1
- data/app/assets/images/payment_icons/airtel_money.svg +0 -1
- data/app/assets/images/payment_icons/airteltigo_mobile_money.svg +0 -1
- data/app/assets/images/payment_icons/alandsbanken.svg +0 -1
- data/app/assets/images/payment_icons/alipay.svg +0 -1
- data/app/assets/images/payment_icons/alipay_hk.svg +0 -1
- data/app/assets/images/payment_icons/alliancebank.svg +0 -1
- data/app/assets/images/payment_icons/alma.svg +0 -1
- data/app/assets/images/payment_icons/amazon.svg +0 -1
- data/app/assets/images/payment_icons/ambank.svg +0 -1
- data/app/assets/images/payment_icons/american_express.svg +0 -1
- data/app/assets/images/payment_icons/apecoin.svg +0 -1
- data/app/assets/images/payment_icons/apple_pay.svg +0 -1
- data/app/assets/images/payment_icons/arbitrum.svg +0 -1
- data/app/assets/images/payment_icons/atome.svg +0 -1
- data/app/assets/images/payment_icons/authorizenet.svg +0 -1
- data/app/assets/images/payment_icons/avalanche.svg +0 -1
- data/app/assets/images/payment_icons/bacs.svg +0 -1
- data/app/assets/images/payment_icons/bancontact.svg +0 -1
- data/app/assets/images/payment_icons/bangkokbank.svg +0 -1
- data/app/assets/images/payment_icons/bankislam.svg +0 -1
- data/app/assets/images/payment_icons/bankmuamalat.svg +0 -1
- data/app/assets/images/payment_icons/bankofamerica.svg +0 -1
- data/app/assets/images/payment_icons/bankrakyat.svg +0 -1
- data/app/assets/images/payment_icons/banktransfer.svg +0 -1
- data/app/assets/images/payment_icons/base.svg +0 -1
- data/app/assets/images/payment_icons/becs.svg +0 -1
- data/app/assets/images/payment_icons/benefit.svg +0 -1
- data/app/assets/images/payment_icons/billie.svg +0 -1
- data/app/assets/images/payment_icons/bitcoin.svg +0 -1
- data/app/assets/images/payment_icons/bitcoin_cash.svg +0 -1
- data/app/assets/images/payment_icons/bizum.svg +0 -1
- data/app/assets/images/payment_icons/blik.svg +0 -1
- data/app/assets/images/payment_icons/bnbchain.svg +0 -1
- data/app/assets/images/payment_icons/bogus.svg +0 -1
- data/app/assets/images/payment_icons/bogus_app_coin.svg +0 -1
- data/app/assets/images/payment_icons/boleto.svg +0 -1
- data/app/assets/images/payment_icons/boost.svg +0 -1
- data/app/assets/images/payment_icons/braintree.svg +0 -1
- data/app/assets/images/payment_icons/buckaroopaybybank.svg +0 -1
- data/app/assets/images/payment_icons/busd.svg +0 -1
- data/app/assets/images/payment_icons/cartes_bancaires.svg +0 -1
- data/app/assets/images/payment_icons/cash.svg +0 -1
- data/app/assets/images/payment_icons/cashappafterpay.svg +0 -1
- data/app/assets/images/payment_icons/cashapppay.svg +0 -1
- data/app/assets/images/payment_icons/checkout_finance.svg +0 -1
- data/app/assets/images/payment_icons/chinabank.svg +0 -1
- data/app/assets/images/payment_icons/clearpay.svg +0 -1
- data/app/assets/images/payment_icons/collector_bank.svg +0 -1
- data/app/assets/images/payment_icons/dai.svg +0 -1
- data/app/assets/images/payment_icons/dana.svg +0 -1
- data/app/assets/images/payment_icons/dankort.svg +0 -1
- data/app/assets/images/payment_icons/danske_bank.svg +0 -1
- data/app/assets/images/payment_icons/deutschebank.svg +0 -1
- data/app/assets/images/payment_icons/diners_club.svg +0 -1
- data/app/assets/images/payment_icons/directbanktransferlatinamerica.svg +0 -1
- data/app/assets/images/payment_icons/discover.svg +0 -1
- data/app/assets/images/payment_icons/dogecoin.svg +0 -1
- data/app/assets/images/payment_icons/duitnow.svg +0 -1
- data/app/assets/images/payment_icons/eft_secure.svg +0 -1
- data/app/assets/images/payment_icons/eftpos_au.svg +0 -1
- data/app/assets/images/payment_icons/eftposau.svg +0 -1
- data/app/assets/images/payment_icons/elo.svg +0 -1
- data/app/assets/images/payment_icons/eos.svg +0 -1
- data/app/assets/images/payment_icons/eps.svg +0 -1
- data/app/assets/images/payment_icons/ethereum.svg +0 -1
- data/app/assets/images/payment_icons/eurobonuscheckout.svg +0 -1
- data/app/assets/images/payment_icons/ezcash.svg +0 -1
- data/app/assets/images/payment_icons/fantom.svg +0 -1
- data/app/assets/images/payment_icons/fpx.svg +0 -1
- data/app/assets/images/payment_icons/gcash.svg +0 -1
- data/app/assets/images/payment_icons/generic.svg +0 -1
- data/app/assets/images/payment_icons/genericbank.svg +0 -1
- data/app/assets/images/payment_icons/gift-card.svg +0 -1
- data/app/assets/images/payment_icons/giropay.svg +0 -1
- data/app/assets/images/payment_icons/glbepaypal.svg +0 -1
- data/app/assets/images/payment_icons/gmobanktransfer.svg +0 -1
- data/app/assets/images/payment_icons/gnosis.svg +0 -1
- data/app/assets/images/payment_icons/google_pay.svg +0 -1
- data/app/assets/images/payment_icons/google_wallet.svg +0 -1
- data/app/assets/images/payment_icons/gopay.svg +0 -1
- data/app/assets/images/payment_icons/grabpay.svg +0 -1
- data/app/assets/images/payment_icons/gusd.svg +0 -1
- data/app/assets/images/payment_icons/handelsbanken.svg +0 -1
- data/app/assets/images/payment_icons/hongleongbank.svg +0 -1
- data/app/assets/images/payment_icons/hypercard.svg +0 -1
- data/app/assets/images/payment_icons/hypercash.svg +0 -1
- data/app/assets/images/payment_icons/ideal.svg +0 -1
- data/app/assets/images/payment_icons/in3viaideal.svg +0 -1
- data/app/assets/images/payment_icons/inbank.svg +0 -1
- data/app/assets/images/payment_icons/jcb.svg +0 -1
- data/app/assets/images/payment_icons/kakao_pay.svg +0 -1
- data/app/assets/images/payment_icons/kasikornbank.svg +0 -1
- data/app/assets/images/payment_icons/klarna-pay-later.svg +0 -1
- data/app/assets/images/payment_icons/klarna-pay-now.svg +0 -1
- data/app/assets/images/payment_icons/klarna-slice-it.svg +0 -1
- data/app/assets/images/payment_icons/klarna.svg +0 -1
- data/app/assets/images/payment_icons/knet.svg +0 -1
- data/app/assets/images/payment_icons/krungthaibank.svg +0 -1
- data/app/assets/images/payment_icons/landbank.svg +0 -1
- data/app/assets/images/payment_icons/laybuybyklarna.svg +0 -1
- data/app/assets/images/payment_icons/litecoin.svg +0 -1
- data/app/assets/images/payment_icons/lunchcheck.svg +0 -1
- data/app/assets/images/payment_icons/mach.svg +0 -1
- data/app/assets/images/payment_icons/mada.svg +0 -1
- data/app/assets/images/payment_icons/maestro.svg +0 -1
- data/app/assets/images/payment_icons/master.svg +0 -1
- data/app/assets/images/payment_icons/mayabank.svg +0 -1
- data/app/assets/images/payment_icons/maybank.svg +0 -1
- data/app/assets/images/payment_icons/maybankm2u.svg +0 -1
- data/app/assets/images/payment_icons/maybankqrpay.svg +0 -1
- data/app/assets/images/payment_icons/mbway.svg +0 -1
- data/app/assets/images/payment_icons/mcash.svg +0 -1
- data/app/assets/images/payment_icons/medicinosbankas.svg +0 -1
- data/app/assets/images/payment_icons/mercadopago.svg +0 -1
- data/app/assets/images/payment_icons/metrobank.svg +0 -1
- data/app/assets/images/payment_icons/mobilepay.svg +0 -1
- data/app/assets/images/payment_icons/momopay.svg +0 -1
- data/app/assets/images/payment_icons/monero.svg +0 -1
- data/app/assets/images/payment_icons/mtn_mobile_money.svg +0 -1
- data/app/assets/images/payment_icons/mybank.svg +0 -1
- data/app/assets/images/payment_icons/naver_pay.svg +0 -1
- data/app/assets/images/payment_icons/nelo.svg +0 -1
- data/app/assets/images/payment_icons/netbanking.svg +0 -1
- data/app/assets/images/payment_icons/novalnetdirectdebitach.svg +0 -1
- data/app/assets/images/payment_icons/nubank.svg +0 -1
- data/app/assets/images/payment_icons/ocbcbank.svg +0 -1
- data/app/assets/images/payment_icons/offlinebanktransferlatinamerica.svg +0 -1
- data/app/assets/images/payment_icons/ola_money.svg +0 -1
- data/app/assets/images/payment_icons/oney.svg +0 -1
- data/app/assets/images/payment_icons/onlinebanking.svg +0 -1
- data/app/assets/images/payment_icons/onlinebanktransfer.svg +0 -1
- data/app/assets/images/payment_icons/orangemobilemoney.svg +0 -1
- data/app/assets/images/payment_icons/otpbank.svg +0 -1
- data/app/assets/images/payment_icons/oxxo.svg +0 -1
- data/app/assets/images/payment_icons/paybybank.svg +0 -1
- data/app/assets/images/payment_icons/paybybankmollie.svg +0 -1
- data/app/assets/images/payment_icons/paybybankus.svg +0 -1
- data/app/assets/images/payment_icons/paycash.svg +0 -1
- data/app/assets/images/payment_icons/payco.svg +0 -1
- data/app/assets/images/payment_icons/payeverpaybybank.svg +0 -1
- data/app/assets/images/payment_icons/payme.svg +0 -1
- data/app/assets/images/payment_icons/paynow.svg +0 -1
- data/app/assets/images/payment_icons/paynowmbank.svg +0 -1
- data/app/assets/images/payment_icons/paypal.svg +0 -1
- data/app/assets/images/payment_icons/paypo.svg +0 -1
- data/app/assets/images/payment_icons/payrexxbanktransfer.svg +0 -1
- data/app/assets/images/payment_icons/payrexxpaybybank.svg +0 -1
- data/app/assets/images/payment_icons/paysafecash.svg +0 -1
- data/app/assets/images/payment_icons/pix.svg +0 -1
- data/app/assets/images/payment_icons/polygon.svg +0 -1
- data/app/assets/images/payment_icons/przelewy24.svg +0 -1
- data/app/assets/images/payment_icons/publicbank.svg +0 -1
- data/app/assets/images/payment_icons/publicbank_pbe.svg +0 -1
- data/app/assets/images/payment_icons/qr_promptpay.svg +0 -1
- data/app/assets/images/payment_icons/rabobank.svg +0 -1
- data/app/assets/images/payment_icons/revolut.svg +0 -1
- data/app/assets/images/payment_icons/rhbbank.svg +0 -1
- data/app/assets/images/payment_icons/riverty.svg +0 -1
- data/app/assets/images/payment_icons/safetypaybanktransfer.svg +0 -1
- data/app/assets/images/payment_icons/samsung_pay.svg +0 -1
- data/app/assets/images/payment_icons/satispay.svg +0 -1
- data/app/assets/images/payment_icons/scalapay.svg +0 -1
- data/app/assets/images/payment_icons/scotiabank.svg +0 -1
- data/app/assets/images/payment_icons/seabankid.svg +0 -1
- data/app/assets/images/payment_icons/seabankph.svg +0 -1
- data/app/assets/images/payment_icons/sepa_bank_transfer.svg +0 -1
- data/app/assets/images/payment_icons/sepadebit.svg +0 -22
- data/app/assets/images/payment_icons/sepadirectdebit.svg +0 -1
- data/app/assets/images/payment_icons/seveneleven.svg +0 -1
- data/app/assets/images/payment_icons/shib.svg +0 -1
- data/app/assets/images/payment_icons/shopcash.svg +0 -1
- data/app/assets/images/payment_icons/siauliubankas.svg +0 -1
- data/app/assets/images/payment_icons/skeps.svg +0 -1
- data/app/assets/images/payment_icons/snap_checkout.svg +0 -1
- data/app/assets/images/payment_icons/sofort.svg +0 -1
- data/app/assets/images/payment_icons/softbank.svg +0 -1
- data/app/assets/images/payment_icons/spei.svg +0 -1
- data/app/assets/images/payment_icons/storecredit.svg +0 -1
- data/app/assets/images/payment_icons/stripe.svg +0 -1
- data/app/assets/images/payment_icons/sveacheckout.svg +0 -1
- data/app/assets/images/payment_icons/swedbank.svg +0 -1
- data/app/assets/images/payment_icons/swish.svg +0 -1
- data/app/assets/images/payment_icons/tbibank.svg +0 -1
- data/app/assets/images/payment_icons/thanachartbank.svg +0 -1
- data/app/assets/images/payment_icons/tnmmoney.svg +0 -1
- data/app/assets/images/payment_icons/touchngo.svg +0 -1
- data/app/assets/images/payment_icons/trustly.svg +0 -1
- data/app/assets/images/payment_icons/twint.svg +0 -1
- data/app/assets/images/payment_icons/uaevisa.svg +0 -1
- data/app/assets/images/payment_icons/unionpay.svg +0 -1
- data/app/assets/images/payment_icons/unzerbanktransfer.svg +0 -1
- data/app/assets/images/payment_icons/upi.svg +0 -1
- data/app/assets/images/payment_icons/usbank.svg +0 -1
- data/app/assets/images/payment_icons/usdc.svg +0 -1
- data/app/assets/images/payment_icons/usdt.svg +0 -1
- data/app/assets/images/payment_icons/venmo.svg +0 -1
- data/app/assets/images/payment_icons/vipps.svg +0 -1
- data/app/assets/images/payment_icons/visa.svg +0 -1
- data/app/assets/images/payment_icons/volksbank.svg +0 -1
- data/app/assets/images/payment_icons/waavepaybybank.svg +0 -1
- data/app/assets/images/payment_icons/walley.svg +0 -1
- data/app/assets/images/payment_icons/wbtc.svg +0 -1
- data/app/assets/images/payment_icons/wechatpay.svg +0 -1
- data/app/assets/images/payment_icons/whishcheckout.svg +0 -1
- data/app/assets/images/payment_icons/wingbank.svg +0 -1
- data/app/assets/images/payment_icons/xrp.svg +0 -1
- data/app/assets/images/payment_icons/zip.svg +0 -1
- data/app/controllers/spree/base_controller.rb +0 -11
- data/app/finders/concerns/spree/product_filterable.rb +0 -9
- data/app/finders/spree/addresses/find.rb +0 -27
- data/app/finders/spree/base_finder.rb +0 -14
- data/app/finders/spree/countries/find.rb +0 -31
- data/app/finders/spree/credit_cards/find.rb +0 -12
- data/app/finders/spree/option_values/find_available.rb +0 -28
- data/app/finders/spree/orders/find_complete.rb +0 -114
- data/app/finders/spree/orders/find_current.rb +0 -24
- data/app/finders/spree/orders/finder_helper.rb +0 -17
- data/app/finders/spree/products/find.rb +0 -328
- data/app/finders/spree/taxons/find.rb +0 -99
- data/app/finders/spree/variants/find.rb +0 -30
- data/app/finders/spree/variants/option_types_finder.rb +0 -21
- data/app/helpers/spree/addresses_helper.rb +0 -97
- data/app/helpers/spree/base_helper.rb +0 -132
- data/app/helpers/spree/currency_helper.rb +0 -46
- data/app/helpers/spree/integrations_helper.rb +0 -15
- data/app/helpers/spree/locale_helper.rb +0 -44
- data/app/helpers/spree/localized_names_helper.rb +0 -25
- data/app/helpers/spree/products_helper.rb +0 -147
- data/app/helpers/spree/shipment_helper.rb +0 -12
- data/app/javascript/spree/core/controllers/address_autocomplete_controller.js +0 -230
- data/app/javascript/spree/core/controllers/address_form_controller.js +0 -98
- data/app/javascript/spree/core/controllers/disable_submit_button_controller.js +0 -19
- data/app/javascript/spree/core/controllers/enable_button_controller.js +0 -29
- data/app/javascript/spree/core/helpers/address_autocomplete/google_places_suggestions_provider.js +0 -161
- data/app/javascript/spree/core/helpers/debounce.js +0 -9
- data/app/javascript/spree/core/helpers/scroll_lock.js +0 -25
- data/app/jobs/spree/media/migrate_product_assets_job.rb +0 -83
- data/app/jobs/spree/reports/generate_job.rb +0 -23
- data/app/mailers/spree/report_mailer.rb +0 -20
- data/app/models/concerns/spree/adjustment_source.rb +0 -58
- data/app/models/concerns/spree/default_price.rb +0 -138
- data/app/models/concerns/spree/display_on.rb +0 -50
- data/app/models/concerns/spree/image_methods.rb +0 -40
- data/app/models/concerns/spree/legacy_multi_store_support.rb +0 -48
- data/app/models/concerns/spree/metafield_filterable.rb +0 -162
- data/app/models/concerns/spree/metafields.rb +0 -256
- data/app/models/concerns/spree/number_as_param.rb +0 -13
- data/app/models/concerns/spree/store_scoped_resource.rb +0 -37
- data/app/models/concerns/spree/unique_name.rb +0 -12
- data/app/models/spree/adjustable/adjuster/base.rb +0 -25
- data/app/models/spree/adjustable/adjuster/promotion.rb +0 -41
- data/app/models/spree/adjustable/adjuster/tax.rb +0 -26
- data/app/models/spree/adjustable/adjustments_updater.rb +0 -74
- data/app/models/spree/adjustable/promotion_accumulator.rb +0 -78
- data/app/models/spree/adjustment.rb +0 -130
- data/app/models/spree/asset/support/active_storage.rb +0 -26
- data/app/models/spree/calculator/default_tax.rb +0 -87
- data/app/models/spree/calculator/returns/default_refund_amount.rb +0 -40
- data/app/models/spree/customer_return.rb +0 -94
- data/app/models/spree/image/configuration/active_storage.rb +0 -11
- data/app/models/spree/image.rb +0 -6
- data/app/models/spree/legacy_admin_user.rb +0 -31
- data/app/models/spree/legacy_user.rb +0 -33
- data/app/models/spree/log_entry.rb +0 -30
- data/app/models/spree/metafield_definition/search_capabilities.rb +0 -104
- data/app/models/spree/metafields/boolean.rb +0 -15
- data/app/models/spree/metafields/json.rb +0 -37
- data/app/models/spree/metafields/long_text.rb +0 -11
- data/app/models/spree/metafields/number.rb +0 -23
- data/app/models/spree/metafields/rich_text.rb +0 -18
- data/app/models/spree/metafields/short_text.rb +0 -15
- data/app/models/spree/option_type_prototype.rb +0 -9
- data/app/models/spree/order/address_book.rb +0 -100
- data/app/models/spree/order/checkout.rb +0 -350
- data/app/models/spree/order/currency_updater.rb +0 -37
- data/app/models/spree/order/digital.rb +0 -60
- data/app/models/spree/order/gift_card.rb +0 -71
- data/app/models/spree/order/payments.rb +0 -64
- data/app/models/spree/order/store_credit.rb +0 -110
- data/app/models/spree/order/webhooks.rb +0 -19
- data/app/models/spree/order_approval.rb +0 -19
- data/app/models/spree/order_cancellation.rb +0 -19
- data/app/models/spree/order_contents.rb +0 -31
- data/app/models/spree/order_routing/strategy/legacy.rb +0 -33
- data/app/models/spree/payment/webhooks.rb +0 -15
- data/app/models/spree/permission_sets/base.rb +0 -81
- data/app/models/spree/permission_sets/configuration_management.rb +0 -64
- data/app/models/spree/permission_sets/dashboard_display.rb +0 -17
- data/app/models/spree/permission_sets/default_customer.rb +0 -83
- data/app/models/spree/permission_sets/order_display.rb +0 -27
- data/app/models/spree/permission_sets/order_management.rb +0 -33
- data/app/models/spree/permission_sets/product_display.rb +0 -27
- data/app/models/spree/permission_sets/product_management.rb +0 -28
- data/app/models/spree/permission_sets/promotion_management.rb +0 -22
- data/app/models/spree/permission_sets/role_management.rb +0 -21
- data/app/models/spree/permission_sets/stock_display.rb +0 -19
- data/app/models/spree/permission_sets/stock_management.rb +0 -19
- data/app/models/spree/permission_sets/super_user.rb +0 -28
- data/app/models/spree/permission_sets/user_display.rb +0 -19
- data/app/models/spree/permission_sets/user_management.rb +0 -20
- data/app/models/spree/product/webhooks.rb +0 -17
- data/app/models/spree/prototype_taxon.rb +0 -9
- data/app/models/spree/reimbursement/credit.rb +0 -27
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +0 -44
- data/app/models/spree/reimbursement/reimbursement_type_validator.rb +0 -15
- data/app/models/spree/reimbursement.rb +0 -167
- data/app/models/spree/reimbursement_performer.rb +0 -34
- data/app/models/spree/reimbursement_tax_calculator.rb +0 -37
- data/app/models/spree/reimbursement_type/credit.rb +0 -13
- data/app/models/spree/reimbursement_type/exchange.rb +0 -9
- data/app/models/spree/reimbursement_type/original_payment.rb +0 -13
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +0 -64
- data/app/models/spree/reimbursement_type/store_credit.rb +0 -20
- data/app/models/spree/reimbursement_type.rb +0 -22
- data/app/models/spree/report.rb +0 -140
- data/app/models/spree/report_line_item.rb +0 -27
- data/app/models/spree/report_line_items/products_performance.rb +0 -76
- data/app/models/spree/report_line_items/sales_total.rb +0 -49
- data/app/models/spree/reports/products_performance.rb +0 -44
- data/app/models/spree/reports/sales_total.rb +0 -18
- data/app/models/spree/return_authorization.rb +0 -109
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +0 -24
- data/app/models/spree/return_item/eligibility_validator/default.rb +0 -30
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +0 -16
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +0 -16
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +0 -16
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +0 -16
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +0 -16
- data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +0 -34
- data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +0 -9
- data/app/models/spree/return_item.rb +0 -287
- data/app/models/spree/returns_calculator.rb +0 -7
- data/app/models/spree/search_provider/meilisearch.rb +0 -551
- data/app/models/spree/shipment/custom_events.rb +0 -47
- data/app/models/spree/shipment/webhooks.rb +0 -11
- data/app/models/spree/shipment_handler.rb +0 -38
- data/app/models/spree/shipping_category.rb +0 -25
- data/app/models/spree/shipping_method_category.rb +0 -8
- data/app/models/spree/shipping_method_zone.rb +0 -8
- data/app/models/spree/state_change.rb +0 -12
- data/app/models/spree/stock/splitter/digital.rb +0 -35
- data/app/models/spree/stock/splitter/shipping_category.rb +0 -31
- data/app/models/spree/stock_item/webhooks.rb +0 -6
- data/app/models/spree/stock_movement/webhooks.rb +0 -6
- data/app/models/spree/variant/webhooks.rb +0 -6
- data/app/presenters/spree/csv/metafields_helper.rb +0 -17
- data/app/presenters/spree/search_provider/product_presenter.rb +0 -158
- data/app/presenters/spree/variant_presenter.rb +0 -81
- data/app/presenters/spree/variants/option_types_presenter.rb +0 -87
- data/app/services/spree/account/addresses/create.rb +0 -8
- data/app/services/spree/account/addresses/update.rb +0 -8
- data/app/services/spree/account/create.rb +0 -17
- data/app/services/spree/account/update.rb +0 -15
- data/app/services/spree/cart/add_item.rb +0 -63
- data/app/services/spree/cart/associate.rb +0 -29
- data/app/services/spree/cart/change_currency.rb +0 -27
- data/app/services/spree/cart/create.rb +0 -26
- data/app/services/spree/cart/destroy.rb +0 -50
- data/app/services/spree/cart/empty.rb +0 -38
- data/app/services/spree/cart/estimate_shipping_rates.rb +0 -39
- data/app/services/spree/cart/recalculate.rb +0 -35
- data/app/services/spree/cart/remove_item.rb +0 -39
- data/app/services/spree/cart/remove_line_item.rb +0 -28
- data/app/services/spree/cart/remove_out_of_stock_items.rb +0 -65
- data/app/services/spree/cart/set_quantity.rb +0 -32
- data/app/services/spree/cart/update.rb +0 -37
- data/app/services/spree/carts/complete.rb +0 -50
- data/app/services/spree/carts/upsert_items.rb +0 -76
- data/app/services/spree/checkout/complete.rb +0 -23
- data/app/services/spree/checkout/get_shipping_rates.rb +0 -52
- data/app/services/spree/checkout/next.rb +0 -13
- data/app/services/spree/checkout/select_shipping_method.rb +0 -63
- data/app/services/spree/checkout/update.rb +0 -72
- data/app/services/spree/credit_cards/destroy.rb +0 -25
- data/app/services/spree/fulfillments/create.rb +0 -259
- data/app/services/spree/gift_cards/apply.rb +0 -78
- data/app/services/spree/gift_cards/redeem.rb +0 -17
- data/app/services/spree/gift_cards/remove.rb +0 -39
- data/app/services/spree/line_items/create.rb +0 -20
- data/app/services/spree/line_items/destroy.rb +0 -18
- data/app/services/spree/line_items/helper.rb +0 -11
- data/app/services/spree/line_items/update.rb +0 -17
- data/app/services/spree/orders/build_shipments.rb +0 -29
- data/app/services/spree/orders/cancel.rb +0 -54
- data/app/services/spree/orders/complete.rb +0 -53
- data/app/services/spree/orders/update_contact_information.rb +0 -19
- data/app/services/spree/orders/upsert_items.rb +0 -70
- data/app/services/spree/payments/handle_webhook.rb +0 -57
- data/app/services/spree/search_provider/metafield_schema.rb +0 -144
- data/app/services/spree/seeds/countries.rb +0 -35
- data/app/services/spree/seeds/default_reimbursement_types.rb +0 -12
- data/app/services/spree/seeds/shipping_categories.rb +0 -12
- data/app/services/spree/seeds/states.rb +0 -82
- data/app/services/spree/seeds/stock_locations.rb +0 -18
- data/app/services/spree/seeds/store_credit_categories.rb +0 -14
- data/app/services/spree/seeds/zones.rb +0 -52
- data/app/services/spree/shipments/add_item.rb +0 -32
- data/app/services/spree/shipments/change_state.rb +0 -14
- data/app/services/spree/shipments/create.rb +0 -48
- data/app/services/spree/shipments/helper.rb +0 -23
- data/app/services/spree/shipments/remove_item.rb +0 -55
- data/app/services/spree/stores/settings_defaults_by_country.rb +0 -38
- data/app/services/spree/themes/duplicator.rb +0 -40
- data/app/sorters/spree/base_sorter.rb +0 -47
- data/app/sorters/spree/classifications/sort.rb +0 -68
- data/app/sorters/spree/products/sort.rb +0 -73
- data/app/subscribers/spree/report_subscriber.rb +0 -26
- data/app/views/spree/addresses/_form.html.erb +0 -59
- data/app/views/spree/addresses/_suggestions_box.erb +0 -14
- data/app/views/spree/admin_user_mailer/confirmation_email.html.erb +0 -7
- data/app/views/spree/report_mailer/report_done.html.erb +0 -7
- data/app/views/spree/shared/_google_places_api_loader.html.erb +0 -7
- data/app/views/spree/shared/_mailer_line_item.html.erb +0 -12
- data/app/views/spree/shared/_payment.html.erb +0 -52
- data/config/importmap.rb +0 -15
- data/config/initializers/carmen.rb +0 -23
- data/config/initializers/rails61_fixes.rb +0 -1
- data/db/migrate/20250120152208_add_default_locale_to_action_text_rich_texts.rb +0 -7
- data/db/migrate/20250122113708_add_first_and_last_name_to_spree_admin_class.rb +0 -9
- data/db/migrate/20250204162453_create_spree_reports.rb +0 -13
- data/db/migrate/20250217171018_create_action_text_video_embeds.rb +0 -11
- data/db/migrate/20250508060800_add_selected_locale_to_spree_admin_users.rb +0 -8
- data/db/migrate/20260429000001_create_spree_order_cancellations.rb +0 -25
- data/db/migrate/20260429000002_create_spree_order_approvals.rb +0 -22
- data/db/sample_data/markets.rb +0 -64
- data/db/sample_data/metafield_definitions.rb +0 -7
- data/db/sample_data/shipping_methods.rb +0 -61
- data/lib/generators/spree/authentication/custom/custom_generator.rb +0 -49
- data/lib/generators/spree/authentication/custom/templates/authentication_helpers.rb.tt +0 -50
- data/lib/generators/spree/authentication/devise/devise_generator.rb +0 -84
- data/lib/generators/spree/authentication/devise/templates/authentication_helpers.rb.tt +0 -50
- data/lib/generators/spree/dummy/templates/app/assets/config/manifest.js +0 -0
- data/lib/spree/core/components.rb +0 -31
- data/lib/spree/core/controller_helpers/auth.rb +0 -52
- data/lib/spree/core/controller_helpers/currency.rb +0 -59
- data/lib/spree/core/controller_helpers/locale.rb +0 -99
- data/lib/spree/core/controller_helpers/order.rb +0 -172
- data/lib/spree/core/controller_helpers/strong_parameters.rb +0 -48
- data/lib/spree/core/controller_helpers/turbo.rb +0 -19
- data/lib/spree/core/partials.rb +0 -42
- data/lib/spree/core/previews/report_preview.rb +0 -40
- data/lib/spree/permitted_attributes.rb +0 -337
- data/lib/spree/testing_support/authorization_helpers.rb +0 -72
- data/lib/spree/testing_support/caching.rb +0 -47
- data/lib/spree/testing_support/capybara_config.rb +0 -45
- data/lib/spree/testing_support/capybara_ext.rb +0 -83
- data/lib/spree/testing_support/controller_requests.rb +0 -11
- data/lib/spree/testing_support/factories/adjustment_factory.rb +0 -28
- data/lib/spree/testing_support/factories/asset_factory.rb +0 -12
- data/lib/spree/testing_support/factories/customer_return_factory.rb +0 -36
- data/lib/spree/testing_support/factories/digital_factory.rb +0 -10
- data/lib/spree/testing_support/factories/image_factory.rb +0 -11
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +0 -18
- data/lib/spree/testing_support/factories/log_entry_factory.rb +0 -6
- data/lib/spree/testing_support/factories/metafield_definition_factory.rb +0 -82
- data/lib/spree/testing_support/factories/metafield_factory.rb +0 -68
- data/lib/spree/testing_support/factories/prototype_factory.rb +0 -9
- data/lib/spree/testing_support/factories/reimbursement_credit_factory.rb +0 -7
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +0 -16
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +0 -7
- data/lib/spree/testing_support/factories/report_factory.rb +0 -33
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +0 -21
- data/lib/spree/testing_support/factories/return_item_factory.rb +0 -14
- data/lib/spree/testing_support/factories/shipment_factory.rb +0 -21
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +0 -9
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +0 -31
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +0 -7
- data/lib/spree/testing_support/factories/state_change_factory.rb +0 -8
- data/lib/spree/testing_support/factories/stock_item_factory.rb +0 -22
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -9
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -16
- data/lib/spree/testing_support/factories/wished_variant_factory.rb +0 -6
- data/lib/spree/webhooks.rb +0 -22
- data/lib/tasks/role_users.rake +0 -21
- data/vendor/javascript/@rails--request.js.js +0 -4
- data/vendor/javascript/@stimulus-components--auto-submit.js +0 -4
- data/vendor/javascript/stimulus-reveal-controller.js +0 -4
- data/vendor/javascript/stimulus-textarea-autogrow.js +0 -4
- data/vendor/javascript/tailwindcss-stimulus-components.js +0 -4
data/app/models/spree/order.rb
CHANGED
|
@@ -1,12 +1,7 @@
|
|
|
1
|
-
require_dependency 'spree/order/checkout'
|
|
2
|
-
require_dependency 'spree/order/currency_updater'
|
|
3
|
-
require_dependency 'spree/order/digital'
|
|
4
|
-
require_dependency 'spree/order/payments'
|
|
5
|
-
require_dependency 'spree/order/store_credit'
|
|
6
|
-
require_dependency 'spree/order/gift_card'
|
|
7
1
|
|
|
8
2
|
module Spree
|
|
9
3
|
class Order < Spree.base_class
|
|
4
|
+
include Spree::CSV::CustomFieldsHelper
|
|
10
5
|
has_prefix_id :or # Stripe: or_
|
|
11
6
|
|
|
12
7
|
# Legacy free-text `channel` column was replaced by the `channel_id` FK
|
|
@@ -14,64 +9,81 @@ module Spree
|
|
|
14
9
|
# 5.4-to-5.5 backfill rake can read it; AR ignores it everywhere else.
|
|
15
10
|
self.ignored_columns += ['channel']
|
|
16
11
|
|
|
12
|
+
# What Orders::UpdateStatuses derives — the only writer of the column.
|
|
13
|
+
PAYMENT_STATUSES = %w(none authorized partially_paid paid partially_refunded refunded overcharged voided).freeze
|
|
14
|
+
# @deprecated legacy machine vocabulary; rows carrying it stay valid until
|
|
15
|
+
# the status migration rewrites them. Removed in 6.1.
|
|
17
16
|
PAYMENT_STATES = %w(balance_due credit_owed failed paid void)
|
|
18
|
-
|
|
17
|
+
FULFILLMENT_STATUSES = %w(backorder canceled partial unfulfilled fulfilled delivered pending ready shipped)
|
|
18
|
+
# @deprecated legacy name — remove in 6.1 together with the 'shipped' value
|
|
19
|
+
SHIPMENT_STATES = FULFILLMENT_STATUSES
|
|
20
|
+
# @deprecated legacy machine vocabulary — line-item removability is
|
|
21
|
+
# completion-based since 6.0; removed in 6.1.
|
|
19
22
|
LINE_ITEM_REMOVABLE_STATES = %w(cart address delivery payment confirm resumed)
|
|
20
23
|
|
|
21
24
|
extend Spree::DisplayMoney
|
|
22
25
|
|
|
23
|
-
include Spree::
|
|
24
|
-
include Spree::
|
|
25
|
-
include Spree::
|
|
26
|
-
include Spree::
|
|
27
|
-
include Spree::
|
|
28
|
-
include Spree::
|
|
29
|
-
include Spree::
|
|
30
|
-
include Spree::
|
|
31
|
-
include Spree::
|
|
26
|
+
include Spree::SingleStoreResource
|
|
27
|
+
include Spree::SanitizableRichText
|
|
28
|
+
include Spree::Purchase::Channel
|
|
29
|
+
include Spree::Purchase::Company
|
|
30
|
+
include Spree::Purchase::Freight
|
|
31
|
+
include Spree::Purchase::QuantityRules
|
|
32
|
+
include Spree::Purchase::PurchaseOrder
|
|
33
|
+
include Spree::Purchase::Market
|
|
34
|
+
include Spree::Purchase::Currency
|
|
35
|
+
include Spree::Purchase::Locale
|
|
36
|
+
include Spree::Purchase::DigitalItems
|
|
37
|
+
include Spree::Purchase::Taxation
|
|
38
|
+
include Spree::Purchase::StoreCredits
|
|
39
|
+
include Spree::Purchase::GiftCards
|
|
40
|
+
include Spree::Purchase::LineItemCurrencies
|
|
41
|
+
include Spree::Purchase::LineItemLookup
|
|
42
|
+
include Spree::Purchase::PaymentProcessing
|
|
43
|
+
include Spree::Purchase::Addresses
|
|
44
|
+
include Spree::Purchase::Validations
|
|
45
|
+
include Spree::Purchase::Totals
|
|
46
|
+
include Spree::Purchase::Lifecycle
|
|
47
|
+
has_spree_number prefix: 'R'
|
|
32
48
|
|
|
33
49
|
include Spree::NumberIdentifier
|
|
34
|
-
include Spree::SingleStoreResource
|
|
35
50
|
|
|
36
51
|
publishes_lifecycle_events
|
|
37
|
-
include Spree::
|
|
38
|
-
include Spree::Metafields
|
|
52
|
+
include Spree::HasCustomFields
|
|
39
53
|
include Spree::Metadata
|
|
54
|
+
include Spree::HasExternalReferences
|
|
40
55
|
include Spree::Searchable
|
|
41
56
|
if defined?(Spree::Security::Orders)
|
|
42
57
|
include Spree::Security::Orders
|
|
43
58
|
end
|
|
44
|
-
if defined?(Spree::VendorConcern)
|
|
45
|
-
include Spree::VendorConcern
|
|
46
|
-
end
|
|
47
59
|
|
|
48
60
|
has_secure_token :token, length: 35
|
|
49
|
-
has_rich_text :internal_note
|
|
50
61
|
|
|
51
|
-
|
|
62
|
+
has_spree_rich_text :internal_note
|
|
52
63
|
|
|
53
64
|
money_methods :outstanding_balance, :item_total, :adjustment_total,
|
|
54
65
|
:included_tax_total, :additional_tax_total, :tax_total,
|
|
55
|
-
:
|
|
66
|
+
:delivery_total, :discount_total, :total,
|
|
56
67
|
:cart_promo_total, :pre_tax_item_amount, :pre_tax_total,
|
|
57
|
-
:payment_total, :amount_due
|
|
68
|
+
:payment_total, :amount_due, :fee_total,
|
|
69
|
+
:commission_amount_total, :commission_tax_total, :commission_total
|
|
58
70
|
|
|
59
|
-
alias display_ship_total
|
|
60
|
-
alias_attribute :ship_total, :
|
|
61
|
-
def amount_due
|
|
62
|
-
[outstanding_balance - total_applied_store_credit, 0].max
|
|
63
|
-
end
|
|
71
|
+
alias display_ship_total display_delivery_total
|
|
72
|
+
alias_attribute :ship_total, :delivery_total
|
|
64
73
|
|
|
65
|
-
# Transient warnings populated by remove_out_of_stock_items! and
|
|
74
|
+
# Transient warnings populated by remove_out_of_stock_items! and ensure_available_delivery_rates
|
|
66
75
|
attribute :warnings, default: -> { [] }
|
|
67
76
|
|
|
68
77
|
# Removes out-of-stock/discontinued items and populates warnings.
|
|
69
78
|
# Returns self (reloaded if items were removed) with warnings set.
|
|
70
79
|
# Captured before the call because removing items reloads the order, which
|
|
71
80
|
# would drop warnings already recorded upstream.
|
|
81
|
+
# @deprecated Only Carts can auto remove out of stock items
|
|
72
82
|
def remove_out_of_stock_items!
|
|
83
|
+
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')
|
|
84
|
+
|
|
73
85
|
existing_warnings = warnings
|
|
74
|
-
result = Spree::
|
|
86
|
+
result = Spree::Carts::RemoveOutOfStockItems.call(cart: self)
|
|
75
87
|
return self unless result.success?
|
|
76
88
|
|
|
77
89
|
order, _messages, new_warnings = result.value
|
|
@@ -79,60 +91,52 @@ module Spree
|
|
|
79
91
|
order
|
|
80
92
|
end
|
|
81
93
|
|
|
82
|
-
#
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
alias_attribute :
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
checkout_flow do
|
|
108
|
-
go_to_state :address
|
|
109
|
-
go_to_state :delivery, if: ->(order) { order.delivery_required? }
|
|
110
|
-
go_to_state :payment, if: ->(order) { order.payment? || order.payment_required? }
|
|
111
|
-
go_to_state :confirm, if: ->(order) { order.confirmation_required? }
|
|
112
|
-
go_to_state :complete
|
|
113
|
-
end
|
|
114
|
-
|
|
115
|
-
self.whitelisted_ransackable_associations = %w[shipments user created_by approver canceler promotions bill_address ship_address line_items store channel tags]
|
|
94
|
+
# Standardized column names (renamed in 6.0); legacy readers stay as
|
|
95
|
+
# aliases one release.
|
|
96
|
+
alias_attribute :promo_total, :discount_total
|
|
97
|
+
alias display_promo_total display_discount_total
|
|
98
|
+
alias_attribute :item_count, :total_quantity
|
|
99
|
+
|
|
100
|
+
# @deprecated The column is +customer_note+ since 6.0; removed in 6.1.
|
|
101
|
+
def special_instructions
|
|
102
|
+
Spree::Deprecation.warn('Spree::Order#special_instructions is deprecated and will be removed in Spree 6.1. Use #customer_note instead.')
|
|
103
|
+
customer_note
|
|
104
|
+
end
|
|
105
|
+
|
|
106
|
+
# @deprecated See {#special_instructions}; removed in 6.1.
|
|
107
|
+
def special_instructions=(value)
|
|
108
|
+
Spree::Deprecation.warn('Spree::Order#special_instructions= is deprecated and will be removed in Spree 6.1. Use #customer_note= instead.')
|
|
109
|
+
self.customer_note = value
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
# lock_version (renamed from state_lock_version) drives the API's manual
|
|
113
|
+
# optimistic concurrency (compare client-sent version, 409 on mismatch) —
|
|
114
|
+
# Rails auto-locking must not raise on internal saves.
|
|
115
|
+
self.lock_optimistically = false
|
|
116
|
+
|
|
117
|
+
self.whitelisted_ransackable_associations = %w[fulfillments shipments customer created_by approver canceler promotions bill_address ship_address line_items store channel tags seller order_group]
|
|
116
118
|
self.whitelisted_ransackable_attributes = %w[
|
|
117
|
-
completed_at email number
|
|
118
|
-
total item_total
|
|
119
|
+
completed_at email number status payment_status payment_state fulfillment_status shipment_state delivery_total
|
|
120
|
+
total item_total total_quantity considered_risky channel_id currency coupon_code customer_id seller_id
|
|
121
|
+
order_group_id po_number
|
|
119
122
|
]
|
|
120
123
|
self.whitelisted_ransackable_scopes = %w[complete incomplete refunded partially_refunded search multi_search]
|
|
121
124
|
|
|
122
|
-
attr_reader :coupon_code
|
|
123
|
-
attr_accessor :temporary_address
|
|
124
|
-
|
|
125
125
|
# Set to false on admin-initiated flows to suppress customer-facing emails.
|
|
126
126
|
attr_accessor :notify_customer
|
|
127
127
|
|
|
128
|
-
attribute :state_machine_resumed, :boolean
|
|
129
128
|
|
|
130
129
|
STATUSES = %w[draft placed canceled].freeze
|
|
131
130
|
|
|
132
131
|
attribute :status, :string, default: 'draft'
|
|
133
132
|
validates :status, inclusion: { in: STATUSES }
|
|
134
133
|
|
|
134
|
+
# Orders belonging to the given seller. Passing nil selects the
|
|
135
|
+
# operator's own sales, which on a store with no sellers is every order.
|
|
136
|
+
scope :for_seller, ->(seller) { where(seller_id: seller.respond_to?(:id) ? seller.id : seller) }
|
|
137
|
+
|
|
135
138
|
scope :drafts, -> { where(status: 'draft') }
|
|
139
|
+
scope :not_drafts, -> { where.not(status: 'draft') }
|
|
136
140
|
scope :placed_orders, -> { where(status: 'placed') }
|
|
137
141
|
scope :canceled_orders, -> { where(status: 'canceled') }
|
|
138
142
|
|
|
@@ -143,126 +147,129 @@ module Spree
|
|
|
143
147
|
self.tag_list = tags
|
|
144
148
|
end
|
|
145
149
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
# 6.0 forward-compat: User→Customer rename. Column stays user_id in 5.x.
|
|
149
|
-
alias_attribute :customer_id, :user_id
|
|
150
|
+
ASSOCIATED_CUSTOMER_ATTRIBUTES = [:customer_id, :email, :bill_address_id, :ship_address_id]
|
|
150
151
|
|
|
151
|
-
|
|
152
|
+
# @deprecated Use {Spree::Purchase::PaymentProcessing#payment_methods};
|
|
153
|
+
# removed in 6.1.
|
|
154
|
+
def collect_frontend_payment_methods
|
|
155
|
+
Spree::Deprecation.warn('Spree::Order#collect_frontend_payment_methods is deprecated and will be removed in Spree 6.1. Use #payment_methods instead.')
|
|
156
|
+
payment_methods
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
include Spree::DeprecatedCustomerAlias
|
|
160
|
+
|
|
161
|
+
belongs_to :customer, class_name: "::#{Spree.customer_class}", optional: true, autosave: true
|
|
162
|
+
# The cart this order was completed from (unique — the completion
|
|
163
|
+
# idempotency key). Backoffice draft orders have no cart.
|
|
164
|
+
belongs_to :cart, class_name: 'Spree::Cart', optional: true, inverse_of: :order
|
|
165
|
+
# The checkout this order was placed in, when it was placed alongside
|
|
166
|
+
# others — one per seller on a marketplace. A single-seller or first-party
|
|
167
|
+
# only checkout produces a bare order and no group.
|
|
168
|
+
belongs_to :order_group, class_name: 'Spree::OrderGroup', optional: true, inverse_of: :orders
|
|
169
|
+
# Whose sale this is. Nil on the operator's own goods, including the
|
|
170
|
+
# first-party child of a mixed marketplace checkout.
|
|
171
|
+
belongs_to :seller, class_name: 'Spree::Seller', optional: true
|
|
152
172
|
belongs_to :created_by, class_name: "::#{Spree.admin_user_class}", optional: true
|
|
153
173
|
belongs_to :approver, class_name: "::#{Spree.admin_user_class}", optional: true
|
|
154
174
|
belongs_to :canceler, class_name: "::#{Spree.admin_user_class}", optional: true
|
|
175
|
+
belongs_to :cancel_reason, class_name: 'Spree::OrderCancellationReason', optional: true, inverse_of: :orders
|
|
155
176
|
|
|
156
|
-
belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address',
|
|
157
|
-
optional: true, dependent: :destroy
|
|
158
|
-
alias_method :billing_address, :bill_address
|
|
159
|
-
alias_method :billing_address=, :bill_address=
|
|
160
|
-
alias_attribute :billing_address_id, :bill_address_id
|
|
161
|
-
|
|
162
|
-
belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address',
|
|
163
|
-
optional: true, dependent: :destroy
|
|
164
|
-
alias_method :shipping_address, :ship_address
|
|
165
|
-
alias_method :shipping_address=, :ship_address=
|
|
166
|
-
alias_attribute :shipping_address_id, :ship_address_id
|
|
167
|
-
|
|
168
|
-
belongs_to :store, class_name: 'Spree::Store'
|
|
169
|
-
belongs_to :market, class_name: 'Spree::Market', optional: true
|
|
170
|
-
belongs_to :channel, class_name: 'Spree::Channel', optional: true
|
|
171
177
|
belongs_to :preferred_stock_location, class_name: 'Spree::StockLocation', optional: true
|
|
172
178
|
|
|
173
179
|
with_options dependent: :destroy do
|
|
174
|
-
has_many :state_changes, as: :stateful, class_name: 'Spree::StateChange'
|
|
175
180
|
has_many :line_items, -> { order(:created_at) }, inverse_of: :order, class_name: 'Spree::LineItem'
|
|
176
181
|
has_many :payments, class_name: 'Spree::Payment'
|
|
177
182
|
has_many :payment_sessions, inverse_of: :order, class_name: 'Spree::PaymentSession'
|
|
178
|
-
has_many :
|
|
179
|
-
has_many :
|
|
180
|
-
has_many :
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
has_many :
|
|
184
|
-
has_many :customer_returns, class_name: 'Spree::CustomerReturn', through: :return_authorizations
|
|
185
|
-
has_many :line_item_adjustments, through: :line_items, source: :adjustments
|
|
186
|
-
has_many :inventory_units, inverse_of: :order, class_name: 'Spree::InventoryUnit'
|
|
183
|
+
has_many :returns, -> { order(:created_at) }, inverse_of: :order, class_name: 'Spree::Return'
|
|
184
|
+
has_many :exchanges, -> { order(:created_at) }, inverse_of: :order, class_name: 'Spree::Exchange'
|
|
185
|
+
has_many :claims, -> { order(:created_at) }, inverse_of: :order, class_name: 'Spree::Claim'
|
|
186
|
+
end
|
|
187
|
+
has_many :fulfillment_items, inverse_of: :order, class_name: 'Spree::FulfillmentItem'
|
|
188
|
+
has_many :inventory_units, class_name: 'Spree::FulfillmentItem', inverse_of: :order, deprecated: true
|
|
187
189
|
has_many :stock_reservations, class_name: 'Spree::StockReservation', inverse_of: :order, dependent: :destroy
|
|
188
|
-
has_many :
|
|
190
|
+
has_many :return_line_items, through: :returns, class_name: 'Spree::ReturnLineItem', source: :return_line_items
|
|
189
191
|
has_many :variants, through: :line_items
|
|
190
192
|
has_many :products, through: :variants
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
193
|
+
# Every refund names the order it puts right — its own payments' refunds
|
|
194
|
+
# stamp it automatically, and a refund against a payment shared by a split
|
|
195
|
+
# checkout names the one child being refunded. Keyed on that column rather
|
|
196
|
+
# than walked through payments, which a grouped order does not own.
|
|
197
|
+
has_many :refunds, class_name: 'Spree::Refund', inverse_of: :order, dependent: :nullify
|
|
198
|
+
|
|
199
|
+
# Typed adjustment rows owned by this order (line-, fulfillment- and
|
|
200
|
+
# order-level). See docs/plans/6.0-6.1-split-adjustments.md.
|
|
201
|
+
has_many :tax_lines, class_name: 'Spree::TaxLine', dependent: :destroy, inverse_of: :order
|
|
202
|
+
# delete, not destroy: the snapshot is readonly once written, and destroy
|
|
203
|
+
# refuses readonly records. It has no dependents of its own.
|
|
204
|
+
has_one :tax_identifier, class_name: 'Spree::TaxIdentifier', as: :owner,
|
|
205
|
+
dependent: :delete, inverse_of: :owner
|
|
206
|
+
has_many :discounts, class_name: 'Spree::Discount', dependent: :destroy, inverse_of: :order
|
|
207
|
+
has_many :fees, class_name: 'Spree::Fee', dependent: :destroy, inverse_of: :order
|
|
208
|
+
|
|
209
|
+
# What the marketplace charged its sellers on this order. Off-order by
|
|
210
|
+
# design: commission never reaches a total the customer pays, so this is a
|
|
211
|
+
# ledger the order merely hosts. See docs/plans/6.0-multi-vendor-marketplace.md.
|
|
212
|
+
has_many :commission_lines, class_name: 'Spree::CommissionLine', dependent: :destroy, inverse_of: :order
|
|
213
|
+
|
|
214
|
+
# This order's share of the payments made against its group. Empty on an
|
|
215
|
+
# ungrouped order, whose payments are its own (see #settlement_payments).
|
|
216
|
+
has_many :payment_splits, class_name: 'Spree::PaymentSplit', dependent: :destroy, inverse_of: :order
|
|
217
|
+
|
|
218
|
+
has_many :line_item_tax_lines, through: :line_items, source: :tax_lines
|
|
219
|
+
has_many :line_item_discounts, through: :line_items, source: :discounts
|
|
197
220
|
|
|
198
221
|
has_many :order_promotions, class_name: 'Spree::OrderPromotion'
|
|
199
222
|
has_many :promotions, through: :order_promotions, class_name: 'Spree::Promotion'
|
|
200
223
|
|
|
201
|
-
has_many :
|
|
224
|
+
has_many :fulfillments, -> { order(:created_at, :id) }, class_name: 'Spree::Fulfillment', dependent: :destroy, inverse_of: :order do
|
|
202
225
|
def states
|
|
203
|
-
pluck(:
|
|
226
|
+
pluck(:status).uniq
|
|
204
227
|
end
|
|
205
228
|
end
|
|
206
|
-
has_many :
|
|
229
|
+
has_many :fulfillment_tax_lines, through: :fulfillments, source: :tax_lines
|
|
230
|
+
has_many :fulfillment_discounts, through: :fulfillments, source: :discounts
|
|
207
231
|
|
|
208
232
|
alias items line_items
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
alias_attribute :
|
|
233
|
+
# Legacy names — removed in 6.1 (real names: fulfillments, delivery_total,
|
|
234
|
+
# fulfillment_status since 6.0)
|
|
235
|
+
has_many :shipments, class_name: 'Spree::Fulfillment', inverse_of: :order, deprecated: true
|
|
236
|
+
alias_attribute :shipment_total, :delivery_total
|
|
237
|
+
alias display_shipment_total display_delivery_total
|
|
238
|
+
alias_attribute :shipment_state, :fulfillment_status
|
|
239
|
+
# Deprecated alias — the column is payment_status since 6.0; remove in 6.1.
|
|
240
|
+
alias_attribute :payment_state, :payment_status
|
|
215
241
|
|
|
216
242
|
delegate :has_markets?, to: :store, prefix: true
|
|
217
243
|
|
|
218
244
|
accepts_nested_attributes_for :line_items
|
|
219
|
-
accepts_nested_attributes_for :bill_address
|
|
220
|
-
accepts_nested_attributes_for :ship_address
|
|
221
|
-
alias shipping_address_attributes= ship_address_attributes=
|
|
222
|
-
alias billing_address_attributes= bill_address_attributes=
|
|
223
245
|
accepts_nested_attributes_for :payments, reject_if: :credit_card_nil_payment?
|
|
224
|
-
accepts_nested_attributes_for :
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
before_validation :ensure_market_presence
|
|
228
|
-
before_validation :ensure_channel_presence
|
|
229
|
-
before_validation :ensure_currency_presence
|
|
230
|
-
before_validation :ensure_locale_presence
|
|
231
|
-
before_validation :resolve_market_from_currency, if: -> { persisted? && currency_changed? && !skip_market_resolution }
|
|
232
|
-
|
|
233
|
-
before_validation :clone_billing_address, if: :use_billing?
|
|
234
|
-
before_validation :clone_shipping_address, if: :use_shipping?
|
|
235
|
-
attr_accessor :use_billing, :use_shipping, :skip_market_resolution
|
|
246
|
+
accepts_nested_attributes_for :fulfillments
|
|
247
|
+
# @deprecated legacy writer — removed in 6.1
|
|
248
|
+
alias shipments_attributes= fulfillments_attributes=
|
|
236
249
|
|
|
237
250
|
before_create :link_by_email
|
|
238
|
-
before_update :
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
validates :adjustment_total, MONEY_VALIDATION
|
|
253
|
-
validates :included_tax_total, POSITIVE_MONEY_VALIDATION
|
|
254
|
-
validates :additional_tax_total, POSITIVE_MONEY_VALIDATION
|
|
255
|
-
validates :payment_total, MONEY_VALIDATION
|
|
256
|
-
validates :shipment_total, MONEY_VALIDATION
|
|
257
|
-
validates :promo_total, NEGATIVE_MONEY_VALIDATION
|
|
258
|
-
validates :total, MONEY_VALIDATION
|
|
259
|
-
validates :market, presence: true, if: :store_has_markets?
|
|
260
|
-
validate :currency_must_be_supported_by_store
|
|
261
|
-
validate :locale_must_be_supported_by_store
|
|
262
|
-
|
|
251
|
+
before_update :ensure_updated_fulfillments, :homogenize_line_item_currencies, if: :currency_changed?
|
|
252
|
+
# Record-state deletion eligibility is enforced here, not in ability rules —
|
|
253
|
+
# secret-key API requests never consult CanCanCan (Axis A/B split,
|
|
254
|
+
# docs/plans/decisions.md 2026-08-05).
|
|
255
|
+
before_destroy :ensure_can_be_deleted
|
|
256
|
+
|
|
257
|
+
# Shared money/quantity validations live in Spree::Purchase::Validations;
|
|
258
|
+
# only order-specific rules stay here.
|
|
259
|
+
validates :email, presence: true, length: { maximum: 254, allow_blank: true }, email: { allow_blank: true }, if: :require_email
|
|
260
|
+
validates :payment_status, inclusion: { in: PAYMENT_STATUSES | PAYMENT_STATES, allow_blank: true }
|
|
261
|
+
validates :fulfillment_status, inclusion: { in: FULFILLMENT_STATUSES, allow_blank: true }
|
|
262
|
+
|
|
263
|
+
# @deprecated Both warn and run the full recalculation; use
|
|
264
|
+
# {#recalculate_totals!}. Removed in 6.1.
|
|
263
265
|
delegate :update_totals, :persist_totals, to: :updater
|
|
264
266
|
delegate :merge!, to: :merger
|
|
265
|
-
delegate :
|
|
267
|
+
delegate :first_name, :last_name, to: :bill_address, prefix: true, allow_nil: true
|
|
268
|
+
|
|
269
|
+
# @deprecated The delegated names follow the renamed address columns since
|
|
270
|
+
# 6.0; removed in 6.1.
|
|
271
|
+
alias bill_address_firstname bill_address_first_name
|
|
272
|
+
alias bill_address_lastname bill_address_last_name
|
|
266
273
|
|
|
267
274
|
class_attribute :update_hooks
|
|
268
275
|
self.update_hooks = Set.new
|
|
@@ -271,12 +278,14 @@ module Spree
|
|
|
271
278
|
scope :completed_between, ->(start_date, end_date) { where(completed_at: start_date..end_date) }
|
|
272
279
|
scope :complete, -> { where.not(completed_at: nil) }
|
|
273
280
|
scope :incomplete, -> { where(completed_at: nil) }
|
|
274
|
-
scope :canceled, -> { where(
|
|
275
|
-
scope :not_canceled, -> { where.not(
|
|
276
|
-
|
|
277
|
-
scope :
|
|
278
|
-
scope :
|
|
279
|
-
scope :
|
|
281
|
+
scope :canceled, -> { where(status: 'canceled') }
|
|
282
|
+
scope :not_canceled, -> { where.not(status: 'canceled') }
|
|
283
|
+
# Nil-tolerant channel filter for optional scoping (nil means all channels).
|
|
284
|
+
scope :for_channel, ->(channel) { channel ? where(channel_id: channel.id) : all }
|
|
285
|
+
scope :ready_to_ship, -> { where(fulfillment_status: %w[unfulfilled]) }
|
|
286
|
+
scope :partially_shipped, -> { where(fulfillment_status: %w[partial]) }
|
|
287
|
+
scope :not_shipped, -> { where(fulfillment_status: %w[unfulfilled partial]) }
|
|
288
|
+
scope :shipped, -> { where(fulfillment_status: %w[fulfilled delivered shipped]) }
|
|
280
289
|
scope :refunded, lambda {
|
|
281
290
|
joins(:refunds).group(:id).having("sum(#{Spree::Refund.table_name}.amount) = #{Spree::Order.table_name}.total")
|
|
282
291
|
}
|
|
@@ -297,15 +306,18 @@ module Spree
|
|
|
297
306
|
|
|
298
307
|
conditions = []
|
|
299
308
|
conditions << arel_table[:number].lower.matches(query_pattern)
|
|
309
|
+
# An accountant holds one reference or the other — ours or their own
|
|
310
|
+
# purchase order — and both have to find the same transaction.
|
|
311
|
+
conditions << arel_table[:po_number].lower.matches(query_pattern)
|
|
300
312
|
|
|
301
|
-
conditions << search_condition(Spree::Address, :
|
|
302
|
-
conditions << search_condition(Spree::Address, :
|
|
313
|
+
conditions << search_condition(Spree::Address, :first_name, sanitized_query)
|
|
314
|
+
conditions << search_condition(Spree::Address, :last_name, sanitized_query)
|
|
303
315
|
|
|
304
316
|
full_name = NameOfPerson::PersonName.full(sanitized_query)
|
|
305
317
|
|
|
306
318
|
if full_name.first.present? && full_name.last.present?
|
|
307
|
-
conditions << search_condition(Spree::Address, :
|
|
308
|
-
conditions << search_condition(Spree::Address, :
|
|
319
|
+
conditions << search_condition(Spree::Address, :first_name, full_name.first)
|
|
320
|
+
conditions << search_condition(Spree::Address, :last_name, full_name.last)
|
|
309
321
|
end
|
|
310
322
|
|
|
311
323
|
left_joins(:bill_address).where(arel_table[:email].lower.eq(query.downcase)).or(where(conditions.reduce(:or)))
|
|
@@ -347,55 +359,42 @@ module Spree
|
|
|
347
359
|
# Use this method in other gems that wish to register their own custom logic
|
|
348
360
|
# that should be called after Order#update
|
|
349
361
|
def self.register_update_hook(hook)
|
|
362
|
+
Spree::Deprecation.warn('Order.register_update_hook is deprecated and will be removed in Spree 6.1')
|
|
350
363
|
update_hooks.add(hook)
|
|
351
364
|
end
|
|
352
365
|
|
|
353
|
-
# For compatibility with Calculator::PriceSack
|
|
354
|
-
def amount
|
|
355
|
-
line_items.inject(0.0) { |sum, li| sum + li.amount }
|
|
356
|
-
end
|
|
357
|
-
|
|
358
|
-
# Sum of all line item amounts pre-tax
|
|
359
|
-
def pre_tax_item_amount
|
|
360
|
-
line_items.sum(:pre_tax_amount)
|
|
361
|
-
end
|
|
362
|
-
|
|
363
366
|
# Sum of the eligible promotion adjustments applied to the order itself
|
|
364
|
-
# (whole-order discounts created by Promotion::Actions::CreateAdjustment
|
|
365
|
-
#
|
|
366
|
-
# Zero or negative.
|
|
367
|
+
# (whole-order discounts created by Promotion::Actions::CreateAdjustment,
|
|
368
|
+
# distributed proportionally across line items), as opposed to promotions
|
|
369
|
+
# applied to individual line items or fulfillments. Zero or negative.
|
|
367
370
|
#
|
|
368
371
|
# @return [BigDecimal]
|
|
369
372
|
def order_level_promo_total
|
|
370
|
-
|
|
373
|
+
discounts.promotion.where(promotion_action_id: promotion_actions_of_scope(:order)).sum(:amount)
|
|
371
374
|
end
|
|
372
375
|
|
|
373
|
-
#
|
|
374
|
-
|
|
375
|
-
|
|
376
|
+
# Promotion actions of the given discount scope, covering both the 6.0
|
|
377
|
+
# class names and the legacy STI names still present in the type column
|
|
378
|
+
# until the 6.1 data migration.
|
|
379
|
+
def promotion_actions_of_scope(scope)
|
|
380
|
+
Spree::PromotionAction.where(type: Spree::PromotionAction.types_for_discount_scope(scope))
|
|
376
381
|
end
|
|
377
382
|
|
|
378
383
|
# Returns the subtotal used for analytics integrations
|
|
379
384
|
# It's a sum of the item total and the promo total
|
|
380
385
|
# @return [Float]
|
|
381
386
|
def analytics_subtotal
|
|
382
|
-
(item_total + line_items.sum(:
|
|
387
|
+
(item_total + line_items.sum(:discount_total)).to_f
|
|
383
388
|
end
|
|
384
389
|
|
|
390
|
+
|
|
391
|
+
# @deprecated Use {#fulfillment_discount}; removed in 6.1.
|
|
385
392
|
def shipping_discount
|
|
386
|
-
|
|
393
|
+
Spree::Deprecation.warn('Spree::Order#shipping_discount is deprecated and will be removed in Spree 6.1. Use #fulfillment_discount instead.')
|
|
394
|
+
fulfillment_discount
|
|
387
395
|
end
|
|
388
396
|
|
|
389
|
-
def completed?
|
|
390
|
-
completed_at.present?
|
|
391
|
-
end
|
|
392
397
|
|
|
393
|
-
# True when the order is mid-checkout: past the `cart` state but not yet
|
|
394
|
-
# completed or canceled. Used by stock reservation hooks and any flow
|
|
395
|
-
# that should only run during the active checkout phase.
|
|
396
|
-
def in_checkout?
|
|
397
|
-
!cart? && !complete? && !canceled?
|
|
398
|
-
end
|
|
399
398
|
|
|
400
399
|
def draft?
|
|
401
400
|
status == 'draft'
|
|
@@ -405,10 +404,26 @@ module Spree
|
|
|
405
404
|
status == 'placed'
|
|
406
405
|
end
|
|
407
406
|
|
|
407
|
+
def canceled?
|
|
408
|
+
status == 'canceled'
|
|
409
|
+
end
|
|
410
|
+
|
|
411
|
+
# @deprecated machine vocabulary — data-derived bridge for the 6.0
|
|
412
|
+
# transition, removed in 6.1. An order is "cart-like" while a draft
|
|
413
|
+
# with no checkout data.
|
|
414
|
+
def cart?
|
|
415
|
+
draft? && !completed? && email.blank? && ship_address_id.blank?
|
|
416
|
+
end
|
|
417
|
+
|
|
418
|
+
# Derived, not stored (Decision 8): some but not all fulfillments canceled.
|
|
419
|
+
def partially_canceled?
|
|
420
|
+
!canceled? && fulfillments.canceled.any? && fulfillments.not_canceled.any?
|
|
421
|
+
end
|
|
422
|
+
|
|
408
423
|
# Checks if the order is fully refunded
|
|
409
424
|
# @return [Boolean]
|
|
410
425
|
def order_refunded?
|
|
411
|
-
return false if
|
|
426
|
+
return false if total_quantity.zero?
|
|
412
427
|
return false if refunds_total.zero?
|
|
413
428
|
|
|
414
429
|
payment_state.in?(%w[void failed]) || refunds_total == total_minus_store_credits - additional_tax_total.abs
|
|
@@ -421,12 +436,107 @@ module Spree
|
|
|
421
436
|
# Checks if the order is partially refunded
|
|
422
437
|
# @return [Boolean]
|
|
423
438
|
def partially_refunded?
|
|
424
|
-
return false if
|
|
439
|
+
return false if total_quantity.zero?
|
|
425
440
|
return false if payment_state.in?(%w[void failed]) || refunds.empty?
|
|
426
441
|
|
|
427
442
|
refunds_total < total_minus_store_credits - additional_tax_total.abs
|
|
428
443
|
end
|
|
429
444
|
|
|
445
|
+
# When the buyer's statutory right of withdrawal expires — the EU
|
|
446
|
+
# cooling-off period (Consumer Rights Directive 2011/83/EU Art. 9).
|
|
447
|
+
#
|
|
448
|
+
# Derived rather than stored, because the clock starts when the buyer takes
|
|
449
|
+
# physical possession: a value written at placement would be wrong the
|
|
450
|
+
# moment a parcel arrived.
|
|
451
|
+
#
|
|
452
|
+
# Nil until the last live parcel is delivered. Counting from completion
|
|
453
|
+
# instead would expire the deadline before the statutory period had even
|
|
454
|
+
# begun — the buyer would be told their right had run out while they were
|
|
455
|
+
# still waiting for the goods. A right whose start has not happened yet has
|
|
456
|
+
# no end date to report.
|
|
457
|
+
#
|
|
458
|
+
# @return [ActiveSupport::TimeWithZone, nil] nil when the market grants no
|
|
459
|
+
# withdrawal right, the order is not complete, or delivery is outstanding
|
|
460
|
+
def withdrawal_period_ends_at
|
|
461
|
+
return nil unless withdrawal_right_applies?
|
|
462
|
+
|
|
463
|
+
started_at = withdrawal_period_starts_at
|
|
464
|
+
return nil if started_at.nil?
|
|
465
|
+
|
|
466
|
+
started_at + withdrawal_period_days.days
|
|
467
|
+
end
|
|
468
|
+
|
|
469
|
+
# Whether the buyer may still withdraw.
|
|
470
|
+
#
|
|
471
|
+
# True while delivery is outstanding: the right cannot have lapsed before
|
|
472
|
+
# it started, so an order still in transit is always within its period even
|
|
473
|
+
# though no deadline can be named yet.
|
|
474
|
+
#
|
|
475
|
+
# A canceled order is not: withdrawal is how a buyer ends a contract that
|
|
476
|
+
# is still standing, and cancellation has already ended this one. Without
|
|
477
|
+
# the guard, cancellation empties the live fulfillments, no start date can
|
|
478
|
+
# be found, and the open-ended reading above would keep the order reporting
|
|
479
|
+
# itself as withdrawable forever.
|
|
480
|
+
#
|
|
481
|
+
# @return [Boolean]
|
|
482
|
+
def within_withdrawal_period?
|
|
483
|
+
return false unless withdrawal_right_applies?
|
|
484
|
+
|
|
485
|
+
deadline = withdrawal_period_ends_at
|
|
486
|
+
# No deadline yet means nothing has been delivered, so the clock that
|
|
487
|
+
# would end the right has not started.
|
|
488
|
+
deadline.nil? || deadline.future?
|
|
489
|
+
end
|
|
490
|
+
|
|
491
|
+
# Whether a statutory right to withdraw exists on this order at all. A
|
|
492
|
+
# cancelled order has already ended the contract the right would end, and
|
|
493
|
+
# a market that sets no period grants none. Stated once because both
|
|
494
|
+
# readers above need the same answer.
|
|
495
|
+
def withdrawal_right_applies?
|
|
496
|
+
completed? && !canceled? && withdrawal_period_days.present?
|
|
497
|
+
end
|
|
498
|
+
|
|
499
|
+
# The moment the cooling-off period starts: receipt of the goods. The
|
|
500
|
+
# Consumer Rights Directive treats an order delivered in instalments as
|
|
501
|
+
# received when the LAST one arrives, so a partly-delivered order has not
|
|
502
|
+
# started its clock at all — reading the max over the delivered subset
|
|
503
|
+
# would start it at the first parcel and could expire the right while the
|
|
504
|
+
# buyer is still waiting for the rest.
|
|
505
|
+
#
|
|
506
|
+
# @return [ActiveSupport::TimeWithZone, nil] nil until every parcel that is
|
|
507
|
+
# still live has been delivered
|
|
508
|
+
def withdrawal_period_starts_at
|
|
509
|
+
live = fulfillments.reject(&:canceled?)
|
|
510
|
+
return nil if live.empty?
|
|
511
|
+
|
|
512
|
+
received = live.map { |fulfillment| withdrawal_receipt_of(fulfillment) }
|
|
513
|
+
return nil if received.any?(&:blank?)
|
|
514
|
+
|
|
515
|
+
received.max
|
|
516
|
+
end
|
|
517
|
+
|
|
518
|
+
# When one fulfillment counts as received.
|
|
519
|
+
#
|
|
520
|
+
# Digital content has no delivery event and no carrier to report one, so
|
|
521
|
+
# waiting for `delivered_at` would leave a mixed order's clock stopped
|
|
522
|
+
# forever — the physical parcel arrives and the deadline never appears.
|
|
523
|
+
# The Directive treats digital content differently from goods anyway
|
|
524
|
+
# (Art. 16(m)); handing it over is the moment it reaches the buyer.
|
|
525
|
+
#
|
|
526
|
+
# @param fulfillment [Spree::Fulfillment]
|
|
527
|
+
# @return [ActiveSupport::TimeWithZone, nil]
|
|
528
|
+
def withdrawal_receipt_of(fulfillment)
|
|
529
|
+
return fulfillment.delivered_at || fulfillment.fulfilled_at if fulfillment.digital?
|
|
530
|
+
|
|
531
|
+
fulfillment.delivered_at
|
|
532
|
+
end
|
|
533
|
+
|
|
534
|
+
# @return [Integer, nil] nil where no market says otherwise — a statutory
|
|
535
|
+
# notice is not something to assume on an order with no region attached
|
|
536
|
+
def withdrawal_period_days
|
|
537
|
+
market&.preferred_withdrawal_period_days
|
|
538
|
+
end
|
|
539
|
+
|
|
430
540
|
# Indicates whether or not the user is allowed to proceed to checkout.
|
|
431
541
|
# Currently this is implemented as a check for whether or not there is at
|
|
432
542
|
# least one LineItem in the Order. Feel free to override this logic in your
|
|
@@ -435,33 +545,11 @@ module Spree
|
|
|
435
545
|
line_items.exists?
|
|
436
546
|
end
|
|
437
547
|
|
|
438
|
-
# Does this order require a delivery (physical or digital).
|
|
439
|
-
def delivery_required?
|
|
440
|
-
true # true for Spree, can be decorated
|
|
441
|
-
end
|
|
442
|
-
|
|
443
|
-
# Is this a free order in which case the payment step should be skipped
|
|
444
|
-
def payment_required?
|
|
445
|
-
total.to_f > 0.0
|
|
446
|
-
end
|
|
447
|
-
|
|
448
|
-
# If true, causes the confirmation step to happen during the checkout process
|
|
449
|
-
def confirmation_required?
|
|
450
|
-
Spree::Config[:always_include_confirm_step] ||
|
|
451
|
-
payments.valid.map(&:payment_method).compact.any?(&:confirmation_required?) ||
|
|
452
|
-
# Little hacky fix for #4117
|
|
453
|
-
# If this wasn't here, order would transition to address state on confirm failure
|
|
454
|
-
# because there would be no valid payments any more.
|
|
455
|
-
confirm?
|
|
456
|
-
end
|
|
457
548
|
|
|
458
549
|
def email_required?
|
|
459
550
|
require_email
|
|
460
551
|
end
|
|
461
552
|
|
|
462
|
-
def backordered?
|
|
463
|
-
shipments.any?(&:backordered?)
|
|
464
|
-
end
|
|
465
553
|
|
|
466
554
|
# Check if the shipping address is a quick checkout address
|
|
467
555
|
# quick checkout addresses are incomplete as wallet providers like Apple Pay and Google Pay
|
|
@@ -475,141 +563,188 @@ module Spree
|
|
|
475
563
|
# Either fully digital or not digital at all
|
|
476
564
|
# @return [Boolean]
|
|
477
565
|
def quick_checkout_available?
|
|
478
|
-
payment_required? &&
|
|
566
|
+
payment_required? && fulfillments.count <= 1 && (digital? || !some_digital? || !delivery_step_required?)
|
|
479
567
|
end
|
|
480
568
|
|
|
481
569
|
# Check if quick checkout requires an address collection
|
|
482
|
-
# If the order is digital or not delivery required, then we don't need to collect an address
|
|
483
570
|
# @return [Boolean]
|
|
484
571
|
def quick_checkout_require_address?
|
|
485
|
-
|
|
572
|
+
shipping_address_required?
|
|
486
573
|
end
|
|
487
574
|
|
|
488
|
-
#
|
|
489
|
-
#
|
|
490
|
-
def
|
|
491
|
-
@
|
|
575
|
+
# @deprecated Use {#recalculate_totals!} for money and {#update_statuses!}
|
|
576
|
+
# for payment/fulfillment statuses; removed in 6.1.
|
|
577
|
+
def updater
|
|
578
|
+
@updater ||= Spree.order_updater.new(self)
|
|
492
579
|
end
|
|
493
580
|
|
|
494
|
-
#
|
|
495
|
-
|
|
496
|
-
|
|
581
|
+
# Recomputes and persists money totals (item, tax, promotion, delivery)
|
|
582
|
+
# and derived item counts. Convenience for
|
|
583
|
+
# {Spree::Orders::RecalculateTotals}.
|
|
584
|
+
def recalculate_totals!
|
|
585
|
+
Spree.order_recalculate_totals_workflow.call(order: self)
|
|
497
586
|
end
|
|
498
587
|
|
|
499
|
-
|
|
500
|
-
|
|
588
|
+
# Derives and persists payment_status / fulfillment_status from the
|
|
589
|
+
# order's payment, refund and fulfillment records. Convenience for
|
|
590
|
+
# {Spree::Orders::UpdateStatuses}, the sole status writer.
|
|
591
|
+
def update_statuses!
|
|
592
|
+
Spree.order_update_statuses_service.call(order: self)
|
|
501
593
|
end
|
|
502
594
|
|
|
595
|
+
# @deprecated Use {#recalculate_totals!}; removed in 6.1.
|
|
503
596
|
def update_with_updater!
|
|
504
|
-
|
|
597
|
+
Spree::Deprecation.warn('Spree::Order#update_with_updater! is deprecated and will be removed in Spree 6.1. Use #recalculate_totals! instead.')
|
|
598
|
+
recalculate_totals!
|
|
505
599
|
end
|
|
506
600
|
|
|
601
|
+
# @deprecated Use {Spree::Carts::Merge}; removed in 6.1.
|
|
507
602
|
def merger
|
|
508
603
|
@merger ||= Spree::OrderMerger.new(self)
|
|
509
604
|
end
|
|
510
605
|
|
|
511
|
-
def ensure_store_presence
|
|
512
|
-
Spree::Deprecation.warn('Spree::Order#ensure_store_presence is deprecated and will be removed in Spree 6.0. ensure_store instead.')
|
|
513
|
-
ensure_store
|
|
514
|
-
end
|
|
515
|
-
|
|
516
|
-
def ensure_market_presence
|
|
517
|
-
self.market ||= Spree::Current.market || store&.default_market
|
|
518
|
-
end
|
|
519
|
-
|
|
520
|
-
def ensure_channel_presence
|
|
521
|
-
return if channel_id.present?
|
|
522
|
-
|
|
523
|
-
self.channel = store&.default_channel
|
|
524
|
-
end
|
|
525
|
-
|
|
526
|
-
# @return [Boolean] true when this order has no registered user and its
|
|
527
|
-
# channel forbids guest checkout (see Spree::Channel::Gating). Enforced by
|
|
528
|
-
# the checkout completion service and the v3 Store API so every completion
|
|
529
|
-
# path (controller, payment webhook) is covered.
|
|
530
|
-
#
|
|
531
|
-
# A +prices_hidden+ channel also disallows guest completion regardless of
|
|
532
|
-
# the +guest_checkout+ flag — prices are withheld from guests, and a buyer
|
|
533
|
-
# who cannot see prices cannot meaningfully place an order. This dissolves
|
|
534
|
-
# the otherwise contradictory "prices hidden but guests may buy" config.
|
|
535
|
-
def guest_checkout_disallowed?
|
|
536
|
-
return false if user_id.present?
|
|
537
|
-
return false if channel.blank?
|
|
538
|
-
return true if channel.storefront_prices_hidden?
|
|
539
|
-
|
|
540
|
-
!channel.resolved_guest_checkout
|
|
541
|
-
end
|
|
542
606
|
|
|
543
607
|
def allow_cancel?
|
|
544
608
|
return false if !completed? || canceled?
|
|
545
609
|
|
|
546
|
-
|
|
610
|
+
fulfillment_status.nil? || %w{unfulfilled backorder canceled}.include?(fulfillment_status)
|
|
547
611
|
end
|
|
612
|
+
alias can_cancel? allow_cancel?
|
|
548
613
|
|
|
549
614
|
def all_inventory_units_returned?
|
|
550
615
|
inventory_units.all?(&:returned?)
|
|
551
616
|
end
|
|
552
617
|
|
|
553
618
|
# Associates the specified user with the order.
|
|
554
|
-
# Delegates to {Spree::
|
|
619
|
+
# Delegates to {Spree::Carts::Associate} service.
|
|
555
620
|
#
|
|
556
|
-
# @param
|
|
557
|
-
# @param override_email [Boolean] whether to override the order email with the
|
|
621
|
+
# @param customer [Spree.customer_class] the customer to associate with the order
|
|
622
|
+
# @param override_email [Boolean] whether to override the order email with the customer's email
|
|
558
623
|
# @return [Spree::ServiceModule::Result]
|
|
624
|
+
def associate_customer!(customer, override_email = true)
|
|
625
|
+
Spree.cart_associate_service.call(guest_cart: self, customer: customer, override_email: override_email)
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
# @deprecated Use {#associate_customer!}; removed in 6.1.
|
|
559
629
|
def associate_user!(user, override_email = true)
|
|
560
|
-
Spree.
|
|
630
|
+
Spree::Deprecation.warn('Spree::Order#associate_user! is deprecated and will be removed in Spree 6.1. Use #associate_customer! instead.')
|
|
631
|
+
associate_customer!(user, override_email)
|
|
561
632
|
end
|
|
562
633
|
|
|
563
|
-
def
|
|
564
|
-
nullified_attributes =
|
|
634
|
+
def disassociate_customer!
|
|
635
|
+
nullified_attributes = ASSOCIATED_CUSTOMER_ATTRIBUTES.index_with(nil)
|
|
565
636
|
|
|
566
637
|
update!(nullified_attributes)
|
|
567
638
|
end
|
|
568
639
|
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
def find_line_item_by_variant(variant, options = {})
|
|
575
|
-
line_items.detect do |line_item|
|
|
576
|
-
line_item.variant_id == variant.id &&
|
|
577
|
-
Spree.cart_compare_line_items_service.new.call(order: self, line_item: line_item, options: options).value
|
|
578
|
-
end
|
|
640
|
+
# @deprecated Use {#disassociate_customer!}; removed in 6.1.
|
|
641
|
+
def disassociate_user!
|
|
642
|
+
Spree::Deprecation.warn('Spree::Order#disassociate_user! is deprecated and will be removed in Spree 6.1. Use #disassociate_customer! instead.')
|
|
643
|
+
disassociate_customer!
|
|
579
644
|
end
|
|
580
645
|
|
|
581
|
-
#
|
|
582
|
-
#
|
|
646
|
+
# Re-estimates tax through the configured provider (writes TaxLine rows
|
|
647
|
+
# with replace-all semantics).
|
|
583
648
|
def create_tax_charge!
|
|
584
|
-
|
|
585
|
-
Spree::TaxRate.adjust(self, shipments) if shipments.any?
|
|
649
|
+
tax_provider.estimate(self, **tax_estimate_inputs)
|
|
586
650
|
end
|
|
587
651
|
|
|
588
652
|
def create_shipment_tax_charge!
|
|
589
|
-
|
|
653
|
+
tax_provider.estimate(self, fulfillments.to_a, **tax_estimate_inputs) if fulfillments.any?
|
|
590
654
|
end
|
|
591
655
|
|
|
656
|
+
# Re-prices every line from the catalog.
|
|
657
|
+
#
|
|
658
|
+
# A completed order's money is frozen — re-pricing would rewrite what the
|
|
659
|
+
# customer was actually charged — so this refuses rather than reporting a
|
|
660
|
+
# success it did not deliver. Post-placement price changes belong to the
|
|
661
|
+
# order-change substrate (docs/plans/6.1-order-change-substrate.md).
|
|
662
|
+
#
|
|
663
|
+
# @raise [RuntimeError] when the order is already completed
|
|
664
|
+
# @return [void]
|
|
592
665
|
def update_line_item_prices!
|
|
666
|
+
raise 'cannot re-price a completed order' if completed?
|
|
667
|
+
|
|
593
668
|
transaction do
|
|
594
669
|
line_items.reload.each(&:update_price)
|
|
595
670
|
save!
|
|
596
671
|
end
|
|
597
672
|
end
|
|
598
673
|
|
|
674
|
+
# Refunds are already netted out of payment_total by
|
|
675
|
+
# Spree::Carts::RecalculateTotals, so returns and claims need no separate
|
|
676
|
+
# term here — the legacy reimbursement payout was the only one that sat
|
|
677
|
+
# outside that sum.
|
|
599
678
|
def outstanding_balance
|
|
600
679
|
if canceled?
|
|
601
680
|
-1 * payment_total
|
|
602
681
|
else
|
|
603
|
-
total -
|
|
682
|
+
total - payment_total
|
|
604
683
|
end
|
|
605
684
|
end
|
|
606
685
|
|
|
607
|
-
|
|
608
|
-
|
|
686
|
+
|
|
687
|
+
# The payments that settle this order.
|
|
688
|
+
#
|
|
689
|
+
# An order placed in a split checkout has none of its own: the customer
|
|
690
|
+
# made one payment for the whole basket, against the group. Anything asking
|
|
691
|
+
# what money exists for this order — capture on dispatch, refunds, the
|
|
692
|
+
# admin payments panel — reads it here, and reads its own share of it from
|
|
693
|
+
# {#payment_splits}.
|
|
694
|
+
#
|
|
695
|
+
# @return [ActiveRecord::Relation<Spree::Payment>]
|
|
696
|
+
def settlement_payments
|
|
697
|
+
order_group_id.present? ? order_group.payments : payments
|
|
609
698
|
end
|
|
610
699
|
|
|
611
|
-
|
|
612
|
-
|
|
700
|
+
# What has been captured against this order, net of refunds.
|
|
701
|
+
#
|
|
702
|
+
# An order placed in a split checkout owns no payments, so its own
|
|
703
|
+
# +payment_total+ stays at zero however much the customer paid — the
|
|
704
|
+
# figure comes from its share of the group's payments instead, the same
|
|
705
|
+
# way {Spree::Orders::UpdateStatuses} derives +payment_status+. The
|
|
706
|
+
# group's own total will not do: once one seller has been captured and
|
|
707
|
+
# another has not, no proportion of it describes either.
|
|
708
|
+
#
|
|
709
|
+
# @return [BigDecimal]
|
|
710
|
+
def net_captured_total
|
|
711
|
+
return payment_total unless grouped?
|
|
712
|
+
|
|
713
|
+
payment_splits.sum(&:net_captured_amount)
|
|
714
|
+
end
|
|
715
|
+
|
|
716
|
+
# Payments still to be collected for this order, wherever they live.
|
|
717
|
+
#
|
|
718
|
+
# @return [ActiveRecord::Relation<Spree::Payment>, Array<Spree::Payment>]
|
|
719
|
+
def settlement_pending_payments
|
|
720
|
+
grouped? ? settlement_payments.pending : pending_payments
|
|
721
|
+
end
|
|
722
|
+
|
|
723
|
+
# @return [Boolean] whether this order was placed alongside others in one
|
|
724
|
+
# checkout, and therefore shares their payment
|
|
725
|
+
def grouped?
|
|
726
|
+
order_group_id.present?
|
|
727
|
+
end
|
|
728
|
+
|
|
729
|
+
# This order and any placed alongside it in the same checkout.
|
|
730
|
+
#
|
|
731
|
+
# The set anything counting *checkouts* rather than orders works from — a
|
|
732
|
+
# promotion's usage limit, for one, which must not be spent several times
|
|
733
|
+
# over because a basket happened to span several sellers.
|
|
734
|
+
#
|
|
735
|
+
# @return [Array<Integer>]
|
|
736
|
+
def sibling_order_ids
|
|
737
|
+
return [id] unless grouped?
|
|
738
|
+
|
|
739
|
+
order_group.orders.ids
|
|
740
|
+
end
|
|
741
|
+
|
|
742
|
+
# This order's share of one payment made against its group.
|
|
743
|
+
#
|
|
744
|
+
# @param payment [Spree::Payment]
|
|
745
|
+
# @return [Spree::PaymentSplit, nil]
|
|
746
|
+
def payment_split_for(payment)
|
|
747
|
+
payment_splits.find_by(payment_id: payment.id)
|
|
613
748
|
end
|
|
614
749
|
|
|
615
750
|
def name
|
|
@@ -619,8 +754,8 @@ module Spree
|
|
|
619
754
|
end
|
|
620
755
|
|
|
621
756
|
def full_name
|
|
622
|
-
@full_name ||= if
|
|
623
|
-
|
|
757
|
+
@full_name ||= if customer.present? && customer.name.present?
|
|
758
|
+
customer.full_name
|
|
624
759
|
else
|
|
625
760
|
billing_address&.full_name || email
|
|
626
761
|
end
|
|
@@ -646,62 +781,38 @@ module Spree
|
|
|
646
781
|
def backordered_variants
|
|
647
782
|
variants.
|
|
648
783
|
where(track_inventory: true).
|
|
649
|
-
joins(:
|
|
650
|
-
where(Spree::
|
|
784
|
+
joins(:stock_levels, :product).
|
|
785
|
+
where(Spree::StockLevel.table_name => { backorderable: true }).
|
|
786
|
+
where("#{Spree::StockLevel.table_name}.count_on_hand - #{Spree::StockLevel.table_name}.allocated_count <= ?", 0)
|
|
651
787
|
end
|
|
652
788
|
|
|
653
789
|
def can_ship?
|
|
654
|
-
|
|
790
|
+
placed?
|
|
655
791
|
end
|
|
656
792
|
|
|
657
793
|
def uneditable?
|
|
658
|
-
|
|
794
|
+
completed? || canceled?
|
|
659
795
|
end
|
|
660
796
|
|
|
661
797
|
# Finalizes an in progress order after checkout is complete.
|
|
662
798
|
# Called after transition to complete state when payments will have been processed
|
|
799
|
+
# @deprecated Completion lives in {Spree::Orders::Complete} (checkout
|
|
800
|
+
# reaches it through +Spree.carts_complete_workflow+). Removed in 6.1.
|
|
663
801
|
def finalize!
|
|
664
|
-
#
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
# update payment and shipment(s) states, and save
|
|
668
|
-
updater.update_payment_state
|
|
669
|
-
shipments.each do |shipment|
|
|
670
|
-
shipment.update!(self)
|
|
671
|
-
shipment.finalize!
|
|
672
|
-
end
|
|
673
|
-
|
|
674
|
-
updater.update_shipment_state
|
|
675
|
-
self.status = 'placed'
|
|
676
|
-
save!
|
|
677
|
-
updater.run_hooks
|
|
678
|
-
|
|
679
|
-
touch :completed_at
|
|
680
|
-
|
|
681
|
-
send_order_placed_webhook
|
|
682
|
-
|
|
683
|
-
consider_risk
|
|
684
|
-
|
|
685
|
-
publish_order_completed_event
|
|
802
|
+
Spree::Deprecation.warn('Spree::Order#finalize! is deprecated and will be removed in Spree 6.1. Completion runs through Spree.order_complete_workflow (Spree::Orders::Complete).')
|
|
803
|
+
Spree.order_complete_workflow.call(order: self, payment_pending: true)
|
|
686
804
|
end
|
|
687
805
|
|
|
688
806
|
def fulfill!
|
|
689
|
-
|
|
690
|
-
updater.update_shipment_state
|
|
807
|
+
fulfillments.each { |shipment| shipment.update!(self) if shipment.persisted? }
|
|
691
808
|
save!
|
|
809
|
+
update_statuses!
|
|
692
810
|
end
|
|
693
811
|
|
|
694
|
-
# Helper methods for checkout steps
|
|
695
|
-
def paid?
|
|
696
|
-
payments.valid.completed.size == payments.valid.size && payments.valid.sum(:amount) >= total
|
|
697
|
-
end
|
|
698
812
|
|
|
699
|
-
def payment_methods
|
|
700
|
-
@payment_methods ||= store.payment_methods.active.available_on_front_end.select { |pm| pm.available_for_order?(self) }
|
|
701
|
-
end
|
|
702
813
|
|
|
703
814
|
def available_payment_methods(store = nil)
|
|
704
|
-
Spree::Deprecation.warn('`Order#available_payment_methods` is deprecated and will be removed in Spree
|
|
815
|
+
Spree::Deprecation.warn('`Order#available_payment_methods` is deprecated and will be removed in Spree 6.1. Use `payment_methods` instead.')
|
|
705
816
|
|
|
706
817
|
@available_payment_methods ||= collect_payment_methods(store)
|
|
707
818
|
end
|
|
@@ -713,99 +824,111 @@ module Spree
|
|
|
713
824
|
##
|
|
714
825
|
# Check to see if any line item variants are discontinued.
|
|
715
826
|
# If so add error and restart checkout.
|
|
827
|
+
# @deprecated Completion validation lives in
|
|
828
|
+
# {Spree::Checkout::DefaultRequirements} (the +discontinued+ stock
|
|
829
|
+
# error). Removed in 6.1.
|
|
716
830
|
def ensure_line_item_variants_are_not_discontinued
|
|
831
|
+
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.')
|
|
717
832
|
if line_items.any? { |li| !li.variant || li.variant.discontinued? }
|
|
718
|
-
|
|
719
|
-
errors.add(:base, Spree.t(:discontinued_variants_present))
|
|
833
|
+
errors.add(:base, :discontinued_variants_present, message: Spree.t(:discontinued_variants_present))
|
|
720
834
|
false
|
|
721
835
|
else
|
|
722
836
|
true
|
|
723
837
|
end
|
|
724
838
|
end
|
|
725
839
|
|
|
840
|
+
# @deprecated Completion validation lives in
|
|
841
|
+
# {Spree::Checkout::DefaultRequirements} (the +out_of_stock+ stock
|
|
842
|
+
# error). Removed in 6.1.
|
|
726
843
|
def ensure_line_items_are_in_stock
|
|
844
|
+
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.')
|
|
727
845
|
if insufficient_stock_lines.present?
|
|
728
|
-
|
|
729
|
-
errors.add(:base, Spree.t(:insufficient_stock_lines_present))
|
|
846
|
+
errors.add(:base, :insufficient_stock_lines_present, message: Spree.t(:insufficient_stock_lines_present))
|
|
730
847
|
false
|
|
731
848
|
else
|
|
732
849
|
true
|
|
733
850
|
end
|
|
734
851
|
end
|
|
735
852
|
|
|
736
|
-
def empty!
|
|
737
|
-
raise Spree.t(:cannot_empty_completed_order) if completed?
|
|
738
|
-
|
|
739
|
-
result = Spree.cart_empty_service.call(order: self)
|
|
740
|
-
result.value
|
|
741
|
-
end
|
|
742
|
-
|
|
743
853
|
def use_all_coupon_codes
|
|
854
|
+
Spree::Deprecation.warn('Spree::Order#use_all_coupon_codes is deprecated and will be removed in Spree 6.1. Use Spree::CouponCodes::CouponCodesHandler instead.')
|
|
744
855
|
Spree::CouponCodes::CouponCodesHandler.new(order: self).use_all_codes
|
|
745
856
|
end
|
|
746
857
|
|
|
747
|
-
|
|
748
|
-
checkout_steps.include?(step)
|
|
749
|
-
end
|
|
858
|
+
normalizes :coupon_code, with: ->(code) { code.to_s.strip.downcase.presence }
|
|
750
859
|
|
|
751
|
-
def
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
old_state = send("#{state}_was")
|
|
755
|
-
new_state = send(state)
|
|
756
|
-
unless old_state == new_state
|
|
757
|
-
log_state_changes(state_name: name, old_state: old_state, new_state: new_state)
|
|
758
|
-
end
|
|
759
|
-
end
|
|
760
|
-
end
|
|
761
|
-
|
|
762
|
-
def log_state_changes(state_name:, old_state:, new_state:)
|
|
763
|
-
state_changes.create(
|
|
764
|
-
previous_state: old_state,
|
|
765
|
-
next_state: new_state,
|
|
766
|
-
name: state_name,
|
|
767
|
-
user_id: user_id
|
|
768
|
-
)
|
|
860
|
+
def can_add_coupon?
|
|
861
|
+
Spree::Deprecation.warn('Spree::Order#can_add_coupon? is deprecated and will be removed in Spree 6.1. Use Spree::Promotion.order_activatable? instead.')
|
|
862
|
+
Spree::Promotion.order_activatable?(self)
|
|
769
863
|
end
|
|
770
864
|
|
|
771
|
-
def
|
|
772
|
-
|
|
773
|
-
code.strip.downcase
|
|
774
|
-
rescue StandardError
|
|
775
|
-
nil
|
|
776
|
-
end
|
|
865
|
+
def shipped?
|
|
866
|
+
%w(partial shipped fulfilled delivered).include?(fulfillment_status)
|
|
777
867
|
end
|
|
778
868
|
|
|
779
|
-
|
|
780
|
-
|
|
869
|
+
# True when every fulfillment has left the merchant's hands — the signal
|
|
870
|
+
# order.fulfilled publishes on. `delivered` counts: it is downstream of
|
|
871
|
+
# fulfilled, so a delivered order must not read as un-fulfilled.
|
|
872
|
+
def fully_fulfilled?
|
|
873
|
+
fulfillments.fulfilled_or_delivered.size == fulfillments.size
|
|
781
874
|
end
|
|
782
875
|
|
|
783
|
-
|
|
784
|
-
|
|
876
|
+
# True when every fulfillment reached confirmed receipt — the signal
|
|
877
|
+
# order.delivered publishes on.
|
|
878
|
+
def fully_delivered?
|
|
879
|
+
total = fulfillments.size
|
|
880
|
+
total.positive? && fulfillments.delivered.size == total
|
|
785
881
|
end
|
|
786
882
|
|
|
883
|
+
# @deprecated Use {#fully_fulfilled?}; removed in 6.1.
|
|
787
884
|
def fully_shipped?
|
|
788
|
-
|
|
885
|
+
Spree::Deprecation.warn('Spree::Order#fully_shipped? is deprecated and will be removed in Spree 6.1. Use #fully_fulfilled? instead.')
|
|
886
|
+
fully_fulfilled?
|
|
789
887
|
end
|
|
790
888
|
|
|
791
|
-
def
|
|
792
|
-
|
|
889
|
+
def rebuild_fulfillments!
|
|
890
|
+
discounts.for_fulfillments.delete_all
|
|
891
|
+
tax_lines.for_fulfillments.delete_all
|
|
892
|
+
fees.for_fulfillments.delete_all
|
|
793
893
|
|
|
794
|
-
shipment_ids =
|
|
795
|
-
|
|
796
|
-
ShippingRate.where(shipment_id: shipment_ids).delete_all
|
|
894
|
+
shipment_ids = fulfillments.map(&:id)
|
|
895
|
+
DeliveryRate.where(fulfillment_id: shipment_ids).delete_all
|
|
797
896
|
|
|
798
|
-
|
|
897
|
+
fulfillments.delete_all
|
|
799
898
|
|
|
800
899
|
# Inventory Units which are not associated to any shipment (unshippable)
|
|
801
900
|
# and are not returned or shipped should be deleted
|
|
802
|
-
|
|
901
|
+
fulfillment_items.on_hand_or_backordered.delete_all
|
|
803
902
|
|
|
804
|
-
self.
|
|
805
|
-
package.
|
|
903
|
+
self.fulfillments = order_routing_strategy.for_allocation.map do |package|
|
|
904
|
+
package.to_fulfillment.tap { |fulfillment| fulfillment.address_id = ship_address_id }
|
|
806
905
|
end
|
|
807
906
|
end
|
|
808
907
|
|
|
908
|
+
# @deprecated Use {#rebuild_fulfillments!}; removed in 6.1.
|
|
909
|
+
def create_proposed_fulfillments
|
|
910
|
+
Spree::Deprecation.warn('Spree::Order#create_proposed_fulfillments is deprecated and will be removed in Spree 6.1. Use #rebuild_fulfillments! instead.')
|
|
911
|
+
rebuild_fulfillments!
|
|
912
|
+
end
|
|
913
|
+
|
|
914
|
+
# @deprecated Use {#rebuild_fulfillments!}; removed in 6.1.
|
|
915
|
+
def create_proposed_shipments
|
|
916
|
+
Spree::Deprecation.warn('Spree::Order#create_proposed_shipments is deprecated and will be removed in Spree 6.1. Use #rebuild_fulfillments! instead.')
|
|
917
|
+
rebuild_fulfillments!
|
|
918
|
+
end
|
|
919
|
+
|
|
920
|
+
# @deprecated Use {#delivery_step_required?}; removed in 6.1.
|
|
921
|
+
def delivery_required?
|
|
922
|
+
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.')
|
|
923
|
+
delivery_step_required?
|
|
924
|
+
end
|
|
925
|
+
|
|
926
|
+
# @deprecated Use {#shipping_address_required?}; removed in 6.1.
|
|
927
|
+
def requires_ship_address?
|
|
928
|
+
Spree::Deprecation.warn('Spree::Order#requires_ship_address? is deprecated and will be removed in Spree 6.1. Use #shipping_address_required? instead.')
|
|
929
|
+
shipping_address_required?
|
|
930
|
+
end
|
|
931
|
+
|
|
809
932
|
# Resolves the routing strategy from the channel override first, then the
|
|
810
933
|
# store default. Only a registered Spree::OrderRouting::Strategy::Base
|
|
811
934
|
# subclass is used; any other value (an unregistered/typo'd class, or a
|
|
@@ -839,27 +962,35 @@ module Spree
|
|
|
839
962
|
@total_weight ||= line_items.joins(:variant).includes(:variant).map(&:item_weight).sum
|
|
840
963
|
end
|
|
841
964
|
|
|
842
|
-
# Returns line items that have no
|
|
965
|
+
# Returns line items that have no delivery rates
|
|
966
|
+
#
|
|
967
|
+
# Deliberately not memoized: callers destroy fulfillments between reads
|
|
968
|
+
# (see {#ensure_available_delivery_rates}), so a cached value would
|
|
969
|
+
# describe fulfillments that no longer exist.
|
|
843
970
|
#
|
|
844
971
|
# @return [Array<Spree::LineItem>]
|
|
845
|
-
def
|
|
846
|
-
|
|
847
|
-
|
|
972
|
+
def line_items_without_delivery_rates
|
|
973
|
+
fulfillments.map do |fulfillment|
|
|
974
|
+
fulfillment.manifest.map(&:line_item) if fulfillment.delivery_rates.blank?
|
|
848
975
|
end.flatten.compact
|
|
849
976
|
end
|
|
850
977
|
|
|
978
|
+
# @deprecated Use {#line_items_without_delivery_rates}; removed in 6.1.
|
|
979
|
+
def line_items_without_shipping_rates
|
|
980
|
+
Spree::Deprecation.warn('Spree::Order#line_items_without_shipping_rates is deprecated and will be removed in Spree 6.1. Use #line_items_without_delivery_rates instead.')
|
|
981
|
+
line_items_without_delivery_rates
|
|
982
|
+
end
|
|
983
|
+
|
|
851
984
|
# Checks if all line items cannot be shipped
|
|
852
985
|
#
|
|
853
986
|
# @returns Boolean
|
|
854
987
|
def all_line_items_invalid?
|
|
855
|
-
|
|
988
|
+
line_items_without_delivery_rates.size == line_items.count
|
|
856
989
|
end
|
|
857
990
|
|
|
858
991
|
def apply_free_shipping_promotions
|
|
859
992
|
Spree::PromotionHandler::FreeShipping.new(self).activate
|
|
860
|
-
|
|
861
|
-
create_shipment_tax_charge!
|
|
862
|
-
update_with_updater!
|
|
993
|
+
recalculate_totals!
|
|
863
994
|
end
|
|
864
995
|
|
|
865
996
|
# Applies user promotions when login after filling the cart
|
|
@@ -867,55 +998,61 @@ module Spree
|
|
|
867
998
|
::Spree::PromotionHandler::Cart.new(self).activate
|
|
868
999
|
end
|
|
869
1000
|
|
|
870
|
-
#
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
def ensure_updated_shipments
|
|
876
|
-
if shipments.any? && !completed?
|
|
877
|
-
shipments.destroy_all
|
|
878
|
-
update_column(:shipment_total, 0)
|
|
1001
|
+
# Drops stale fulfillments so they are rebuilt from current items.
|
|
1002
|
+
def ensure_updated_fulfillments
|
|
1003
|
+
if fulfillments.any? && !completed?
|
|
1004
|
+
fulfillments.destroy_all
|
|
1005
|
+
update_column(:delivery_total, 0)
|
|
879
1006
|
|
|
880
1007
|
# Manually publish update event since update_column bypasses callbacks
|
|
881
1008
|
publish_event('order.updated')
|
|
882
|
-
|
|
883
|
-
restart_checkout_flow
|
|
884
1009
|
end
|
|
885
1010
|
end
|
|
886
1011
|
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
)
|
|
892
|
-
|
|
893
|
-
# Manually publish update event since update_columns bypasses callbacks
|
|
894
|
-
publish_event('order.updated')
|
|
895
|
-
|
|
896
|
-
next! unless line_items.empty?
|
|
1012
|
+
# @deprecated Use {#ensure_updated_fulfillments}; removed in 6.1.
|
|
1013
|
+
def ensure_updated_shipments
|
|
1014
|
+
Spree::Deprecation.warn('Spree::Order#ensure_updated_fulfillments is deprecated and will be removed in Spree 6.1. Use #ensure_updated_fulfillments instead.')
|
|
1015
|
+
ensure_updated_fulfillments
|
|
897
1016
|
end
|
|
898
1017
|
|
|
899
|
-
|
|
900
|
-
|
|
1018
|
+
# Re-quotes every fulfillment for the given audience.
|
|
1019
|
+
#
|
|
1020
|
+
# @param audience [Symbol] {Spree::DeliveryMethod::STOREFRONT} (default)
|
|
1021
|
+
# or {Spree::DeliveryMethod::BACKOFFICE}
|
|
1022
|
+
# @return [Array<Array<Spree::DeliveryRate>>]
|
|
1023
|
+
def refresh_delivery_rates(audience = DeliveryMethod::STOREFRONT)
|
|
1024
|
+
fulfillments.map { |fulfillment| fulfillment.refresh_rates(audience) }
|
|
901
1025
|
end
|
|
902
1026
|
|
|
903
|
-
|
|
904
|
-
|
|
1027
|
+
# @deprecated Use {#refresh_delivery_rates}; removed in 6.1.
|
|
1028
|
+
def refresh_shipment_rates(audience = DeliveryMethod::STOREFRONT)
|
|
1029
|
+
Spree::Deprecation.warn('Spree::Order#refresh_shipment_rates is deprecated and will be removed in Spree 6.1. Use #refresh_delivery_rates instead.')
|
|
1030
|
+
refresh_delivery_rates(audience)
|
|
905
1031
|
end
|
|
906
1032
|
|
|
907
1033
|
def set_shipments_cost
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
1034
|
+
Spree::Deprecation.warn('Spree::Order#set_shipments_cost is deprecated and will be removed in Spree 6.1l. Please use set_fulfillments_cost instead')
|
|
1035
|
+
set_fulfillments_cost
|
|
1036
|
+
end
|
|
1037
|
+
|
|
1038
|
+
def set_fulfillments_cost
|
|
1039
|
+
fulfillments.each(&:update_amounts)
|
|
1040
|
+
recalculate_totals!
|
|
912
1041
|
end
|
|
913
1042
|
|
|
914
1043
|
def shipping_method
|
|
915
|
-
#
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
1044
|
+
Spree::Deprecation.warn('Spree::Order#shipping_method is deprecated and will be removed in Spree 6.1. Please use Spree::Order#delivery_method')
|
|
1045
|
+
delivery_method
|
|
1046
|
+
end
|
|
1047
|
+
|
|
1048
|
+
# Returns first available delivery method from the fulfillments
|
|
1049
|
+
# Useful for analytics and CSV exports
|
|
1050
|
+
# @return [Spree::DeliveryMethod]
|
|
1051
|
+
def delivery_method
|
|
1052
|
+
# This query will select the first available delivery method from the fulfillments.
|
|
1053
|
+
# It will use subquery to first select the delivery method id from the fulfillments' selected_delivery_rate.
|
|
1054
|
+
Spree::DeliveryMethod.
|
|
1055
|
+
where(id: fulfillments.with_selected_delivery_method.limit(1).pluck(:delivery_method_id)).
|
|
919
1056
|
limit(1).
|
|
920
1057
|
first
|
|
921
1058
|
end
|
|
@@ -925,19 +1062,34 @@ module Spree
|
|
|
925
1062
|
end
|
|
926
1063
|
|
|
927
1064
|
# Cancels the order and records the canceler.
|
|
928
|
-
# Delegates to {Spree::Orders::Cancel}
|
|
1065
|
+
# Delegates to {Spree::Orders::Cancel} workflow.
|
|
929
1066
|
#
|
|
930
|
-
# @
|
|
1067
|
+
# @deprecated Call {Spree.order_cancel_workflow} directly — it exposes the
|
|
1068
|
+
# full cancellation vocabulary (reason, note, refund_payments,
|
|
1069
|
+
# notify_customer) this wrapper cannot pass through.
|
|
1070
|
+
# @param user [Spree.customer_class, nil] the user who canceled the order
|
|
931
1071
|
# @param canceled_at [Time, nil] the time of cancellation (defaults to current time)
|
|
932
1072
|
# @return [Spree::ServiceModule::Result]
|
|
933
1073
|
def canceled_by(user, canceled_at = nil)
|
|
934
|
-
Spree.
|
|
1074
|
+
Spree::Deprecation.warn('Spree::Order#canceled_by is deprecated and will be removed in Spree 6.1. Use Spree.order_cancel_workflow (Spree::Orders::Cancel) instead.')
|
|
1075
|
+
Spree.order_cancel_workflow.call(order: self, canceler: user, canceled_at: canceled_at)
|
|
1076
|
+
end
|
|
1077
|
+
|
|
1078
|
+
# Machine-free lifecycle: cancellation runs through the
|
|
1079
|
+
# {Spree::Orders::Cancel} workflow. There is no way back — a canceled
|
|
1080
|
+
# order stays canceled, as it does on every comparable platform.
|
|
1081
|
+
def cancel
|
|
1082
|
+
Spree.order_cancel_workflow.call(order: self).success?
|
|
1083
|
+
end
|
|
1084
|
+
|
|
1085
|
+
def cancel!
|
|
1086
|
+
cancel || raise(ActiveRecord::RecordInvalid.new(self))
|
|
935
1087
|
end
|
|
936
1088
|
|
|
937
1089
|
# Approves the order and records the approver.
|
|
938
1090
|
# Delegates to {Spree::Orders::Approve} service.
|
|
939
1091
|
#
|
|
940
|
-
# @param user [Spree.
|
|
1092
|
+
# @param user [Spree.customer_class, nil] the user who approved the order
|
|
941
1093
|
# @return [Spree::ServiceModule::Result]
|
|
942
1094
|
def approved_by(user = nil)
|
|
943
1095
|
Spree.order_approve_service.call(order: self, approver: user)
|
|
@@ -951,14 +1103,6 @@ module Spree
|
|
|
951
1103
|
!approved?
|
|
952
1104
|
end
|
|
953
1105
|
|
|
954
|
-
def can_be_destroyed?
|
|
955
|
-
Spree::Deprecation.warn('Spree::Order#can_be_destroyed? is deprecated and will be removed in the next major version. Use Spree::Order#can_be_deleted? instead.')
|
|
956
|
-
can_be_deleted?
|
|
957
|
-
end
|
|
958
|
-
|
|
959
|
-
def can_be_deleted?
|
|
960
|
-
!completed? && payments.completed.empty?
|
|
961
|
-
end
|
|
962
1106
|
|
|
963
1107
|
def consider_risk
|
|
964
1108
|
considered_risky! if is_risky? && !approved?
|
|
@@ -979,26 +1123,10 @@ module Spree
|
|
|
979
1123
|
Spree.order_approve_service.call(order: self)
|
|
980
1124
|
end
|
|
981
1125
|
|
|
982
|
-
def tax_total
|
|
983
|
-
included_tax_total + additional_tax_total
|
|
984
|
-
end
|
|
985
|
-
|
|
986
|
-
def quantity
|
|
987
|
-
line_items.sum(:quantity)
|
|
988
|
-
end
|
|
989
|
-
|
|
990
|
-
def has_non_reimbursement_related_refunds?
|
|
991
|
-
refunds.non_reimbursement.exists? ||
|
|
992
|
-
payments.offset_payment.exists? # how old versions of spree stored refunds
|
|
993
|
-
end
|
|
994
|
-
|
|
995
1126
|
def collect_backend_payment_methods
|
|
996
|
-
store.payment_methods.active.
|
|
1127
|
+
store.payment_methods.active.select { |pm| pm.available_for_order?(self) }
|
|
997
1128
|
end
|
|
998
1129
|
|
|
999
|
-
def collect_frontend_payment_methods
|
|
1000
|
-
store.payment_methods.active.available_on_front_end.select { |pm| pm.available_for_order?(self) }
|
|
1001
|
-
end
|
|
1002
1130
|
|
|
1003
1131
|
# determines whether the inventory is fully discounted
|
|
1004
1132
|
#
|
|
@@ -1023,9 +1151,7 @@ module Spree
|
|
|
1023
1151
|
# Returns the IDs of the valid promotions for the order
|
|
1024
1152
|
# @return [Array<Integer>]
|
|
1025
1153
|
def valid_promotion_ids
|
|
1026
|
-
|
|
1027
|
-
joins("INNER JOIN #{Spree::PromotionAction.table_name} ON #{Spree::PromotionAction.table_name}.id = #{Spree::Adjustment.table_name}.source_id").
|
|
1028
|
-
pluck("#{Spree::PromotionAction.table_name}.promotion_id").compact.uniq
|
|
1154
|
+
discounts.promotion.nonzero.where.not(promotion_id: nil).distinct.pluck(:promotion_id)
|
|
1029
1155
|
end
|
|
1030
1156
|
|
|
1031
1157
|
# Returns the valid coupon promotions for the order
|
|
@@ -1037,43 +1163,50 @@ module Spree
|
|
|
1037
1163
|
end
|
|
1038
1164
|
|
|
1039
1165
|
# Returns item and whole order discount amount for Order
|
|
1040
|
-
# without
|
|
1166
|
+
# without fulfillment discounts (eg. Free Shipping)
|
|
1041
1167
|
# @return [BigDecimal]
|
|
1042
1168
|
def cart_promo_total
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
sum(:amount)
|
|
1169
|
+
Spree::Deprecation.warn('Spree::Order#cart_promo_total is deprecated and will be removed in Spree 6.1. Please use order.cart.discount_total instead')
|
|
1170
|
+
discounts.promotion.nonzero.for_line_items.sum(:amount)
|
|
1046
1171
|
end
|
|
1047
1172
|
|
|
1048
1173
|
def has_free_shipping?
|
|
1049
|
-
|
|
1050
|
-
joins(:promotion_action).
|
|
1051
|
-
where(spree_adjustments: { eligible: true, source_type: 'Spree::PromotionAction' },
|
|
1052
|
-
spree_promotion_actions: { type: 'Spree::Promotion::Actions::FreeShipping' }).exists?
|
|
1174
|
+
discounts.promotion.for_fulfillments.exists?
|
|
1053
1175
|
end
|
|
1054
1176
|
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1177
|
+
# @param omit_headers [Array<String>] columns to leave out, named by their
|
|
1178
|
+
# header. A seller's export drops the buyer's email this way — see
|
|
1179
|
+
# Spree::Exports::Orders.
|
|
1180
|
+
def to_csv(store = nil, omit_headers: [])
|
|
1181
|
+
store ||= self.store
|
|
1182
|
+
# Through the shared helper so the value row is built from exactly the
|
|
1183
|
+
# definitions, in exactly the order, that Export#custom_fields_headers
|
|
1184
|
+
# used for the header row — a mismatch shifts every value column.
|
|
1185
|
+
custom_field_values = custom_fields_for_csv(self, store)
|
|
1059
1186
|
|
|
1060
1187
|
csv_lines = []
|
|
1061
|
-
|
|
1062
|
-
csv_lines << Spree::CSV::OrderLineItemPresenter.new(
|
|
1188
|
+
line_items.each_with_index do |line_item, index|
|
|
1189
|
+
csv_lines << Spree::CSV::OrderLineItemPresenter.new(
|
|
1190
|
+
self, line_item, index, custom_field_values, omit_headers: omit_headers
|
|
1191
|
+
).call
|
|
1063
1192
|
end
|
|
1064
1193
|
csv_lines
|
|
1065
1194
|
end
|
|
1066
1195
|
|
|
1067
1196
|
def all_line_items
|
|
1197
|
+
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')
|
|
1068
1198
|
line_items
|
|
1069
1199
|
end
|
|
1070
1200
|
|
|
1071
|
-
def requires_ship_address?
|
|
1072
|
-
!digital?
|
|
1073
|
-
end
|
|
1074
|
-
|
|
1075
1201
|
private
|
|
1076
1202
|
|
|
1203
|
+
def ensure_can_be_deleted
|
|
1204
|
+
return true if can_be_deleted?
|
|
1205
|
+
|
|
1206
|
+
errors.add(:base, :order_cannot_be_deleted, message: Spree.t(:order_cannot_be_deleted))
|
|
1207
|
+
throw :abort
|
|
1208
|
+
end
|
|
1209
|
+
|
|
1077
1210
|
def valid_order_routing_strategy_class(klass_name)
|
|
1078
1211
|
return if klass_name.blank?
|
|
1079
1212
|
|
|
@@ -1088,30 +1221,36 @@ module Spree
|
|
|
1088
1221
|
end
|
|
1089
1222
|
|
|
1090
1223
|
def link_by_email
|
|
1091
|
-
self.email =
|
|
1224
|
+
self.email = customer.email if customer
|
|
1092
1225
|
end
|
|
1093
1226
|
|
|
1094
1227
|
# Determine if email is required (we don't want validation errors before we hit the checkout)
|
|
1095
1228
|
# we need to add delivery to the list for quick checkouts
|
|
1096
1229
|
def require_email
|
|
1097
|
-
|
|
1230
|
+
!new_record? && (completed? || placed?)
|
|
1098
1231
|
end
|
|
1099
1232
|
|
|
1100
1233
|
def ensure_line_items_present
|
|
1101
1234
|
unless line_items.present?
|
|
1102
|
-
errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) && (return false)
|
|
1235
|
+
errors.add(:base, :there_are_no_items_for_this_order, message: Spree.t(:there_are_no_items_for_this_order)) && (return false)
|
|
1103
1236
|
end
|
|
1104
1237
|
end
|
|
1105
1238
|
|
|
1106
|
-
def
|
|
1107
|
-
|
|
1239
|
+
def ensure_available_delivery_rates
|
|
1240
|
+
# Captured before destroy_all — afterwards there are no fulfillments
|
|
1241
|
+
# left to derive the undeliverable items from.
|
|
1242
|
+
undeliverable_line_items = line_items_without_delivery_rates
|
|
1243
|
+
|
|
1244
|
+
if fulfillments.empty? || undeliverable_line_items.present?
|
|
1108
1245
|
# After this point, order redirects back to 'address' state and asks user to pick a proper address
|
|
1109
1246
|
# Therefore, shipments are not necessary at this point.
|
|
1110
|
-
|
|
1247
|
+
fulfillments.destroy_all
|
|
1111
1248
|
|
|
1112
|
-
if
|
|
1113
|
-
|
|
1114
|
-
|
|
1249
|
+
if undeliverable_line_items.present?
|
|
1250
|
+
product_names = undeliverable_line_items.map(&:name).to_sentence
|
|
1251
|
+
errors.add(:base, :products_cannot_be_shipped, product_names: product_names,
|
|
1252
|
+
message: Spree.t(:products_cannot_be_shipped, product_names: product_names))
|
|
1253
|
+
self.warnings |= undeliverable_line_items.map do |line_item|
|
|
1115
1254
|
{
|
|
1116
1255
|
code: 'delivery_unavailable',
|
|
1117
1256
|
message: Spree.t('cart_line_item.delivery_unavailable', li_name: line_item.name),
|
|
@@ -1120,7 +1259,7 @@ module Spree
|
|
|
1120
1259
|
}
|
|
1121
1260
|
end
|
|
1122
1261
|
else
|
|
1123
|
-
errors.add(:base, Spree.t(:items_cannot_be_shipped))
|
|
1262
|
+
errors.add(:base, :items_cannot_be_shipped, message: Spree.t(:items_cannot_be_shipped))
|
|
1124
1263
|
self.warnings |= [{ code: 'delivery_unavailable', message: Spree.t(:items_cannot_be_shipped) }]
|
|
1125
1264
|
end
|
|
1126
1265
|
|
|
@@ -1128,85 +1267,10 @@ module Spree
|
|
|
1128
1267
|
end
|
|
1129
1268
|
end
|
|
1130
1269
|
|
|
1131
|
-
def after_cancel
|
|
1132
|
-
update_column(:status, 'canceled')
|
|
1133
|
-
|
|
1134
|
-
shipments.each(&:cancel!)
|
|
1135
|
-
|
|
1136
|
-
# payments fully covered by gift card won't be refunded
|
|
1137
|
-
# we want to only void the payment
|
|
1138
|
-
if gift_card.present? && covered_by_store_credit?
|
|
1139
|
-
payments.completed.store_credits.each(&:void!)
|
|
1140
|
-
else
|
|
1141
|
-
payments.completed.each(&:cancel!)
|
|
1142
|
-
payments.incomplete.not_store_credits.each(&:void_transaction!)
|
|
1143
|
-
payments.store_credits.pending.each(&:void!)
|
|
1144
|
-
end
|
|
1145
|
-
|
|
1146
|
-
update_with_updater!
|
|
1147
|
-
send_order_canceled_webhook
|
|
1148
|
-
end
|
|
1149
|
-
|
|
1150
|
-
def after_resume
|
|
1151
|
-
update_column(:status, 'placed')
|
|
1152
|
-
|
|
1153
|
-
shipments.each(&:resume!)
|
|
1154
|
-
consider_risk
|
|
1155
|
-
send_order_resumed_webhook
|
|
1156
|
-
publish_order_resumed_event
|
|
1157
|
-
end
|
|
1158
|
-
|
|
1159
|
-
def use_billing?
|
|
1160
|
-
use_billing.in?([true, 'true', '1'])
|
|
1161
|
-
end
|
|
1162
|
-
|
|
1163
|
-
def use_shipping?
|
|
1164
|
-
use_shipping.in?([true, 'true', '1'])
|
|
1165
|
-
end
|
|
1166
|
-
|
|
1167
|
-
def ensure_currency_presence
|
|
1168
|
-
self.currency ||= store&.default_currency
|
|
1169
|
-
end
|
|
1170
|
-
|
|
1171
|
-
# Sets the locale from Spree::Current.locale when not already set.
|
|
1172
|
-
# Called as a before_validation callback, mirroring ensure_currency_presence.
|
|
1173
|
-
def ensure_locale_presence
|
|
1174
|
-
self.locale ||= Spree::Current.locale
|
|
1175
|
-
end
|
|
1176
|
-
|
|
1177
|
-
def currency_must_be_supported_by_store
|
|
1178
|
-
return if currency.blank? || store.blank?
|
|
1179
|
-
|
|
1180
|
-
supported_codes = store.supported_currencies_list.map(&:iso_code)
|
|
1181
|
-
unless supported_codes.include?(currency)
|
|
1182
|
-
errors.add(:currency, Spree.t(:currency_not_supported_by_store))
|
|
1183
|
-
end
|
|
1184
|
-
end
|
|
1185
|
-
|
|
1186
|
-
# Validates that the order's locale is within the store's supported locales.
|
|
1187
|
-
# Mirrors currency_must_be_supported_by_store.
|
|
1188
|
-
def locale_must_be_supported_by_store
|
|
1189
|
-
return if locale.blank? || store.blank?
|
|
1190
|
-
|
|
1191
|
-
unless store.supported_locales_list.include?(locale)
|
|
1192
|
-
errors.add(:locale, Spree.t(:locale_not_supported_by_store))
|
|
1193
|
-
end
|
|
1194
|
-
end
|
|
1195
|
-
|
|
1196
|
-
# When currency changes, auto-resolve the matching market.
|
|
1197
|
-
# Only applies when the store has markets configured.
|
|
1198
|
-
def resolve_market_from_currency
|
|
1199
|
-
return unless store_has_markets?
|
|
1200
|
-
return if market&.currency == currency
|
|
1201
|
-
|
|
1202
|
-
resolved = store.markets.find_by(currency: currency)
|
|
1203
|
-
self.market = resolved if resolved
|
|
1204
|
-
end
|
|
1205
|
-
|
|
1206
1270
|
def collect_payment_methods
|
|
1207
|
-
Spree::Deprecation.warn('`Order#collect_payment_methods` is deprecated and will be removed in Spree
|
|
1271
|
+
Spree::Deprecation.warn('`Order#collect_payment_methods` is deprecated and will be removed in Spree 6.1. Use `payment_methods` instead.')
|
|
1208
1272
|
|
|
1209
|
-
store.payment_methods.
|
|
1273
|
+
store.payment_methods.active.storefront_visible.select { |pm| pm.available_for_order?(self) }
|
|
1210
1274
|
end
|
|
1211
1275
|
|
|
1212
1276
|
def credit_card_nil_payment?(attributes)
|
|
@@ -1214,21 +1278,14 @@ module Spree
|
|
|
1214
1278
|
end
|
|
1215
1279
|
|
|
1216
1280
|
def recalculate_store_credit_payment
|
|
1217
|
-
|
|
1281
|
+
recalculate_totals! if using_store_credit?
|
|
1218
1282
|
|
|
1219
1283
|
if gift_card.present?
|
|
1220
1284
|
recalculate_gift_card
|
|
1221
1285
|
elsif using_store_credit?
|
|
1222
|
-
Spree.
|
|
1286
|
+
Spree.store_credit_apply_service.call(order: self)
|
|
1223
1287
|
end
|
|
1224
1288
|
end
|
|
1225
1289
|
|
|
1226
|
-
def publish_order_completed_event
|
|
1227
|
-
publish_event('order.completed', event_payload.merge(notify_customer: notify_customer))
|
|
1228
|
-
end
|
|
1229
|
-
|
|
1230
|
-
def publish_order_resumed_event
|
|
1231
|
-
publish_event('order.resumed')
|
|
1232
|
-
end
|
|
1233
1290
|
end
|
|
1234
1291
|
end
|