solidus_core 4.6.4 → 4.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +13 -13
  3. data/app/controllers/spree/base_controller.rb +2 -2
  4. data/app/helpers/spree/base_helper.rb +24 -24
  5. data/app/helpers/spree/checkout_helper.rb +7 -7
  6. data/app/helpers/spree/core/controller_helpers/auth.rb +1 -1
  7. data/app/helpers/spree/core/controller_helpers/common.rb +3 -2
  8. data/app/helpers/spree/core/controller_helpers/order.rb +3 -5
  9. data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +1 -2
  10. data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +10 -12
  11. data/app/helpers/spree/products_helper.rb +6 -6
  12. data/app/helpers/spree/store_helper.rb +1 -1
  13. data/app/mailers/spree/carton_mailer.rb +3 -3
  14. data/app/mailers/spree/order_mailer.rb +4 -4
  15. data/app/mailers/spree/reimbursement_mailer.rb +2 -2
  16. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +5 -5
  17. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +5 -5
  18. data/app/models/concerns/spree/active_storage_adapter.rb +2 -2
  19. data/app/models/concerns/spree/adjustment_source.rb +4 -4
  20. data/app/models/concerns/spree/display_money.rb +2 -2
  21. data/app/models/concerns/spree/named_type.rb +1 -1
  22. data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
  23. data/app/models/concerns/spree/preferences/persistable.rb +1 -1
  24. data/app/models/concerns/spree/ransackable_attributes.rb +1 -0
  25. data/app/models/concerns/spree/soft_deletable.rb +2 -1
  26. data/app/models/concerns/spree/state_change_tracking.rb +1 -1
  27. data/app/models/concerns/spree/user_address_book.rb +12 -12
  28. data/app/models/concerns/spree/user_methods.rb +13 -13
  29. data/app/models/concerns/spree/user_reporting.rb +1 -0
  30. data/app/models/spree/ability.rb +1 -1
  31. data/app/models/spree/address/name.rb +1 -1
  32. data/app/models/spree/address.rb +7 -7
  33. data/app/models/spree/adjustment.rb +11 -10
  34. data/app/models/spree/adjustment_reason.rb +2 -2
  35. data/app/models/spree/billing_integration.rb +2 -2
  36. data/app/models/spree/calculator/default_tax.rb +2 -2
  37. data/app/models/spree/calculator/flat_fee.rb +1 -1
  38. data/app/models/spree/calculator/flat_rate.rb +2 -2
  39. data/app/models/spree/calculator/returns/default_refund_amount.rb +3 -3
  40. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +2 -2
  41. data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
  42. data/app/models/spree/calculator/shipping/flexi_rate.rb +8 -8
  43. data/app/models/spree/calculator/shipping/per_item.rb +3 -3
  44. data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
  45. data/app/models/spree/calculator.rb +31 -6
  46. data/app/models/spree/carton.rb +4 -4
  47. data/app/models/spree/classification.rb +2 -2
  48. data/app/models/spree/core/state_machines/order/class_methods.rb +3 -3
  49. data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +1 -1
  50. data/app/models/spree/country.rb +1 -1
  51. data/app/models/spree/credit_card.rb +27 -27
  52. data/app/models/spree/customer_return.rb +5 -4
  53. data/app/models/spree/distributed_amounts_handler.rb +1 -1
  54. data/app/models/spree/fulfilment_changer.rb +22 -22
  55. data/app/models/spree/image/active_storage_attachment.rb +2 -2
  56. data/app/models/spree/image/paperclip_attachment.rb +8 -8
  57. data/app/models/spree/in_memory_order_updater.rb +262 -0
  58. data/app/models/spree/inventory_unit.rb +11 -11
  59. data/app/models/spree/item_total.rb +1 -1
  60. data/app/models/spree/legacy_user.rb +2 -2
  61. data/app/models/spree/line_item.rb +21 -11
  62. data/app/models/spree/log_entry.rb +3 -3
  63. data/app/models/spree/mergeable_orders_finder.rb +44 -0
  64. data/app/models/spree/money.rb +2 -1
  65. data/app/models/spree/null_promotion_adjuster.rb +1 -1
  66. data/app/models/spree/option_type.rb +1 -1
  67. data/app/models/spree/option_value.rb +2 -2
  68. data/app/models/spree/order/number_generator.rb +1 -1
  69. data/app/models/spree/order.rb +66 -64
  70. data/app/models/spree/order_cancellations.rb +1 -3
  71. data/app/models/spree/order_inventory.rb +5 -8
  72. data/app/models/spree/order_mutex.rb +1 -1
  73. data/app/models/spree/order_shipping.rb +1 -1
  74. data/app/models/spree/order_updater.rb +59 -37
  75. data/app/models/spree/payment/cancellation.rb +2 -2
  76. data/app/models/spree/payment/processing.rb +22 -22
  77. data/app/models/spree/payment.rb +25 -25
  78. data/app/models/spree/payment_capture_event.rb +2 -2
  79. data/app/models/spree/payment_create.rb +1 -24
  80. data/app/models/spree/payment_method/bogus_credit_card.rb +18 -18
  81. data/app/models/spree/payment_method/check.rb +3 -3
  82. data/app/models/spree/payment_method/credit_card.rb +1 -1
  83. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +3 -3
  84. data/app/models/spree/payment_method/store_credit.rb +13 -13
  85. data/app/models/spree/payment_method.rb +12 -11
  86. data/app/models/spree/payment_source.rb +2 -2
  87. data/app/models/spree/permission_sets/dashboard_display.rb +3 -3
  88. data/app/models/spree/permission_sets/default_customer.rb +4 -4
  89. data/app/models/spree/preference.rb +1 -1
  90. data/app/models/spree/price.rb +7 -6
  91. data/app/models/spree/product/scopes.rb +23 -23
  92. data/app/models/spree/product.rb +38 -50
  93. data/app/models/spree/product_option_type.rb +2 -2
  94. data/app/models/spree/product_property.rb +3 -3
  95. data/app/models/spree/refund.rb +10 -10
  96. data/app/models/spree/refund_reason.rb +2 -2
  97. data/app/models/spree/reimbursement/credit.rb +1 -1
  98. data/app/models/spree/reimbursement.rb +8 -8
  99. data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
  100. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -1
  101. data/app/models/spree/reimbursement_type.rb +2 -2
  102. data/app/models/spree/return_authorization.rb +7 -6
  103. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +2 -2
  104. data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
  105. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +1 -1
  106. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +1 -1
  107. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +1 -1
  108. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +1 -1
  109. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
  110. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +6 -6
  111. data/app/models/spree/return_item.rb +26 -34
  112. data/app/models/spree/return_reason.rb +1 -1
  113. data/app/models/spree/role.rb +1 -1
  114. data/app/models/spree/role_user.rb +1 -1
  115. data/app/models/spree/shipment.rb +37 -29
  116. data/app/models/spree/shipping_method.rb +9 -9
  117. data/app/models/spree/shipping_method_category.rb +2 -2
  118. data/app/models/spree/shipping_rate.rb +12 -10
  119. data/app/models/spree/shipping_rate_tax.rb +5 -4
  120. data/app/models/spree/simple_order_contents.rb +2 -2
  121. data/app/models/spree/state.rb +1 -1
  122. data/app/models/spree/stock/availability.rb +9 -9
  123. data/app/models/spree/stock/availability_validator.rb +3 -3
  124. data/app/models/spree/stock/differentiator.rb +2 -2
  125. data/app/models/spree/stock/estimator.rb +4 -4
  126. data/app/models/spree/stock/inventory_validator.rb +1 -1
  127. data/app/models/spree/stock/package.rb +3 -3
  128. data/app/models/spree/stock_item.rb +5 -5
  129. data/app/models/spree/stock_location.rb +6 -6
  130. data/app/models/spree/stock_movement.rb +2 -2
  131. data/app/models/spree/stock_quantities.rb +2 -2
  132. data/app/models/spree/store.rb +3 -3
  133. data/app/models/spree/store_credit.rb +30 -29
  134. data/app/models/spree/store_credit_category.rb +2 -2
  135. data/app/models/spree/store_credit_event.rb +6 -6
  136. data/app/models/spree/store_credit_reason.rb +1 -1
  137. data/app/models/spree/store_credit_type.rb +3 -3
  138. data/app/models/spree/store_selector/by_server_name.rb +1 -1
  139. data/app/models/spree/store_selector/legacy.rb +1 -1
  140. data/app/models/spree/tax/item_tax.rb +1 -0
  141. data/app/models/spree/tax/order_tax.rb +1 -0
  142. data/app/models/spree/tax_category.rb +3 -3
  143. data/app/models/spree/tax_rate.rb +5 -5
  144. data/app/models/spree/tax_rate_tax_category.rb +2 -2
  145. data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
  146. data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
  147. data/app/models/spree/taxon.rb +18 -22
  148. data/app/models/spree/taxon_brand_selector.rb +3 -3
  149. data/app/models/spree/unauthorized_redirect_handler.rb +1 -1
  150. data/app/models/spree/unit_cancel.rb +4 -4
  151. data/app/models/spree/user_address.rb +3 -3
  152. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +6 -8
  153. data/app/models/spree/user_last_url_storer.rb +1 -1
  154. data/app/models/spree/variant/price_selector.rb +1 -1
  155. data/app/models/spree/variant/scopes.rb +9 -9
  156. data/app/models/spree/variant/vat_price_generator.rb +0 -1
  157. data/app/models/spree/variant.rb +25 -25
  158. data/app/models/spree/variant_property_rule.rb +2 -2
  159. data/app/models/spree/variant_property_rule_condition.rb +1 -1
  160. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
  161. data/app/models/spree/wallet/default_payment_builder.rb +1 -1
  162. data/app/models/spree/wallet_payment_source.rb +2 -2
  163. data/app/models/spree/zone.rb +18 -18
  164. data/app/models/spree/zone_member.rb +1 -1
  165. data/app/subscribers/spree/carton_shipped_mailer_subscriber.rb +2 -2
  166. data/app/subscribers/spree/order_cancel_mailer_subscriber.rb +2 -2
  167. data/app/subscribers/spree/order_confirmation_mailer_subscriber.rb +2 -2
  168. data/app/subscribers/spree/order_inventory_cancellation_mailer_subscriber.rb +2 -2
  169. data/app/subscribers/spree/reimbursement_mailer_subscriber.rb +2 -2
  170. data/app/views/layouts/spree/base_mailer.html.erb +0 -1
  171. data/config/initializers/assets.rb +1 -1
  172. data/config/initializers/db_query_matchers.rb +9 -0
  173. data/config/initializers/friendly_id.rb +2 -2
  174. data/config/initializers/inflections.rb +1 -1
  175. data/config/initializers/money.rb +1 -1
  176. data/config/locales/en.yml +1 -0
  177. data/db/default/spree/countries.rb +7 -7
  178. data/db/default/spree/return_reasons.rb +11 -11
  179. data/db/default/spree/stock_locations.rb +1 -1
  180. data/db/default/spree/store_credit.rb +3 -4
  181. data/db/default/spree/stores.rb +1 -1
  182. data/db/default/spree/zones.rb +5 -5
  183. data/db/migrate/20160101010000_solidus_one_four.rb +16 -16
  184. data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +3 -3
  185. data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +7 -6
  186. data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +10 -10
  187. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +6 -6
  188. data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +1 -1
  189. data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +4 -4
  190. data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +9 -15
  191. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +1 -0
  192. data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +3 -3
  193. data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +1 -1
  194. data/db/migrate/20250214094207_add_reverse_charge_status_to_store.rb +1 -1
  195. data/db/migrate/20250225051308_add_vat_id_email_and_reverse_charge_status_to_addresses.rb +1 -1
  196. data/db/seeds.rb +3 -3
  197. data/lib/generators/solidus/install/app_templates/authentication/custom.rb +2 -2
  198. data/lib/generators/solidus/install/app_templates/authentication/devise.rb +3 -3
  199. data/lib/generators/solidus/install/app_templates/authentication/existing.rb +1 -1
  200. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
  201. data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +1 -1
  202. data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +1 -1
  203. data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +2 -2
  204. data/lib/generators/solidus/install/install_generator.rb +51 -51
  205. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -0
  206. data/lib/generators/solidus/update/update_generator.rb +29 -29
  207. data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -6
  208. data/lib/generators/spree/dummy/dummy_generator.rb +22 -24
  209. data/lib/generators/spree/dummy/templates/rails/boot.rb +3 -3
  210. data/lib/generators/spree/dummy/templates/rails/test.rb +4 -4
  211. data/lib/solidus_core.rb +1 -1
  212. data/lib/spree/app_configuration.rb +59 -47
  213. data/lib/spree/bus.rb +1 -1
  214. data/lib/spree/config.rb +1 -1
  215. data/lib/spree/core/active_merchant_dependencies.rb +8 -8
  216. data/lib/spree/core/class_constantizer.rb +1 -1
  217. data/lib/spree/core/engine.rb +15 -15
  218. data/lib/spree/core/environment.rb +1 -1
  219. data/lib/spree/core/environment_extension.rb +2 -2
  220. data/lib/spree/core/importer/order.rb +15 -15
  221. data/lib/spree/core/importer/product.rb +4 -4
  222. data/lib/spree/core/importer.rb +2 -2
  223. data/lib/spree/core/null_promotion_configuration.rb +7 -7
  224. data/lib/spree/core/permalinks.rb +1 -1
  225. data/lib/spree/core/product_filters.rb +94 -93
  226. data/lib/spree/core/role_configuration.rb +3 -3
  227. data/lib/spree/core/search/base.rb +5 -6
  228. data/lib/spree/core/search/variant.rb +3 -3
  229. data/lib/spree/core/stock_configuration.rb +10 -49
  230. data/lib/spree/core/validators/email.rb +1 -1
  231. data/lib/spree/core/version.rb +3 -3
  232. data/lib/spree/core/versioned_value.rb +4 -6
  233. data/lib/spree/core.rb +49 -49
  234. data/lib/spree/deprecated_instance_variable_proxy.rb +1 -1
  235. data/lib/spree/deprecation.rb +1 -1
  236. data/lib/spree/deprecator.rb +2 -2
  237. data/lib/spree/i18n.rb +2 -2
  238. data/lib/spree/localized_number.rb +3 -3
  239. data/lib/spree/manipulative_query_monitor.rb +19 -0
  240. data/lib/spree/migrations.rb +2 -2
  241. data/lib/spree/permitted_attributes.rb +11 -12
  242. data/lib/spree/preferences/configuration.rb +5 -5
  243. data/lib/spree/preferences/preferable.rb +8 -10
  244. data/lib/spree/preferences/preferable_class_methods.rb +16 -16
  245. data/lib/spree/preferences/preference_differentiator.rb +1 -1
  246. data/lib/spree/preferences/scoped_store.rb +2 -2
  247. data/lib/spree/preferences/static_model_preferences.rb +2 -2
  248. data/lib/spree/preferences/store.rb +6 -6
  249. data/lib/spree/testing_support/ability_helpers.rb +30 -30
  250. data/lib/spree/testing_support/authorization_helpers.rb +6 -5
  251. data/lib/spree/testing_support/blacklist_urls.rb +1 -1
  252. data/lib/spree/testing_support/bus_helpers.rb +1 -1
  253. data/lib/spree/testing_support/capybara_driver.rb +1 -1
  254. data/lib/spree/testing_support/capybara_ext.rb +12 -12
  255. data/lib/spree/testing_support/common_rake.rb +17 -16
  256. data/lib/spree/testing_support/dummy_ability.rb +1 -1
  257. data/lib/spree/testing_support/dummy_app/migrations.rb +1 -1
  258. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +5 -5
  259. data/lib/spree/testing_support/dummy_app/routes.rb +1 -1
  260. data/lib/spree/testing_support/dummy_app.rb +34 -34
  261. data/lib/spree/testing_support/extension_rake.rb +2 -2
  262. data/lib/spree/testing_support/factories/address_factory.rb +12 -12
  263. data/lib/spree/testing_support/factories/adjustment_factory.rb +7 -7
  264. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
  265. data/lib/spree/testing_support/factories/calculator_factory.rb +6 -6
  266. data/lib/spree/testing_support/factories/carton_factory.rb +1 -1
  267. data/lib/spree/testing_support/factories/country_factory.rb +3 -3
  268. data/lib/spree/testing_support/factories/credit_card_factory.rb +3 -3
  269. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
  270. data/lib/spree/testing_support/factories/image_factory.rb +2 -2
  271. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -4
  272. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
  273. data/lib/spree/testing_support/factories/option_type_factory.rb +2 -2
  274. data/lib/spree/testing_support/factories/option_value_factory.rb +2 -2
  275. data/lib/spree/testing_support/factories/order_factory.rb +16 -16
  276. data/lib/spree/testing_support/factories/payment_factory.rb +9 -9
  277. data/lib/spree/testing_support/factories/payment_method_factory.rb +10 -10
  278. data/lib/spree/testing_support/factories/price_factory.rb +2 -2
  279. data/lib/spree/testing_support/factories/product_factory.rb +2 -2
  280. data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
  281. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  282. data/lib/spree/testing_support/factories/property_factory.rb +3 -3
  283. data/lib/spree/testing_support/factories/refund_factory.rb +2 -2
  284. data/lib/spree/testing_support/factories/refund_reason_factory.rb +1 -1
  285. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  286. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
  287. data/lib/spree/testing_support/factories/return_authorization_factory.rb +3 -3
  288. data/lib/spree/testing_support/factories/return_item_factory.rb +2 -10
  289. data/lib/spree/testing_support/factories/return_reason_factory.rb +1 -1
  290. data/lib/spree/testing_support/factories/role_factory.rb +2 -2
  291. data/lib/spree/testing_support/factories/shipment_factory.rb +3 -3
  292. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  293. data/lib/spree/testing_support/factories/shipping_method_factory.rb +7 -7
  294. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +1 -1
  295. data/lib/spree/testing_support/factories/state_factory.rb +4 -4
  296. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  297. data/lib/spree/testing_support/factories/stock_location_factory.rb +7 -7
  298. data/lib/spree/testing_support/factories/stock_movement_factory.rb +3 -3
  299. data/lib/spree/testing_support/factories/stock_package_factory.rb +3 -3
  300. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
  301. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +6 -6
  302. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  303. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +1 -1
  304. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +6 -6
  305. data/lib/spree/testing_support/factories/store_factory.rb +2 -2
  306. data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -1
  307. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  308. data/lib/spree/testing_support/factories/taxon_factory.rb +3 -3
  309. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
  310. data/lib/spree/testing_support/factories/user_factory.rb +2 -2
  311. data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
  312. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +1 -1
  313. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +1 -1
  314. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +1 -1
  315. data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
  316. data/lib/spree/testing_support/factory_bot.rb +1 -1
  317. data/lib/spree/testing_support/flaky.rb +3 -2
  318. data/lib/spree/testing_support/flash.rb +2 -2
  319. data/lib/spree/testing_support/order_walkthrough.rb +6 -6
  320. data/lib/spree/testing_support/preferences.rb +1 -1
  321. data/lib/spree/testing_support/rake.rb +1 -1
  322. data/lib/spree/testing_support/shared_examples/calculator.rb +1 -1
  323. data/lib/spree/testing_support/shared_examples/gallery.rb +7 -7
  324. data/lib/spree/testing_support/shared_examples/order_factory.rb +9 -9
  325. data/lib/spree/testing_support/shared_examples/working_factory.rb +1 -1
  326. data/lib/spree/testing_support/translations.rb +1 -1
  327. data/lib/spree_core.rb +1 -1
  328. data/lib/tasks/payment_method.rake +2 -2
  329. data/solidus_core.gemspec +49 -49
  330. metadata +60 -57
  331. data/app/views/layouts/spree/ink.license.txt +0 -28
  332. data/vendor/assets/javascripts/jquery.payment.license.txt +0 -25
  333. data/vendor/assets/javascripts/jsuri.license.txt +0 -12
