solidus_core 4.6.2 → 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 (328) 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 -10
  11. data/app/helpers/spree/products_helper.rb +5 -5
  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 +9 -9
  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 -1
  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 +1 -1
  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 +37 -41
  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 +31 -30
  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 +16 -17
  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.rb +25 -25
  157. data/app/models/spree/variant_property_rule.rb +2 -2
  158. data/app/models/spree/variant_property_rule_condition.rb +1 -1
  159. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
  160. data/app/models/spree/wallet/default_payment_builder.rb +1 -1
  161. data/app/models/spree/wallet_payment_source.rb +2 -2
  162. data/app/models/spree/zone.rb +18 -18
  163. data/app/models/spree/zone_member.rb +1 -1
  164. data/app/subscribers/spree/carton_shipped_mailer_subscriber.rb +2 -2
  165. data/app/subscribers/spree/order_cancel_mailer_subscriber.rb +2 -2
  166. data/app/subscribers/spree/order_confirmation_mailer_subscriber.rb +2 -2
  167. data/app/subscribers/spree/order_inventory_cancellation_mailer_subscriber.rb +2 -2
  168. data/app/subscribers/spree/reimbursement_mailer_subscriber.rb +2 -2
  169. data/config/initializers/assets.rb +1 -1
  170. data/config/initializers/db_query_matchers.rb +9 -0
  171. data/config/initializers/friendly_id.rb +2 -2
  172. data/config/initializers/inflections.rb +1 -1
  173. data/config/initializers/money.rb +1 -1
  174. data/config/locales/en.yml +1 -0
  175. data/db/default/spree/countries.rb +7 -7
  176. data/db/default/spree/return_reasons.rb +11 -11
  177. data/db/default/spree/stock_locations.rb +1 -1
  178. data/db/default/spree/store_credit.rb +3 -4
  179. data/db/default/spree/stores.rb +1 -1
  180. data/db/default/spree/zones.rb +5 -5
  181. data/db/migrate/20160101010000_solidus_one_four.rb +16 -16
  182. data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +3 -3
  183. data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +7 -6
  184. data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +10 -10
  185. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +6 -6
  186. data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +1 -1
  187. data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +4 -4
  188. data/db/migrate/20180322142651_add_amount_remaining_to_store_credit_events.rb +9 -16
  189. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +1 -0
  190. data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +3 -3
  191. data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +1 -1
  192. data/db/migrate/20250214094207_add_reverse_charge_status_to_store.rb +1 -1
  193. data/db/migrate/20250225051308_add_vat_id_email_and_reverse_charge_status_to_addresses.rb +1 -1
  194. data/db/seeds.rb +3 -3
  195. data/lib/generators/solidus/install/app_templates/authentication/custom.rb +2 -2
  196. data/lib/generators/solidus/install/app_templates/authentication/devise.rb +3 -3
  197. data/lib/generators/solidus/install/app_templates/authentication/existing.rb +1 -1
  198. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
  199. data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +1 -1
  200. data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +1 -1
  201. data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +2 -2
  202. data/lib/generators/solidus/install/install_generator.rb +51 -51
  203. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +3 -0
  204. data/lib/generators/solidus/update/update_generator.rb +29 -29
  205. data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -6
  206. data/lib/generators/spree/dummy/dummy_generator.rb +22 -24
  207. data/lib/generators/spree/dummy/templates/rails/boot.rb +3 -3
  208. data/lib/generators/spree/dummy/templates/rails/test.rb +4 -4
  209. data/lib/solidus_core.rb +1 -1
  210. data/lib/spree/app_configuration.rb +59 -47
  211. data/lib/spree/bus.rb +1 -1
  212. data/lib/spree/config.rb +1 -1
  213. data/lib/spree/core/active_merchant_dependencies.rb +8 -8
  214. data/lib/spree/core/class_constantizer.rb +1 -1
  215. data/lib/spree/core/engine.rb +15 -15
  216. data/lib/spree/core/environment.rb +1 -1
  217. data/lib/spree/core/environment_extension.rb +2 -2
  218. data/lib/spree/core/importer/order.rb +15 -15
  219. data/lib/spree/core/importer/product.rb +4 -4
  220. data/lib/spree/core/importer.rb +2 -2
  221. data/lib/spree/core/null_promotion_configuration.rb +7 -7
  222. data/lib/spree/core/permalinks.rb +1 -1
  223. data/lib/spree/core/product_filters.rb +94 -93
  224. data/lib/spree/core/role_configuration.rb +3 -3
  225. data/lib/spree/core/search/base.rb +5 -6
  226. data/lib/spree/core/search/variant.rb +3 -3
  227. data/lib/spree/core/stock_configuration.rb +10 -49
  228. data/lib/spree/core/validators/email.rb +1 -1
  229. data/lib/spree/core/version.rb +3 -3
  230. data/lib/spree/core/versioned_value.rb +4 -6
  231. data/lib/spree/core.rb +49 -49
  232. data/lib/spree/deprecated_instance_variable_proxy.rb +1 -1
  233. data/lib/spree/deprecation.rb +1 -1
  234. data/lib/spree/deprecator.rb +2 -2
  235. data/lib/spree/i18n.rb +2 -2
  236. data/lib/spree/localized_number.rb +3 -3
  237. data/lib/spree/manipulative_query_monitor.rb +19 -0
  238. data/lib/spree/migrations.rb +2 -2
  239. data/lib/spree/permitted_attributes.rb +10 -10
  240. data/lib/spree/preferences/configuration.rb +5 -5
  241. data/lib/spree/preferences/preferable.rb +8 -10
  242. data/lib/spree/preferences/preferable_class_methods.rb +16 -16
  243. data/lib/spree/preferences/preference_differentiator.rb +1 -1
  244. data/lib/spree/preferences/scoped_store.rb +2 -2
  245. data/lib/spree/preferences/static_model_preferences.rb +2 -2
  246. data/lib/spree/preferences/store.rb +6 -6
  247. data/lib/spree/testing_support/ability_helpers.rb +30 -30
  248. data/lib/spree/testing_support/authorization_helpers.rb +6 -5
  249. data/lib/spree/testing_support/blacklist_urls.rb +1 -1
  250. data/lib/spree/testing_support/bus_helpers.rb +1 -1
  251. data/lib/spree/testing_support/capybara_driver.rb +1 -1
  252. data/lib/spree/testing_support/capybara_ext.rb +12 -12
  253. data/lib/spree/testing_support/common_rake.rb +17 -16
  254. data/lib/spree/testing_support/dummy_ability.rb +1 -1
  255. data/lib/spree/testing_support/dummy_app/migrations.rb +1 -1
  256. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +5 -5
  257. data/lib/spree/testing_support/dummy_app/routes.rb +1 -1
  258. data/lib/spree/testing_support/dummy_app.rb +34 -34
  259. data/lib/spree/testing_support/extension_rake.rb +2 -2
  260. data/lib/spree/testing_support/factories/address_factory.rb +12 -12
  261. data/lib/spree/testing_support/factories/adjustment_factory.rb +7 -7
  262. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
  263. data/lib/spree/testing_support/factories/calculator_factory.rb +6 -6
  264. data/lib/spree/testing_support/factories/carton_factory.rb +1 -1
  265. data/lib/spree/testing_support/factories/country_factory.rb +3 -3
  266. data/lib/spree/testing_support/factories/credit_card_factory.rb +3 -3
  267. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
  268. data/lib/spree/testing_support/factories/image_factory.rb +2 -2
  269. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -4
  270. data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
  271. data/lib/spree/testing_support/factories/option_type_factory.rb +2 -2
  272. data/lib/spree/testing_support/factories/option_value_factory.rb +2 -2
  273. data/lib/spree/testing_support/factories/order_factory.rb +16 -16
  274. data/lib/spree/testing_support/factories/payment_factory.rb +9 -9
  275. data/lib/spree/testing_support/factories/payment_method_factory.rb +10 -10
  276. data/lib/spree/testing_support/factories/price_factory.rb +2 -2
  277. data/lib/spree/testing_support/factories/product_factory.rb +2 -2
  278. data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
  279. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  280. data/lib/spree/testing_support/factories/property_factory.rb +3 -3
  281. data/lib/spree/testing_support/factories/refund_factory.rb +2 -2
  282. data/lib/spree/testing_support/factories/refund_reason_factory.rb +1 -1
  283. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  284. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
  285. data/lib/spree/testing_support/factories/return_authorization_factory.rb +3 -3
  286. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  287. data/lib/spree/testing_support/factories/return_reason_factory.rb +1 -1
  288. data/lib/spree/testing_support/factories/role_factory.rb +2 -2
  289. data/lib/spree/testing_support/factories/shipment_factory.rb +3 -3
  290. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  291. data/lib/spree/testing_support/factories/shipping_method_factory.rb +7 -7
  292. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +1 -1
  293. data/lib/spree/testing_support/factories/state_factory.rb +4 -4
  294. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  295. data/lib/spree/testing_support/factories/stock_location_factory.rb +7 -7
  296. data/lib/spree/testing_support/factories/stock_movement_factory.rb +3 -3
  297. data/lib/spree/testing_support/factories/stock_package_factory.rb +3 -3
  298. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
  299. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -8
  300. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  301. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +1 -1
  302. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +6 -6
  303. data/lib/spree/testing_support/factories/store_factory.rb +2 -2
  304. data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -1
  305. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  306. data/lib/spree/testing_support/factories/taxon_factory.rb +3 -3
  307. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
  308. data/lib/spree/testing_support/factories/user_factory.rb +2 -2
  309. data/lib/spree/testing_support/factories/variant_factory.rb +2 -2
  310. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +1 -1
  311. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +1 -1
  312. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +1 -1
  313. data/lib/spree/testing_support/factories/zone_factory.rb +3 -3
  314. data/lib/spree/testing_support/factory_bot.rb +1 -1
  315. data/lib/spree/testing_support/flaky.rb +3 -2
  316. data/lib/spree/testing_support/flash.rb +2 -2
  317. data/lib/spree/testing_support/order_walkthrough.rb +7 -7
  318. data/lib/spree/testing_support/preferences.rb +1 -1
  319. data/lib/spree/testing_support/rake.rb +1 -1
  320. data/lib/spree/testing_support/shared_examples/calculator.rb +1 -1
  321. data/lib/spree/testing_support/shared_examples/gallery.rb +7 -7
  322. data/lib/spree/testing_support/shared_examples/order_factory.rb +9 -9
  323. data/lib/spree/testing_support/shared_examples/working_factory.rb +1 -1
  324. data/lib/spree/testing_support/translations.rb +1 -1
  325. data/lib/spree_core.rb +1 -1
  326. data/lib/tasks/payment_method.rake +2 -2
  327. data/solidus_core.gemspec +49 -49
  328. metadata +60 -54
