solidus_core 2.11.10 → 3.3.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.
Files changed (252) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -2
  3. data/app/assets/javascripts/spree.js.erb +0 -51
  4. data/app/controllers/spree/base_controller.rb +1 -1
  5. data/app/helpers/spree/base_helper.rb +1 -1
  6. data/app/helpers/spree/products_helper.rb +2 -2
  7. data/app/helpers/spree/store_helper.rb +0 -11
  8. data/app/mailers/spree/carton_mailer.rb +1 -5
  9. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
  10. data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
  11. data/app/models/concerns/spree/adjustment_source.rb +0 -15
  12. data/app/models/concerns/spree/calculated_adjustments.rb +0 -18
  13. data/app/models/concerns/spree/default_price.rb +39 -10
  14. data/app/models/concerns/spree/ransackable_attributes.rb +24 -4
  15. data/app/models/concerns/spree/soft_deletable.rb +2 -4
  16. data/app/models/concerns/spree/user_address_book.rb +10 -37
  17. data/app/models/concerns/spree/user_methods.rb +38 -13
  18. data/app/models/spree/ability.rb +0 -37
  19. data/app/models/spree/address/name.rb +2 -20
  20. data/app/models/spree/address.rb +8 -186
  21. data/app/models/spree/adjustment.rb +7 -33
  22. data/app/models/spree/base.rb +0 -53
  23. data/app/models/spree/calculator/flat_fee.rb +21 -0
  24. data/app/models/spree/calculator/flexi_rate.rb +0 -5
  25. data/app/models/spree/calculator.rb +0 -7
  26. data/app/models/spree/carton.rb +1 -1
  27. data/app/models/spree/country.rb +2 -7
  28. data/app/models/spree/credit_card.rb +1 -28
  29. data/app/models/spree/customer_return.rb +5 -7
  30. data/app/models/spree/image/active_storage_attachment.rb +2 -7
  31. data/app/models/spree/image/paperclip_attachment.rb +2 -2
  32. data/app/models/spree/image.rb +0 -7
  33. data/app/models/spree/inventory_unit.rb +0 -21
  34. data/app/models/spree/line_item.rb +6 -49
  35. data/app/models/spree/log_entry.rb +74 -1
  36. data/app/models/spree/option_type.rb +1 -1
  37. data/app/models/spree/option_value.rb +10 -1
  38. data/app/models/spree/order/number_generator.rb +7 -1
  39. data/app/models/spree/order.rb +82 -170
  40. data/app/models/spree/order_cancellations.rb +4 -24
  41. data/app/models/spree/order_contents.rb +2 -1
  42. data/app/models/spree/order_inventory.rb +1 -1
  43. data/app/models/spree/order_merger.rb +2 -2
  44. data/app/models/spree/order_promotion.rb +1 -1
  45. data/app/models/spree/order_shipping.rb +6 -9
  46. data/app/models/spree/order_taxation.rb +6 -4
  47. data/app/models/spree/order_updater.rb +17 -16
  48. data/app/models/spree/payment/cancellation.rb +1 -1
  49. data/app/models/spree/payment/processing.rb +58 -55
  50. data/app/models/spree/payment.rb +0 -3
  51. data/app/models/spree/payment_create.rb +1 -13
  52. data/app/models/spree/payment_method/bogus_credit_card.rb +6 -7
  53. data/app/models/spree/payment_method/credit_card.rb +1 -3
  54. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +8 -0
  55. data/app/models/spree/payment_method.rb +26 -110
  56. data/app/models/spree/price.rb +3 -3
  57. data/app/models/spree/product/scopes.rb +24 -33
  58. data/app/models/spree/product.rb +15 -42
  59. data/app/models/spree/product_property.rb +1 -1
  60. data/app/models/spree/promotion/actions/create_adjustment.rb +4 -3
  61. data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -9
  62. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -3
  63. data/app/models/spree/promotion/actions/free_shipping.rb +1 -0
  64. data/app/models/spree/promotion/order_adjustments_recalculator.rb +92 -0
  65. data/app/models/spree/promotion/rules/item_total.rb +50 -6
  66. data/app/models/spree/promotion/rules/product.rb +20 -8
  67. data/app/models/spree/promotion/rules/store.rb +4 -0
  68. data/app/models/spree/promotion/rules/taxon.rb +6 -15
  69. data/app/models/spree/promotion/rules/user.rb +4 -0
  70. data/app/models/spree/promotion.rb +39 -32
  71. data/app/models/spree/promotion_action.rb +6 -9
  72. data/app/models/spree/promotion_code/batch_builder.rb +0 -14
  73. data/app/models/spree/promotion_code.rb +11 -7
  74. data/app/models/spree/promotion_handler/cart.rb +26 -6
  75. data/app/models/spree/promotion_rule.rb +5 -0
  76. data/app/models/spree/property.rb +1 -1
  77. data/app/models/spree/refund.rb +8 -52
  78. data/app/models/spree/reimbursement.rb +5 -43
  79. data/app/models/spree/reimbursement_performer.rb +2 -8
  80. data/app/models/spree/reimbursement_type/credit.rb +1 -4
  81. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -2
  82. data/app/models/spree/reimbursement_type/store_credit.rb +1 -4
  83. data/app/models/spree/return_authorization.rb +2 -5
  84. data/app/models/spree/return_item.rb +4 -24
  85. data/app/models/spree/shipment.rb +3 -56
  86. data/app/models/spree/shipping_method.rb +0 -25
  87. data/app/models/spree/shipping_rate.rb +0 -2
  88. data/app/models/spree/shipping_rate_tax.rb +1 -1
  89. data/app/models/spree/state.rb +1 -5
  90. data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
  91. data/app/models/spree/stock/availability.rb +11 -3
  92. data/app/models/spree/stock/quantifier.rb +12 -8
  93. data/app/models/spree/stock/simple_coordinator.rb +8 -26
  94. data/app/models/spree/stock/splitter/base.rb +2 -7
  95. data/app/models/spree/stock_item.rb +2 -8
  96. data/app/models/spree/stock_location.rb +2 -2
  97. data/app/models/spree/stock_movement.rb +2 -2
  98. data/app/models/spree/store.rb +0 -12
  99. data/app/models/spree/store_credit.rb +14 -1
  100. data/app/models/spree/store_credit_category.rb +0 -32
  101. data/app/models/spree/store_credit_prioritizer.rb +17 -0
  102. data/app/models/spree/tax/item_tax.rb +3 -2
  103. data/app/models/spree/tax/order_tax.rb +3 -1
  104. data/app/models/spree/tax/tax_helpers.rb +2 -2
  105. data/app/models/spree/tax/tax_location.rb +4 -7
  106. data/app/models/spree/tax_calculator/default.rb +31 -0
  107. data/app/models/spree/tax_calculator/shipping_rate.rb +2 -13
  108. data/app/models/spree/tax_rate.rb +9 -27
  109. data/app/models/spree/taxon/active_storage_attachment.rb +2 -7
  110. data/app/models/spree/taxon/paperclip_attachment.rb +3 -8
  111. data/app/models/spree/taxon.rb +1 -12
  112. data/app/models/spree/taxonomy.rb +1 -1
  113. data/app/models/spree/user_address.rb +0 -5
  114. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
  115. data/app/models/spree/variant/price_selector.rb +34 -4
  116. data/app/models/spree/variant.rb +52 -66
  117. data/app/models/spree/zone.rb +1 -1
  118. data/app/subscribers/spree/mailer_subscriber.rb +4 -0
  119. data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
  120. data/config/i18n-tasks.yml +134 -0
  121. data/config/locales/en.yml +406 -263
  122. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +1 -1
  123. data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
  124. data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
  125. data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +20 -0
  126. data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
  127. data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
  128. data/db/seeds.rb +4 -1
  129. data/lib/generators/solidus/install/app_templates/authentication/custom.rb +21 -0
  130. data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
  131. data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
  132. data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
  133. data/lib/generators/solidus/install/app_templates/frontend/break_down_solidus_gem.rb +54 -0
  134. data/lib/generators/solidus/install/app_templates/frontend/classic.rb +16 -0
  135. data/lib/generators/solidus/install/app_templates/frontend/none.rb +2 -0
  136. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +3 -0
  137. data/lib/generators/solidus/install/app_templates/payment_method/bolt.rb +13 -0
  138. data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
  139. data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +10 -0
  140. data/lib/generators/solidus/install/install_generator.rb +247 -149
  141. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +15 -60
  142. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
  143. data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
  144. data/lib/generators/solidus/update/update_generator.rb +112 -0
  145. data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
  146. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
  147. data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
  148. data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
  149. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +0 -1
  150. data/lib/generators/spree/dummy/templates/rails/database.yml +81 -39
  151. data/lib/generators/spree/dummy/templates/rails/storage.yml +3 -0
  152. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  153. data/lib/spree/app_configuration.rb +134 -64
  154. data/lib/spree/bus.rb +20 -0
  155. data/lib/spree/core/class_constantizer.rb +2 -0
  156. data/lib/spree/core/controller_helpers/auth.rb +10 -15
  157. data/lib/spree/core/controller_helpers/current_host.rb +5 -3
  158. data/lib/spree/core/controller_helpers/order.rb +12 -32
  159. data/lib/spree/core/controller_helpers/payment_parameters.rb +0 -54
  160. data/lib/spree/core/controller_helpers/pricing.rb +0 -8
  161. data/lib/spree/core/controller_helpers/search.rb +1 -1
  162. data/lib/spree/core/controller_helpers/strong_parameters.rb +0 -4
  163. data/lib/spree/core/engine.rb +54 -50
  164. data/lib/spree/core/environment_extension.rb +0 -9
  165. data/lib/spree/core/product_filters.rb +1 -41
  166. data/lib/spree/core/role_configuration.rb +0 -14
  167. data/lib/spree/core/search/base.rb +18 -35
  168. data/lib/spree/core/state_machines/order.rb +2 -2
  169. data/lib/spree/core/state_machines.rb +2 -11
  170. data/lib/spree/core/stock_configuration.rb +18 -0
  171. data/lib/spree/core/validators/email.rb +5 -3
  172. data/lib/spree/core/version.rb +5 -1
  173. data/lib/spree/core/versioned_value.rb +75 -0
  174. data/lib/spree/core.rb +40 -11
  175. data/lib/spree/deprecation.rb +1 -1
  176. data/lib/spree/event/configuration.rb +0 -5
  177. data/lib/spree/event/subscriber.rb +0 -18
  178. data/lib/spree/event/subscriber_registry.rb +7 -7
  179. data/lib/spree/event.rb +1 -32
  180. data/lib/spree/i18n.rb +0 -22
  181. data/lib/spree/migrations.rb +13 -11
  182. data/lib/spree/money.rb +3 -18
  183. data/lib/spree/permission_sets/default_customer.rb +8 -1
  184. data/lib/spree/permitted_attributes.rb +17 -59
  185. data/lib/spree/preferences/configuration.rb +84 -0
  186. data/lib/spree/preferences/preferable.rb +13 -0
  187. data/lib/spree/preferences/preferable_class_methods.rb +37 -4
  188. data/lib/spree/preferences/preference_differentiator.rb +29 -0
  189. data/lib/spree/preferences/static_model_preferences.rb +25 -10
  190. data/lib/spree/rails_compatibility.rb +106 -0
  191. data/lib/spree/testing_support/blacklist_urls.rb +1 -1
  192. data/lib/spree/testing_support/bus_helpers.rb +101 -0
  193. data/lib/spree/testing_support/capybara_ext.rb +0 -30
  194. data/lib/spree/testing_support/common_rake.rb +71 -23
  195. data/lib/spree/testing_support/controller_requests.rb +0 -82
  196. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
  197. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +1 -1
  198. data/lib/spree/testing_support/dummy_app/database.yml +42 -22
  199. data/lib/spree/testing_support/dummy_app/migrations.rb +0 -3
  200. data/lib/spree/testing_support/dummy_app.rb +47 -34
  201. data/lib/spree/testing_support/factories/address_factory.rb +9 -6
  202. data/lib/spree/testing_support/factories/calculator_factory.rb +3 -0
  203. data/lib/spree/testing_support/factories/country_factory.rb +1 -2
  204. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
  205. data/lib/spree/testing_support/factories/order_factory.rb +8 -5
  206. data/lib/spree/testing_support/factories/product_factory.rb +4 -1
  207. data/lib/spree/testing_support/factories/promotion_factory.rb +28 -14
  208. data/lib/spree/testing_support/factories/refund_factory.rb +0 -1
  209. data/lib/spree/testing_support/factories/state_factory.rb +8 -2
  210. data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -4
  211. data/lib/spree/testing_support/factories/user_factory.rb +6 -0
  212. data/lib/spree/testing_support/factory_bot.rb +2 -2
  213. data/lib/spree/testing_support/order_walkthrough.rb +6 -8
  214. data/lib/spree/testing_support/preferences.rb +0 -25
  215. data/lib/spree/testing_support/silence_deprecations.rb +9 -0
  216. data/lib/tasks/colorado_delivery_fee.rake +28 -0
  217. data/lib/tasks/payment_method.rake +29 -0
  218. data/lib/tasks/solidus/check_orders_with_invalid_email.rake +18 -0
  219. data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
  220. data/lib/tasks/solidus/split_promotions_with_any_match_policy.rake +33 -0
  221. data/solidus_core.gemspec +14 -7
  222. metadata +127 -78
  223. data/app/mailers/spree/test_mailer.rb +0 -13
  224. data/app/models/concerns/spree/user_payment_source.rb +0 -26
  225. data/app/models/spree/calculator/free_shipping.rb +0 -22
  226. data/app/models/spree/calculator/percent_per_item.rb +0 -51
  227. data/app/models/spree/calculator/price_sack.rb +0 -28
  228. data/app/models/spree/gateway/bogus.rb +0 -13
  229. data/app/models/spree/gateway/bogus_simple.rb +0 -13
  230. data/app/models/spree/gateway.rb +0 -14
  231. data/app/models/spree/order/checkout.rb +0 -244
  232. data/app/models/spree/order_capturing.rb +0 -50
  233. data/app/models/spree/promotion_handler/free_shipping.rb +0 -9
  234. data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
  235. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
  236. data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
  237. data/lib/generators/spree/install/install_generator.rb +0 -15
  238. data/lib/solidus/migrations/rename_gateways.rb +0 -41
  239. data/lib/spree/core/current_store.rb +0 -24
  240. data/lib/spree/paranoia_deprecations.rb +0 -41
  241. data/lib/spree/promo/environment.rb +0 -12
  242. data/lib/spree/testing_support/bar_ability.rb +0 -19
  243. data/lib/tasks/core.rake +0 -104
  244. data/lib/tasks/email.rake +0 -12
  245. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -119
  246. data/lib/tasks/migrations/migrate_address_names.rake +0 -158
  247. data/lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake +0 -26
  248. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +0 -22
  249. data/lib/tasks/migrations/migrate_user_addresses.rake +0 -34
  250. data/lib/tasks/migrations/rename_gateways.rake +0 -23
  251. data/lib/tasks/order_capturing.rake +0 -27
  252. data/lib/tasks/upgrade.rake +0 -13