@@ -5,14 +5,14 @@ module Spree
5
5
  include Metadata
6
6
 
7
7
  belongs_to :payment, inverse_of: :refunds, optional: true
8
- belongs_to :reason, class_name: 'Spree::RefundReason', foreign_key: :refund_reason_id, optional: true
8
+ belongs_to :reason, class_name: "Spree::RefundReason", foreign_key: :refund_reason_id, optional: true
9
9
  belongs_to :reimbursement, inverse_of: :refunds, optional: true
10
10
 
11
11
  has_many :log_entries, as: :source
12
12
 
13
13
  validates :payment, presence: true
14
14
  validates :reason, presence: true
15
- validates :amount, presence: true, numericality: { greater_than: 0 }
15
+ validates :amount, presence: true, numericality: {greater_than: 0}
16
16
 
17
17
  validate :amount_is_less_than_or_equal_to_allowed_amount, on: :create
18
18
 
@@ -23,9 +23,9 @@ module Spree
23
23
  delegate :currency, to: :payment
24
24
 
25
25
  def money
26
- Spree::Money.new(amount, { currency: })
26
+ Spree::Money.new(amount, {currency:})
27
27
  end
28
- alias display_amount money
28
+ alias_method :display_amount, :money
29
29
 
30
30
  class << self