@@ -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,13 +31,13 @@ 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
@@ -46,21 +46,21 @@ module Spree
46
46
 
47
47
  after_create :cancel_others, unless: :cancelled?
48
48
 
49
- scope :awaiting_return, -> { where(reception_status: 'awaiting') }
49
+ scope :awaiting_return, -> { where(reception_status: "awaiting") }
50
50
  scope :expecting_return, -> { where.not(reception_status: COMPLETED_RECEPTION_STATUSES) }
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') }
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") }
55
55
  INTERMEDIATE_RECEPTION_STATUSES.each do |reception_status|
56
56
  scope reception_status, -> { where(reception_status:) }
57
57
  end
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)) }
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]) }
64
64
  scope :reimbursed, -> { where.not(reimbursement_id: nil) }
65
65
  scope :not_reimbursed, -> { where(reimbursement_id: nil) }
66
66
  scope :exchange_requested, -> { where.not(exchange_variant: nil) }
@@ -80,6 +80,7 @@ module Spree
80
80
  include ::Spree::Config.state_machines.return_item_acceptance
81
81
 
82
82
  extend DisplayMoney
83
+
83
84
  money_methods :amount, :total, :total_excluding_vat
84
85
 
85
86
  # @return [Boolean] true when this retur item is in a complete reception