@@ -38,9 +38,21 @@ module Spree
38
38
  class CannotRebuildShipments < StandardError; end
39
39
 
40
40
  extend Spree::DisplayMoney
41
- money_methods :outstanding_balance, :item_total, :adjustment_total,
42
- :included_tax_total, :additional_tax_total, :tax_total,
43
- :shipment_total, :total, :order_total_after_store_credit, :total_available_store_credit
41
+ money_methods(
42
+ :outstanding_balance,
43
+ :item_total,
44
+ :adjustment_total,
45
+ :included_tax_total,
46
+ :additional_tax_total,
47
+ :tax_total,
48
+ :shipment_total,
49
+ :total,
50
+ :order_total_after_store_credit,
51
+ :total_available_store_credit,
52
+ :item_total_before_tax,
53
+ :shipment_total_before_tax,
54
+ :item_total_excluding_vat
55
+ )
44
56
  alias :display_ship_total :display_shipment_total
45
57
 
46
58
  checkout_flow do
@@ -50,18 +62,13 @@ module Spree
50
62
  go_to_state :confirm
51
63
  end
52
64
 
53
- ransack_alias :bill_address_firstname_or_lastname, :bill_address_firstname_or_bill_address_lastname
54
- self.whitelisted_ransackable_associations = %w[shipments user order_promotions promotions bill_address ship_address line_items]
55
- self.whitelisted_ransackable_attributes = %w[bill_address_firstname_or_lastname completed_at created_at email number state payment_state shipment_state total store_id]
65
+ self.allowed_ransackable_associations = %w[shipments user order_promotions promotions bill_address ship_address line_items]
66
+ self.allowed_ransackable_attributes = %w[completed_at created_at email number state payment_state shipment_state total store_id]
56
67
 
