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
@@ -8,17 +8,17 @@ module Spree
8
8
 
9
9
  def authorize(money, credit_card, options = {})
10
10
  if VALID_CCS.include? credit_card.number
11
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'A' })
11
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
12
12
  else
13
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { :message => 'Bogus Gateway: Forced failure' }, :test => true)
13
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
14
14
  end
15
15
  end
16
16
 
17
17
  def purchase(money, credit_card, options = {})
18
18
  if VALID_CCS.include? credit_card.number
19
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'A' })
19
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
20
20
  else
21
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', :message => 'Bogus Gateway: Forced failure', :test => true)
21
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
22
22
  end
23
23
  end
24
24
 
@@ -1,8 +1,10 @@
1
1
  module Spree
2
2
  class Gateway < PaymentMethod
3
+ FROM_DOLLAR_TO_CENT_RATE = 100.0
4
+
3
5
  delegate :authorize, :purchase, :capture, :void, :credit, to: :provider
4
6
 
5
- validates :name, :type, presence: true
7
+ validates :type, presence: true
6
8
 
7
9
  preference :server, :string, default: 'test'
8
10
  preference :test_mode, :boolean, default: true
@@ -11,16 +13,11 @@ module Spree
11
13
  CreditCard
12
14
  end
13
15
 
14
- # instantiates the selected gateway and configures with the options stored in the database
15
- def self.current
16
- super
17
- end
18
-
19
16
  def provider
20
17
  gateway_options = options
21
18
  gateway_options.delete :login if gateway_options.has_key?(:login) and gateway_options[:login].nil?
22
19
  if gateway_options[:server]
23
- ActiveMerchant::Billing::Base.gateway_mode = gateway_options[:server].to_sym
20
+ ActiveMerchant::Billing::Base.mode = gateway_options[:server].to_sym
24
21
  end
25
22
  @provider ||= provider_class.new(gateway_options)
26
23
  end
@@ -45,6 +42,10 @@ module Spree
45
42
  'gateway'
46
43
  end
47
44
 
45
+ def exchange_multiplier
46
+ FROM_DOLLAR_TO_CENT_RATE
47
+ end
48
+
48
49
  def supports?(source)
49
50
  return true unless provider_class.respond_to? :supports?
50
51
  return false unless source.brand
@@ -9,12 +9,12 @@ module Spree
9
9
  path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
10
10
  convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
11
11
  validates_attachment :attachment,
12
- :presence => true,
13
- :content_type => { :content_type => %w(image/jpeg image/jpg image/png image/gif) }
12
+ presence: true,
13
+ content_type: { content_type: %w(image/jpeg image/jpg image/png image/gif) }
14
14
 
15
15
  # save the w,h of the original image (from which others can be calculated)
16
16
  # we need to look at the write-queue for images which have not been saved yet
17
- after_post_process :find_dimensions
17
+ before_save :find_dimensions, if: :attachment_updated_at_changed?
18
18
 
19
19
  #used by admin products autocomplete
20
20
  def mini_url
@@ -1,23 +1,27 @@
1
1
  module Spree
2
2
  class InventoryUnit < Spree::Base
3
- belongs_to :variant, class_name: "Spree::Variant", inverse_of: :inventory_units
4
- belongs_to :order, class_name: "Spree::Order", inverse_of: :inventory_units
5
- belongs_to :shipment, class_name: "Spree::Shipment", touch: true, inverse_of: :inventory_units
6
- belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization", inverse_of: :inventory_units
7
- belongs_to :line_item, class_name: "Spree::LineItem", inverse_of: :inventory_units
3
+
4
+ with_options inverse_of: :inventory_units do
5
+ belongs_to :variant, class_name: "Spree::Variant"
6
+ belongs_to :order, class_name: "Spree::Order"
7
+ belongs_to :shipment, class_name: "Spree::Shipment", touch: true, optional: true
8
+ belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization"
9
+ belongs_to :line_item, class_name: "Spree::LineItem"
10
+ end
8
11
 
9
12
  has_many :return_items, inverse_of: :inventory_unit
10
13
  has_one :original_return_item, class_name: "Spree::ReturnItem", foreign_key: :exchange_inventory_unit_id
11
14
 
12
15
  scope :backordered, -> { where state: 'backordered' }
13
16
  scope :on_hand, -> { where state: 'on_hand' }
