solidus_core 2.11.10 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -19,7 +19,7 @@ module Spree
19
19
  # Get the on_hand stock quantities
20
20
  # @return [Hash<Integer=>Spree::StockQuantities>] A map of stock_location_ids to the stock quantities available in that location
21
21
  def on_hand_by_stock_location_id
22
- counts_on_hand.to_a.group_by do |(_, stock_location_id), _|
22
+ quantities_by_location_id = counts_on_hand.to_a.group_by do |(_, stock_location_id), _|
23
23
  stock_location_id
24
24
  end.transform_values do |values|
25
25
  Spree::StockQuantities.new(
@@ -31,12 +31,13 @@ module Spree
31
31
  end.to_h
32
32
  )
33
33
  end
34
+ restore_location_order(quantities_by_location_id)
34
35
  end
35
36
 
36
- # Get the on_hand stock quantities
37
+ # Get the backorderable stock quantities
37
38
  # @return [Hash<Integer=>Spree::StockQuantities>] A map of stock_location_ids to the stock quantities available in that location
38
39
  def backorderable_by_stock_location_id
39
- backorderables.group_by(&:second).transform_values do |variant_ids|
40
+ quantities_by_location_id = backorderables.group_by(&:second).transform_values do |variant_ids|
40
41
  Spree::StockQuantities.new(
41
42
  variant_ids.map do |variant_id, _|
42
43
  variant = @variant_map[variant_id]
@@ -44,6 +45,7 @@ module Spree
44
45
  end.to_h
45
46
  )
46
47
  end
48
+ restore_location_order(quantities_by_location_id)
47
49
  end
48
50
 
49
51
  private
@@ -67,6 +69,12 @@ module Spree
67
69
  where(variant_id: @variants).
68
70
  where(stock_location_id: @stock_locations)
69
71
  end
72
+
73
+ def restore_location_order(quantities_by_location_id)
74
+ sorted_location_ids = @stock_locations.map(&:id)
75
+
76
+ quantities_by_location_id.sort_by { |key, _value| sorted_location_ids.index(key) }.to_h
77
+ end
70
78
  end
71
79
  end
72
80
  end
@@ -6,14 +6,18 @@ module Spree
6
6
  attr_reader :stock_items
7
7
 
8
8
  # @param [Variant] variant The variant to check inventory for.
9
- # @param [StockLocation, Integer] stock_location The stock_location to check inventory in. If unspecified it will check inventory in all available StockLocations
10
- def initialize(variant, stock_location = nil)
9
+ # @param [StockLocation, Integer] stock_location_or_id
10
+ # The stock_location or stock location ID to check inventory in.
11
+ # If unspecified it will check inventory in all available StockLocations
12
+ def initialize(variant, stock_location_or_id = nil)
11
13
  @variant = variant
12
- @stock_items = Spree::StockItem.where(variant_id: variant)
13
- if stock_location
14
- @stock_items.where!(stock_location: stock_location)
15
- else
16
- @stock_items.joins!(:stock_location).merge!(Spree::StockLocation.active)
14
+ @stock_items = variant.stock_items.select do |stock_item|
15
+ if stock_location_or_id
16
+ stock_item.stock_location == stock_location_or_id ||
17
+ stock_item.stock_location_id == stock_location_or_id
18
+ else
19
+ stock_item.stock_location.active?
20
+ end
17
21
  end
18
22
  end
19
23
 
@@ -23,7 +27,7 @@ module Spree
23
27
  # inventory is not tracked on the variant.
24
28
  def total_on_hand
25
29
  if @variant.should_track_inventory?
26
- stock_items.sum(:count_on_hand)
30
+ stock_items.sum(&:count_on_hand)
27
31
  else
28
32
  Float::INFINITY
29
33
  end
@@ -24,7 +24,8 @@ module Spree
24
24
 
25
25
  def initialize(order, inventory_units = nil)
26
26
  @order = order
