spree_core 3.0.9 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/{spree.js.coffee.erb → spree.js.coffee} +13 -4
  3. data/app/helpers/spree/base_helper.rb +5 -2
  4. data/app/helpers/spree/products_helper.rb +37 -12
  5. data/app/mailers/spree/base_mailer.rb +11 -2
  6. data/app/mailers/spree/reimbursement_mailer.rb +6 -6
  7. data/app/models/concerns/spree/acts_as_taggable.rb +11 -0
  8. data/app/models/concerns/spree/adjustment_source.rb +3 -10
  9. data/app/models/concerns/spree/default_price.rb +7 -1
  10. data/app/models/concerns/spree/named_type.rb +1 -1
  11. data/app/models/concerns/spree/ransackable_attributes.rb +6 -1
  12. data/app/models/concerns/spree/user_api_authentication.rb +7 -1
  13. data/app/models/concerns/spree/user_methods.rb +57 -0
  14. data/app/models/concerns/spree/user_reporting.rb +2 -2
  15. data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
  16. data/app/models/spree/ability.rb +9 -1
  17. data/app/models/spree/address.rb +75 -45
  18. data/app/models/spree/adjustable/adjuster/base.rb +25 -0
  19. data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
  20. data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
  21. data/app/models/spree/adjustable/adjustments_updater.rb +22 -45
  22. data/app/models/spree/adjustment.rb +8 -10
  23. data/app/models/spree/app_configuration.rb +14 -8
  24. data/app/models/spree/base.rb +5 -1
  25. data/app/models/spree/calculator/default_tax.rb +2 -10
  26. data/app/models/spree/calculator/free_shipping.rb +6 -5
  27. data/app/models/spree/calculator.rb +1 -6
  28. data/app/models/spree/classification.rb +7 -3
  29. data/app/models/spree/country.rb +15 -3
  30. data/app/models/spree/credit_card.rb +37 -38
  31. data/app/models/spree/customer_return.rb +7 -15
  32. data/app/models/spree/gateway/bogus.rb +12 -12
  33. data/app/models/spree/gateway/bogus_simple.rb +4 -4
  34. data/app/models/spree/gateway.rb +8 -7
  35. data/app/models/spree/image.rb +3 -3
  36. data/app/models/spree/inventory_unit.rb +13 -14
  37. data/app/models/spree/legacy_user.rb +1 -14
  38. data/app/models/spree/line_item.rb +79 -67
  39. data/app/models/spree/log_entry.rb +1 -4
  40. data/app/models/spree/option_type.rb +15 -6
  41. data/app/models/spree/option_type_prototype.rb +9 -0
  42. data/app/models/spree/option_value.rb +11 -3
  43. data/app/models/spree/option_value_variant.rb +6 -0
  44. data/app/models/spree/order/checkout.rb +10 -13
  45. data/app/models/spree/order/currency_updater.rb +1 -1
  46. data/app/models/spree/order/store_credit.rb +96 -0
  47. data/app/models/spree/order.rb +105 -68
  48. data/app/models/spree/order_contents.rb +13 -7
  49. data/app/models/spree/order_inventory.rb +16 -9
  50. data/app/models/spree/order_promotion.rb +6 -0
  51. data/app/models/spree/order_updater.rb +4 -8
  52. data/app/models/spree/payment/gateway_options.rb +8 -4
  53. data/app/models/spree/payment/processing.rb +1 -1
  54. data/app/models/spree/payment.rb +55 -29
  55. data/app/models/spree/payment_method/store_credit.rb +130 -0
  56. data/app/models/spree/payment_method.rb +18 -13
  57. data/app/models/spree/preference.rb +1 -1
  58. data/app/models/spree/preferences/store.rb +2 -2
  59. data/app/models/spree/price.rb +16 -6
  60. data/app/models/spree/product/scopes.rb +22 -13
  61. data/app/models/spree/product.rb +83 -52
  62. data/app/models/spree/product_option_type.rb +7 -2
  63. data/app/models/spree/product_promotion_rule.rb +9 -0
  64. data/app/models/spree/product_property.rb +9 -10
  65. data/app/models/spree/promotion/actions/create_adjustment.rb +1 -1
  66. data/app/models/spree/promotion/actions/create_line_items.rb +21 -3
  67. data/app/models/spree/promotion/rules/country.rb +23 -0
  68. data/app/models/spree/promotion/rules/option_value.rb +13 -10
  69. data/app/models/spree/promotion/rules/product.rb +3 -1
  70. data/app/models/spree/promotion/rules/taxon.rb +3 -2
  71. data/app/models/spree/promotion/rules/user.rb +4 -4
  72. data/app/models/spree/promotion.rb +55 -19
  73. data/app/models/spree/promotion_action.rb +3 -3
  74. data/app/models/spree/promotion_category.rb +1 -1
  75. data/app/models/spree/promotion_handler/cart.rb +3 -17
  76. data/app/models/spree/promotion_handler/coupon.rb +22 -22
  77. data/app/models/spree/promotion_handler/page.rb +2 -2
  78. data/app/models/spree/promotion_rule_taxon.rb +9 -0
  79. data/app/models/spree/promotion_rule_user.rb +9 -0
  80. data/app/models/spree/property.rb +2 -1
  81. data/app/models/spree/property_prototype.rb +9 -0
  82. data/app/models/spree/prototype.rb +8 -3
  83. data/app/models/spree/prototype_taxon.rb +9 -0
  84. data/app/models/spree/refund.rb +10 -7
  85. data/app/models/spree/refund_reason.rb +2 -2
  86. data/app/models/spree/reimbursement.rb +12 -16
  87. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +23 -6
  88. data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
  89. data/app/models/spree/reimbursement_type.rb +5 -1
  90. data/app/models/spree/return_authorization.rb +8 -13
  91. data/app/models/spree/return_authorization_reason.rb +1 -1
  92. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
  93. data/app/models/spree/return_item.rb +14 -13
  94. data/app/models/spree/role.rb +3 -2
  95. data/app/models/spree/role_user.rb +6 -0
  96. data/app/models/spree/shipment.rb +23 -30
  97. data/app/models/spree/shipment_handler.rb +2 -2
  98. data/app/models/spree/shipping_category.rb +6 -3
  99. data/app/models/spree/shipping_method.rb +12 -11
  100. data/app/models/spree/shipping_method_zone.rb +6 -0
  101. data/app/models/spree/shipping_rate.rb +16 -29
  102. data/app/models/spree/state.rb +3 -2
  103. data/app/models/spree/state_change.rb +1 -1
  104. data/app/models/spree/stock/adjuster.rb +9 -2
  105. data/app/models/spree/stock/content_item.rb +10 -12
  106. data/app/models/spree/stock/coordinator.rb +21 -15
  107. data/app/models/spree/stock/estimator.rb +28 -30
  108. data/app/models/spree/stock/inventory_unit_builder.rb +2 -10
  109. data/app/models/spree/stock/package.rb +11 -3
  110. data/app/models/spree/stock/packer.rb +16 -6
  111. data/app/models/spree/stock/prioritizer.rb +25 -15
  112. data/app/models/spree/stock/quantifier.rb +5 -5
  113. data/app/models/spree/stock/splitter/backordered.rb +2 -2
  114. data/app/models/spree/stock/splitter/shipping_category.rb +6 -1
  115. data/app/models/spree/stock_item.rb +15 -18
  116. data/app/models/spree/stock_location.rb +4 -7
  117. data/app/models/spree/stock_movement.rb +16 -9
  118. data/app/models/spree/stock_transfer.rb +11 -12
  119. data/app/models/spree/store.rb +15 -6
  120. data/app/models/spree/store_credit.rb +252 -0
  121. data/app/models/spree/store_credit_category.rb +22 -0
  122. data/app/models/spree/store_credit_event.rb +38 -0
  123. data/app/models/spree/store_credit_type.rb +6 -0
  124. data/app/models/spree/tag.rb +4 -0
  125. data/app/models/spree/tax_category.rb +3 -8
  126. data/app/models/spree/tax_rate.rb +61 -121
  127. data/app/models/spree/taxon.rb +12 -6
  128. data/app/models/spree/tracker.rb +12 -1
  129. data/app/models/spree/validations/db_maximum_length_validator.rb +2 -1
  130. data/app/models/spree/variant.rb +94 -49
  131. data/app/models/spree/zone.rb +23 -19
  132. data/app/models/spree/zone_member.rb +6 -0
  133. data/app/validators/db_maximum_length_validator.rb +11 -0
  134. data/app/views/layouts/spree/base_mailer.html.erb +38 -781
  135. data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
  136. data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
  137. data/app/views/spree/order_mailer/_total.html.erb +8 -0
  138. data/app/views/spree/order_mailer/cancel_email.html.erb +13 -28
  139. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  140. data/app/views/spree/order_mailer/confirm_email.html.erb +49 -63
  141. data/app/views/spree/order_mailer/confirm_email.text.erb +1 -1
  142. data/app/views/spree/shared/_base_mailer_header.html.erb +5 -7
  143. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
  144. data/app/views/spree/shared/_error_messages.html.erb +1 -1
  145. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  146. data/app/views/spree/shared/_paths.html.erb +8 -0
  147. data/app/views/spree/shipment_mailer/shipped_email.html.erb +21 -14
  148. data/app/views/spree/shipment_mailer/shipped_email.text.erb +3 -3
  149. data/config/initializers/acts_as_taggable_on.rb +9 -0
  150. data/config/initializers/friendly_id.rb +0 -81
  151. data/config/initializers/user_class_extensions.rb +7 -38
  152. data/config/locales/en.yml +137 -12
  153. data/config/routes.rb +7 -0
  154. data/db/default/spree/countries.rb +5 -1
  155. data/db/default/spree/default_reimbursement_type.rb +1 -1
  156. data/db/default/spree/roles.rb +2 -2
  157. data/db/default/spree/states.rb +1 -1
  158. data/db/default/spree/zones.rb +4 -5
  159. data/db/migrate/20120831092320_spree_one_two.rb +101 -101
  160. data/db/migrate/20120831092359_spree_promo_one_two.rb +14 -14
  161. data/db/migrate/20120905145253_add_tax_rate_label.rb +1 -1
  162. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +2 -2
  163. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +4 -4
  164. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +2 -2
  165. data/db/migrate/20121010142909_add_states_required_to_countries.rb +2 -2
  166. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +3 -3
  167. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +5 -5
  168. data/db/migrate/20121031162139_split_prices_from_variants.rb +10 -10
  169. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +3 -3
  170. data/db/migrate/20121107184631_add_currency_to_line_items.rb +1 -1
  171. data/db/migrate/20121107194006_add_currency_to_orders.rb +1 -1
  172. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +2 -2
  173. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +1 -1
  174. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +2 -2
  175. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +1 -1
  176. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +1 -1
  177. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +1 -1
  178. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +2 -2
  179. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +1 -1
  180. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +1 -1
  181. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +1 -1
  182. data/db/migrate/20130211190146_create_spree_stock_items.rb +2 -2
  183. data/db/migrate/20130211191120_create_spree_stock_locations.rb +1 -1
  184. data/db/migrate/20130213191427_create_default_stock.rb +1 -2
  185. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +1 -1
  186. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +2 -2
  187. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +1 -1
  188. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +3 -3
  189. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +1 -1
  190. data/db/migrate/20130228210442_create_shipping_method_zone.rb +3 -3
  191. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +1 -1
  192. data/db/migrate/20130301162924_create_shipping_method_categories.rb +3 -3
  193. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +1 -1
  194. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +5 -5
  195. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +1 -1
  196. data/db/migrate/20130305143310_create_stock_movements.rb +1 -1
  197. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +3 -3
  198. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +2 -2
  199. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +2 -2
  200. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +2 -2
  201. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +1 -1
  202. data/db/migrate/20130319062004_change_orders_total_precision.rb +5 -5
  203. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +2 -2
  204. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -2
  205. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +2 -2
  206. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +1 -1
  207. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +3 -3
  208. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +3 -3
  209. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  210. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +1 -1
  211. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +1 -1
  212. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +1 -1
  213. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +1 -1
  214. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +2 -2
  215. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +1 -1
  216. data/db/migrate/20130417120035_update_adjustment_states.rb +3 -3
  217. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +4 -4
  218. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +1 -1
  219. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +1 -1
  220. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +1 -1
  221. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
  222. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +1 -1
  223. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +1 -1
  224. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +1 -1
  225. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +1 -1
  226. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +1 -1
  227. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +1 -1
  228. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +1 -1
  229. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +1 -1
  230. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +2 -2
  231. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +4 -4
  232. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +1 -1
  233. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +1 -1
  234. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +2 -2
  235. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +3 -3
  236. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +1 -1
  237. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +1 -1
  238. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +1 -1
  239. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +1 -1
  240. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +1 -1
  241. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +1 -1
  242. data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -4
  243. data/db/migrate/20130807024302_rename_adjustment_fields.rb +1 -1
  244. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +1 -1
  245. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +1 -1
  246. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +2 -2
  247. data/db/migrate/20130813140619_expand_order_number_size.rb +3 -3
  248. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +1 -1
  249. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +2 -2
  250. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +2 -2
  251. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
  252. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +2 -2
  253. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +2 -2
  254. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
  255. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +1 -1
  256. data/db/migrate/20130909115621_change_states_required_for_countries.rb +1 -1
  257. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +1 -1
  258. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +2 -2
  259. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +1 -1
  260. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +2 -2
  261. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +2 -2
  262. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +1 -1
  263. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +1 -1
  264. data/db/migrate/20131118043959_add_included_to_adjustments.rb +2 -2
  265. data/db/migrate/20131118050234_rename_tax_total_fields.rb +1 -1
  266. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +1 -1
  267. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +1 -1
  268. data/db/migrate/20131127001002_add_position_to_classifications.rb +1 -1
  269. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +2 -2
  270. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +1 -1
  271. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +2 -2
  272. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -1
  273. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +1 -1
  274. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +1 -1
  275. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +1 -1
  276. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +1 -1
  277. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +1 -1
  278. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +1 -1
  279. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +1 -1
  280. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +1 -1
  281. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +1 -1
  282. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +1 -1
  283. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +1 -1
  284. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +1 -1
  285. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +1 -1
  286. data/db/migrate/20140213184916_add_more_indexes.rb +1 -1
  287. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +2 -2
  288. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +1 -1
  289. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +1 -1
  290. data/db/migrate/20140309023735_migrate_old_preferences.rb +1 -1
  291. data/db/migrate/20140309024355_create_spree_stores.rb +2 -2
  292. data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
  293. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +1 -1
  294. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +1 -1
  295. data/db/migrate/20140331100557_add_additional_store_fields.rb +1 -1
  296. data/db/migrate/20140410141842_add_many_missing_indexes.rb +1 -1
  297. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +1 -1
  298. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +1 -1
  299. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +5 -5
  300. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +1 -1
  301. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +2 -2
  302. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +1 -1
  303. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +1 -1
  304. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +1 -1
  305. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +1 -1
  306. data/db/migrate/20140625214618_create_spree_refunds.rb +1 -1
  307. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +1 -1
  308. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +1 -1
  309. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +1 -1
  310. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +2 -2
  311. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +1 -1
  312. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +1 -1
  313. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +1 -1
  314. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +1 -1
  315. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +1 -1
  316. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +1 -1
  317. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +1 -1
  318. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +1 -1
  319. data/db/migrate/20140717155155_create_default_refund_reason.rb +1 -1
  320. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +1 -1
  321. data/db/migrate/20140718133010_create_spree_customer_returns.rb +1 -1
  322. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +1 -1
  323. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +5 -5
  324. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +1 -1
  325. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +1 -1
  326. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +2 -2
  327. data/db/migrate/20140725131539_create_spree_reimbursements.rb +1 -1
  328. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +1 -1
  329. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +1 -1
  330. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +1 -1
  331. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +1 -1
  332. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +1 -1
  333. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +1 -1
  334. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -1
  335. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +1 -1
  336. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +1 -1
  337. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +1 -1
  338. data/db/migrate/20140911173301_add_kind_to_zone.rb +1 -1
  339. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +1 -1
  340. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +1 -1
  341. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +1 -1
  342. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +1 -1
  343. data/db/migrate/20141009204607_add_store_id_to_orders.rb +1 -1
  344. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +1 -1
  345. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +1 -1
  346. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +2 -7
  347. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +1 -1
  348. data/db/migrate/20141105213646_update_classifications_positions.rb +1 -1
  349. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +1 -1
  350. data/db/migrate/20141215232040_remove_token_permissions_table.rb +1 -1
  351. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +1 -1
  352. data/db/migrate/20141217215630_update_product_slug_index.rb +1 -1
  353. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +1 -1
  354. data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
  355. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
  356. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
  357. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
  358. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +1 -1
  359. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +1 -1
  360. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +1 -1
  361. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +1 -1
  362. data/db/migrate/20150128060325_remove_spree_configurations.rb +1 -1
  363. data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +1 -1
  364. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +1 -1
  365. data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +67 -0
  366. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
  367. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
  368. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +1 -1
  369. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
  370. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +1 -1
  371. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +1 -1
  372. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
  373. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
  374. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +1 -1
  375. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
  376. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
  377. data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
  378. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
  379. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
  380. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
  381. data/db/migrate/20160219165458_add_indexes.rb +14 -0
  382. data/db/migrate/20160509064646_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +10 -0
  383. data/db/migrate/20160511071954_acts_as_taggable_on_spree_migration.rb +40 -0
  384. data/db/migrate/20160511072249_change_collation_for_spree_tag_names.rb +9 -0
  385. data/db/migrate/20160511072335_add_missing_indexes_to_spree_taggings.rb +14 -0
  386. data/db/migrate/20160608090604_add_zipcode_required_to_spree_countries.rb +7 -0
  387. data/db/migrate/20161014145148_add_created_at_to_variant.rb +8 -0
  388. data/db/migrate/20161014152814_add_null_false_to_spree_variants_timestamps.rb +6 -0
  389. data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
  390. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +3 -3
  391. data/lib/generators/spree/custom_user/templates/migration.rb.tt +2 -2
  392. data/lib/generators/spree/dummy/dummy_generator.rb +11 -11
  393. data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
  394. data/lib/generators/spree/dummy/templates/rails/database.yml +38 -28
  395. data/lib/generators/spree/dummy/templates/rails/test.rb +4 -3
  396. data/lib/generators/spree/install/install_generator.rb +37 -13
  397. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  398. data/lib/spree/core/controller_helpers/common.rb +6 -6
  399. data/lib/spree/core/controller_helpers/order.rb +9 -10
  400. data/lib/spree/core/controller_helpers/respond_with.rb +1 -1
  401. data/lib/spree/core/controller_helpers/search.rb +1 -1
  402. data/lib/spree/core/controller_helpers/store.rb +29 -0
  403. data/lib/spree/core/delegate_belongs_to.rb +4 -4
  404. data/lib/spree/core/engine.rb +39 -20
  405. data/lib/spree/core/environment.rb +1 -1
  406. data/lib/spree/core/importer/order.rb +37 -40
  407. data/lib/spree/core/importer/product.rb +2 -2
  408. data/lib/spree/core/number_generator.rb +52 -0
  409. data/lib/spree/core/product_duplicator.rb +1 -1
  410. data/lib/spree/core/product_filters.rb +2 -2
  411. data/lib/spree/core/search/base.rb +4 -3
  412. data/lib/spree/core/version.rb +1 -1
  413. data/lib/spree/core.rb +16 -0
  414. data/lib/spree/i18n/initializer.rb +1 -1
  415. data/lib/spree/localized_number.rb +3 -1
  416. data/lib/spree/permitted_attributes.rb +6 -3
  417. data/lib/spree/testing_support/caching.rb +3 -3
  418. data/lib/spree/testing_support/common_rake.rb +3 -3
  419. data/lib/spree/testing_support/controller_requests.rb +4 -4
  420. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  421. data/lib/spree/testing_support/factories/country_factory.rb +2 -2
  422. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
  423. data/lib/spree/testing_support/factories/order_factory.rb +3 -2
  424. data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
  425. data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -0
  426. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
  427. data/lib/spree/testing_support/factories/refund_factory.rb +9 -1
  428. data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -0
  429. data/lib/spree/testing_support/factories/state_factory.rb +2 -2
  430. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
  431. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
  432. data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
  433. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
  434. data/lib/spree/testing_support/factories/tag_factory.rb +5 -0
  435. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  436. data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
  437. data/lib/spree/testing_support/factories.rb +3 -3
  438. data/lib/spree/testing_support/kernel.rb +18 -0
  439. data/lib/spree/testing_support/microdata.rb +189 -0
  440. data/lib/spree/testing_support/order_walkthrough.rb +4 -4
  441. data/lib/tasks/core.rake +69 -1
  442. data/lib/tasks/exchanges.rake +2 -2
  443. data/spec/fixtures/microdata.html +22 -0
  444. data/spec/fixtures/microdata_itemref.html +15 -0
  445. data/spec/fixtures/microdata_no_itemscope.html +20 -0
  446. data/spec/helpers/base_helper_spec.rb +74 -11
  447. data/spec/helpers/products_helper_spec.rb +80 -15
  448. data/spec/lib/i18n_spec.rb +13 -13
  449. data/spec/lib/search/base_spec.rb +18 -18
  450. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +6 -4
  451. data/spec/lib/spree/core/controller_helpers/order_spec.rb +15 -0
  452. data/spec/lib/spree/core/controller_helpers/store_spec.rb +56 -0
  453. data/spec/lib/spree/core/importer/order_spec.rb +227 -124
  454. data/spec/lib/spree/core/number_generator_spec.rb +175 -0
  455. data/spec/lib/spree/core_spec.rb +23 -0
  456. data/spec/lib/spree/localized_number_spec.rb +11 -1
  457. data/spec/lib/spree/money_spec.rb +6 -6
  458. data/spec/mailers/order_mailer_spec.rb +11 -13
  459. data/spec/mailers/reimbursement_mailer_spec.rb +2 -2
  460. data/spec/mailers/shipment_mailer_spec.rb +26 -8
  461. data/spec/mailers/test_mailer_spec.rb +16 -2
  462. data/spec/models/option_type_prototype_spec.rb +9 -0
  463. data/spec/models/spree/ability_spec.rb +20 -15
  464. data/spec/models/spree/address_spec.rb +144 -33
  465. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  466. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  467. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  468. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +2 -262
  469. data/spec/models/spree/adjustment_spec.rb +28 -2
  470. data/spec/models/spree/app_configuration_spec.rb +6 -3
  471. data/spec/models/spree/asset_spec.rb +9 -6
  472. data/spec/models/spree/calculator/default_tax_spec.rb +39 -14
  473. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +1 -1
  474. data/spec/models/spree/calculator/flexi_rate_spec.rb +6 -6
  475. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +1 -1
  476. data/spec/models/spree/calculator/price_sack_spec.rb +2 -2
  477. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +4 -8
  478. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +4 -4
  479. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +2 -2
  480. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +6 -6
  481. data/spec/models/spree/calculator/shipping/per_item_spec.rb +2 -2
  482. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +1 -1
  483. data/spec/models/spree/calculator/tiered_percent_spec.rb +1 -1
  484. data/spec/models/spree/calculator_spec.rb +3 -3
  485. data/spec/models/spree/classification_spec.rb +1 -1
  486. data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
  487. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  488. data/spec/models/spree/country_spec.rb +45 -8
  489. data/spec/models/spree/credit_card_spec.rb +13 -9
  490. data/spec/models/spree/customer_return_spec.rb +4 -26
  491. data/spec/models/spree/exchange_spec.rb +1 -1
  492. data/spec/models/spree/gateway/bogus_simple.rb +1 -1
  493. data/spec/models/spree/gateway/bogus_spec.rb +1 -1
  494. data/spec/models/spree/gateway_spec.rb +8 -1
  495. data/spec/models/spree/image_spec.rb +4 -1
  496. data/spec/models/spree/inventory_unit_spec.rb +35 -21
  497. data/spec/models/spree/line_item_spec.rb +100 -21
  498. data/spec/models/spree/option_type_spec.rb +3 -3
  499. data/spec/models/spree/option_value_spec.rb +8 -3
  500. data/spec/models/spree/order/address_spec.rb +1 -1
  501. data/spec/models/spree/order/adjustments_spec.rb +1 -1
  502. data/spec/models/spree/order/callbacks_spec.rb +3 -3
  503. data/spec/models/spree/order/checkout_spec.rb +99 -93
  504. data/spec/models/spree/order/currency_updater_spec.rb +4 -4
  505. data/spec/models/spree/order/finalizing_spec.rb +5 -8
  506. data/spec/models/spree/order/helpers_spec.rb +1 -1
  507. data/spec/models/spree/order/payment_spec.rb +21 -21
  508. data/spec/models/spree/order/risk_assessment_spec.rb +1 -1
  509. data/spec/models/spree/order/state_machine_spec.rb +4 -8
  510. data/spec/models/spree/order/store_credit_spec.rb +426 -0
  511. data/spec/models/spree/order/tax_spec.rb +13 -13
  512. data/spec/models/spree/order/totals_spec.rb +2 -2
  513. data/spec/models/spree/order/updating_spec.rb +4 -4
  514. data/spec/models/spree/order/validations_spec.rb +2 -2
  515. data/spec/models/spree/order_contents_spec.rb +45 -4
  516. data/spec/models/spree/order_inventory_spec.rb +28 -17
  517. data/spec/models/spree/order_merger_spec.rb +3 -1
  518. data/spec/models/spree/order_spec.rb +188 -96
  519. data/spec/models/spree/order_updater_spec.rb +43 -32
  520. data/spec/models/spree/payment/gateway_options_spec.rb +10 -2
  521. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  522. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  523. data/spec/models/spree/payment_method_spec.rb +22 -14
  524. data/spec/models/spree/payment_spec.rb +75 -82
  525. data/spec/models/spree/preference_spec.rb +1 -1
  526. data/spec/models/spree/preferences/configuration_spec.rb +2 -2
  527. data/spec/models/spree/preferences/preferable_spec.rb +15 -19
  528. data/spec/models/spree/preferences/scoped_store_spec.rb +1 -1
  529. data/spec/models/spree/preferences/store_spec.rb +3 -3
  530. data/spec/models/spree/price_spec.rb +87 -1
  531. data/spec/models/spree/product/scopes_spec.rb +39 -4
  532. data/spec/models/spree/product_duplicator_spec.rb +2 -2
  533. data/spec/models/spree/product_filter_spec.rb +2 -2
  534. data/spec/models/spree/product_option_type_spec.rb +6 -2
  535. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  536. data/spec/models/spree/product_property_spec.rb +16 -1
  537. data/spec/models/spree/product_spec.rb +196 -41
  538. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +63 -0
  539. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +6 -6
  540. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +1 -1
  541. data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
  542. data/spec/models/spree/promotion/rules/first_order_spec.rb +11 -11
  543. data/spec/models/spree/promotion/rules/item_total_spec.rb +1 -1
  544. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +1 -1
  545. data/spec/models/spree/promotion/rules/product_spec.rb +8 -8
  546. data/spec/models/spree/promotion/rules/taxon_spec.rb +1 -1
  547. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +3 -3
  548. data/spec/models/spree/promotion/rules/user_spec.rb +15 -7
  549. data/spec/models/spree/promotion_action_spec.rb +2 -2
  550. data/spec/models/spree/promotion_category_spec.rb +1 -1
  551. data/spec/models/spree/promotion_handler/cart_spec.rb +1 -1
  552. data/spec/models/spree/promotion_handler/coupon_spec.rb +28 -28
  553. data/spec/models/spree/promotion_handler/page_spec.rb +6 -6
  554. data/spec/models/spree/promotion_rule_spec.rb +2 -2
  555. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  556. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  557. data/spec/models/spree/promotion_spec.rb +141 -65
  558. data/spec/models/spree/property_prototype_spec.rb +9 -0
  559. data/spec/models/spree/property_spec.rb +1 -1
  560. data/spec/models/spree/prototype_spec.rb +1 -1
  561. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  562. data/spec/models/spree/refund_reason_spec.rb +20 -0
  563. data/spec/models/spree/refund_spec.rb +1 -1
  564. data/spec/models/spree/reimbursement/credit_spec.rb +1 -1
  565. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +1 -1
  566. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +1 -1
  567. data/spec/models/spree/reimbursement_performer_spec.rb +1 -1
  568. data/spec/models/spree/reimbursement_spec.rb +3 -30
  569. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +18 -6
  570. data/spec/models/spree/reimbursement_type/credit_spec.rb +1 -1
  571. data/spec/models/spree/reimbursement_type/exchange_spec.rb +1 -1
  572. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
  573. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  574. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  575. data/spec/models/spree/return_authorization_spec.rb +3 -23
  576. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +1 -1
  577. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +1 -1
  578. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +1 -1
  579. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +1 -1
  580. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
  581. data/spec/models/spree/return_item_spec.rb +51 -2
  582. data/spec/models/spree/returns_calculator_spec.rb +2 -2
  583. data/spec/models/spree/role_spec.rb +7 -0
  584. data/spec/models/spree/shipment_spec.rb +24 -22
  585. data/spec/models/spree/shipping_calculator_spec.rb +5 -5
  586. data/spec/models/spree/shipping_category_spec.rb +15 -1
  587. data/spec/models/spree/shipping_method_spec.rb +11 -4
  588. data/spec/models/spree/shipping_rate_spec.rb +40 -41
  589. data/spec/models/spree/state_spec.rb +13 -2
  590. data/spec/models/spree/stock/availability_validator_spec.rb +1 -1
  591. data/spec/models/spree/stock/content_item_spec.rb +9 -0
  592. data/spec/models/spree/stock/coordinator_spec.rb +13 -3
  593. data/spec/models/spree/stock/differentiator_spec.rb +1 -1
  594. data/spec/models/spree/stock/estimator_spec.rb +60 -12
  595. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +1 -1
  596. data/spec/models/spree/stock/package_spec.rb +6 -18
  597. data/spec/models/spree/stock/packer_spec.rb +1 -1
  598. data/spec/models/spree/stock/prioritizer_spec.rb +7 -7
  599. data/spec/models/spree/stock/quantifier_spec.rb +61 -32
  600. data/spec/models/spree/stock/splitter/backordered_spec.rb +1 -1
  601. data/spec/models/spree/stock/splitter/base_spec.rb +1 -1
  602. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +3 -3
  603. data/spec/models/spree/stock_item_spec.rb +30 -8
  604. data/spec/models/spree/stock_location_spec.rb +5 -5
  605. data/spec/models/spree/stock_movement_spec.rb +101 -37
  606. data/spec/models/spree/stock_transfer_spec.rb +1 -1
  607. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  608. data/spec/models/spree/store_credit_spec.rb +786 -0
  609. data/spec/models/spree/store_spec.rb +40 -12
  610. data/spec/models/spree/tax_category_spec.rb +7 -2
  611. data/spec/models/spree/tax_rate_spec.rb +288 -109
  612. data/spec/models/spree/taxon_spec.rb +15 -4
  613. data/spec/models/spree/taxonomy_spec.rb +2 -2
  614. data/spec/models/spree/tracker_spec.rb +1 -1
  615. data/spec/models/spree/user_spec.rb +114 -41
  616. data/spec/models/spree/variant_spec.rb +310 -15
  617. data/spec/models/spree/zone_member_spec.rb +38 -0
  618. data/spec/models/spree/zone_spec.rb +38 -10
  619. data/spec/spec_helper.rb +5 -0
  620. data/spec/support/concerns/{adjustment_source_spec.rb → adjustment_source.rb} +0 -0
  621. data/spec/support/concerns/{default_price_spec.rb → default_price.rb} +9 -0
  622. data/spree_core.gemspec +12 -13
  623. data/vendor/assets/javascripts/jquery.payment.js +239 -84
  624. metadata +136 -65
  625. data/CHANGELOG.md +0 -4
  626. data/app/models/concerns/spree/number_generator.rb +0 -39
  627. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -24