17
+ scope :on_hand_or_backordered, -> { where state: ['backordered', 'on_hand'] }
14
18
  scope :shipped, -> { where state: 'shipped' }
15
19
  scope :returned, -> { where state: 'returned' }
16
20
  scope :backordered_per_variant, ->(stock_item) do
17
21
  includes(:shipment, :order)
18
- .where("spree_shipments.state != 'canceled'").references(:shipment)
22
+ .where.not(spree_shipments: { state: 'canceled' })
19
23
  .where(variant_id: stock_item.variant_id)
20
- .where('spree_orders.completed_at is not null')
24
+ .where.not(spree_orders: { completed_at: nil })
21
25
  .backordered.order("spree_orders.completed_at ASC")
22
26
  end
23
27
 
@@ -49,13 +53,8 @@ module Spree
49
53
  end
50
54
  end
51
55
 
52
- def self.finalize_units!(inventory_units)
53
- inventory_units.map do |iu|
54
- iu.update_columns(
55
- pending: false,
56
- updated_at: Time.now,
57
- )
58
- end
56
+ def self.finalize_units!
57
+ update_all(pending: false, updated_at: Time.current)
59
58
  end
60
59
 
61
60
  def find_stock_item
@@ -3,24 +3,11 @@ module Spree
3
3
  class LegacyUser < Spree::Base
4
4
  include UserAddress
5
5
  include UserPaymentSource
6
+ include UserMethods
6
7
 
7
8
  self.table_name = 'spree_users'
8
9
 
9
- has_many :orders, foreign_key: :user_id
10
-
11
- before_destroy :check_completed_orders
12
-
13
- def has_spree_role?(role)
14
- true
15
- end
16
-
17
10
  attr_accessor :password
18
11
  attr_accessor :password_confirmation
19
-
20
- private
21
-
22
- def check_completed_orders
23
- raise Spree::Core::DestroyWithOrdersError if orders.complete.present?
24
- end
25
12
  end
26
13
  end
@@ -1,8 +1,11 @@
1
1
  module Spree
2
2
  class LineItem < Spree::Base
3
- before_validation :invalid_quantity_check
4
- belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items, touch: true
5
- belongs_to :variant, class_name: "Spree::Variant", inverse_of: :line_items
3
+ before_validation :ensure_valid_quantity
4
+
5
+ with_options inverse_of: :line_items do
6
+ belongs_to :order, class_name: "Spree::Order", touch: true
7
+ belongs_to :variant, class_name: "Spree::Variant"
8
+ end
6
9
  belongs_to :tax_category, class_name: "Spree::TaxCategory"
7
10
 
8
11
  has_one :product, through: :variant
@@ -13,17 +16,15 @@ module Spree
13
16
  before_validation :copy_price
14
17
  before_validation :copy_tax_category
15
18
 
16
- validates :variant, presence: true
17
- validates :quantity, numericality: {
18
- only_integer: true,
19
- greater_than: -1,
20
- message: Spree.t('validation.must_be_int')
21
- }
19
+ validates :variant, :order, presence: true
20
+ validates :quantity, numericality: { only_integer: true, message: Spree.t('validation.must_be_int') }
22
21
  validates :price, numericality: true
22
+
23
23
  validates_with Stock::AvailabilityValidator
24
+ validate :ensure_proper_currency, if: -> { order.present? }
25
+
26
+ before_destroy :verify_order_inventory, if: -> { order.has_checkout_step?("delivery") }
24
27
 
25
- validate :ensure_proper_currency
26
- before_destroy :update_inventory
27
28
  before_destroy :destroy_inventory_units
28
29
 
29
30
  after_save :update_inventory
@@ -31,7 +32,9 @@ module Spree
31
32
 
32
33
  after_create :update_tax_charge
33
34
 
34
- delegate :name, :description, :sku, :should_track_inventory?, to: :variant
35
+ delegate :name, :description, :sku, :should_track_inventory?, :product, :options_text, to: :variant
36
+ delegate :brand, :category, to: :product
37
+ delegate :tax_zone, to: :order
35
38
 
36
39
  attr_accessor :target_shipment
37
40
 
@@ -40,49 +43,51 @@ module Spree
40
43
 
41
44
  def copy_price
42
45
  if variant