27
- @inventory_units = inventory_units || InventoryUnitBuilder.new(order).units
27
+ @inventory_units =
28
+ inventory_units || Spree::Config.stock.inventory_unit_builder_class.new(order).units
28
29
  @splitters = Spree::Config.environment.stock_splitters
29
30
 
30
31
  filtered_stock_locations = Spree::Config.stock.location_filter_class.new(Spree::StockLocation.all, @order).filter
@@ -73,11 +74,16 @@ module Spree
73
74
  packages = split_packages(packages)
74
75
 
75
76
  # Turn the Stock::Packages into a Shipment with rates
76
- packages.map do |package|
77
+ shipments = packages.map do |package|
77
78
  shipment = package.shipment = package.to_shipment
78
79
  shipment.shipping_rates = Spree::Config.stock.estimator_class.new.shipping_rates(package)
79
80
  shipment
80
81
  end
82
+
83
+ # Make sure we don't add the proposed shipments to the order
84
+ order.shipments = order.shipments - shipments
85
+
86
+ shipments
81
87
  end
82
88
 
83
89
  def split_packages(initial_packages)
@@ -87,30 +93,6 @@ module Spree
87
93
  end
88
94
  end
89
95
 
90
- def allocate_inventory(availability_by_location)
91
- sorted_availability = sort_availability(availability_by_location)
92
-
93
- sorted_availability.transform_values do |available|
94
- # Find the desired inventory which is available at this location
95
- packaged = available & @desired
96
- # Remove found inventory from desired
97
- @desired -= packaged
98
- packaged
99
- end
100
- end
101
- deprecate allocate_inventory: 'allocate_inventory is deprecated. Please write your own allocator defining' \
102
- 'a Spree::Stock::Allocator::Base subclass', deprecator: Spree::Deprecation
103
-
104
- def sort_availability(availability)
105
- sorted_availability = availability.sort_by do |stock_location_id, _|
106
- @stock_locations.find_index do |stock_location|
107
- stock_location.id == stock_location_id
108
- end
109
- end
110
-
111
- Hash[sorted_availability]
112
- end
113
-
114
96
  def get_units(quantities)
115
97
  # Change our raw quantities back into inventory units
116
98
  quantities.flat_map do |variant, quantity|
@@ -6,13 +6,8 @@ module Spree
6
6
  class Base
7
7
  attr_reader :stock_location, :next_splitter
8
8
 
9
- def initialize(stock_location_or_packer, next_splitter = nil)
10
- if stock_location_or_packer.is_a?(Spree::StockLocation)
11
- @stock_location = stock_location_or_packer
12
- else
13
- Spree::Deprecation.warn("Initializing Splitters with a Packer is DEPRECATED. Pass a StockLocation instead.")
14
- @stock_location = stock_location_or_packer.stock_location
15
- end
9
+ def initialize(stock_location, next_splitter = nil)
10
+ @stock_location = stock_location
16
11
  @next_splitter = next_splitter
17
12
  end
18
13
 
@@ -20,7 +20,7 @@ module Spree
20
20
  after_save :conditional_variant_touch, if: :saved_changes?
21
21
  after_touch { variant.touch }
22
22
 
23
- self.whitelisted_ransackable_attributes = ['count_on_hand', 'stock_location_id']
23
+ self.allowed_ransackable_attributes = ['count_on_hand', 'stock_location_id']
24
24
 
25
25
  # @return [Array<Spree::InventoryUnit>] the backordered inventory units
26
26
  # associated with this stock item
@@ -110,13 +110,7 @@ module Spree
110
110
  end
111
111
 
112
112
  def inventory_cache_threshold
113
- # only warn if store is setting binary_inventory_cache (default = false)
114
- @cache_threshold ||= if Spree::Config.binary_inventory_cache
115
- Spree::Deprecation.warn "Spree::Config.binary_inventory_cache=true is DEPRECATED. Instead use Spree::Config.inventory_cache_threshold=1"
116
- 1
117
- else
118
- Spree::Config.inventory_cache_threshold
119
- end
113
+ @cache_threshold ||= Spree::Config.inventory_cache_threshold
120
114
  end