@@ -21,10 +21,15 @@
21
21
  module Spree
22
22
  class Product < Spree::Base
23
23
  extend FriendlyId
24
+ include ActsAsTaggable
24
25
  friendly_id :slug_candidates, use: :history
25
26
 
26
27
  acts_as_paranoid
27
28
 
29
+ # we need to have this callback before any dependent: :destroy associations
30
+ # https://github.com/rails/rails/issues/3458
31
+ before_destroy :ensure_no_line_items
32
+
28
33
  has_many :product_option_types, dependent: :destroy, inverse_of: :product
29
34
  has_many :option_types, through: :product_option_types
30
35
  has_many :product_properties, dependent: :destroy, inverse_of: :product
@@ -32,7 +37,15 @@ module Spree
32
37
 
33
38
  has_many :classifications, dependent: :delete_all, inverse_of: :product
34
39
  has_many :taxons, through: :classifications, before_remove: :remove_taxon
35
- has_and_belongs_to_many :promotion_rules, join_table: :spree_products_promotion_rules
40
+
41
+ has_many :product_promotion_rules, class_name: 'Spree::ProductPromotionRule'
42
+ has_many :promotion_rules, through: :product_promotion_rules, class_name: 'Spree::PromotionRule'
43
+
44
+ has_many :promotions, through: :promotion_rules, class_name: 'Spree::Promotion'
45
+
46
+ has_many :possible_promotions, -> { advertised.active }, through: :promotion_rules,
47
+ class_name: 'Spree::Promotion',
48
+ source: :promotion
36
49
 
