solidus_core 3.0.0 → 4.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +1 -2
  3. data/Rakefile +7 -2
  4. data/app/assets/images/logo/solidus.svg +18 -1
  5. data/app/assets/images/logo/solidus_logo.png +0 -0
  6. data/app/controllers/spree/base_controller.rb +1 -3
  7. data/app/helpers/spree/base_helper.rb +3 -3
  8. data/app/helpers/spree/core/controller_helpers/auth.rb +66 -0
  9. data/app/helpers/spree/core/controller_helpers/common.rb +82 -0
  10. data/app/helpers/spree/core/controller_helpers/order.rb +86 -0
  11. data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +165 -0
  12. data/{lib/spree/core/controller_helpers/current_host.rb → app/helpers/spree/core/controller_helpers/pricing.rb} +6 -4
  13. data/app/helpers/spree/core/controller_helpers/search.rb +16 -0
  14. data/app/helpers/spree/core/controller_helpers/store.rb +19 -0
  15. data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +74 -0
  16. data/app/helpers/spree/products_helper.rb +2 -2
  17. data/app/mailers/spree/base_mailer.rb +1 -1
  18. data/app/mailers/spree/carton_mailer.rb +1 -1
  19. data/app/mailers/spree/order_mailer.rb +3 -3
  20. data/app/mailers/spree/reimbursement_mailer.rb +1 -1
  21. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
  22. data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
  23. data/app/models/concerns/spree/active_storage_adapter.rb +1 -18
  24. data/app/models/concerns/spree/default_price.rb +30 -10
  25. data/app/models/concerns/spree/display_money.rb +1 -1
  26. data/app/models/concerns/spree/metadata.rb +64 -0
  27. data/app/models/concerns/spree/named_type.rb +2 -0
  28. data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
  29. data/app/models/concerns/spree/ransackable_attributes.rb +9 -5
  30. data/app/models/concerns/spree/user_address_book.rb +19 -10
  31. data/app/models/concerns/spree/user_methods.rb +40 -6
  32. data/app/models/spree/address.rb +11 -9
  33. data/app/models/spree/adjustment.rb +15 -76
  34. data/app/models/spree/adjustment_reason.rb +2 -0
  35. data/app/models/spree/calculator/flat_fee.rb +21 -0
  36. data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
  37. data/app/models/spree/carton.rb +3 -3
  38. data/app/models/spree/core/state_machines/inventory_unit.rb +42 -0
  39. data/app/models/spree/core/state_machines/order/class_methods.rb +217 -0
  40. data/app/models/spree/core/state_machines/order.rb +42 -0
  41. data/app/models/spree/core/state_machines/payment.rb +61 -0
  42. data/app/models/spree/core/state_machines/reimbursement.rb +33 -0
  43. data/app/models/spree/core/state_machines/return_authorization.rb +32 -0
  44. data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
  45. data/app/models/spree/core/state_machines/return_item/reception_status.rb +42 -0
  46. data/app/models/spree/core/state_machines/shipment.rb +58 -0
  47. data/app/models/spree/country.rb +1 -1
  48. data/app/models/spree/credit_card.rb +13 -10
  49. data/app/models/spree/customer_return.rb +6 -3
  50. data/app/models/spree/deprecated_configurable_class.rb +40 -0
  51. data/app/models/spree/fulfilment_changer.rb +56 -29
  52. data/app/models/spree/image/active_storage_attachment.rb +2 -7
  53. data/app/models/spree/image/paperclip_attachment.rb +2 -2
  54. data/app/models/spree/inventory_unit.rb +2 -2
  55. data/app/models/spree/item_total.rb +28 -0
  56. data/app/models/spree/legacy_user.rb +1 -0
  57. data/app/models/spree/line_item.rb +26 -8
  58. data/app/models/spree/log_entry.rb +98 -1
  59. data/app/models/spree/money.rb +120 -0
  60. data/app/models/spree/null_promotion_adjuster.rb +13 -0
  61. data/app/models/spree/null_promotion_advertiser.rb +9 -0
  62. data/app/models/spree/null_promotion_finder.rb +9 -0
  63. data/app/models/spree/null_promotion_handler.rb +44 -0
  64. data/app/models/spree/option_type.rb +1 -1
  65. data/app/models/spree/option_value.rb +4 -3
  66. data/app/models/spree/order/number_generator.rb +7 -1
  67. data/app/models/spree/order.rb +143 -96
  68. data/app/models/spree/order_cancellations.rb +8 -8
  69. data/app/models/spree/order_inventory.rb +7 -5
  70. data/app/models/spree/order_merger.rb +5 -7
  71. data/app/models/spree/order_mutex.rb +2 -2
  72. data/app/models/spree/order_shipping.rb +15 -19
  73. data/app/models/spree/order_taxation.rb +7 -4
  74. data/app/models/spree/order_update_attributes.rb +3 -1
  75. data/app/models/spree/order_updater.rb +25 -63
  76. data/app/models/spree/payment/processing.rb +60 -57
  77. data/app/models/spree/payment.rb +14 -27
  78. data/app/models/spree/payment_create.rb +1 -1
  79. data/app/models/spree/payment_method/bogus_credit_card.rb +18 -14
  80. data/app/models/spree/payment_method/credit_card.rb +0 -4
  81. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +18 -4
  82. data/app/models/spree/payment_method/store_credit.rb +1 -1
  83. data/app/models/spree/payment_method.rb +29 -10
  84. data/app/models/spree/payment_source.rb +5 -1
  85. data/app/models/spree/permission_set.rb +11 -0
  86. data/app/models/spree/permission_sets/base.rb +45 -0
  87. data/app/models/spree/permission_sets/configuration_display.rb +53 -0
  88. data/app/models/spree/permission_sets/configuration_management.rb +52 -0
  89. data/app/models/spree/permission_sets/dashboard_display.rb +28 -0
  90. data/app/models/spree/permission_sets/default_customer.rb +83 -0
  91. data/app/models/spree/permission_sets/order_display.rb +50 -0
  92. data/app/models/spree/permission_sets/order_management.rb +50 -0
  93. data/app/models/spree/permission_sets/product_display.rb +43 -0
  94. data/app/models/spree/permission_sets/product_management.rb +47 -0
  95. data/app/models/spree/permission_sets/restricted_stock_display.rb +33 -0
  96. data/app/models/spree/permission_sets/restricted_stock_management.rb +33 -0
  97. data/app/models/spree/permission_sets/stock_display.rb +26 -0
  98. data/app/models/spree/permission_sets/stock_management.rb +26 -0
  99. data/app/models/spree/permission_sets/super_user.rb +26 -0
  100. data/app/models/spree/permission_sets/user_display.rb +27 -0
  101. data/app/models/spree/permission_sets/user_management.rb +44 -0
  102. data/app/models/spree/preference.rb +1 -1
  103. data/app/models/spree/price.rb +3 -3
  104. data/app/models/spree/product/scopes.rb +23 -10
  105. data/app/models/spree/product.rb +30 -23
  106. data/app/models/spree/product_property.rb +1 -1
  107. data/app/models/spree/property.rb +1 -1
  108. data/app/models/spree/refund.rb +13 -3
  109. data/app/models/spree/refund_reason.rb +6 -1
  110. data/app/models/spree/reimbursement.rb +6 -6
  111. data/app/models/spree/reimbursement_performer.rb +3 -3
  112. data/app/models/spree/reimbursement_tax_calculator.rb +3 -3
  113. data/app/models/spree/reimbursement_type/credit.rb +1 -1
  114. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
  115. data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
  116. data/app/models/spree/reimbursement_type.rb +6 -1
  117. data/app/models/spree/return_authorization.rb +3 -1
  118. data/app/models/spree/return_item.rb +13 -15
  119. data/app/models/spree/return_reason.rb +6 -1
  120. data/app/models/spree/role.rb +3 -1
  121. data/app/models/spree/role_permission.rb +8 -0
  122. data/app/models/spree/shipment.rb +12 -10
  123. data/app/models/spree/shipping_category.rb +2 -0
  124. data/app/models/spree/shipping_rate.rb +2 -3
  125. data/app/models/spree/shipping_rate_tax.rb +1 -1
  126. data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +10 -13
  127. data/app/models/spree/state.rb +1 -1
  128. data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
  129. data/app/models/spree/stock/availability.rb +11 -3
  130. data/app/models/spree/stock/estimator.rb +1 -1
  131. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  132. data/app/models/spree/stock/package.rb +2 -2
  133. data/app/models/spree/stock/quantifier.rb +12 -8
  134. data/app/models/spree/stock/simple_coordinator.rb +38 -28
  135. data/app/models/spree/stock/splitter/shipping_category.rb +1 -1
  136. data/app/models/spree/stock_item.rb +2 -1
  137. data/app/models/spree/stock_location.rb +7 -7
  138. data/app/models/spree/stock_movement.rb +2 -2
  139. data/app/models/spree/store.rb +3 -1
  140. data/app/models/spree/store_credit.rb +31 -16
  141. data/app/models/spree/store_credit_event.rb +4 -3
  142. data/app/models/spree/store_credit_prioritizer.rb +17 -0
  143. data/app/models/spree/store_credit_reason.rb +6 -1
  144. data/app/models/spree/store_selector/by_server_name.rb +1 -1
  145. data/app/models/spree/tax/item_tax.rb +3 -2
  146. data/app/models/spree/tax/order_tax.rb +3 -1
  147. data/app/models/spree/tax/tax_helpers.rb +14 -3
  148. data/app/models/spree/tax/tax_location.rb +4 -7
  149. data/app/models/spree/tax_calculator/default.rb +32 -1
  150. data/app/models/spree/tax_calculator/shipping_rate.rb +2 -2
  151. data/app/models/spree/tax_category.rb +3 -1
  152. data/app/models/spree/tax_rate.rb +14 -1
  153. data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
  154. data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
  155. data/app/models/spree/taxon.rb +25 -3
  156. data/app/models/spree/taxon_brand_selector.rb +22 -0
  157. data/app/models/spree/taxonomy.rb +4 -3
  158. data/app/models/spree/unauthorized_redirect_handler.rb +24 -0
  159. data/app/models/spree/unit_cancel.rb +1 -2
  160. data/app/models/spree/user_address.rb +9 -3
  161. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
  162. data/app/models/spree/variant/price_selector.rb +25 -8
  163. data/app/models/spree/variant/scopes.rb +4 -0
  164. data/app/models/spree/variant/vat_price_generator.rb +1 -1
  165. data/app/models/spree/variant.rb +64 -37
  166. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
  167. data/app/models/spree/wallet.rb +2 -2
  168. data/app/models/spree/zone.rb +1 -1
  169. data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
  170. data/app/views/layouts/spree/base_mailer.html.erb +2 -2
  171. data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
  172. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  173. data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
  174. data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
  175. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +0 -1
  176. data/config/i18n-tasks.yml +134 -0
  177. data/config/locales/en.yml +439 -338
  178. data/db/default/spree/permission_sets.rb +10 -0
  179. data/db/default/spree/return_reasons.rb +3 -1
  180. data/db/default/spree/states.rb +2 -2
  181. data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
  182. data/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb +2 -2
  183. data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
  184. data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
  185. data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +16 -0
  186. data/db/migrate/20220419170826_remove_archived_user_addresses.rb +12 -0
  187. data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
  188. data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
  189. data/db/migrate/20230321161854_change_column_null_option_values_option_type_id.rb +5 -0
  190. data/db/migrate/20230425103509_remove_taxon_position.rb +5 -0
  191. data/db/migrate/20230427095534_drop_deprecated_address_id_from_shipments.rb +11 -0
  192. data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
  193. data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
  194. data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
  195. data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
  196. data/db/migrate/20250129061658_add_metadata_to_spree_resources.rb +28 -0
  197. data/db/migrate/20250201172950_add_gtin_and_condition_to_spree_variant.rb +6 -0
  198. data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +7 -0
  199. data/db/migrate/20250221152004_add_metadata_to_users.rb +13 -0
  200. data/db/seeds.rb +5 -1
  201. data/lib/generators/solidus/install/app_templates/authentication/custom.rb +16 -0
  202. data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
  203. data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
  204. data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
  205. data/lib/generators/solidus/install/app_templates/frontend/none.rb +1 -0
  206. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -0
  207. data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +5 -0
  208. data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
  209. data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +5 -0
  210. data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +5 -0
  211. data/lib/generators/solidus/install/install_generator.rb +210 -156
  212. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +27 -33
  213. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
  214. data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
  215. data/lib/generators/solidus/update/update_generator.rb +124 -0
  216. data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
  217. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
  218. data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
  219. data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
  220. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +1 -2
  221. data/lib/generators/spree/dummy/templates/rails/database.yml +48 -63
  222. data/lib/generators/spree/dummy/templates/rails/manifest.js +3 -0
  223. data/lib/generators/spree/dummy/templates/rails/test.rb +7 -2
  224. data/lib/spree/app_configuration.rb +220 -71
  225. data/lib/spree/bus.rb +11 -0
  226. data/lib/spree/core/class_constantizer.rb +2 -2
  227. data/lib/spree/core/controller_helpers/auth.rb +5 -69
  228. data/lib/spree/core/controller_helpers/common.rb +5 -80
  229. data/lib/spree/core/controller_helpers/order.rb +5 -86
  230. data/lib/spree/core/controller_helpers/payment_parameters.rb +5 -165
  231. data/lib/spree/core/controller_helpers/pricing.rb +5 -17
  232. data/lib/spree/core/controller_helpers/search.rb +5 -14
  233. data/lib/spree/core/controller_helpers/store.rb +5 -17
  234. data/lib/spree/core/controller_helpers/strong_parameters.rb +5 -71
  235. data/lib/spree/core/engine.rb +49 -16
  236. data/lib/spree/core/environment/calculators.rb +35 -3
  237. data/lib/spree/core/environment/promotions.rb +25 -4
  238. data/lib/spree/core/environment_extension.rb +16 -2
  239. data/lib/spree/core/importer/order.rb +6 -6
  240. data/lib/spree/core/importer/product.rb +3 -3
  241. data/lib/spree/core/nested_class_set.rb +28 -0
  242. data/lib/spree/core/null_promotion_configuration.rb +84 -0
  243. data/lib/spree/core/product_duplicator.rb +1 -1
  244. data/lib/spree/core/product_filters.rb +2 -2
  245. data/lib/spree/core/search/base.rb +18 -9
  246. data/lib/spree/core/search/variant.rb +2 -2
  247. data/lib/spree/core/state_machines/inventory_unit.rb +5 -40
  248. data/lib/spree/core/state_machines/order.rb +5 -247
  249. data/lib/spree/core/state_machines/payment.rb +5 -59
  250. data/lib/spree/core/state_machines/reimbursement.rb +5 -31
  251. data/lib/spree/core/state_machines/return_authorization.rb +5 -30
  252. data/lib/spree/core/state_machines/return_item/acceptance_status.rb +5 -49
  253. data/lib/spree/core/state_machines/return_item/reception_status.rb +5 -40
  254. data/lib/spree/core/state_machines/shipment.rb +5 -56
  255. data/lib/spree/core/state_machines.rb +48 -81
  256. data/lib/spree/core/stock_configuration.rb +18 -0
  257. data/lib/spree/core/validators/email.rb +2 -4
  258. data/lib/spree/core/version.rb +5 -1
  259. data/lib/spree/core/versioned_value.rb +75 -0
  260. data/lib/spree/core.rb +40 -16
  261. data/lib/spree/deprecated_instance_variable_proxy.rb +57 -0
  262. data/lib/spree/deprecation.rb +3 -51
  263. data/lib/spree/deprecator.rb +9 -0
  264. data/lib/spree/i18n.rb +1 -1
  265. data/lib/spree/mailer_previews/carton_preview.rb +1 -1
  266. data/lib/spree/migration_helpers.rb +3 -3
  267. data/lib/spree/migrations.rb +13 -11
  268. data/lib/spree/money.rb +5 -118
  269. data/lib/spree/permission_sets/base.rb +5 -30
  270. data/lib/spree/permission_sets/configuration_display.rb +5 -23
  271. data/lib/spree/permission_sets/configuration_management.rb +5 -23
  272. data/lib/spree/permission_sets/dashboard_display.rb +5 -9
  273. data/lib/spree/permission_sets/default_customer.rb +5 -35
  274. data/lib/spree/permission_sets/order_display.rb +5 -19
  275. data/lib/spree/permission_sets/order_management.rb +5 -20
  276. data/lib/spree/permission_sets/product_display.rb +5 -17
  277. data/lib/spree/permission_sets/product_management.rb +5 -19
  278. data/lib/spree/permission_sets/restricted_stock_display.rb +5 -16
  279. data/lib/spree/permission_sets/restricted_stock_management.rb +5 -16
  280. data/lib/spree/permission_sets/stock_display.rb +5 -10
  281. data/lib/spree/permission_sets/stock_management.rb +5 -10
  282. data/lib/spree/permission_sets/super_user.rb +5 -9
  283. data/lib/spree/permission_sets/user_display.rb +5 -11
  284. data/lib/spree/permission_sets/user_management.rb +5 -23
  285. data/lib/spree/permission_sets.rb +5 -18
  286. data/lib/spree/permitted_attributes.rb +35 -14
  287. data/lib/spree/preferences/configuration.rb +88 -0
  288. data/lib/spree/preferences/persistable.rb +7 -1
  289. data/lib/spree/preferences/preferable.rb +13 -0
  290. data/lib/spree/preferences/preferable_class_methods.rb +12 -4
  291. data/lib/spree/preferences/preference_differentiator.rb +29 -0
  292. data/lib/spree/preferences/static_model_preferences.rb +25 -10
  293. data/lib/spree/preferences/store.rb +2 -2
  294. data/lib/spree/testing_support/blacklist_urls.rb +1 -1
  295. data/lib/spree/testing_support/bus_helpers.rb +101 -0
  296. data/lib/spree/testing_support/capybara_ext.rb +11 -1
  297. data/lib/spree/testing_support/common_rake.rb +76 -23
  298. data/lib/spree/testing_support/dummy_ability.rb +7 -0
  299. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
  300. data/lib/spree/testing_support/dummy_app/assets/stylesheets/solidus_admin/tailwind.css +1 -0
  301. data/lib/spree/testing_support/dummy_app/database.yml +39 -28
  302. data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
  303. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +3 -10
  304. data/lib/spree/testing_support/dummy_app.rb +71 -42
  305. data/lib/spree/testing_support/extension_rake.rb +2 -2
  306. data/lib/spree/testing_support/factories/address_factory.rb +9 -13
  307. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -13
  308. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +0 -5
  309. data/lib/spree/testing_support/factories/calculator_factory.rb +4 -10
  310. data/lib/spree/testing_support/factories/carton_factory.rb +2 -10
  311. data/lib/spree/testing_support/factories/country_factory.rb +1 -7
  312. data/lib/spree/testing_support/factories/credit_card_factory.rb +0 -5
  313. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -11
  314. data/lib/spree/testing_support/factories/image_factory.rb +0 -5
  315. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -14
  316. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -8
  317. data/lib/spree/testing_support/factories/option_type_factory.rb +0 -8
  318. data/lib/spree/testing_support/factories/option_value_factory.rb +0 -5
  319. data/lib/spree/testing_support/factories/order_factory.rb +19 -38
  320. data/lib/spree/testing_support/factories/payment_factory.rb +0 -10
  321. data/lib/spree/testing_support/factories/payment_method_factory.rb +0 -5
  322. data/lib/spree/testing_support/factories/price_factory.rb +0 -7
  323. data/lib/spree/testing_support/factories/product_factory.rb +5 -13
  324. data/lib/spree/testing_support/factories/product_option_type_factory.rb +0 -8
  325. data/lib/spree/testing_support/factories/product_property_factory.rb +0 -8
  326. data/lib/spree/testing_support/factories/property_factory.rb +0 -5
  327. data/lib/spree/testing_support/factories/refund_factory.rb +0 -8
  328. data/lib/spree/testing_support/factories/refund_reason_factory.rb +0 -5
  329. data/lib/spree/testing_support/factories/reimbursement_factory.rb +0 -7
  330. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +0 -5
  331. data/lib/spree/testing_support/factories/return_authorization_factory.rb +0 -9
  332. data/lib/spree/testing_support/factories/return_item_factory.rb +0 -9
  333. data/lib/spree/testing_support/factories/return_reason_factory.rb +0 -5
  334. data/lib/spree/testing_support/factories/role_factory.rb +0 -5
  335. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -11
  336. data/lib/spree/testing_support/factories/shipping_category_factory.rb +0 -5
  337. data/lib/spree/testing_support/factories/shipping_method_factory.rb +0 -9
  338. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +0 -8
  339. data/lib/spree/testing_support/factories/state_factory.rb +8 -10
  340. data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -9
  341. data/lib/spree/testing_support/factories/stock_location_factory.rb +0 -9
  342. data/lib/spree/testing_support/factories/stock_movement_factory.rb +0 -7
  343. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -9
  344. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -5
  345. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +0 -8
  346. data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -13
  347. data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +0 -5
  348. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -5
  349. data/lib/spree/testing_support/factories/store_factory.rb +0 -5
  350. data/lib/spree/testing_support/factories/tax_category_factory.rb +0 -8
  351. data/lib/spree/testing_support/factories/tax_rate_factory.rb +0 -9
  352. data/lib/spree/testing_support/factories/taxon_factory.rb +5 -10
  353. data/lib/spree/testing_support/factories/taxonomy_factory.rb +3 -6
  354. data/lib/spree/testing_support/factories/user_factory.rb +6 -9
  355. data/lib/spree/testing_support/factories/variant_factory.rb +0 -10
  356. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +0 -8
  357. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +0 -9
  358. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +0 -8
  359. data/lib/spree/testing_support/factories/zone_factory.rb +1 -9
  360. data/lib/spree/testing_support/factory_bot.rb +6 -29
  361. data/lib/spree/testing_support/flaky.rb +22 -0
  362. data/lib/spree/testing_support/order_walkthrough.rb +7 -6
  363. data/lib/spree/testing_support/sequences.rb +0 -5
  364. data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
  365. data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
  366. data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
  367. data/lib/spree/testing_support/silence_deprecations.rb +9 -0
  368. data/lib/spree/user_class_handle.rb +2 -2
  369. data/lib/tasks/colorado_delivery_fee.rake +28 -0
  370. data/lib/tasks/payment_method.rake +29 -0
  371. data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
  372. data/solidus_core.gemspec +18 -8
  373. metadata +233 -117
  374. data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
  375. data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
  376. data/app/models/spree/calculator/distributed_amount.rb +0 -33
  377. data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
  378. data/app/models/spree/calculator/flexi_rate.rb +0 -22
  379. data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
  380. data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
  381. data/app/models/spree/calculator/tiered_percent.rb +0 -62
  382. data/app/models/spree/line_item_action.rb +0 -8
  383. data/app/models/spree/order_promotion.rb +0 -27
  384. data/app/models/spree/promotion/actions/create_adjustment.rb +0 -77
  385. data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -99
  386. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
  387. data/app/models/spree/promotion/actions/free_shipping.rb +0 -58
  388. data/app/models/spree/promotion/rules/first_order.rb +0 -38
  389. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
  390. data/app/models/spree/promotion/rules/item_total.rb +0 -53
  391. data/app/models/spree/promotion/rules/nth_order.rb +0 -45
  392. data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
  393. data/app/models/spree/promotion/rules/option_value.rb +0 -50
  394. data/app/models/spree/promotion/rules/product.rb +0 -74
  395. data/app/models/spree/promotion/rules/store.rb +0 -22
  396. data/app/models/spree/promotion/rules/taxon.rb +0 -87
  397. data/app/models/spree/promotion/rules/user.rb +0 -30
  398. data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
  399. data/app/models/spree/promotion/rules/user_role.rb +0 -45
  400. data/app/models/spree/promotion.rb +0 -284
  401. data/app/models/spree/promotion_action.rb +0 -43
  402. data/app/models/spree/promotion_category.rb +0 -8
  403. data/app/models/spree/promotion_chooser.rb +0 -34
  404. data/app/models/spree/promotion_code/batch_builder.rb +0 -64
  405. data/app/models/spree/promotion_code.rb +0 -50
  406. data/app/models/spree/promotion_code_batch.rb +0 -27
  407. data/app/models/spree/promotion_handler/cart.rb +0 -55
  408. data/app/models/spree/promotion_handler/coupon.rb +0 -123
  409. data/app/models/spree/promotion_handler/page.rb +0 -26
  410. data/app/models/spree/promotion_handler/shipping.rb +0 -61
  411. data/app/models/spree/promotion_rule.rb +0 -55
  412. data/app/models/spree/promotion_rule_role.rb +0 -8
  413. data/app/models/spree/promotion_rule_store.rb +0 -10
  414. data/app/models/spree/promotion_rule_taxon.rb +0 -8
  415. data/app/models/spree/promotion_rule_user.rb +0 -10
  416. data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
  417. data/app/subscribers/spree/mailer_subscriber.rb +0 -25
  418. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
  419. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
  420. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
  421. data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
  422. data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
  423. data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
  424. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
  425. data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
  426. data/lib/generators/spree/dummy/templates/rails/script/rails +0 -6
  427. data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
  428. data/lib/spree/event/adapters/active_support_notifications.rb +0 -67
  429. data/lib/spree/event/configuration.rb +0 -25
  430. data/lib/spree/event/subscriber.rb +0 -86
  431. data/lib/spree/event/subscriber_registry.rb +0 -94
  432. data/lib/spree/event.rb +0 -119
  433. data/lib/spree/permission_sets/promotion_display.rb +0 -15
  434. data/lib/spree/permission_sets/promotion_management.rb +0 -15
  435. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +0 -10
  436. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +0 -9
  437. data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +0 -1
  438. data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -16
  439. data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -12
  440. data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -16
  441. data/lib/spree/testing_support/factories/promotion_factory.rb +0 -92
  442. data/lib/spree/testing_support/factories.rb +0 -11
  443. data/lib/spree/testing_support.rb +0 -31
  444. data/lib/tasks/upgrade.rake +0 -15
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module PermissionSets
5
+ # Full permissions for store administration.
6
+ #
7
+ # This permission set is always added to users with the `:admin` role.
8
+ #
9
+ # It grants permission to perform any read or write action on any resource.
10
+ class SuperUser < PermissionSets::Base
11
+ class << self
12
+ def privilege
13
+ :other
14
+ end
15
+
16
+ def category
17
+ :super_user
18
+ end
19
+ end
20
+
21
+ def activate!
22
+ can :manage, :all
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module PermissionSets
5
+ # Read-only permissions for users, roles and store credits.
6
+ #
7
+ # This permission set allows users to view all related information about
8
+ # users, roles and store credits, also from the admin panel.
9
+ class UserDisplay < PermissionSets::Base
10
+ class << self
11
+ def privilege
12
+ :display
13
+ end
14
+
15
+ def category
16
+ :user
17
+ end
18
+ end
19
+
20
+ def activate!
21
+ can [:read, :admin, :edit, :addresses, :orders, :items], Spree.user_class
22
+ can [:read, :admin], Spree::StoreCredit
23
+ can :read, Spree::Role
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,44 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ module PermissionSets
5
+ # Full permissions for user management.
6
+ #
7
+ # This permission set grants full control over all user and
8
+ # related resources, including:
9
+ #
10
+ # - Users
11
+ # - Store credits
12
+ # - Roles
13
+ # - API keys
14
+ class UserManagement < PermissionSets::Base
15
+ class << self
16
+ def privilege
17
+ :management
18
+ end
19
+
20
+ def category
21
+ :user
22
+ end
23
+ end
24
+
25
+ def activate!
26
+ can [:admin, :read, :create, :update, :save_in_address_book, :remove_from_address_book, :addresses, :orders, :items], Spree.user_class
27
+
28
+ # NOTE: This does not work with accessible_by.
29
+ # See https://github.com/solidusio/solidus/pull/1263
30
+ can :update_email, Spree.user_class do |user|
31
+ user.spree_roles.none?
32
+ end
33
+ can :update_password, Spree.user_class do |user|
34
+ user.spree_roles.none?
35
+ end
36
+
37
+ cannot :destroy, Spree.user_class
38
+ can :manage, Spree::StoreCredit
39
+ can :manage, :api_key
40
+ can :read, Spree::Role
41
+ end
42
+ end
43
+ end
44
+ end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Spree::Preference < Spree::Base
4
- serialize :value
4
+ serialize :value, coder: YAML
5
5
 