121
115
  end
122
116
  end
@@ -26,12 +26,12 @@ module Spree
26
26
  validates_uniqueness_of :code, allow_blank: true, case_sensitive: false
27
27
 
28
28
  scope :active, -> { where(active: true) }
29
- scope :order_default, -> { order(default: :desc, name: :asc) }
29
+ scope :order_default, -> { order(default: :desc, position: :asc) }
30
30
 
31
31
  after_create :create_stock_items, if: :propagate_all_variants?
32
32
  after_save :ensure_one_default
33
33
 
34
- self.whitelisted_ransackable_attributes = %w[name]
34
+ self.allowed_ransackable_attributes = %w[name]
35
35
 
36
36
  def state_text
37
37
  state.try(:abbr) || state.try(:name) || state_name
@@ -13,8 +13,8 @@ module Spree
13
13
 
14
14
  scope :recent, -> { order(created_at: :desc) }
15
15
 
16
- self.whitelisted_ransackable_associations = %w[variant]
17
- self.whitelisted_ransackable_attributes = ['quantity']
16
+ self.allowed_ransackable_associations = %w[variant]
17
+ self.allowed_ransackable_attributes = ['quantity']
18
18
 
19
19
  def readonly?
20
20
  !new_record?
@@ -25,12 +25,6 @@ module Spree
25
25
  before_save :ensure_default_exists_and_is_unique
26
26
  before_destroy :validate_not_default
27
27
 
28
- scope :by_url, lambda { |url| where("url like ?", "%#{url}%") }
29
-
30
- class << self
31
- deprecate by_url: "Spree::Store.by_url is DEPRECATED", deprecator: Spree::Deprecation
32
- end
33
-
34
28
  def available_locales
35
29
  locales = super()
36
30
  if locales
@@ -49,12 +43,6 @@ module Spree
49
43
  end
50
44
  end
51
45
 
52
- def self.current(store_key)
53
- Spree::Deprecation.warn "Spree::Store.current is DEPRECATED"
54
- current_store = Store.find_by(code: store_key) || Store.by_url(store_key).first if store_key
55
- current_store || Store.default
56
- end
57
-
58
46
  def self.default
59
47
  where(default: true).first || new
60
48
  end
@@ -40,6 +40,14 @@ class Spree::StoreCredit < Spree::PaymentSource
40
40
  extend Spree::DisplayMoney
41
41
  money_methods :amount, :amount_used, :amount_authorized
42
42
 
43
+ # Sets this store credit's amount to a new value,
44
+ # parsing it as a localized number if the new value is a string.
45
+ #
46
+ # @param number [String, #to_d] a new amount
47
+ def amount=(number)
48
+ self[:amount] = Spree::LocalizedNumber.parse(number)
49
+ end
50
+
43
51
  def amount_remaining
44
52
  return 0.0.to_d if invalidated?
45
53
  amount - amount_used - amount_authorized
@@ -150,7 +158,12 @@ class Spree::StoreCredit < Spree::PaymentSource
150
158
  end
151
159
 
152
160
  def generate_authorization_code
153
- "#{id}-SC-#{Time.current.utc.strftime('%Y%m%d%H%M%S%6N')}"
161
+ [
162
+ id,
163
+ 'SC',
164
+ Time.current.utc.strftime('%Y%m%d%H%M%S%6N'),
165
+ SecureRandom.uuid
166
+ ].join('-')
154
167
  end
155
168
 
156
169
  def editable?
@@ -7,39 +7,7 @@ class Spree::StoreCreditCategory < Spree::Base
7
7
  class_attribute :non_expiring_credit_types
8
8
  self.non_expiring_credit_types = [Spree::StoreCreditType::NON_EXPIRING]