@@ -168,13 +169,17 @@ module Spree
168
169
  event_paths.delete(:expired)
169
170
  event_paths.delete(:unexchange)
170
171
 
171
- 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)
172
173
  end
173
174
 
174
175
  def part_of_exchange?
175
176
  # test whether this ReturnItem was either a) one for which an exchange was sent or
176
177
  # b) the exchanged item itself being returned in lieu of the original item
177
- exchange_requested? || sibling_intended_for_exchange('unexchanged')
178
+ exchange_requested? || sibling_intended_for_exchange("unexchanged")
179
+ end
180
+
181
+ def currency
182
+ return_authorization.try(:currency) || Spree::Config[:currency]
178
183
  end
179
184
 
180
185
  private
@@ -183,10 +188,6 @@ module Spree
183
188
  update(acceptance_status_errors: validator.errors)
184
189
  end
185
190
 
186
- def currency
187
- return_authorization.try(:currency) || Spree::Config[:currency]
188
- end
189
-
190
191
  def process_inventory_unit!
191
192
  inventory_unit.return!
192
193
 
@@ -203,7 +204,7 @@ module Spree
203
204
  end
204
205
 
205
206
  def check_unexchange
206
- original_ri = sibling_intended_for_exchange('awaiting')
207
+ original_ri = sibling_intended_for_exchange("awaiting")
207
208
  if original_ri
208
209
  original_ri.unexchange!
209
210
  set_default_amount
@@ -221,14 +222,14 @@ module Spree
221
222
  return unless customer_return && inventory_unit
222
223
 
