solidus_core 2.4.2 → 2.5.0.beta1

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 (313) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +1 -5
  3. data/Rakefile +23 -6
  4. data/app/helpers/spree/base_helper.rb +15 -10
  5. data/app/helpers/spree/checkout_helper.rb +1 -1
  6. data/app/helpers/spree/products_helper.rb +2 -2
  7. data/app/mailers/spree/carton_mailer.rb +2 -2
  8. data/app/mailers/spree/order_mailer.rb +4 -4
  9. data/app/mailers/spree/reimbursement_mailer.rb +2 -2
  10. data/app/mailers/spree/test_mailer.rb +1 -1
  11. data/app/models/concerns/spree/adjustment_source.rb +17 -11
  12. data/app/models/concerns/spree/calculated_adjustments.rb +2 -2
  13. data/app/models/spree/ability.rb +1 -1
  14. data/app/models/spree/address.rb +7 -0
  15. data/app/models/spree/adjustment.rb +6 -2
  16. data/app/models/spree/calculator.rb +1 -1
  17. data/app/models/spree/calculator/flexi_rate.rb +1 -0
  18. data/app/models/spree/calculator/free_shipping.rb +2 -0
  19. data/app/models/spree/calculator/percent_on_line_item.rb +6 -6
  20. data/app/models/spree/calculator/percent_per_item.rb +2 -0
  21. data/app/models/spree/calculator/returns/default_refund_amount.rb +4 -4
  22. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -0
  23. data/app/models/spree/calculator/shipping/flat_rate.rb +1 -0
  24. data/app/models/spree/calculator/shipping/flexi_rate.rb +1 -0
  25. data/app/models/spree/calculator/shipping/per_item.rb +1 -0
  26. data/app/models/spree/calculator/shipping/price_sack.rb +1 -0
  27. data/app/models/spree/classification.rb +1 -1
  28. data/app/models/spree/customer_return.rb +1 -1
  29. data/app/models/spree/inventory_unit.rb +8 -2
  30. data/app/models/spree/log_entry.rb +0 -11
  31. data/app/models/spree/order.rb +31 -16
  32. data/app/models/spree/order_contents.rb +0 -14
  33. data/app/models/spree/order_shipping.rb +0 -5
  34. data/app/models/spree/order_updater.rb +0 -4
  35. data/app/models/spree/payment.rb +6 -1
  36. data/app/models/spree/payment/processing.rb +4 -4
  37. data/app/models/spree/payment_method.rb +8 -3
  38. data/app/models/spree/payment_method/credit_card.rb +1 -1
  39. data/app/models/spree/payment_method/store_credit.rb +4 -4
  40. data/app/models/spree/price.rb +7 -1
  41. data/app/models/spree/product.rb +34 -6
  42. data/app/models/spree/product/scopes.rb +2 -2
  43. data/app/models/spree/promotion.rb +1 -2
  44. data/app/models/spree/promotion/actions/create_adjustment.rb +3 -2
  45. data/app/models/spree/promotion/actions/create_item_adjustments.rb +7 -8
  46. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  47. data/app/models/spree/promotion/rules/taxon.rb +25 -24
  48. data/app/models/spree/promotion_action.rb +7 -1
  49. data/app/models/spree/promotion_chooser.rb +1 -1
  50. data/app/models/spree/promotion_code.rb +3 -3
  51. data/app/models/spree/promotion_handler/coupon.rb +8 -29
  52. data/app/models/spree/promotion_rule.rb +1 -1
  53. data/app/models/spree/refund.rb +3 -3
  54. data/app/models/spree/reimbursement.rb +1 -1
  55. data/app/models/spree/return_authorization.rb +2 -2
  56. data/app/models/spree/return_item.rb +3 -3
  57. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +2 -2
  58. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +1 -1
  59. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +1 -1
  60. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +1 -1
  61. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +1 -1
  62. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
  63. data/app/models/spree/shipment.rb +16 -6
  64. data/app/models/spree/shipping_method.rb +7 -0
  65. data/app/models/spree/shipping_rate.rb +6 -6
  66. data/app/models/spree/shipping_rate_tax.rb +2 -2
  67. data/app/models/spree/stock/availability_validator.rb +2 -2
  68. data/app/models/spree/stock/estimator.rb +9 -1
  69. data/app/models/spree/stock/inventory_unit_builder.rb +1 -2
  70. data/app/models/spree/stock/inventory_validator.rb +2 -2
  71. data/app/models/spree/stock/package.rb +1 -1
  72. data/app/models/spree/stock/simple_coordinator.rb +2 -2
  73. data/app/models/spree/stock_item.rb +6 -0
  74. data/app/models/spree/stock_location.rb +2 -2
  75. data/app/models/spree/store_credit.rb +19 -12
  76. data/app/models/spree/store_credit_category.rb +1 -1
  77. data/app/models/spree/store_credit_event.rb +7 -1
  78. data/app/models/spree/tax/shipping_rate_taxer.rb +1 -1
  79. data/app/models/spree/tax_calculator/shipping_rate.rb +12 -3
  80. data/app/models/spree/tax_rate.rb +10 -3
  81. data/app/models/spree/taxon.rb +14 -4
  82. data/app/models/spree/taxonomy.rb +1 -1
  83. data/app/models/spree/unit_cancel.rb +1 -1
  84. data/app/models/spree/variant.rb +33 -1
  85. data/app/models/spree/variant/price_selector.rb +1 -1
  86. data/app/models/spree/variant/pricing_options.rb +1 -1
  87. data/app/models/spree/variant/scopes.rb +1 -1
  88. data/app/models/spree/variant/vat_price_generator.rb +1 -1
  89. data/app/views/spree/carton_mailer/shipped_email.html.erb +6 -6
  90. data/app/views/spree/carton_mailer/shipped_email.text.erb +6 -6
  91. data/app/views/spree/order_mailer/cancel_email.html.erb +5 -5
  92. data/app/views/spree/order_mailer/cancel_email.text.erb +5 -5
  93. data/app/views/spree/order_mailer/confirm_email.html.erb +9 -9
  94. data/app/views/spree/order_mailer/confirm_email.text.erb +9 -9
  95. data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +3 -3
  96. data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +3 -3
  97. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +1 -1
  98. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +1 -1
  99. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +5 -5
  100. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +5 -5
  101. data/app/views/spree/shared/_error_messages.html.erb +2 -2
  102. data/app/views/spree/test_mailer/test_email.html.erb +2 -2
  103. data/app/views/spree/test_mailer/test_email.text.erb +2 -2
  104. data/config/initializers/assets.rb +3 -1
  105. data/config/locales/en.yml +44 -48
  106. data/db/default/spree/store_credit.rb +1 -1
  107. data/db/default/spree/stores.rb +7 -8
  108. data/db/migrate/20160101010000_solidus_one_four.rb +4 -46
  109. data/db/migrate/20170317035819_add_lft_and_rgt_indexes_to_taxons.rb +6 -0
  110. data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +28 -0
  111. data/db/migrate/20170608074534_rename_bogus_gateways.rb +4 -2
  112. data/db/migrate/20170831201542_remove_default_tax_from_spree_zones.rb +1 -1
  113. data/lib/generators/spree/custom_user/custom_user_generator.rb +11 -22
  114. data/lib/generators/spree/install/install_generator.rb +10 -5
  115. data/lib/spree/app_configuration.rb +103 -5
  116. data/lib/spree/core.rb +3 -2
  117. data/lib/spree/core/active_merchant_dependencies.rb +11 -0
  118. data/lib/spree/core/controller_helpers/auth.rb +3 -1
  119. data/lib/spree/core/controller_helpers/common.rb +3 -7
  120. data/lib/spree/core/engine.rb +18 -100
  121. data/lib/spree/core/environment.rb +3 -3
  122. data/lib/spree/core/importer/order.rb +0 -1
  123. data/lib/spree/core/permalinks.rb +9 -15
  124. data/lib/spree/core/product_filters.rb +5 -3
  125. data/lib/spree/core/role_configuration.rb +23 -7
  126. data/lib/spree/core/search/base.rb +16 -13
  127. data/lib/spree/core/version.rb +1 -1
  128. data/lib/spree/paranoia_deprecations.rb +19 -0
  129. data/lib/spree/permission_sets.rb +0 -4
  130. data/lib/spree/permitted_attributes.rb +0 -3
  131. data/lib/spree/preferences/preferable.rb +70 -34
  132. data/lib/spree/preferences/preferable_class_methods.rb +22 -0
  133. data/lib/spree/testing_support/authorization_helpers.rb +2 -0
  134. data/lib/spree/testing_support/common_rake.rb +0 -1
  135. data/lib/spree/testing_support/dummy_app.rb +100 -0
  136. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +10 -0
  137. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +10 -0
  138. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/backend/all.css +9 -0
  139. data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +9 -0
  140. data/lib/spree/testing_support/dummy_app/database.yml +31 -0
  141. data/lib/spree/testing_support/dummy_app/migrations.rb +35 -0
  142. data/lib/spree/testing_support/dummy_app/rake_tasks.rb +60 -0
  143. data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +1 -0
  144. data/lib/spree/testing_support/factories.rb +1 -1
  145. data/lib/spree/testing_support/factories/address_factory.rb +2 -2
  146. data/lib/spree/testing_support/factories/adjustment_factory.rb +2 -2
  147. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
  148. data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
  149. data/lib/spree/testing_support/factories/carton_factory.rb +1 -1
  150. data/lib/spree/testing_support/factories/country_factory.rb +1 -1
  151. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
  152. data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
  153. data/lib/spree/testing_support/factories/image_factory.rb +1 -1
  154. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +13 -4
  155. data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
  156. data/lib/spree/testing_support/factories/option_type_factory.rb +1 -1
  157. data/lib/spree/testing_support/factories/option_value_factory.rb +1 -1
  158. data/lib/spree/testing_support/factories/order_factory.rb +5 -1
  159. data/lib/spree/testing_support/factories/order_promotion_factory.rb +1 -1
  160. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  161. data/lib/spree/testing_support/factories/payment_method_factory.rb +1 -1
  162. data/lib/spree/testing_support/factories/price_factory.rb +1 -1
  163. data/lib/spree/testing_support/factories/product_factory.rb +1 -1
  164. data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
  165. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  166. data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -1
  167. data/lib/spree/testing_support/factories/promotion_code_factory.rb +2 -2
  168. data/lib/spree/testing_support/factories/promotion_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  170. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  171. data/lib/spree/testing_support/factories/refund_reason_factory.rb +1 -1
  172. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  173. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
  174. data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
  175. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  176. data/lib/spree/testing_support/factories/return_reason_factory.rb +1 -1
  177. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  178. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -2
  179. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  180. data/lib/spree/testing_support/factories/shipping_method_factory.rb +2 -2
  181. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +1 -1
  182. data/lib/spree/testing_support/factories/state_factory.rb +1 -7
  183. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  184. data/lib/spree/testing_support/factories/stock_location_factory.rb +1 -1
  185. data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
  186. data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
  187. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
  188. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -1
  189. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  190. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +2 -2
  191. data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +1 -1
  192. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  193. data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -2
  194. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  195. data/lib/spree/testing_support/factories/taxon_factory.rb +1 -1
  196. data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
  197. data/lib/spree/testing_support/factories/user_factory.rb +4 -10
  198. data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
  199. data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +1 -1
  200. data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +1 -1
  201. data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +1 -1
  202. data/lib/spree/testing_support/factories/zone_factory.rb +2 -4
  203. data/lib/spree/testing_support/flash.rb +2 -2
  204. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  205. data/lib/spree/testing_support/preferences.rb +4 -0
  206. data/lib/spree/testing_support/sequences.rb +3 -12
  207. data/solidus_core.gemspec +12 -8
  208. data/spec/helpers/base_helper_spec.rb +19 -3
  209. data/spec/helpers/products_helper_spec.rb +1 -1
  210. data/spec/lib/calculated_adjustments_spec.rb +20 -0
  211. data/spec/lib/i18n_spec.rb +4 -69
  212. data/spec/lib/search/base_spec.rb +1 -0
  213. data/spec/lib/search/variant_spec.rb +4 -4
  214. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +6 -6
  215. data/spec/lib/spree/core/importer/order_spec.rb +2 -2
  216. data/spec/lib/spree/core/role_configuration_spec.rb +6 -9
  217. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +12 -8
  218. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +1 -1
  219. data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +1 -1
  220. data/spec/mailers/carton_mailer_spec.rb +3 -7
  221. data/spec/mailers/order_mailer_spec.rb +7 -11
  222. data/spec/mailers/reimbursement_mailer_spec.rb +1 -5
  223. data/spec/mailers/test_mailer_spec.rb +0 -4
  224. data/spec/models/spree/ability_spec.rb +2 -1
  225. data/spec/models/spree/address_spec.rb +32 -19
  226. data/spec/models/spree/app_configuration_spec.rb +1 -1
  227. data/spec/models/spree/calculator/distributed_amount_spec.rb +1 -1
  228. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +8 -10
  229. data/spec/models/spree/calculator/percent_per_item_spec.rb +4 -4
  230. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +10 -3
  231. data/spec/models/spree/classification_spec.rb +19 -0
  232. data/spec/models/spree/credit_card_spec.rb +1 -1
  233. data/spec/models/spree/customer_return_spec.rb +17 -6
  234. data/spec/models/spree/distributed_amounts_handler_spec.rb +1 -1
  235. data/spec/models/spree/exchange_spec.rb +1 -1
  236. data/spec/models/spree/inventory_unit_spec.rb +3 -7
  237. data/spec/models/spree/line_item_spec.rb +6 -6
  238. data/spec/models/spree/option_value_spec.rb +11 -6
  239. data/spec/models/spree/order/callbacks_spec.rb +2 -2
  240. data/spec/models/spree/order/checkout_spec.rb +31 -31
  241. data/spec/models/spree/order/risk_assessment_spec.rb +9 -9
  242. data/spec/models/spree/order_contents_spec.rb +1 -9
  243. data/spec/models/spree/order_inventory_spec.rb +2 -2
  244. data/spec/models/spree/order_mutex_spec.rb +3 -1
  245. data/spec/models/spree/order_shipping_spec.rb +7 -4
  246. data/spec/models/spree/order_spec.rb +36 -13
  247. data/spec/models/spree/order_taxation_spec.rb +7 -7
  248. data/spec/models/spree/order_updater_spec.rb +6 -4
  249. data/spec/models/spree/payment/cancellation_spec.rb +1 -1
  250. data/spec/models/spree/payment_create_spec.rb +2 -2
  251. data/spec/models/spree/payment_method/store_credit_spec.rb +13 -13
  252. data/spec/models/spree/payment_spec.rb +23 -4
  253. data/spec/models/spree/preferences/preferable_spec.rb +44 -0
  254. data/spec/models/spree/preferences/statically_configurable_spec.rb +1 -0
  255. data/spec/models/spree/price_spec.rb +6 -4
  256. data/spec/models/spree/product/scopes_spec.rb +1 -1
  257. data/spec/models/spree/product_spec.rb +49 -9
  258. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +13 -3
  259. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +146 -134
  260. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +6 -6
  261. data/spec/models/spree/promotion/rules/taxon_spec.rb +14 -14
  262. data/spec/models/spree/promotion_code_spec.rb +31 -19
  263. data/spec/models/spree/promotion_handler/coupon_spec.rb +42 -17
  264. data/spec/models/spree/promotion_handler/shipping_spec.rb +1 -6
  265. data/spec/models/spree/promotion_spec.rb +14 -14
  266. data/spec/models/spree/refund_spec.rb +1 -1
  267. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +1 -1
  268. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +1 -1
  269. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +3 -2
  270. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +1 -1
  271. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +2 -2
  272. data/spec/models/spree/return_item_spec.rb +6 -6
  273. data/spec/models/spree/shipment_spec.rb +14 -10
  274. data/spec/models/spree/shipping_manifest_spec.rb +22 -9
  275. data/spec/models/spree/shipping_method_spec.rb +9 -5
  276. data/spec/models/spree/stock/availability_spec.rb +16 -2
  277. data/spec/models/spree/stock/estimator_spec.rb +11 -12
  278. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -4
  279. data/spec/models/spree/stock/package_spec.rb +3 -2
  280. data/spec/models/spree/stock/simple_coordinator_spec.rb +1 -24
  281. data/spec/models/spree/stock_item_spec.rb +6 -6
  282. data/spec/models/spree/stock_location_spec.rb +16 -3
  283. data/spec/models/spree/store_credit_spec.rb +12 -6
  284. data/spec/models/spree/tax/taxation_integration_spec.rb +6 -6
  285. data/spec/models/spree/tax_calculator/default_spec.rb +7 -7
  286. data/spec/models/spree/taxon_spec.rb +42 -19
  287. data/spec/models/spree/variant/vat_price_generator_spec.rb +1 -1
  288. data/spec/models/spree/variant_spec.rb +69 -11
  289. data/spec/rails_helper.rb +7 -13
  290. data/spec/spec_helper.rb +3 -12
  291. data/spec/support/concerns/default_price.rb +1 -1
  292. data/spec/support/dummy_ability.rb +2 -0
  293. metadata +144 -73
  294. data/Gemfile +0 -3
  295. data/app/models/spree/order_stock_location.rb +0 -15
  296. data/app/models/spree/stock_transfer.rb +0 -110
  297. data/app/models/spree/transfer_item.rb +0 -54
  298. data/lib/generators/spree/custom_user/templates/initializer.rb.tt +0 -1
  299. data/lib/spree/permission_sets/restricted_stock_transfer_display.rb +0 -17
  300. data/lib/spree/permission_sets/restricted_stock_transfer_management.rb +0 -52
  301. data/lib/spree/permission_sets/stock_transfer_display.rb +0 -10
  302. data/lib/spree/permission_sets/stock_transfer_management.rb +0 -11
  303. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +0 -28
  304. data/lib/spree/testing_support/i18n.rb +0 -97
  305. data/spec/lib/spree/core/testing_support/factories/stock_transfer_factory_spec.rb +0 -12
  306. data/spec/models/spree/order_stock_location_spec.rb +0 -18
  307. data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +0 -49
  308. data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +0 -218
  309. data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +0 -23
  310. data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +0 -23
  311. data/spec/models/spree/stock_transfer_spec.rb +0 -308
  312. data/spec/models/spree/transfer_item_spec.rb +0 -275
  313. data/spec/support/test_gateway.rb +0 -2
