spree_core 3.0.9 → 3.2.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -1 +1 @@
1
- Spree::BaseController.send(:include, Spree::ViewContext)
1
+ Spree::BaseController.include Spree::ViewContext
@@ -8,7 +8,9 @@ module Spree
8
8
  separator, delimiter = I18n.t([:'number.currency.format.separator', :'number.currency.format.delimiter'])
9
9
  non_number_characters = /[^0-9\-#{separator}]/
10
10
 
11
- # strip everything else first
11
+ # work on a copy, prevent original argument modification
12
+ number = number.dup
13
+ # strip everything else first, including thousands delimiter
12
14
  number.gsub!(non_number_characters, '')
13
15
  # then replace the locale-specific decimal separator with the standard separator if necessary
14
16
  number.gsub!(separator, '.') unless separator == '.'
@@ -20,6 +20,7 @@ module Spree
20
20
  :stock_location_attributes,
21
21
  :stock_movement_attributes,
22
22
  :store_attributes,
23
+ :store_credit_attributes,
23
24
  :taxon_attributes,
24
25
  :taxonomy_attributes,
25
26
  :user_attributes,
@@ -44,7 +45,7 @@ module Spree
44
45
 
45
46
  @@image_attributes = [:alt, :attachment, :position, :viewable_type, :viewable_id]
46
47
 
47
- @@inventory_unit_attributes = [:shipment, :variant_id]
48
+ @@inventory_unit_attributes = [:shipment, :shipment_id, :variant_id]
48
49
 
49
50
  @@line_item_attributes = [:id, :variant_id, :quantity]
50
51
 
@@ -57,7 +58,7 @@ module Spree
57
58
  @@product_properties_attributes = [:property_name, :value, :position]
58
59
 
59
60
  @@product_attributes = [
60
- :name, :description, :available_on, :permalink, :meta_description,
61
+ :name, :description, :available_on, :discontinue_on, :permalink, :meta_description,
61
62
  :meta_keywords, :price, :sku, :deleted_at, :prototype_id,
62
63
  :option_values_hash, :weight, :height, :width, :depth,
63
64
  :shipping_category_id, :tax_category_id,
@@ -92,6 +93,8 @@ module Spree
92
93
  @@store_attributes = [:name, :url, :seo_title, :meta_keywords,
93
94
  :meta_description, :default_currency, :mail_from_address]
94
95
 
96
+ @@store_credit_attributes = [:amount, :category_id, :memo]
97
+
95
98
  @@taxonomy_attributes = [:name]
96
99
 
97
100
  @@taxon_attributes = [
@@ -102,7 +105,7 @@ module Spree
102
105
  @@user_attributes = [:email, :password, :password_confirmation]
103
106
 
104
107
  @@variant_attributes = [
105
- :name, :presentation, :cost_price, :lock_version,
108
+ :name, :presentation, :cost_price, :discontinue_on, :lock_version,
106
109
  :position, :track_inventory,
107
110
  :product_id, :product, :option_values_attributes, :price,
108
111
  :weight, :height, :width, :depth, :sku, :cost_currency,
@@ -24,9 +24,9 @@ module Spree
24
24
  end
25
25
 
26
26
  RSpec.configure do |config|
27
- config.include Spree::TestingSupport::Caching, :caching => true
27
+ config.include Spree::TestingSupport::Caching, caching: true
28
28
 
29
- config.before(:each, :caching => true) do
29
+ config.before(:each, caching: true) do
30
30
  ActionController::Base.perform_caching = true
31
31
 
32
32
  ActiveSupport::Notifications.subscribe("read_fragment.action_controller") do |event, start_time, finish_time, _, details|
@@ -40,7 +40,7 @@ RSpec.configure do |config|
40
40
  end
41
41
  end
42
42
 
43
- config.after(:each, :caching => true) do
43
+ config.after(:each, caching: true) do
44
44
  ActionController::Base.perform_caching = false
45
45
  Rails.cache.clear
46
46
  end
@@ -18,9 +18,6 @@ namespace :common do
18
18
  puts "Setting up dummy database..."
19
19
  system("bundle exec rake db:drop db:create db:migrate > #{File::NULL}")
20
20
 
21
- puts "Precompiling assets..."
22
- system("bundle exec rake assets:precompile > #{File::NULL}")
23
-
24
21
  begin
25
22
  require "generators/#{ENV['LIB_NAME']}/install/install_generator"
26
23
  puts 'Running extension installation generator...'
@@ -28,6 +25,9 @@ namespace :common do
28
25
  rescue LoadError
29
26
  puts 'Skipping installation no generator to run...'
30
27
  end
28
+
29
+ puts "Precompiling assets..."
30
+ system("bundle exec rake assets:precompile > #{File::NULL}")
31
31
  end
32
32
 
33
33
  task :seed do |_t|
@@ -6,7 +6,7 @@
6
6
  #
7
7
  # require 'spree/testing_support/controller_requests'
8
8
  # RSpec.configure do |c|
9
- # c.include Spree::TestingSupport::ControllerRequests, :type => :controller
9
+ # c.include Spree::TestingSupport::ControllerRequests, type: :controller
10
10
  # end
11
11
  #
12
12
  # Then, in your controller tests, you can access spree routes like this:
@@ -80,13 +80,13 @@ module Spree
80
80
 
81
81
  def process_spree_action(action, parameters = nil, session = nil, flash = nil, method = "GET")
82
82
  parameters ||= {}
83
- process(action, method, parameters, session, flash)
83
+ process(action, method: method, params: parameters, session: session, flash: flash)
84
84
  end
85
85
 
86
86
  def process_spree_xhr_action(action, parameters = nil, session = nil, flash = nil, method = :get)
87
87
  parameters ||= {}
88
- parameters.reverse_merge!(:format => :json)
89
- xml_http_request(method, action, parameters, session, flash)
88
+ parameters.reverse_merge!(format: :json)
89
+ process(action, method: method, params: parameters, session: session, flash: flash, xhr: true)
90
90
  end
91
91
  end
92
92
  end
@@ -10,7 +10,7 @@ FactoryGirl.define do
10
10
  phone '555-555-0199'
11
11
  alternative_phone '555-555-0199'
12
12
 
13
- state { |address| address.association(:state) }
13
+ state { |address| address.association(:state) || Spree::State.last }
14
14
  country do |address|
15
15
  if address.state
16
16
  address.state.country
@@ -1,7 +1,7 @@
1
1
  FactoryGirl.define do
2
2
  factory :country, class: Spree::Country do
3
- iso_name 'UNITED STATES'
4
- name 'United States of America'
3
+ sequence(:iso_name) { |n| "ISO_NAME_#{n}" }
4
+ sequence(:name) { |n| "NAME_#{n}" }
5
5
  iso 'US'
6
6
  iso3 'USA'
7
7
  numcode 840
@@ -2,7 +2,6 @@ FactoryGirl.define do
2
2
  factory :line_item, class: Spree::LineItem do
3
3
  quantity 1
4
4
  price { BigDecimal.new('10.00') }
5
- pre_tax_amount { price }
6
5
  order
7
6
  transient do
8
7
  association :product
@@ -45,7 +45,7 @@ FactoryGirl.define do
45
45
  create(:shipment, order: order, cost: evaluator.shipment_cost)
46
46
  order.shipments.reload
47
47
 
48
- order.update!
48
+ order.update_with_updater!
49
49
  end
50
50
 
51
51
  factory :completed_order_with_totals do
@@ -53,7 +53,7 @@ FactoryGirl.define do
53
53
 
54
54
  after(:create) do |order, evaluator|
55
55
  order.refresh_shipment_rates(evaluator.shipping_method_filter)
56
- order.update_column(:completed_at, Time.now)
56
+ order.update_column(:completed_at, Time.current)
57
57
  end
58
58
 
59
59
  factory :completed_order_with_pending_payment do
@@ -81,6 +81,7 @@ FactoryGirl.define do
81
81
  shipment.inventory_units.update_all state: 'shipped'
82
82
  shipment.update_column('state', 'shipped')
83
83
  end
84
+ order.update_column('shipment_state', 'shipped')
84
85
  order.reload
85
86
  end
86
87
  end
@@ -20,4 +20,9 @@ FactoryGirl.define do
20
20
  association(:payment_method, factory: :check_payment_method)
21
21
  order
22
22
  end
23
+
24
+ factory :store_credit_payment, class: Spree::Payment, parent: :payment do
25
+ association(:payment_method, factory: :store_credit_payment_method)
26
+ association(:source, factory: :store_credit)
27
+ end
23
28
  end
@@ -12,4 +12,12 @@ FactoryGirl.define do
12
12
  factory :simple_credit_card_payment_method, class: Spree::Gateway::BogusSimple do
13
13
  name 'Credit Card'
14
14
  end
15
+
16
+ factory :store_credit_payment_method, class: Spree::PaymentMethod::StoreCredit do
17
+ type "Spree::PaymentMethod::StoreCredit"
18
+ name "Store Credit"
19
+ description "Store Credit"
20
+ active true
21
+ auto_capture true
22
+ end
15
23
  end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :promotion_rule, class: Spree::PromotionRule do
3
+ association :promotion
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  FactoryGirl.define do
2
- sequence(:refund_transaction_id) { |n| "fake-refund-transaction-#{n}"}
2
+ sequence(:refund_transaction_id) { |n| "fake-refund-transaction-#{n}" }
3
3
 
4
4
  factory :refund, class: Spree::Refund do
5
5
  amount 100.00
@@ -8,7 +8,15 @@ FactoryGirl.define do
8
8
  association(:reason, factory: :refund_reason)
9
9
  end
10
10
 
11
+ factory :default_refund_reason, class: Spree::RefundReason do
12
+ name 'Return processing'
13
+ active true
14
+ mutable false
15
+ end
16
+
11
17
  factory :refund_reason, class: Spree::RefundReason do
12
18
  sequence(:name) { |n| "Refund for return ##{n}" }
19
+ active true
20
+ mutable false
13
21
  end
14
22
  end
@@ -14,5 +14,7 @@ FactoryGirl.define do
14
14
 
15
15
  factory :return_authorization_reason, class: Spree::ReturnAuthorizationReason do
16
16
  sequence(:name) { |n| "Defect ##{n}" }
17
+ active true
18
+ mutable false
17
19
  end
18
20
  end
@@ -1,7 +1,7 @@
1
1
  FactoryGirl.define do
2
2
  factory :state, class: Spree::State do
3
- name 'Alabama'
4
- abbr 'AL'
3
+ sequence(:name) { |n| "STATE_NAME_#{n}" }
4
+ sequence(:abbr) { |n| "STATE_ABBR_#{n}" }
5
5
  country do |country|
6
6
  if usa = Spree::Country.find_by_numcode(840)
7
7
  country = usa
@@ -0,0 +1,9 @@
1
+ FactoryGirl.define do
2
+ factory :store_credit_category, class: Spree::StoreCreditCategory do
3
+ name "Exchange"
4
+ end
5
+
6
+ factory :store_credit_gift_card_category, class: Spree::StoreCreditCategory do
7
+ name Spree::StoreCreditCategory::GIFT_CARD_CATEGORY_NAME
8
+ end
9
+ end
@@ -0,0 +1,8 @@
1
+ FactoryGirl.define do
2
+ factory :store_credit_auth_event, class: Spree::StoreCreditEvent do
3
+ store_credit { create(:store_credit) }
4
+ action { Spree::StoreCredit::AUTHORIZE_ACTION }
5
+ amount { 100.00 }
6
+ authorization_code { "#{store_credit.id}-SC-20140602164814476128" }
7
+ end
8
+ end
@@ -0,0 +1,17 @@
1
+ FactoryGirl.define do
2
+ sequence(:store_credits_order_number) { |n| "R1000#{n}" }
3
+
4
+ factory :store_credit, class: Spree::StoreCredit do
5
+ user
6
+ created_by { create(:user) }
7
+ category { create(:store_credit_category) }
8
+ amount { 150.00 }
9
+ currency { 'USD' }
10
+ credit_type { create(:primary_credit_type) }
11
+ end
12
+
13
+ factory :store_credits_order_without_user, class: Spree::Order do
14
+ number { generate(:store_credits_order_number) }
15
+ bill_address
16
+ end
17
+ end
@@ -0,0 +1,11 @@
1
+ FactoryGirl.define do
2
+ factory :primary_credit_type, class: Spree::StoreCreditType do
3
+ name Spree::StoreCreditType::DEFAULT_TYPE_NAME
4
+ priority { '1' }
5
+ end
6
+
7
+ factory :secondary_credit_type, class: Spree::StoreCreditType do
8
+ name { 'Non-expiring' }
9
+ priority { '2' }
10
+ end
11
+ end
@@ -0,0 +1,5 @@
1
+ FactoryGirl.define do
2
+ factory :tag, class: Spree::Tag do
3
+ sequence(:name) { |n| "Tag ##{n} - #{Kernel.rand(9999)}" }
4
+ end
5
+ end
@@ -1,6 +1,6 @@
1
1
  FactoryGirl.define do
2
2
  sequence :user_authentication_token do |n|
3
- "xxxx#{Time.now.to_i}#{rand(1000)}#{n}xxxxxxxxxxxxx"
3
+ "xxxx#{Time.current.to_i}#{rand(1000)}#{n}xxxxxxxxxxxxx"
4
4
  end
5
5
 
6
6
  factory :user, class: Spree.user_class do
@@ -0,0 +1,6 @@
1
+ FactoryGirl.define do
2
+ factory :zone_member, class: Spree::ZoneMember do
3
+ zone { |member| member.association(:zone) }
4
+ zoneable { |member| member.association(:zoneable) }
5
+ end
6
+ end
@@ -11,9 +11,9 @@ Dir["#{File.dirname(__FILE__)}/factories/**"].each do |f|
11
11
  end
12
12
 
13
13
  FactoryGirl.define do
14
- sequence(:random_string) { Faker::Lorem.sentence }
15
- sequence(:random_description) { Faker::Lorem.paragraphs(1 + Kernel.rand(5)).join("\n") }
16
- sequence(:random_email) { Faker::Internet.email }
14
+ sequence(:random_string) { FFaker::Lorem.sentence }
15
+ sequence(:random_description) { FFaker::Lorem.paragraphs(1 + Kernel.rand(5)).join("\n") }
16
+ sequence(:random_email) { FFaker::Internet.email }
17
17
 
18
18
  sequence(:sku) { |n| "SKU-#{n}" }
19
19
  end
@@ -0,0 +1,18 @@
1
+ module Spree
2
+ module TestingSupport
3
+ module Kernel
4
+
5
+ private
6
+
7
+ def silence_stream(stream)
8
+ old_stream = stream.dup
9
+ stream.reopen(RbConfig::CONFIG['host_os'] =~ /mswin|mingw/ ? 'NUL:' : '/dev/null')
10
+ stream.sync = true
11
+ yield
12
+ ensure
13
+ stream.reopen(old_stream)
14
+ old_stream.close
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,189 @@
1
+ module Spree
2
+ module TestingSupport
3
+ module Microdata
4
+ # code extracted and modified from 'microdata' gem
5
+ class Document
6
+ attr_reader :items, :doc
7
+
8
+ def initialize(content)
9
+ @doc = Nokogiri::HTML(content)
10
+ @items = extract_items
11
+ end
12
+
13
+ def extract_items
14
+ itemscopes = @doc.search('//*[@itemscope and not(@itemprop)]')
15
+ return nil unless itemscopes
16
+
17
+ itemscopes.map do |itemscope|
18
+ Item.new(itemscope)
19
+ end
20
+ end
21
+ end
22
+
23
+ class Item
24
+ attr_reader :type, :properties, :id
25
+
26
+ def initialize(top_node)
27
+ @top_node = top_node
28
+ @type = extract_item_type
29
+ @id = extract_item_id
30
+ @properties = {}
31
+ add_item_ref_properties(@top_node)
32
+ parse_elements(extract_elements(@top_node))
33
+ end
34
+
35
+ def to_hash
36
+ hash = {}
37
+ hash[:id] = id if id
38
+ hash[:type] = type if type
39
+ hash[:properties] = {}
40
+ properties.each do |name, values|
41
+ final_values = values.map do |value|
42
+ if value.reponds_to?(:to_hash)
43
+ value.to_hash
44
+ else
45
+ value
46
+ end
47
+ end
48
+ hash[:properties][name] = final_values
49
+ end
50
+ hash
51
+ end
52
+
53
+ private
54
+
55
+ def extract_elements(node)
56
+ node.search('./*')
57
+ end
58
+
59
+ def extract_item_id
60
+ (value = @top_node.attribute('itemid')) ? value.value : nil
61
+ end
62
+
63
+ def extract_item_type
64
+ (value = @top_node.attribute('itemtype')) ? value.value.split(' ') : nil
65
+ end
66
+
67
+ def parse_elements(elements)
68
+ elements.each { |element| parse_element(element) }
69
+ end
70
+
71
+ def parse_element(element)
72
+ item_scope = element.attribute('itemscope')
73
+ item_prop = element.attribute('itemprop')
74
+ internal_elements = extract_elements(element)
75
+ add_item_prop(element) if item_scope || item_prop
76
+ parse_elements(internal_elements) if internal_elements && !item_scope
77
+ end
78
+
79
+ # Add an 'itemprop' to the properties
80
+ def add_item_prop(item_prop)
81
+ properties = Itemprop.parse(item_prop, @page_url)
82
+ properties.each { |name, value| (@properties[name] ||= []) << value }
83
+ end
84
+
85
+ # Add any properties referred to by 'itemref'
86
+ def add_item_ref_properties(element)
87
+ item_ref = element.attribute('itemref')
88
+ if item_ref
89
+ item_ref.value.split(' ').each { |id| parse_elements(find_with_id(id)) }
90
+ end
91
+ end
92
+
93
+ # Find an element with a matching id
94
+ def find_with_id(id)
95
+ @top_node.search("//*[@id='#{id}']")
96
+ end
97
+ end
98
+
99
+ class Itemprop
100
+ NON_TEXTCONTENT_ELEMENTS = {
101
+ 'a' => 'href', 'area' => 'href',
102
+ 'audio' => 'src', 'embed' => 'src',
103
+ 'iframe' => 'src', 'img' => 'src',
104
+ 'link' => 'href', 'meta' => 'content',
105
+ 'object' => 'data', 'source' => 'src',
106
+ 'time' => 'datetime', 'track' => 'src',
107
+ 'video' => 'src'
108
+ }.freeze
109
+ URL_ATTRIBUTES = ['data', 'href', 'src'].freeze
110
+
111
+ # A Hash representing the properties.
112
+ # Hash is of the form {'property name' => 'value'}
113
+ attr_reader :properties
114
+
115
+ # Create a new Itemprop object
116
+ # [element] The itemprop element to be parsed
117
+ # [page_url] The url of the page, including filename, used to form
118
+ # absolute urls
119
+ def initialize(element, page_url = nil)
120
+ @element = element
121
+ @page_url = page_url
122
+ @properties = extract_properties
123
+ end
124
+
125
+ # Parse the element and return a hash representing the properties.
126
+ # Hash is of the form {'property name' => 'value'}
127
+ # [element] The itemprop element to be parsed
128
+ # [page_url] The url of the page, including filename, used to form
129
+ # absolute urls
130
+ def self.parse(element, page_url = nil)
131
+ new(element, page_url).properties
132
+ end
133
+
134
+ private
135
+
136
+ def extract_properties
137
+ prop_names = extract_property_names
138
+ prop_names.each_with_object({}) do |name, memo|
139
+ memo[name] = extract_property
140
+ end
141
+ end
142
+
143
+ # This returns an empty string if can't form a valid
144
+ # absolute url as per the Microdata spec.
145
+
146
+ def make_absolute_url(url)
147
+ return url unless URI.parse(url).relative?
148
+ begin
149
+ URI.parse(@page_url).merge(url).to_s
150
+ rescue URI::Error
151
+ url
152
+ end
153
+ end
154
+
155
+ def non_textcontent_element?(element)
156
+ NON_TEXTCONTENT_ELEMENTS.has_key?(element)
157
+ end
158
+
159
+ def url_attribute?(attribute)
160
+ URL_ATTRIBUTES.include?(attribute)
161
+ end
162
+
163
+ def extract_property_names
164
+ itemprop_attr = @element.attribute('itemprop')
165
+ itemprop_attr ? itemprop_attr.value.split : []
166
+ end
167
+
168
+ def extract_property_value
169
+ element = @element.name
170
+ if non_textcontent_element?(element)
171
+ attribute = NON_TEXTCONTENT_ELEMENTS[element]
172
+ value = @element.attribute(attribute).value
173
+ url_attribute?(attribute) ? make_absolute_url(value) : value
174
+ else
175
+ @element.inner_text.strip
176
+ end
177
+ end
178
+
179
+ def extract_property
180
+ if @element.attribute('itemscope')
181
+ Item.new(@element)
182
+ else
183
+ extract_property_value
184
+ end
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
@@ -13,8 +13,8 @@ class OrderWalkthrough
13
13
  # Need to create a valid zone too...
14
14
  zone = FactoryGirl.create(:zone)
15
15
  country = FactoryGirl.create(:country)
16
- zone.members << Spree::ZoneMember.create(:zoneable => country)
17
- country.states << FactoryGirl.create(:state, :country => country)
16
+ zone.members << Spree::ZoneMember.create(zoneable: country)
17
+ country.states << FactoryGirl.create(:state, country: country)
18
18
 
19
19
  # A shipping method must exist for rates to be displayed on checkout page
20
20
  unless Spree::ShippingMethod.exists?
@@ -45,8 +45,8 @@ class OrderWalkthrough
45
45
  end
46
46
 
47
47
  def self.address(order)
48
- order.bill_address = FactoryGirl.create(:address, :country_id => Spree::Zone.global.members.first.zoneable.id)
49
- order.ship_address = FactoryGirl.create(:address, :country_id => Spree::Zone.global.members.first.zoneable.id)
48
+ order.bill_address = FactoryGirl.create(:address, country_id: Spree::Zone.global.members.first.zoneable.id)
49
+ order.ship_address = FactoryGirl.create(:address, country_id: Spree::Zone.global.members.first.zoneable.id)
50
50
  order.next!
51
51
  end
52
52
 
data/lib/tasks/core.rake CHANGED
@@ -32,7 +32,7 @@ use rake db:load_file[/absolute/path/to/sample/filename.rb]}
32
32
  end
33
33
 
34
34
  desc "Migrate schema to version 0 and back up again. WARNING: Destroys all data in tables!!"
35
- task :remigrate => :environment do
35
+ task remigrate: :environment do
36
36
  require 'highline/import'
37
37
 
38
38
  if ENV['SKIP_NAG'] or ENV['OVERWRITE'].to_s.downcase == 'true' or agree("This task will destroy any data in the database. Are you sure you want to \ncontinue? [y/n] ")
@@ -98,4 +98,72 @@ use rake db:load_file[/absolute/path/to/sample/filename.rb]}
98
98
  puts "Bootstrap Complete.\n\n"
99
99
  end
100
100
 
101
+
102
+
103
+ desc "Fix orphan line items after upgrading to Spree 3.1: only needed if you have line items attached to deleted records with Slug (product) and SKU (variant) duplicates of non-deleted records."
104
+ task fix_orphan_line_items: :environment do |t, args|
105
+ def get_input
106
+ STDOUT.flush
107
+ input = STDIN.gets.chomp
108
+ case input.upcase
109
+ when "Y"
110
+ return true
111
+
112
+ when "N"
113
+ puts "aborting ....."
114
+ return false
115
+ else
116
+ return true
117
+ end
118
+ end
119
+
120
+ puts "WARNING: This task will re-associate any line_items associated with deleted variants to non-deleted variants with matching SKUs. Because other attributes and product associations may switch during the re-association, this may have unintended side-effects. If this task finishes successfully, line items for old order should no longer be orphaned from their varaints. You should run this task after you have already run the db migratoin AddDiscontinuedToProductsAndVariants. If the db migration did not warn you that it was leaving deleted records in place because of duplicate SKUs, then you do not need to run this rake task."
121
+ puts "Are you sure you want to continue? (Y/n):"
122
+
123
+ if get_input
124
+ puts "looping through all your deleted variants ..."
125
+
126
+ # first verify that I can really fix all of your line items
127
+
128
+ no_live_variants_found = []
129
+ variants_to_fix = []
130
+
131
+ Spree::Variant.deleted.each do |variant|
132
+ # check if this variant has any line items at all
133
+ if !variant.line_items.any?
134
+ next
135
+ end
136
+
137
+ variants_to_fix << variant
138
+ dup_variant = Spree::Variant.find_by(sku: variant.sku)
139
+ if dup_variant
140
+ # this variant is OK
141
+ else
142
+ no_live_variants_found << variant
143
+ end
144
+ end
145
+
146
+ if !variants_to_fix.any?
147
+ abort( "ABORT: You have no deleted variants that are associated to line items. You do not need to run this raks task.")
148
+ end
149
+
150
+ if no_live_variants_found.any?
151
+ puts "ABORT: Unfortunately, I found some deleted variants in your database that do not have matching non-deleted variants to replace them with. This script can only be used to cleanup deleted variants that have SKUs that match non-deleted variants. To continue, you must either (1) un-delete these variants (hint: mark them 'discontinued' instead) or (2) create new variants with a matching SKU for each variant in the list below."
152
+ no_live_variants_found.each do |deleted_variant|
153
+ puts "variant id #{deleted_variant.id} (sku is '#{deleted_variant.sku}') ... no match found"
154
+ end
155
+ abort()
156
+ end
157
+
158
+
159
+ puts "Ready to fix..."
160
+ variants_to_fix.each do |variant|
161
+ dup_variant = Spree::Variant.find_by(sku: variant.sku)
162
+ puts "Changing all line items for #{variant.sku} variant id #{variant.id} (deleted) to variant id #{dup_variant.id} (not deleted) ..."
163
+ Spree::LineItem.unscoped.where(variant_id: variant.id).update_all(variant_id: dup_variant.id)
164
+ end
165
+
166
+ puts "DONE ! Your database should no longer have line items that are associated with deleted variants."
167
+ end
168
+ end
101
169
  end