37
50
  belongs_to :tax_category, class_name: 'Spree::TaxCategory'
38
51
  belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :products
@@ -43,12 +56,12 @@ module Spree
43
56
  class_name: 'Spree::Variant'
44
57
 
45
58
  has_many :variants,
46
- -> { where(is_master: false).order("#{::Spree::Variant.quoted_table_name}.position ASC") },
59
+ -> { where(is_master: false).order(:position) },
47
60
  inverse_of: :product,
48
61
  class_name: 'Spree::Variant'
49
62
 
50
63
  has_many :variants_including_master,
51
- -> { order("#{::Spree::Variant.quoted_table_name}.position ASC") },
64
+ -> { order(:position) },
52
65
  inverse_of: :product,
53
66
  class_name: 'Spree::Variant',
54
67
  dependent: :destroy
@@ -60,16 +73,13 @@ module Spree
60
73
  has_many :line_items, through: :variants_including_master
61
74
  has_many :orders, through: :line_items
62
75
 
63
- delegate_belongs_to :master, :sku, :price, :currency, :display_amount, :display_price, :weight, :height, :width, :depth, :is_master, :has_default_price?, :cost_currency, :price_in, :amount_in
76
+ delegate_belongs_to :master, :sku, :price, :currency, :display_amount, :display_price, :weight, :height, :width, :depth,
77
+ :is_master, :has_default_price?, :cost_currency, :price_in, :amount_in, :cost_price, :images
64
78
 