@@ -172,7 +172,7 @@ module Spree
172
172
  end
173
173
 
174
174
  scope :with_master_price, -> do
175
- joins(:master).where(Spree::Price.where(Spree::Variant.arel_table[:id].eq(Spree::Price.arel_table[:variant_id])).exists)
175
+ joins(:master).where(Spree::Price.where(Spree::Variant.arel_table[:id].eq(Spree::Price.arel_table[:variant_id])).arel.exists)
176
176
  end
177
177
 
178
178
  # Can't use add_search_scope for this as it needs a default argument
@@ -189,7 +189,7 @@ module Spree
189
189
  sku_match = "%#{sku}%"
190
190
  variant_table = Spree::Variant.arel_table
191
191
  subquery = Spree::Variant.where(variant_table[:sku].matches(sku_match).and(variant_table[:product_id].eq(arel_table[:id])))
192
- where(subquery.exists)
192
+ where(subquery.arel.exists)
193
193
  end
194
194
 
195
195
  def self.distinct_by_product_ids(sort_order = nil)
@@ -237,8 +237,7 @@ module Spree
237
237
  when Spree::LineItem
238
238
  !promotable.product.promotionable?
239
239
  when Spree::Order
240
- promotable.line_items.any? &&
241
- promotable.line_items.joins(:product).where(spree_products: { promotionable: false }).any?
240
+ promotable.line_items.joins(:product).where(spree_products: { promotionable: false }).exists?
242
241
  end
