solidus_core 2.10.0 → 2.11.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 (495) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/spree.js.erb +31 -2
  3. data/app/controllers/spree/base_controller.rb +1 -0
  4. data/app/mailers/spree/base_mailer.rb +4 -0
  5. data/app/mailers/spree/order_mailer.rb +1 -1
  6. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +69 -0
  7. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +39 -0
  8. data/app/models/concerns/spree/active_storage_adapter.rb +116 -0
  9. data/app/models/concerns/spree/default_price.rb +1 -1
  10. data/app/models/concerns/spree/soft_deletable.rb +18 -0
  11. data/app/models/concerns/spree/user_address_book.rb +86 -32
  12. data/app/models/concerns/spree/user_methods.rb +3 -2
  13. data/app/models/spree/ability.rb +34 -10
  14. data/app/models/spree/address/name.rb +49 -0
  15. data/app/models/spree/address/state_validator.rb +71 -0
  16. data/app/models/spree/address.rb +94 -17
  17. data/app/models/spree/adjustment.rb +1 -1
  18. data/app/models/spree/base.rb +1 -0
  19. data/app/models/spree/calculator/default_tax.rb +1 -1
  20. data/app/models/spree/calculator/percent_per_item.rb +4 -4
  21. data/app/models/spree/calculator/price_sack.rb +1 -1
  22. data/app/models/spree/credit_card.rb +2 -2
  23. data/app/models/spree/customer_return.rb +4 -2
  24. data/app/models/spree/exchange.rb +1 -1
  25. data/app/models/spree/image/active_storage_attachment.rb +21 -0
  26. data/app/models/spree/inventory_unit.rb +1 -1
  27. data/app/models/spree/line_item.rb +13 -4
  28. data/app/models/spree/option_type.rb +1 -1
  29. data/app/models/spree/option_value.rb +2 -2
  30. data/app/models/spree/order/checkout.rb +1 -0
  31. data/app/models/spree/order.rb +91 -20
  32. data/app/models/spree/order_inventory.rb +16 -4
  33. data/app/models/spree/order_merger.rb +6 -4
  34. data/app/models/spree/order_promotion.rb +1 -1
  35. data/app/models/spree/order_updater.rb +11 -10
  36. data/app/models/spree/payment/cancellation.rb +3 -3
  37. data/app/models/spree/payment/processing.rb +54 -30
  38. data/app/models/spree/payment.rb +3 -3
  39. data/app/models/spree/payment_method.rb +8 -9
  40. data/app/models/spree/preference.rb +1 -1
  41. data/app/models/spree/price.rb +2 -8
  42. data/app/models/spree/product/scopes.rb +10 -5
  43. data/app/models/spree/product.rb +19 -14
  44. data/app/models/spree/promotion/actions/free_shipping.rb +6 -5
  45. data/app/models/spree/promotion.rb +18 -7
  46. data/app/models/spree/promotion_action.rb +1 -7
  47. data/app/models/spree/promotion_code.rb +6 -1
  48. data/app/models/spree/promotion_code_batch.rb +1 -1
  49. data/app/models/spree/promotion_handler/coupon.rb +2 -2
  50. data/app/models/spree/promotion_rule.rb +1 -1
  51. data/app/models/spree/promotion_rule_role.rb +1 -1
  52. data/app/models/spree/refund.rb +54 -12
  53. data/app/models/spree/reimbursement.rb +27 -0
  54. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +10 -3
  55. data/app/models/spree/return_authorization.rb +1 -1
  56. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +1 -1
  57. data/app/models/spree/return_item.rb +21 -10
  58. data/app/models/spree/role.rb +1 -1
  59. data/app/models/spree/shipment.rb +2 -2
  60. data/app/models/spree/shipping_calculator.rb +1 -1
  61. data/app/models/spree/shipping_manifest.rb +2 -2
  62. data/app/models/spree/shipping_method.rb +2 -9
  63. data/app/models/spree/shipping_rate.rb +1 -1
  64. data/app/models/spree/shipping_rate_tax.rb +1 -1
  65. data/app/models/spree/stock/inventory_unit_builder.rb +18 -7
  66. data/app/models/spree/stock/inventory_units_finalizer.rb +3 -5
  67. data/app/models/spree/stock/package.rb +1 -1
  68. data/app/models/spree/stock/simple_coordinator.rb +1 -3
  69. data/app/models/spree/stock_item.rb +2 -8
  70. data/app/models/spree/stock_movement.rb +2 -0
  71. data/app/models/spree/store.rb +1 -1
  72. data/app/models/spree/store_credit.rb +1 -7
  73. data/app/models/spree/store_credit_category.rb +30 -3
  74. data/app/models/spree/store_credit_event.rb +1 -7
  75. data/app/models/spree/store_credit_reason.rb +0 -4
  76. data/app/models/spree/tax/tax_helpers.rb +1 -1
  77. data/app/models/spree/tax_category.rb +2 -8
  78. data/app/models/spree/tax_rate.rb +7 -7
  79. data/app/models/spree/taxon/active_storage_attachment.rb +19 -0
  80. data/app/models/spree/taxon.rb +1 -1
  81. data/app/models/spree/user_address.rb +8 -2
  82. data/app/models/spree/variant.rb +7 -13
  83. data/app/models/spree/variant_property_rule.rb +5 -1
  84. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +8 -3
  85. data/app/models/spree/zone.rb +1 -1
  86. data/config/locales/en.yml +44 -5
  87. data/db/default/spree/countries.rb +1 -1
  88. data/db/default/spree/states.rb +12 -4
  89. data/db/default/spree/store_credit.rb +2 -2
  90. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +12 -0
  91. data/db/migrate/20200320144521_add_default_billng_flag_to_user_addresses.rb +6 -0
  92. data/db/migrate/20200530111458_add_bcc_email_to_spree_stores.rb +7 -0
  93. data/db/migrate/20201008213609_add_discontinue_on_to_spree_products.rb +7 -0
  94. data/lib/generators/solidus/install/install_generator.rb +253 -0
  95. data/lib/generators/{spree → solidus}/install/templates/config/initializers/spree.rb.tt +36 -5
  96. data/lib/generators/spree/install/install_generator.rb +7 -189
  97. data/lib/solidus/migrations/promotions_with_code_handlers.rb +1 -1
  98. data/lib/spree/app_configuration.rb +117 -51
  99. data/lib/spree/awesome_nested_set_override.rb +44 -0
  100. data/lib/spree/core/controller_helpers/auth.rb +17 -4
  101. data/lib/spree/core/controller_helpers/current_host.rb +17 -0
  102. data/lib/spree/core/controller_helpers/order.rb +8 -7
  103. data/lib/spree/core/controller_helpers/strong_parameters.rb +21 -7
  104. data/lib/spree/core/engine.rb +39 -2
  105. data/lib/spree/core/importer/order.rb +26 -11
  106. data/lib/spree/core/permalinks.rb +1 -3
  107. data/lib/spree/core/product_filters.rb +6 -5
  108. data/lib/spree/core/state_machines/order.rb +249 -0
  109. data/lib/spree/core/state_machines/return_item/reception_status.rb +2 -2
  110. data/lib/spree/core/state_machines.rb +20 -1
  111. data/lib/spree/core/version.rb +1 -1
  112. data/lib/spree/core.rb +5 -11
  113. data/lib/spree/encryptor.rb +25 -0
  114. data/lib/spree/event/adapters/active_support_notifications.rb +32 -0
  115. data/lib/spree/event/configuration.rb +11 -6
  116. data/lib/spree/event/subscriber.rb +38 -18
  117. data/lib/spree/event/subscriber_registry.rb +92 -0
  118. data/lib/spree/event.rb +40 -7
  119. data/lib/spree/i18n.rb +1 -1
  120. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  121. data/lib/spree/paranoia_deprecations.rb +32 -12
  122. data/lib/spree/permission_sets/configuration_display.rb +14 -14
  123. data/lib/spree/permission_sets/default_customer.rb +16 -16
  124. data/lib/spree/permission_sets/order_display.rb +11 -11
  125. data/lib/spree/permission_sets/order_management.rb +1 -1
  126. data/lib/spree/permission_sets/product_display.rb +9 -9
  127. data/lib/spree/permission_sets/promotion_display.rb +5 -5
  128. data/lib/spree/permission_sets/restricted_stock_display.rb +2 -2
  129. data/lib/spree/permission_sets/restricted_stock_management.rb +1 -1
  130. data/lib/spree/permission_sets/stock_display.rb +2 -2
  131. data/lib/spree/permission_sets/stock_management.rb +1 -1
  132. data/lib/spree/permission_sets/user_display.rb +3 -3
  133. data/lib/spree/permission_sets/user_management.rb +4 -3
  134. data/lib/spree/permitted_attributes.rb +79 -9
  135. data/lib/spree/preferences/preferable.rb +4 -3
  136. data/lib/spree/preferences/preferable_class_methods.rb +22 -3
  137. data/lib/spree/testing_support/ability_helpers.rb +9 -9
  138. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  139. data/lib/spree/testing_support/blacklist_urls.rb +23 -0
  140. data/lib/spree/testing_support/capybara_ext.rb +3 -0
  141. data/lib/spree/testing_support/common_rake.rb +3 -3
  142. data/lib/spree/testing_support/dummy_app/migrations.rb +5 -6
  143. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +1 -3
  144. data/lib/spree/testing_support/dummy_app.rb +44 -23
  145. data/lib/spree/testing_support/factories/address_factory.rb +1 -2
  146. data/lib/spree/testing_support/factories/image_factory.rb +1 -1
  147. data/lib/spree/testing_support/factories/promotion_factory.rb +6 -0
  148. data/lib/spree/testing_support/factories/refund_factory.rb +1 -0
  149. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  150. data/lib/spree/testing_support/factories/return_item_factory.rb +0 -1
  151. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +8 -0
  152. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -0
  153. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +3 -1
  154. data/lib/spree/testing_support/factories/taxon_factory.rb +4 -0
  155. data/lib/spree/testing_support/factories/user_factory.rb +4 -1
  156. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  157. data/lib/spree/testing_support/job_helpers.rb +24 -0
  158. data/lib/spree/testing_support/precompiled_assets.rb +15 -0
  159. data/lib/spree/testing_support/preferences.rb +3 -1
  160. data/lib/spree/testing_support/shared_examples/gallery.rb +1 -1
  161. data/lib/spree/testing_support/translations.rb +25 -0
  162. data/solidus_core.gemspec +8 -5
  163. metadata +81 -359
  164. data/script/rails +0 -10
  165. data/spec/fixtures/thinking-cat.jpg +0 -0
  166. data/spec/helpers/base_helper_spec.rb +0 -168
  167. data/spec/helpers/products_helper_spec.rb +0 -202
  168. data/spec/helpers/taxons_helper_spec.rb +0 -43
  169. data/spec/jobs/promotion_code_batch_job_spec.rb +0 -96
  170. data/spec/lib/calculated_adjustments_spec.rb +0 -133
  171. data/spec/lib/i18n_spec.rb +0 -97
  172. data/spec/lib/search/base_spec.rb +0 -91
  173. data/spec/lib/search/variant_spec.rb +0 -115
  174. data/spec/lib/spree/app_configuration_spec.rb +0 -140
  175. data/spec/lib/spree/core/class_constantizer_spec.rb +0 -91
  176. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +0 -73
  177. data/spec/lib/spree/core/controller_helpers/order_spec.rb +0 -126
  178. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +0 -195
  179. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +0 -94
  180. data/spec/lib/spree/core/controller_helpers/search_spec.rb +0 -21
  181. data/spec/lib/spree/core/controller_helpers/store_spec.rb +0 -18
  182. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +0 -41
  183. data/spec/lib/spree/core/current_store_spec.rb +0 -33
  184. data/spec/lib/spree/core/environment_extension_spec.rb +0 -46
  185. data/spec/lib/spree/core/importer/order_spec.rb +0 -484
  186. data/spec/lib/spree/core/role_configuration_spec.rb +0 -155
  187. data/spec/lib/spree/core/stock_configuration_spec.rb +0 -95
  188. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +0 -61
  189. data/spec/lib/spree/core/testing_support/factories/adjustment_factory_spec.rb +0 -20
  190. data/spec/lib/spree/core/testing_support/factories/adjustment_reason_factory_spec.rb +0 -14
  191. data/spec/lib/spree/core/testing_support/factories/calculator_factory_spec.rb +0 -44
  192. data/spec/lib/spree/core/testing_support/factories/carton_factory_spec.rb +0 -14
  193. data/spec/lib/spree/core/testing_support/factories/country_factory_spec.rb +0 -14
  194. data/spec/lib/spree/core/testing_support/factories/credit_card_factory_spec.rb +0 -14
  195. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +0 -39
  196. data/spec/lib/spree/core/testing_support/factories/image_factory_spec.rb +0 -14
  197. data/spec/lib/spree/core/testing_support/factories/inventory_unit_factory_spec.rb +0 -14
  198. data/spec/lib/spree/core/testing_support/factories/line_item_factory_spec.rb +0 -14
  199. data/spec/lib/spree/core/testing_support/factories/option_type_factory_spec.rb +0 -14
  200. data/spec/lib/spree/core/testing_support/factories/option_value_factory_spec.rb +0 -14
  201. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -376
  202. data/spec/lib/spree/core/testing_support/factories/order_promotion_factory_spec.rb +0 -14
  203. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +0 -40
  204. data/spec/lib/spree/core/testing_support/factories/payment_method_factory_spec.rb +0 -32
  205. data/spec/lib/spree/core/testing_support/factories/price_factory_spec.rb +0 -14
  206. data/spec/lib/spree/core/testing_support/factories/product_factory_spec.rb +0 -32
  207. data/spec/lib/spree/core/testing_support/factories/product_option_type_factory_spec.rb +0 -14
  208. data/spec/lib/spree/core/testing_support/factories/product_property_factory_spec.rb +0 -14
  209. data/spec/lib/spree/core/testing_support/factories/promotion_category_factory_spec.rb +0 -14
  210. data/spec/lib/spree/core/testing_support/factories/promotion_code_factory_spec.rb +0 -14
  211. data/spec/lib/spree/core/testing_support/factories/promotion_factory_spec.rb +0 -32
  212. data/spec/lib/spree/core/testing_support/factories/property_factory_spec.rb +0 -14
  213. data/spec/lib/spree/core/testing_support/factories/refund_factory_spec.rb +0 -14
  214. data/spec/lib/spree/core/testing_support/factories/refund_reason_factory_spec.rb +0 -14
  215. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +0 -20
  216. data/spec/lib/spree/core/testing_support/factories/reimbursement_type_factory_spec.rb +0 -14
  217. data/spec/lib/spree/core/testing_support/factories/return_authorization_factory_spec.rb +0 -14
  218. data/spec/lib/spree/core/testing_support/factories/return_item_factory_spec.rb +0 -20
  219. data/spec/lib/spree/core/testing_support/factories/return_reason_factory_spec.rb +0 -14
  220. data/spec/lib/spree/core/testing_support/factories/role_factory_spec.rb +0 -20
  221. data/spec/lib/spree/core/testing_support/factories/shipment_factory_spec.rb +0 -14
  222. data/spec/lib/spree/core/testing_support/factories/shipping_category_factory_spec.rb +0 -14
  223. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +0 -44
  224. data/spec/lib/spree/core/testing_support/factories/shipping_rate_factory_spec.rb +0 -14
  225. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +0 -59
  226. data/spec/lib/spree/core/testing_support/factories/stock_item_factory_spec.rb +0 -14
  227. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +0 -35
  228. data/spec/lib/spree/core/testing_support/factories/stock_movement_factory_spec.rb +0 -14
  229. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +0 -28
  230. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +0 -14
  231. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +0 -43
  232. data/spec/lib/spree/core/testing_support/factories/store_credit_factory_spec.rb +0 -14
  233. data/spec/lib/spree/core/testing_support/factories/store_credit_reason_factory_spec.rb +0 -14
  234. data/spec/lib/spree/core/testing_support/factories/store_credit_type_factory_spec.rb +0 -20
  235. data/spec/lib/spree/core/testing_support/factories/store_factory_spec.rb +0 -14
  236. data/spec/lib/spree/core/testing_support/factories/tax_category_factory_spec.rb +0 -14
  237. data/spec/lib/spree/core/testing_support/factories/tax_rate_factory_spec.rb +0 -14
  238. data/spec/lib/spree/core/testing_support/factories/taxon_factory_spec.rb +0 -14
  239. data/spec/lib/spree/core/testing_support/factories/taxonomy_factory_spec.rb +0 -14
  240. data/spec/lib/spree/core/testing_support/factories/user_factory_spec.rb +0 -24
  241. data/spec/lib/spree/core/testing_support/factories/variant_factory_spec.rb +0 -56
  242. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_condition_factory_spec.rb +0 -14
  243. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_factory_spec.rb +0 -14
  244. data/spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb +0 -14
  245. data/spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb +0 -20
  246. data/spec/lib/spree/core/testing_support/preferences_spec.rb +0 -61
  247. data/spec/lib/spree/core/validators/email_spec.rb +0 -53
  248. data/spec/lib/spree/core/version_spec.rb +0 -19
  249. data/spec/lib/spree/event/subscriber_spec.rb +0 -85
  250. data/spec/lib/spree/event_spec.rb +0 -130
  251. data/spec/lib/spree/localized_number_spec.rb +0 -45
  252. data/spec/lib/spree/migrations_spec.rb +0 -32
  253. data/spec/lib/spree/money_spec.rb +0 -298
  254. data/spec/lib/spree/permission_sets/default_customer_spec.rb +0 -22
  255. data/spec/lib/spree/promo/environment_spec.rb +0 -53
  256. data/spec/lib/tasks/dummy_task.rake +0 -12
  257. data/spec/lib/tasks/dummy_task_spec.rb +0 -30
  258. data/spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb +0 -21
  259. data/spec/mailers/carton_mailer_spec.rb +0 -44
  260. data/spec/mailers/order_mailer_spec.rb +0 -117
  261. data/spec/mailers/promotion_code_batch_mailer_spec.rb +0 -47
  262. data/spec/mailers/reimbursement_mailer_spec.rb +0 -36
  263. data/spec/mailers/test_mailer_spec.rb +0 -13
  264. data/spec/models/spree/ability_spec.rb +0 -279
  265. data/spec/models/spree/address_spec.rb +0 -399
  266. data/spec/models/spree/adjustment_reason_spec.rb +0 -11
  267. data/spec/models/spree/adjustment_spec.rb +0 -339
  268. data/spec/models/spree/asset_spec.rb +0 -25
  269. data/spec/models/spree/calculator/default_tax_spec.rb +0 -260
  270. data/spec/models/spree/calculator/distributed_amount_spec.rb +0 -82
  271. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +0 -39
  272. data/spec/models/spree/calculator/flat_rate_spec.rb +0 -52
  273. data/spec/models/spree/calculator/flexi_rate_spec.rb +0 -158
  274. data/spec/models/spree/calculator/free_shipping_spec.rb +0 -8
  275. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +0 -20
  276. data/spec/models/spree/calculator/percent_per_item_spec.rb +0 -12
  277. data/spec/models/spree/calculator/price_sack_spec.rb +0 -35
  278. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +0 -70
  279. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +0 -44
  280. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +0 -18
  281. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +0 -56
  282. data/spec/models/spree/calculator/shipping/per_item_spec.rb +0 -25
  283. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +0 -44
  284. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +0 -99
  285. data/spec/models/spree/calculator/tiered_percent_spec.rb +0 -197
  286. data/spec/models/spree/calculator_spec.rb +0 -43
  287. data/spec/models/spree/carton_spec.rb +0 -145
  288. data/spec/models/spree/classification_spec.rb +0 -126
  289. data/spec/models/spree/concerns/display_money_spec.rb +0 -44
  290. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +0 -52
  291. data/spec/models/spree/concerns/user_address_book_spec.rb +0 -358
  292. data/spec/models/spree/concerns/user_methods_spec.rb +0 -122
  293. data/spec/models/spree/country_spec.rb +0 -154
  294. data/spec/models/spree/credit_card_spec.rb +0 -373
  295. data/spec/models/spree/customer_return_spec.rb +0 -294
  296. data/spec/models/spree/distributed_amounts_handler_spec.rb +0 -83
  297. data/spec/models/spree/exchange_spec.rb +0 -76
  298. data/spec/models/spree/fulfilment_changer_spec.rb +0 -340
  299. data/spec/models/spree/gallery/product_gallery_spec.rb +0 -21
  300. data/spec/models/spree/gallery/variant_gallery_spec.rb +0 -21
  301. data/spec/models/spree/gateway/bogus_simple.rb +0 -14
  302. data/spec/models/spree/gateway/bogus_spec.rb +0 -14
  303. data/spec/models/spree/gateway_spec.rb +0 -14
  304. data/spec/models/spree/image_spec.rb +0 -25
  305. data/spec/models/spree/inventory_unit_spec.rb +0 -309
  306. data/spec/models/spree/line_item_spec.rb +0 -240
  307. data/spec/models/spree/option_type_spec.rb +0 -16
  308. data/spec/models/spree/option_value_spec.rb +0 -52
  309. data/spec/models/spree/order/address_spec.rb +0 -52
  310. data/spec/models/spree/order/adjustments_spec.rb +0 -29
  311. data/spec/models/spree/order/callbacks_spec.rb +0 -44
  312. data/spec/models/spree/order/checkout_spec.rb +0 -740
  313. data/spec/models/spree/order/finalizing_spec.rb +0 -92
  314. data/spec/models/spree/order/number_generator_spec.rb +0 -47
  315. data/spec/models/spree/order/outstanding_balance_integration_spec.rb +0 -138
  316. data/spec/models/spree/order/payment_spec.rb +0 -280
  317. data/spec/models/spree/order/risk_assessment_spec.rb +0 -70
  318. data/spec/models/spree/order/state_machine_spec.rb +0 -122
  319. data/spec/models/spree/order/totals_spec.rb +0 -26
  320. data/spec/models/spree/order/validations_spec.rb +0 -17
  321. data/spec/models/spree/order_cancellations_spec.rb +0 -233
  322. data/spec/models/spree/order_capturing_spec.rb +0 -16
  323. data/spec/models/spree/order_contents_spec.rb +0 -362
  324. data/spec/models/spree/order_inventory_spec.rb +0 -285
  325. data/spec/models/spree/order_merger_spec.rb +0 -162
  326. data/spec/models/spree/order_mutex_spec.rb +0 -89
  327. data/spec/models/spree/order_promotion_spec.rb +0 -33
  328. data/spec/models/spree/order_shipping_spec.rb +0 -247
  329. data/spec/models/spree/order_spec.rb +0 -1687
  330. data/spec/models/spree/order_taxation_spec.rb +0 -128
  331. data/spec/models/spree/order_update_attributes_spec.rb +0 -49
  332. data/spec/models/spree/order_updater_spec.rb +0 -556
  333. data/spec/models/spree/payment/cancellation_spec.rb +0 -84
  334. data/spec/models/spree/payment_create_spec.rb +0 -195
  335. data/spec/models/spree/payment_method/bogus_credit_card_spec.rb +0 -10
  336. data/spec/models/spree/payment_method/check_spec.rb +0 -80
  337. data/spec/models/spree/payment_method/credit_card_spec.rb +0 -68
  338. data/spec/models/spree/payment_method/simple_bogus_credit_card_spec.rb +0 -20
  339. data/spec/models/spree/payment_method/store_credit_spec.rb +0 -325
  340. data/spec/models/spree/payment_method_spec.rb +0 -408
  341. data/spec/models/spree/payment_spec.rb +0 -1270
  342. data/spec/models/spree/permission_sets/base_spec.rb +0 -14
  343. data/spec/models/spree/permission_sets/configuration_display.rb +0 -79
  344. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -49
  345. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -23
  346. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -56
  347. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -43
  348. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -57
  349. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -39
  350. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -41
  351. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -29
  352. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -42
  353. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -42
  354. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -25
  355. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -23
  356. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -39
  357. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -58
  358. data/spec/models/spree/preference_spec.rb +0 -79
  359. data/spec/models/spree/preferences/configuration_spec.rb +0 -27
  360. data/spec/models/spree/preferences/preferable_spec.rb +0 -334
  361. data/spec/models/spree/preferences/scoped_store_spec.rb +0 -62
  362. data/spec/models/spree/preferences/static_model_preferences_spec.rb +0 -79
  363. data/spec/models/spree/preferences/statically_configurable_spec.rb +0 -67
  364. data/spec/models/spree/preferences/store_spec.rb +0 -40
  365. data/spec/models/spree/price_spec.rb +0 -150
  366. data/spec/models/spree/product/scopes_spec.rb +0 -164
  367. data/spec/models/spree/product_duplicator_spec.rb +0 -92
  368. data/spec/models/spree/product_filter_spec.rb +0 -28
  369. data/spec/models/spree/product_property_spec.rb +0 -20
  370. data/spec/models/spree/product_spec.rb +0 -584
  371. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +0 -126
  372. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +0 -198
  373. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +0 -298
  374. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +0 -61
  375. data/spec/models/spree/promotion/rules/first_order_spec.rb +0 -87
  376. data/spec/models/spree/promotion/rules/first_repeat_purchase_since_spec.rb +0 -71
  377. data/spec/models/spree/promotion/rules/item_total_spec.rb +0 -128
  378. data/spec/models/spree/promotion/rules/nth_order_spec.rb +0 -72
  379. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +0 -54
  380. data/spec/models/spree/promotion/rules/option_value_spec.rb +0 -96
  381. data/spec/models/spree/promotion/rules/product_spec.rb +0 -193
  382. data/spec/models/spree/promotion/rules/store_spec.rb +0 -35
  383. data/spec/models/spree/promotion/rules/taxon_spec.rb +0 -226
  384. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +0 -33
  385. data/spec/models/spree/promotion/rules/user_role_spec.rb +0 -88
  386. data/spec/models/spree/promotion/rules/user_spec.rb +0 -39
  387. data/spec/models/spree/promotion_action_spec.rb +0 -44
  388. data/spec/models/spree/promotion_category_spec.rb +0 -19
  389. data/spec/models/spree/promotion_code/batch_builder_spec.rb +0 -107
  390. data/spec/models/spree/promotion_code_batch_spec.rb +0 -54
  391. data/spec/models/spree/promotion_code_spec.rb +0 -206
  392. data/spec/models/spree/promotion_handler/cart_spec.rb +0 -132
  393. data/spec/models/spree/promotion_handler/coupon_spec.rb +0 -419
  394. data/spec/models/spree/promotion_handler/page_spec.rb +0 -45
  395. data/spec/models/spree/promotion_handler/shipping_spec.rb +0 -96
  396. data/spec/models/spree/promotion_rule_spec.rb +0 -34
  397. data/spec/models/spree/promotion_spec.rb +0 -945
  398. data/spec/models/spree/refund_spec.rb +0 -200
  399. data/spec/models/spree/reimbursement/credit_spec.rb +0 -38
  400. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +0 -144
  401. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +0 -85
  402. data/spec/models/spree/reimbursement_performer_spec.rb +0 -33
  403. data/spec/models/spree/reimbursement_spec.rb +0 -278
  404. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +0 -52
  405. data/spec/models/spree/reimbursement_type/credit_spec.rb +0 -56
  406. data/spec/models/spree/reimbursement_type/exchange_spec.rb +0 -48
  407. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +0 -110
  408. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +0 -111
  409. data/spec/models/spree/return_authorization_spec.rb +0 -226
  410. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +0 -79
  411. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -59
  412. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -86
  413. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +0 -35
  414. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +0 -31
  415. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +0 -42
  416. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +0 -66
  417. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +0 -43
  418. data/spec/models/spree/return_item_spec.rb +0 -785
  419. data/spec/models/spree/returns_calculator_spec.rb +0 -16
  420. data/spec/models/spree/shipment_spec.rb +0 -914
  421. data/spec/models/spree/shipping_calculator_spec.rb +0 -45
  422. data/spec/models/spree/shipping_manifest_spec.rb +0 -110
  423. data/spec/models/spree/shipping_method_spec.rb +0 -292
  424. data/spec/models/spree/shipping_rate_spec.rb +0 -154
  425. data/spec/models/spree/shipping_rate_tax_spec.rb +0 -79
  426. data/spec/models/spree/state_spec.rb +0 -43
  427. data/spec/models/spree/stock/allocator/on_hand_first_spec.rb +0 -146
  428. data/spec/models/spree/stock/availability_spec.rb +0 -143
  429. data/spec/models/spree/stock/availability_validator_spec.rb +0 -140
  430. data/spec/models/spree/stock/content_item_spec.rb +0 -70
  431. data/spec/models/spree/stock/differentiator_spec.rb +0 -41
  432. data/spec/models/spree/stock/estimator_spec.rb +0 -241
  433. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -34
  434. data/spec/models/spree/stock/inventory_units_finalizer_spec.rb +0 -58
  435. data/spec/models/spree/stock/location_filter/active_spec.rb +0 -22
  436. data/spec/models/spree/stock/location_sorter/default_first_spec.rb +0 -22
  437. data/spec/models/spree/stock/location_sorter/unsorted_spec.rb +0 -21
  438. data/spec/models/spree/stock/package_spec.rb +0 -182
  439. data/spec/models/spree/stock/quantifier_spec.rb +0 -113
  440. data/spec/models/spree/stock/shipping_rate_selector_spec.rb +0 -18
  441. data/spec/models/spree/stock/shipping_rate_sorter_spec.rb +0 -18
  442. data/spec/models/spree/stock/simple_coordinator_spec.rb +0 -264
  443. data/spec/models/spree/stock/splitter/backordered_spec.rb +0 -31
  444. data/spec/models/spree/stock/splitter/base_spec.rb +0 -22
  445. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +0 -48
  446. data/spec/models/spree/stock/splitter/weight_spec.rb +0 -31
  447. data/spec/models/spree/stock/splitter_chain_spec.rb +0 -66
  448. data/spec/models/spree/stock_item_spec.rb +0 -348
  449. data/spec/models/spree/stock_location_spec.rb +0 -288
  450. data/spec/models/spree/stock_movement_spec.rb +0 -58
  451. data/spec/models/spree/stock_quantities_spec.rb +0 -249
  452. data/spec/models/spree/store_credit_category_spec.rb +0 -19
  453. data/spec/models/spree/store_credit_event_spec.rb +0 -328
  454. data/spec/models/spree/store_credit_spec.rb +0 -900
  455. data/spec/models/spree/store_selector/by_server_name_spec.rb +0 -28
  456. data/spec/models/spree/store_selector/legacy_spec.rb +0 -46
  457. data/spec/models/spree/store_spec.rb +0 -156
  458. data/spec/models/spree/tax/order_adjuster_spec.rb +0 -35
  459. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +0 -59
  460. data/spec/models/spree/tax/tax_location_spec.rb +0 -79
  461. data/spec/models/spree/tax/taxation_integration_spec.rb +0 -815
  462. data/spec/models/spree/tax_calculator/default_spec.rb +0 -56
  463. data/spec/models/spree/tax_category_spec.rb +0 -50
  464. data/spec/models/spree/tax_rate_spec.rb +0 -317
  465. data/spec/models/spree/taxon_spec.rb +0 -197
  466. data/spec/models/spree/taxonomy_spec.rb +0 -15
  467. data/spec/models/spree/taxons/paperclip_attachment_spec.rb +0 -29
  468. data/spec/models/spree/unit_cancel_spec.rb +0 -126
  469. data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +0 -31
  470. data/spec/models/spree/user_last_url_storer_spec.rb +0 -60
  471. data/spec/models/spree/user_spec.rb +0 -247
  472. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -33
  473. data/spec/models/spree/variant/price_selector_spec.rb +0 -90
  474. data/spec/models/spree/variant/pricing_options_spec.rb +0 -204
  475. data/spec/models/spree/variant/scopes_spec.rb +0 -94
  476. data/spec/models/spree/variant/vat_price_generator_spec.rb +0 -77
  477. data/spec/models/spree/variant_property_rule_condition_spec.rb +0 -17
  478. data/spec/models/spree/variant_property_rule_spec.rb +0 -85
  479. data/spec/models/spree/variant_property_rule_value_spec.rb +0 -20
  480. data/spec/models/spree/variant_spec.rb +0 -862
  481. data/spec/models/spree/wallet_payment_source_spec.rb +0 -77
  482. data/spec/models/spree/wallet_spec.rb +0 -155
  483. data/spec/models/spree/zone_spec.rb +0 -248
  484. data/spec/rails_helper.rb +0 -46
  485. data/spec/shared_examples/calculator_shared_examples.rb +0 -10
  486. data/spec/spec_helper.rb +0 -36
  487. data/spec/support/big_decimal.rb +0 -7
  488. data/spec/support/concerns/default_price.rb +0 -44
  489. data/spec/support/concerns/payment_source.rb +0 -66
  490. data/spec/support/concerns/working_factories.rb +0 -15
  491. data/spec/support/dummy_ability.rb +0 -7
  492. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/backend/all.js +0 -0
  493. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -0
  494. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/backend/all.css +0 -0
  495. /data/lib/generators/{spree → solidus}/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -0