65
- delegate_belongs_to :master, :cost_price
66
-
67
- delegate :images, to: :master, prefix: true
68
- alias_method :images, :master_images
79
+ alias_method :master_images, :images
69
80
 
70
81
  has_many :variant_images, -> { order(:position) }, source: :images, through: :variants_including_master
71
82
 
72
- after_create :set_master_variant_defaults
73
83
  after_create :add_associations_from_prototype
74
84
  after_create :build_variants_from_option_values_hash, if: :option_values_hash
75
85
 
@@ -86,12 +96,17 @@ module Spree
86
96
  before_validation :normalize_slug, on: :update
87
97
  before_validation :validate_master
88
98
 
89
- validates :meta_keywords, length: { maximum: 255 }
90
- validates :meta_title, length: { maximum: 255 }
91
- validates :name, presence: true
92
- validates :price, presence: true, if: proc { Spree::Config[:require_master_price] }
93
- validates :shipping_category_id, presence: true
99
+ with_options length: { maximum: 255 }, allow_blank: true do
100
+ validates :meta_keywords
101
+ validates :meta_title
102
+ end
103
+ with_options presence: true do
104
+ validates :name, :shipping_category
105
+ validates :price, if: proc { Spree::Config[:require_master_price] }
106
+ end
107
+
94
108
  validates :slug, length: { minimum: 3 }, allow_blank: true, uniqueness: true