243
242
  end
244
243
 
@@ -10,7 +10,8 @@ module Spree
10
10
  delegate :eligible?, to: :promotion
11
11
 
12
12
  before_validation :ensure_action_has_calculator
13
- before_destroy :deals_with_adjustments_for_deleted_source
13
+ before_destroy :remove_adjustments_from_incomplete_orders
14
+ before_discard :remove_adjustments_from_incomplete_orders
14
15
 
15
16
  # Creates the adjustment related to a promotion for the order passed
16
17
  # through options hash
@@ -27,7 +28,7 @@ module Spree
27
28
  order: order,
28
29
  source: self,
29
30
  promotion_code: options[:promotion_code],
30
- label: Spree.t('adjustment_labels.order', promotion: Spree::Promotion.model_name.human, promotion_name: promotion.name)
31
+ label: I18n.t('spree.adjustment_labels.order', promotion: Spree::Promotion.model_name.human, promotion_name: promotion.name)
31
32
  )
32
33
  true
33
34
  end
@@ -10,20 +10,19 @@ module Spree
10
10
  delegate :eligible?, to: :promotion
11
11
 
12
12
  before_validation :ensure_action_has_calculator
13
- before_destroy :deals_with_adjustments_for_deleted_source
13
+ before_destroy :remove_adjustments_from_incomplete_orders
14
+ before_discard :remove_adjustments_from_incomplete_orders
14
15
 