9
9
 
10
- # @deprecated
11
- class_attribute :reimbursement_category_name
12
- self.reimbursement_category_name = I18n.t('spree.store_credit_category.default')
13
-
14
- # @deprecated
15
- def self.reimbursement_category(reimbursement)
16
- reimbursement.store_credit_category
17
- end
18
-
19
10
  def non_expiring?
20
11
  self.class.non_expiring_credit_types.include? name
21
12
  end
22
-
23
- public_instance_methods.grep(/^reimbursement_category_name/).each do |method|
24
- deprecate(
25
- method => 'Use Spree::Reimbursement#store_credit_category.name instead',
26
- deprecator: Spree::Deprecation
27
- )
28
- end
29
-
30
- class << self
31
- public_instance_methods.grep(/^reimbursement_category_name/).each do |method|
32
- deprecate(
33
- method => 'Use Spree::Reimbursement.store_credit_category.name instead',
34
- deprecator: Spree::Deprecation
35
- )
36
- end
37
-
38
- public_instance_methods.grep(/^reimbursement_category$/).each do |method|
39
- deprecate(
40
- method => 'Use Spree::Reimbursement.store_credit_category instead',
41
- deprecator: Spree::Deprecation
42
- )
43
- end
44
- end
45
13
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ class StoreCreditPrioritizer
5
+ def initialize(credits, _order)
6
+ @credits = credits
7
+ end
8
+
9
+ def call
10
+ credits.order_by_priority
11
+ end
12
+
13
+ private
14
+
15
+ attr_reader :credits
16
+ end
17
+ end
@@ -5,9 +5,10 @@ module Spree
5
5
  # Simple object used to hold tax data for an item.
6
6
  #
7
7
  # This generic object will hold the amount of tax that should be applied to
8
- # an item. (Either a {Spree::LineItem} or a {Spree::Shipment}.)
8
+ # an item. (Either a {Spree::Order}, a {Spree::LineItem} or a {Spree::Shipment}.)
9
9
  #
10
- # @attr_reader [Integer] item_id the {Spree::LineItem} or {Spree::Shipment} ID
10
+ # @attr_reader [Integer] item_id the {Spree::LineItem} or {Spree::Shipment} ID.
11
+ # Or blank if an order-level tax.
11
12
  # @attr_reader [String] label information about the taxes
12
13
  # @attr_reader [Spree::TaxRate] tax_rate will be used as the source for tax
13
14
  # adjustments
@@ -8,13 +8,15 @@ module Spree
8
8
  # adjustments on an order.
9
9
  #
10
10
  # @attr_reader [Integer] order_id the {Spree::Order} these taxes apply to
11
+ # @attr_reader [Array<Spree::Tax::ItemTax>] order_taxes an array of tax
12
+ # data for the order
11
13
  # @attr_reader [Array<Spree::Tax::ItemTax>] line_item_taxes an array of
12
14
  # tax data for order's line items
13
15
  # @attr_reader [Array<Spree::Tax::ItemTax>] shipment_taxes an array of
14
16
  # tax data for the order's shipments
15
17
  class OrderTax
16
18
  include ActiveModel::Model
17
- attr_accessor :order_id, :line_item_taxes, :shipment_taxes
19
+ attr_accessor :order_id, :order_taxes, :line_item_taxes, :shipment_taxes
18
20
  end
19
21
  end
20
22
  end
@@ -6,9 +6,9 @@ module Spree
6
6
  private
7
7
 
8
8
  def rates_for_item(item)
9
- @rates_for_order ||= Spree::TaxRate.for_address(item.order.tax_address)
9
+ @rates_for_item ||= Spree::TaxRate.item_level.for_address(item.order.tax_address)
10
10
 
11
- @rates_for_order.select do |rate|
11
+ @rates_for_item.select do |rate|
12
12
  rate.active? && rate.tax_categories.map(&:id).include?(item.tax_category_id)
