solidus_core 4.6.2 → 4.7.0
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/Rakefile +13 -13
- data/app/controllers/spree/base_controller.rb +2 -2
- data/app/helpers/spree/base_helper.rb +24 -24
- data/app/helpers/spree/checkout_helper.rb +7 -7
- data/app/helpers/spree/core/controller_helpers/auth.rb +1 -1
- data/app/helpers/spree/core/controller_helpers/common.rb +3 -2
- data/app/helpers/spree/core/controller_helpers/order.rb +3 -5
- data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +1 -2
- data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +10 -10
- data/app/helpers/spree/products_helper.rb +5 -5
- data/app/helpers/spree/store_helper.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +3 -3
- data/app/mailers/spree/order_mailer.rb +4 -4
- data/app/mailers/spree/reimbursement_mailer.rb +2 -2
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +5 -5
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +5 -5
- data/app/models/concerns/spree/active_storage_adapter.rb +2 -2
- data/app/models/concerns/spree/adjustment_source.rb +4 -4
- data/app/models/concerns/spree/display_money.rb +2 -2
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/preferences/persistable.rb +1 -1
- data/app/models/concerns/spree/ransackable_attributes.rb +1 -0
- data/app/models/concerns/spree/soft_deletable.rb +2 -1
- data/app/models/concerns/spree/state_change_tracking.rb +1 -1
- data/app/models/concerns/spree/user_address_book.rb +12 -12
- data/app/models/concerns/spree/user_methods.rb +9 -9
- data/app/models/concerns/spree/user_reporting.rb +1 -0
- data/app/models/spree/ability.rb +1 -1
- data/app/models/spree/address/name.rb +1 -1
- data/app/models/spree/address.rb +7 -7
- data/app/models/spree/adjustment.rb +11 -10
- data/app/models/spree/adjustment_reason.rb +2 -2
- data/app/models/spree/billing_integration.rb +2 -2
- data/app/models/spree/calculator/default_tax.rb +2 -2
- data/app/models/spree/calculator/flat_fee.rb +1 -1
- data/app/models/spree/calculator/flat_rate.rb +2 -2
- data/app/models/spree/calculator/returns/default_refund_amount.rb +3 -3
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +2 -2
- data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
- data/app/models/spree/calculator/shipping/flexi_rate.rb +8 -8
- data/app/models/spree/calculator/shipping/per_item.rb +3 -3
- data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
- data/app/models/spree/calculator.rb +31 -6
- data/app/models/spree/carton.rb +4 -4
- data/app/models/spree/classification.rb +2 -2
- data/app/models/spree/core/state_machines/order/class_methods.rb +3 -3
- data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +1 -1
- data/app/models/spree/country.rb +1 -1
- data/app/models/spree/credit_card.rb +27 -27
- data/app/models/spree/customer_return.rb +5 -4
- data/app/models/spree/distributed_amounts_handler.rb +1 -1
- data/app/models/spree/fulfilment_changer.rb +22 -22
- data/app/models/spree/image/active_storage_attachment.rb +2 -2
- data/app/models/spree/image/paperclip_attachment.rb +8 -8
- data/app/models/spree/in_memory_order_updater.rb +262 -0
- data/app/models/spree/inventory_unit.rb +11 -11
- data/app/models/spree/item_total.rb +1 -1
- data/app/models/spree/legacy_user.rb +2 -2
- data/app/models/spree/line_item.rb +21 -11
- data/app/models/spree/log_entry.rb +3 -3
- data/app/models/spree/mergeable_orders_finder.rb +44 -0
- data/app/models/spree/money.rb +2 -1
- data/app/models/spree/null_promotion_adjuster.rb +1 -1
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +2 -2
- data/app/models/spree/order/number_generator.rb +1 -1
- data/app/models/spree/order.rb +66 -64
- data/app/models/spree/order_cancellations.rb +1 -3
- data/app/models/spree/order_inventory.rb +5 -8
- data/app/models/spree/order_mutex.rb +1 -1
- data/app/models/spree/order_shipping.rb +1 -1
- data/app/models/spree/order_updater.rb +59 -37
- data/app/models/spree/payment/cancellation.rb +2 -2
- data/app/models/spree/payment/processing.rb +22 -22
- data/app/models/spree/payment.rb +25 -25
- data/app/models/spree/payment_capture_event.rb +2 -2
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +18 -18
- data/app/models/spree/payment_method/check.rb +3 -3
- data/app/models/spree/payment_method/credit_card.rb +1 -1
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +3 -3
- data/app/models/spree/payment_method/store_credit.rb +13 -13
- data/app/models/spree/payment_method.rb +12 -11
- data/app/models/spree/payment_source.rb +2 -2
- data/app/models/spree/permission_sets/dashboard_display.rb +3 -3
- data/app/models/spree/permission_sets/default_customer.rb +1 -1
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +7 -6
- data/app/models/spree/product/scopes.rb +23 -23
- data/app/models/spree/product.rb +37 -41
- data/app/models/spree/product_option_type.rb +2 -2
- data/app/models/spree/product_property.rb +3 -3
- data/app/models/spree/refund.rb +10 -10
- data/app/models/spree/refund_reason.rb +2 -2
- data/app/models/spree/reimbursement/credit.rb +1 -1
- data/app/models/spree/reimbursement.rb +8 -8
- data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +2 -2
- data/app/models/spree/return_authorization.rb +7 -6
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
- data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +6 -6
- data/app/models/spree/return_item.rb +31 -30
- data/app/models/spree/return_reason.rb +1 -1
- data/app/models/spree/role.rb +1 -1
- data/app/models/spree/role_user.rb +1 -1
- data/app/models/spree/shipment.rb +37 -29
- data/app/models/spree/shipping_method.rb +9 -9
- data/app/models/spree/shipping_method_category.rb +2 -2
- data/app/models/spree/shipping_rate.rb +12 -10
- data/app/models/spree/shipping_rate_tax.rb +5 -4
- data/app/models/spree/simple_order_contents.rb +2 -2
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/availability.rb +9 -9
- data/app/models/spree/stock/availability_validator.rb +3 -3
- data/app/models/spree/stock/differentiator.rb +2 -2
- data/app/models/spree/stock/estimator.rb +4 -4
- data/app/models/spree/stock/inventory_validator.rb +1 -1
- data/app/models/spree/stock/package.rb +3 -3
- data/app/models/spree/stock_item.rb +5 -5
- data/app/models/spree/stock_location.rb +6 -6
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/stock_quantities.rb +2 -2
- data/app/models/spree/store.rb +3 -3
- data/app/models/spree/store_credit.rb +30 -29
- data/app/models/spree/store_credit_category.rb +2 -2
- data/app/models/spree/store_credit_event.rb +6 -6
- data/app/models/spree/store_credit_reason.rb +1 -1
- data/app/models/spree/store_credit_type.rb +3 -3
- data/app/models/spree/store_selector/by_server_name.rb +1 -1
- data/app/models/spree/store_selector/legacy.rb +1 -1
- data/app/models/spree/tax/item_tax.rb +1 -0
- data/app/models/spree/tax/order_tax.rb +1 -0
- data/app/models/spree/tax_category.rb +3 -3
- data/app/models/spree/tax_rate.rb +5 -5
- data/app/models/spree/tax_rate_tax_category.rb +2 -2
- data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
- data/app/models/spree/taxon.rb +16 -17
- data/app/models/spree/taxon_brand_selector.rb +3 -3
- data/app/models/spree/unauthorized_redirect_handler.rb +1 -1
- data/app/models/spree/unit_cancel.rb +4 -4
- data/app/models/spree/user_address.rb +3 -3
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +6 -8
- data/app/models/spree/user_last_url_storer.rb +1 -1
- data/app/models/spree/variant/price_selector.rb +1 -1
- data/app/models/spree/variant/scopes.rb +9 -9
- data/app/models/spree/variant.rb +25 -25
- data/app/models/spree/variant_property_rule.rb +2 -2
- data/app/models/spree/variant_property_rule_condition.rb +1 -1
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
- data/app/models/spree/wallet/default_payment_builder.rb +1 -1
- data/app/models/spree/wallet_payment_source.rb +2 -2
- data/app/models/spree/zone.rb +18 -18
- data/app/models/spree/zone_member.rb +1 -1
- data/app/subscribers/spree/carton_shipped_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_cancel_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_confirmation_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/order_inventory_cancellation_mailer_subscriber.rb +2 -2
- data/app/subscribers/spree/reimbursement_mailer_subscriber.rb +2 -2
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/db_query_matchers.rb +9 -0
- data/config/initializers/friendly_id.rb +2 -2
- data/config/initializers/inflections.rb +1 -1
- data/config/initializers/money.rb +1 -1
- data/config/locales/en.yml +1 -0
- data/db/default/spree/countries.rb +7 -7
- data/db/default/spree/return_reasons.rb +11 -11
- data/db/default/spree/stock_locations.rb +1 -1
- data/db/default/spree/store_credit.rb +3 -4
- data/db/default/spree/stores.rb +1 -1
- data/db/default/spree/zones.rb +5 -5
- data/db/migrate/20160101010000_solidus_one_four.rb +16 -16
- data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +3 -3
- data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +7 -6
- data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +10 -10
- data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +6 -6
- data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +1 -1
- data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +4 -4
- data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +9 -16
- data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +1 -0
- data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +3 -3
- data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +1 -1
- data/db/migrate/20250214094207_add_reverse_charge_status_to_store.rb +1 -1
- data/db/migrate/20250225051308_add_vat_id_email_and_reverse_charge_status_to_addresses.rb +1 -1
- data/db/seeds.rb +3 -3
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +2 -2
- data/lib/generators/solidus/install/app_templates/authentication/devise.rb +3 -3
- data/lib/generators/solidus/install/app_templates/authentication/existing.rb +1 -1
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +1 -1
- data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +2 -2
- data/lib/generators/solidus/install/install_generator.rb +51 -51
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -0
- data/lib/generators/solidus/update/update_generator.rb +29 -29
- data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -6
- data/lib/generators/spree/dummy/dummy_generator.rb +22 -24
- data/lib/generators/spree/dummy/templates/rails/boot.rb +3 -3
- data/lib/generators/spree/dummy/templates/rails/test.rb +4 -4
- data/lib/solidus_core.rb +1 -1
- data/lib/spree/app_configuration.rb +59 -47
- data/lib/spree/bus.rb +1 -1
- data/lib/spree/config.rb +1 -1
- data/lib/spree/core/active_merchant_dependencies.rb +8 -8
- data/lib/spree/core/class_constantizer.rb +1 -1
- data/lib/spree/core/engine.rb +15 -15
- data/lib/spree/core/environment.rb +1 -1
- data/lib/spree/core/environment_extension.rb +2 -2
- data/lib/spree/core/importer/order.rb +15 -15
- data/lib/spree/core/importer/product.rb +4 -4
- data/lib/spree/core/importer.rb +2 -2
- data/lib/spree/core/null_promotion_configuration.rb +7 -7
- data/lib/spree/core/permalinks.rb +1 -1
- data/lib/spree/core/product_filters.rb +94 -93
- data/lib/spree/core/role_configuration.rb +3 -3
- data/lib/spree/core/search/base.rb +5 -6
- data/lib/spree/core/search/variant.rb +3 -3
- data/lib/spree/core/stock_configuration.rb +10 -49
- data/lib/spree/core/validators/email.rb +1 -1
- data/lib/spree/core/version.rb +3 -3
- data/lib/spree/core/versioned_value.rb +4 -6
- data/lib/spree/core.rb +49 -49
- data/lib/spree/deprecated_instance_variable_proxy.rb +1 -1
- data/lib/spree/deprecation.rb +1 -1
- data/lib/spree/deprecator.rb +2 -2
- data/lib/spree/i18n.rb +2 -2
- data/lib/spree/localized_number.rb +3 -3
- data/lib/spree/manipulative_query_monitor.rb +19 -0
- data/lib/spree/migrations.rb +2 -2
- data/lib/spree/permitted_attributes.rb +10 -10
- data/lib/spree/preferences/configuration.rb +5 -5
- data/lib/spree/preferences/preferable.rb +8 -10
- data/lib/spree/preferences/preferable_class_methods.rb +16 -16
- data/lib/spree/preferences/preference_differentiator.rb +1 -1
- data/lib/spree/preferences/scoped_store.rb +2 -2
- data/lib/spree/preferences/static_model_preferences.rb +2 -2
- data/lib/spree/preferences/store.rb +6 -6
- data/lib/spree/testing_support/ability_helpers.rb +30 -30
- data/lib/spree/testing_support/authorization_helpers.rb +6 -5
- data/lib/spree/testing_support/blacklist_urls.rb +1 -1
- data/lib/spree/testing_support/bus_helpers.rb +1 -1
- data/lib/spree/testing_support/capybara_driver.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +12 -12
- data/lib/spree/testing_support/common_rake.rb +17 -16
- data/lib/spree/testing_support/dummy_ability.rb +1 -1
- data/lib/spree/testing_support/dummy_app/migrations.rb +1 -1
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +5 -5
- data/lib/spree/testing_support/dummy_app/routes.rb +1 -1
- data/lib/spree/testing_support/dummy_app.rb +34 -34
- data/lib/spree/testing_support/extension_rake.rb +2 -2
- data/lib/spree/testing_support/factories/address_factory.rb +12 -12
- data/lib/spree/testing_support/factories/adjustment_factory.rb +7 -7
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/calculator_factory.rb +6 -6
- data/lib/spree/testing_support/factories/carton_factory.rb +1 -1
- data/lib/spree/testing_support/factories/country_factory.rb +3 -3
- data/lib/spree/testing_support/factories/credit_card_factory.rb +3 -3
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
- data/lib/spree/testing_support/factories/image_factory.rb +2 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -4
- data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
- data/lib/spree/testing_support/factories/option_type_factory.rb +2 -2
- data/lib/spree/testing_support/factories/option_value_factory.rb +2 -2
- data/lib/spree/testing_support/factories/order_factory.rb +16 -16
- data/lib/spree/testing_support/factories/payment_factory.rb +9 -9
- data/lib/spree/testing_support/factories/payment_method_factory.rb +10 -10
- data/lib/spree/testing_support/factories/price_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_factory.rb +2 -2
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/property_factory.rb +3 -3
- data/lib/spree/testing_support/factories/refund_factory.rb +2 -2
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +3 -3
- data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/role_factory.rb +2 -2
- data/lib/spree/testing_support/factories/shipment_factory.rb +3 -3
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +7 -7
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/state_factory.rb +4 -4
- data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_location_factory.rb +7 -7
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +3 -3
- data/lib/spree/testing_support/factories/stock_package_factory.rb +3 -3
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -8
- data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +6 -6
- data/lib/spree/testing_support/factories/store_factory.rb +2 -2
- data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/taxon_factory.rb +3 -3
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
- data/lib/spree/testing_support/factories/user_factory.rb +2 -2
- data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
- data/lib/spree/testing_support/factory_bot.rb +1 -1
- data/lib/spree/testing_support/flaky.rb +3 -2
- data/lib/spree/testing_support/flash.rb +2 -2
- data/lib/spree/testing_support/order_walkthrough.rb +7 -7
- data/lib/spree/testing_support/preferences.rb +1 -1
- data/lib/spree/testing_support/rake.rb +1 -1
- data/lib/spree/testing_support/shared_examples/calculator.rb +1 -1
- data/lib/spree/testing_support/shared_examples/gallery.rb +7 -7
- data/lib/spree/testing_support/shared_examples/order_factory.rb +9 -9
- data/lib/spree/testing_support/shared_examples/working_factory.rb +1 -1
- data/lib/spree/testing_support/translations.rb +1 -1
- data/lib/spree_core.rb +1 -1
- data/lib/tasks/payment_method.rake +2 -2
- data/solidus_core.gemspec +49 -49
- metadata +60 -54
|
@@ -4,7 +4,7 @@ module Spree
|
|
|
4
4
|
# The default `source` of a `Spree::Payment`.
|
|
5
5
|
#
|
|
6
6
|
class CreditCard < Spree::PaymentSource
|
|
7
|
-
belongs_to :user, class_name: Spree::UserClassHandle.new, foreign_key:
|
|
7
|
+
belongs_to :user, class_name: Spree::UserClassHandle.new, foreign_key: "user_id", optional: true
|
|
8
8
|
belongs_to :address, optional: true
|
|
9
9
|
|
|
10
10
|
before_save :set_last_digits
|
|
@@ -14,28 +14,28 @@ module Spree
|
|
|
14
14
|
attr_reader :number, :verification_value
|
|
15
15
|
attr_accessor :encrypted_data
|
|
16
16
|
|
|
17
|
-
validates :month, :year, numericality: {
|
|
17
|
+
validates :month, :year, numericality: {only_integer: true}, if: :require_card_numbers?, on: :create
|
|
18
18
|
validates :number, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
|
|
19
19
|
validates :name, presence: true, if: :require_card_numbers?, on: :create
|
|
20
20
|
validates :verification_value, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
|
|
21
21
|
|
|
22
|
-
scope :with_payment_profile, -> { where(
|
|
22
|
+
scope :with_payment_profile, -> { where("gateway_customer_profile_id IS NOT NULL") }
|
|
23
23
|
|
|
24
24
|
# Taken from ActiveMerchant
|
|
25
25
|
# https://github.com/activemerchant/active_merchant/blob/2f2acd4696e8de76057b5ed670b9aa022abc1187/lib/active_merchant/billing/credit_card_methods.rb#L5
|
|
26
26
|
CARD_TYPES = {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
27
|
+
"visa" => /^4\d{12}(\d{3})?(\d{3})?$/,
|
|
28
|
+
"master" => /^(5[1-5]\d{4}|677189|222[1-9]\d{2}|22[3-9]\d{3}|2[3-6]\d{4}|27[01]\d{3}|2720\d{2})\d{10}$/,
|
|
29
|
+
"discover" => /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
|
|
30
|
+
"american_express" => /^3[47]\d{13}$/,
|
|
31
|
+
"diners_club" => /^3(0[0-5]|[68]\d)\d{11}$/,
|
|
32
|
+
"jcb" => /^35(28|29|[3-8]\d)\d{12}$/,
|
|
33
|
+
"switch" => /^6759\d{12}(\d{2,3})?$/,
|
|
34
|
+
"solo" => /^6767\d{12}(\d{2,3})?$/,
|
|
35
|
+
"dankort" => /^5019\d{12}$/,
|
|
36
|
+
"maestro" => /^(5[06-8]|6\d)\d{10,17}$/,
|
|
37
|
+
"forbrugsforeningen" => /^600722\d{10}$/,
|
|
38
|
+
"laser" => /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
|
|
39
39
|
}.freeze
|
|
40
40
|
|
|
41
41
|
def address_attributes=(attributes)
|
|
@@ -50,9 +50,9 @@ module Spree
|
|
|
50
50
|
return unless expiry.present?
|
|
51
51
|
|
|
52
52
|
self[:month], self[:year] =
|
|
53
|
-
if
|
|
54
|
-
expiry.delete(
|
|
55
|
-
elsif match = expiry.match(/(\d{2})(\d{2,4})/) # will match mmyy and mmyyyy
|
|
53
|
+
if /\d{2}\s?\/\s?\d{2,4}/.match?(expiry) # will match mm/yy and mm / yyyy
|
|
54
|
+
expiry.delete(" ").split("/")
|
|
55
|
+
elsif (match = expiry.match(/(\d{2})(\d{2,4})/)) # will match mmyy and mmyyyy
|
|
56
56
|
[match[1], match[2]]
|
|
57
57
|
end
|
|
58
58
|
if self[:year]
|
|
@@ -68,12 +68,12 @@ module Spree
|
|
|
68
68
|
def number=(num)
|
|
69
69
|
@number =
|
|
70
70
|
if num.is_a?(String)
|
|
71
|
-
num.gsub(/[^0-9]/,
|
|
71
|
+
num.gsub(/[^0-9]/, "")
|
|
72
72
|
end
|
|
73
73
|
end
|
|
74
74
|
|
|
75
75
|
def verification_value=(value)
|
|
76
|
-
@verification_value = value.to_s.gsub(/\s/,
|
|
76
|
+
@verification_value = value.to_s.gsub(/\s/, "")
|
|
77
77
|
end
|
|
78
78
|
|
|
79
79
|
# Sets the credit card type, converting it to the preferred internal
|
|
@@ -84,10 +84,10 @@ module Spree
|
|
|
84
84
|
# cc_type is set by jquery.payment, which helpfully provides different
|
|
85
85
|
# types from Active Merchant. Converting them is necessary.
|
|
86
86
|
self[:cc_type] = case type
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
87
|
+
when "mastercard", "maestro" then "master"
|
|
88
|
+
when "amex" then "american_express"
|
|
89
|
+
when "dinersclub" then "diners_club"
|
|
90
|
+
when "" then try_type_from_number
|
|
91
91
|
else type
|
|
92
92
|
end
|
|
93
93
|
end
|
|
@@ -100,16 +100,16 @@ module Spree
|
|
|
100
100
|
|
|
101
101
|
# Sets the last digits field based on the assigned credit card number.
|
|
102
102
|
def set_last_digits
|
|
103
|
-
self.last_digits ||= number.to_s.length <= 4 ? number : number.to_s.slice(-4..)
|
|
103
|
+
self.last_digits ||= (number.to_s.length <= 4) ? number : number.to_s.slice(-4..)
|
|
104
104
|
end
|
|
105
105
|
|
|
106
106
|
# @return [String] the credit card type if it can be determined from the
|
|
107
107
|
# number, otherwise the empty string
|
|
108
108
|
def try_type_from_number
|
|
109
109
|
CARD_TYPES.each do |type, pattern|
|
|
110
|
-
return type if number
|
|
110
|
+
return type if number&.match?(pattern)
|
|
111
111
|
end
|
|
112
|
-
|
|
112
|
+
""
|
|
113
113
|
end
|
|
114
114
|
|
|
115
115
|
# @return [Boolean] true when a verification value is present
|
|
@@ -18,9 +18,10 @@ module Spree
|
|
|
18
18
|
|
|
19
19
|
accepts_nested_attributes_for :return_items
|
|
20
20
|
|
|
21
|
-
self.allowed_ransackable_attributes = [
|
|
21
|
+
self.allowed_ransackable_attributes = ["number"]
|
|
22
22
|
|
|
23
23
|
extend DisplayMoney
|
|
24
|
+
|
|
24
25
|
money_methods :total, :total_excluding_vat, :amount
|
|
25
26
|
|
|
26
27
|
delegate :currency, to: :order
|
|
@@ -61,14 +62,14 @@ module Spree
|
|
|
61
62
|
|
|
62
63
|
def generate_number
|
|
63
64
|
self.number ||= loop do
|
|
64
|
-
random = "CR#{Array.new(9){ rand(9) }.join}"
|
|
65
|
+
random = "CR#{Array.new(9) { rand(9) }.join}"
|
|
65
66
|
break random unless self.class.exists?(number: random)
|
|
66
67
|
end
|
|
67
68
|
end
|
|
68
69
|
|
|
69
70
|
def return_items_belong_to_same_order
|
|
70
|
-
if return_items.reject{ |return_item| return_item.inventory_unit&.order_id == order_id }.any?
|
|
71
|
-
errors.add(:base, I18n.t(
|
|
71
|
+
if return_items.reject { |return_item| return_item.inventory_unit&.order_id == order_id }.any?
|
|
72
|
+
errors.add(:base, I18n.t("spree.return_items_cannot_be_associated_with_multiple_orders"))
|
|
72
73
|
end
|
|
73
74
|
end
|
|
74
75
|
|
|
@@ -21,7 +21,7 @@ module Spree
|
|
|
21
21
|
# @return [Hash<Integer, BigDecimal>] a hash of line item IDs and their
|
|
22
22
|
# corresponding weighted adjustments
|
|
23
23
|
def distributed_amounts
|
|
24
|
-
|
|
24
|
+
line_item_ids.zip(allocated_amounts).to_h
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def line_item_ids
|
|
@@ -32,7 +32,7 @@ module Spree
|
|
|
32
32
|
@track_inventory = track_inventory
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
-
validates :quantity, numericality: {
|
|
35
|
+
validates :quantity, numericality: {greater_than: 0}
|
|
36
36
|
validate :current_shipment_not_already_shipped
|
|
37
37
|
validate :desired_shipment_different_from_current
|
|
38
38
|
validates :desired_stock_location, presence: true
|
|
@@ -113,19 +113,19 @@ module Spree
|
|
|
113
113
|
# We order by state, because `'backordered' < 'on_hand'`.
|
|
114
114
|
# We start to move the new actual backordered quantity, so the remaining
|
|
115
115
|
# quantity can be set to on_hand state.
|
|
116
|
-
current_shipment
|
|
117
|
-
inventory_units
|
|
118
|
-
where(variant:)
|
|
119
|
-
order(state: :asc)
|
|
120
|
-
limit(backordered_quantity_to_move)
|
|
121
|
-
update_all(shipment_id: desired_shipment.id, state: :backordered)
|
|
122
|
-
|
|
123
|
-
current_shipment
|
|
124
|
-
inventory_units
|
|
125
|
-
where(variant:)
|
|
126
|
-
order(state: :asc)
|
|
127
|
-
limit(on_hand_quantity_to_move)
|
|
128
|
-
update_all(shipment_id: desired_shipment.id, state: :on_hand)
|
|
116
|
+
current_shipment
|
|
117
|
+
.inventory_units
|
|
118
|
+
.where(variant:)
|
|
119
|
+
.order(state: :asc)
|
|
120
|
+
.limit(backordered_quantity_to_move)
|
|
121
|
+
.update_all(shipment_id: desired_shipment.id, state: :backordered)
|
|
122
|
+
|
|
123
|
+
current_shipment
|
|
124
|
+
.inventory_units
|
|
125
|
+
.where(variant:)
|
|
126
|
+
.order(state: :asc)
|
|
127
|
+
.limit(on_hand_quantity_to_move)
|
|
128
|
+
.update_all(shipment_id: desired_shipment.id, state: :on_hand)
|
|
129
129
|
end
|
|
130
130
|
end
|
|
131
131
|
|
|
@@ -133,12 +133,12 @@ module Spree
|
|
|
133
133
|
# to the other.
|
|
134
134
|
def run_without_tracking_inventory
|
|
135
135
|
ActiveRecord::Base.transaction do
|
|
136
|
-
current_shipment
|
|
137
|
-
inventory_units
|
|
138
|
-
where(variant:)
|
|
139
|
-
order(state: :asc)
|
|
140
|
-
limit(quantity)
|
|
141
|
-
update_all(shipment_id: desired_shipment.id)
|
|
136
|
+
current_shipment
|
|
137
|
+
.inventory_units
|
|
138
|
+
.where(variant:)
|
|
139
|
+
.order(state: :asc)
|
|
140
|
+
.limit(quantity)
|
|
141
|
+
.update_all(shipment_id: desired_shipment.id)
|
|
142
142
|
end
|
|
143
143
|
end
|
|
144
144
|
|
|
@@ -181,11 +181,11 @@ module Spree
|
|
|
181
181
|
end
|
|
182
182
|
|
|
183
183
|
def desired_location_quantifier
|
|
184
|
-
@desired_location_quantifier ||= Spree::
|
|
184
|
+
@desired_location_quantifier ||= Spree::Config.stock.quantifier_class.new(variant, desired_stock_location)
|
|
185
185
|
end
|
|
186
186
|
|
|
187
187
|
def current_location_quantifier
|
|
188
|
-
@current_location_quantifier ||= Spree::
|
|
188
|
+
@current_location_quantifier ||= Spree::Config.stock.quantifier_class.new(variant, current_stock_location)
|
|
189
189
|
end
|
|
190
190
|
|
|
191
191
|
def desired_shipment_different_from_current
|
|
@@ -12,8 +12,8 @@ module Spree::Image::ActiveStorageAttachment
|
|
|
12
12
|
validate :supported_content_type
|
|
13
13
|
|
|
14
14
|
has_attachment :attachment,
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
styles: Spree::Config.product_image_styles,
|
|
16
|
+
default_style: Spree::Config.product_image_style_default
|
|
17
17
|
|
|
18
18
|
def supported_content_type
|
|
19
19
|
unless attachment.content_type.in?(Spree::Config.allowed_image_mime_types)
|
|
@@ -7,15 +7,15 @@ module Spree::Image::PaperclipAttachment
|
|
|
7
7
|
validate :no_attachment_errors
|
|
8
8
|
|
|
9
9
|
has_attached_file :attachment,
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
10
|
+
styles: Spree::Config.product_image_styles,
|
|
11
|
+
default_style: Spree::Config.product_image_style_default,
|
|
12
|
+
default_url: "noimage/:style.png",
|
|
13
|
+
url: "/spree/products/:id/:style/:basename.:extension",
|
|
14
|
+
path: ":rails_root/public/spree/products/:id/:style/:basename.:extension",
|
|
15
|
+
convert_options: {all: "-strip -auto-orient -colorspace sRGB"}
|
|
16
16
|
validates_attachment :attachment,
|
|
17
17
|
presence: true,
|
|
18
|
-
content_type: {
|
|
18
|
+
content_type: {content_type: Spree::Config.allowed_image_mime_types}
|
|
19
19
|
|
|
20
20
|
# save the w,h of the original image (from which others can be calculated)
|
|
21
21
|
# we need to look at the write-queue for images which have not been saved yet
|
|
@@ -39,7 +39,7 @@ module Spree::Image::PaperclipAttachment
|
|
|
39
39
|
filename = temporary.path unless temporary.nil?
|
|
40
40
|
filename = attachment.path if filename.blank?
|
|
41
41
|
geometry = Paperclip::Geometry.from_file(filename)
|
|
42
|
-
self.attachment_width
|
|
42
|
+
self.attachment_width = geometry.width
|
|
43
43
|
self.attachment_height = geometry.height
|
|
44
44
|
end
|
|
45
45
|
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "spree/manipulative_query_monitor"
|
|
4
|
+
|
|
5
|
+
module Spree
|
|
6
|
+
class InMemoryOrderUpdater
|
|
7
|
+
attr_reader :order
|
|
8
|
+
|
|
9
|
+
# logs a warning when a manipulative query is made when the persist flag is set to false
|
|
10
|
+
class_attribute :log_manipulative_queries
|
|
11
|
+
self.log_manipulative_queries = true
|
|
12
|
+
|
|
13
|
+
delegate :payments, :line_items, :adjustments, :all_adjustments, :shipments, :quantity, to: :order
|
|
14
|
+
|
|
15
|
+
def initialize(order)
|
|
16
|
+
@order = order
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
# This is a multi-purpose method for processing logic related to changes in the Order.
|
|
20
|
+
# It is meant to be called from various observers so that the Order is aware of changes
|
|
21
|
+
# that affect totals and other values stored in the Order.
|
|
22
|
+
#
|
|
23
|
+
# This method should never do anything to the Order that results in a save call on the
|
|
24
|
+
# object with callbacks (otherwise you will end up in an infinite recursion as the
|
|
25
|
+
# associations try to save and then in turn try to call +update!+ again.)
|
|
26
|
+
def recalculate(persist: true)
|
|
27
|
+
monitor =
|
|
28
|
+
if log_manipulative_queries
|
|
29
|
+
Spree::ManipulativeQueryMonitor
|
|
30
|
+
else
|
|
31
|
+
proc { |&block| block.call }
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
order.transaction do
|
|
35
|
+
monitor.call do
|
|
36
|
+
recalculate_line_item_prices
|
|
37
|
+
recalculate_item_count
|
|
38
|
+
assign_shipment_amounts
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
if persist
|
|
42
|
+
update_totals(persist:)
|
|
43
|
+
else
|
|
44
|
+
monitor.call do
|
|
45
|
+
update_totals(persist:)
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
monitor.call do
|
|
50
|
+
if order.completed?
|
|
51
|
+
recalculate_payment_state
|
|
52
|
+
recalculate_shipment_state
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
Spree::Bus.publish(:order_recalculated, order:)
|
|
57
|
+
|
|
58
|
+
persist_totals if persist
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
alias_method :update, :recalculate
|
|
62
|
+
deprecate update: :recalculate, deprecator: Spree.deprecator
|
|
63
|
+
|
|
64
|
+
# Recalculates the state on all of them shipments, then recalculates the
|
|
65
|
+
# +shipment_state+ attribute according to the following logic:
|
|
66
|
+
#
|
|
67
|
+
# shipped when all Shipments are in the "shipped" state
|
|
68
|
+
# partial when at least one Shipment has a state of "shipped" and there is another Shipment with a state other than "shipped"
|
|
69
|
+
# or there are InventoryUnits associated with the order that have a state of "sold" but are not associated with a Shipment.
|
|
70
|
+
# ready when all Shipments are in the "ready" state
|
|
71
|
+
# backorder when there is backordered inventory associated with an order
|
|
72
|
+
# pending when all Shipments are in the "pending" state
|
|
73
|
+
#
|
|
74
|
+
# The +shipment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
|
|
75
|
+
def recalculate_shipment_state
|
|
76
|
+
shipments.each(&:recalculate_state)
|
|
77
|
+
|
|
78
|
+
order.shipment_state = determine_shipment_state
|
|
79
|
+
order.shipment_state
|
|
80
|
+
end
|
|
81
|
+
alias_method :update_shipment_state, :recalculate_shipment_state
|
|
82
|
+
deprecate update_shipment_state: :recalculate_shipment_state, deprecator: Spree.deprecator
|
|
83
|
+
|
|
84
|
+
# Recalculates the +payment_state+ attribute according to the following logic:
|
|
85
|
+
#
|
|
86
|
+
# paid when +payment_total+ is equal to +total+
|
|
87
|
+
# balance_due when +payment_total+ is less than +total+
|
|
88
|
+
# credit_owed when +payment_total+ is greater than +total+
|
|
89
|
+
# failed when most recent payment is in the failed state
|
|
90
|
+
# void when the order has been canceled and the payment total is 0
|
|
91
|
+
#
|
|
92
|
+
# The +payment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
|
|
93
|
+
def recalculate_payment_state
|
|
94
|
+
order.payment_state = determine_payment_state
|
|
95
|
+
order.payment_state
|
|
96
|
+
end
|
|
97
|
+
alias_method :update_payment_state, :recalculate_payment_state
|
|
98
|
+
deprecate update_payment_state: :recalculate_payment_state, deprecator: Spree.deprecator
|
|
99
|
+
|
|
100
|
+
private
|
|
101
|
+
|
|
102
|
+
def determine_payment_state
|
|
103
|
+
if payments.present? && payments.valid.empty? && order.outstanding_balance != 0
|
|
104
|
+
"failed"
|
|
105
|
+
elsif order.state == "canceled" && order.payment_total.zero?
|
|
106
|
+
"void"
|
|
107
|
+
elsif order.outstanding_balance > 0
|
|
108
|
+
"balance_due"
|
|
109
|
+
elsif order.outstanding_balance < 0
|
|
110
|
+
"credit_owed"
|
|
111
|
+
else
|
|
112
|
+
# outstanding_balance == 0
|
|
113
|
+
"paid"
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def determine_shipment_state
|
|
118
|
+
if order.backordered?
|
|
119
|
+
"backorder"
|
|
120
|
+
else
|
|
121
|
+
# get all the shipment states for this order
|
|
122
|
+
shipment_states = shipments.states
|
|
123
|
+
if shipment_states.size > 1
|
|
124
|
+
# multiple shiment states means it's most likely partially shipped
|
|
125
|
+
"partial"
|
|
126
|
+
else
|
|
127
|
+
# will return nil if no shipments are found
|
|
128
|
+
shipment_states.first
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
# This will update and select the best promotion adjustment, update tax
|
|
134
|
+
# adjustments, update cancellation adjustments, and then update the total
|
|
135
|
+
# fields (promo_total, included_tax_total, additional_tax_total, and
|
|
136
|
+
# adjustment_total) on the item.
|
|
137
|
+
# @return [void]
|
|
138
|
+
def update_adjustments(persist:)
|
|
139
|
+
# Promotion adjustments must be applied first, then tax adjustments.
|
|
140
|
+
# This fits the criteria for VAT tax as outlined here:
|
|
141
|
+
# http://www.hmrc.gov.uk/vat/managing/charging/discounts-etc.htm#1
|
|
142
|
+
# It also fits the criteria for sales tax as outlined here:
|
|
143
|
+
# http://www.boe.ca.gov/formspubs/pub113/
|
|
144
|
+
update_promotions(persist:)
|
|
145
|
+
update_tax_adjustments
|
|
146
|
+
assign_item_totals
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# Updates the following Order total values:
|
|
150
|
+
#
|
|
151
|
+
# +payment_total+ The total value of all finalized Payments (NOTE: non-finalized Payments are excluded)
|
|
152
|
+
# +item_total+ The total value of all LineItems
|
|
153
|
+
# +adjustment_total+ The total value of all adjustments (promotions, credits, etc.)
|
|
154
|
+
# +promo_total+ The total value of all promotion adjustments
|
|
155
|
+
# +total+ The so-called "order total." This is equivalent to +item_total+ plus +adjustment_total+.
|
|
156
|
+
def update_totals(persist:)
|
|
157
|
+
recalculate_payment_total
|
|
158
|
+
recalculate_item_total
|
|
159
|
+
recalculate_shipment_total
|
|
160
|
+
update_adjustment_total(persist:)
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
def assign_shipment_amounts
|
|
164
|
+
shipments.each(&:assign_amounts)
|
|
165
|
+
end
|
|
166
|
+
|
|
167
|
+
def update_adjustment_total(persist:)
|
|
168
|
+
update_adjustments(persist:)
|
|
169
|
+
|
|
170
|
+
all_items = line_items + shipments
|
|
171
|
+
# Ignore any adjustments that have been marked for destruction in our
|
|
172
|
+
# calculations. They'll get removed when/if we persist the order.
|
|
173
|
+
valid_adjustments = adjustments.reject(&:marked_for_destruction?)
|
|
174
|
+
order_tax_adjustments = valid_adjustments.select(&:tax?)
|
|
175
|
+
|
|
176
|
+
order.adjustment_total = all_items.sum(&:adjustment_total) + valid_adjustments.sum(&:amount)
|
|
177
|
+
order.included_tax_total = all_items.sum(&:included_tax_total) + order_tax_adjustments.select(&:included?).sum(&:amount)
|
|
178
|
+
order.additional_tax_total = all_items.sum(&:additional_tax_total) + order_tax_adjustments.reject(&:included?).sum(&:amount)
|
|
179
|
+
|
|
180
|
+
recalculate_order_total
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
def update_promotions(persist:)
|
|
184
|
+
Spree::Config.promotions.order_adjuster_class.new(order).call(persist:)
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
def update_tax_adjustments
|
|
188
|
+
Spree::Config.tax_adjuster_class.new(order).adjust!
|
|
189
|
+
end
|
|
190
|
+
|
|
191
|
+
def update_cancellations
|
|
192
|
+
end
|
|
193
|
+
deprecate :update_cancellations, deprecator: Spree.deprecator
|
|
194
|
+
|
|
195
|
+
def assign_item_totals
|
|
196
|
+
[*line_items, *shipments].each do |item|
|
|
197
|
+
Spree::Config.item_total_class.new(item).recalculate!
|
|
198
|
+
|
|
199
|
+
next unless item.changed?
|
|
200
|
+
|
|
201
|
+
item.assign_attributes(
|
|
202
|
+
promo_total: item.promo_total,
|
|
203
|
+
included_tax_total: item.included_tax_total,
|
|
204
|
+
additional_tax_total: item.additional_tax_total,
|
|
205
|
+
adjustment_total: item.adjustment_total
|
|
206
|
+
)
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
|
|
210
|
+
def recalculate_payment_total
|
|
211
|
+
order.payment_total = payments.completed.includes(:refunds).sum { |payment| payment.amount - payment.refunds.sum(:amount) }
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
def recalculate_shipment_total
|
|
215
|
+
order.shipment_total = shipments.to_a.sum(&:cost)
|
|
216
|
+
recalculate_order_total
|
|
217
|
+
end
|
|
218
|
+
|
|
219
|
+
def recalculate_order_total
|
|
220
|
+
order.total = order.item_total + order.shipment_total + order.adjustment_total
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
def recalculate_item_count
|
|
224
|
+
order.item_count = line_items.to_a.sum(&:quantity)
|
|
225
|
+
end
|
|
226
|
+
|
|
227
|
+
def recalculate_item_total
|
|
228
|
+
order.item_total = line_items.to_a.sum(&:amount)
|
|
229
|
+
recalculate_order_total
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
def recalculate_line_item_prices
|
|
233
|
+
if Spree::Config.recalculate_cart_prices
|
|
234
|
+
line_items.each(&:recalculate_price)
|
|
235
|
+
end
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
def persist_totals
|
|
239
|
+
shipments.each(&:persist_amounts)
|
|
240
|
+
assign_item_totals
|
|
241
|
+
log_state_change("payment")
|
|
242
|
+
log_state_change("shipment")
|
|
243
|
+
order.save!
|
|
244
|
+
end
|
|
245
|
+
|
|
246
|
+
def log_state_change(name)
|
|
247
|
+
state = "#{name}_state"
|
|
248
|
+
previous_state, current_state = order.changes[state]
|
|
249
|
+
|
|
250
|
+
if previous_state != current_state
|
|
251
|
+
# Enqueue the job to track this state change
|
|
252
|
+
StateChangeTrackingJob.perform_later(
|
|
253
|
+
order,
|
|
254
|
+
previous_state,
|
|
255
|
+
current_state,
|
|
256
|
+
Time.current,
|
|
257
|
+
name
|
|
258
|
+
)
|
|
259
|
+
end
|
|
260
|
+
end
|
|
261
|
+
end
|
|
262
|
+
end
|
|
@@ -4,9 +4,9 @@ module Spree
|
|
|
4
4
|
# Tracks the state of line items' fulfillment.
|
|
5
5
|
#
|
|
6
6
|
class InventoryUnit < Spree::Base
|
|
7
|
-
PRE_SHIPMENT_STATES = %w
|
|
8
|
-
POST_SHIPMENT_STATES = %w
|
|
9
|
-
CANCELABLE_STATES = [
|
|
7
|
+
PRE_SHIPMENT_STATES = %w[backordered on_hand]
|
|
8
|
+
POST_SHIPMENT_STATES = %w[returned]
|
|
9
|
+
CANCELABLE_STATES = ["on_hand", "backordered", "shipped"]
|
|
10
10
|
|
|
11
11
|
belongs_to :variant, -> { with_discarded }, class_name: "Spree::Variant", inverse_of: :inventory_units, optional: true
|
|
12
12
|
belongs_to :shipment, class_name: "Spree::Shipment", touch: true, inverse_of: :inventory_units, optional: true
|
|
@@ -29,20 +29,20 @@ module Spree
|
|
|
29
29
|
before_destroy :ensure_can_destroy
|
|
30
30
|
|
|
31
31
|
scope :pending, -> { where pending: true }
|
|
32
|
-
scope :backordered, -> { where state:
|
|
33
|
-
scope :on_hand, -> { where state:
|
|
32
|
+
scope :backordered, -> { where state: "backordered" }
|
|
33
|
+
scope :on_hand, -> { where state: "on_hand" }
|
|
34
34
|
scope :pre_shipment, -> { where(state: PRE_SHIPMENT_STATES) }
|
|
35
|
-
scope :shipped, -> { where state:
|
|
35
|
+
scope :shipped, -> { where state: "shipped" }
|
|
36
36
|
scope :post_shipment, -> { where(state: POST_SHIPMENT_STATES) }
|
|
37
|
-
scope :returned, -> { where state:
|
|
38
|
-
scope :canceled, -> { where(state:
|
|
39
|
-
scope :not_canceled, -> { where.not(state:
|
|
37
|
+
scope :returned, -> { where state: "returned" }
|
|
38
|
+
scope :canceled, -> { where(state: "canceled") }
|
|
39
|
+
scope :not_canceled, -> { where.not(state: "canceled") }
|
|
40
40
|
scope :cancelable, -> { where(state: Spree::InventoryUnit::CANCELABLE_STATES, pending: false) }
|
|
41
41
|
scope :backordered_per_variant, ->(stock_item) do
|
|
42
42
|
includes(:shipment, :order)
|
|
43
43
|
.where("spree_shipments.state != 'canceled'").references(:shipment)
|
|
44
44
|
.where(variant_id: stock_item.variant_id)
|
|
45
|
-
.where(
|
|
45
|
+
.where("spree_orders.completed_at is not null")
|
|
46
46
|
.backordered.order(Spree::Order.arel_table[:completed_at].asc)
|
|
47
47
|
end
|
|
48
48
|
|
|
@@ -53,7 +53,7 @@ module Spree
|
|
|
53
53
|
# inventory units for the given stock item
|
|
54
54
|
scope :backordered_for_stock_item, ->(stock_item) do
|
|
55
55
|
backordered_per_variant(stock_item)
|
|
56
|
-
.where(spree_shipments: {
|
|
56
|
+
.where(spree_shipments: {stock_location_id: stock_item.stock_location_id})
|
|
57
57
|
end
|
|
58
58
|
|
|
59
59
|
scope :shippable, -> { on_hand }
|
|
@@ -14,7 +14,7 @@ class Spree::ItemTotal
|
|
|
14
14
|
# These ones should not affect the eventual total price.
|
|
15
15
|
#
|
|
16
16
|
# Additional tax adjustments are the opposite, affecting the final total.
|
|
17
|
-
item.included_tax_total
|
|
17
|
+
item.included_tax_total = tax_adjustments.select(&:included?).sum(&:amount)
|
|
18
18
|
item.additional_tax_total = tax_adjustments.reject(&:included?).sum(&:amount)
|
|
19
19
|
|
|
20
20
|
item.adjustment_total = item.adjustments.reject { |adjustment|
|
|
@@ -9,10 +9,10 @@ module Spree
|
|
|
9
9
|
include UserMethods
|
|
10
10
|
include Metadata
|
|
11
11
|
|
|
12
|
-
self.table_name =
|
|
12
|
+
self.table_name = "spree_users"
|
|
13
13
|
|
|
14
14
|
def self.model_name
|
|
15
|
-
ActiveModel::Name.new Spree::LegacyUser, Spree,
|
|
15
|
+
ActiveModel::Name.new Spree::LegacyUser, Spree, "user"
|
|
16
16
|
end
|
|
17
17
|
|
|
18
18
|
attr_accessor :password
|