15
16
  def perform(payload = {})
16
17
  order = payload[:order]
17
18
  promotion = payload[:promotion]
18
19
  promotion_code = payload[:promotion_code]
19
20
 
20
- result = false
21
-
22
- line_items_to_adjust(promotion, order).each do |line_item|
23
- current_result = create_adjustment(line_item, order, promotion_code)
24
- result ||= current_result
21
+ results = line_items_to_adjust(promotion, order).map do |line_item|
22
+ create_adjustment(line_item, order, promotion_code)
25
23
  end
26
- result
24
+
25
+ results.any?
27
26
  end
28
27
 
29
28
  # Ensure a negative amount which does not exceed the sum of the order's
@@ -64,7 +63,7 @@ module Spree
64
63
  amount: amount,
65
64
  order: order,
66
65
  promotion_code: promotion_code,
67
- label: Spree.t('adjustment_labels.line_item', promotion: Spree::Promotion.model_name.human, promotion_name: promotion.name)
66
+ label: I18n.t('spree.adjustment_labels.line_item', promotion: Spree::Promotion.model_name.human, promotion_name: promotion.name)
68
67
  )
69
68
  true
70
69
  end
@@ -23,7 +23,7 @@ module Spree
23
23
  end
24
24
 
25
25
  def label
26
- "#{Spree.t(:promotion)} (#{promotion.name})"
26
+ "#{I18n.t('spree.promotion')} (#{promotion.name})"
27
27
  end