57
68
  attr_reader :coupon_code
58
69
  attr_accessor :temporary_address
59
70
 
60
71
  attr_accessor :temporary_payment_source
61
- alias_method :temporary_credit_card, :temporary_payment_source
62
- alias_method :temporary_credit_card=, :temporary_payment_source=
63
- deprecate temporary_credit_card: :temporary_payment_source, deprecator: Spree::Deprecation
64
- deprecate :temporary_credit_card= => :temporary_payment_source=, deprecator: Spree::Deprecation
65
72
 
66
73
  # Customer info
67
74
  belongs_to :user, class_name: Spree::UserClassHandle.new, optional: true
@@ -107,7 +114,7 @@ module Spree
107
114
  # Returns
108
115
  has_many :return_authorizations, dependent: :destroy, inverse_of: :order
109
116
  has_many :return_items, through: :inventory_units
110
- has_many :customer_returns, through: :return_items
117
+ has_many :customer_returns, -> { distinct }, through: :return_items
111
118
  has_many :reimbursements, inverse_of: :order
112
119
  has_many :refunds, through: :payments
113
120
 
@@ -133,7 +140,7 @@ module Spree
133
140
  before_create :create_token
134
141
  before_create :link_by_email
135
142
 
136
- validates :email, presence: true, if: :require_email
143
+ validates :email, presence: true, if: :email_required?
137
144
  validates :email, 'spree/email' => true, allow_blank: true
