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
@@ -4,7 +4,7 @@ module Spree
4
4
  # The default `source` of a `Spree::Payment`.
5
5
  #
6
6
  class CreditCard < Spree::PaymentSource
7
- belongs_to :user, class_name: Spree::UserClassHandle.new, foreign_key: 'user_id', optional: true
7
+ belongs_to :user, class_name: Spree::UserClassHandle.new, foreign_key: "user_id", optional: true
8
8
  belongs_to :address, optional: true
9
9
 
10
10
  before_save :set_last_digits
@@ -14,28 +14,28 @@ module Spree
14
14
  attr_reader :number, :verification_value
15
15
  attr_accessor :encrypted_data
16
16
 
17
- validates :month, :year, numericality: { only_integer: true }, if: :require_card_numbers?, on: :create
17
+ validates :month, :year, numericality: {only_integer: true}, if: :require_card_numbers?, on: :create
18
18
  validates :number, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
19
19
  validates :name, presence: true, if: :require_card_numbers?, on: :create
20
20
  validates :verification_value, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
21
21
 
22
- scope :with_payment_profile, -> { where('gateway_customer_profile_id IS NOT NULL') }
22
+ scope :with_payment_profile, -> { where("gateway_customer_profile_id IS NOT NULL") }
23
23
 
24
24
  # Taken from ActiveMerchant
25
25
  # https://github.com/activemerchant/active_merchant/blob/2f2acd4696e8de76057b5ed670b9aa022abc1187/lib/active_merchant/billing/credit_card_methods.rb#L5
26
26
  CARD_TYPES = {
27
- 'visa' => /^4\d{12}(\d{3})?(\d{3})?$/,
28
- 'master' => /^(5[1-5]\d{4}|677189|222[1-9]\d{2}|22[3-9]\d{3}|2[3-6]\d{4}|27[01]\d{3}|2720\d{2})\d{10}$/,
29
- 'discover' => /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
30
- 'american_express' => /^3[47]\d{13}$/,
31
- 'diners_club' => /^3(0[0-5]|[68]\d)\d{11}$/,
32
- 'jcb' => /^35(28|29|[3-8]\d)\d{12}$/,
33
- 'switch' => /^6759\d{12}(\d{2,3})?$/,
34
- 'solo' => /^6767\d{12}(\d{2,3})?$/,
35
- 'dankort' => /^5019\d{12}$/,
36
- 'maestro' => /^(5[06-8]|6\d)\d{10,17}$/,
37
- 'forbrugsforeningen' => /^600722\d{10}$/,
38
- 'laser' => /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
27
+ "visa" => /^4\d{12}(\d{3})?(\d{3})?$/,
28
+ "master" => /^(5[1-5]\d{4}|677189|222[1-9]\d{2}|22[3-9]\d{3}|2[3-6]\d{4}|27[01]\d{3}|2720\d{2})\d{10}$/,
29
+ "discover" => /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
30
+ "american_express" => /^3[47]\d{13}$/,
31
+ "diners_club" => /^3(0[0-5]|[68]\d)\d{11}$/,
32
+ "jcb" => /^35(28|29|[3-8]\d)\d{12}$/,
33
+ "switch" => /^6759\d{12}(\d{2,3})?$/,
34
+ "solo" => /^6767\d{12}(\d{2,3})?$/,
35
+ "dankort" => /^5019\d{12}$/,
36
+ "maestro" => /^(5[06-8]|6\d)\d{10,17}$/,
37
+ "forbrugsforeningen" => /^600722\d{10}$/,
38
+ "laser" => /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
39
39
  }.freeze
40
40
 
41
41
  def address_attributes=(attributes)
@@ -50,9 +50,9 @@ module Spree
50
50
  return unless expiry.present?
51
51
 
52
52
  self[:month], self[:year] =