43
- self.price = variant.price if price.nil?
46
+ update_price if price.nil?
44
47
  self.cost_price = variant.cost_price if cost_price.nil?
45
48
  self.currency = variant.currency if currency.nil?
46
49
  end
47
50
  end
48
51
 
52
+ def update_price
53
+ self.price = variant.price_including_vat_for(tax_zone: tax_zone)
54
+ end
55
+
49
56
  def copy_tax_category
50
57
  if variant
51
58
  self.tax_category = variant.tax_category
52
59
  end
53
60
  end
54
61
 
62
+ extend DisplayMoney
63
+ money_methods :amount, :subtotal, :discounted_amount, :final_amount, :total, :price
64
+
65
+ alias single_money display_price
66
+ alias single_display_amount display_price
67
+
55
68
  def amount
56
69
  price * quantity
57
70
  end
71
+
58
72
  alias subtotal amount
59
73
 
60
- def discounted_amount
61
- amount + promo_total
74
+ def taxable_amount
75
+ amount + taxable_adjustment_total
62
76
  end
63
77
 
64
- def discounted_money
65
- Spree::Money.new(discounted_amount, { currency: currency })
66
- end
78
+ alias discounted_money display_discounted_amount
79
+ alias_method :discounted_amount, :taxable_amount
67
80
 
68
81
  def final_amount
69
82
  amount + adjustment_total
70
83
  end
71
- alias total final_amount
72
84
 
73
- def single_money
74
- Spree::Money.new(price, { currency: currency })
75
- end
76
- alias single_display_amount single_money
77
-
78
- def money
79
- Spree::Money.new(amount, { currency: currency })
80
- end
81
- alias display_total money
82
- alias display_amount money
85
+ alias total final_amount
86
+ alias money display_total
83
87
 
84
88
  def invalid_quantity_check
85
- self.quantity = 0 if quantity.nil? || quantity < 0
89
+ warn "`invalid_quantity_check` is deprecated. Use private `ensure_valid_quantity` instead."
90
+ ensure_valid_quantity
86
91
  end
87
92
 
88
93
  def sufficient_stock?
@@ -93,9 +98,15 @@ module Spree
93
98
  !sufficient_stock?
94
99
  end
95
100
 
96
- # Remove product default_scope `deleted_at: nil`
97
- def product
98
- variant.product
101
+ def options=(options = {})
102
+ return unless options.present?
103
+
104
+ opts = options.dup # we will be deleting from the hash, so leave the caller's copy intact
105
+
106
+ currency = opts.delete(:currency) || order.try(:currency)
107
+
108
+ update_price_from_modifier(currency, opts)
109
+ assign_attributes opts
99
110
  end
100
111
 
101
112
  # Remove variant default_scope `deleted_at: nil`
@@ -103,55 +114,56 @@ module Spree
103
114
  Spree::Variant.unscoped { super }
104
115
  end
105
116
 
106
- def options=(options={})
107
- return unless options.present?
108
-
109
- opts = options.dup # we will be deleting from the hash, so leave the caller's copy intact
117
+ private
110
118
 
111
- currency = opts.delete(:currency) || order.try(:currency)
119
+ def ensure_valid_quantity
120
+ self.quantity = 0 if quantity.nil? || quantity < 0
121
+ end
112
122
 
123
+ def update_price_from_modifier(currency, opts)
113
124
  if currency
114
125
  self.currency = currency
115
- self.price = variant.price_in(currency).amount +
116
- variant.price_modifier_amount_in(currency, opts)
126
+ self.price = variant.price_in(currency).amount +
127
+ variant.price_modifier_amount_in(currency, opts)
117
128
  else
118
- self.price = variant.price +
119
- variant.price_modifier_amount(opts)
129
+ self.price = variant.price +
130
+ variant.price_modifier_amount(opts)
120
131
  end
121
-
122
- self.assign_attributes opts
123
132
  end
124
133
 
125
- private
126
- def update_inventory
127
- if (changed? || target_shipment.present?) && self.order.has_checkout_step?("delivery")
128
- Spree::OrderInventory.new(self.order, self).verify(target_shipment)
129
- end
134
+ def update_inventory
135
+ if (changed? || target_shipment.present?) && order.has_checkout_step?("delivery")
136
+ verify_order_inventory
130
137
  end
138
+ end
131
139
 
