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
@@ -2,26 +2,26 @@ require 'ostruct'
2
2
 
3
3
  module Spree
4
4
  class Shipment < Spree::Base
5
+ include Spree::Core::NumberGenerator.new(prefix: 'H', length: 11)
6
+
5
7
  extend FriendlyId
6
8
  friendly_id :number, slug_column: :number, use: :slugged
7
9
 
8
- include Spree::NumberGenerator
9
-
10
- def generate_number(options = {})
11
- options[:prefix] ||= 'H'
12
- options[:length] ||= 11
13
- super(options)
10
+ with_options inverse_of: :shipments do
11
+ belongs_to :address, class_name: 'Spree::Address'
12
+ belongs_to :order, class_name: 'Spree::Order', touch: true
14
13
  end
15
-
16
- belongs_to :address, class_name: 'Spree::Address', inverse_of: :shipments
17
- belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments
18
14
  belongs_to :stock_location, class_name: 'Spree::StockLocation'
19
15
 
20
- has_many :adjustments, as: :adjustable, dependent: :delete_all
21
- has_many :inventory_units, dependent: :delete_all, inverse_of: :shipment
22
- has_many :shipping_rates, -> { order('cost ASC') }, dependent: :delete_all
16
+ with_options dependent: :delete_all do
17
+ has_many :adjustments, as: :adjustable
18
+ has_many :inventory_units, inverse_of: :shipment
19
+ has_many :shipping_rates, -> { order(:cost) }
20
+ has_many :state_changes, as: :stateful
21
+ end
23
22
  has_many :shipping_methods, through: :shipping_rates
24
- has_many :state_changes, as: :stateful
23
+ has_one :selected_shipping_rate, -> { where(selected: true).order(:cost) }, class_name: Spree::ShippingRate
24
+
25
25
 
26
26
  after_save :update_adjustments
27
27
 
@@ -67,10 +67,7 @@ module Spree
67
67
 
68
68
  event :resume do
69
69
  transition from: :canceled, to: :ready, if: lambda { |shipment|
70
- shipment.determine_state(shipment.order) == :ready
71
- }
72
- transition from: :canceled, to: :pending, if: lambda { |shipment|
73
- shipment.determine_state(shipment.order) == :ready
70
+ shipment.determine_state(shipment.order) == 'ready'
74
71
  }
75
72
  transition from: :canceled, to: :pending
76
73
  end
@@ -120,7 +117,7 @@ module Spree
120
117
  return 'canceled' if order.canceled?
121
118
  return 'pending' unless order.can_ship?
122
119
  return 'pending' if inventory_units.any? &:backordered?
123
- return 'shipped' if state == 'shipped'
120
+ return 'shipped' if shipped?
124
121
  order.paid? || Spree::Config[:auto_capture_on_dispatch] ? 'ready' : 'pending'
125
122
  end
126
123
 
@@ -142,8 +139,8 @@ module Spree
142
139
  end
143
140
 
144
141
  def finalize!
145
- InventoryUnit.finalize_units!(inventory_units)
146
- manifest.each { |item| manifest_unstock(item) }
142
+ inventory_units.finalize_units!
143
+ after_resume
147
144
  end
148
145
 
149
146
  def include?(variant)
@@ -155,7 +152,7 @@ module Spree
155
152
  end
156
153
 
157
154
  def inventory_units_for_item(line_item, variant = nil)
158
- inventory_units.where(line_item_id: line_item.id, variant_id: line_item.variant.id || variant.id)
155
+ inventory_units.where(line_item_id: line_item.id, variant_id: line_item.variant_id || variant.id)
159
156
  end
160
157
 
161
158
  def item_cost
@@ -175,7 +172,7 @@ module Spree
175
172
  units.group_by(&:line_item_id).map do |line_item_id, units|
176
173
 
177
174
  states = {}
178
- units.group_by(&:state).each { |state, iu| states[state] = iu.count }
175
+ units.group_by(&:state).each { |state, iu| states[state] = iu.size }
179
176
 
180
177
  line_item = units.first.line_item
181
178
  variant = units.first.variant
@@ -234,10 +231,6 @@ module Spree
234
231
  shipping_rates
235
232
  end
236
233
 