@@ -23,10 +23,18 @@ module Spree
23
23
  ORDER_NUMBER_LETTERS = false
24
24
  ORDER_NUMBER_PREFIX = 'R'
25
25
 
26
- include Spree::Order::Checkout
26
+ include ::Spree::Config.state_machines.order
27
+
27
28
  include Spree::Order::Payments
28
29
 
29
- class InsufficientStock < StandardError; end
30
+ class InsufficientStock < StandardError
31
+ attr_reader :items
32
+
33
+ def initialize(message = nil, items: {})
34
+ @items = items
35
+ super message
36
+ end
37
+ end
30
38
  class CannotRebuildShipments < StandardError; end
31
39
 
32
40
  extend Spree::DisplayMoney
@@ -42,8 +50,9 @@ module Spree
42
50
  go_to_state :confirm
43
51
  end
44
52
 
53
+ ransack_alias :bill_address_firstname_or_lastname, :bill_address_firstname_or_bill_address_lastname
45
54
  self.whitelisted_ransackable_associations = %w[shipments user order_promotions promotions bill_address ship_address line_items]
46
- self.whitelisted_ransackable_attributes = %w[completed_at created_at email number state payment_state shipment_state total store_id]
55
+ self.whitelisted_ransackable_attributes = %w[bill_address_firstname_or_lastname completed_at created_at email number state payment_state shipment_state total store_id]
47
56
 