132
- def destroy_inventory_units
133
- inventory_units.destroy_all
134
- end
140
+ def verify_order_inventory
141
+ Spree::OrderInventory.new(order, self).verify(target_shipment)
142
+ end
135
143
 
136
- def update_adjustments
137
- if quantity_changed?
138
- recalculate_adjustments
139
- update_tax_charge # Called to ensure pre_tax_amount is updated.
140
- end
141
- end
144
+ def destroy_inventory_units
145
+ throw(:abort) unless inventory_units.destroy_all
146
+ end
142
147
 
143
- def recalculate_adjustments
144
- Adjustable::AdjustmentsUpdater.update(self)
148
+ def update_adjustments
149
+ if quantity_changed?
150
+ recalculate_adjustments
151
+ update_tax_charge # Called to ensure pre_tax_amount is updated.
145
152
  end
153
+ end
146
154
 
147
- def update_tax_charge
148
- Spree::TaxRate.adjust(order, [self])
149
- end
155
+ def recalculate_adjustments
156
+ Adjustable::AdjustmentsUpdater.update(self)
157
+ end
150
158
 
151
- def ensure_proper_currency
152
- unless currency == order.currency
153
- errors.add(:currency, :must_match_order_currency)
154
- end
159
+ def update_tax_charge
160
+ Spree::TaxRate.adjust(order, [self])
161
+ end
162
+
163
+ def ensure_proper_currency
164
+ unless currency == order.currency
165
+ errors.add(:currency, :must_match_order_currency)
155
166
  end
167
+ end
156
168
  end
157
169
  end
@@ -7,10 +7,7 @@ module Spree
7
7
  after_rollback :save_anyway
8
8
 
9
9
  def save_anyway
10
- log = Spree::LogEntry.new
11
- log.source = source
12
- log.details = details
13
- log.save!
10
+ Spree::LogEntry.create!(source: source, details: details)
14
11
  end
15
12
 
16
13
  def parsed_details
@@ -2,20 +2,29 @@ module Spree
2
2
  class OptionType < Spree::Base
3
3
  acts_as_list
4
4
 
5
- has_many :option_values, -> { order(:position) }, dependent: :destroy, inverse_of: :option_type
6
- has_many :product_option_types, dependent: :destroy, inverse_of: :option_type
5
+ with_options dependent: :destroy, inverse_of: :option_type do
6
+ has_many :option_values, -> { order(:position) }
7
+ has_many :product_option_types
8
+ end
9
+
7
10
  has_many :products, through: :product_option_types
8
- has_and_belongs_to_many :prototypes, join_table: 'spree_option_types_prototypes'
9
11
 
10
- validates :name, presence: true, uniqueness: true
11
- validates :presentation, presence: true
12
+ has_many :option_type_prototypes, class_name: 'Spree::OptionTypePrototype'
13
+ has_many :prototypes, through: :option_type_prototypes, class_name: 'Spree::Prototype'
12
14
 
13
- default_scope { order("#{self.table_name}.position") }
15
+ with_options presence: true do
16
+ validates :name, uniqueness: { allow_blank: true }
17
+ validates :presentation
18
+ end
19
+
20
+ default_scope { order(:position) }
14
21
 
15
22
  accepts_nested_attributes_for :option_values, reject_if: lambda { |ov| ov[:name].blank? || ov[:presentation].blank? }, allow_destroy: true
16
23
 
17
24
  after_touch :touch_all_products
18
25
 
26
+ private
27
+
19
28
  def touch_all_products
20
29
  products.update_all(updated_at: Time.current)
21
30
  end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ class OptionTypePrototype < Spree::Base
3
+ belongs_to :option_type, class_name: 'Spree::OptionType'
4
+ belongs_to :prototype, class_name: 'Spree::Prototype'
5
+
6
+ validates :prototype, :option_type, presence: true
7
+ validates :prototype_id, uniqueness: { scope: :option_type_id }, allow_nil: true
8
+ end
9
+ end
@@ -2,15 +2,23 @@ module Spree
2
2
  class OptionValue < Spree::Base
3
3
  belongs_to :option_type, class_name: 'Spree::OptionType', touch: true, inverse_of: :option_values
4
4
  acts_as_list scope: :option_type
5
- has_and_belongs_to_many :variants, join_table: 'spree_option_values_variants', class_name: "Spree::Variant"
6
5
 