138
145
  validates :guest_token, presence: { allow_nil: true }
139
146
  validates :number, presence: true, uniqueness: { allow_blank: true, case_sensitive: true }
@@ -147,14 +154,9 @@ module Spree
147
154
  find_by! number: value
148
155
  end
149
156
 
150
- delegate :name, :firstname, :lastname, to: :bill_address, prefix: true, allow_nil: true
151
- alias_method :billing_firstname, :bill_address_firstname
152
- alias_method :billing_lastname, :bill_address_lastname
157
+ delegate :name, to: :bill_address, prefix: true, allow_nil: true
153
158
  alias_method :billing_name, :bill_address_name
154
159
 
155
- class_attribute :update_hooks
156
- self.update_hooks = Set.new
157
-
158
160
  class_attribute :line_item_comparison_hooks
159
161
  self.line_item_comparison_hooks = Set.new
160
162
 
@@ -190,15 +192,6 @@ module Spree
190
192
  where.not(state: 'canceled')
191
193
  end
192
194
 
193
- # Use this method in other gems that wish to register their own custom logic
194
- # that should be called after Order#update
195
- def self.register_update_hook(hook)
196
- Spree::Deprecation.warn \
197
- "Spree::Order::update_hooks are deprecated. Please remove them " \
198
- "and subscribe to `order_recalculated` and/or `order_finalized` event instead", caller(1)
199
- update_hooks.add(hook)
200
- end
201
-
202
195
  # Use this method in other gems that wish to register their own custom logic
203
196
  # that should be called when determining if two line items are equal.
204
197
  def self.register_line_item_comparison_hook(hook)
@@ -210,22 +203,18 @@ module Spree
210
203
  line_items.sum(&:amount)
211
204
  end
212
205
 
213
- # Sum of all line item amounts after promotions, before added tax
214
- def discounted_item_amount
215
- line_items.to_a.sum(&:discounted_amount)
216
- end
217
- deprecate discounted_item_amount: :item_total_before_tax, deprecator: Spree::Deprecation
218
-
219
206
  def item_total_before_tax
220
207
  line_items.to_a.sum(&:total_before_tax)
221
208
  end
222
209
 
210
+ def shipment_total_before_tax
211
+ shipments.to_a.sum(&:total_before_tax)
212
+ end
213
+
223
214
  # Sum of all line item amounts pre-tax
224
215
  def item_total_excluding_vat
225
216
  line_items.to_a.sum(&:total_excluding_vat)
226
217
  end
227
- alias pre_tax_item_amount item_total_excluding_vat
228
- deprecate pre_tax_item_amount: :item_total_excluding_vat, deprecator: Spree::Deprecation
229
218
 
230
219
  def currency
231
220
  self[:currency] || Spree::Config[:currency]
@@ -256,11 +245,6 @@ module Spree
256
245
  total > 0
257
246
  end
258
247
 
259
- def confirmation_required?
260
- true
261
- end
262
- deprecate :confirmation_required?, deprecator: Spree::Deprecation
263
-
264
248
  def backordered?
265
249
  shipments.any?(&:backordered?)
266
250
  end
@@ -271,7 +255,7 @@ module Spree
271
255
  ship_address
272
256
  else
273
257
  bill_address