28
28
 
29
29
  def compute_amount(shipment)
@@ -16,25 +16,29 @@ module Spree
16
16
  end
17
17
 
18
18
  def eligible?(order, _options = {})
19
- order_taxons = taxons_in_order_including_parents(order)
19
+ order_taxons = taxons_in_order(order)
20
20
 
21
21
  case preferred_match_policy
22
22
  when 'all'
23
- unless (taxons.to_a - order_taxons).empty?
23
+ matches_all = taxons.all? do |rule_taxon|
24
+ order_taxons.where(id: rule_taxon.self_and_descendants.ids).exists?
25
+ end
26
+
27
+ unless matches_all
24
28
  eligibility_errors.add(:base, eligibility_error_message(:missing_taxon))
25
29
  end
26
30
  when 'any'
27
- unless taxons.any?{ |taxon| order_taxons.include? taxon }
31
+ unless order_taxons.where(id: rule_taxon_ids_with_children).exists?
28
32
  eligibility_errors.add(:base, eligibility_error_message(:no_matching_taxons))
29
33
  end
30
34
  when 'none'
31
- unless taxons.none?{ |taxon| order_taxons.include? taxon }
35
+ if order_taxons.where(id: rule_taxon_ids_with_children).exists?
32
36
  eligibility_errors.add(:base, eligibility_error_message(:has_excluded_taxon))