48
57
  attr_reader :coupon_code
49
58
  attr_accessor :temporary_address
@@ -97,6 +106,8 @@ module Spree
97
106
 
98
107
  # Returns
99
108
  has_many :return_authorizations, dependent: :destroy, inverse_of: :order
109
+ has_many :return_items, through: :inventory_units
110
+ has_many :customer_returns, through: :return_items
100
111
  has_many :reimbursements, inverse_of: :order
101
112
  has_many :refunds, through: :payments
102
113
 
@@ -125,7 +136,7 @@ module Spree
125
136
  validates :email, presence: true, if: :require_email
126
137
  validates :email, 'spree/email' => true, allow_blank: true
127
138
  validates :guest_token, presence: { allow_nil: true }
128
- validates :number, presence: true, uniqueness: { allow_blank: true }
139
+ validates :number, presence: true, uniqueness: { allow_blank: true, case_sensitive: true }
129
140
  validates :store_id, presence: true
130
141
 
131
142
  def self.find_by_param(value)
@@ -136,9 +147,10 @@ module Spree
136
147
  find_by! number: value
137
148
  end
138
149
 
139
- delegate :firstname, :lastname, to: :bill_address, prefix: true, allow_nil: true
150
+ delegate :name, :firstname, :lastname, to: :bill_address, prefix: true, allow_nil: true
140
151
  alias_method :billing_firstname, :bill_address_firstname