6
6
  validates :key, presence: true, uniqueness: { allow_blank: true, case_sensitive: true }
7
7
  end
@@ -13,7 +13,7 @@ module Spree
13
13
  delegate :tax_rates, to: :variant
14
14
 
15
15
  validate :check_price
16
- validates :amount, allow_nil: true, numericality: {
16
+ validates :amount, numericality: {
17
17
  greater_than_or_equal_to: 0,
18
18
  less_than_or_equal_to: MAXIMUM_AMOUNT
19
19
  }
@@ -30,7 +30,7 @@ module Spree
30
30
  money_methods :amount, :price
31
31
  alias_method :money, :display_amount
32
32
 
33
- self.whitelisted_ransackable_attributes = %w(amount variant_id currency country_iso)
33
+ self.allowed_ransackable_attributes = %w(amount variant_id currency country_iso)
34
34
 
35
35
  # An alias for #amount
36
36
  def price
@@ -55,7 +55,7 @@ module Spree
55
55
 
56
56
  def display_country
57
57
  if country_iso
58
- "#{country_iso} (#{country.name})"
58
+ "#{country_iso} (#{I18n.t(country_iso, scope: [:spree, :country_names])})"
59
59
  else
60
60
  I18n.t(:any_country, scope: [:spree, :admin, :prices])
61
61
  end
@@ -29,25 +29,25 @@ 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).select('spree_products.* , spree_prices.amount')
32
+ joins(master: :prices).select('spree_products.* , spree_prices.amount')
33
33
  .order(Spree::Price.arel_table[:amount].asc)