274
- end || store.default_cart_tax_location
258
+ end || store&.default_cart_tax_location
275
259
  end
276
260
 
277
261
  def updater
@@ -282,15 +266,6 @@ module Spree
282
266
  updater.update
283
267
  end
284
268
 
285
- def update!(*args)
286
- if args.empty?
287
- Spree::Deprecation.warn "Calling order.update! with no arguments as a way to invoke the OrderUpdater is deprecated, since it conflicts with AR::Base#update! Please use order.recalculate instead"
288
- recalculate
289
- else
290
- super
291
- end
292
- end
293
-
294
269
  def assign_billing_to_shipping_address
295
270
  self.ship_address = bill_address if bill_address
296
271
  true
@@ -310,15 +285,15 @@ module Spree
310
285
  end
311
286
 
312
287
  def contents
313
- @contents ||= Spree::OrderContents.new(self)
288
+ @contents ||= Spree::Config.order_contents_class.new(self)
314
289
  end
315
290
 
316
291
  def shipping
317
- @shipping ||= Spree::OrderShipping.new(self)
292
+ @shipping ||= Spree::Config.order_shipping_class.new(self)
318
293
  end
319
294
 
320
295
  def cancellations
321
- @cancellations ||= Spree::OrderCancellations.new(self)
296
+ @cancellations ||= Spree::Config.order_cancellations_class.new(self)
322
297
  end
323
298
 
324
299
  # Associates the specified user with the order.
@@ -336,14 +311,7 @@ module Spree
336
311
  assign_attributes(attrs_to_set)
337
312
  end
338
313
 
339
- def generate_order_number(options = nil)
340
- if options
341
- Spree::Deprecation.warn \
342
- "Passing options to Order#generate_order_number is deprecated. " \
343
- "Please add your own instance of the order number generator " \
344
- "with your options (#{options.inspect}) and store it as " \
345
- "Spree::Config.order_number_generator in your stores config."
346
- end
314
+ def generate_order_number
347
315
  self.number ||= Spree::Config.order_number_generator.generate
348
316
  end
349
317
 
@@ -384,14 +352,6 @@ module Spree
384
352
  }
385
353
  end
386
354
 
387
- # Creates new tax charges if there are any applicable rates. If prices already
388
- # include taxes then price adjustments are created instead.
389
- # @deprecated This now happens during #recalculate
390
- def create_tax_charge!
391
- recalculate
392
- end
393
- deprecate create_tax_charge!: :recalculate, deprecator: Spree::Deprecation
394
-
395
355
  def reimbursement_total
396
356
  reimbursements.sum(:total)
397
357
  end
@@ -435,33 +395,16 @@ module Spree
435
395
  Spree::CreditCard.where(id: credit_card_ids)
436
396
  end
437
397
 
438
- # Finalizes an in progress order after checkout is complete.
439
- # Called after transition to complete state when payments will have been processed
398
+ # TODO: Remove on Solidus 4.0
399
+ # @api private
440
400
  def finalize!
441
- # lock all adjustments (coupon promotions, etc.)
442
- all_adjustments.each(&:finalize!)
443
-
444
- # update payment and shipment(s) states, and save
445
- updater.update_payment_state
446
- shipments.each do |shipment|
447
- shipment.update_state
448
- shipment.finalize!
449
- end
450
-
451
- updater.update_shipment_state
452
- save!
453
- updater.run_hooks if update_hooks.any?
454
-
455
- touch :completed_at
456
-
457
- Spree::Event.fire 'order_finalized', order: self
458
-
459
- if method(:deliver_order_confirmation_email).owner != self.class
460
- Spree::Deprecation.warn \
461
- "deliver_order_confirmation_email has been deprecated and moved to " \
462
- "Spree::MailerSubscriber#order_finalized, please move there any customizations.",
463
- caller(1)
464
- end
401
+ Spree::Deprecation.warn <<~MSG
402
+ Calling `Spree::Order#finalize!` is discouraged. Instead, use
403
+ `Spree::Order#complete!`, which goes through all the needed safety
404
+ checks before finalizing an order. This method will be removed
405
+ altogether on Solidus 4.0.
406
+ MSG
407
+ finalize
465
408
  end
466
409
 
467
410
  def fulfill!
@@ -470,16 +413,6 @@ module Spree
470
413
  save!
471
414
  end
472
415
 
473
- def deliver_order_confirmation_email
474
- Spree::Deprecation.warn \
475
- "deliver_order_confirmation_email has been deprecated and moved to " \
476
- "Spree::MailerSubscriber#order_finalized.",
477
- caller(1)
478
-
479
- Spree::Config.order_mailer_class.confirm_email(order).deliver_later
480
- order.update_column(:confirmation_delivered, true)
481
- end
482
-
483
416
  # Helper methods for checkout steps
484
417
  def paid?
485
418
  %w(paid credit_owed).include?(payment_state)
@@ -523,26 +456,6 @@ module Spree
523
456
  recalculate
524
457
  end
525
458
 
526
- alias_method :has_step?, :has_checkout_step?
527
- deprecate has_step?: :has_checkout_step?, deprecator: Spree::Deprecation
528
-
529
- def state_changed(name)
530
- state = "#{name}_state"
531
- if persisted?
532
- old_state = send("#{state}_was")
533
- new_state = send(state)
534
- unless old_state == new_state
535
- state_changes.create(
536
- previous_state: old_state,
537
- next_state: new_state,
538
- name: name,
539
- user_id: user_id
540
- )
541
- end
542
- end
543
- end
544
- deprecate :state_changed, deprecator: Spree::Deprecation
545
-
546
459
  def coupon_code=(code)