53
- if expiry =~ /\d{2}\s?\/\s?\d{2,4}/ # will match mm/yy and mm / yyyy
54
- expiry.delete(' ').split('/')
55
- elsif match = expiry.match(/(\d{2})(\d{2,4})/) # will match mmyy and mmyyyy
53
+ if /\d{2}\s?\/\s?\d{2,4}/.match?(expiry) # will match mm/yy and mm / yyyy
54
+ expiry.delete(" ").split("/")
55
+ elsif (match = expiry.match(/(\d{2})(\d{2,4})/)) # will match mmyy and mmyyyy
56
56
  [match[1], match[2]]
57
57
  end
58
58
  if self[:year]
@@ -68,12 +68,12 @@ module Spree
68
68
  def number=(num)
69
69
  @number =
70
70
  if num.is_a?(String)
71
- num.gsub(/[^0-9]/, '')
71
+ num.gsub(/[^0-9]/, "")
72
72
  end
73
73
  end
74
74
 
75
75
  def verification_value=(value)
76
- @verification_value = value.to_s.gsub(/\s/, '')
76
+ @verification_value = value.to_s.gsub(/\s/, "")
77
77
  end
78
78
 
79
79
  # Sets the credit card type, converting it to the preferred internal
@@ -84,10 +84,10 @@ module Spree
84
84
  # cc_type is set by jquery.payment, which helpfully provides different
85
85
  # types from Active Merchant. Converting them is necessary.
86
86
  self[:cc_type] = case type
87
- when 'mastercard', 'maestro' then 'master'
88
- when 'amex' then 'american_express'
89
- when 'dinersclub' then 'diners_club'
90
- when '' then try_type_from_number
87
+ when "mastercard", "maestro" then "master"
88
+ when "amex" then "american_express"
89
+ when "dinersclub" then "diners_club"
90
+ when "" then try_type_from_number
91
91
  else type
92
92
  end
93
93
  end
@@ -100,16 +100,16 @@ module Spree
100
100
 
101
101
  # Sets the last digits field based on the assigned credit card number.
102
102
  def set_last_digits
103
- self.last_digits ||= number.to_s.length <= 4 ? number : number.to_s.slice(-4..)
103
+ self.last_digits ||= (number.to_s.length <= 4) ? number : number.to_s.slice(-4..)
104
104
  end
105
105
 
106
106
  # @return [String] the credit card type if it can be determined from the
107
107
  # number, otherwise the empty string
108
108
  def try_type_from_number
109
109
  CARD_TYPES.each do |type, pattern|
110
- return type if number =~ pattern
110
+ return type if number&.match?(pattern)
111
111
  end
112
- ''
112
+ ""
113
113
  end
114
114
 
115
115
  # @return [Boolean] true when a verification value is present
@@ -18,9 +18,10 @@ module Spree
18
18
 
19
19
  accepts_nested_attributes_for :return_items
20
20
 
21
- self.allowed_ransackable_attributes = ['number']
21
+ self.allowed_ransackable_attributes = ["number"]
22
22
 
23
23
  extend DisplayMoney
24
+
24
25
  money_methods :total, :total_excluding_vat, :amount
25
26
 
26
27
  delegate :currency, to: :order
@@ -61,14 +62,14 @@ module Spree
61
62
 
62
63
  def generate_number
63
64
  self.number ||= loop do
64
- random = "CR#{Array.new(9){ rand(9) }.join}"
65
+ random = "CR#{Array.new(9) { rand(9) }.join}"
65
66
  break random unless self.class.exists?(number: random)
66
67
  end
67
68
  end
68
69
 
69
70
  def return_items_belong_to_same_order
70
- if return_items.reject{ |return_item| return_item.inventory_unit&.order_id == order_id }.any?
71
- errors.add(:base, I18n.t('spree.return_items_cannot_be_associated_with_multiple_orders'))
71
+ if return_items.reject { |return_item| return_item.inventory_unit&.order_id == order_id }.any?
72
+ errors.add(:base, I18n.t("spree.return_items_cannot_be_associated_with_multiple_orders"))
72
73
  end
73
74
  end
74
75
 