34
34
  end
35
35
 
36
36
  add_search_scope :descend_by_master_price do
37
- joins(master: :default_price).select('spree_products.* , spree_prices.amount')
37
+ joins(master: :prices).select('spree_products.* , spree_prices.amount')
38
38
  .order(Spree::Price.arel_table[:amount].desc)
39
39
  end
40
40
 
41
41
  add_search_scope :price_between do |low, high|
42
- joins(master: :default_price).where(Price.table_name => { amount: low..high })
42
+ joins(master: :prices).where(Price.table_name => { amount: low..high })
43
43
  end
44
44
 
45
45
  add_search_scope :master_price_lte do |price|
46
- joins(master: :default_price).where("#{price_table_name}.amount <= ?", price)
46
+ joins(master: :prices).where("#{price_table_name}.amount <= ?", price)
47
47
  end
48
48
 
49
49
  add_search_scope :master_price_gte do |price|
50
- joins(master: :default_price).where("#{price_table_name}.amount >= ?", price)
50
+ joins(master: :prices).where("#{price_table_name}.amount >= ?", price)
51
51
  end
52
52
 
53
53
  # This scope selects products in taxon AND all its descendants
@@ -158,7 +158,7 @@ module Spree
158
158
  # order: 'COALESCE(cnt, 0) DESC'