33
37
  end
34
38
  else
35
39
  # Change this to an exception in a future version of Solidus
36
40
  warn_invalid_match_policy(assume: 'any')
37
- unless taxons.any? { |taxon| order_taxons.include? taxon }
41
+ unless order_taxons.where(id: rule_taxon_ids_with_children).exists?
38
42
  eligibility_errors.add(:base, eligibility_error_message(:no_matching_taxons))
39
43
  end
40
44
  end
@@ -42,16 +46,24 @@ module Spree
42
46
  eligibility_errors.empty?
43
47
  end
44
48
 
49
+ # TODO: Fix bug - well described by jhawthorn in #1409:
50
+ # `eligible?` checks the configured taxons and all descendants,
51
+ # `actionable?` only seems to check against the taxons themselves (not children)
45
52
  def actionable?(line_item)
53
+ found = Spree::Classification.where(
54
+ product_id: line_item.variant.product_id,
55
+ taxon_id: taxon_ids
56
+ ).exists?
57
+
46
58
  case preferred_match_policy
47
59
  when 'any', 'all'
48
- taxon_product_ids.include?(line_item.variant.product_id)
60
+ found
49
61
  when 'none'
50
- taxon_product_ids.exclude? line_item.variant.product_id
62
+ !found
51
63
  else
52
64
  # Change this to an exception in a future version of Solidus
53
65
  warn_invalid_match_policy(assume: 'any')
54
- taxon_product_ids.include?(line_item.variant.product_id)
66
+ found
55
67
  end
56
68
  end
57
69
 
@@ -74,27 +86,16 @@ module Spree
74
86
  end
75
87
 
76
88
  # All taxons in an order
77
- def order_taxons(order)
78
- Spree::Taxon.joins(products: { variants_including_master: :line_items }).where(spree_line_items: { order_id: order.id }).distinct
89
+ def taxons_in_order(order)
90
+ Spree::Taxon.joins(products: { variants_including_master: :line_items })
91
+ .where(spree_line_items: { order_id: order.id }).distinct
79
92
  end
80
93
 
81
94
  # ids of taxons rules and taxons rules children
82
- def taxons_including_children_ids
83
- taxons.flat_map { |taxon| taxon.self_and_descendants.ids }
84
- end
85
-
86
- # taxons order vs taxons rules and taxons rules children
87
- def order_taxons_in_taxons_and_children(order)
88
- order_taxons(order).where(id: taxons_including_children_ids)
89
- end
90
-
91
- def taxons_in_order_including_parents(order)
92
- order_taxons_in_taxons_and_children(order).flat_map(&:self_and_ancestors).uniq
95
+ def rule_taxon_ids_with_children
96
+ taxons.flat_map { |taxon| taxon.self_and_descendants.ids }.uniq
93
97
  end
94
98
 
95
- def taxon_product_ids
96
- Spree::Product.joins(:taxons).where(spree_taxons: { id: taxons.pluck(:id) }).pluck(:id).uniq
97
- end
98
99
  end
99
100
  end
100
101
  end
@@ -1,3 +1,5 @@
1
+ require 'discard'
2
+
1
3
  module Spree
2
4
  # Base class for all types of promotion action.
3
5
  #
@@ -5,11 +7,15 @@ module Spree
5
7
  # by an event and determined to be eligible.
6
8
  class PromotionAction < Spree::Base
7
9
  acts_as_paranoid
10
+ include Spree::ParanoiaDeprecations
11
+
12
+ include Discard::Model
13
+ self.discard_column = :deleted_at
8
14
 
9
15
  belongs_to :promotion, class_name: 'Spree::Promotion', inverse_of: :promotion_actions
10
16
 
11
17
  scope :of_type, ->(t) { where(type: Array.wrap(t).map(&:to_s)) }
12
- scope :shipping, -> { of_type(Rails.application.config.spree.promotions.shipping_actions.to_a) }
18
+ scope :shipping, -> { of_type(Spree::Config.environment.promotions.shipping_actions.to_a) }
13
19
 
14
20
  # Updates the state of the order or performs some other action depending on
15
21
  # the subclass options will contain the payload from the event that
@@ -12,7 +12,7 @@ module Spree
12
12
  if best_promotion_adjustment
13
13
  @adjustments.select(&:eligible?).each do |adjustment|
14
14
  next if adjustment == best_promotion_adjustment
15
- adjustment.update_columns(eligible: false)
15
+ adjustment.update_columns(eligible: false, updated_at: Time.current)
16
16
  end