223
224
  if customer_return.order_id != inventory_unit.order_id
224
- errors.add(:base, I18n.t('spree.return_items_cannot_be_associated_with_multiple_orders'))
225
+ errors.add(:base, I18n.t("spree.return_items_cannot_be_associated_with_multiple_orders"))
225
226
  end
226
227
  end
227
228
 
228
229
  def eligible_exchange_variant
229
230
  return unless exchange_variant && exchange_variant_id_changed?
230
231
  unless eligible_exchange_variants.include?(exchange_variant)
231
- errors.add(:base, I18n.t('spree.invalid_exchange_variant'))
232
+ errors.add(:base, I18n.t("spree.invalid_exchange_variant"))
232
233
  end
233
234
  end
234
235
 
@@ -243,7 +244,7 @@ module Spree
243
244
  end
244
245
 
245
246
  def set_exchange_amount
246
- self.amount = 0.0.to_d if exchange_requested?
247
+ self.amount = BigDecimal("0.0") if exchange_requested?
247
248
  end
248
249
 
249
250
  def validate_no_other_completed_return_items
@@ -261,9 +262,9 @@ module Spree
261
262
 
262
263
  def cancel_others
263
264
  Spree::ReturnItem.where(inventory_unit_id:)
264
- .where.not(id:)
265
- .valid
266
- .each(&:cancel!)
265
+ .where.not(id:)
266
+ .valid
267
+ .each(&:cancel!)
267
268
  end
268
269
 
269
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
@@ -16,7 +16,7 @@ module Spree
16
16
  has_many :shipping_method_zones, dependent: :destroy
17
17
  has_many :zones, through: :shipping_method_zones
18
18
 
19
- belongs_to :tax_category, -> { with_discarded }, class_name: 'Spree::TaxCategory', optional: true
19
+ belongs_to :tax_category, -> { with_discarded }, class_name: "Spree::TaxCategory", optional: true
20
20
  has_many :shipping_method_stock_locations, dependent: :destroy, class_name: "Spree::ShippingMethodStockLocation"
21
21
  has_many :stock_locations, through: :shipping_method_stock_locations
22
22
 
@@ -41,10 +41,10 @@ module Spree
41
41
  # cause this to return incorrect results.
42
42
  join_table = Spree::ShippingMethodCategory.arel_table
43
43
  having = join_table[:id].count(true).eq(shipping_category_ids.count)
44
- subquery = joins(:shipping_method_categories).
45
- where(spree_shipping_method_categories: { shipping_category_id: shipping_category_ids }).
46
- group('spree_shipping_methods.id').
47
- having(having)
44
+ subquery = joins(:shipping_method_categories)
45
+ .where(spree_shipping_method_categories: {shipping_category_id: shipping_category_ids})
46
+ .group("spree_shipping_methods.id")
47
+ .having(having)
48
48
 
49
49
  where(id: subquery.select(:id))
50
50
  end
@@ -62,9 +62,9 @@ module Spree
62
62
  # rails 5 this will be easy using .left_join and .or, but for now we must
63
63
  # use arel to achieve this.
64
64
  arel_join =
65
- arel_table.join(smsl_table, Arel::Nodes::OuterJoin).
66
- on(arel_table[:id].eq(smsl_table[:shipping_method_id])).
67
- join_sources
65
+ arel_table.join(smsl_table, Arel::Nodes::OuterJoin)
66
+ .on(arel_table[:id].eq(smsl_table[:shipping_method_id]))
67
+ .join_sources
68
68
  arel_condition =
69
69
  arel_table[:available_to_all].eq(true).or(smsl_table[:stock_location_id].eq(stock_location.id))
70
70
 
@@ -87,7 +87,7 @@ module Spree
87
87
 
88
88
  def build_tracking_url(tracking)
89
89
  return if tracking.blank? || tracking_url.blank?
90
- tracking_url.gsub(/:tracking/, ERB::Util.url_encode(tracking)) # :url_encode exists in 1.8.7 through 2.1.0
90
+ tracking_url.gsub(":tracking", ERB::Util.url_encode(tracking)) # :url_encode exists in 1.8.7 through 2.1.0
91
91
  end
92
92
 
93
93
  private
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Spree
4
4
  class ShippingMethodCategory < Spree::Base
5
- belongs_to :shipping_method, class_name: 'Spree::ShippingMethod'
6
- belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :shipping_method_categories
5
+ belongs_to :shipping_method, class_name: "Spree::ShippingMethod"
6
+ belongs_to :shipping_category, class_name: "Spree::ShippingCategory", inverse_of: :shipping_method_categories
7
7
  end
8
8
  end