141
152
  alias_method :billing_lastname, :bill_address_lastname
153
+ alias_method :billing_name, :bill_address_name
142
154
 
143
155
  class_attribute :update_hooks
144
156
  self.update_hooks = Set.new
@@ -181,6 +193,9 @@ module Spree
181
193
  # Use this method in other gems that wish to register their own custom logic
182
194
  # that should be called after Order#update
183
195
  def self.register_update_hook(hook)
196
+ Spree::Deprecation.warn \
197
+ "Spree::Order::update_hooks are deprecated. Please remove them " \
198
+ "and subscribe to `order_recalculated` and/or `order_finalized` event instead", caller(1)
184
199
  update_hooks.add(hook)
185
200
  end
186
201
 
@@ -192,7 +207,7 @@ module Spree
192
207
 
193
208
  # For compatiblity with Calculator::PriceSack
194
209
  def amount
195
- line_items.map(&:amount).sum
210
+ line_items.sum(&:amount)
196
211
  end
197
212
 
198
213
  # Sum of all line item amounts after promotions, before added tax
@@ -217,7 +232,7 @@ module Spree
217
232
  end
218
233
 
219
234
  def shipping_discount
220
- shipment_adjustments.eligible.sum(:amount) * - 1
235
+ shipment_adjustments.credit.eligible.sum(:amount) * - 1
221
236
  end