17
17
  best_promotion_adjustment.amount
18
18
  else
@@ -6,7 +6,7 @@ class Spree::PromotionCode < Spree::Base
6
6
  validates :value, presence: true, uniqueness: { allow_blank: true }
7
7
  validates :promotion, presence: true
8
8
 
9
- before_save :downcase_value
9
+ before_save :normalize_code
10
10
 
11
11
  self.whitelisted_ransackable_attributes = ['value']
12
12
 
@@ -36,7 +36,7 @@ class Spree::PromotionCode < Spree::Base
36
36
 
37
37
  private
38
38
 
39
- def downcase_value
40
- self.value = value.downcase
39
+ def normalize_code
40
+ self.value = value.downcase.strip
41
41
  end
42
42
  end
@@ -1,15 +1,16 @@
1
1
  module Spree
2
2
  module PromotionHandler
3
3
  class Coupon
4
- attr_reader :order
4
+ attr_reader :order, :coupon_code
5
5
  attr_accessor :error, :success, :status_code
6
6
 
7
7
  def initialize(order)
8
8
  @order = order
9
+ @coupon_code = order.coupon_code && order.coupon_code.downcase
9
10
  end
10
11
 
11
12
  def apply
12
- if order.coupon_code.present?
13
+ if coupon_code.present?
13
14
  if promotion.present? && promotion.actions.exists?
14
15
  handle_present_promotion(promotion)
15
16
  elsif promotion_code && promotion_code.promotion.inactive?
@@ -24,12 +25,12 @@ module Spree
24
25
 
25
26
  def set_success_code(c)
26
27
  @status_code = c
27
- @success = Spree.t(c)
28
+ @success = I18n.t(c, scope: 'spree')
28
29
  end
29
30
 
30
31
  def set_error_code(c)
31
32
  @status_code = c
32
- @error = Spree.t(c)
33
+ @error = I18n.t(c, scope: 'spree')
33
34
  end
34
35
 
35
36
  def promotion
@@ -47,7 +48,7 @@ module Spree
47
48
  private
48
49
 
49
50
  def promotion_code
50
- @promotion_code ||= Spree::PromotionCode.where(value: order.coupon_code.downcase).first
51
+ @promotion_code ||= Spree::PromotionCode.where(value: coupon_code).first
51
52
  end
52
53
 
53
54
  def handle_present_promotion(promotion)
@@ -62,7 +63,8 @@ module Spree
62
63
  # then result here will also be `true`.
63
64
  result = promotion.activate(order: order, promotion_code: promotion_code)
64
65
  if result
65
- determine_promotion_application_result
66
+ order.recalculate
67
+ set_success_code :coupon_code_applied
66
68
  else
67
69
  set_error_code :coupon_code_unknown_error
68
70
  end
@@ -83,29 +85,6 @@ module Spree
83
85
  def promotion_exists_on_order?(order, promotion)
84
86
  order.promotions.include? promotion
85
87
  end
86
-
87
- def determine_promotion_application_result
88
- detector = lambda { |p|
89
- p.source.promotion.codes.where(value: order.coupon_code.downcase).any?
90
- }
91
-
92
- # Check for applied adjustments.
93
- discount = order.line_item_adjustments.promotion.detect(&detector)
94
- discount ||= order.shipment_adjustments.promotion.detect(&detector)
95
- discount ||= order.adjustments.promotion.detect(&detector)
96
-
97
- if discount && discount.eligible
98
- order.recalculate
99
- set_success_code :coupon_code_applied
100
- elsif order.promotions.with_coupon_code(order.coupon_code)
101
- # if the promotion exists on an order, but wasn't found above,
102
- # we've already selected a better promotion
103
- set_error_code :coupon_code_better_exists
104
- else
105
- # if the promotion was created after the order
106
- set_error_code :coupon_code_not_found
107
- end
108
- end
109
88
  end
110
89
  end
111
90
  end
@@ -43,7 +43,7 @@ module Spree
43
43
  end
44
44
 
45
45
  def eligibility_error_message(key, options = {})
46
- Spree.t(key, Hash[scope: [:eligibility_errors, :messages]].merge(options))
46
+ I18n.t(key, { scope: [:spree, :eligibility_errors, :messages] }.merge(options))
47
47
  end
48
48
  end
49
49
  end
@@ -60,15 +60,15 @@ module Spree
60
60
  end
61
61
 
62
62
  if !response.success?
63
- logger.error(Spree.t(:gateway_error) + " #{response.to_yaml}")
63
+ logger.error(I18n.t('spree.gateway_error') + " #{response.to_yaml}")
64
64
  text = response.params['message'] || response.params['response_reason_text'] || response.message
65
65
  raise Core::GatewayError.new(text)
66
66
  end
67
67
 
68
68
  response