109
+ validate :discontinue_on_must_be_later_than_available_on, if: -> { available_on && discontinue_on }
95
110
 
96
111
  attr_accessor :option_values_hash
97
112
 
@@ -100,7 +115,8 @@ module Spree
100
115
  alias :options :product_option_types
101
116
 
102
117
  self.whitelisted_ransackable_associations = %w[stores variants_including_master master variants]
103
- self.whitelisted_ransackable_attributes = %w[description name slug]
118
+ self.whitelisted_ransackable_attributes = %w[description name slug discontinue_on]
119
+ self.whitelisted_ransackable_scopes = %w[not_discontinued]
104
120
 
105
121
  # the master variant is not a member of the variants array
106
122
  def has_variants?
@@ -108,11 +124,7 @@ module Spree
108
124
  end
109
125
 
110
126
  def tax_category
111
- if self[:tax_category_id].nil?
112
- TaxCategory.where(is_default: true).first
113
- else
114
- TaxCategory.find(self[:tax_category_id])
115
- end
127
+ super || TaxCategory.find_by(is_default: true)
116
128
  end
117
129
 
118
130
  # Adding properties and option types on creation based on a chosen prototype
@@ -124,9 +136,10 @@ module Spree
124
136
  # Ensures option_types and product_option_types exist for keys in option_values_hash