222
237
 
223
238
  def to_param
@@ -287,7 +302,11 @@ module Spree
287
302
  end
288
303
 
289
304
  def all_inventory_units_returned?
290
- inventory_units.all?(&:returned?)
305
+ # Inventory units are transitioned to the "return" state through CustomerReturn and
306
+ # ReturnItem instead of using Order#inventory_units, thus making the latter method
307
+ # potentially return stale data. This situation requires to *reload* `inventory_units`
308
+ # in order to pick-up the latest changes and make the check on `returned?` reliable.
309
+ inventory_units.reload.all?(&:returned?)
291
310
  end
292
311
 
293
312
  def contents
@@ -398,7 +417,7 @@ module Spree
398
417
 
399
418
  def name
400
419
  if (address = bill_address || ship_address)
401
- "#{address.firstname} #{address.lastname}"
420
+ address.name
402
421
  end
403
422
  end
404
423
 
@@ -431,11 +450,18 @@ module Spree
431
450
 
432
451
  updater.update_shipment_state
433
452
  save!
434
- updater.run_hooks
453
+ updater.run_hooks if update_hooks.any?
435
454
 
436
455
  touch :completed_at
437
456
 
438
457
  Spree::Event.fire 'order_finalized', order: self
458
+
459
+ if method(:deliver_order_confirmation_email).owner != self.class
460
+ Spree::Deprecation.warn \
461
+ "deliver_order_confirmation_email has been deprecated and moved to " \
462
+ "Spree::MailerSubscriber#order_finalized, please move there any customizations.",
463
+ caller(1)
464
+ end
439
465
  end