31
31
  def total_amount_reimbursed_for(reimbursement)
@@ -68,21 +68,21 @@ module Spree
68
68
  # return an activemerchant response object if successful or else raise an error
69
69
  def process!(credit_cents)
70
70
  response = if payment.payment_method.payment_profiles_supported?
71
- payment.payment_method.credit(credit_cents, payment.source, payment.transaction_id, { originator: self })
71
+ payment.payment_method.credit(credit_cents, payment.source, payment.transaction_id, {originator: self})
72
72
  else
73
- payment.payment_method.credit(credit_cents, payment.transaction_id, { originator: self })
73
+ payment.payment_method.credit(credit_cents, payment.transaction_id, {originator: self})
74
74
  end
75
75
 
76
76
  if !response.success?
77
- logger.error(I18n.t('spree.gateway_error') + " #{response.to_yaml}")
78
- text = response.params['message'] || response.params['response_reason_text'] || response.message
77
+ logger.error(I18n.t("spree.gateway_error") + " #{response.to_yaml}")
78
+ text = response.params["message"] || response.params["response_reason_text"] || response.message
79
79
  raise Core::GatewayError.new(text)
80
80
  end
81
81
 
82
82
  response
83
83
  rescue ActiveMerchant::ConnectionError => error
84
- logger.error(I18n.t('spree.gateway_error') + " #{error.inspect}")
85
- raise Core::GatewayError.new(I18n.t('spree.unable_to_connect_to_gateway'))
84
+ logger.error(I18n.t("spree.gateway_error") + " #{error.inspect}")
85
+ raise Core::GatewayError.new(I18n.t("spree.unable_to_connect_to_gateway"))
86
86
  end