125
137
  def ensure_option_types_exist_for_values_hash
126
138
  return if option_values_hash.nil?
127
- option_values_hash.keys.map(&:to_i).each do |id|
128
- self.option_type_ids << id unless option_type_ids.include?(id)
129
- product_option_types.create(option_type_id: id) unless product_option_types.pluck(:option_type_id).include?(id)
139
+ required_option_type_ids = option_values_hash.keys.map(&:to_i)
140
+ missing_option_type_ids = required_option_type_ids - option_type_ids
141
+ missing_option_type_ids.each do |id|
142
+ product_option_types.create(option_type_id: id)
130
143
  end
131
144
  end
132
145
 
@@ -148,7 +161,20 @@ module Spree
148
161
  # deleted products and products with nil or future available_on date
149
162
  # are not available
150
163
  def available?
151
- !(available_on.nil? || available_on.future?) && !deleted?
164
+ !(available_on.nil? || available_on.future?) && !deleted? && !discontinued?
165
+ end
166
+
167
+ def discontinue!
168
+ update_attribute(:discontinue_on, Time.current)
169
+ end
170
+
171
+ def discontinued?
172
+ !!discontinue_on && discontinue_on <= Time.current
173
+ end
174
+
175
+ # determine if any variant (including master) can be supplied
176
+ def can_supply?
177
+ variants_including_master.any?(&:can_supply?)
152
178
  end
153
179
 
154
180
  # split variants list into hash which shows mapping of opt value onto matching variants
@@ -159,11 +185,10 @@ module Spree
159
185
  end
160
186
 
161
187
  def self.like_any(fields, values)
162
- where fields.map { |field|
163
- values.map { |value|
164
- arel_table[field].matches("%#{value}%")
165
- }.inject(:or)
166
- }.inject(:or)
188
+ conditions = fields.product(values).map do |(field, value)|
189
+ arel_table[field].matches("%#{value}%")
190
+ end
191
+ where conditions.inject(:or)
167
192
  end
168
193
 
169
194
  # Suitable for displaying only variants that has at least one option value.
@@ -184,29 +209,19 @@ module Spree
184
209
  end
185
210
 
186
211
  def property(property_name)
187
- return nil unless prop = properties.find_by(name: property_name)
188
- product_properties.find_by(property: prop).try(:value)
212
+ product_properties.joins(:property).find_by(spree_properties: { name: property_name }).try(:value)
189
213
  end
190
214
 
191
- def set_property(property_name, property_value)
192
- ActiveRecord::Base.transaction do
215
+ def set_property(property_name, property_value, property_presentation = property_name)
216
+ ApplicationRecord.transaction do
193
217
  # Works around spree_i18n #301
194
- property = if Property.exists?(name: property_name)
195
- Property.where(name: property_name).first
196
- else
197
- Property.create(name: property_name, presentation: property_name)
198
- end
218
+ property = Property.create_with(presentation: property_presentation).find_or_create_by(name: property_name)
199
219
  product_property = ProductProperty.where(product: self, property: property).first_or_initialize
200
220
  product_property.value = property_value
201
221
  product_property.save!
202
222
  end
203
223
  end
204
224
 
205
- def possible_promotions
206
- promotion_ids = promotion_rules.map(&:promotion_id).uniq
207
- Spree::Promotion.advertised.where(id: promotion_ids).reject(&:expired?)
208
- end
209
-
210
225
  def total_on_hand
211
226
  if any_variants_not_track_inventory?
212
227
  Float::INFINITY
@@ -219,7 +234,15 @@ module Spree
219
234
  # which would make AR's default finder return nil.
220
235
  # This is a stopgap for that little problem.
221
236
  def master
222
- super || variants_including_master.with_deleted.where(is_master: true).first
237
+ super || variants_including_master.with_deleted.find_by(is_master: true)
238
+ end
239
+
240
+ def brand
241
+ taxons.joins(:taxonomy).find_by(spree_taxonomies: { name: Spree.t(:taxonomy_brands_name) })
242
+ end
243
+
244
+ def category
245
+ taxons.joins(:taxonomy).find_by(spree_taxonomies: { name: Spree.t(:taxonomy_categories_name) })
223
246
  end
224
247
 
225
248
  private
@@ -250,12 +273,12 @@ module Spree
250
273
  values = values.inject(values.shift) { |memo, value| memo.product(value).map(&:flatten) }
251
274
 
252
275
  values.each do |ids|
