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.
Files changed (211) hide show
  1. checksums.yaml +4 -4
  2. data/app/helpers/spree/base_helper.rb +2 -2
  3. data/app/mailers/spree/base_mailer.rb +1 -1
  4. data/app/mailers/spree/carton_mailer.rb +1 -1
  5. data/app/mailers/spree/order_mailer.rb +3 -3
  6. data/app/mailers/spree/reimbursement_mailer.rb +1 -1
  7. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
  8. data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
  9. data/app/models/concerns/spree/display_money.rb +1 -1
  10. data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
  11. data/app/models/concerns/spree/user_address_book.rb +4 -4
  12. data/app/models/concerns/spree/user_methods.rb +3 -3
  13. data/app/models/spree/address.rb +6 -6
  14. data/app/models/spree/adjustment.rb +13 -66
  15. data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
  16. data/app/models/spree/carton.rb +2 -2
  17. data/app/models/spree/credit_card.rb +6 -6
  18. data/app/models/spree/deprecated_configurable_class.rb +40 -0
  19. data/app/models/spree/fulfilment_changer.rb +4 -4
  20. data/app/models/spree/inventory_unit.rb +2 -2
  21. data/app/models/spree/line_item.rb +1 -1
  22. data/app/models/spree/null_promotion_adjuster.rb +13 -0
  23. data/app/models/spree/null_promotion_advertiser.rb +9 -0
  24. data/app/models/spree/null_promotion_finder.rb +9 -0
  25. data/app/models/spree/null_promotion_handler.rb +44 -0
  26. data/app/models/spree/order.rb +15 -22
  27. data/app/models/spree/order_cancellations.rb +8 -8
  28. data/app/models/spree/order_mutex.rb +2 -2
  29. data/app/models/spree/order_shipping.rb +9 -9
  30. data/app/models/spree/order_updater.rb +6 -10
  31. data/app/models/spree/payment/processing.rb +2 -2
  32. data/app/models/spree/payment.rb +2 -2
  33. data/app/models/spree/payment_create.rb +1 -1
  34. data/app/models/spree/payment_method/store_credit.rb +1 -1
  35. data/app/models/spree/payment_source.rb +5 -1
  36. data/app/models/spree/permission_set.rb +11 -0
  37. data/app/models/spree/product.rb +7 -28
  38. data/app/models/spree/refund.rb +1 -1
  39. data/app/models/spree/reimbursement.rb +4 -4
  40. data/app/models/spree/reimbursement_performer.rb +3 -3
  41. data/app/models/spree/reimbursement_tax_calculator.rb +2 -2
  42. data/app/models/spree/reimbursement_type/credit.rb +1 -1
  43. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
  44. data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
  45. data/app/models/spree/return_item.rb +9 -9
  46. data/app/models/spree/role.rb +3 -1
  47. data/app/models/spree/role_permission.rb +8 -0
  48. data/app/models/spree/shipment.rb +7 -7
  49. data/app/models/spree/shipping_category.rb +2 -0
  50. data/app/models/spree/shipping_rate.rb +1 -1
  51. data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +4 -11
  52. data/app/models/spree/stock/estimator.rb +1 -1
  53. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  54. data/app/models/spree/stock/package.rb +2 -2
  55. data/app/models/spree/stock/simple_coordinator.rb +1 -1
  56. data/app/models/spree/stock_location.rb +5 -5
  57. data/app/models/spree/store.rb +1 -1
  58. data/app/models/spree/store_credit.rb +17 -15
  59. data/app/models/spree/store_credit_event.rb +3 -3
  60. data/app/models/spree/tax_calculator/default.rb +2 -2
  61. data/app/models/spree/tax_calculator/shipping_rate.rb +1 -1
  62. data/app/models/spree/tax_category.rb +3 -1
  63. data/app/models/spree/tax_rate.rb +3 -3
  64. data/app/models/spree/taxonomy.rb +2 -2
  65. data/app/models/spree/unit_cancel.rb +1 -2
  66. data/app/models/spree/variant/vat_price_generator.rb +1 -1
  67. data/app/models/spree/variant.rb +7 -2
  68. data/app/models/spree/wallet.rb +2 -2
  69. data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
  70. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  71. data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
  72. data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
  73. data/config/locales/en.yml +4 -90
  74. data/db/default/spree/permission_sets.rb +10 -0
  75. data/db/default/spree/return_reasons.rb +3 -1
  76. data/db/default/spree/states.rb +1 -1
  77. data/db/migrate/20160101010000_solidus_one_four.rb +0 -117
  78. data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
  79. data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
  80. data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
  81. data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
  82. data/db/seeds.rb +1 -0
  83. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
  84. data/lib/generators/solidus/update/update_generator.rb +1 -1
  85. data/lib/generators/spree/dummy/templates/rails/test.rb +6 -1
  86. data/lib/spree/app_configuration.rb +53 -84
  87. data/lib/spree/core/class_constantizer.rb +2 -2
  88. data/lib/spree/core/controller_helpers/payment_parameters.rb +1 -1
  89. data/lib/spree/core/engine.rb +1 -0
  90. data/lib/spree/core/environment/calculators.rb +35 -3
  91. data/lib/spree/core/environment/promotions.rb +25 -4
  92. data/lib/spree/core/environment_extension.rb +16 -2
  93. data/lib/spree/core/importer/order.rb +5 -5
  94. data/lib/spree/core/importer/product.rb +3 -3
  95. data/lib/spree/core/nested_class_set.rb +28 -0
  96. data/lib/spree/core/null_promotion_configuration.rb +84 -0
  97. data/lib/spree/core/product_filters.rb +1 -1
  98. data/lib/spree/core/search/variant.rb +2 -2
  99. data/lib/spree/core/state_machines/order.rb +0 -1
  100. data/lib/spree/core/validators/email.rb +1 -1
  101. data/lib/spree/core/version.rb +2 -2
  102. data/lib/spree/core.rb +2 -6
  103. data/lib/spree/deprecator.rb +9 -0
  104. data/lib/spree/i18n.rb +1 -1
  105. data/lib/spree/mailer_previews/carton_preview.rb +1 -1
  106. data/lib/spree/permission_sets/base.rb +13 -1
  107. data/lib/spree/permission_sets/configuration_display.rb +10 -0
  108. data/lib/spree/permission_sets/configuration_management.rb +10 -0
  109. data/lib/spree/permission_sets/dashboard_display.rb +12 -0
  110. data/lib/spree/permission_sets/default_customer.rb +11 -1
  111. data/lib/spree/permission_sets/order_display.rb +10 -0
  112. data/lib/spree/permission_sets/order_management.rb +10 -0
  113. data/lib/spree/permission_sets/product_display.rb +10 -0
  114. data/lib/spree/permission_sets/product_management.rb +10 -0
  115. data/lib/spree/permission_sets/restricted_stock_display.rb +10 -0
  116. data/lib/spree/permission_sets/restricted_stock_management.rb +10 -0
  117. data/lib/spree/permission_sets/stock_display.rb +10 -0
  118. data/lib/spree/permission_sets/stock_management.rb +10 -0
  119. data/lib/spree/permission_sets/super_user.rb +10 -0
  120. data/lib/spree/permission_sets/user_display.rb +10 -0
  121. data/lib/spree/permission_sets/user_management.rb +10 -0
  122. data/lib/spree/permission_sets.rb +0 -2
  123. data/lib/spree/permitted_attributes.rb +2 -2
  124. data/lib/spree/preferences/store.rb +2 -2
  125. data/lib/spree/testing_support/capybara_ext.rb +1 -1
  126. data/lib/spree/testing_support/dummy_ability.rb +7 -0
  127. data/lib/spree/testing_support/dummy_app/database.yml +2 -2
  128. data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
  129. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +2 -2
  130. data/lib/spree/testing_support/dummy_app.rb +17 -12
  131. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -2
  132. data/lib/spree/testing_support/factories/calculator_factory.rb +1 -5
  133. data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
  134. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
  135. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +3 -3
  136. data/lib/spree/testing_support/factories/order_factory.rb +5 -24
  137. data/lib/spree/testing_support/factories/product_factory.rb +1 -1
  138. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -1
  139. data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -1
  140. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
  141. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  142. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  143. data/lib/spree/testing_support/order_walkthrough.rb +3 -3
  144. data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
  145. data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
  146. data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
  147. data/lib/tasks/colorado_delivery_fee.rake +2 -2
  148. data/solidus_core.gemspec +6 -6
  149. metadata +60 -91
  150. data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
  151. data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
  152. data/app/models/spree/calculator/distributed_amount.rb +0 -33
  153. data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
  154. data/app/models/spree/calculator/flexi_rate.rb +0 -22
  155. data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
  156. data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
  157. data/app/models/spree/calculator/tiered_percent.rb +0 -62
  158. data/app/models/spree/order_promotion.rb +0 -27
  159. data/app/models/spree/promotion/actions/create_adjustment.rb +0 -81
  160. data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -98
  161. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
  162. data/app/models/spree/promotion/actions/free_shipping.rb +0 -59
  163. data/app/models/spree/promotion/order_adjustments_recalculator.rb +0 -92
  164. data/app/models/spree/promotion/rules/first_order.rb +0 -38
  165. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
  166. data/app/models/spree/promotion/rules/item_total.rb +0 -86
  167. data/app/models/spree/promotion/rules/minimum_quantity.rb +0 -59
  168. data/app/models/spree/promotion/rules/nth_order.rb +0 -45
  169. data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
  170. data/app/models/spree/promotion/rules/option_value.rb +0 -50
  171. data/app/models/spree/promotion/rules/product.rb +0 -86
  172. data/app/models/spree/promotion/rules/store.rb +0 -26
  173. data/app/models/spree/promotion/rules/taxon.rb +0 -91
  174. data/app/models/spree/promotion/rules/user.rb +0 -34
  175. data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
  176. data/app/models/spree/promotion/rules/user_role.rb +0 -45
  177. data/app/models/spree/promotion.rb +0 -271
  178. data/app/models/spree/promotion_action.rb +0 -47
  179. data/app/models/spree/promotion_category.rb +0 -8
  180. data/app/models/spree/promotion_chooser.rb +0 -34
  181. data/app/models/spree/promotion_code/batch_builder.rb +0 -64
  182. data/app/models/spree/promotion_code.rb +0 -54
  183. data/app/models/spree/promotion_code_batch.rb +0 -27
  184. data/app/models/spree/promotion_handler/cart.rb +0 -75
  185. data/app/models/spree/promotion_handler/coupon.rb +0 -123
  186. data/app/models/spree/promotion_handler/page.rb +0 -26
  187. data/app/models/spree/promotion_handler/shipping.rb +0 -61
  188. data/app/models/spree/promotion_rule.rb +0 -55
  189. data/app/models/spree/promotion_rule_store.rb +0 -10
  190. data/app/models/spree/promotion_rule_taxon.rb +0 -8
  191. data/app/models/spree/promotion_rule_user.rb +0 -10
  192. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
  193. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
  194. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
  195. data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
  196. data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
  197. data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
  198. data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +0 -20
  199. data/db/migrate/20230322085416_remove_match_policy_from_spree_promotion.rb +0 -5
  200. data/db/migrate/20230325132905_remove_unused_columns_from_promotion_rules.rb +0 -6
  201. data/db/migrate/20230325161633_drop_unused_promo_action_line_items.rb +0 -13
  202. data/db/migrate/20231027084517_add_order_promotions_foreign_key.rb +0 -10
  203. data/db/migrate/20231031175215_add_promotion_order_promotion_foreign_key.rb +0 -10
  204. data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
  205. data/lib/spree/permission_sets/promotion_display.rb +0 -25
  206. data/lib/spree/permission_sets/promotion_management.rb +0 -25
  207. data/lib/spree/ransack_4_1_patch.rb +0 -16
  208. data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -8
  209. data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -7
  210. data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -8
  211. data/lib/spree/testing_support/factories/promotion_factory.rb +0 -98