7
- validates :name, presence: true, uniqueness: { scope: :option_type_id }
8
- validates :presentation, presence: true
6
+ has_many :option_value_variants, class_name: 'Spree::OptionValueVariant'
7
+ has_many :variants, through: :option_value_variants, class_name: 'Spree::Variant'
8
+
9
+ with_options presence: true do
10
+ validates :name, uniqueness: { scope: :option_type_id, allow_blank: true }
11
+ validates :presentation
12
+ end
9
13
 
10
14
  after_touch :touch_all_variants
11
15
 
16
+ delegate :name, :presentation, to: :option_type, prefix: true, allow_nil: true
17
+
12
18
  self.whitelisted_ransackable_attributes = ['presentation']
13
19
 
20
+ private
21
+
14
22
  def touch_all_variants
15
23
  variants.update_all(updated_at: Time.current)
16
24
  end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class OptionValueVariant < Spree::Base
3
+ belongs_to :option_value, class_name: 'Spree::OptionValue'
4
+ belongs_to :variant, class_name: 'Spree::Variant'
5
+ end
6
+ end
@@ -62,7 +62,7 @@ module Spree
62
62
 
63
63
  event :return do
64
64
  transition to: :returned,
65
- from: [:complete, :awaiting_return, :canceled],
65
+ from: [:complete, :awaiting_return, :canceled, :resumed],
66
66
  if: :all_inventory_units_returned?
67
67
  end
68
68
 
@@ -74,6 +74,9 @@ module Spree
74
74
  transition to: :awaiting_return
75
75
  end
76
76
 
77
+ before_transition to: :complete, do: :ensure_line_item_variants_are_not_discontinued
78
+ before_transition to: :complete, do: :ensure_line_items_are_in_stock
79
+
77
80
  if states[:payment]
78
81
  before_transition to: :complete do |order|
79
82
  if order.payment_required? && order.payments.valid.empty?
@@ -86,12 +89,12 @@ module Spree
86
89
  after_transition to: :complete, do: :persist_user_credit_card
87
90
  before_transition to: :payment, do: :set_shipments_cost
88
91
  before_transition to: :payment, do: :create_tax_charge!
89
- before_transition to: :payment, do: :assign_default_credit_card
90
92
  end
91
93
 
92
94
  before_transition from: :cart, do: :ensure_line_items_present
93
95
 
94
96
  if states[:address]
97
+ before_transition from: :address, do: :update_line_item_prices!
95
98
  before_transition from: :address, do: :create_tax_charge!
96
99
  before_transition to: :address, do: :assign_default_addresses!
97
100
  before_transition from: :address, do: :persist_user_address!
@@ -104,12 +107,9 @@ module Spree
104
107
  before_transition from: :delivery, do: :apply_free_shipping_promotions
105
108
  end
106
109
 
107
- before_transition to: :resumed, do: :ensure_line_item_variants_are_not_deleted
110
+ before_transition to: :resumed, do: :ensure_line_item_variants_are_not_discontinued
108
111
  before_transition to: :resumed, do: :ensure_line_items_are_in_stock
109
112
 
110
- before_transition to: :complete, do: :ensure_line_item_variants_are_not_deleted
111
- before_transition to: :complete, do: :ensure_line_items_are_in_stock
112
-
113
113
  after_transition to: :complete, do: :finalize!
114
114
  after_transition to: :resumed, do: :after_resume
115
115
  after_transition to: :canceled, do: :after_cancel
@@ -214,7 +214,7 @@ module Spree
214
214
  checkout_step_index(state) > checkout_step_index(self.state)
215
215
  end
216
216
 
217
- define_callbacks :updating_from_params, terminator: ->(_target, result) { result == false }
217
+ define_callbacks :updating_from_params
218
218
 
219
219
  set_callback :updating_from_params, :before, :update_params_payment_source
220
220
 
@@ -282,15 +282,12 @@ module Spree
282
282
 
283
283
  def persist_user_credit_card
284
284
  if !temporary_credit_card && user_id && valid_credit_cards.present?
285
- default_cc = valid_credit_cards.first
286
- default_cc.user_id = user_id
287
- default_cc.default = true
288
- default_cc.save
285
+ valid_credit_cards.first.update(user_id: user_id, default: true)
289
286
  end
290
287
  end
291
288
 
292
289
  def assign_default_credit_card