159
159
  add_search_scope :descend_by_popularity do
160
160
  joins(:master).
161
- order(%{
161
+ order(Arel.sql(%{
162
162
  COALESCE((
163
163
  SELECT
164
164
  COUNT(#{Spree::LineItem.quoted_table_name}.id)
@@ -171,7 +171,7 @@ module Spree
171
171
  WHERE
172
172
  popular_variants.product_id = #{Spree::Product.quoted_table_name}.id
173
173
  ), 0) DESC
174
- })
174
+ }))
175
175
  end
176
176
 
177
177
  add_search_scope :not_deleted do
@@ -194,10 +194,23 @@ module Spree
194
194
  group("spree_products.id").joins(:taxons).where(Spree::Taxon.arel_table[:name].eq(name))
195
195
  end
196
196
 
197
- def self.with_variant_sku_cont(sku)
198
- sku_match = "%#{sku}%"
197
+ def self.with_all_variant_sku_cont(sku)
199
198
  variant_table = Spree::Variant.arel_table
200
- subquery = Spree::Variant.where(variant_table[:sku].matches(sku_match).and(variant_table[:product_id].eq(arel_table[:id])))
199
+ subquery = Spree::Variant.with_discarded.where(
200
+ variant_table[:sku].matches("%#{sku}%").and(
201
+ variant_table[:product_id].eq(arel_table[:id])
202
+ )
203
+ )
204
+ where(subquery.arel.exists)
205
+ end
206
+
207
+ def self.with_kept_variant_sku_cont(sku)
208
+ variant_table = Spree::Variant.arel_table
209
+ subquery = Spree::Variant.where(
210
+ variant_table[:sku].matches("%#{sku}%").and(
211
+ variant_table[:product_id].eq(arel_table[:id])
212
+ )
213
+ )
201
214
  where(subquery.arel.exists)
202
215
  end
203
216
 
@@ -16,7 +16,6 @@ module Spree
16
16
  self.product_option_types = []
17
17
  self.product_properties = []
18
18
  self.classifications.destroy_all
19
- self.product_promotion_rules = []
20
19
  end
21
20
 
22
21
  has_many :product_option_types, dependent: :destroy, inverse_of: :product
@@ -31,11 +30,9 @@ module Spree
31
30
  has_many :classifications, dependent: :delete_all, inverse_of: :product
32
31
  has_many :taxons, through: :classifications, before_remove: :remove_taxon
33
32
 
34
- has_many :product_promotion_rules, dependent: :destroy
35
- has_many :promotion_rules, through: :product_promotion_rules
36
-
37
33
  belongs_to :tax_category, class_name: 'Spree::TaxCategory', optional: true
38
34
  belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :products, optional: true
35
+ belongs_to :primary_taxon, class_name: 'Spree::Taxon', optional: true
39
36
 
40
37
  has_one :master,
41
38
  -> { where(is_master: true).with_discarded },
@@ -61,6 +58,19 @@ module Spree
61
58
  has_many :line_items, through: :variants_including_master
62
59
  has_many :orders, through: :line_items
63
60
 
61
+ has_many :option_values, -> { distinct }, through: :variants_including_master
62
+
63
+ scope :sort_by_master_default_price_amount_asc, -> {
64
+ with_default_price.order('spree_prices.amount ASC')
65
+ }
66
+ scope :sort_by_master_default_price_amount_desc, -> {
67
+ with_default_price.order('spree_prices.amount DESC')
68
+ }
69
+ scope :with_default_price, -> {
70
+ left_joins(master: :prices)
71
+ .where(master: { spree_prices: Spree::Config.default_pricing_options.desired_attributes })
72
+ }
73
+
64
74
  def find_or_build_master
65
75
  master || build_master
66
76
  end
@@ -72,8 +82,11 @@ module Spree
72
82
  :height,
73
83
  :price,
74
84
  :sku,
85
+ :track_inventory,
75
86
  :weight,
76
87
  :width,
88
+ :gtin,
89
+ :condition
77
90
  ]
