solidus_core 4.1.6 → 4.5.1

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