87
87
 
88
88
  def amount_is_less_than_or_equal_to_allowed_amount
@@ -5,9 +5,9 @@ module Spree
5
5
  scope :active, -> { where(active: true) }
6
6
  default_scope -> { order(arel_table[:name].lower) }
7
7
 
8
- validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
8
+ validates :name, presence: true, uniqueness: {case_sensitive: false, allow_blank: true}
9
9
 
10
- RETURN_PROCESSING_REASON = 'Return processing'
10
+ RETURN_PROCESSING_REASON = "Return processing"
11
11
 
12
12
  has_many :refunds
13
13
 
@@ -22,7 +22,7 @@ module Spree
22
22
  end
23
23
 
24
24
  def display_amount
25
- Spree::Money.new(amount, { currency: creditable.try(:currency) || "USD" })
25
+ Spree::Money.new(amount, {currency: creditable.try(:currency) || "USD"})
26
26
  end
27
27
  end
28
28
  end
@@ -8,7 +8,7 @@ module Spree
8
8
  belongs_to :customer_return, inverse_of: :reimbursements, touch: true, optional: true
9
9
 
10
10
  has_many :refunds, inverse_of: :reimbursement
11
- has_many :credits, inverse_of: :reimbursement, class_name: 'Spree::Reimbursement::Credit'
11
+ has_many :credits, inverse_of: :reimbursement, class_name: "Spree::Reimbursement::Credit"
12
12
 
13
13
  has_many :return_items, inverse_of: :reimbursement
14
14
 
@@ -20,7 +20,7 @@ module Spree
20
20
  before_create :generate_number
21
21
  before_create :calculate_total
22
22
 
23
- scope :reimbursed, -> { where(reimbursement_status: 'reimbursed') }
23
+ scope :reimbursed, -> { where(reimbursement_status: "reimbursed") }
24
24
 
25
25
  # The reimbursement_tax_calculator property should be set to an object that responds to "call"
26
26
  # and accepts a reimbursement object. Invoking "call" should update the tax fields on the