78
91
  MASTER_ATTRIBUTES.each do |attr|
79
92
  delegate :"#{attr}", :"#{attr}=", to: :find_or_build_master
@@ -84,7 +97,7 @@ module Spree
84
97
  :display_price,
85
98
  :has_default_price?,
86
99
  :images,
87
- :price_for,
100
+ :price_for_options,
88
101
  :rebuild_vat_prices=,
89
102
  to: :find_or_build_master
90
103
 
@@ -119,12 +132,9 @@ module Spree
119
132
 
120
133
  alias :options :product_option_types
121
134
 
122
- self.whitelisted_ransackable_associations = %w[stores variants_including_master master variants]
123
- self.whitelisted_ransackable_attributes = %w[name slug]
124
-
125
- def self.ransackable_scopes(_auth_object = nil)
126
- %i(with_discarded with_variant_sku_cont)
127
- end
135
+ self.allowed_ransackable_associations = %w[stores variants_including_master master variants option_values]
136
+ self.allowed_ransackable_attributes = %w[name slug]
137
+ self.allowed_ransackable_scopes = %i[available with_discarded with_all_variant_sku_cont with_kept_variant_sku_cont]
128
138
 
129
139
  # @return [Boolean] true if there are any variants
130
140
  def has_variants?
@@ -243,7 +253,7 @@ module Spree
243
253
  ActiveRecord::Base.transaction do
