solidus_core 4.3.4 → 4.4.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/app/helpers/spree/base_helper.rb +2 -2
- 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/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/user_address_book.rb +4 -4
- data/app/models/concerns/spree/user_methods.rb +3 -3
- data/app/models/spree/address.rb +6 -6
- data/app/models/spree/adjustment.rb +13 -66
- data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
- data/app/models/spree/carton.rb +2 -2
- data/app/models/spree/credit_card.rb +6 -6
- 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/line_item.rb +1 -1
- 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/order.rb +15 -22
- data/app/models/spree/order_cancellations.rb +8 -8
- data/app/models/spree/order_mutex.rb +2 -2
- data/app/models/spree/order_shipping.rb +9 -9
- data/app/models/spree/order_updater.rb +6 -10
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/payment.rb +2 -2
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/store_credit.rb +1 -1
- data/app/models/spree/payment_source.rb +5 -1
- data/app/models/spree/permission_set.rb +11 -0
- data/app/models/spree/product.rb +7 -28
- data/app/models/spree/refund.rb +1 -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/return_item.rb +9 -9
- data/app/models/spree/role.rb +3 -1
- data/app/models/spree/role_permission.rb +8 -0
- data/app/models/spree/shipment.rb +7 -7
- data/app/models/spree/shipping_category.rb +2 -0
- data/app/models/spree/shipping_rate.rb +1 -1
- data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +4 -11
- 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 +1 -1
- data/app/models/spree/stock_location.rb +5 -5
- data/app/models/spree/store.rb +1 -1
- data/app/models/spree/store_credit.rb +17 -15
- data/app/models/spree/store_credit_event.rb +3 -3
- data/app/models/spree/tax_calculator/default.rb +2 -2
- 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 +3 -3
- data/app/models/spree/taxonomy.rb +2 -2
- data/app/models/spree/unit_cancel.rb +1 -2
- data/app/models/spree/variant/vat_price_generator.rb +1 -1
- data/app/models/spree/variant.rb +7 -2
- 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/config/locales/en.yml +4 -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 -117
- 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/seeds.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
- data/lib/generators/solidus/update/update_generator.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/test.rb +6 -1
- data/lib/spree/app_configuration.rb +53 -84
- data/lib/spree/core/class_constantizer.rb +2 -2
- data/lib/spree/core/controller_helpers/payment_parameters.rb +1 -1
- data/lib/spree/core/engine.rb +1 -0
- 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/order.rb +0 -1
- data/lib/spree/core/validators/email.rb +1 -1
- data/lib/spree/core/version.rb +2 -2
- data/lib/spree/core.rb +2 -6
- 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/permission_sets/base.rb +13 -1
- data/lib/spree/permission_sets/configuration_display.rb +10 -0
- data/lib/spree/permission_sets/configuration_management.rb +10 -0
- data/lib/spree/permission_sets/dashboard_display.rb +12 -0
- data/lib/spree/permission_sets/default_customer.rb +11 -1
- data/lib/spree/permission_sets/order_display.rb +10 -0
- data/lib/spree/permission_sets/order_management.rb +10 -0
- data/lib/spree/permission_sets/product_display.rb +10 -0
- data/lib/spree/permission_sets/product_management.rb +10 -0
- data/lib/spree/permission_sets/restricted_stock_display.rb +10 -0
- data/lib/spree/permission_sets/restricted_stock_management.rb +10 -0
- data/lib/spree/permission_sets/stock_display.rb +10 -0
- data/lib/spree/permission_sets/stock_management.rb +10 -0
- data/lib/spree/permission_sets/super_user.rb +10 -0
- data/lib/spree/permission_sets/user_display.rb +10 -0
- data/lib/spree/permission_sets/user_management.rb +10 -0
- data/lib/spree/permission_sets.rb +0 -2
- data/lib/spree/permitted_attributes.rb +2 -2
- data/lib/spree/preferences/store.rb +2 -2
- data/lib/spree/testing_support/capybara_ext.rb +1 -1
- data/lib/spree/testing_support/dummy_ability.rb +7 -0
- data/lib/spree/testing_support/dummy_app/database.yml +2 -2
- data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +2 -2
- data/lib/spree/testing_support/dummy_app.rb +17 -12
- 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 +5 -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 +6 -6
- metadata +60 -91
- 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/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/minimum_quantity.rb +0 -59
- 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_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/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/db/migrate/20231027084517_add_order_promotions_foreign_key.rb +0 -10
- data/db/migrate/20231031175215_add_promotion_order_promotion_foreign_key.rb +0 -10
- 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/ransack_4_1_patch.rb +0 -16
- 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
data/app/models/spree/order.rb
CHANGED
@@ -62,7 +62,7 @@ module Spree
|
|
62
62
|
go_to_state :confirm
|
63
63
|
end
|
64
64
|
|
65
|
-
self.allowed_ransackable_associations = %w[shipments user
|
65
|
+
self.allowed_ransackable_associations = %w[shipments user bill_address ship_address line_items]
|
66
66
|
self.allowed_ransackable_attributes = %w[completed_at created_at email number state payment_state shipment_state total store_id]
|
67
67
|
|
68
68
|
attr_reader :coupon_code
|
@@ -108,8 +108,6 @@ module Spree
|
|
108
108
|
foreign_key: :order_id,
|
109
109
|
dependent: :destroy,
|
110
110
|
inverse_of: :order
|
111
|
-
has_many :order_promotions, class_name: 'Spree::OrderPromotion', dependent: :destroy
|
112
|
-
has_many :promotions, through: :order_promotions
|
113
111
|
|
114
112
|
# Payments
|
115
113
|
has_many :payments, dependent: :destroy, inverse_of: :order
|
@@ -181,7 +179,7 @@ module Spree
|
|
181
179
|
end
|
182
180
|
|
183
181
|
def self.by_state(state)
|
184
|
-
where(state:
|
182
|
+
where(state:)
|
185
183
|
end
|
186
184
|
|
187
185
|
def self.complete
|
@@ -229,7 +227,7 @@ module Spree
|
|
229
227
|
end
|
230
228
|
|
231
229
|
def shipping_discount
|
232
|
-
shipment_adjustments.credit.
|
230
|
+
shipment_adjustments.credit.sum(:amount) * - 1
|
233
231
|
end
|
234
232
|
|
235
233
|
def to_param
|
@@ -316,7 +314,7 @@ module Spree
|
|
316
314
|
|
317
315
|
if persisted?
|
318
316
|
# immediately persist the changes we just made, but don't use save since we might have an invalid address associated
|
319
|
-
self.class.unscoped.where(id:
|
317
|
+
self.class.unscoped.where(id:).update_all(attrs_to_set)
|
320
318
|
end
|
321
319
|
|
322
320
|
assign_attributes(attrs_to_set)
|
@@ -450,7 +448,7 @@ module Spree
|
|
450
448
|
line_items.destroy_all
|
451
449
|
adjustments.destroy_all
|
452
450
|
shipments.destroy_all
|
453
|
-
|
451
|
+
Spree::Bus.publish :order_emptied, order: self
|
454
452
|
|
455
453
|
recalculate
|
456
454
|
end
|
@@ -464,7 +462,7 @@ module Spree
|
|
464
462
|
end
|
465
463
|
|
466
464
|
def can_add_coupon?
|
467
|
-
Spree::
|
465
|
+
Spree::Config.promotions.coupon_code_handler_class.new(self).can_apply?
|
468
466
|
end
|
469
467
|
|
470
468
|
def shipped?
|
@@ -508,11 +506,6 @@ module Spree
|
|
508
506
|
end
|
509
507
|
end
|
510
508
|
|
511
|
-
def apply_shipping_promotions
|
512
|
-
Spree::Config.shipping_promotion_handler_class.new(self).activate
|
513
|
-
recalculate
|
514
|
-
end
|
515
|
-
|
516
509
|
# Clean shipments and make order back to address state (or to whatever state
|
517
510
|
# is set by restart_checkout_flow in case of state machine modifications)
|
518
511
|
def check_shipments_and_restart_checkout
|
@@ -577,7 +570,7 @@ module Spree
|
|
577
570
|
|
578
571
|
def add_store_credit_payments
|
579
572
|
return if user.nil?
|
580
|
-
return if payments.store_credits.checkout.empty? && user.available_store_credit_total(currency:
|
573
|
+
return if payments.store_credits.checkout.empty? && user.available_store_credit_total(currency:).zero?
|
581
574
|
|
582
575
|
payments.store_credits.checkout.each(&:invalidate!)
|
583
576
|
|
@@ -588,7 +581,7 @@ module Spree
|
|
588
581
|
|
589
582
|
remaining_total = outstanding_balance - authorized_total
|
590
583
|
|
591
|
-
matching_store_credits = user.store_credits.where(currency:
|
584
|
+
matching_store_credits = user.store_credits.where(currency:)
|
592
585
|
|
593
586
|
if matching_store_credits.any?
|
594
587
|
payment_method = Spree::PaymentMethod::StoreCredit.first
|
@@ -600,7 +593,7 @@ module Spree
|
|
600
593
|
|
601
594
|
amount_to_take = [credit.amount_remaining, remaining_total].min
|
602
595
|
payments.create!(source: credit,
|
603
|
-
payment_method
|
596
|
+
payment_method:,
|
604
597
|
amount: amount_to_take,
|
605
598
|
state: 'checkout',
|
606
599
|
response_code: credit.generate_authorization_code)
|
@@ -624,13 +617,13 @@ module Spree
|
|
624
617
|
|
625
618
|
def covered_by_store_credit?
|
626
619
|
return false unless user
|
627
|
-
user.available_store_credit_total(currency:
|
620
|
+
user.available_store_credit_total(currency:) >= total
|
628
621
|
end
|
629
622
|
alias_method :covered_by_store_credit, :covered_by_store_credit?
|
630
623
|
|
631
624
|
def total_available_store_credit
|
632
625
|
return 0.0 unless user
|
633
|
-
user.available_store_credit_total(currency:
|
626
|
+
user.available_store_credit_total(currency:)
|
634
627
|
end
|
635
628
|
|
636
629
|
def order_total_after_store_credit
|
@@ -641,16 +634,16 @@ module Spree
|
|
641
634
|
if can_complete? || complete?
|
642
635
|
valid_store_credit_payments.to_a.sum(&:amount)
|
643
636
|
else
|
644
|
-
[total, user.try(:available_store_credit_total, currency:
|
637
|
+
[total, user.try(:available_store_credit_total, currency:) || 0.0].min
|
645
638
|
end
|
646
639
|
end
|
647
640
|
|
648
641
|
def display_total_applicable_store_credit
|
649
|
-
Spree::Money.new(-total_applicable_store_credit, { currency:
|
642
|
+
Spree::Money.new(-total_applicable_store_credit, { currency: })
|
650
643
|
end
|
651
644
|
|
652
645
|
def display_store_credit_remaining_after_capture
|
653
|
-
Spree::Money.new(total_available_store_credit - total_applicable_store_credit, { currency:
|
646
|
+
Spree::Money.new(total_available_store_credit - total_applicable_store_credit, { currency: })
|
654
647
|
end
|
655
648
|
|
656
649
|
def bill_address_attributes=(attributes)
|
@@ -799,7 +792,7 @@ module Spree
|
|
799
792
|
end
|
800
793
|
|
801
794
|
def ensure_promotions_eligible
|
802
|
-
Spree::Config.
|
795
|
+
Spree::Config.promotions.order_adjuster_class.new(self).call
|
803
796
|
|
804
797
|
if promo_total_changed?
|
805
798
|
restart_checkout_flow
|
@@ -36,7 +36,7 @@ class Spree::OrderCancellations
|
|
36
36
|
Spree::OrderMutex.with_lock!(@order) do
|
37
37
|
Spree::InventoryUnit.transaction do
|
38
38
|
inventory_units.each do |iu|
|
39
|
-
unit_cancels << short_ship_unit(iu, created_by:
|
39
|
+
unit_cancels << short_ship_unit(iu, created_by:)
|
40
40
|
end
|
41
41
|
|
42
42
|
update_shipped_shipments(inventory_units)
|
@@ -67,9 +67,9 @@ class Spree::OrderCancellations
|
|
67
67
|
|
68
68
|
Spree::OrderMutex.with_lock!(@order) do
|
69
69
|
unit_cancel = Spree::UnitCancel.create!(
|
70
|
-
inventory_unit
|
71
|
-
reason
|
72
|
-
created_by:
|
70
|
+
inventory_unit:,
|
71
|
+
reason:,
|
72
|
+
created_by:
|
73
73
|
)
|
74
74
|
|
75
75
|
inventory_unit.cancel!
|
@@ -89,8 +89,8 @@ class Spree::OrderCancellations
|
|
89
89
|
|
90
90
|
Spree::OrderMutex.with_lock!(@order) do
|
91
91
|
return_items = inventory_units.map(&:current_or_new_return_item)
|
92
|
-
reimbursement = Spree::Reimbursement.new(order: @order, return_items:
|
93
|
-
reimbursement.return_all(created_by:
|
92
|
+
reimbursement = Spree::Reimbursement.new(order: @order, return_items:)
|
93
|
+
reimbursement.return_all(created_by:)
|
94
94
|
end
|
95
95
|
|
96
96
|
reimbursement
|
@@ -100,9 +100,9 @@ class Spree::OrderCancellations
|
|
100
100
|
|
101
101
|
def short_ship_unit(inventory_unit, created_by: nil)
|
102
102
|
unit_cancel = Spree::UnitCancel.create!(
|
103
|
-
inventory_unit
|
103
|
+
inventory_unit:,
|
104
104
|
reason: Spree::UnitCancel::SHORT_SHIP,
|
105
|
-
created_by:
|
105
|
+
created_by:
|
106
106
|
)
|
107
107
|
unit_cancel.adjust!
|
108
108
|
inventory_unit.cancel!
|
@@ -16,10 +16,10 @@ module Spree
|
|
16
16
|
raise ArgumentError, "order must be supplied" if order.nil?
|
17
17
|
|
18
18
|
# limit the maximum lock time just in case a lock is somehow left in place accidentally
|
19
|
-
expired.where(order:
|
19
|
+
expired.where(order:).delete_all
|
20
20
|
|
21
21
|
begin
|
22
|
-
order_mutex = create!(order:
|
22
|
+
order_mutex = create!(order:)
|
23
23
|
rescue ActiveRecord::RecordNotUnique
|
24
24
|
error = LockFailed.new("Could not obtain lock on order #{order.id}")
|
25
25
|
logger.error error.inspect
|
@@ -22,11 +22,11 @@ class Spree::OrderShipping
|
|
22
22
|
address: shipment.order.ship_address,
|
23
23
|
shipping_method: shipment.shipping_method,
|
24
24
|
shipped_at: Time.current,
|
25
|
-
external_number
|
25
|
+
external_number:,
|
26
26
|
# TODO: Remove the `|| shipment.tracking` once Shipment#ship! is called by
|
27
27
|
# OrderShipping#ship rather than vice versa
|
28
28
|
tracking_number: tracking_number || shipment.tracking,
|
29
|
-
suppress_mailer:
|
29
|
+
suppress_mailer:
|
30
30
|
)
|
31
31
|
end
|
32
32
|
|
@@ -51,12 +51,12 @@ class Spree::OrderShipping
|
|
51
51
|
inventory_units.each(&:ship!)
|
52
52
|
|
53
53
|
carton = Spree::Carton.create!(
|
54
|
-
stock_location
|
55
|
-
address
|
56
|
-
shipping_method
|
57
|
-
inventory_units
|
58
|
-
shipped_at
|
59
|
-
external_number
|
54
|
+
stock_location:,
|
55
|
+
address:,
|
56
|
+
shipping_method:,
|
57
|
+
inventory_units:,
|
58
|
+
shipped_at:,
|
59
|
+
external_number:,
|
60
60
|
tracking: tracking_number
|
61
61
|
)
|
62
62
|
end
|
@@ -80,7 +80,7 @@ class Spree::OrderShipping
|
|
80
80
|
|
81
81
|
def send_shipment_emails(carton)
|
82
82
|
carton.orders.each do |order|
|
83
|
-
Spree::Config.carton_shipped_email_class.shipped_email(order
|
83
|
+
Spree::Config.carton_shipped_email_class.shipped_email(order:, carton:).deliver_later
|
84
84
|
end
|
85
85
|
end
|
86
86
|
end
|
@@ -26,7 +26,7 @@ module Spree
|
|
26
26
|
update_shipments
|
27
27
|
update_shipment_state
|
28
28
|
end
|
29
|
-
Spree::Bus.publish
|
29
|
+
Spree::Bus.publish(:order_recalculated, order:)
|
30
30
|
persist_totals
|
31
31
|
end
|
32
32
|
end
|
@@ -114,7 +114,6 @@ module Spree
|
|
114
114
|
# http://www.boe.ca.gov/formspubs/pub113/
|
115
115
|
update_promotions
|
116
116
|
update_taxes
|
117
|
-
update_cancellations
|
118
117
|
update_item_totals
|
119
118
|
end
|
120
119
|
|
@@ -158,9 +157,9 @@ module Spree
|
|
158
157
|
recalculate_adjustments
|
159
158
|
|
160
159
|
all_items = line_items + shipments
|
161
|
-
order_tax_adjustments = adjustments.select(&:
|
160
|
+
order_tax_adjustments = adjustments.select(&:tax?)
|
162
161
|
|
163
|
-
order.adjustment_total = all_items.sum(&:adjustment_total) + adjustments.
|
162
|
+
order.adjustment_total = all_items.sum(&:adjustment_total) + adjustments.sum(&:amount)
|
164
163
|
order.included_tax_total = all_items.sum(&:included_tax_total) + order_tax_adjustments.select(&:included?).sum(&:amount)
|
165
164
|
order.additional_tax_total = all_items.sum(&:additional_tax_total) + order_tax_adjustments.reject(&:included?).sum(&:amount)
|
166
165
|
|
@@ -189,14 +188,14 @@ module Spree
|
|
189
188
|
order.state_changes.new(
|
190
189
|
previous_state: old_state,
|
191
190
|
next_state: new_state,
|
192
|
-
name
|
191
|
+
name:,
|
193
192
|
user_id: order.user_id
|
194
193
|
)
|
195
194
|
end
|
196
195
|
end
|
197
196
|
|
198
197
|
def update_promotions
|
199
|
-
Spree::Config.
|
198
|
+
Spree::Config.promotions.order_adjuster_class.new(order).call
|
200
199
|
end
|
201
200
|
|
202
201
|
def update_taxes
|
@@ -217,17 +216,14 @@ module Spree
|
|
217
216
|
end
|
218
217
|
|
219
218
|
def update_cancellations
|
220
|
-
line_items.each do |line_item|
|
221
|
-
line_item.adjustments.select(&:cancellation?).each(&:recalculate)
|
222
|
-
end
|
223
219
|
end
|
220
|
+
deprecate :update_cancellations, deprecator: Spree.deprecator
|
224
221
|
|
225
222
|
def update_item_totals
|
226
223
|
[*line_items, *shipments].each do |item|
|
227
224
|
# The cancellation_total isn't persisted anywhere but is included in
|
228
225
|
# the adjustment_total
|
229
226
|
item.adjustment_total = item.adjustments.
|
230
|
-
select(&:eligible?).
|
231
227
|
reject(&:included?).
|
232
228
|
sum(&:amount)
|
233
229
|
|
@@ -64,7 +64,7 @@ module Spree
|
|
64
64
|
complete! if handle_response(response)
|
65
65
|
end
|
66
66
|
|
67
|
-
capture_events.create!(amount:
|
67
|
+
capture_events.create!(amount:)
|
68
68
|
end
|
69
69
|
|
70
70
|
# Takes the amount in cents to capture.
|
@@ -243,7 +243,7 @@ module Spree
|
|
243
243
|
cvv_result: response.cvv_result,
|
244
244
|
error_code: response.error_code,
|
245
245
|
emv_authorization: response.emv_authorization,
|
246
|
-
gateway_order_id
|
246
|
+
gateway_order_id:,
|
247
247
|
order_number: order.number
|
248
248
|
}
|
249
249
|
end
|
data/app/models/spree/payment.rb
CHANGED
@@ -69,7 +69,7 @@ module Spree
|
|
69
69
|
|
70
70
|
# @return [Spree::Money] this amount of this payment as money object
|
71
71
|
def money
|
72
|
-
Spree::Money.new(amount, { currency:
|
72
|
+
Spree::Money.new(amount, { currency: })
|
73
73
|
end
|
74
74
|
alias display_amount money
|
75
75
|
|
@@ -211,7 +211,7 @@ module Spree
|
|
211
211
|
def set_unique_identifier
|
212
212
|
loop do
|
213
213
|
self.number = generate_identifier
|
214
|
-
break unless self.class.exists?(number:
|
214
|
+
break unless self.class.exists?(number:)
|
215
215
|
end
|
216
216
|
end
|
217
217
|
|
@@ -107,7 +107,7 @@ module Spree
|
|
107
107
|
store_credit = Spree::StoreCreditEvent.find_by(authorization_code: auth_code).try(:store_credit)
|
108
108
|
|
109
109
|
if store_credit.nil?
|
110
|
-
ActiveMerchant::Billing::Response.new(false, I18n.t('spree.store_credit.unable_to_find_for_action', auth_code
|
110
|
+
ActiveMerchant::Billing::Response.new(false, I18n.t('spree.store_credit.unable_to_find_for_action', auth_code:, action: action_name), {}, {})
|
111
111
|
else
|
112
112
|
handle_action_call(store_credit, action, action_name, auth_code)
|
113
113
|
end
|
@@ -7,7 +7,11 @@ module Spree
|
|
7
7
|
belongs_to :payment_method, optional: true
|
8
8
|
|
9
9
|
has_many :payments, as: :source
|
10
|
-
has_many :wallet_payment_sources,
|
10
|
+
has_many :wallet_payment_sources,
|
11
|
+
class_name: 'Spree::WalletPaymentSource',
|
12
|
+
as: :payment_source,
|
13
|
+
inverse_of: :payment_source,
|
14
|
+
dependent: :destroy
|
11
15
|
|
12
16
|
attr_accessor :imported
|
13
17
|
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PermissionSet < Spree::Base
|
5
|
+
has_many :role_permissions
|
6
|
+
has_many :roles, through: :role_permissions
|
7
|
+
validates :name, :set, :privilege, :category, presence: true
|
8
|
+
scope :display_permissions, -> { where(privilege: "display") }
|
9
|
+
scope :management_permissions, -> { where(privilege: "management") }
|
10
|
+
end
|
11
|
+
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,9 +30,6 @@ 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
|
39
35
|
|
@@ -61,6 +57,8 @@ module Spree
|
|
61
57
|
has_many :line_items, through: :variants_including_master
|
62
58
|
has_many :orders, through: :line_items
|
63
59
|
|
60
|
+
has_many :option_values, -> { distinct }, through: :variants_including_master
|
61
|
+
|
64
62
|
scope :sort_by_master_default_price_amount_asc, -> {
|
65
63
|
with_default_price.order('spree_prices.amount ASC')
|
66
64
|
}
|
@@ -131,26 +129,8 @@ module Spree
|
|
131
129
|
|
132
130
|
alias :options :product_option_types
|
133
131
|
|
134
|
-
|
135
|
-
|
136
|
-
#
|
137
|
-
# Usage:
|
138
|
-
# Spree::Product.ransack(
|
139
|
-
# variants_option_values_in: [option_value_id1, option_value_id2]
|
140
|
-
# ).result
|
141
|
-
ransacker :variants_option_values, formatter: proc { |v|
|
142
|
-
if OptionValue.exists?(v)
|
143
|
-
joins(variants_including_master: :option_values)
|
144
|
-
.where(spree_option_values: { id: v })
|
145
|
-
.distinct
|
146
|
-
.select(:id).arel
|
147
|
-
end
|
148
|
-
} do |parent|
|
149
|
-
parent.table[:id]
|
150
|
-
end
|
151
|
-
|
152
|
-
self.allowed_ransackable_associations = %w[stores variants_including_master master variants]
|
153
|
-
self.allowed_ransackable_attributes = %w[name slug variants_option_values]
|
132
|
+
self.allowed_ransackable_associations = %w[stores variants_including_master master variants option_values]
|
133
|
+
self.allowed_ransackable_attributes = %w[name slug]
|
154
134
|
self.allowed_ransackable_scopes = %i[available with_discarded with_all_variant_sku_cont with_kept_variant_sku_cont]
|
155
135
|
|
156
136
|
# @return [Boolean] true if there are any variants
|
@@ -270,7 +250,7 @@ module Spree
|
|
270
250
|
ActiveRecord::Base.transaction do
|
271
251
|
# Works around spree_i18n https://github.com/spree/spree/issues/301
|
272
252
|
property = Spree::Property.create_with(presentation: property_name).find_or_create_by(name: property_name)
|
273
|
-
product_property = Spree::ProductProperty.where(product: self, property:
|
253
|
+
product_property = Spree::ProductProperty.where(product: self, property:).first_or_initialize
|
274
254
|
product_property.value = property_value
|
275
255
|
product_property.save!
|
276
256
|
end
|
@@ -278,8 +258,7 @@ module Spree
|
|
278
258
|
|
279
259
|
# @return [Array] all advertised and not-rejected promotions
|
280
260
|
def possible_promotions
|
281
|
-
|
282
|
-
Spree::Promotion.advertised.where(id: promotion_ids).reject(&:inactive?)
|
261
|
+
Spree::Config.promotions.advertiser_class.for_product(self)
|
283
262
|
end
|
284
263
|
|
285
264
|
# The number of on-hand stock items; Infinity if any variant does not track
|
@@ -384,7 +363,7 @@ module Spree
|
|
384
363
|
end
|
385
364
|
|
386
365
|
def remove_taxon(taxon)
|
387
|
-
removed_classifications = classifications.where(taxon:
|
366
|
+
removed_classifications = classifications.where(taxon:)
|
388
367
|
removed_classifications.each(&:remove_from_list)
|
389
368
|
end
|
390
369
|
end
|
data/app/models/spree/refund.rb
CHANGED
@@ -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
|
)
|
@@ -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') }
|
@@ -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
|