@@ -21,7 +21,7 @@ module Spree
21
21
  # @return [Hash<Integer, BigDecimal>] a hash of line item IDs and their
22
22
  # corresponding weighted adjustments
23
23
  def distributed_amounts
24
- Hash[line_item_ids.zip(allocated_amounts)]
24
+ line_item_ids.zip(allocated_amounts).to_h
25
25
  end
26
26
 
27
27
  def line_item_ids
@@ -32,7 +32,7 @@ module Spree
32
32
  @track_inventory = track_inventory
33
33
  end
34
34
 
35
- validates :quantity, numericality: { greater_than: 0 }
35
+ validates :quantity, numericality: {greater_than: 0}
36
36
  validate :current_shipment_not_already_shipped
37
37
  validate :desired_shipment_different_from_current
38
38
  validates :desired_stock_location, presence: true
@@ -113,19 +113,19 @@ module Spree
113
113
  # We order by state, because `'backordered' < 'on_hand'`.
114
114
  # We start to move the new actual backordered quantity, so the remaining
115
115
  # quantity can be set to on_hand state.
116
- current_shipment.
117
- inventory_units.
118
- where(variant:).
119
- order(state: :asc).
120
- limit(backordered_quantity_to_move).
121
- update_all(shipment_id: desired_shipment.id, state: :backordered)
122
-
123
- current_shipment.
124
- inventory_units.
125
- where(variant:).
126
- order(state: :asc).
127
- limit(on_hand_quantity_to_move).
128
- update_all(shipment_id: desired_shipment.id, state: :on_hand)
116
+ current_shipment
117
+ .inventory_units
118
+ .where(variant:)
119
+ .order(state: :asc)
120
+ .limit(backordered_quantity_to_move)
121
+ .update_all(shipment_id: desired_shipment.id, state: :backordered)
122
+
123
+ current_shipment
124
+ .inventory_units
125
+ .where(variant:)
126
+ .order(state: :asc)
127
+ .limit(on_hand_quantity_to_move)
128
+ .update_all(shipment_id: desired_shipment.id, state: :on_hand)
129
129
  end
130
130
  end
131
131
 
@@ -133,12 +133,12 @@ module Spree
133
133
  # to the other.
134
134
  def run_without_tracking_inventory
135
135
  ActiveRecord::Base.transaction do
136
- current_shipment.
137
- inventory_units.
138
- where(variant:).
139
- order(state: :asc).
140
- limit(quantity).
141
- update_all(shipment_id: desired_shipment.id)
136
+ current_shipment
137
+ .inventory_units
138
+ .where(variant:)
139
+ .order(state: :asc)
140
+ .limit(quantity)
141
+ .update_all(shipment_id: desired_shipment.id)
142
142
  end
143
143
  end
144
144
 
@@ -181,11 +181,11 @@ module Spree
181
181
  end
182
182
 
183
183
  def desired_location_quantifier
184
- @desired_location_quantifier ||= Spree::Stock::Quantifier.new(variant, desired_stock_location)
184
+ @desired_location_quantifier ||= Spree::Config.stock.quantifier_class.new(variant, desired_stock_location)
185
185
  end
186
186
 
187
187
  def current_location_quantifier
188
- @current_location_quantifier ||= Spree::Stock::Quantifier.new(variant, current_stock_location)
188
+ @current_location_quantifier ||= Spree::Config.stock.quantifier_class.new(variant, current_stock_location)
189
189
  end
190
190
 
191
191
  def desired_shipment_different_from_current
@@ -12,8 +12,8 @@ module Spree::Image::ActiveStorageAttachment
12
12
  validate :supported_content_type
13
13
 
14
14
  has_attachment :attachment,
15
- styles: Spree::Config.product_image_styles,
16
- default_style: Spree::Config.product_image_style_default
15
+ styles: Spree::Config.product_image_styles,
16
+ default_style: Spree::Config.product_image_style_default
17
17
 
18
18
  def supported_content_type