244
254
  # Works around spree_i18n https://github.com/spree/spree/issues/301
245
255
  property = Spree::Property.create_with(presentation: property_name).find_or_create_by(name: property_name)
246
- product_property = Spree::ProductProperty.where(product: self, property: property).first_or_initialize
256
+ product_property = Spree::ProductProperty.where(product: self, property:).first_or_initialize
247
257
  product_property.value = property_value
248
258
  product_property.save!
249
259
  end
@@ -251,8 +261,7 @@ module Spree
251
261
 
252
262
  # @return [Array] all advertised and not-rejected promotions
253
263
  def possible_promotions
254
- promotion_ids = promotion_rules.map(&:promotion_id).uniq
255
- Spree::Promotion.advertised.where(id: promotion_ids).reject(&:inactive?)
264
+ Spree::Config.promotions.advertiser_class.for_product(self)
256
265
  end
257
266
 
258
267
  # The number of on-hand stock items; Infinity if any variant does not track
@@ -285,6 +294,10 @@ module Spree
285
294
  @gallery ||= Spree::Config.product_gallery_class.new(self)
286
295
  end
287
296
 
297
+ def brand
298
+ Spree::Config.brand_selector_class.new(self).call
299
+ end
300
+
288
301
  private
289
302
 
290
303
  def any_variants_not_track_inventory?