13
13
  end
14
14
  end
@@ -8,7 +8,7 @@ module Spree
8
8
  # @attr_reader [Integer] country_id the ID of a Spree::Country object
9
9
  # @attr_reader [Integer] state_id the ID of a Spree::State object
10
10
  class TaxLocation
11
- attr_reader :country_id, :state_id
11
+ attr_reader :country, :state
12
12
 
13
13
  # Create a new TaxLocation object
14
14
  #
@@ -19,18 +19,15 @@ module Spree
19
19
  #
20
20
  # @return [Spree::Tax::TaxLocation] a Spree::Tax::TaxLocation object
21
21
  def initialize(country: nil, state: nil)
22
- @country_id = country && country.id
23
- @state_id = state && state.id
22
+ @country, @state = country, state
24
23
  end
24
+ delegate :id, to: :state, prefix: true, allow_nil: true
25
+ delegate :id, to: :country, prefix: true, allow_nil: true
25
26
 
26
27
  def ==(other)
27
28
  state_id == other.state_id && country_id == other.country_id
28
29
  end
29
30
 
30
- def country
31
- Spree::Country.find_by(id: country_id)
32
- end
33
-
34
31
  def empty?
35
32
  country_id.nil? && state_id.nil?
36
33
  end
@@ -25,6 +25,7 @@ module Spree
25
25
  def calculate
26
26
  Spree::Tax::OrderTax.new(
27
27
  order_id: order.id,
28
+ order_taxes: order_rates,
28
29
  line_item_taxes: line_item_rates,
29
30
  shipment_taxes: shipment_rates
30
31
  )
@@ -34,6 +35,23 @@ module Spree
34
35
 
35
36
  attr_reader :order
36
37
 
38
+ # Calculate the order-level taxes.
39
+ #
40
+ # @private
41
+ # @return [Array<Spree::Tax::ItemTax>] calculated taxes for the order
42
+ def order_rates
43
+ rates_for_order.map do |rate|
44
+ amount = rate.compute_amount(order)
45
+
46
+ Spree::Tax::ItemTax.new(
47
+ label: rate.adjustment_label(amount),
48
+ tax_rate: rate,
49
+ amount: amount,
50
+ included_in_price: rate.included_in_price
51
+ )
52
+ end
53
+ end
54
+
37
55
  # Calculate the taxes for line items.
38
56
  #
39
57
  # @private
@@ -76,6 +94,19 @@ module Spree
76
94
  )
77
95
  end
78
96
  end
97
+
98
+ # @private
99
+ # @return [Array<Spree::TaxRate>] rates that apply to an order
100
+ def rates_for_order
101
+ tax_category_ids = Set[
102
+ *@order.line_items.map(&:tax_category_id),
103
+ *@order.shipments.map(&:tax_category_id)
104
+ ]
105
+ rates = Spree::TaxRate.active.order_level.for_address(@order.tax_address)
106
+ rates.select do |rate|
107
+ tax_category_ids.intersect?(rate.tax_category_ids.to_set)
108
+ end
109
+ end
79
110
  end
80
111
  end
81
112
  end
@@ -9,26 +9,16 @@ module Spree
9
9
  # looking to provide their own calculator should adhere to the API of this
10
10
  # class.
11
11
  #
12
- # @see Spree::Tax::ShippingRateTaxer
12
+ # @see Spree::Stock::Estimator
13
13
  class ShippingRate
14
14
  include Spree::Tax::TaxHelpers
15
15
 
16
- attr_reader :shipping_rate
17
-
18
16
  # Create a new tax calculator.
19
17
  #
20
18
  # @param [Spree::Order] order the order to calculate taxes on
21
19
  # @return [Spree::TaxCalculator::ShippingRate]
22
20
  def initialize(order)