19
19
  unless attachment.content_type.in?(Spree::Config.allowed_image_mime_types)
@@ -7,15 +7,15 @@ module Spree::Image::PaperclipAttachment
7
7
  validate :no_attachment_errors
8
8
 
9
9
  has_attached_file :attachment,
10
- styles: Spree::Config.product_image_styles,
11
- default_style: Spree::Config.product_image_style_default,
12
- default_url: 'noimage/:style.png',
13
- url: '/spree/products/:id/:style/:basename.:extension',
14
- path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
15
- convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
10
+ styles: Spree::Config.product_image_styles,
11
+ default_style: Spree::Config.product_image_style_default,
12
+ default_url: "noimage/:style.png",
13
+ url: "/spree/products/:id/:style/:basename.:extension",
14
+ path: ":rails_root/public/spree/products/:id/:style/:basename.:extension",
15
+ convert_options: {all: "-strip -auto-orient -colorspace sRGB"}
16
16
  validates_attachment :attachment,
17
17
  presence: true,
18
- content_type: { content_type: Spree::Config.allowed_image_mime_types }
18
+ content_type: {content_type: Spree::Config.allowed_image_mime_types}
19
19
 
20
20
  # save the w,h of the original image (from which others can be calculated)
21
21
  # we need to look at the write-queue for images which have not been saved yet
@@ -39,7 +39,7 @@ module Spree::Image::PaperclipAttachment
39
39
  filename = temporary.path unless temporary.nil?
40
40
  filename = attachment.path if filename.blank?
41
41
  geometry = Paperclip::Geometry.from_file(filename)
42
- self.attachment_width = geometry.width
42
+ self.attachment_width = geometry.width
43
43
  self.attachment_height = geometry.height
44
44
  end
45
45
 