@@ -327,14 +340,8 @@ module Spree
327
340
  # If the master is invalid, the Product object will be assigned its errors
328
341
  def validate_master
329
342
  unless master.valid?
330
- if Gem::Requirement.new(">= 6.1").satisfied_by?(Rails.gem_version)
331
- master.errors.each do |error|
332
- errors.add(error.attribute, error.message)
333
- end
334
- else
335
- master.errors.each do |att, error|
336
- errors.add(att, error)
337
- end
343
+ master.errors.each do |error|
344
+ errors.add(error.attribute, error.message)
338
345
  end
339
346
  end
340
347
  end
@@ -363,7 +370,7 @@ module Spree
363
370
  end
364
371
 
365
372
  def remove_taxon(taxon)
366
- removed_classifications = classifications.where(taxon: taxon)
373
+ removed_classifications = classifications.where(taxon:)
367
374
  removed_classifications.each(&:remove_from_list)
368
375
  end
369
376
  end
@@ -9,6 +9,6 @@ module Spree
9
9
  belongs_to :product, touch: true, class_name: 'Spree::Product', inverse_of: :product_properties, optional: true
10
10
  belongs_to :property, class_name: 'Spree::Property', inverse_of: :product_properties, optional: true
11
11
 
12
- self.whitelisted_ransackable_attributes = ['value']
12
+ self.allowed_ransackable_attributes = ['value']
13
13
  end
14
14
  end
@@ -11,7 +11,7 @@ module Spree
11
11
 
12
12
  after_touch :touch_all_products
13
13
 
14
- self.whitelisted_ransackable_attributes = %w[name]
14
+ self.allowed_ransackable_attributes = %w[name]
15
15
 
16
16
  private
17
17
 
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Spree
4
4
  class Refund < Spree::Base
5
+ include Metadata
6
+
5
7
  belongs_to :payment, inverse_of: :refunds, optional: true
6
8
  belongs_to :reason, class_name: 'Spree::RefundReason', foreign_key: :refund_reason_id, optional: true
7
9
  belongs_to :reimbursement, inverse_of: :refunds, optional: true
@@ -21,7 +23,7 @@ module Spree
21
23
  delegate :currency, to: :payment
22
24
 
23
25
  def money
24
- Spree::Money.new(amount, { currency: currency })
26
+ Spree::Money.new(amount, { currency: })
25
27
  end
26
28
  alias display_amount money
27
29
 
@@ -31,6 +33,14 @@ module Spree
31
33
  end
32
34
  end
33
35
 
36
+ # Sets this price's amount to a new value, parsing it if the new value is
37
+ # a string.
38
+ #
39
+ # @param price [String, #to_d] a new amount
40
+ def amount=(price)
41
+ self[:amount] = Spree::LocalizedNumber.parse(price)
42
+ end
43
+
34
44
  def description
35
45
  payment.payment_method.name
36
46
  end
@@ -45,7 +55,7 @@ module Spree
45
55
  credit_cents = money.cents
46
56
 
47
57
  @perform_response = process!(credit_cents)
48
- log_entries.build(details: perform_response.to_yaml)
58
+ log_entries.build(parsed_payment_response_details_with_fallback: perform_response)
49
59
 
50
60
  self.transaction_id = perform_response.authorization
51
61
  save!
@@ -82,7 +92,7 @@ module Spree
82
92
  end
83
93
 
84
94
  def update_order
85
- payment.order.updater.update
95
+ payment.order.recalculate
86
96
  end
87
97
  end
88
98
  end
@@ -2,12 +2,17 @@
2
2
 
3
3
  module Spree
4
4
  class RefundReason < Spree::Base
5
- include Spree::NamedType
5
+ scope :active, -> { where(active: true) }
6
+ default_scope -> { order(arel_table[:name].lower) }
7
+
8
+ validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
6
9
 
7
10
  RETURN_PROCESSING_REASON = 'Return processing'
8
11
 
9
12
  has_many :refunds
10
13
 
14
+ self.allowed_ransackable_attributes = %w[name code]
15
+
11
16
  def self.return_processing_reason
12
17
  find_by!(name: RETURN_PROCESSING_REASON, mutable: false)
13
18
  end
@@ -57,7 +57,7 @@ module Spree
57
57
  def build_from_customer_return(customer_return)
58
58
  order = customer_return.order
59
59
  order.reimbursements.build({
60
- customer_return: customer_return,
60
+ customer_return:,
61
61
  return_items: customer_return.return_items.accepted.not_reimbursed
62
62
  })
63
63
  end
@@ -88,14 +88,14 @@ module Spree
88
88
  reload
89
89
  update!(total: calculated_total)
90
90
 
91
- reimbursement_performer.perform(self, created_by: created_by)
91
+ reimbursement_performer.perform(self, created_by:)
92
92
 
93
93
  if unpaid_amount_within_tolerance?
94
94
  reimbursed!
95
- Spree::Event.fire 'reimbursement_reimbursed', reimbursement: self
95
+ Spree::Bus.publish :reimbursement_reimbursed, reimbursement: self
96
96
  else
97
97
  errored!
98
- Spree::Event.fire 'reimbursement_errored', reimbursement: self
98
+ Spree::Bus.publish :reimbursement_errored, reimbursement: self
99
99
  end
100
100
 
101
101
  if errored?
@@ -108,7 +108,7 @@ module Spree
108
108
  reload
109
109
  update!(total: calculated_total)
110
110
 
111
- reimbursement_performer.simulate(self, created_by: created_by)
111
+ reimbursement_performer.simulate(self, created_by:)
112
112
  end
113
113
 
114
114
  def return_items_requiring_exchange
@@ -131,7 +131,7 @@ module Spree
131
131
  def return_all(created_by:)
132
132
  return_items.each(&:accept!)
133
133
  save!