440
466
 
441
467
  def fulfill!
@@ -444,6 +470,16 @@ module Spree
444
470
  save!
445
471
  end
446
472
 
473
+ def deliver_order_confirmation_email
474
+ Spree::Deprecation.warn \
475
+ "deliver_order_confirmation_email has been deprecated and moved to " \
476
+ "Spree::MailerSubscriber#order_finalized.",
477
+ caller(1)
478
+
479
+ Spree::Config.order_mailer_class.confirm_email(order).deliver_later
480
+ order.update_column(:confirmation_delivered, true)
481
+ end
482
+
447
483
  # Helper methods for checkout steps
448
484
  def paid?
449
485
  %w(paid credit_owed).include?(payment_state)
@@ -529,6 +565,18 @@ module Spree
529
565
  end
530
566
  end
531
567
 
568
+ def ensure_billing_address
569
+ return unless billing_address_required?
570
+ return if bill_address&.valid?
571
+
572
+ errors.add(:base, I18n.t('spree.bill_address_required'))
573
+ false
574
+ end
575
+
576
+ def billing_address_required?
577
+ Spree::Config.billing_address_required
578
+ end
579
+
532
580
  def create_proposed_shipments
533
581
  if completed?
534
582
  raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_order_completed'))
@@ -540,6 +588,13 @@ module Spree
540
588
  end
541
589
  end
542
590
 
591
+ def create_shipments_for_line_item(line_item)
592
+ units = Spree::Stock::InventoryUnitBuilder.new(self).missing_units_for_line_item(line_item)
593
+ Spree::Config.stock.coordinator_class.new(self, units).shipments.each do |shipment|
594
+ shipments << shipment
595
+ end
596
+ end
597
+
543
598
  def apply_shipping_promotions
544
599
  Spree::PromotionHandler::Shipping.new(self).activate
545
600
  recalculate
@@ -591,10 +646,9 @@ module Spree
591
646
  def canceled_by(user)
592
647
  transaction do
593
648
  cancel!
594
- update_columns(
595
- canceler_id: user.id,
596
- canceled_at: Time.current
597
- )
649
+ # rubocop:disable Rails/SkipsModelValidations
650
+ update_column(:canceler_id, user.id)
651
+ # rubocop:enable Rails/SkipsModelValidations
598
652
  end
599
653
  end
600
654
 
@@ -714,8 +768,8 @@ module Spree
714
768
  # @note This doesn't persist the change bill_address or ship_address
715
769
  def assign_default_user_addresses
716
770
  if user
717
- bill_address = (user.bill_address || user.default_address)
718
- ship_address = (user.ship_address || user.default_address)
771
+ bill_address = user.bill_address
772
+ ship_address = user.ship_address
719
773
  # this is one of 2 places still using User#bill_address
720
774
  self.bill_address ||= bill_address if bill_address.try!(:valid?)
721
775
  # Skip setting ship address if order doesn't have a delivery checkout step
@@ -760,7 +814,9 @@ module Spree
760
814
  deprecate assign_default_credit_card: :add_default_payment_from_wallet, deprecator: Spree::Deprecation
761
815
 
762
816
  def record_ip_address(ip_address)
763
- if last_ip_address != ip_address
817
+ if new_record?
818
+ self.last_ip_address = ip_address
819
+ elsif last_ip_address != ip_address
764
820
  update_column(:last_ip_address, ip_address)
765
821
  end
766
822
  end
@@ -873,14 +929,29 @@ module Spree
873
929
  end
874
930
 
875
931
  def after_cancel
876
- shipments.each(&:cancel!)
877
- payments.completed.each { |payment| payment.cancel! unless payment.fully_refunded? }
878
- payments.store_credits.pending.each(&:void_transaction!)
932
+ cancel_shipments!
933
+ cancel_payments!
879
934
 
880
935
  send_cancel_email
936
+ # rubocop:disable Rails/SkipsModelValidations
937
+ update_column(:canceled_at, Time.current)
938
+ # rubocop:enable Rails/SkipsModelValidations
881
939
  recalculate
882
940
  end
883
941
 
942
+ def cancel_shipments!
943
+ shipments.each(&:cancel!)
944
+ end
945
+
946
+ def cancel_payments!
947
+ payments.each do |payment|
948
+ next if payment.fully_refunded?
949
+ next unless payment.pending? || payment.completed?
950
+
951
+ payment.cancel!
952
+ end
953
+ end
954
+
884
955
  def send_cancel_email
885
956
  Spree::Config.order_mailer_class.cancel_email(self).deliver_later
886
957
  end
@@ -23,8 +23,14 @@ module Spree
23
23
  existing_quantity = inventory_units.count
24
24
  desired_quantity = line_item.quantity - existing_quantity
25
25
  if desired_quantity > 0
26
- shipment ||= determine_target_shipment
27
- add_to_shipment(shipment, desired_quantity)
26
+ shipment ||= determine_target_shipment(desired_quantity)
27
+ if shipment
28
+ add_to_shipment(shipment, desired_quantity)
29
+ else
30
+ order.create_shipments_for_line_item(line_item).each do |new_shipment|
31
+ new_shipment.finalize!
32
+ end
33
+ end
28
34
  elsif desired_quantity < 0
29
35
  remove(-desired_quantity, shipment)
30
36
  end
@@ -48,12 +54,18 @@ module Spree
48
54
  # Returns either one of the shipment:
49
55
  #
50
56
  # first unshipped that already includes this variant
51
- # first unshipped that's leaving from a stock_location that stocks this variant
52
- def determine_target_shipment
57
+ # first unshipped that's leaving from a stock_location that stocks this variant, with availability check
58
+ # first unshipped that's leaving from a stock_location that stocks this variant, without availability check
59
+ def determine_target_shipment(quantity)
53
60
  potential_shipments = order.shipments.select(&:ready_or_pending?)
54
61
 
55
62
  potential_shipments.detect do |shipment|
56
63
  shipment.include?(variant)
64
+ end || potential_shipments.detect do |shipment|
65
+ stock_item = shipment.stock_location.stock_item(variant.id)
66
+ if stock_item
67
+ stock_item.backorderable? || stock_item.count_on_hand >= quantity
68
+ end
57
69
  end || potential_shipments.detect do |shipment|
58
70
  variant.stock_location_ids.include?(shipment.stock_location_id)
59
71
  end
@@ -56,11 +56,13 @@ module Spree
56
56
  end