@@ -0,0 +1,262 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "spree/manipulative_query_monitor"
4
+
5
+ module Spree
6
+ class InMemoryOrderUpdater
7
+ attr_reader :order
8
+
9
+ # logs a warning when a manipulative query is made when the persist flag is set to false
10
+ class_attribute :log_manipulative_queries
11
+ self.log_manipulative_queries = true
12
+
13
+ delegate :payments, :line_items, :adjustments, :all_adjustments, :shipments, :quantity, to: :order
14
+
15
+ def initialize(order)
16
+ @order = order
17
+ end
18
+
19
+ # This is a multi-purpose method for processing logic related to changes in the Order.
20
+ # It is meant to be called from various observers so that the Order is aware of changes
21
+ # that affect totals and other values stored in the Order.
22
+ #
23
+ # This method should never do anything to the Order that results in a save call on the
24
+ # object with callbacks (otherwise you will end up in an infinite recursion as the
25
+ # associations try to save and then in turn try to call +update!+ again.)
26
+ def recalculate(persist: true)
27
+ monitor =
28
+ if log_manipulative_queries
29
+ Spree::ManipulativeQueryMonitor
30
+ else
31
+ proc { |&block| block.call }
32
+ end
33
+
34
+ order.transaction do
35
+ monitor.call do
36
+ recalculate_line_item_prices
37
+ recalculate_item_count
38
+ assign_shipment_amounts
39
+ end
40
+
41
+ if persist
42
+ update_totals(persist:)
43
+ else
44
+ monitor.call do
45
+ update_totals(persist:)
46
+ end
47
+ end
48
+
49
+ monitor.call do
50
+ if order.completed?
51
+ recalculate_payment_state
52
+ recalculate_shipment_state
53
+ end
54
+ end
55
+
56
+ Spree::Bus.publish(:order_recalculated, order:)
57
+
58
+ persist_totals if persist
59
+ end
60
+ end
61
+ alias_method :update, :recalculate
62
+ deprecate update: :recalculate, deprecator: Spree.deprecator
63
+
64
+ # Recalculates the state on all of them shipments, then recalculates the
65
+ # +shipment_state+ attribute according to the following logic:
66
+ #
67
+ # shipped when all Shipments are in the "shipped" state
68
+ # partial when at least one Shipment has a state of "shipped" and there is another Shipment with a state other than "shipped"
69
+ # or there are InventoryUnits associated with the order that have a state of "sold" but are not associated with a Shipment.
70
+ # ready when all Shipments are in the "ready" state
71
+ # backorder when there is backordered inventory associated with an order
72
+ # pending when all Shipments are in the "pending" state
73
+ #
74
+ # The +shipment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
75
+ def recalculate_shipment_state
76
+ shipments.each(&:recalculate_state)
77
+
78
+ order.shipment_state = determine_shipment_state
79
+ order.shipment_state
80
+ end
81
+ alias_method :update_shipment_state, :recalculate_shipment_state
82
+ deprecate update_shipment_state: :recalculate_shipment_state, deprecator: Spree.deprecator
83
+
84
+ # Recalculates the +payment_state+ attribute according to the following logic:
85
+ #
86
+ # paid when +payment_total+ is equal to +total+
87
+ # balance_due when +payment_total+ is less than +total+
88
+ # credit_owed when +payment_total+ is greater than +total+
89
+ # failed when most recent payment is in the failed state
90
+ # void when the order has been canceled and the payment total is 0
91
+ #
92
+ # The +payment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
93
+ def recalculate_payment_state
94
+ order.payment_state = determine_payment_state
95
+ order.payment_state
96
+ end
97
+ alias_method :update_payment_state, :recalculate_payment_state
98
+ deprecate update_payment_state: :recalculate_payment_state, deprecator: Spree.deprecator
99
+
100
+ private
101
+
102
+ def determine_payment_state
103
+ if payments.present? && payments.valid.empty? && order.outstanding_balance != 0
104
+ "failed"
105
+ elsif order.state == "canceled" && order.payment_total.zero?
106
+ "void"
107
+ elsif order.outstanding_balance > 0
108
+ "balance_due"
109
+ elsif order.outstanding_balance < 0
110
+ "credit_owed"
111
+ else
112
+ # outstanding_balance == 0
113
+ "paid"
114
+ end
115
+ end
116
+
117
+ def determine_shipment_state
118
+ if order.backordered?
119
+ "backorder"
120
+ else
121
+ # get all the shipment states for this order
122
+ shipment_states = shipments.states
123
+ if shipment_states.size > 1
124
+ # multiple shiment states means it's most likely partially shipped
125
+ "partial"
126
+ else
127
+ # will return nil if no shipments are found
128
+ shipment_states.first
129
+ end
130
+ end
131
+ end
132
+
133
+ # This will update and select the best promotion adjustment, update tax
134
+ # adjustments, update cancellation adjustments, and then update the total
135
+ # fields (promo_total, included_tax_total, additional_tax_total, and
136
+ # adjustment_total) on the item.
137
+ # @return [void]
138
+ def update_adjustments(persist:)
139
+ # Promotion adjustments must be applied first, then tax adjustments.
140
+ # This fits the criteria for VAT tax as outlined here:
141
+ # http://www.hmrc.gov.uk/vat/managing/charging/discounts-etc.htm#1
142
+ # It also fits the criteria for sales tax as outlined here:
143
+ # http://www.boe.ca.gov/formspubs/pub113/
144
+ update_promotions(persist:)
145
+ update_tax_adjustments
146
+ assign_item_totals
147
+ end
148
+
149
+ # Updates the following Order total values:
150
+ #
151
+ # +payment_total+ The total value of all finalized Payments (NOTE: non-finalized Payments are excluded)
152
+ # +item_total+ The total value of all LineItems
153
+ # +adjustment_total+ The total value of all adjustments (promotions, credits, etc.)
154
+ # +promo_total+ The total value of all promotion adjustments
155
+ # +total+ The so-called "order total." This is equivalent to +item_total+ plus +adjustment_total+.
156
+ def update_totals(persist:)
157
+ recalculate_payment_total
158
+ recalculate_item_total
159
+ recalculate_shipment_total
160
+ update_adjustment_total(persist:)
161
+ end
162
+
163
+ def assign_shipment_amounts
164
+ shipments.each(&:assign_amounts)
165
+ end
166
+
167
+ def update_adjustment_total(persist:)
168
+ update_adjustments(persist:)
169
+
170
+ all_items = line_items + shipments
171
+ # Ignore any adjustments that have been marked for destruction in our
172
+ # calculations. They'll get removed when/if we persist the order.
173
+ valid_adjustments = adjustments.reject(&:marked_for_destruction?)
174
+ order_tax_adjustments = valid_adjustments.select(&:tax?)
175
+
176
+ order.adjustment_total = all_items.sum(&:adjustment_total) + valid_adjustments.sum(&:amount)
177
+ order.included_tax_total = all_items.sum(&:included_tax_total) + order_tax_adjustments.select(&:included?).sum(&:amount)
178
+ order.additional_tax_total = all_items.sum(&:additional_tax_total) + order_tax_adjustments.reject(&:included?).sum(&:amount)
179
+
180
+ recalculate_order_total
181
+ end
182
+
183
+ def update_promotions(persist:)
184
+ Spree::Config.promotions.order_adjuster_class.new(order).call(persist:)
185
+ end
186
+
187
+ def update_tax_adjustments
188
+ Spree::Config.tax_adjuster_class.new(order).adjust!
189
+ end
190
+
191
+ def update_cancellations
192
+ end
193
+ deprecate :update_cancellations, deprecator: Spree.deprecator
194
+
195
+ def assign_item_totals
196
+ [*line_items, *shipments].each do |item|
197
+ Spree::Config.item_total_class.new(item).recalculate!
198
+
199
+ next unless item.changed?
200
+
201
+ item.assign_attributes(
202
+ promo_total: item.promo_total,
203
+ included_tax_total: item.included_tax_total,
204
+ additional_tax_total: item.additional_tax_total,
205
+ adjustment_total: item.adjustment_total
206
+ )
207
+ end
208
+ end
209
+
210
+ def recalculate_payment_total
211
+ order.payment_total = payments.completed.includes(:refunds).sum { |payment| payment.amount - payment.refunds.sum(:amount) }
212
+ end
213
+
214
+ def recalculate_shipment_total
215
+ order.shipment_total = shipments.to_a.sum(&:cost)
216
+ recalculate_order_total
217
+ end
218
+
219
+ def recalculate_order_total
220
+ order.total = order.item_total + order.shipment_total + order.adjustment_total
221
+ end
222
+
223
+ def recalculate_item_count
224
+ order.item_count = line_items.to_a.sum(&:quantity)
225
+ end
226
+
227
+ def recalculate_item_total
228
+ order.item_total = line_items.to_a.sum(&:amount)
229
+ recalculate_order_total
230
+ end
231
+
232
+ def recalculate_line_item_prices
233
+ if Spree::Config.recalculate_cart_prices
234
+ line_items.each(&:recalculate_price)
235
+ end
236
+ end
237
+
238
+ def persist_totals
239
+ shipments.each(&:persist_amounts)
240
+ assign_item_totals
241
+ log_state_change("payment")
242
+ log_state_change("shipment")
243
+ order.save!
244
+ end
245
+
246
+ def log_state_change(name)
247
+ state = "#{name}_state"
248
+ previous_state, current_state = order.changes[state]
249
+
250
+ if previous_state != current_state
251
+ # Enqueue the job to track this state change
252
+ StateChangeTrackingJob.perform_later(
253
+ order,
254
+ previous_state,
255
+ current_state,
256
+ Time.current,
257
+ name
258
+ )
259
+ end
260
+ end
261
+ end
262
+ end
@@ -4,9 +4,9 @@ module Spree
4
4
  # Tracks the state of line items' fulfillment.