@@ -64,7 +64,7 @@ module Spree
64
64
  end
65
65
 
66
66
  def display_total
67
- Spree::Money.new(total, { currency: order.currency })
67
+ Spree::Money.new(total, {currency: order.currency})
68
68
  end
69
69
 
70
70
  def calculated_total
@@ -150,7 +150,7 @@ module Spree
150
150
 
151
151
  def generate_number
152
152
  self.number ||= loop do
153
- random = "RI#{Array.new(9){ rand(9) }.join}"
153
+ random = "RI#{Array.new(9) { rand(9) }.join}"
154
154
  break random unless self.class.exists?(number: random)
155
155
  end
156
156
  end
@@ -172,10 +172,10 @@ module Spree
172
172
  model.total_amount_reimbursed_for(self) > 0
173
173
  end
174
174
  leniency = if reimbursement_count > 0
175
- (reimbursement_count - 1) * 0.01.to_d
176
- else
177
- 0
178
- end
175
+ (reimbursement_count - 1) * BigDecimal("0.01")
176
+ else
177
+ 0
178
+ end
179
179
  unpaid_amount.abs.between?(0, leniency)
180
180
  end
181
181
  end
@@ -23,7 +23,7 @@ module Spree
23
23
  percent_of_tax = (return_item.amount <= 0) ? 0 : return_item.amount / Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
24
24
 
25
25
  additional_tax_total = percent_of_tax * return_item.inventory_unit.additional_tax_total
26
- included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
26
+ included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
27
27
 