57
57
 
58
58
  set_user(user)
59
- persist_merge
59
+ if order.valid?
60
+ persist_merge
60
61
 
61
- # So that the destroy doesn't take out line items which may have been re-assigned
62
- other_order.line_items.reload
63
- other_order.destroy
62
+ # So that the destroy doesn't take out line items which may have been re-assigned
63
+ other_order.line_items.reload
64
+ other_order.destroy
65
+ end
64
66
  end
65
67
 
66
68
  private
@@ -21,7 +21,7 @@ module Spree
21
21
  private
22
22
 
23
23
  def require_promotion_code?
24
- promotion && promotion.codes.any?
24
+ promotion && !promotion.apply_automatically && promotion.codes.any?
25
25
  end
26
26
  end
27
27
  end
@@ -17,7 +17,7 @@ module Spree
17
17
  # object with callbacks (otherwise you will end up in an infinite recursion as the
18
18
  # associations try to save and then in turn try to call +update!+ again.)
19
19
  def update
20
- @order.transaction do
20
+ order.transaction do
21
21
  update_item_count
22
22
  update_shipment_amounts
23
23
  update_totals
@@ -26,12 +26,17 @@ module Spree
26
26
  update_shipments
27
27
  update_shipment_state
28
28
  end
29
- run_hooks
29
+ run_hooks if update_hooks.any?
30
+ Spree::Event.fire 'order_recalculated', order: order
30
31
  persist_totals
31
32
  end
32
33
  end
33
34
 
34
35
  def run_hooks
36
+ Spree::Deprecation.warn \
37
+ "This method is deprecated. Please run your hooks by subscribing " \
38
+ "to `order_recalculated` and/or `order_finalized` events instead, depending " \
39
+ " on when OrderUpdater#run_hooks was called.", caller(1)
35
40
  update_hooks.each { |hook| order.send hook }
36
41
  end
37
42
 
@@ -136,20 +141,16 @@ module Spree
136
141
  end
137
142
 
138
143
  def update_shipment_amounts
139
- shipments.each do |shipment|
140
- shipment.update_amounts
141
- end
144
+ shipments.each(&:update_amounts)
142
145
  end
143
146
 
144
147
  # give each of the shipments a chance to update themselves
145
148
  def update_shipments
146
- shipments.each do |shipment|
147
- shipment.update_state
148
- end
149
+ shipments.each(&:update_state)
149
150
  end
150
151
 
151
152
  def update_payment_total
152
- order.payment_total = payments.completed.includes(:refunds).map { |payment| payment.amount - payment.refunds.sum(:amount) }.sum
153
+ order.payment_total = payments.completed.includes(:refunds).sum { |payment| payment.amount - payment.refunds.sum(:amount) }
153
154
  end
154
155
 
155
156
  def update_shipment_total
@@ -185,7 +186,7 @@ module Spree
185
186
  end
186
187
 
187
188
  def persist_totals
188
- order.save!(validate: false)
189
+ order.save!(validate: Spree::Config.run_order_validations_on_order_updater)
189
190
  end
190
191
 
191
192
  def log_state_change(name)
@@ -29,9 +29,9 @@ module Spree
29
29
  # For payment methods already implemeting `try_void`
30
30
  if try_void_available?(payment.payment_method)
31
31
  if response = payment.payment_method.try_void(payment)
32
- payment.send(:handle_void_response, response)
32
+ payment.handle_void_response(response)
33
33
  else
34
- payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason)
34
+ payment.refunds.create!(amount: payment.credit_allowed, reason: refund_reason, perform_after_create: false).perform!
35
35
  end
36
36
  else
37
37
  # For payment methods not yet implemeting `try_void`
@@ -55,7 +55,7 @@ module Spree
55
55
  'Please implement a `try_void` method instead that returns a response object if void succeeds ' \
56
56
  'or `false|nil` if not. Solidus will refund the payment then.'
57
57
  response = payment.payment_method.cancel(payment.response_code)
58
- payment.send(:handle_void_response, response)
58
+ payment.handle_void_response(response)
59
59
  end
60
60
  end
61
61
  end
@@ -46,18 +46,20 @@ module Spree
46
46
  # Takes the amount in cents to capture.
47
47
  # Can be used to capture partial amounts of a payment, and will create
48
48
  # a new pending payment record for the remaining amount to capture later.
49
- def capture!(amount = nil)
49
+ def capture!(capture_amount = nil)
50
50
  return true if completed?
51
- amount ||= money.money.cents
51
+ return false unless amount.positive?
52
+
53
+ capture_amount ||= money.money.cents
52
54
  started_processing!
53
55
  protect_from_connection_error do
54
56
  # Standard ActiveMerchant capture usage
55
57
  response = payment_method.capture(
56
- amount,
58
+ capture_amount,
57
59
  response_code,
58
60
  gateway_options
59
61
  )
60
- money = ::Money.new(amount, currency)
62
+ money = ::Money.new(capture_amount, currency)
61
63
  capture_events.create!(amount: money.to_d)
62
64
  update!(amount: captured_amount)
63
65
  handle_response(response, :complete, :failure)
@@ -66,6 +68,8 @@ module Spree
66
68
 
67
69
  def void_transaction!
68
70
  return true if void?
71
+ return false unless amount.positive?
72
+
69
73
  protect_from_connection_error do
70
74
  if payment_method.payment_profiles_supported?
71
75
  # Gateways supporting payment profiles will need access to credit card object because this stores the payment profile information
@@ -117,6 +121,22 @@ module Spree
117
121
  options
118
122
  end
119
123
 
124
+ # The unique identifier to be passed in to the payment gateway
125
+ def gateway_order_id
126
+ "#{order.number}-#{number}"
127
+ end
128
+
129
+ def handle_void_response(response)
130
+ record_response(response)
131
+
132
+ if response.success?
133
+ self.response_code = response.authorization
134
+ void
135
+ else
136
+ gateway_error(response)
137
+ end
138
+ end
139
+
120
140
  private
121
141
 
122
142
  def process_authorization
@@ -182,17 +202,6 @@ module Spree
182
202
  end
183
203
  end
184
204
 
185
- def handle_void_response(response)
186
- record_response(response)
187
-
188
- if response.success?
189
- self.response_code = response.authorization
190
- void
191
- else
192
- gateway_error(response)
193
- end
194
- end
195
-
196
205
  def record_response(response)
197
206
  log_entries.create!(details: response.to_yaml)
198
207
  end
@@ -204,21 +213,36 @@ module Spree
204
213
  end
205
214
 
206
215
  def gateway_error(error)
207
- if error.is_a? ActiveMerchant::Billing::Response
208
- text = error.params['message'] || error.params['response_reason_text'] || error.message
209
- elsif error.is_a? ActiveMerchant::ConnectionError
210
- text = I18n.t('spree.unable_to_connect_to_gateway')
211
- else
212
- text = error.to_s
213
- end
214
- logger.error(I18n.t('spree.gateway_error'))
215
- logger.error(" #{error.to_yaml}")
216
- raise Core::GatewayError.new(text)
217
- end
218
-
219
- # The unique identifier to be passed in to the payment gateway
220
- def gateway_order_id
221
- "#{order.number}-#{number}"
216
+ message, log = case error
217
+ when ActiveMerchant::Billing::Response
218
+ [
219
+ error.params['message'] || error.params['response_reason_text'] || error.message,
220
+ basic_response_info(error)
221
+ ]
222
+ when ActiveMerchant::ConnectionError
223
+ [I18n.t('spree.unable_to_connect_to_gateway')] * 2
224
+ else
225
+ [error.to_s, error]
226
+ end
227
+
228
+ logger.error("#{I18n.t('spree.gateway_error')}: #{log}")
229
+ raise Core::GatewayError.new(message)
230
+ end
231
+
232
+ # The gateway response information without the params since the params
233
+ # can contain PII.
234
+ def basic_response_info(response)
235
+ {
236
+ message: response.message,
237
+ test: response.test,
238
+ authorization: response.authorization,
239
+ avs_result: response.avs_result,
240
+ cvv_result: response.cvv_result,
241
+ error_code: response.error_code,
242
+ emv_authorization: response.emv_authorization,
243
+ gateway_order_id: gateway_order_id,
244
+ order_number: order.number
245
+ }
222
246
  end