5
5
  #
6
6
  class InventoryUnit < Spree::Base
7
- PRE_SHIPMENT_STATES = %w(backordered on_hand)
8
- POST_SHIPMENT_STATES = %w(returned)
9
- CANCELABLE_STATES = ['on_hand', 'backordered', 'shipped']
7
+ PRE_SHIPMENT_STATES = %w[backordered on_hand]
8
+ POST_SHIPMENT_STATES = %w[returned]
9
+ CANCELABLE_STATES = ["on_hand", "backordered", "shipped"]
10
10
 
11
11
  belongs_to :variant, -> { with_discarded }, class_name: "Spree::Variant", inverse_of: :inventory_units, optional: true
12
12
  belongs_to :shipment, class_name: "Spree::Shipment", touch: true, inverse_of: :inventory_units, optional: true
@@ -29,20 +29,20 @@ module Spree
29
29
  before_destroy :ensure_can_destroy
30
30
 
31
31
  scope :pending, -> { where pending: true }
32
- scope :backordered, -> { where state: 'backordered' }
33
- scope :on_hand, -> { where state: 'on_hand' }
32
+ scope :backordered, -> { where state: "backordered" }
33
+ scope :on_hand, -> { where state: "on_hand" }
34
34
  scope :pre_shipment, -> { where(state: PRE_SHIPMENT_STATES) }