28
28
  return_item.update!({
29
29
  additional_tax_total:,
@@ -68,7 +68,7 @@ module Spree
68
68
  end
69
69
 
70
70
  def sorted_eligible_refund_payments(payments)
71
- if eligible_refund_methods = self.eligible_refund_methods
71
+ if (eligible_refund_methods = self.eligible_refund_methods)
72
72
  payments = payments.select { |payment| eligible_refund_methods.include? payment.payment_method.class }
73
73
  payments = payments.sort_by { |payment| eligible_refund_methods.index(payment.payment_method.class) }
74
74
  end
@@ -5,9 +5,9 @@ module Spree
5
5
  scope :active, -> { where(active: true) }
6
6
  default_scope -> { order(arel_table[:name].lower) }
7
7
 
8
- validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
8
+ validates :name, presence: true, uniqueness: {case_sensitive: false, allow_blank: true}
9
9
 
10
- ORIGINAL = 'original'
10
+ ORIGINAL = "original"
11
11
 
12
12
  has_many :return_items
13
13
 
@@ -6,14 +6,14 @@ module Spree
6
6
  class ReturnAuthorization < Spree::Base
7
7
  include Metadata
8
8
 
9
- belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations, optional: true
9
+ belongs_to :order, class_name: "Spree::Order", inverse_of: :return_authorizations, optional: true
10
10
 
11
11
  has_many :return_items, inverse_of: :return_authorization, dependent: :destroy
12
12
  has_many :inventory_units, through: :return_items, dependent: :nullify
13
13
  has_many :customer_returns, through: :return_items
14
14
 
15
15
  belongs_to :stock_location, optional: true
16
- belongs_to :reason, class_name: 'Spree::ReturnReason', foreign_key: :return_reason_id, optional: true
16
+ belongs_to :reason, class_name: "Spree::ReturnReason", foreign_key: :return_reason_id, optional: true
17
17
 
18
18
  before_create :generate_number
19
19
 
@@ -27,9 +27,10 @@ module Spree
27
27
  include ::Spree::Config.state_machines.return_authorization
28
28
 
29
29
  extend DisplayMoney
30
+
30
31
  money_methods :amount, :total_excluding_vat
31
32
 
32
- self.allowed_ransackable_attributes = ['memo']
33
+ self.allowed_ransackable_attributes = ["memo"]
33
34
 
34
35
  def total_excluding_vat
35
36
  return_items.sum(&:total_excluding_vat)
@@ -59,20 +60,20 @@ module Spree
59
60
 
60
61
  def must_have_shipped_units
61
62
  if order.nil? || order.inventory_units.shipped.none?
62
- errors.add(:order, I18n.t('spree.has_no_shipped_units'))
63
+ errors.add(:order, I18n.t("spree.has_no_shipped_units"))
63
64
  end
64
65
  end
65
66
 
66
67
  def generate_number
67
68
  self.number ||= loop do
68
- random = "RA#{Array.new(9){ rand(9) }.join}"
69
+ random = "RA#{Array.new(9) { rand(9) }.join}"
69
70
  break random unless self.class.exists?(number: random)
70
71
  end
71
72
  end
72
73
 
73
74
  def no_previously_exchanged_inventory_units
74
75
  if return_items.map(&:inventory_unit).any?(&:exchange_requested?)
75
- errors.add(:base, I18n.t('spree.return_items_cannot_be_created_for_inventory_units_that_are_already_awaiting_exchange'))
76
+ errors.add(:base, I18n.t("spree.return_items_cannot_be_created_for_inventory_units_that_are_already_awaiting_exchange"))
76
77
  end
77
78
  end
78
79
 
@@ -12,11 +12,11 @@ module Spree
12
12
  end
13
13
 
14
14
  def eligible_for_return?
15
- raise NotImplementedError, I18n.t('spree.implement_eligible_for_return')
15
+ raise NotImplementedError, I18n.t("spree.implement_eligible_for_return")
16
16
  end
17
17
 
18
18
  def requires_manual_intervention?
19
- raise NotImplementedError, I18n.t('spree.implement_requires_manual_intervention')
19
+ raise NotImplementedError, I18n.t("spree.implement_requires_manual_intervention")
20
20
  end
21
21
 
22
22
  private
@@ -28,7 +28,7 @@ module Spree
28
28
  private
29
29
 
30
30
  def validators
31
- @validators ||= permitted_eligibility_validators.map{ |validator| validator.new(@return_item) }
31
+ @validators ||= permitted_eligibility_validators.map { |validator| validator.new(@return_item) }
32
32
  end
33
33
  end
34
34
  end
@@ -8,7 +8,7 @@ module Spree
8
8
  if @return_item.inventory_unit.shipped?
9
9
  true
10
10
  else
11
- add_error(:inventory_unit_shipped, I18n.t('spree.return_item_inventory_unit_ineligible'))
11
+ add_error(:inventory_unit_shipped, I18n.t("spree.return_item_inventory_unit_ineligible"))
12
12
  false
13
13
  end
14
14
  end
@@ -6,7 +6,7 @@ module Spree
6
6
  class NoReimbursements < Spree::ReturnItem::EligibilityValidator::BaseValidator
7
7
  def eligible_for_return?
8
8
  if @return_item.inventory_unit.return_items.reimbursed.valid.any?
9
- add_error(:inventory_unit_reimbursed, I18n.t('spree.return_item_inventory_unit_reimbursed'))
9
+ add_error(:inventory_unit_reimbursed, I18n.t("spree.return_item_inventory_unit_reimbursed"))
10
10
  false
11
11
  else
12
12
  true
@@ -8,7 +8,7 @@ module Spree
8
8
  if @return_item.inventory_unit.order.completed?
9
9
  true
10
10
  else
11
- add_error(:order_not_completed, I18n.t('spree.return_item_order_not_completed'))
11
+ add_error(:order_not_completed, I18n.t("spree.return_item_order_not_completed"))
12
12
  false
13
13
  end
14
14
  end
@@ -8,7 +8,7 @@ module Spree
8
8
  if @return_item.return_authorization.present?
9
9
  true
10
10
  else
11
- add_error(:rma_required, I18n.t('spree.return_item_rma_ineligible'))
11
+ add_error(:rma_required, I18n.t("spree.return_item_rma_ineligible"))
12
12
  false
13
13
  end
14
14
  end
@@ -8,7 +8,7 @@ module Spree
8
8
  if (@return_item.inventory_unit.order.completed_at + Spree::Config[:return_eligibility_number_of_days].days) > Time.current
9
9
  true
10
10
  else
11
- add_error(:number_of_days, I18n.t('spree.return_item_time_period_ineligible'))
11
+ add_error(:number_of_days, I18n.t("spree.return_item_time_period_ineligible"))
12
12
  false
13
13
  end
14
14
  end
@@ -30,12 +30,12 @@ module Spree
30
30
  # Finds all the OptionValueVariants that have any of the
31
31
  # relevant option values, groups by variant and ensures the variant
32
32
  # has ALL of the relevant option values.
33
- variant_ids = Spree::OptionValuesVariant.
34
- where(variant_id: product_variants.distinct.pluck(:id)).
35
- where(option_value: relevant_option_values).
36
- group(:variant_id).
37
- having('COUNT(*) = ?', relevant_option_values.size).
38
- pluck(:variant_id)
33
+ variant_ids = Spree::OptionValuesVariant
34
+ .where(variant_id: product_variants.distinct.pluck(:id))
35
+ .where(option_value: relevant_option_values)
36
+ .group(:variant_id)
37
+ .having("COUNT(*) = ?", relevant_option_values.size)
38
+ .pluck(:variant_id)
39
39
  product_variants.where(id: variant_ids)
40
40
  else
41
41
  product_variants
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Spree
4
4
  class ReturnItem < Spree::Base
5
- INTERMEDIATE_RECEPTION_STATUSES = %i(given_to_customer lost_in_transit shipped_wrong_item short_shipped in_transit)
5
+ INTERMEDIATE_RECEPTION_STATUSES = %i[given_to_customer lost_in_transit shipped_wrong_item short_shipped in_transit]
6
6
  COMPLETED_RECEPTION_STATUSES = INTERMEDIATE_RECEPTION_STATUSES + [:received]
7
7
 
8
8
  # @!scope class
@@ -31,37 +31,36 @@ module Spree
31
31
 
32
32
  belongs_to :return_authorization, inverse_of: :return_items, optional: true
33
33
  belongs_to :inventory_unit, inverse_of: :return_items
34
- belongs_to :exchange_variant, class_name: 'Spree::Variant', optional: true
35
- belongs_to :exchange_inventory_unit, class_name: 'Spree::InventoryUnit', inverse_of: :original_return_item, optional: true
34
+ belongs_to :exchange_variant, class_name: "Spree::Variant", optional: true
35
+ belongs_to :exchange_inventory_unit, class_name: "Spree::InventoryUnit", inverse_of: :original_return_item, optional: true
36
36
  belongs_to :customer_return, inverse_of: :return_items, optional: true
37
37
  belongs_to :reimbursement, inverse_of: :return_items, optional: true
38
- belongs_to :preferred_reimbursement_type, class_name: 'Spree::ReimbursementType', optional: true
39
- belongs_to :override_reimbursement_type, class_name: 'Spree::ReimbursementType', optional: true
40
- belongs_to :return_reason, class_name: 'Spree::ReturnReason', foreign_key: :return_reason_id, optional: true
38
+ belongs_to :preferred_reimbursement_type, class_name: "Spree::ReimbursementType", optional: true
39
+ belongs_to :override_reimbursement_type, class_name: "Spree::ReimbursementType", optional: true
40
+ belongs_to :return_reason, class_name: "Spree::ReturnReason", foreign_key: :return_reason_id, optional: true
41
41
 
42
42
  validate :eligible_exchange_variant
43
43
  validate :belongs_to_same_customer_order
44
- validate :belongs_to_return_authorization_order, if: -> { inventory_unit_id_changed? || return_authorization_id_changed? }
45
44
  validate :validate_acceptance_status_for_reimbursement
46
45
  validate :validate_no_other_completed_return_items
47
46
 
48
47
  after_create :cancel_others, unless: :cancelled?
49
48
 
50
- scope :awaiting_return, -> { where(reception_status: 'awaiting') }
49
+ scope :awaiting_return, -> { where(reception_status: "awaiting") }
51
50
  scope :expecting_return, -> { where.not(reception_status: COMPLETED_RECEPTION_STATUSES) }
52
- scope :not_cancelled, -> { where.not(reception_status: 'cancelled') }
53
- scope :valid, -> { where.not(reception_status: %w(cancelled expired unexchanged)) }
54
- scope :not_expired, -> { where.not(reception_status: 'expired') }
55
- scope :received, -> { where(reception_status: 'received') }
51
+ scope :not_cancelled, -> { where.not(reception_status: "cancelled") }
52
+ scope :valid, -> { where.not(reception_status: %w[cancelled expired unexchanged]) }
53
+ scope :not_expired, -> { where.not(reception_status: "expired") }
54
+ scope :received, -> { where(reception_status: "received") }
56
55
  INTERMEDIATE_RECEPTION_STATUSES.each do |reception_status|
57
56
  scope reception_status, -> { where(reception_status:) }
58
57
  end
59
- scope :pending, -> { where(acceptance_status: 'pending') }
60
- scope :accepted, -> { where(acceptance_status: 'accepted') }
61
- scope :rejected, -> { where(acceptance_status: 'rejected') }
62
- scope :manual_intervention_required, -> { where(acceptance_status: 'manual_intervention_required') }
63
- scope :undecided, -> { where(acceptance_status: %w(pending manual_intervention_required)) }
64
- scope :decided, -> { where.not(acceptance_status: %w(pending manual_intervention_required)) }
58
+ scope :pending, -> { where(acceptance_status: "pending") }
59
+ scope :accepted, -> { where(acceptance_status: "accepted") }
60
+ scope :rejected, -> { where(acceptance_status: "rejected") }
61
+ scope :manual_intervention_required, -> { where(acceptance_status: "manual_intervention_required") }
62
+ scope :undecided, -> { where(acceptance_status: %w[pending manual_intervention_required]) }
63
+ scope :decided, -> { where.not(acceptance_status: %w[pending manual_intervention_required]) }
65
64
  scope :reimbursed, -> { where.not(reimbursement_id: nil) }
66
65
  scope :not_reimbursed, -> { where(reimbursement_id: nil) }
67
66
  scope :exchange_requested, -> { where.not(exchange_variant: nil) }
@@ -81,6 +80,7 @@ module Spree
81
80
  include ::Spree::Config.state_machines.return_item_acceptance
82
81
 
83
82
  extend DisplayMoney
83
+
84
84
  money_methods :amount, :total, :total_excluding_vat
85
85
 
86
86
  # @return [Boolean] true when this retur item is in a complete reception
@@ -169,13 +169,13 @@ module Spree
169
169
  event_paths.delete(:expired)
170
170
  event_paths.delete(:unexchange)
171
171
 
172
- status_paths.map{ |status| I18n.t("spree.reception_states.#{status}", default: status.to_s.humanize) }.zip(event_paths)
172
+ status_paths.map { |status| I18n.t("spree.reception_states.#{status}", default: status.to_s.humanize) }.zip(event_paths)
173
173
  end
174
174
 
175
175
  def part_of_exchange?
176
176
  # test whether this ReturnItem was either a) one for which an exchange was sent or
177
177
  # b) the exchanged item itself being returned in lieu of the original item
178
- exchange_requested? || sibling_intended_for_exchange('unexchanged')
178
+ exchange_requested? || sibling_intended_for_exchange("unexchanged")
179
179
  end
180
180
 
181
181
  def currency
@@ -204,7 +204,7 @@ module Spree
204
204
  end
205
205
 
206
206
  def check_unexchange
207
- original_ri = sibling_intended_for_exchange('awaiting')
207
+ original_ri = sibling_intended_for_exchange("awaiting")
208
208
  if original_ri
209
209
  original_ri.unexchange!
210
210
  set_default_amount
@@ -222,14 +222,6 @@ module Spree
222
222
  return unless customer_return && inventory_unit
223
223
 
224
224
  if customer_return.order_id != inventory_unit.order_id
225
- errors.add(:base, I18n.t('spree.return_items_cannot_be_associated_with_multiple_orders'))
226
- end
227
- end
228
-
229
- def belongs_to_return_authorization_order
230
- return unless return_authorization && inventory_unit
231
-
232
- if return_authorization.order_id != inventory_unit.order_id
233
225
  errors.add(:base, I18n.t("spree.return_items_cannot_be_associated_with_multiple_orders"))
234
226
  end
235
227
  end
@@ -237,7 +229,7 @@ module Spree
237
229
  def eligible_exchange_variant
238
230
  return unless exchange_variant && exchange_variant_id_changed?
239
231
  unless eligible_exchange_variants.include?(exchange_variant)
240
- errors.add(:base, I18n.t('spree.invalid_exchange_variant'))
232
+ errors.add(:base, I18n.t("spree.invalid_exchange_variant"))
241
233
  end
242
234
  end
243
235
 
@@ -252,7 +244,7 @@ module Spree
252
244
  end
253
245
 
254
246
  def set_exchange_amount
255
- self.amount = 0.0.to_d if exchange_requested?
247
+ self.amount = BigDecimal("0.0") if exchange_requested?
256
248
  end
257
249
 
258
250
  def validate_no_other_completed_return_items
@@ -270,9 +262,9 @@ module Spree
270
262
 
271
263
  def cancel_others
272
264
  Spree::ReturnItem.where(inventory_unit_id:)
273
- .where.not(id:)
274
- .valid
275
- .each(&:cancel!)
265
+ .where.not(id:)
266
+ .valid
267
+ .each(&:cancel!)
276
268
  end
277
269
 
278
270
  def should_restock?
@@ -5,7 +5,7 @@ module Spree
5
5
  scope :active, -> { where(active: true) }
6
6
  default_scope -> { order(arel_table[:name].lower) }
7
7
 
8
- validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
8
+ validates :name, presence: true, uniqueness: {case_sensitive: false, allow_blank: true}
9
9
 
10
10
  has_many :return_authorizations
11
11
 
@@ -7,7 +7,7 @@ module Spree
7
7
  has_many :role_permissions, dependent: :destroy
8
8
  has_many :permission_sets, through: :role_permissions
9
9
 
10
- validates :name, presence: true, uniqueness: { case_sensitive: true, allow_blank: true }
10
+ validates :name, presence: true, uniqueness: {case_sensitive: true, allow_blank: true}
11
11
 
12
12
  def admin?
13
13
  name == "admin"
@@ -8,7 +8,7 @@ module Spree
8
8
 
9
9
  after_create :auto_generate_spree_api_key
10
10
 
11
- validates :role_id, uniqueness: { scope: :user_id }
11
+ validates :role_id, uniqueness: {scope: :user_id}
12
12
 
13
13
  private
14
14
 
@@ -6,12 +6,12 @@ module Spree
6
6
  class Shipment < Spree::Base
7
7
  include Metadata
8
8
 
9
- belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments, optional: true
10
- belongs_to :stock_location, class_name: 'Spree::StockLocation', optional: true
9
+ belongs_to :order, class_name: "Spree::Order", touch: true, inverse_of: :shipments, optional: true
10
+ belongs_to :stock_location, class_name: "Spree::StockLocation", optional: true
11
11
 
12
12
  has_many :adjustments, as: :adjustable, inverse_of: :adjustable, dependent: :delete_all, autosave: true
13
13
  has_many :inventory_units, dependent: :destroy, inverse_of: :shipment
14
- has_many :shipping_rates, -> { order(:cost) }, dependent: :destroy, inverse_of: :shipment
14
+ has_many :shipping_rates, -> { order(:cost) }, dependent: :destroy, inverse_of: :shipment, autosave: true
15
15
  has_many :shipping_methods, through: :shipping_rates
16
16
  has_many :state_changes, as: :stateful
17
17
  has_many :cartons, -> { distinct }, through: :inventory_units
@@ -27,11 +27,11 @@ module Spree
27
27
 
28
28
  accepts_nested_attributes_for :inventory_units
29
29
 
30
- make_permalink field: :number, length: 11, prefix: 'H'
30
+ make_permalink field: :number, length: 11, prefix: "H"
31
31
 
32
- scope :pending, -> { with_state('pending') }
33
- scope :ready, -> { with_state('ready') }
34
- scope :shipped, -> { with_state('shipped') }
32
+ scope :pending, -> { with_state("pending") }
33
+ scope :ready, -> { with_state("ready") }
34
+ scope :shipped, -> { with_state("shipped") }
35
35
  scope :trackable, -> { where("tracking IS NOT NULL AND tracking != ''") }
36
36
  scope :with_state, ->(*state) { where(state:) }
37
37
  # sort by most recent shipped_at, falling back to created_at. add "id desc" to make specs that involve this scope more deterministic.
@@ -43,8 +43,8 @@ module Spree
43
43
 
44
44
  include ::Spree::Config.state_machines.shipment
45
45
 
46
- self.allowed_ransackable_associations = ['order']
47
- self.allowed_ransackable_attributes = ['number']
46
+ self.allowed_ransackable_associations = ["order"]
47
+ self.allowed_ransackable_attributes = ["number"]
48
48
 
49
49
  delegate :tax_category, :tax_category_id, to: :selected_shipping_rate, allow_nil: true
50
50
 
@@ -63,9 +63,10 @@ module Spree
63
63
  end
64
64
 
65
65
  extend DisplayMoney
66
+
66
67
  money_methods(
67
68
  :cost, :amount, :item_cost,
68
- :total, :total_before_tax,
69
+ :total, :total_before_tax
69
70
  )
70
71
  alias_attribute :amount, :cost
71
72
 
@@ -151,7 +152,7 @@ module Spree
151
152
  # If one of the new rates matches the previously selected shipping
152
153
  # method, select that instead of the default provided by the estimator.
153
154
  # Otherwise, keep the default.
154
- selected_rate = new_rates.detect{ |rate| rate.shipping_method_id == original_shipping_method_id }
155
+ selected_rate = new_rates.detect { |rate| rate.shipping_method_id == original_shipping_method_id }
155
156
  if selected_rate
156
157
  new_rates.each do |rate|
157
158
  rate.selected = (rate == selected_rate)
@@ -195,7 +196,7 @@ module Spree
195
196
  end
196
197
 
197
198
  transaction do
198
- selected_shipping_rate.update!(selected: false) if selected_shipping_rate
199
+ selected_shipping_rate&.update!(selected: false)
199
200
  new_rate.update!(selected: true)
200
201
  end
201
202
  end
@@ -203,13 +204,13 @@ module Spree
203
204
  def determine_state(order)
204
205
  Spree.deprecator.warn "Use Spree::Shipment#recalculate_state instead"
205
206
 
206
- return 'shipped' if shipped?
207
- return 'canceled' if order.canceled? || inventory_units.all?(&:canceled?)
208
- return 'pending' unless order.can_ship?
207
+ return "shipped" if shipped?
208
+ return "canceled" if order.canceled? || inventory_units.all?(&:canceled?)
209
+ return "pending" unless order.can_ship?
209
210
  if can_transition_from_pending_to_ready?
210
- 'ready'
211
+ "ready"
211
212
  else
212
- 'pending'
213
+ "pending"
213
214
  end
214
215
  end
215
216
 
@@ -243,7 +244,7 @@ module Spree
243
244
  end
244
245
 
245
246
  def shipped=(value)
246
- return unless value == '1' && shipped_at.nil?
247
+ return unless value == "1" && shipped_at.nil?
247
248
  self.shipped_at = Time.current
248
249
  end
249
250
 
@@ -278,14 +279,21 @@ module Spree
278
279
  end
279
280
 
280
281
  def update_amounts
281
- if selected_shipping_rate
282
- self.cost = selected_shipping_rate.cost
283
- if changed?
284
- update_columns(
285
- cost:,
286
- updated_at: Time.current
287
- )
288
- end
282
+ assign_amounts
283
+ persist_amounts
284
+ end
285
+
286
+ def assign_amounts
287
+ return unless selected_shipping_rate
288
+ self.cost = selected_shipping_rate.cost
289
+ end
290
+
291
+ def persist_amounts
292
+ if cost_changed?
293
+ update_columns(
294
+ cost:,
295
+ updated_at: Time.current
296
+ )
289
297
  end
290
298
  end
291
299
 
@@ -312,7 +320,7 @@ module Spree
312
320
  new_state = recalculate_state
313
321
  if new_state != old_state
314
322
  update_columns state: new_state, updated_at: Time.current
315
- after_ship if new_state == 'shipped'
323
+ after_ship if new_state == "shipped"
316
324
  end
317
325
  end
318
326
 
@@ -332,12 +340,12 @@ module Spree
332
340
  end
333
341
 
334
342
  def can_get_rates?
335
- order.ship_address && order.ship_address.valid?
343
+ order.ship_address&.valid?
336
344
  end
337
345
 
338
346
  def manifest_restock(item)
339
347
  if item.states["on_hand"].to_i > 0
340
- stock_location.restock item.variant, item.states["on_hand"], self
348
+ stock_location.restock item.variant, item.states["on_hand"], self
341
349
  end
342
350
 
343
351
  if item.states["backordered"].to_i > 0