547
460
  @coupon_code = begin
548
461
  code.strip.downcase
@@ -584,12 +497,13 @@ module Spree
584
497
  raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_shipments_not_pending'))
585
498
  else
586
499
  shipments.destroy_all
587
- self.shipments = Spree::Config.stock.coordinator_class.new(self).shipments
500
+ shipments.push(*Spree::Config.stock.coordinator_class.new(self).shipments)
588
501
  end
589
502
  end
590
503
 
591
504
  def create_shipments_for_line_item(line_item)
592
- units = Spree::Stock::InventoryUnitBuilder.new(self).missing_units_for_line_item(line_item)
505
+ units = Spree::Config.stock.inventory_unit_builder_class.new(self).missing_units_for_line_item(line_item)
506
+
593
507
  Spree::Config.stock.coordinator_class.new(self, units).shipments.each do |shipment|
594
508
  shipments << shipment
595
509
  end
@@ -599,8 +513,6 @@ module Spree
599
513
  Spree::PromotionHandler::Shipping.new(self).activate
600
514
  recalculate
601
515
  end
602
- alias_method :apply_free_shipping_promotions, :apply_shipping_promotions
603
- deprecate apply_free_shipping_promotions: :apply_shipping_promotions, deprecator: Spree::Deprecation
604
516
 
605
517
  # Clean shipments and make order back to address state
606
518
  #
@@ -622,7 +534,7 @@ module Spree
622
534
  state: 'cart',
623
535
  updated_at: Time.current
624
536
  )
625
- next! if !line_items.empty?
537
+ self.next
626
538
  end
627
539
 
628
540
  def refresh_shipment_rates
@@ -633,12 +545,6 @@ module Spree
633
545
  bill_address == ship_address
634
546
  end
635
547
 
636
- # @deprecated This now happens during #recalculate
637
- def set_shipments_cost
638
- recalculate
639
- end
640
- deprecate set_shipments_cost: :recalculate, deprecator: Spree::Deprecation
641
-
642
548
  def is_risky?
643
549
  payments.risky.count > 0
644
550
  end
@@ -669,11 +575,6 @@ module Spree
669
575
  payments.offset_payment.exists? # how old versions of spree stored refunds
670
576
  end
671
577
 
672
- def token
673
- Spree::Deprecation.warn("Spree::Order#token is DEPRECATED, please use #guest_token instead.", caller)
674
- guest_token
675
- end
676
-
677
578
  def tax_total
678
579
  additional_tax_total + included_tax_total
679
580
  end
@@ -695,8 +596,9 @@ module Spree
695
596
 
696
597
  if matching_store_credits.any?
697
598
  payment_method = Spree::PaymentMethod::StoreCredit.first
599
+ sorter = Spree::Config.store_credit_prioritizer_class.new(matching_store_credits, self)
698
600
 
699
- matching_store_credits.order_by_priority.each do |credit|
601
+ sorter.call.each do |credit|
700
602
  break if remaining_total.zero?
701
603
  next if credit.amount_remaining.zero?
702
604
 
@@ -778,11 +680,6 @@ module Spree
778
680
  end
779
681
  end
780
682
 
781
- alias_method :assign_default_user_addresses!, :assign_default_user_addresses
782
- deprecate assign_default_user_addresses!: :assign_default_user_addresses, deprecator: Spree::Deprecation
783
- alias_method :assign_default_addresses!, :assign_default_user_addresses
784
- deprecate assign_default_addresses!: :assign_default_user_addresses, deprecator: Spree::Deprecation
785
-
786
683
  def persist_user_address!
787
684
  if !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id
788
685
  user.persist_order_address(self)
@@ -794,8 +691,6 @@ module Spree
794
691
  add_payment_sources_to_wallet_class.new(self).
795
692
  add_to_wallet
796
693
  end
797
- alias_method :persist_user_credit_card, :add_payment_sources_to_wallet
798
- deprecate persist_user_credit_card: :add_payment_sources_to_wallet, deprecator: Spree::Deprecation
799
694
 
800
695
  def add_default_payment_from_wallet
801
696
  builder = Spree::Config.default_payment_builder_class.new(self)
@@ -810,8 +705,6 @@ module Spree
810
705
  end
811
706
  end
812
707
  end
813
- alias_method :assign_default_credit_card, :add_default_payment_from_wallet
814
- deprecate assign_default_credit_card: :add_default_payment_from_wallet, deprecator: Spree::Deprecation
815
708
 
816
709
  def record_ip_address(ip_address)
817
710
  if new_record?
@@ -857,21 +750,25 @@ module Spree
857
750
  end
858
751
  end
859
752
 
860
- # In case a existing credit card is provided it needs to build the payment
861
- # attributes from scratch so we can set the amount. example payload:
862
- #
863
- # {
864
- # "order": {
865
- # "existing_card": "2"
866
- # }
867
- # }
868
- #
869
- def update_params_payment_source
870
- Spree::Deprecation.warn('update_params_payment_source is deprecated. Please use set_payment_parameters_amount instead.', caller)
871
- if @updating_params[:order] && (@updating_params[:order][:payments_attributes] || @updating_params[:order][:existing_card])
872
- @updating_params[:order][:payments_attributes] ||= [{}]
873
- @updating_params[:order][:payments_attributes].first[:amount] = total
753
+ # Finalizes an in progress order after checkout is complete.
754
+ # Called after transition to complete state when payments will have been processed
755
+ def finalize
756
+ # lock all adjustments (coupon promotions, etc.)
757
+ all_adjustments.each(&:finalize!)
758
+
759
+ # update payment and shipment(s) states, and save
760
+ updater.update_payment_state
761
+ shipments.each do |shipment|
762
+ shipment.update_state
763
+ shipment.finalize!
874
764
  end