23
- if order.is_a?(::Spree::ShippingRate)
24
- Spree::Deprecation.warn "passing a single shipping rate to Spree::TaxCalculator::ShippingRate is DEPRECATED. It now expects an order"
25
- shipping_rate = order
26
- @order = shipping_rate.order
27
- @shipping_rate = shipping_rate
28
- else
29
- @order = order
30
- @shipping_rate = nil
31
- end
21
+ @order = order
32
22
  end
33
23
 
34
24
  # Calculate taxes for a shipping rate.
@@ -38,7 +28,6 @@ module Spree
38
28
  # @return [Array<Spree::Tax::ItemTax>] the calculated taxes for the
39
29
  # shipping rate
40
30
  def calculate(shipping_rate)
41
- shipping_rate ||= @shipping_rate
42
31
  rates_for_item(shipping_rate).map do |rate|
43
32
  amount = rate.compute_amount(shipping_rate)
44
33
 
@@ -11,6 +11,11 @@ module Spree
11
11
  include Spree::CalculatedAdjustments
12
12
  include Spree::AdjustmentSource
13
13
 
14
+ enum level: {
15
+ item: 0,
16
+ order: 1
17
+ }, _suffix: true
18
+
14
19
  belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates, optional: true
15
20
 
16
21
  has_many :tax_rate_tax_categories,
@@ -27,6 +32,8 @@ module Spree
27
32
 
28
33
  validates :amount, presence: true, numericality: true
29
34
 
35
+ self.allowed_ransackable_associations = %w[tax_categories zone]
36
+
30
37
  # Finds all tax rates whose zones match a given address
31
38
  scope :for_address, ->(address) { joins(:zone).merge(Spree::Zone.for_address(address)) }
32
39
  scope :for_country,
@@ -87,23 +94,6 @@ module Spree
87
94
  end
88
95
  scope :included_in_price, -> { where(included_in_price: true) }
89
96
 
90
- # Creates necessary tax adjustments for the order.
91
- #
92
- # @deprecated Please use `Spree::Tax::OrderAdjuster#adjust!` instead
93
- def adjust(_order_tax_zone, item)
94
- Spree::Deprecation.warn("`Spree::TaxRate#adjust` is deprecated. Please use `Spree::Tax::OrderAdjuster#adjust!` instead.", caller)
95
-
96
- amount = compute_amount(item)
97
-
98
- item.adjustments.create!(
99
- source: self,
100
- amount: amount,
101
- order_id: item.order_id,
102
- label: adjustment_label(amount),
103
- included: included_in_price
104
- )
105
- end
106
-
107
97
  # This method is used by Adjustment#update to recalculate the cost.
108
98
  def compute_amount(item)
109
99
  calculator.compute(item)
@@ -123,16 +113,6 @@ module Spree
123
113
  )
124
114
  end
125
115
 
126
- def tax_category=(category)
127
- self.tax_categories = [category]
128
- end
129
-
130
- def tax_category
131
- tax_categories[0]
132
- end
133
-
134
- deprecate :tax_category => :tax_categories, :tax_category= => :tax_categories=, deprecator: Spree::Deprecation
135
-
136
116
  private
137
117
 
138
118
  def amount_for_adjustment_label
@@ -143,6 +123,8 @@ module Spree
143
123
  end
144
124
 
145
125
  def translation_key(_amount)
126
+ return "flat_fee" if calculator.is_a?(Spree::Calculator::FlatFee)
127
+
146
128
  key = included_in_price? ? "vat" : "sales_tax"
147
129
  key += "_with_rate" if show_rate_in_label?
148
130
  key.to_sym
@@ -6,13 +6,8 @@ module Spree::Taxon::ActiveStorageAttachment
6
6
 
7
7
  included do
8
8
  has_attachment :icon,
9
- styles: { mini: '32x32>', normal: '128x128>' },
10
- default_style: :mini
9
+ styles: Spree::Config.taxon_image_styles,
10
+ default_style: Spree::Config.taxon_image_style_default
11
11
  validate :icon_is_an_image