253
- variant = variants.create(
276
+ variants.create(
254
277
  option_value_ids: ids,
255
278
  price: master.price
256
279
  )
257
280
  end
258
- save
281
+ throw(:abort) unless save
259
282
  end
260
283
 
261
284
  def ensure_master
@@ -269,7 +292,7 @@ module Spree
269
292
 
270
293
  def punch_slug
271
294
  # punch slug with date prefix to allow reuse of original
272
- update_column :slug, "#{Time.now.to_i}_#{slug}"[0..254] unless frozen?
295
+ update_column :slug, "#{Time.current.to_i}_#{slug}"[0..254] unless frozen?
273
296
  end
274
297
 
275
298
  def update_slug_history
@@ -320,11 +343,6 @@ module Spree
320
343
  end
321
344
  end
322
345
 
323
- # ensures the master variant is flagged as such
324
- def set_master_variant_defaults
325
- master.is_master = true
326
- end
327
-
328
346
  # Try building a slug based on the following fields in increasing order of specificity.
329
347
  def slug_candidates
330
348
  [
@@ -352,10 +370,23 @@ module Spree
352
370
  Spree::Taxonomy.where(id: taxonomy_ids).update_all(updated_at: Time.current)
353
371
  end
354
372
 
373
+ def ensure_no_line_items
374
+ if line_items.any?
375
+ errors.add(:base, Spree.t(:cannot_destroy_if_attached_to_line_items))
376
+ throw(:abort)
377
+ end
378
+ end
379
+
355
380
  def remove_taxon(taxon)
356
381
  removed_classifications = classifications.where(taxon: taxon)
357
382
  removed_classifications.each &:remove_from_list
358
383
  end
384
+
385
+ def discontinue_on_must_be_later_than_available_on
386
+ if discontinue_on < available_on
387
+ errors.add(:discontinue_on, :invalid_date_range)
388
+ end
389
+ end
359
390
  end
360
391
  end
361
392
 
@@ -1,7 +1,12 @@
1
1
  module Spree
2
2
  class ProductOptionType < Spree::Base
3
- belongs_to :product, class_name: 'Spree::Product', inverse_of: :product_option_types
4
- belongs_to :option_type, class_name: 'Spree::OptionType', inverse_of: :product_option_types
3
+ with_options inverse_of: :product_option_types do
4
+ belongs_to :product, class_name: 'Spree::Product'
5
+ belongs_to :option_type, class_name: 'Spree::OptionType'
6
+ end
5
7
  acts_as_list scope: :product
8
+
9
+ validates :product, :option_type, presence: true
10
+ validates :product_id, uniqueness: { scope: :option_type_id }, allow_nil: true
6
11
  end
7
12
  end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class ProductPromotionRule < Spree::Base
3
+ belongs_to :product, class_name: 'Spree::Product'
4
+ belongs_to :promotion_rule, class_name: 'Spree::PromotionRule'
5
+
6
+ validates :product, :promotion_rule, presence: true
7
+ validates :product_id, uniqueness: { scope: :promotion_rule_id }, allow_nil: true
8
+ end
9
+ end
@@ -2,28 +2,27 @@ module Spree
2
2
  class ProductProperty < Spree::Base
3
3
  acts_as_list scope: :product
4
4
 
5
- belongs_to :product, touch: true, class_name: 'Spree::Product', inverse_of: :product_properties
6
- belongs_to :property, class_name: 'Spree::Property', inverse_of: :product_properties
5
+ with_options inverse_of: :product_properties do
6
+ belongs_to :product, touch: true, class_name: 'Spree::Product'
7
+ belongs_to :property, class_name: 'Spree::Property'
8
+ end
7
9
 
8
10
  validates :property, presence: true
9
11
 
10
- validates_with Spree::Validations::DbMaximumLengthValidator, field: :value
12
+ validates :value, db_maximum_length: true
11
13
 
12
- default_scope { order("#{self.table_name}.position") }
14
+ default_scope { order(:position) }
13
15
 
14
16
  self.whitelisted_ransackable_attributes = ['value']
17
+ self.whitelisted_ransackable_associations = ['property']
15
18
 
16
19
  # virtual attributes for use with AJAX completion stuff
17
- def property_name
18
- property.name if property
19
- end
20
+ delegate :name, to: :property, prefix: true, allow_nil: true
20
21
 
21
22
  def property_name=(name)
22
23
  if name.present?
23
24
  # don't use `find_by :name` to workaround globalize/globalize#423 bug
24
- property = Property.where(name: name).first ||
25
- Property.create(name: name, presentation: name)
26
- self.property = property
25
+ self.property = Property.where(name: name).first_or_create(presentation: name)
27
26
  end
28
27
  end
29
28
  end
@@ -13,7 +13,7 @@ module Spree
13
13
  end
14
14
 
15
15
  def compute_amount(order)
16
- [(order.item_total + order.ship_total), compute(order)].min * -1
16
+ [(order.item_total + order.ship_total - order.shipping_discount), compute(order)].min * -1
17
17
  end
18
18
  end
19
19
  end
@@ -5,7 +5,7 @@ module Spree
5
5
  has_many :promotion_action_line_items, foreign_key: :promotion_action_id
6
6
  accepts_nested_attributes_for :promotion_action_line_items
7
7
 
8
- delegate :eligible?, :to => :promotion
8
+ delegate :eligible?, to: :promotion
9
9
 
10
10
  # Adds a line item to the Order if the promotion is eligible
11
11
  #
@@ -37,7 +37,7 @@ module Spree
37
37
  # needs to be manually removed from the order by the customer
38
38
  def perform(options = {})
39
39
  order = options[:order]
40
- return unless self.eligible? order
40
+ return unless eligible? order
41
41
 
42
42
  action_taken = false
43
43
  promotion_action_line_items.each do |item|
@@ -50,12 +50,30 @@ module Spree
50
50
  action_taken
51
51
  end
52
52
 
53
+ # Called by promotion handler when a promotion is removed
54
+ # This will find any line item matching the ones defined in the PromotionAction
55
+ # and remove the same quantity as was added by the PromotionAction.
56
+ # Should help to prevent some of cases listed above the #perform method
57
+ def revert(options = {})
58
+ order = options[:order]
59
+ return if eligible?(order)
60
+
61
+ action_taken = false
62
+ promotion_action_line_items.each do |item|
63
+ line_item = order.find_line_item_by_variant(item.variant)
64
+ next unless line_item.present?
65
+ order.contents.remove(item.variant, (item.quantity || 1))
66
+ action_taken = true
67
+ end
68
+
69
+ action_taken
70
+ end
71
+
53
72
  # Checks that there's enough stock to add the line item to the order
54
73
  def item_available?(item)
55
74
  quantifier = Spree::Stock::Quantifier.new(item.variant)
56
75
  quantifier.can_supply? item.quantity
57
76
  end
58
-
59
77
  end
60
78
  end
61
79
  end
@@ -0,0 +1,23 @@
1
+ # A rule to limit a promotion based on shipment country.
2
+ module Spree
3
+ class Promotion
4
+ module Rules
5
+ class Country < PromotionRule
6
+ preference :country_id, :integer
7
+
8
+ def applicable?(promotable)
9
+ promotable.is_a?(Spree::Order)
10
+ end
11
+
12
+ def eligible?(order, options = {})
13
+ country_id = options[:country_id] || order.ship_address.try(:country_id)
14
+ unless country_id.eql?(preferred_country_id || Spree::Country.default)
15
+ eligibility_errors.add(:base, eligibility_error_message(:wrong_country))
16
+ end
17
+
18
+ eligibility_errors.empty?
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,7 +1,20 @@
1
1
  module Spree
2
2
  class Promotion
3
3
  module Rules
4
+ module OptionValueWithNumerificationSupport
5
+ def preferred_eligible_values
6
+ values = super || {}
7
+ Hash[values.keys.map(&:to_i).zip(
8
+ values.values.map do |v|
9
+ (v.is_a?(Array) ? v : v.split(",")).map(&:to_i)
10
+ end
11
+ )]
12
+ end
13
+ end
14
+
4
15
  class OptionValue < PromotionRule
16
+ prepend OptionValueWithNumerificationSupport
17
+
5
18
  MATCH_POLICIES = %w(any)
6
19
  preference :match_policy, :string, default: MATCH_POLICIES.first
7
20
  preference :eligible_values, :hash
@@ -24,16 +37,6 @@ module Spree
24
37
  product_ids.include?(pid) && (value_ids(pid) - ovids).empty?
25
38
  end
26
39
 
27
- def preferred_eligible_values_with_numerification
28
- values = preferred_eligible_values_without_numerification || {}
29
- Hash[values.keys.map(&:to_i).zip(
30
- values.values.map do |v|
31
- (v.is_a?(Array) ? v : v.split(",")).map(&:to_i)
32
- end
33
- )]
34
- end
35
- alias_method_chain :preferred_eligible_values, :numerification
36
-
37
40
  private
38
41
 
39
42
  def product_ids
@@ -5,7 +5,9 @@ module Spree
5
5
  class Promotion
6
6
  module Rules
7
7
  class Product < PromotionRule
8
- has_and_belongs_to_many :products, class_name: '::Spree::Product', join_table: 'spree_products_promotion_rules', foreign_key: 'promotion_rule_id'
8
+ has_many :product_promotion_rules, class_name: 'Spree::ProductPromotionRule',
9
+ foreign_key: :promotion_rule_id
10
+ has_many :products, through: :product_promotion_rules, class_name: 'Spree::Product'
9
11
 
10
12
  MATCH_POLICIES = %w(any all none)
11
13
  preference :match_policy, :string, default: MATCH_POLICIES.first
@@ -2,7 +2,8 @@ module Spree
2
2
  class Promotion
3
3
  module Rules
4
4
  class Taxon < PromotionRule
5
- has_and_belongs_to_many :taxons, class_name: '::Spree::Taxon', join_table: 'spree_taxons_promotion_rules', foreign_key: 'promotion_rule_id'
5
+ has_many :promotion_rule_taxons, class_name: 'Spree::PromotionRuleTaxon', foreign_key: 'promotion_rule_id'
6
+ has_many :taxons, through: :promotion_rule_taxons, class_name: 'Spree::Taxon'
6
7
 
7
8
  MATCH_POLICIES = %w(any all)
8
9
  preference :match_policy, default: MATCH_POLICIES.first
@@ -43,7 +44,7 @@ module Spree
43
44
 
44
45
  # All taxons in an order
45
46
  def order_taxons(order)
46
- Spree::Taxon.joins(products: {variants_including_master: :line_items}).where(spree_line_items: {order_id: order.id}).uniq
47
+ Spree::Taxon.joins(products: {variants_including_master: :line_items}).where(spree_line_items: {order_id: order.id}).distinct
47
48
  end
48
49
 
49
50
  # ids of taxons rules and taxons rules children
@@ -4,10 +4,10 @@ module Spree
4
4
  class User < PromotionRule
5
5
  belongs_to :user, class_name: "::#{Spree.user_class.to_s}"
6
6
 
7
- has_and_belongs_to_many :users, class_name: "::#{Spree.user_class.to_s}",
8
- join_table: 'spree_promotion_rules_users',
9
- foreign_key: 'promotion_rule_id',
10
- association_foreign_key: :user_id
7
+ has_many :promotion_rule_users, class_name: 'Spree::PromotionRuleUser',
8
+ foreign_key: :promotion_rule_id,
9
+ dependent: :destroy
10
+ has_many :users, through: :promotion_rule_users, class_name: "::#{Spree.user_class.to_s}"
11
11
 
12
12
  def applicable?(promotable)
13
13
  promotable.is_a?(Spree::Order)
@@ -13,7 +13,8 @@ module Spree
13
13
  has_many :promotion_actions, autosave: true, dependent: :destroy
14
14
  alias_method :actions, :promotion_actions
15
15
 
16
- has_and_belongs_to_many :orders, join_table: 'spree_orders_promotions'
16
+ has_many :order_promotions, class_name: 'Spree::OrderPromotion'
17
+ has_many :orders, through: :order_promotions, class_name: 'Spree::Order'
17
18
 
18
19
  accepts_nested_attributes_for :promotion_actions, :promotion_rules
19
20
 
@@ -22,29 +23,31 @@ module Spree
22
23
  validates :name, presence: true
23
24
  validates :path, uniqueness: { allow_blank: true }
24
25
  validates :usage_limit, numericality: { greater_than: 0, allow_nil: true }
25
- validates :description, length: { maximum: 255 }
26
+ validates :description, length: { maximum: 255 }, allow_blank: true
27
+ validate :expires_at_must_be_later_than_starts_at, if: -> { starts_at && expires_at }
26
28
 
27
29
  before_save :normalize_blank_values
28
30
 
29
- scope :coupons, ->{ where("#{table_name}.code IS NOT NULL") }
31
+ scope :coupons, -> { where.not(code: nil) }
32
+ scope :advertised, -> { where(advertise: true) }
33
+ scope :applied, lambda {
34
+ joins(<<-SQL).distinct
35
+ INNER JOIN spree_order_promotions
36
+ ON spree_order_promotions.promotion_id = #{table_name}.id
37
+ SQL
38
+ }
30
39
 
31
- order_join_table = reflect_on_association(:orders).join_table
32
-
33
- scope :applied, -> { joins("INNER JOIN #{order_join_table} ON #{order_join_table}.promotion_id = #{table_name}.id").uniq }
34
-
35
- self.whitelisted_ransackable_attributes = ['code', 'path', 'promotion_category_id']
36
-
37
- def self.advertised
38
- where(advertise: true)
39
- end
40
+ self.whitelisted_ransackable_attributes = ['path', 'promotion_category_id', 'code']
40
41
 
41
42
  def self.with_coupon_code(coupon_code)
42
- where("lower(#{self.table_name}.code) = ?", coupon_code.strip.downcase).first
43
+ where("lower(#{table_name}.code) = ?", coupon_code.strip.downcase)
44
+ .includes(:promotion_actions).where.not(spree_promotion_actions: { id: nil })
45
+ .first
43
46
  end
44
47
 
45
48
  def self.active
46
- where('spree_promotions.starts_at IS NULL OR spree_promotions.starts_at < ?', Time.now).
47
- where('spree_promotions.expires_at IS NULL OR spree_promotions.expires_at > ?', Time.now)
49
+ where('spree_promotions.starts_at IS NULL OR spree_promotions.starts_at < ?', Time.current).
50
+ where('spree_promotions.expires_at IS NULL OR spree_promotions.expires_at > ?', Time.current)
48
51
  end
49
52
 
50
53
  def self.order_activatable?(order)
@@ -52,7 +55,7 @@ module Spree
52
55
  end
53
56
 
54
57
  def expired?
55
- !!(starts_at && Time.now < starts_at || expires_at && Time.now > expires_at)
58
+ !!(starts_at && Time.current < starts_at || expires_at && Time.current > expires_at)
56
59
  end
57
60
 
58
61
  def activate(payload)
@@ -77,10 +80,37 @@ module Spree
77
80
  self.save
78
81
  end
79
82
 
80
- return action_taken
83
+ action_taken
81
84
  end
82
85
 
83
- # called anytime order.update! happens
86
+ # Called when a promotion is removed from the cart
87
+ def deactivate(payload)
88
+ order = payload[:order]
89
+ return unless self.class.order_activatable?(order)
90
+
91
+ payload[:promotion] = self
92
+
93
+ # Track results from actions to see if any action has been taken.
94
+ # Actions should return nil/false if no action has been taken.
95
+ # If an action returns true, then an action has been taken.
96
+ results = actions.map do |action|
97
+ action.revert(payload) if action.respond_to?(:revert)
98
+ end
99
+
100
+ # If an action has been taken, report back to whatever `d this promotion.
101
+ action_taken = results.include?(true)
102
+
103
+ if action_taken
104
+ # connect to the order
105
+ # create the join_table entry.
106
+ orders << order
107
+ save
108
+ end
109
+
110
+ action_taken
111
+ end
112
+
113
+ # called anytime order.update_with_updater! happens
84
114
  def eligible?(promotable)
85
115
  return false if expired? || usage_limit_exceeded?(promotable) || blacklisted?(promotable)
86
116
  !!eligible_rules(promotable, {})
@@ -128,7 +158,7 @@ module Spree
128
158
 
129
159
  def adjusted_credits_count(promotable)
130
160
  adjustments = promotable.is_a?(Order) ? promotable.all_adjustments : promotable.adjustments
131
- credits_count - adjustments.promotion.where(:source_id => actions.pluck(:id)).count
161
+ credits_count - adjustments.promotion.where(source_id: actions.pluck(:id)).size
132
162
  end
133
163
 
134
164
  def credits
@@ -192,5 +222,11 @@ module Spree
192
222
  def match_all?
193
223
  match_policy == 'all'
194
224
  end
225
+
226
+ def expires_at_must_be_later_than_starts_at
227
+ if expires_at < starts_at
228
+ errors.add(:expires_at, :invalid_date_range)
229
+ end
230
+ end
195
231
  end
196
232
  end
@@ -1,4 +1,4 @@
1
- # Base class for all types of promotion action.
1
+ ## Base class for all types of promotion action.
2
2
  # PromotionActions perform the necessary tasks when a promotion is activated by an event and determined to be eligible.
3
3
  module Spree
4
4
  class PromotionAction < Spree::Base
@@ -18,8 +18,8 @@ module Spree
18
18
 
19
19
  protected
20
20
 
21
- def label(amount)
22
- "#{Spree.t(:promotion)} (#{promotion.name})"
21
+ def label
22
+ Spree.t(:promotion_label, name: promotion.name)
23
23
  end
24
24
  end
25
25
  end
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class PromotionCategory < Spree::Base
3
- validates_presence_of :name
3
+ validates :name, presence: true
4
4
  has_many :promotions
5
5
  end
6
6
  end