237
- def selected_shipping_rate
238
- shipping_rates.where(selected: true).first
239
- end
240
-
241
234
  def selected_shipping_rate_id
242
235
  selected_shipping_rate.try(:id)
243
236
  end
@@ -259,7 +252,7 @@ module Spree
259
252
 
260
253
  def shipped=(value)
261
254
  return unless value == '1' && shipped_at.nil?
262
- self.shipped_at = Time.now
255
+ self.shipped_at = Time.current
263
256
  end
264
257
 
265
258
  def shipping_method
@@ -294,7 +287,7 @@ module Spree
294
287
  self.update_columns(
295
288
  cost: selected_shipping_rate.cost,
296
289
  adjustment_total: adjustments.additional.map(&:update!).compact.sum,
297
- updated_at: Time.now,
290
+ updated_at: Time.current,
298
291
  )
299
292
  end
300
293
  end
@@ -316,7 +309,7 @@ module Spree
316
309
  # (via Order#paid?) affects the shipment state (YAY)
317
310
  self.update_columns(
318
311
  state: determine_state(order),
319
- updated_at: Time.now
312
+ updated_at: Time.current
320
313
  )
321
314
 
322
315
  # And then it's time to update shipment states and finally persist
@@ -337,7 +330,7 @@ module Spree
337
330
  new_state = determine_state(order)
338
331
  update_columns(
339
332
  state: new_state,
340
- updated_at: Time.now,
333
+ updated_at: Time.current,
341
334
  )
342
335
  after_ship if new_state == 'shipped' and old_state != 'shipped'
343
336
  end
@@ -5,7 +5,7 @@ module Spree
5
5
  # Do we have a specialized shipping-method-specific handler? e.g:
6
6
  # Given shipment.shipping_method = Spree::ShippingMethod::DigitalDownload
7
7
  # do we have Spree::ShipmentHandler::DigitalDownload?
8
- if sm_handler = "Spree::ShipmentHandler::#{shipment.shipping_method.name.split('::').last}".constantize rescue false
8
+ if sm_handler = "Spree::ShipmentHandler::#{shipment.shipping_method.name.split('::').last}".safe_constantize
9
9
  sm_handler.new(shipment)
10
10
  else
11
11
  new(shipment)
@@ -36,7 +36,7 @@ module Spree
36
36
  new_state = OrderUpdater.new(order).update_shipment_state
37
37
  order.update_columns(
38
38
  shipment_state: new_state,
39
- updated_at: Time.now,
39
+ updated_at: Time.current,
40
40
  )
41
41
  end
42
42
  end
@@ -1,8 +1,11 @@
1
1
  module Spree
2
2
  class ShippingCategory < Spree::Base
3
- validates :name, presence: true
4
- has_many :products, inverse_of: :shipping_category
5
- has_many :shipping_method_categories, inverse_of: :shipping_category
3
+ validates :name, presence: true, uniqueness: { allow_blank: true }
4
+
5
+ with_options inverse_of: :shipping_category do
6
+ has_many :products
7
+ has_many :shipping_method_categories
8
+ end
6
9
  has_many :shipping_methods, through: :shipping_method_categories
7
10
  end
8
11
  end
@@ -11,16 +11,16 @@ module Spree
11
11
 
12
12
  default_scope { where(deleted_at: nil) }
13
13
 
14
- has_many :shipping_method_categories, :dependent => :destroy
14
+ has_many :shipping_method_categories, dependent: :destroy
15
15
  has_many :shipping_categories, through: :shipping_method_categories
16
16
  has_many :shipping_rates, inverse_of: :shipping_method
17
- has_many :shipments, :through => :shipping_rates
17
+ has_many :shipments, through: :shipping_rates
18
18
 
19
- has_and_belongs_to_many :zones, :join_table => 'spree_shipping_methods_zones',
20
- :class_name => 'Spree::Zone',
21
- :foreign_key => 'shipping_method_id'
19
+ has_many :shipping_method_zones, class_name: 'Spree::ShippingMethodZone',
20
+ foreign_key: 'shipping_method_id'
21
+ has_many :zones, through: :shipping_method_zones, class_name: 'Spree::Zone'
22
22
 
23
- belongs_to :tax_category, :class_name => 'Spree::TaxCategory'
23
+ belongs_to :tax_category, class_name: 'Spree::TaxCategory'
24
24
 