12
12
  end
13
-
14
- def attachment_partial_name
15
- Spree::Deprecation.warn("calling #attachment_partial_name on Spree::Taxon is deprecated without replacement.")
16
- 'paperclip'
17
- end
18
13
  end
@@ -5,25 +5,20 @@ module Spree::Taxon::PaperclipAttachment
5
5
 
6
6
  included do
7
7
  has_attached_file :icon,
8
- styles: { mini: '32x32>', normal: '128x128>' },
9
- default_style: :mini,
8
+ styles: Spree::Config.taxon_image_styles,
9
+ default_style: Spree::Config.taxon_image_style_default,
10
10
  url: '/spree/taxons/:id/:style/:basename.:extension',
11
11
  path: ':rails_root/public/spree/taxons/:id/:style/:basename.:extension',
12
12
  default_url: '/assets/default_taxon.png'
13
13
 
14
14
  validates_attachment :icon,
15
- content_type: { content_type: %w[image/jpg image/jpeg image/png image/gif] }
15
+ content_type: { content_type: Spree::Config.allowed_image_mime_types }
16
16
  end
17
17
 
18
18
  def icon_present?
19
19
  icon.present?
20
20
  end
21
21
 
22
- def attachment_partial_name
23
- Spree::Deprecation.warn("calling #attachment_partial_name on Spree::Taxon is deprecated without replacement.")
24
- 'paperclip'
25
- end
26
-
27
22
  def destroy_attachment(definition)
28
23
  return false unless respond_to?(definition)
29
24
 
@@ -27,18 +27,7 @@ module Spree
27
27
 
28
28
  include ::Spree::Config.taxon_attachment_module
29
29
 
30
- self.whitelisted_ransackable_attributes = %w[name]
31
-
32
- # @note This method is meant to be overridden on a store by store basis.
33
- # @return [Array] filters that should be used for a taxon
34
- def applicable_filters
35
- Spree::Deprecation.warn "Spree::Taxon#applicable_filters is deprecated, if you are using this functionality please move it into your own application."
36
-
37
- fs = []
38
- fs << Spree::Core::ProductFilters.price_filter if Spree::Core::ProductFilters.respond_to?(:price_filter)
39
- fs << Spree::Core::ProductFilters.brand_filter if Spree::Core::ProductFilters.respond_to?(:brand_filter)
40
- fs
41
- end
30
+ self.allowed_ransackable_attributes = %w[name]
42
31
 
43
32
  # @return [String] meta_title if set otherwise a string containing the
44
33
  # root name and taxon name
@@ -13,7 +13,7 @@ module Spree
13
13
 
14
14
  default_scope -> { order(position: :asc) }
15
15
 
16
- self.whitelisted_ransackable_attributes = %w[name]
16
+ self.allowed_ransackable_attributes = %w[name]
17
17
 
18
18
  private
19
19
 
@@ -19,11 +19,6 @@ module Spree
19
19
  scope :default_billing, -> { where(default_billing: true) }
20
20
  scope :active, -> { where(archived: false) }
21
21
 
22
- scope :default, -> do
23
- Spree::Deprecation.warn "This scope is deprecated. Please start using ::default_shipping."
24
- default_shipping
25
- end
26
-
27
22
  default_scope -> { order([default: :desc, updated_at: :desc]) }
28
23
  end
29
24
  end
@@ -4,7 +4,7 @@ module Spree
4
4
  class UserLastUrlStorer
5
5
  module Rules
6
6
  # This is the basic rule that ships with Solidus that avoids storing in
7
- # session the current path for login/loout/signup routes, avoiding possibly
7
+ # session the current path for login/logout/signup routes, avoiding possibly
8
8
  # infinte redirects.
9
9
  module AuthenticationRule
10
10
  AUTHENTICATION_ROUTES = %w[spree_signup_path spree_login_path spree_logout_path]