@@ -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 order_promotions promotions bill_address ship_address line_items]
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: 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.eligible.sum(:amount) * - 1
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: id).update_all(attrs_to_set)
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
- order_promotions.destroy_all
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::Promotion.order_activatable?(self)
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: currency).zero?
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: 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: 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: currency) >= total
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: 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: currency) || 0.0].min
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: 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: 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.promotion_adjuster_class.new(self).call
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: 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: inventory_unit,
71
- reason: reason,
72
- created_by: 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: return_items)
93
- reimbursement.return_all(created_by: 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: inventory_unit,
103
+ inventory_unit:,
104
104
  reason: Spree::UnitCancel::SHORT_SHIP,
105
- created_by: 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: order).delete_all
19
+ expired.where(order:).delete_all
20
20
 
21
21
  begin
22
- order_mutex = create!(order: 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: 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: 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: stock_location,
55
- address: address,
56
- shipping_method: shipping_method,
57
- inventory_units: inventory_units,
58
- shipped_at: shipped_at,
59
- external_number: 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: order, carton: carton).deliver_later
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 :order_recalculated, order: order
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(&:eligible?).select(&:tax?)
160
+ order_tax_adjustments = adjustments.select(&:tax?)
162
161
 
163
- order.adjustment_total = all_items.sum(&:adjustment_total) + adjustments.select(&:eligible?).sum(&:amount)
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: 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.promotion_adjuster_class.new(order).call
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: 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: gateway_order_id,
246
+ gateway_order_id:,
247
247
  order_number: order.number