35
- scope :shipped, -> { where state: 'shipped' }
35
+ scope :shipped, -> { where state: "shipped" }
36
36
  scope :post_shipment, -> { where(state: POST_SHIPMENT_STATES) }
37
- scope :returned, -> { where state: 'returned' }
38
- scope :canceled, -> { where(state: 'canceled') }
39
- scope :not_canceled, -> { where.not(state: 'canceled') }
37
+ scope :returned, -> { where state: "returned" }
38
+ scope :canceled, -> { where(state: "canceled") }
39
+ scope :not_canceled, -> { where.not(state: "canceled") }
40
40
  scope :cancelable, -> { where(state: Spree::InventoryUnit::CANCELABLE_STATES, pending: false) }
41
41
  scope :backordered_per_variant, ->(stock_item) do
42
42
  includes(:shipment, :order)
43
43
  .where("spree_shipments.state != 'canceled'").references(:shipment)
44
44
  .where(variant_id: stock_item.variant_id)
45
- .where('spree_orders.completed_at is not null')
45
+ .where("spree_orders.completed_at is not null")
46
46
  .backordered.order(Spree::Order.arel_table[:completed_at].asc)
47
47
  end
48
48
 
@@ -53,7 +53,7 @@ module Spree
53
53
  # inventory units for the given stock item
54
54
  scope :backordered_for_stock_item, ->(stock_item) do
55
55
  backordered_per_variant(stock_item)
56
- .where(spree_shipments: { stock_location_id: stock_item.stock_location_id })
56
+ .where(spree_shipments: {stock_location_id: stock_item.stock_location_id})
57
57
  end
58
58
 
59
59
  scope :shippable, -> { on_hand }
@@ -14,7 +14,7 @@ class Spree::ItemTotal
14
14
  # These ones should not affect the eventual total price.
15
15
  #
16
16
  # Additional tax adjustments are the opposite, affecting the final total.
17
- item.included_tax_total = tax_adjustments.select(&:included?).sum(&:amount)
17
+ item.included_tax_total = tax_adjustments.select(&:included?).sum(&:amount)
18
18
  item.additional_tax_total = tax_adjustments.reject(&:included?).sum(&:amount)
19
19
 
20
20
  item.adjustment_total = item.adjustments.reject { |adjustment|
@@ -9,10 +9,10 @@ module Spree
9
9
  include UserMethods
10
10
  include Metadata
11
11
 
12
- self.table_name = 'spree_users'
12
+ self.table_name = "spree_users"
13
13
 
14
14
  def self.model_name
15
- ActiveModel::Name.new Spree::LegacyUser, Spree, 'user'
15
+ ActiveModel::Name.new Spree::LegacyUser, Spree, "user"
16
16
  end
17
17
 
18
18
  attr_accessor :password