25
25
  validates :name, presence: true
26
26
 
@@ -28,7 +28,7 @@ module Spree
28
28
 
29
29
  def include?(address)
30
30
  return false unless address
31
- zones.any? do |zone|
31
+ zones.includes(:zone_members).any? do |zone|
32
32
  zone.include?(address)
33
33
  end
34
34
  end
@@ -59,10 +59,11 @@ module Spree
59
59
  end
60
60
 
61
61
  private
62
- def at_least_one_shipping_category
63
- if self.shipping_categories.empty?
64
- self.errors[:base] << "You need to select at least one shipping category"
65
- end
62
+
63
+ def at_least_one_shipping_category
64
+ if shipping_categories.empty?
65
+ errors.add(:base, :required_shipping_category)
66
66
  end
67
+ end
67
68
  end
68
69
  end
@@ -0,0 +1,6 @@
1
+ module Spree
2
+ class ShippingMethodZone < Spree::Base
3
+ belongs_to :shipping_method
4
+ belongs_to :zone
5
+ end
6
+ end
@@ -6,50 +6,37 @@ module Spree
6
6
 
7
7
  delegate :order, :currency, to: :shipment
8
8
  delegate :name, to: :shipping_method
9
+ delegate :code, to: :shipping_method, prefix: true
9
10
 
10
- def display_base_price
11
- Spree::Money.new(cost, currency: currency)
12
- end
11
+ extend Spree::DisplayMoney
12
+
13
+ money_methods :base_price, :tax_amount
13
14
 
14
- def calculate_tax_amount
15
- tax_rate.calculator.compute_shipping_rate(self)
15
+ def base_price
16
+ cost
16
17
  end
17
18
 
18
19
  def display_price
19
20
  price = display_base_price.to_s
20
- if tax_rate
21
- tax_amount = calculate_tax_amount
22
- if tax_amount != 0
23
- if tax_rate.included_in_price?
24
- if tax_amount > 0
25
- amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
26
- price += " (#{Spree.t(:incl)} #{amount})"
27
- else
28
- amount = "#{display_tax_amount(tax_amount*-1)} #{tax_rate.name}"
29
- price += " (#{Spree.t(:excl)} #{amount})"
30
- end
31
- else
32
- amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
33
- price += " (+ #{amount})"
34
- end
35
- end
36
- end
37
- price
21
+
22
+ return price if tax_rate.nil? || tax_amount == 0
23
+
24
+ Spree.t tax_rate.included_in_price? ? :including_tax : :excluding_tax,
25
+ scope: "shipping_rates.display_price",
26
+ price: price,
27
+ tax_amount: display_tax_amount,
28
+ tax_rate_name: tax_rate.name
38
29
  end
39
30
  alias_method :display_cost, :display_price
40
31
 
41
- def display_tax_amount(tax_amount)
42
- Spree::Money.new(tax_amount, currency: currency)
32
+ def tax_amount
33
+ @_tax_amount ||= tax_rate.calculator.compute_shipping_rate(self)
43
34
  end
44
35
 
45
36
  def shipping_method
46
37
  Spree::ShippingMethod.unscoped { super }
47
38
  end
48
39
 
49
- def shipping_method_code
50
- shipping_method.code
51
- end
52
-
53
40
  def tax_rate
54
41
  Spree::TaxRate.unscoped { super }
55
42
  end
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class State < Spree::Base
3
3
  belongs_to :country, class_name: 'Spree::Country'
4
- has_many :addresses, dependent: :nullify
4
+ has_many :addresses, dependent: :restrict_with_error
5
5
 
6
6
  has_many :zone_members,
7
7
  -> { where(zoneable_type: 'Spree::State') },
@@ -12,6 +12,7 @@ module Spree
12
12
  has_many :zones, through: :zone_members, class_name: 'Spree::Zone'
13
13
 
14
14
  validates :country, :name, presence: true
15
+ validates :name, :abbr, uniqueness: { case_sensitive: false, scope: :country_id }, allow_blank: true
15
16
 
16
17
  self.whitelisted_ransackable_attributes = %w(abbr)
17
18
 
@@ -23,7 +24,7 @@ module Spree
23
24
  # blank is added elsewhere, if needed