248
248
  }
249
249
  end
@@ -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: 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: number)
214
+ break unless self.class.exists?(number:)
215
215
  end
216
216
  end
217
217
 
@@ -72,7 +72,7 @@ module Spree
72
72
 
73
73
  def available_cards
74
74
  if user_id = order.user_id
75
- Spree::CreditCard.where(user_id: user_id)
75
+ Spree::CreditCard.where(user_id:)
76
76
  else
77
77
  Spree::CreditCard.none
78
78
  end
@@ -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: auth_code, action: action_name), {}, {})
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, class_name: 'Spree::WalletPaymentSource', as: :payment_source, inverse_of: :payment_source
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
@@ -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
- # The :variants_option_values ransacker filters Spree::Product based on
135
- # variant option values ids.
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: property).first_or_initialize
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
- promotion_ids = promotion_rules.map(&:promotion_id).uniq
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: taxon)
366
+ removed_classifications = classifications.where(taxon:)
388
367
  removed_classifications.each(&:remove_from_list)
389
368
  end
390
369
  end
@@ -21,7 +21,7 @@ module Spree
21
21
  delegate :currency, to: :payment
22
22
 
23
23
  def money
24
- Spree::Money.new(amount, { currency: currency })
24
+ Spree::Money.new(amount, { currency: })
25
25
  end
26
26
  alias display_amount money
27
27
 
@@ -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: 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: 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: 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: 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: 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: 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: 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: additional_tax_total,
30
- included_tax_total: 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: 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: 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: payment,
36
- amount: 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: created_by)
54
- credit = reimbursement.credits.build(creditable: creditable, amount: unpaid_amount)
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: 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
  )
@@ -25,7 +25,7 @@ class Spree::ReimbursementType::StoreCredit < Spree::ReimbursementType
25
25
  unpaid_amount,
26
26
  simulate,
27
27
  reimbursement_list,
28
- created_by: created_by
28
+ created_by:
29
29
  )
30
30
  end
31
31
 
@@ -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: 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: inventory_unit) ||
97
- new(inventory_unit: inventory_unit).tap(&:set_default_amount)
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: 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: inventory_unit_id,
251
+ inventory_unit_id:,
252
252
  reception_status: COMPLETED_RECEPTION_STATUSES
253
- }).where.not(id: id).first
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: 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: inventory_unit_id)
264
- .where.not(id: id)
263
+ Spree::ReturnItem.where(inventory_unit_id:)
264
+ .where.not(id:)
265
265
  .valid
266
266
  .each(&:cancel!)
267
267
  end