134
- perform!(created_by: created_by)
134
+ perform!(created_by:)
135
135
  end
136
136
 
137
137
  # The returned category is used as the category
@@ -12,12 +12,12 @@ module Spree
12
12
  # - #display_amount
13
13
  # so they can be displayed in the Admin UI appropriately.
14
14
  def simulate(reimbursement, created_by:)
15
- execute(reimbursement, true, created_by: created_by)
15
+ execute(reimbursement, true, created_by:)
16
16
  end
17
17
 
18
18
  # Actually perform the reimbursement
19
19
  def perform(reimbursement, created_by:)
20
- execute(reimbursement, false, created_by: created_by)
20
+ execute(reimbursement, false, created_by:)
21
21
  end
22
22
 
23
23
  private
@@ -26,7 +26,7 @@ module Spree
26
26
  reimbursement_type_hash = calculate_reimbursement_types(reimbursement)
27
27
 
28
28
  reimbursement_type_hash.flat_map do |reimbursement_type, return_items|
29
- reimbursement_type.reimburse(reimbursement, return_items, simulate, created_by: created_by)
29
+ reimbursement_type.reimburse(reimbursement, return_items, simulate, created_by:)
30
30
  end
31
31
  end
32
32
 
@@ -12,7 +12,7 @@ module Spree
12
12
  class ReimbursementTaxCalculator
13
13
  class << self
14
14
  def call(reimbursement)
15
- reimbursement.return_items.includes(:inventory_unit).each do |return_item|
15
+ reimbursement.return_items.includes(:inventory_unit).find_each do |return_item|
16
16
  set_tax!(return_item)
17
17
  end
18
18
  end
@@ -26,8 +26,8 @@ module Spree
26
26
  included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
27
27
 
28
28
  return_item.update!({
29
- additional_tax_total: additional_tax_total,
30
- included_tax_total: included_tax_total
29
+ additional_tax_total:,
30
+ included_tax_total:
31
31
  })
32
32
  end
33
33
  end
@@ -7,7 +7,7 @@ module Spree
7
7
  class << self
8
8
  def reimburse(reimbursement, return_items, simulate, created_by:)
9
9
  unpaid_amount = return_items.sum(&:total).round(2, :down)
10
- reimbursement_list, _unpaid_amount = create_credits(reimbursement, unpaid_amount, simulate, created_by: created_by)
10
+ reimbursement_list, _unpaid_amount = create_credits(reimbursement, unpaid_amount, simulate, created_by:)
11
11
  reimbursement_list
12
12
  end
13
13
  end
@@ -21,7 +21,7 @@ module Spree
21
21
  end
22
22
 
23
23
  def create_credits(reimbursement, unpaid_amount, simulate, reimbursement_list = [], created_by:)
24
- credits = [create_credit(reimbursement, unpaid_amount, simulate, created_by: created_by)]
24
+ credits = [create_credit(reimbursement, unpaid_amount, simulate, created_by:)]
25
25
  unpaid_amount -= credits.sum(&:amount)
26
26
  reimbursement_list += credits
27
27
 
@@ -32,8 +32,8 @@ module Spree
32
32
 
33
33
  def create_refund(reimbursement, payment, amount, simulate)
34
34
  refund = reimbursement.refunds.build({
35
- payment: payment,
36
- amount: amount,
35
+ payment:,
36
+ amount:,
37
37
  reason: Spree::RefundReason.return_processing_reason
38
38
  })
39
39
 
@@ -50,8 +50,8 @@ module Spree
50
50
  # If you have multiple methods of crediting a customer, overwrite this method
51
51
  # Must return an array of objects the respond to #description, #display_amount
52
52
  def create_credit(reimbursement, unpaid_amount, simulate, created_by:)
53
- creditable = create_creditable(reimbursement, unpaid_amount, created_by: created_by)
54
- credit = reimbursement.credits.build(creditable: creditable, amount: unpaid_amount)
53
+ creditable = create_creditable(reimbursement, unpaid_amount, created_by:)
54
+ credit = reimbursement.credits.build(creditable:, amount: unpaid_amount)
55
55
  simulate ? credit.readonly! : credit.save!
56
56
  credit
57
57
  end
@@ -61,7 +61,7 @@ module Spree
61
61
  user: reimbursement.order.user,
62
62
  amount: unpaid_amount,
63
63
  category: reimbursement.store_credit_category,
64
- created_by: created_by,
64
+ created_by:,
65
65
  memo: "Refund for uncreditable payments on order #{reimbursement.order.number}",
66
66
  currency: reimbursement.order.currency
67
67
  )
@@ -25,7 +25,7 @@ class Spree::ReimbursementType::StoreCredit < Spree::ReimbursementType
25
25
  unpaid_amount,
26
26
  simulate,
27
27
  reimbursement_list,
28
- created_by: created_by
28
+ created_by:
29
29
  )
30
30
  end
31
31
 
@@ -2,12 +2,17 @@
2
2
 
3
3
  module Spree
4
4
  class ReimbursementType < Spree::Base
5
- include Spree::NamedType
5
+ scope :active, -> { where(active: true) }
6
+ default_scope -> { order(arel_table[:name].lower) }
7
+
8
+ validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
6
9
 
7
10
  ORIGINAL = 'original'
8
11
 
9
12
  has_many :return_items
10
13
 
14
+ self.allowed_ransackable_attributes = %w[name]
15
+
11
16
  # This method will reimburse the return items based on however it child implements it
12
17
  # By default it takes a reimbursement, the return items it needs to reimburse, and if
13
18
  # it is a simulation or a real reimbursement. This should return an array
@@ -4,6 +4,8 @@ module Spree
4
4
  # Models the return of Inventory Units to a Stock Location for an Order.
5
5
  #
6
6
  class ReturnAuthorization < Spree::Base
7
+ include Metadata
8
+
7
9
  belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations, optional: true
8
10
 
9
11
  has_many :return_items, inverse_of: :return_authorization, dependent: :destroy
@@ -27,7 +29,7 @@ module Spree
27
29
  extend DisplayMoney
28
30
  money_methods :amount, :total_excluding_vat
29
31
 
30
- self.whitelisted_ransackable_attributes = ['memo']
32
+ self.allowed_ransackable_attributes = ['memo']
31
33
 
32
34
  def total_excluding_vat
33
35
  return_items.sum(&:total_excluding_vat)