69
69
  rescue ActiveMerchant::ConnectionError => e
70
- logger.error(Spree.t(:gateway_error) + " #{e.inspect}")
71
- raise Core::GatewayError.new(Spree.t(:unable_to_connect_to_gateway))
70
+ logger.error(I18n.t('spree.gateway_error') + " #{e.inspect}")
71
+ raise Core::GatewayError.new(I18n.t('spree.unable_to_connect_to_gateway'))
72
72
  end
73
73
 
74
74
  def create_log_entry
@@ -110,7 +110,7 @@ module Spree
110
110
  else
111
111
  errored!
112
112
  reimbursement_failure_hooks.each { |h| h.call self }
113
- raise IncompleteReimbursementError, Spree.t("validation.unpaid_amount_not_zero", amount: unpaid_amount)
113
+ raise IncompleteReimbursementError, I18n.t("spree.validation.unpaid_amount_not_zero", amount: unpaid_amount)
114
114
  end
115
115
  end
116
116
 
@@ -64,7 +64,7 @@ module Spree
64
64
 
65
65
  def must_have_shipped_units
66
66
  if order.nil? || order.inventory_units.shipped.none?
67
- errors.add(:order, Spree.t(:has_no_shipped_units))
67
+ errors.add(:order, I18n.t('spree.has_no_shipped_units'))
68
68
  end
69
69
  end
70
70
 
@@ -77,7 +77,7 @@ module Spree
77
77
 
78
78
  def no_previously_exchanged_inventory_units
79
79
  if return_items.map(&:inventory_unit).any?(&:exchange_requested?)
80
- errors.add(:base, Spree.t(:return_items_cannot_be_created_for_inventory_units_that_are_already_awaiting_exchange))
80
+ errors.add(:base, I18n.t('spree.return_items_cannot_be_created_for_inventory_units_that_are_already_awaiting_exchange'))
81
81
  end
82
82
  end
83
83
 
@@ -184,7 +184,7 @@ module Spree
184
184
  # for pricing information for if the inventory unit is
185
185
  # ever returned. This means that the inventory unit's line_item
186
186
  # will have a different variant than the inventory unit itself
187
- super(variant: exchange_variant, line_item: inventory_unit.line_item, order: inventory_unit.order) if exchange_required?
187
+ super(variant: exchange_variant, line_item: inventory_unit.line_item) if exchange_required?
188
188
  end
189
189
 
190
190
  # @return [Spree::Shipment, nil] the exchange inventory unit's shipment if it exists
@@ -262,14 +262,14 @@ module Spree
262
262
  return unless customer_return && inventory_unit
263
263
 
264
264
  if customer_return.order_id != inventory_unit.order_id
265
- errors.add(:base, Spree.t(:return_items_cannot_be_associated_with_multiple_orders))
265
+ errors.add(:base, I18n.t('spree.return_items_cannot_be_associated_with_multiple_orders'))
266
266
  end
267
267
  end
268
268
 
269
269
  def eligible_exchange_variant
270
270
  return unless exchange_variant && exchange_variant_id_changed?
271
271
  unless eligible_exchange_variants.include?(exchange_variant)
272
- errors.add(:base, Spree.t(:invalid_exchange_variant))
272
+ errors.add(:base, I18n.t('spree.invalid_exchange_variant'))
273
273
  end
274
274
  end
275
275
 
@@ -10,11 +10,11 @@ module Spree
10
10
  end
11
11
 
12
12
  def eligible_for_return?
13
- raise NotImplementedError, Spree.t(:implement_eligible_for_return)
13
+ raise NotImplementedError, I18n.t('spree.implement_eligible_for_return')
14
14
  end
15
15
 
16
16
  def requires_manual_intervention?
17
- raise NotImplementedError, Spree.t(:implement_requires_manual_intervention)
17
+ raise NotImplementedError, I18n.t('spree.implement_requires_manual_intervention')
18
18
  end
19
19
 
20
20
  private
@@ -6,7 +6,7 @@ module Spree
6
6
  if @return_item.inventory_unit.shipped?
7
7
  return true
8
8
  else
9
- add_error(:inventory_unit_shipped, Spree.t('return_item_inventory_unit_ineligible'))
9
+ add_error(:inventory_unit_shipped, I18n.t('spree.return_item_inventory_unit_ineligible'))
10
10
  return false
11
11
  end
12
12
  end
@@ -5,7 +5,7 @@ module Spree
5
5
 
6
6
  def eligible_for_return?
7
7
  if @return_item.inventory_unit.return_items.reimbursed.valid.any?
8
- add_error(:inventory_unit_reimbursed, Spree.t('return_item_inventory_unit_reimbursed'))
8
+ add_error(:inventory_unit_reimbursed, I18n.t('spree.return_item_inventory_unit_reimbursed'))
9
9
  return false
10
10
  else
11
11
  return true