solidus_core 4.1.6 → 4.5.1
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/app/assets/images/logo/solidus.svg +18 -1
- data/app/assets/images/logo/solidus_logo.png +0 -0
- data/app/helpers/spree/base_helper.rb +2 -2
- data/app/helpers/spree/core/controller_helpers/auth.rb +66 -0
- data/app/helpers/spree/core/controller_helpers/common.rb +82 -0
- data/app/helpers/spree/core/controller_helpers/order.rb +86 -0
- data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +165 -0
- data/app/helpers/spree/core/controller_helpers/pricing.rb +19 -0
- data/app/helpers/spree/core/controller_helpers/search.rb +16 -0
- data/app/helpers/spree/core/controller_helpers/store.rb +19 -0
- data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +74 -0
- data/app/mailers/spree/base_mailer.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +1 -1
- data/app/mailers/spree/order_mailer.rb +3 -3
- data/app/mailers/spree/reimbursement_mailer.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/metadata.rb +64 -0
- data/app/models/concerns/spree/named_type.rb +2 -0
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/user_address_book.rb +8 -9
- data/app/models/concerns/spree/user_methods.rb +3 -3
- data/app/models/spree/address.rb +10 -8
- data/app/models/spree/adjustment.rb +15 -65
- data/app/models/spree/adjustment_reason.rb +2 -0
- data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
- data/app/models/spree/carton.rb +2 -2
- data/app/models/spree/core/state_machines/inventory_unit.rb +42 -0
- data/app/models/spree/core/state_machines/order/class_methods.rb +217 -0
- data/app/models/spree/core/state_machines/order.rb +42 -0
- data/app/models/spree/core/state_machines/payment.rb +61 -0
- data/app/models/spree/core/state_machines/reimbursement.rb +33 -0
- data/app/models/spree/core/state_machines/return_authorization.rb +32 -0
- data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
- data/app/models/spree/core/state_machines/return_item/reception_status.rb +42 -0
- data/app/models/spree/core/state_machines/shipment.rb +58 -0
- data/app/models/spree/credit_card.rb +12 -9
- data/app/models/spree/customer_return.rb +2 -0
- data/app/models/spree/deprecated_configurable_class.rb +40 -0
- data/app/models/spree/fulfilment_changer.rb +4 -4
- data/app/models/spree/inventory_unit.rb +2 -2
- data/app/models/spree/item_total.rb +28 -0
- data/app/models/spree/legacy_user.rb +1 -0
- data/app/models/spree/line_item.rb +22 -4
- data/app/models/spree/money.rb +120 -0
- data/app/models/spree/null_promotion_adjuster.rb +13 -0
- data/app/models/spree/null_promotion_advertiser.rb +9 -0
- data/app/models/spree/null_promotion_finder.rb +9 -0
- data/app/models/spree/null_promotion_handler.rb +44 -0
- data/app/models/spree/option_value.rb +1 -0
- data/app/models/spree/order.rb +54 -36
- data/app/models/spree/order_cancellations.rb +8 -8
- data/app/models/spree/order_inventory.rb +6 -4
- data/app/models/spree/order_merger.rb +1 -1
- data/app/models/spree/order_mutex.rb +2 -2
- data/app/models/spree/order_shipping.rb +9 -9
- data/app/models/spree/order_taxation.rb +1 -0
- data/app/models/spree/order_updater.rb +19 -40
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/payment.rb +3 -2
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +14 -9
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +12 -6
- data/app/models/spree/payment_method/store_credit.rb +1 -1
- data/app/models/spree/payment_method.rb +3 -1
- data/app/models/spree/payment_source.rb +5 -1
- data/app/models/spree/permission_set.rb +11 -0
- data/app/models/spree/permission_sets/base.rb +45 -0
- data/app/models/spree/permission_sets/configuration_display.rb +53 -0
- data/app/models/spree/permission_sets/configuration_management.rb +52 -0
- data/app/models/spree/permission_sets/dashboard_display.rb +28 -0
- data/app/models/spree/permission_sets/default_customer.rb +83 -0
- data/app/models/spree/permission_sets/order_display.rb +50 -0
- data/app/models/spree/permission_sets/order_management.rb +50 -0
- data/app/models/spree/permission_sets/product_display.rb +43 -0
- data/app/models/spree/permission_sets/product_management.rb +47 -0
- data/app/models/spree/permission_sets/restricted_stock_display.rb +33 -0
- data/app/models/spree/permission_sets/restricted_stock_management.rb +33 -0
- data/app/models/spree/permission_sets/stock_display.rb +26 -0
- data/app/models/spree/permission_sets/stock_management.rb +26 -0
- data/app/models/spree/permission_sets/super_user.rb +26 -0
- data/app/models/spree/permission_sets/user_display.rb +27 -0
- data/app/models/spree/permission_sets/user_management.rb +44 -0
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/product.rb +13 -9
- data/app/models/spree/refund.rb +3 -1
- data/app/models/spree/refund_reason.rb +6 -1
- data/app/models/spree/reimbursement.rb +4 -4
- data/app/models/spree/reimbursement_performer.rb +3 -3
- data/app/models/spree/reimbursement_tax_calculator.rb +2 -2
- data/app/models/spree/reimbursement_type/credit.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +6 -1
- data/app/models/spree/return_authorization.rb +2 -0
- data/app/models/spree/return_item.rb +10 -10
- data/app/models/spree/return_reason.rb +6 -1
- data/app/models/spree/role.rb +3 -1
- data/app/models/spree/role_permission.rb +8 -0
- data/app/models/spree/shipment.rb +9 -7
- data/app/models/spree/shipping_category.rb +2 -0
- data/app/models/spree/shipping_rate.rb +2 -3
- data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +8 -12
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +2 -2
- data/app/models/spree/stock/simple_coordinator.rb +36 -22
- data/app/models/spree/stock_item.rb +1 -0
- data/app/models/spree/stock_location.rb +5 -5
- data/app/models/spree/store.rb +3 -1
- data/app/models/spree/store_credit.rb +17 -15
- data/app/models/spree/store_credit_event.rb +4 -3
- data/app/models/spree/store_credit_reason.rb +6 -1
- data/app/models/spree/store_selector/by_server_name.rb +1 -1
- data/app/models/spree/tax/tax_helpers.rb +12 -1
- data/app/models/spree/tax_calculator/default.rb +3 -3
- data/app/models/spree/tax_calculator/shipping_rate.rb +1 -1
- data/app/models/spree/tax_category.rb +3 -1
- data/app/models/spree/tax_rate.rb +7 -3
- data/app/models/spree/taxon.rb +22 -2
- data/app/models/spree/taxon_brand_selector.rb +22 -0
- data/app/models/spree/taxonomy.rb +2 -2
- data/app/models/spree/unauthorized_redirect_handler.rb +24 -0
- data/app/models/spree/unit_cancel.rb +1 -2
- data/app/models/spree/user_address.rb +9 -3
- data/app/models/spree/variant/scopes.rb +4 -0
- data/app/models/spree/variant/vat_price_generator.rb +1 -1
- data/app/models/spree/variant.rb +21 -8
- data/app/models/spree/wallet.rb +2 -2
- data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
- data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
- data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
- data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
- data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +0 -1
- data/config/locales/en.yml +33 -90
- data/db/default/spree/permission_sets.rb +10 -0
- data/db/default/spree/return_reasons.rb +3 -1
- data/db/default/spree/states.rb +1 -1
- data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
- data/db/migrate/20220419170826_remove_archived_user_addresses.rb +12 -0
- data/db/migrate/20230427095534_drop_deprecated_address_id_from_shipments.rb +1 -1
- data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
- data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
- data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
- data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
- data/db/migrate/20250129061658_add_metadata_to_spree_resources.rb +28 -0
- data/db/migrate/20250201172950_add_gtin_and_condition_to_spree_variant.rb +6 -0
- data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +7 -0
- data/db/migrate/20250221152004_add_metadata_to_users.rb +13 -0
- data/db/seeds.rb +1 -0
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +0 -5
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
- data/lib/generators/solidus/install/install_generator.rb +64 -15
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +15 -12
- data/lib/generators/solidus/update/update_generator.rb +1 -1
- data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/application.rb.tt +1 -1
- data/lib/generators/spree/dummy/templates/rails/database.yml +41 -93
- data/lib/generators/spree/dummy/templates/rails/manifest.js +3 -0
- data/lib/generators/spree/dummy/templates/rails/test.rb +6 -1
- data/lib/spree/app_configuration.rb +102 -67
- data/lib/spree/core/class_constantizer.rb +2 -2
- data/lib/spree/core/controller_helpers/auth.rb +5 -61
- data/lib/spree/core/controller_helpers/common.rb +5 -80
- data/lib/spree/core/controller_helpers/order.rb +5 -86
- data/lib/spree/core/controller_helpers/payment_parameters.rb +5 -163
- data/lib/spree/core/controller_helpers/pricing.rb +5 -17
- data/lib/spree/core/controller_helpers/search.rb +5 -14
- data/lib/spree/core/controller_helpers/store.rb +5 -17
- data/lib/spree/core/controller_helpers/strong_parameters.rb +5 -71
- data/lib/spree/core/engine.rb +13 -5
- data/lib/spree/core/environment/calculators.rb +35 -3
- data/lib/spree/core/environment/promotions.rb +25 -4
- data/lib/spree/core/environment_extension.rb +16 -2
- data/lib/spree/core/importer/order.rb +5 -5
- data/lib/spree/core/importer/product.rb +3 -3
- data/lib/spree/core/nested_class_set.rb +28 -0
- data/lib/spree/core/null_promotion_configuration.rb +84 -0
- data/lib/spree/core/product_filters.rb +1 -1
- data/lib/spree/core/search/variant.rb +2 -2
- data/lib/spree/core/state_machines/inventory_unit.rb +5 -40
- data/lib/spree/core/state_machines/order.rb +5 -251
- data/lib/spree/core/state_machines/payment.rb +5 -59
- data/lib/spree/core/state_machines/reimbursement.rb +5 -31
- data/lib/spree/core/state_machines/return_authorization.rb +5 -30
- data/lib/spree/core/state_machines/return_item/acceptance_status.rb +5 -49
- data/lib/spree/core/state_machines/return_item/reception_status.rb +5 -40
- data/lib/spree/core/state_machines/shipment.rb +5 -56
- data/lib/spree/core/state_machines.rb +48 -81
- data/lib/spree/core/validators/email.rb +1 -1
- data/lib/spree/core/version.rb +2 -2
- data/lib/spree/core.rb +2 -14
- data/lib/spree/deprecator.rb +9 -0
- data/lib/spree/i18n.rb +1 -1
- data/lib/spree/mailer_previews/carton_preview.rb +1 -1
- data/lib/spree/money.rb +5 -118
- data/lib/spree/permission_sets/base.rb +5 -30
- data/lib/spree/permission_sets/configuration_display.rb +5 -41
- data/lib/spree/permission_sets/configuration_management.rb +5 -40
- data/lib/spree/permission_sets/dashboard_display.rb +5 -14
- data/lib/spree/permission_sets/default_customer.rb +5 -71
- data/lib/spree/permission_sets/order_display.rb +5 -38
- data/lib/spree/permission_sets/order_management.rb +5 -38
- data/lib/spree/permission_sets/product_display.rb +5 -31
- data/lib/spree/permission_sets/product_management.rb +5 -35
- data/lib/spree/permission_sets/restricted_stock_display.rb +5 -21
- data/lib/spree/permission_sets/restricted_stock_management.rb +5 -21
- data/lib/spree/permission_sets/stock_display.rb +5 -14
- data/lib/spree/permission_sets/stock_management.rb +5 -14
- data/lib/spree/permission_sets/super_user.rb +5 -14
- data/lib/spree/permission_sets/user_display.rb +5 -15
- data/lib/spree/permission_sets/user_management.rb +5 -32
- data/lib/spree/permission_sets.rb +5 -18
- data/lib/spree/permitted_attributes.rb +21 -9
- data/lib/spree/preferences/configuration.rb +4 -0
- data/lib/spree/preferences/persistable.rb +7 -1
- data/lib/spree/preferences/store.rb +2 -2
- data/lib/spree/testing_support/capybara_ext.rb +11 -1
- data/lib/spree/testing_support/common_rake.rb +1 -0
- data/lib/spree/testing_support/dummy_ability.rb +7 -0
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/solidus_admin/tailwind.css +1 -0
- data/lib/spree/testing_support/dummy_app/database.yml +37 -46
- data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +3 -6
- data/lib/spree/testing_support/dummy_app.rb +33 -19
- data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -2
- data/lib/spree/testing_support/factories/calculator_factory.rb +1 -5
- data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +3 -3
- data/lib/spree/testing_support/factories/order_factory.rb +13 -24
- data/lib/spree/testing_support/factories/product_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -1
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
- data/lib/spree/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
- data/lib/spree/testing_support/order_walkthrough.rb +3 -3
- data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
- data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
- data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
- data/lib/tasks/colorado_delivery_fee.rake +2 -2
- data/solidus_core.gemspec +7 -10
- metadata +107 -109
- data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
- data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
- data/app/models/spree/calculator/distributed_amount.rb +0 -33
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
- data/app/models/spree/calculator/flexi_rate.rb +0 -22
- data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
- data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
- data/app/models/spree/calculator/tiered_percent.rb +0 -62
- data/app/models/spree/line_item_action.rb +0 -8
- data/app/models/spree/order_promotion.rb +0 -27
- data/app/models/spree/promotion/actions/create_adjustment.rb +0 -81
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -98
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
- data/app/models/spree/promotion/actions/free_shipping.rb +0 -59
- data/app/models/spree/promotion/order_adjustments_recalculator.rb +0 -92
- data/app/models/spree/promotion/rules/first_order.rb +0 -38
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
- data/app/models/spree/promotion/rules/item_total.rb +0 -86
- data/app/models/spree/promotion/rules/nth_order.rb +0 -45
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
- data/app/models/spree/promotion/rules/option_value.rb +0 -50
- data/app/models/spree/promotion/rules/product.rb +0 -86
- data/app/models/spree/promotion/rules/store.rb +0 -26
- data/app/models/spree/promotion/rules/taxon.rb +0 -91
- data/app/models/spree/promotion/rules/user.rb +0 -34
- data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
- data/app/models/spree/promotion/rules/user_role.rb +0 -45
- data/app/models/spree/promotion.rb +0 -271
- data/app/models/spree/promotion_action.rb +0 -47
- data/app/models/spree/promotion_category.rb +0 -8
- data/app/models/spree/promotion_chooser.rb +0 -34
- data/app/models/spree/promotion_code/batch_builder.rb +0 -64
- data/app/models/spree/promotion_code.rb +0 -54
- data/app/models/spree/promotion_code_batch.rb +0 -27
- data/app/models/spree/promotion_handler/cart.rb +0 -75
- data/app/models/spree/promotion_handler/coupon.rb +0 -123
- data/app/models/spree/promotion_handler/page.rb +0 -26
- data/app/models/spree/promotion_handler/shipping.rb +0 -61
- data/app/models/spree/promotion_rule.rb +0 -55
- data/app/models/spree/promotion_rule_role.rb +0 -8
- data/app/models/spree/promotion_rule_store.rb +0 -10
- data/app/models/spree/promotion_rule_taxon.rb +0 -8
- data/app/models/spree/promotion_rule_user.rb +0 -10
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
- data/bin/rails +0 -13
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
- data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
- data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
- data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
- data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +0 -20
- data/db/migrate/20230322085416_remove_match_policy_from_spree_promotion.rb +0 -5
- data/db/migrate/20230325132905_remove_unused_columns_from_promotion_rules.rb +0 -6
- data/db/migrate/20230325161633_drop_unused_promo_action_line_items.rb +0 -13
- data/lib/generators/spree/dummy/templates/rails/script/rails +0 -6
- data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
- data/lib/spree/permission_sets/promotion_display.rb +0 -25
- data/lib/spree/permission_sets/promotion_management.rb +0 -25
- data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -8
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -7
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -8
- data/lib/spree/testing_support/factories/promotion_factory.rb +0 -98
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
module PermissionSets
|
5
|
+
# Full permissions for store administration.
|
6
|
+
#
|
7
|
+
# This permission set is always added to users with the `:admin` role.
|
8
|
+
#
|
9
|
+
# It grants permission to perform any read or write action on any resource.
|
10
|
+
class SuperUser < PermissionSets::Base
|
11
|
+
class << self
|
12
|
+
def privilege
|
13
|
+
:other
|
14
|
+
end
|
15
|
+
|
16
|
+
def category
|
17
|
+
:super_user
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def activate!
|
22
|
+
can :manage, :all
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
module PermissionSets
|
5
|
+
# Read-only permissions for users, roles and store credits.
|
6
|
+
#
|
7
|
+
# This permission set allows users to view all related information about
|
8
|
+
# users, roles and store credits, also from the admin panel.
|
9
|
+
class UserDisplay < PermissionSets::Base
|
10
|
+
class << self
|
11
|
+
def privilege
|
12
|
+
:display
|
13
|
+
end
|
14
|
+
|
15
|
+
def category
|
16
|
+
:user
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def activate!
|
21
|
+
can [:read, :admin, :edit, :addresses, :orders, :items], Spree.user_class
|
22
|
+
can [:read, :admin], Spree::StoreCredit
|
23
|
+
can :read, Spree::Role
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
module PermissionSets
|
5
|
+
# Full permissions for user management.
|
6
|
+
#
|
7
|
+
# This permission set grants full control over all user and
|
8
|
+
# related resources, including:
|
9
|
+
#
|
10
|
+
# - Users
|
11
|
+
# - Store credits
|
12
|
+
# - Roles
|
13
|
+
# - API keys
|
14
|
+
class UserManagement < PermissionSets::Base
|
15
|
+
class << self
|
16
|
+
def privilege
|
17
|
+
:management
|
18
|
+
end
|
19
|
+
|
20
|
+
def category
|
21
|
+
:user
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def activate!
|
26
|
+
can [:admin, :read, :create, :update, :save_in_address_book, :remove_from_address_book, :addresses, :orders, :items], Spree.user_class
|
27
|
+
|
28
|
+
# NOTE: This does not work with accessible_by.
|
29
|
+
# See https://github.com/solidusio/solidus/pull/1263
|
30
|
+
can :update_email, Spree.user_class do |user|
|
31
|
+
user.spree_roles.none?
|
32
|
+
end
|
33
|
+
can :update_password, Spree.user_class do |user|
|
34
|
+
user.spree_roles.none?
|
35
|
+
end
|
36
|
+
|
37
|
+
cannot :destroy, Spree.user_class
|
38
|
+
can :manage, Spree::StoreCredit
|
39
|
+
can :manage, :api_key
|
40
|
+
can :read, Spree::Role
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
data/app/models/spree/product.rb
CHANGED
@@ -16,7 +16,6 @@ module Spree
|
|
16
16
|
self.product_option_types = []
|
17
17
|
self.product_properties = []
|
18
18
|
self.classifications.destroy_all
|
19
|
-
self.product_promotion_rules = []
|
20
19
|
end
|
21
20
|
|
22
21
|
has_many :product_option_types, dependent: :destroy, inverse_of: :product
|
@@ -31,11 +30,9 @@ module Spree
|
|
31
30
|
has_many :classifications, dependent: :delete_all, inverse_of: :product
|
32
31
|
has_many :taxons, through: :classifications, before_remove: :remove_taxon
|
33
32
|
|
34
|
-
has_many :product_promotion_rules, dependent: :destroy
|
35
|
-
has_many :promotion_rules, through: :product_promotion_rules
|
36
|
-
|
37
33
|
belongs_to :tax_category, class_name: 'Spree::TaxCategory', optional: true
|
38
34
|
belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :products, optional: true
|
35
|
+
belongs_to :primary_taxon, class_name: 'Spree::Taxon', optional: true
|
39
36
|
|
40
37
|
has_one :master,
|
41
38
|
-> { where(is_master: true).with_discarded },
|
@@ -61,6 +58,8 @@ module Spree
|
|
61
58
|
has_many :line_items, through: :variants_including_master
|
62
59
|
has_many :orders, through: :line_items
|
63
60
|
|
61
|
+
has_many :option_values, -> { distinct }, through: :variants_including_master
|
62
|
+
|
64
63
|
scope :sort_by_master_default_price_amount_asc, -> {
|
65
64
|
with_default_price.order('spree_prices.amount ASC')
|
66
65
|
}
|
@@ -86,6 +85,8 @@ module Spree
|
|
86
85
|
:track_inventory,
|
87
86
|
:weight,
|
88
87
|
:width,
|
88
|
+
:gtin,
|
89
|
+
:condition
|
89
90
|
]
|
90
91
|
MASTER_ATTRIBUTES.each do |attr|
|
91
92
|
delegate :"#{attr}", :"#{attr}=", to: :find_or_build_master
|
@@ -131,7 +132,7 @@ module Spree
|
|
131
132
|
|
132
133
|
alias :options :product_option_types
|
133
134
|
|
134
|
-
self.allowed_ransackable_associations = %w[stores variants_including_master master variants]
|
135
|
+
self.allowed_ransackable_associations = %w[stores variants_including_master master variants option_values]
|
135
136
|
self.allowed_ransackable_attributes = %w[name slug]
|
136
137
|
self.allowed_ransackable_scopes = %i[available with_discarded with_all_variant_sku_cont with_kept_variant_sku_cont]
|
137
138
|
|
@@ -252,7 +253,7 @@ module Spree
|
|
252
253
|
ActiveRecord::Base.transaction do
|
253
254
|
# Works around spree_i18n https://github.com/spree/spree/issues/301
|
254
255
|
property = Spree::Property.create_with(presentation: property_name).find_or_create_by(name: property_name)
|
255
|
-
product_property = Spree::ProductProperty.where(product: self, property:
|
256
|
+
product_property = Spree::ProductProperty.where(product: self, property:).first_or_initialize
|
256
257
|
product_property.value = property_value
|
257
258
|
product_property.save!
|
258
259
|
end
|
@@ -260,8 +261,7 @@ module Spree
|
|
260
261
|
|
261
262
|
# @return [Array] all advertised and not-rejected promotions
|
262
263
|
def possible_promotions
|
263
|
-
|
264
|
-
Spree::Promotion.advertised.where(id: promotion_ids).reject(&:inactive?)
|
264
|
+
Spree::Config.promotions.advertiser_class.for_product(self)
|
265
265
|
end
|
266
266
|
|
267
267
|
# The number of on-hand stock items; Infinity if any variant does not track
|
@@ -294,6 +294,10 @@ module Spree
|
|
294
294
|
@gallery ||= Spree::Config.product_gallery_class.new(self)
|
295
295
|
end
|
296
296
|
|
297
|
+
def brand
|
298
|
+
Spree::Config.brand_selector_class.new(self).call
|
299
|
+
end
|
300
|
+
|
297
301
|
private
|
298
302
|
|
299
303
|
def any_variants_not_track_inventory?
|
@@ -366,7 +370,7 @@ module Spree
|
|
366
370
|
end
|
367
371
|
|
368
372
|
def remove_taxon(taxon)
|
369
|
-
removed_classifications = classifications.where(taxon:
|
373
|
+
removed_classifications = classifications.where(taxon:)
|
370
374
|
removed_classifications.each(&:remove_from_list)
|
371
375
|
end
|
372
376
|
end
|
data/app/models/spree/refund.rb
CHANGED
@@ -2,6 +2,8 @@
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
class Refund < Spree::Base
|
5
|
+
include Metadata
|
6
|
+
|
5
7
|
belongs_to :payment, inverse_of: :refunds, optional: true
|
6
8
|
belongs_to :reason, class_name: 'Spree::RefundReason', foreign_key: :refund_reason_id, optional: true
|
7
9
|
belongs_to :reimbursement, inverse_of: :refunds, optional: true
|
@@ -21,7 +23,7 @@ module Spree
|
|
21
23
|
delegate :currency, to: :payment
|
22
24
|
|
23
25
|
def money
|
24
|
-
Spree::Money.new(amount, { currency:
|
26
|
+
Spree::Money.new(amount, { currency: })
|
25
27
|
end
|
26
28
|
alias display_amount money
|
27
29
|
|
@@ -2,12 +2,17 @@
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
class RefundReason < Spree::Base
|
5
|
-
|
5
|
+
scope :active, -> { where(active: true) }
|
6
|
+
default_scope -> { order(arel_table[:name].lower) }
|
7
|
+
|
8
|
+
validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
|
6
9
|
|
7
10
|
RETURN_PROCESSING_REASON = 'Return processing'
|
8
11
|
|
9
12
|
has_many :refunds
|
10
13
|
|
14
|
+
self.allowed_ransackable_attributes = %w[name code]
|
15
|
+
|
11
16
|
def self.return_processing_reason
|
12
17
|
find_by!(name: RETURN_PROCESSING_REASON, mutable: false)
|
13
18
|
end
|
@@ -57,7 +57,7 @@ module Spree
|
|
57
57
|
def build_from_customer_return(customer_return)
|
58
58
|
order = customer_return.order
|
59
59
|
order.reimbursements.build({
|
60
|
-
customer_return
|
60
|
+
customer_return:,
|
61
61
|
return_items: customer_return.return_items.accepted.not_reimbursed
|
62
62
|
})
|
63
63
|
end
|
@@ -88,7 +88,7 @@ module Spree
|
|
88
88
|
reload
|
89
89
|
update!(total: calculated_total)
|
90
90
|
|
91
|
-
reimbursement_performer.perform(self, created_by:
|
91
|
+
reimbursement_performer.perform(self, created_by:)
|
92
92
|
|
93
93
|
if unpaid_amount_within_tolerance?
|
94
94
|
reimbursed!
|
@@ -108,7 +108,7 @@ module Spree
|
|
108
108
|
reload
|
109
109
|
update!(total: calculated_total)
|
110
110
|
|
111
|
-
reimbursement_performer.simulate(self, created_by:
|
111
|
+
reimbursement_performer.simulate(self, created_by:)
|
112
112
|
end
|
113
113
|
|
114
114
|
def return_items_requiring_exchange
|
@@ -131,7 +131,7 @@ module Spree
|
|
131
131
|
def return_all(created_by:)
|
132
132
|
return_items.each(&:accept!)
|
133
133
|
save!
|
134
|
-
perform!(created_by:
|
134
|
+
perform!(created_by:)
|
135
135
|
end
|
136
136
|
|
137
137
|
# The returned category is used as the category
|
@@ -12,12 +12,12 @@ module Spree
|
|
12
12
|
# - #display_amount
|
13
13
|
# so they can be displayed in the Admin UI appropriately.
|
14
14
|
def simulate(reimbursement, created_by:)
|
15
|
-
execute(reimbursement, true, created_by:
|
15
|
+
execute(reimbursement, true, created_by:)
|
16
16
|
end
|
17
17
|
|
18
18
|
# Actually perform the reimbursement
|
19
19
|
def perform(reimbursement, created_by:)
|
20
|
-
execute(reimbursement, false, created_by:
|
20
|
+
execute(reimbursement, false, created_by:)
|
21
21
|
end
|
22
22
|
|
23
23
|
private
|
@@ -26,7 +26,7 @@ module Spree
|
|
26
26
|
reimbursement_type_hash = calculate_reimbursement_types(reimbursement)
|
27
27
|
|
28
28
|
reimbursement_type_hash.flat_map do |reimbursement_type, return_items|
|
29
|
-
reimbursement_type.reimburse(reimbursement, return_items, simulate, created_by:
|
29
|
+
reimbursement_type.reimburse(reimbursement, return_items, simulate, created_by:)
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -26,8 +26,8 @@ module Spree
|
|
26
26
|
included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
|
27
27
|
|
28
28
|
return_item.update!({
|
29
|
-
additional_tax_total
|
30
|
-
included_tax_total:
|
29
|
+
additional_tax_total:,
|
30
|
+
included_tax_total:
|
31
31
|
})
|
32
32
|
end
|
33
33
|
end
|
@@ -7,7 +7,7 @@ module Spree
|
|
7
7
|
class << self
|
8
8
|
def reimburse(reimbursement, return_items, simulate, created_by:)
|
9
9
|
unpaid_amount = return_items.sum(&:total).round(2, :down)
|
10
|
-
reimbursement_list, _unpaid_amount = create_credits(reimbursement, unpaid_amount, simulate, created_by:
|
10
|
+
reimbursement_list, _unpaid_amount = create_credits(reimbursement, unpaid_amount, simulate, created_by:)
|
11
11
|
reimbursement_list
|
12
12
|
end
|
13
13
|
end
|
@@ -21,7 +21,7 @@ module Spree
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def create_credits(reimbursement, unpaid_amount, simulate, reimbursement_list = [], created_by:)
|
24
|
-
credits = [create_credit(reimbursement, unpaid_amount, simulate, created_by:
|
24
|
+
credits = [create_credit(reimbursement, unpaid_amount, simulate, created_by:)]
|
25
25
|
unpaid_amount -= credits.sum(&:amount)
|
26
26
|
reimbursement_list += credits
|
27
27
|
|
@@ -32,8 +32,8 @@ module Spree
|
|
32
32
|
|
33
33
|
def create_refund(reimbursement, payment, amount, simulate)
|
34
34
|
refund = reimbursement.refunds.build({
|
35
|
-
payment
|
36
|
-
amount
|
35
|
+
payment:,
|
36
|
+
amount:,
|
37
37
|
reason: Spree::RefundReason.return_processing_reason
|
38
38
|
})
|
39
39
|
|
@@ -50,8 +50,8 @@ module Spree
|
|
50
50
|
# If you have multiple methods of crediting a customer, overwrite this method
|
51
51
|
# Must return an array of objects the respond to #description, #display_amount
|
52
52
|
def create_credit(reimbursement, unpaid_amount, simulate, created_by:)
|
53
|
-
creditable = create_creditable(reimbursement, unpaid_amount, created_by:
|
54
|
-
credit = reimbursement.credits.build(creditable
|
53
|
+
creditable = create_creditable(reimbursement, unpaid_amount, created_by:)
|
54
|
+
credit = reimbursement.credits.build(creditable:, amount: unpaid_amount)
|
55
55
|
simulate ? credit.readonly! : credit.save!
|
56
56
|
credit
|
57
57
|
end
|
@@ -61,7 +61,7 @@ module Spree
|
|
61
61
|
user: reimbursement.order.user,
|
62
62
|
amount: unpaid_amount,
|
63
63
|
category: reimbursement.store_credit_category,
|
64
|
-
created_by
|
64
|
+
created_by:,
|
65
65
|
memo: "Refund for uncreditable payments on order #{reimbursement.order.number}",
|
66
66
|
currency: reimbursement.order.currency
|
67
67
|
)
|
@@ -2,12 +2,17 @@
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
class ReimbursementType < Spree::Base
|
5
|
-
|
5
|
+
scope :active, -> { where(active: true) }
|
6
|
+
default_scope -> { order(arel_table[:name].lower) }
|
7
|
+
|
8
|
+
validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
|
6
9
|
|
7
10
|
ORIGINAL = 'original'
|
8
11
|
|
9
12
|
has_many :return_items
|
10
13
|
|
14
|
+
self.allowed_ransackable_attributes = %w[name]
|
15
|
+
|
11
16
|
# This method will reimburse the return items based on however it child implements it
|
12
17
|
# By default it takes a reimbursement, the return items it needs to reimburse, and if
|
13
18
|
# it is a simulation or a real reimbursement. This should return an array
|
@@ -4,6 +4,8 @@ module Spree
|
|
4
4
|
# Models the return of Inventory Units to a Stock Location for an Order.
|
5
5
|
#
|
6
6
|
class ReturnAuthorization < Spree::Base
|
7
|
+
include Metadata
|
8
|
+
|
7
9
|
belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations, optional: true
|
8
10
|
|
9
11
|
has_many :return_items, inverse_of: :return_authorization, dependent: :destroy
|
@@ -53,7 +53,7 @@ module Spree
|
|
53
53
|
scope :not_expired, -> { where.not(reception_status: 'expired') }
|
54
54
|
scope :received, -> { where(reception_status: 'received') }
|
55
55
|
INTERMEDIATE_RECEPTION_STATUSES.each do |reception_status|
|
56
|
-
scope reception_status, -> { where(reception_status:
|
56
|
+
scope reception_status, -> { where(reception_status:) }
|
57
57
|
end
|
58
58
|
scope :pending, -> { where(acceptance_status: 'pending') }
|
59
59
|
scope :accepted, -> { where(acceptance_status: 'accepted') }
|
@@ -67,7 +67,7 @@ module Spree
|
|
67
67
|
scope :exchange_processed, -> { where.not(exchange_inventory_unit: nil) }
|
68
68
|
scope :exchange_required, -> { exchange_requested.where(exchange_inventory_unit: nil) }
|
69
69
|
|
70
|
-
serialize :acceptance_status_errors
|
70
|
+
serialize :acceptance_status_errors, coder: YAML
|
71
71
|
|
72
72
|
delegate :eligible_for_return?, :requires_manual_intervention?, to: :validator
|
73
73
|
delegate :variant, to: :inventory_unit
|
@@ -93,8 +93,8 @@ module Spree
|
|
93
93
|
# @return [Spree::ReturnItem] a valid return item for the given inventory
|
94
94
|
# unit if one exists, or a new one if one does not
|
95
95
|
def self.from_inventory_unit(inventory_unit)
|
96
|
-
valid.find_by(inventory_unit:
|
97
|
-
new(inventory_unit:
|
96
|
+
valid.find_by(inventory_unit:) ||
|
97
|
+
new(inventory_unit:).tap(&:set_default_amount)
|
98
98
|
end
|
99
99
|
|
100
100
|
# @return [Boolean] true when an exchange has been requested on this return
|
@@ -130,7 +130,7 @@ module Spree
|
|
130
130
|
# @return [ActiveRecord::Relation<Spree::Variant>] the variants eligible
|
131
131
|
# for exchange for this return item
|
132
132
|
def eligible_exchange_variants(stock_locations = nil)
|
133
|
-
exchange_variant_engine.eligible_variants(variant, stock_locations:
|
133
|
+
exchange_variant_engine.eligible_variants(variant, stock_locations:)
|
134
134
|
end
|
135
135
|
|
136
136
|
# Builds the exchange inventory unit for this return item, only if an
|
@@ -248,20 +248,20 @@ module Spree
|
|
248
248
|
|
249
249
|
def validate_no_other_completed_return_items
|
250
250
|
other_return_item = Spree::ReturnItem.where({
|
251
|
-
inventory_unit_id
|
251
|
+
inventory_unit_id:,
|
252
252
|
reception_status: COMPLETED_RECEPTION_STATUSES
|
253
|
-
}).where.not(id:
|
253
|
+
}).where.not(id:).first
|
254
254
|
|
255
255
|
if other_return_item && (new_record? || COMPLETED_RECEPTION_STATUSES.include?(reception_status.to_sym))
|
256
256
|
errors.add(:inventory_unit, :other_completed_return_item_exists,
|
257
|
-
inventory_unit_id
|
257
|
+
inventory_unit_id:,
|
258
258
|
return_item_id: other_return_item.id)
|
259
259
|
end
|
260
260
|
end
|
261
261
|
|
262
262
|
def cancel_others
|
263
|
-
Spree::ReturnItem.where(inventory_unit_id:
|
264
|
-
.where.not(id:
|
263
|
+
Spree::ReturnItem.where(inventory_unit_id:)
|
264
|
+
.where.not(id:)
|
265
265
|
.valid
|
266
266
|
.each(&:cancel!)
|
267
267
|
end
|
@@ -2,10 +2,15 @@
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
class ReturnReason < Spree::Base
|
5
|
-
|
5
|
+
scope :active, -> { where(active: true) }
|
6
|
+
default_scope -> { order(arel_table[:name].lower) }
|
7
|
+
|
8
|
+
validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
|
6
9
|
|
7
10
|
has_many :return_authorizations
|
8
11
|
|
12
|
+
self.allowed_ransackable_attributes = %w[name]
|
13
|
+
|
9
14
|
def self.reasons_for_return_items(return_items)
|
10
15
|
# Only allow an inactive reason if it's already associated to a return item
|
11
16
|
active | return_items.map(&:return_reason).compact
|
data/app/models/spree/role.rb
CHANGED
@@ -4,8 +4,10 @@ module Spree
|
|
4
4
|
class Role < Spree::Base
|
5
5
|
has_many :role_users, class_name: "Spree::RoleUser", dependent: :destroy
|
6
6
|
has_many :users, through: :role_users
|
7
|
+
has_many :role_permissions, dependent: :destroy
|
8
|
+
has_many :permission_sets, through: :role_permissions
|
7
9
|
|
8
|
-
|
10
|
+
validates :name, presence: true, uniqueness: { case_sensitive: true, allow_blank: true }
|
9
11
|
|
10
12
|
def admin?
|
11
13
|
name == "admin"
|
@@ -4,6 +4,8 @@ module Spree
|
|
4
4
|
# An order's planned shipments including tracking and cost.
|
5
5
|
#
|
6
6
|
class Shipment < Spree::Base
|
7
|
+
include Metadata
|
8
|
+
|
7
9
|
belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments, optional: true
|
8
10
|
belongs_to :stock_location, class_name: 'Spree::StockLocation', optional: true
|
9
11
|
|
@@ -31,7 +33,7 @@ module Spree
|
|
31
33
|
scope :ready, -> { with_state('ready') }
|
32
34
|
scope :shipped, -> { with_state('shipped') }
|
33
35
|
scope :trackable, -> { where("tracking IS NOT NULL AND tracking != ''") }
|
34
|
-
scope :with_state, ->(*state) { where(state:
|
36
|
+
scope :with_state, ->(*state) { where(state:) }
|
35
37
|
# sort by most recent shipped_at, falling back to created_at. add "id desc" to make specs that involve this scope more deterministic.
|
36
38
|
scope :reverse_chronological, -> {
|
37
39
|
order(Arel.sql("coalesce(#{Spree::Shipment.table_name}.shipped_at, #{Spree::Shipment.table_name}.created_at) desc"), id: :desc)
|
@@ -92,7 +94,7 @@ module Spree
|
|
92
94
|
# @return [BigDecimal] the amount of this item, taking into consideration
|
93
95
|
# all non-tax adjustments.
|
94
96
|
def total_before_tax
|
95
|
-
amount + adjustments.
|
97
|
+
amount + adjustments.reject(&:tax?).sum(&:amount)
|
96
98
|
end
|
97
99
|
|
98
100
|
# @return [BigDecimal] the amount of this shipment before VAT tax
|
@@ -175,7 +177,7 @@ module Spree
|
|
175
177
|
end
|
176
178
|
|
177
179
|
def manifest
|
178
|
-
@manifest ||= Spree::ShippingManifest.new(inventory_units:
|
180
|
+
@manifest ||= Spree::ShippingManifest.new(inventory_units:).items
|
179
181
|
end
|
180
182
|
|
181
183
|
def selected_shipping_rate_id
|
@@ -217,7 +219,7 @@ module Spree
|
|
217
219
|
|
218
220
|
def set_up_inventory(state, variant, _order, line_item)
|
219
221
|
inventory_units.create(
|
220
|
-
state
|
222
|
+
state:,
|
221
223
|
variant_id: variant.id,
|
222
224
|
line_item_id: line_item.id
|
223
225
|
)
|
@@ -263,7 +265,7 @@ module Spree
|
|
263
265
|
self.cost = selected_shipping_rate.cost
|
264
266
|
if changed?
|
265
267
|
update_columns(
|
266
|
-
cost
|
268
|
+
cost:,
|
267
269
|
updated_at: Time.current
|
268
270
|
)
|
269
271
|
end
|
@@ -312,7 +314,7 @@ module Spree
|
|
312
314
|
end
|
313
315
|
|
314
316
|
def after_ship
|
315
|
-
order.shipping.ship_shipment(self, suppress_mailer:
|
317
|
+
order.shipping.ship_shipment(self, suppress_mailer:)
|
316
318
|
end
|
317
319
|
|
318
320
|
def can_get_rates?
|
@@ -339,7 +341,7 @@ module Spree
|
|
339
341
|
|
340
342
|
def ensure_can_destroy
|
341
343
|
if shipped? || canceled?
|
342
|
-
errors.add(:state, :cannot_destroy, state:
|
344
|
+
errors.add(:state, :cannot_destroy, state:)
|
343
345
|
throw :abort
|
344
346
|
end
|
345
347
|
end
|
@@ -18,8 +18,7 @@ module Spree
|
|
18
18
|
delegate :name, :tax_category, :tax_category_id, to: :shipping_method
|
19
19
|
delegate :code, to: :shipping_method, prefix: true
|
20
20
|
alias_attribute :amount, :cost
|
21
|
-
|
22
|
-
alias_method :total_before_tax, :amount
|
21
|
+
alias_attribute :total_before_tax, :cost
|
23
22
|
|
24
23
|
extend DisplayMoney
|
25
24
|
money_methods :amount
|
@@ -32,7 +31,7 @@ module Spree
|
|
32
31
|
tax_explanations = taxes.map(&:label).join(tax_label_separator)
|
33
32
|
|
34
33
|
I18n.t 'spree.shipping_rate.display_price.display_price_with_explanations',
|
35
|
-
price
|
34
|
+
price:,
|
36
35
|
explanations: tax_explanations
|
37
36
|
end
|
38
37
|
alias_method :display_cost, :display_price
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Spree
|
4
|
-
class
|
4
|
+
class SimpleOrderContents
|
5
5
|
attr_accessor :order
|
6
6
|
|
7
7
|
def initialize(order)
|
@@ -38,12 +38,7 @@ module Spree
|
|
38
38
|
if order.update(params)
|
39
39
|
unless order.completed?
|
40
40
|
order.line_items = order.line_items.select { |li| li.quantity > 0 }
|
41
|
-
# Update totals, then check if the order is eligible for any cart promotions.
|
42
|
-
# If we do not update first, then the item total will be wrong and ItemTotal
|
43
|
-
# promotion rules would not be triggered.
|
44
|
-
reload_totals
|
45
41
|
order.check_shipments_and_restart_checkout
|
46
|
-
PromotionHandler::Cart.new(order).activate
|
47
42
|
end
|
48
43
|
reload_totals
|
49
44
|
true
|
@@ -71,10 +66,8 @@ module Spree
|
|
71
66
|
private
|
72
67
|
|
73
68
|
def after_add_or_remove(line_item, options = {})
|
74
|
-
reload_totals
|
75
69
|
shipment = options[:shipment]
|
76
70
|
shipment.present? ? shipment.update_amounts : order.check_shipments_and_restart_checkout
|
77
|
-
PromotionHandler::Cart.new(order, line_item).activate
|
78
71
|
reload_totals
|
79
72
|
line_item
|
80
73
|
end
|
@@ -88,12 +81,15 @@ module Spree
|
|
88
81
|
|
89
82
|
line_item ||= order.line_items.new(
|
90
83
|
quantity: 0,
|
91
|
-
variant
|
92
|
-
adjustments: []
|
84
|
+
variant:,
|
85
|
+
adjustments: []
|
93
86
|
)
|
94
87
|
|
88
|
+
permitted_attributes = Spree::PermittedAttributes.line_item_attributes.dup
|
89
|
+
permitted_attributes << { admin_metadata: {} } if options[:admin_metadata].present?
|
90
|
+
|
95
91
|
line_item.quantity += quantity.to_i
|
96
|
-
line_item.options = ActionController::Parameters.new(options).permit(
|
92
|
+
line_item.options = ActionController::Parameters.new(options).permit(permitted_attributes).to_h
|
97
93
|
|
98
94
|
line_item.target_shipment = options[:shipment]
|
99
95
|
line_item.save!
|
@@ -117,7 +113,7 @@ module Spree
|
|
117
113
|
def grab_line_item_by_variant(variant, raise_error = false, options = {})
|
118
114
|
line_item = order.find_line_item_by_variant(variant, options)
|
119
115
|
|
120
|
-
if
|
116
|
+
if line_item.blank? && raise_error
|
121
117
|
raise ActiveRecord::RecordNotFound, "Line item not found for variant #{variant.sku}"
|
122
118
|
end
|
123
119
|
|