24
25
  def self.states_group_by_country_id
25
26
  state_info = Hash.new { |h, k| h[k] = [] }
26
- self.order('name ASC').each { |state|
27
+ self.order(:name).each { |state|
27
28
  state_info[state.country_id.to_s].push [state.id, state.name]
28
29
  }
29
30
  state_info
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class StateChange < Spree::Base
3
- belongs_to :user, class_name: Spree.user_class.to_s
3
+ belongs_to :user, class_name: Spree.user_class
4
4
  belongs_to :stateful, polymorphic: true
5
5
 
6
6
  def <=>(other)
@@ -3,11 +3,12 @@
3
3
  module Spree
4
4
  module Stock
5
5
  class Adjuster
6
- attr_accessor :inventory_unit, :status, :fulfilled
6
+ attr_accessor :inventory_unit, :status, :fulfilled, :package
7
7
 
8
- def initialize(inventory_unit, status)
8
+ def initialize(inventory_unit, status, package=nil)
9
9
  @inventory_unit = inventory_unit
10
10
  @status = status
11
+ @package = package
11
12
  @fulfilled = false
12
13
  end
13
14
 
@@ -19,6 +20,12 @@ module Spree
19
20
  end
20
21
  end
21
22
 
23
+ def reassign(status, package)
24
+ @fulfilled = false
25
+ @status = status
26
+ @package = package
27
+ end
28
+
22
29
  def fulfilled?
23
30
  fulfilled
24
31
  end
@@ -8,16 +8,17 @@ module Spree
8
8
  @state = state
9
9
  end
10
10
 
11
- def variant
12
- inventory_unit.variant
11
+ with_options allow_nil: true do
12
+ delegate :line_item,
13
+ :variant, to: :inventory_unit
14
+ delegate :price, to: :variant
15
+ delegate :dimension,
16
+ :volume,
17
+ :weight, to: :variant, prefix: true
13
18
  end
14
19
 
15
20
  def weight
16
- variant.weight * quantity
17
- end
18
-
19
- def line_item
20
- inventory_unit.line_item
21
+ variant_weight * quantity
21
22
  end
22
23
 
23
24
  def on_hand?
@@ -28,9 +29,6 @@ module Spree
28
29
  state.to_s == "backordered"
29
30
  end
30
31
 
31
- def price
32
- variant.price
33
- end
34
32
 
35
33
  def amount
36
34
  price * quantity
@@ -45,11 +43,11 @@ module Spree
45
43
  end
46
44
 
47
45
  def volume
48
- variant.volume * quantity
46
+ variant_volume * quantity
49
47
  end
50
48
 
51
49
  def dimension
52
- variant.dimension * quantity
50
+ variant_dimension * quantity
53
51
  end
54
52
  end
55
53
  end
@@ -1,11 +1,12 @@
1
1
  module Spree
2
2
  module Stock
3
3
  class Coordinator
4
- attr_reader :order, :inventory_units
4
+ attr_reader :order, :inventory_units, :allocated_inventory_units
5
5
 
6
6
  def initialize(order, inventory_units = nil)
7
7
  @order = order
8
8
  @inventory_units = inventory_units || InventoryUnitBuilder.new(order).units
9
+ @allocated_inventory_units = []
9
10
  end
10
11
 
11
12
  def shipments
@@ -20,28 +21,33 @@ module Spree
20
21
  packages = estimate_packages(packages)
21
22
  end
22
23
 
23
- # Build packages as per stock location
24
- #
25
- # It needs to check whether each stock location holds at least one stock
26
- # item for the order. In case none is found it wouldn't make any sense
27
- # to build a package because it would be empty. Plus we avoid errors down
28
- # the stack because it would assume the stock location has stock items
29
- # for the given order
30
- #
31
- # Returns an array of Package instances
32
24
  def build_packages(packages = Array.new)
33
- StockLocation.active.each do |stock_location|
34
- next unless stock_location.stock_items.where(:variant_id => inventory_units.map(&:variant_id).uniq).exists?
35
-
36
- packer = build_packer(stock_location, inventory_units)
25
+ stock_locations_with_requested_variants.each do |stock_location|
26
+ packer = build_packer(stock_location, unallocated_inventory_units)
37
27
  packages += packer.packages
28
+ @allocated_inventory_units += packer.allocated_inventory_units
38
29
  end
30
+
39
31
  packages
40
32
  end
41
33
 
42
34
  private
35
+
36
+ def unallocated_inventory_units
37
+ inventory_units - allocated_inventory_units
38
+ end
39
+
40
+ def stock_locations_with_requested_variants
41
+ Spree::StockLocation.active.joins(:stock_items).
42
+ where(spree_stock_items: { variant_id: requested_variant_ids }).distinct
43
+ end
44
+
45
+ def requested_variant_ids
46
+ inventory_units.map(&:variant_id).uniq
47
+ end
48
+
43
49
  def prioritize_packages(packages)
44
- prioritizer = Prioritizer.new(inventory_units, packages)
50
+ prioritizer = Prioritizer.new(packages)
45
51
  prioritizer.prioritized_packages
46
52
  end
47
53
 
@@ -1,6 +1,8 @@
1
1
  module Spree
2
2
  module Stock
3
3
  class Estimator
4
+ include VatPriceCalculation
5
+
4
6
  attr_reader :order, :currency
5
7
 
6
8
  def initialize(order)
@@ -28,44 +30,40 @@ module Spree
28
30
  def calculate_shipping_rates(package, ui_filter)
29
31
  shipping_methods(package, ui_filter).map do |shipping_method|
30
32
  cost = shipping_method.calculator.compute(package)
31
- tax_category = shipping_method.tax_category
32
- if tax_category
33
- tax_rate = tax_category.tax_rates.detect do |rate|
34
- # If the rate's zone matches the order's zone, a positive adjustment will be applied.
35
- # If the rate is from the default tax zone, then a negative adjustment will be applied.
36
- # See the tests in shipping_rate_spec.rb for an example of this.d
37
- rate.zone == order.tax_zone || rate.zone.default_tax?
38
- end
39
- end
40
-
41
- if cost
42
- rate = shipping_method.shipping_rates.new(cost: cost)
43
- rate.tax_rate = tax_rate if tax_rate
44
- end
45
33
 
46
- rate
34
+ shipping_method.shipping_rates.new(
35
+ cost: gross_amount(cost, taxation_options_for(shipping_method)),
36
+ tax_rate: first_tax_rate_for(shipping_method.tax_category)
37
+ ) if cost
47
38
  end.compact
48
39
  end
49
40
 
41
+ # Override this if you need the prices for shipping methods to be handled just like the
42
+ # prices for products in terms of included tax manipulation.
43
+ #
44
+ def taxation_options_for(shipping_method)
45
+ {
46
+ tax_category: shipping_method.tax_category,
47
+ tax_zone: @order.tax_zone
48
+ }
49
+ end
50
+
51
+ def first_tax_rate_for(tax_category)
52
+ return unless @order.tax_zone && tax_category
53
+ Spree::TaxRate.for_tax_category(tax_category).
54
+ potential_rates_for_zone(@order.tax_zone).first
55
+ end
56
+
50
57
  def shipping_methods(package, display_filter)
51
58
  package.shipping_methods.select do |ship_method|
52
59
  calculator = ship_method.calculator
53
- begin
54
- ship_method.available_to_display(display_filter) &&
55
- ship_method.include?(order.ship_address) &&
56
- calculator.available?(package) &&
57
- (calculator.preferences[:currency].blank? ||
58
- calculator.preferences[:currency] == currency)
59
- rescue Exception => exception
60
- log_calculator_exception(ship_method, exception)
61
- end
62
- end
63
- end
64
60
 
65
- def log_calculator_exception(ship_method, exception)
66
- Rails.logger.info("Something went wrong calculating rates with the #{ship_method.name} (ID=#{ship_method.id}) shipping method.")
67
- Rails.logger.info("*" * 50)
68
- Rails.logger.info(exception.backtrace.join("\n"))
61
+ ship_method.available_to_display(display_filter) &&
62
+ ship_method.include?(order.ship_address) &&
63
+ calculator.available?(package) &&
64
+ (calculator.preferences[:currency].blank? ||
65
+ calculator.preferences[:currency] == currency)
66
+ end
69
67
  end
70
68
  end
71
69
  end
@@ -8,17 +8,9 @@ module Spree
8
8
  def units
9
9
  @order.line_items.flat_map do |line_item|
10
10
  line_item.quantity.times.map do |i|
11
- @order.inventory_units.includes(
12
- variant: {
13
- product: {
14
- shipping_category: {
15
- shipping_methods: [:calculator, { zones: :zone_members }]
16
- }
17
- }
18
- }
19
- ).build(
11
+ @order.inventory_units.build(
20
12
  pending: true,
21
- variant: line_item.variant,
13
+ variant_id: line_item.variant_id,
22
14
  line_item: line_item,
23
15
  order: @order
24
16
  )
@@ -11,7 +11,8 @@ module Spree
11
11
  end
12
12
 
13
13
  def add(inventory_unit, state = :on_hand)
14
- contents << ContentItem.new(inventory_unit, state) unless find_item(inventory_unit)
14
+ # Remove find_item check as already taken care by prioritizer
15
+ contents << ContentItem.new(inventory_unit, state)
15
16
  end
16
17
 
17
18
  def add_multiple(inventory_units, state = :on_hand)
@@ -62,11 +63,12 @@ module Spree
62
63
  end
63
64
 
64
65
  def shipping_categories
65
- contents.map { |item| item.variant.shipping_category }.compact.uniq
66
+ Spree::ShippingCategory.joins(products: :variants_including_master).
67
+ where(spree_variants: { id: variant_ids }).distinct
66
68
  end
67
69
 
68
70
  def shipping_methods
69
- shipping_categories.map(&:shipping_methods).reduce(:&).to_a
71
+ shipping_categories.includes(:shipping_methods).map(&:shipping_methods).reduce(:&).to_a
70
72
  end
71
73
 
72
74
  def inspect
@@ -99,6 +101,12 @@ module Spree
99
101
  def dimension
100
102
  contents.sum(&:dimension)
101
103
  end
104
+
105
+ private
106
+
107
+ def variant_ids
108
+ contents.map { |item| item.inventory_unit.variant_id }.compact.uniq
109
+ end
102
110
  end
103
111
  end
104
112
  end
@@ -1,12 +1,13 @@
1
1
  module Spree
2
2
  module Stock
3
3
  class Packer
4
- attr_reader :stock_location, :inventory_units, :splitters
4
+ attr_reader :stock_location, :inventory_units, :splitters, :allocated_inventory_units
5
5
 
6
6
  def initialize(stock_location, inventory_units, splitters=[Splitter::Base])
7
7
  @stock_location = stock_location
8
8
  @inventory_units = inventory_units
9
9
  @splitters = splitters
10
+ @allocated_inventory_units = []
10
11
  end
11
12
 
12
13
  def packages
@@ -19,23 +20,32 @@ module Spree
19
20
 
20
21
  def default_package
21
22
  package = Package.new(stock_location)
22
- inventory_units.group_by(&:variant).each do |variant, variant_inventory_units|
23
+
24
+ # Group by variant_id as grouping by variant fires cached query.
25
+ inventory_units.group_by(&:variant_id).each do |variant_id, variant_inventory_units|
26
+ variant = Spree::Variant.find(variant_id)
23
27
  units = variant_inventory_units.clone
24
28
  if variant.should_track_inventory?
25
29
  next unless stock_location.stock_item(variant)
26
30
 
27
- on_hand, backordered = stock_location.fill_status(variant, units.count)
28
- package.add_multiple units.slice!(0, on_hand), :on_hand if on_hand > 0
29
- package.add_multiple units.slice!(0, backordered), :backordered if backordered > 0
31
+ on_hand, backordered = stock_location.fill_status(variant, units.size)
32
+ on_hand_units, backordered_units = units.slice!(0, on_hand), units.slice!(0, backordered)
33
+
34
+ package.add_multiple on_hand_units, :on_hand if on_hand > 0
35
+ package.add_multiple backordered_units, :backordered if backordered > 0
36
+
37
+ @allocated_inventory_units += (on_hand_units + backordered_units)
30
38
  else
31
39
  package.add_multiple units
40
+ @allocated_inventory_units += units
32
41
  end
33
-
34
42
  end
43
+
35
44
  package
36
45
  end
37
46
 
38
47
  private
48
+
39
49
  def build_splitter
40
50
  splitter = nil
41
51
  splitters.reverse.each do |klass|