765
+
766
+ updater.update_shipment_state
767
+ save!
768
+
769
+ touch :completed_at
770
+
771
+ Spree::Bus.publish :order_finalized, order: self
875
772
  end
876
773
 
877
774
  def associate_store
@@ -883,15 +780,23 @@ module Spree
883
780
  end
884
781
 
885
782
  # Determine if email is required (we don't want validation errors before we hit the checkout)
886
- def require_email
783
+ def email_required?
887
784
  true unless new_record? || ['cart', 'address'].include?(state)
888
785
  end
889
786
 
787
+ def require_email
788
+ Spree::Deprecation.warn "Use email_required? instead", caller(1)
789
+ email_required?
790
+ end
791
+
890
792
  def ensure_inventory_units
891
793
  if has_checkout_step?("delivery")
892
- inventory_validator = Spree::Stock::InventoryValidator.new
794
+ inventory_validator = Spree::Config.stock.inventory_validator_class.new
795
+
796
+ errors = line_items.map { |line_item|
797
+ inventory_validator.validate(line_item)
798
+ }.compact
893
799
 
894
- errors = line_items.map { |line_item| inventory_validator.validate(line_item) }.compact
895
800
  raise InsufficientStock if errors.any?
896
801
  end
897
802
  end
@@ -909,8 +814,15 @@ module Spree
909
814
  end
910
815
 
911
816
  def validate_line_item_availability
912
- availability_validator = Spree::Stock::AvailabilityValidator.new
913
- raise InsufficientStock unless line_items.all? { |line_item| availability_validator.validate(line_item) }
817
+ availability_validator = Spree::Config.stock.availability_validator_class.new
818
+
819
+ # NOTE: This code assumes that the availability validator will return
820
+ # true for success and false for failure. This is not normally the
821
+ # behaviour of validators, as the framework only cares about the
822
+ # population of the errors, not the return value of the validate method.
823
+ raise InsufficientStock unless line_items.all? { |line_item|
824
+ availability_validator.validate(line_item)
825
+ }
914
826
  end
915
827
 
916
828
  def ensure_line_items_present
@@ -23,16 +23,10 @@ class Spree::OrderCancellations
23
23
  # @api public
24
24
  #
25
25
  # @param [Array<InventoryUnit>] inventory_units the inventory units to be short shipped
26
- # @param [Spree.user_class] whodunnit (deprecated) the system or person that is short shipping the inventory unit
27
26
  # @param [Spree.user_class] created_by the system or person that is short shipping the inventory unit
28
27
  #
29
28
  # @return [Array<UnitCancel>] the units that have been canceled due to short shipping
30
- def short_ship(inventory_units, whodunnit: nil, created_by: nil)
31
- if whodunnit
32
- created_by ||= whodunnit
33
- Spree::Deprecation.warn("Calling #short_ship on #{self} with whodunnit is deprecated, use created_by instead")
34
- end
35
-
29
+ def short_ship(inventory_units, created_by: nil)
36
30
  if inventory_units.map(&:order_id).uniq != [@order.id]
37
31
  raise ArgumentError, "Not all inventory units belong to this order"
38
32
  end
@@ -65,16 +59,10 @@ class Spree::OrderCancellations
65
59
  #
66
60
  # @param [InventoryUnit] inventory_unit the inventory unit to be canceled
67
61
  # @param [String] reason the reason that you are canceling the inventory unit
68
- # @param [Spree.user_class] whodunnit (deprecated) the system or person that is canceling the inventory unit
69
62
  # @param [Spree.user_class] created_by the system or person that is canceling the inventory unit
70
63
  #
71
64
  # @return [UnitCancel] the unit that has been canceled
72
- def cancel_unit(inventory_unit, reason: Spree::UnitCancel::DEFAULT_REASON, whodunnit: nil, created_by: nil)
73
- if whodunnit
74
- created_by ||= whodunnit
75
- Spree::Deprecation.warn("Calling #cancel_unit on #{self} with whodunnit is deprecated, use created_by instead")
76
- end
77
-
65
+ def cancel_unit(inventory_unit, reason: Spree::UnitCancel::DEFAULT_REASON, created_by: nil)
78
66
  unit_cancel = nil
79
67
 
80
68
  Spree::OrderMutex.with_lock!(@order) do
@@ -96,10 +84,7 @@ class Spree::OrderCancellations
96
84
  # @param [Array<InventoryUnit>] inventory_units the inventory units to be reimbursed
97
85
  # @param [Spree.user_class] created_by the user that is performing this action
98
86
  # @return [Reimbursement] the reimbursement for inventory being canceled
99
- def reimburse_units(inventory_units, created_by: nil)
100
- unless created_by
101
- Spree::Deprecation.warn("Calling #reimburse_units on #{self} without created_by is deprecated")
102
- end
87
+ def reimburse_units(inventory_units, created_by:)
103
88
  reimbursement = nil
104
89
 
105
90
  Spree::OrderMutex.with_lock!(@order) do
@@ -113,12 +98,7 @@ class Spree::OrderCancellations
113
98
 