293
- if payments.from_credit_card.count == 0 && user_has_valid_default_card? && payment_required?
290
+ if payments.from_credit_card.size == 0 && user_has_valid_default_card? && payment_required?
294
291
  cc = user.default_credit_card
295
292
  payments.create!(payment_method_id: cc.payment_method_id, source: cc, amount: total)
296
293
  end
@@ -329,7 +326,7 @@ module Spree
329
326
  if @updating_params[:order] && (@updating_params[:order][:payments_attributes] ||
330
327
  @updating_params[:order][:existing_card])
331
328
  @updating_params[:order][:payments_attributes] ||= [{}]
332
- @updating_params[:order][:payments_attributes].first[:amount] = total
329
+ @updating_params[:order][:payments_attributes].first[:amount] = order_total_after_store_credit
333
330
  end
334
331
  end
335
332
  end
@@ -7,7 +7,7 @@ module Spree
7
7
 
8
8
  def homogenize_line_item_currencies
9
9
  update_line_item_currencies!
10
- update!
10
+ update_with_updater!
11
11
  end
12
12
 
13
13
  end
@@ -0,0 +1,96 @@
1
+ module Spree
2
+ class Order < Spree::Base
3
+ module StoreCredit
4
+ def add_store_credit_payments
5
+ payments.store_credits.where(state: 'checkout').map(&:invalidate!)
6
+
7
+ remaining_total = outstanding_balance
8
+
9
+ if user && user.store_credits.any?
10
+ payment_method = Spree::PaymentMethod::StoreCredit.available.first
11
+ raise "Store credit payment method could not be found" unless payment_method
12
+
13
+ user.store_credits.order_by_priority.each do |credit|
14
+ break if remaining_total.zero?
15
+ next if credit.amount_remaining.zero?
16
+
17
+ amount_to_take = store_credit_amount(credit, remaining_total)
18
+ create_store_credit_payment(payment_method, credit, amount_to_take)
19
+ remaining_total -= amount_to_take
20
+ end
21
+ end
22
+ end
23
+
24
+ def covered_by_store_credit?
25
+ return false unless user
26
+ user.total_available_store_credit >= total
27
+ end
28
+ alias_method :covered_by_store_credit, :covered_by_store_credit?
29
+
30
+ def total_available_store_credit
31
+ return 0.0 unless user
32
+ user.total_available_store_credit
33
+ end
34
+
35
+ def could_use_store_credit?
36
+ total_available_store_credit > 0
37
+ end
38
+
39
+ def order_total_after_store_credit
40
+ total - total_applicable_store_credit
41
+ end
42
+
43
+ def total_applicable_store_credit
44
+ if payment? || confirm? || complete?
45
+ total_applied_store_credit
46
+ else
47
+ [total, (user.try(:total_available_store_credit) || 0.0)].min
48
+ end
49
+ end
50
+
51
+ def total_applied_store_credit
52
+ payments.store_credits.valid.sum(:amount)
53
+ end
54
+
55
+ def using_store_credit?
56
+ total_applied_store_credit > 0
57
+ end
58
+
59
+ def display_total_applicable_store_credit
60
+ Spree::Money.new(-total_applicable_store_credit, currency: currency)
61
+ end
62
+
63
+ def display_total_applied_store_credit
64
+ Spree::Money.new(-total_applied_store_credit, currency: currency)
65
+ end
66
+
67
+ def display_order_total_after_store_credit
68
+ Spree::Money.new(order_total_after_store_credit, currency: currency)
69
+ end
70
+
71
+ def display_total_available_store_credit
72
+ Spree::Money.new(total_available_store_credit, currency: currency)
73
+ end
74
+
75
+ def display_store_credit_remaining_after_capture
76
+ Spree::Money.new(total_available_store_credit - total_applicable_store_credit, currency: currency)
77
+ end
78
+
79
+ private
80
+
81
+ def create_store_credit_payment(payment_method, credit, amount)
82
+ payments.create!(
83
+ source: credit,
84
+ payment_method: payment_method,
85
+ amount: amount,
86
+ state: 'checkout',
87
+ response_code: credit.generate_authorization_code
88
+ )
89
+ end
90
+
91
+ def store_credit_amount(credit, total)
92
+ [credit.amount_remaining, total].min
93
+ end
94
+ end
95
+ end
96
+ end