223
247
  end
224
248
  end
@@ -17,7 +17,7 @@ module Spree
17
17
 
18
18
  belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :payments, optional: true
19
19
  belongs_to :source, polymorphic: true, optional: true
20
- belongs_to :payment_method, -> { with_deleted }, class_name: 'Spree::PaymentMethod', inverse_of: :payments, optional: true
20
+ belongs_to :payment_method, -> { with_discarded }, class_name: 'Spree::PaymentMethod', inverse_of: :payments, optional: true
21
21
 
22
22
  has_many :offsets, -> { offset_payment }, class_name: "Spree::Payment", foreign_key: :source_id
23
23
  has_many :log_entries, as: :source
@@ -179,11 +179,11 @@ module Spree
179
179
  end
180
180
 
181
181
  def source_required?
182
- payment_method.present? && payment_method.source_required?
182
+ !!payment_method&.source_required?
183
183
  end
184
184
 
185
185
  def profiles_supported?
186
- payment_method.respond_to?(:payment_profiles_supported?) && payment_method.payment_profiles_supported?
186
+ !!payment_method.try(:payment_profiles_supported?)
187
187
  end
188
188
 
189
189
  def create_payment_profile
@@ -1,6 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'discard'
4
3
  require 'spree/preferences/statically_configurable'
5
4
 
6
5
  module Spree
@@ -15,17 +14,17 @@ module Spree
15
14
  preference :server, :string, default: 'test'
16
15
  preference :test_mode, :boolean, default: true
17
16
 
18
- acts_as_paranoid
19
- include Spree::ParanoiaDeprecations
20
-
21
- include Discard::Model
22
- self.discard_column = :deleted_at
17
+ include Spree::SoftDeletable
23
18
 
24
19
  acts_as_list
25
20
 
26
21
  # @private
27
22
  def self.const_missing(name)
28
23
  if name == :DISPLAY
24
+ Spree::Deprecation.warn(
25
+ "#{self}::DISPLAY has been deprecated and will be removed in Solidus v3.",
26
+ caller
27
+ )
29
28
  const_set(:DISPLAY, [:both, :front_end, :back_end])
30
29
  else
31
30
  super
@@ -63,7 +62,7 @@ module Spree
63
62
  @human
64
63
  ].compact
65
64
  options = { scope: [:activerecord, :models], count: 1, default: defaults }.merge!(options.except(:default))
66
- I18n.translate(defaults.shift, options)
65
+ I18n.translate(defaults.shift, **options)
67
66
  end
68
67
  end
69
68
 
@@ -108,9 +107,9 @@ module Spree
108
107
  where(type: to_s, active: true).count > 0
109
108
  end
110
109
 
111
- # @deprecated Use .with_deleted.find instead
110
+ # @deprecated Use .with_discarded.find instead
112
111
  def find_with_destroyed(*args)
113
- Spree::Deprecation.warn "#{self}.find_with_destroyed is deprecated. Use #{self}.with_deleted.find instead"
112
+ Spree::Deprecation.warn "#{self}.find_with_destroyed is deprecated. Use #{self}.with_discarded.find instead"
114
113
  unscoped { find(*args) }
115
114
  end
116
115
  end
@@ -3,5 +3,5 @@
3
3
  class Spree::Preference < Spree::Base
4
4
  serialize :value
5
5
 
6
- validates :key, presence: true, uniqueness: { allow_blank: true }
6
+ validates :key, presence: true, uniqueness: { allow_blank: true, case_sensitive: true }
7
7
  end
@@ -1,18 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'discard'
4
-
5
3
  module Spree
6
4
  class Price < Spree::Base
7
- acts_as_paranoid
8
- include Spree::ParanoiaDeprecations
9
-
10
- include Discard::Model
11
- self.discard_column = :deleted_at
5
+ include Spree::SoftDeletable
12
6
 
13
7
  MAXIMUM_AMOUNT = BigDecimal('99_999_999.99')
14
8
 
15
- belongs_to :variant, -> { with_deleted }, class_name: 'Spree::Variant', touch: true, optional: true
9
+ belongs_to :variant, -> { with_discarded }, class_name: 'Spree::Variant', touch: true, optional: true
16
10
  belongs_to :country, class_name: "Spree::Country", foreign_key: "country_iso", primary_key: "iso", optional: true
17
11
 
18
12
  delegate :product, to: :variant
@@ -29,11 +29,13 @@ module Spree
29
29
  scope :descend_by_name, -> { order(name: :desc) }
30
30
 
31
31
  add_search_scope :ascend_by_master_price do
32
- joins(master: :default_price).order(Spree::Price.arel_table[:amount].asc)
32
+ joins(master: :default_price).select('spree_products.* , spree_prices.amount')
33
+ .order(Spree::Price.arel_table[:amount].asc)
33
34
  end
34
35
 
35
36
  add_search_scope :descend_by_master_price do
36
- joins(master: :default_price).order(Spree::Price.arel_table[:amount].desc)
37
+ joins(master: :default_price).select('spree_products.* , spree_prices.amount')
38
+ .order(Spree::Price.arel_table[:amount].desc)
37
39
  end
38
40
 
39
41
  add_search_scope :price_between do |low, high|
@@ -182,7 +184,10 @@ module Spree
182
184
  end
183
185
  # Can't use add_search_scope for this as it needs a default argument
184
186
  def self.available(available_on = nil)
185
- with_master_price.where("#{Spree::Product.quoted_table_name}.available_on <= ?", available_on || Time.current)
187
+ with_master_price
188
+ .where("#{Spree::Product.quoted_table_name}.available_on <= ?", available_on || Time.current)
189
+ .where("#{Spree::Product.quoted_table_name}.discontinue_on IS NULL OR" \
190
+ "#{Spree::Product.quoted_table_name}.discontinue_on >= ?", Time.current)
186
191
  end
187
192
  search_scopes << :available
188
193
 
@@ -233,7 +238,7 @@ module Spree
233
238
 
234
239
  # specifically avoid having an order for taxon search (conflicts with main order)
235
240
  def prepare_taxon_conditions(taxons)
236
- ids = taxons.map { |taxon| taxon.self_and_descendants.pluck(:id) }.flatten.uniq
241
+ ids = taxons.flat_map { |taxon| taxon.self_and_descendants.pluck(:id) }.uniq
237
242
  joins(:taxons).where("#{Spree::Taxon.table_name}.id" => ids)
238
243
  end
239
244
 
@@ -251,7 +256,7 @@ module Spree
251
256
  ids_or_records_or_names.flatten.map { |taxon|
252
257
  case taxon
253
258
  when Integer then Spree::Taxon.find_by(id: taxon)
254
- when ActiveRecord::Base then t
259
+ when ActiveRecord::Base then taxon
255
260
  when String
256
261
  Spree::Taxon.find_by(name: taxon) ||
257
262
  Spree::Taxon.where("#{taxons}.permalink LIKE ? OR #{taxons}.permalink = ?", "%/#{taxon}/", "#{taxon}/").first