solidus_core 2.4.2 → 2.5.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

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