114
99
  private
115
100
 
116
- def short_ship_unit(inventory_unit, whodunnit: nil, created_by: nil)
117
- if whodunnit
118
- created_by ||= whodunnit
119
- Spree::Deprecation.warn("Calling #short_ship_unit on #{self} with whodunnit is deprecated, use created_by instead")
120
- end
121
-
101
+ def short_ship_unit(inventory_unit, created_by: nil)
122
102
  unit_cancel = Spree::UnitCancel.create!(
123
103
  inventory_unit: inventory_unit,
124
104
  reason: Spree::UnitCancel::SHORT_SHIP,
@@ -42,8 +42,8 @@ module Spree
42
42
  # If we do not update first, then the item total will be wrong and ItemTotal
43
43
  # promotion rules would not be triggered.
44
44
  reload_totals
45
- PromotionHandler::Cart.new(order).activate
46
45
  order.ensure_updated_shipments
46
+ PromotionHandler::Cart.new(order).activate
47
47
  end
48
48
  reload_totals
49
49
  true
@@ -89,6 +89,7 @@ module Spree
89
89
  line_item ||= order.line_items.new(
90
90
  quantity: 0,
91
91
  variant: variant,
92
+ adjustments: [],
92
93
  )
93
94
 
94
95
  line_item.quantity += quantity.to_i
@@ -62,7 +62,7 @@ module Spree
62
62
  potential_shipments.detect do |shipment|
63
63
  shipment.include?(variant)
64
64
  end || potential_shipments.detect do |shipment|
65
- stock_item = shipment.stock_location.stock_item(variant.id)
65
+ stock_item = variant.stock_items.detect { |stock_item| stock_item.stock_location == shipment.stock_location }
66
66
  if stock_item
67
67
  stock_item.backorderable? || stock_item.count_on_hand >= quantity
68
68
  end
@@ -115,8 +115,8 @@ module Spree
115
115
  current_line_item.quantity += other_order_line_item.quantity
116
116
  handle_error(current_line_item) unless current_line_item.save
117
117
  else
118
- order.line_items << other_order_line_item
119
- handle_error(other_order_line_item) unless other_order_line_item.save
118
+ new_line_item = order.line_items.build(other_order_line_item.attributes.except("id"))
119
+ handle_error(new_line_item) unless new_line_item.save
120
120
  end
121
121
  end
122
122
 
@@ -16,7 +16,7 @@ module Spree
16
16
  validates :promotion, presence: true
17
17
  validates :promotion_code, presence: true, if: :require_promotion_code?
18
18
 
19
- self.whitelisted_ransackable_associations = %w[promotion_code]
19
+ self.allowed_ransackable_associations = %w[promotion_code]
20
20
 
21
21
  private
22
22
 
@@ -62,18 +62,15 @@ class Spree::OrderShipping
62
62
  end
63
63
 
64
64
  inventory_units.map(&:shipment).uniq.each do |shipment|
65
- # Temporarily propagate the tracking number to the shipment as well
66
- # TODO: Remove tracking numbers from shipments.
67
- shipment.update!(tracking: tracking_number)
68
-
69
- next unless shipment.inventory_units.reload.all? { |iu| iu.shipped? || iu.canceled? }
70
- # TODO: make OrderShipping#ship_shipment call Shipment#ship! rather than
71
- # having Shipment#ship! call OrderShipping#ship_shipment. We only really
72
- # need this `update_columns` for the specs, until we make that change.
73
- shipment.update_columns(state: 'shipped', shipped_at: Time.current)
65
+ if shipment.inventory_units.reload.all? { |iu| iu.shipped? || iu.canceled? }
66
+ shipment.update!(state: "shipped", shipped_at: Time.current, tracking: tracking_number)
67
+ else
68
+ shipment.update!(tracking: tracking_number)
69
+ end
74
70
  end
75
71
 
76
72
  send_shipment_emails(carton) if stock_location.fulfillable? && !suppress_mailer # e.g. digital gift cards that aren't actually shipped
73
+ @order.shipments.reload
77
74
  @order.recalculate
78
75
 
79
76
  carton
@@ -17,13 +17,15 @@ module Spree
17
17
 
18
18
  # Apply taxes to the order.
19
19
  #
20
- # This method will create or update adjustments on all line items and
21
- # shipments in the order to reflect the appropriate taxes passed in. It
22
- # will also remove any now inapplicable tax adjustments.
20
+ # This method will create or update adjustments on the order and all line
21
+ # items and shipments in the order to reflect the appropriate taxes passed
22
+ # in. It will also remove any now inapplicable tax adjustments.
23
23
  #
24
24
  # @param [Spree::Tax::OrderTax] taxes the taxes to apply to the order
25
25
  # @return [void]
26
26
  def apply(taxes)
27
+ update_adjustments(@order, taxes.order_taxes) if taxes.order_taxes
28
+
27
29
  @order.line_items.each do |item|
28
30
  taxed_items = taxes.line_item_taxes.select { |element| element.item_id == item.id }
29
31
  update_adjustments(item, taxed_items)
@@ -70,7 +72,7 @@ module Spree
70
72
 
71
73
  tax_adjustment ||= item.adjustments.new(
72
74
  source: tax_item.tax_rate,
73
- order_id: item.order_id,
75
+ order_id: item.is_a?(Spree::Order) ? item.id : item.order_id,
74
76
  label: tax_item.label,
75
77
  included: tax_item.included_in_price
76
78
  )