spree_core 3.1.14 → 3.2.0.rc1

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 (529) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/{spree.js.coffee.erb → spree.js.coffee} +2 -2
  3. data/app/helpers/spree/base_helper.rb +1 -1
  4. data/app/helpers/spree/products_helper.rb +0 -6
  5. data/app/mailers/spree/reimbursement_mailer.rb +6 -6
  6. data/app/models/concerns/spree/acts_as_taggable.rb +11 -0
  7. data/app/models/concerns/spree/adjustment_source.rb +1 -1
  8. data/app/models/concerns/spree/ransackable_attributes.rb +0 -5
  9. data/app/models/spree/address.rb +67 -38
  10. data/app/models/spree/app_configuration.rb +9 -6
  11. data/app/models/spree/base.rb +1 -1
  12. data/app/models/spree/calculator.rb +1 -1
  13. data/app/models/spree/country.rb +5 -4
  14. data/app/models/spree/credit_card.rb +3 -3
  15. data/app/models/spree/gateway/bogus.rb +11 -11
  16. data/app/models/spree/gateway/bogus_simple.rb +4 -4
  17. data/app/models/spree/gateway.rb +1 -1
  18. data/app/models/spree/image.rb +2 -2
  19. data/app/models/spree/inventory_unit.rb +6 -10
  20. data/app/models/spree/line_item.rb +17 -6
  21. data/app/models/spree/order/checkout.rb +2 -2
  22. data/app/models/spree/order.rb +12 -25
  23. data/app/models/spree/order_contents.rb +7 -6
  24. data/app/models/spree/order_inventory.rb +12 -1
  25. data/app/models/spree/order_updater.rb +1 -2
  26. data/app/models/spree/payment/processing.rb +3 -3
  27. data/app/models/spree/payment_method.rb +7 -1
  28. data/app/models/spree/preferences/store.rb +3 -3
  29. data/app/models/spree/product/scopes.rb +16 -20
  30. data/app/models/spree/product.rb +11 -3
  31. data/app/models/spree/promotion/actions/create_line_items.rb +21 -3
  32. data/app/models/spree/promotion/rules/country.rb +23 -0
  33. data/app/models/spree/promotion/rules/option_value.rb +13 -10
  34. data/app/models/spree/promotion/rules/taxon.rb +1 -1
  35. data/app/models/spree/promotion.rb +35 -1
  36. data/app/models/spree/promotion_handler/cart.rb +3 -17
  37. data/app/models/spree/promotion_handler/coupon.rb +22 -22
  38. data/app/models/spree/promotion_handler/page.rb +2 -2
  39. data/app/models/spree/refund.rb +1 -1
  40. data/app/models/spree/refund_reason.rb +1 -1
  41. data/app/models/spree/reimbursement_type.rb +5 -1
  42. data/app/models/spree/return_item.rb +1 -1
  43. data/app/models/spree/shipment.rb +4 -6
  44. data/app/models/spree/shipment_handler.rb +1 -1
  45. data/app/models/spree/stock/adjuster.rb +9 -2
  46. data/app/models/spree/stock/coordinator.rb +11 -4
  47. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  48. data/app/models/spree/stock/package.rb +11 -3
  49. data/app/models/spree/stock/packer.rb +15 -5
  50. data/app/models/spree/stock/prioritizer.rb +25 -15
  51. data/app/models/spree/stock/splitter/shipping_category.rb +6 -1
  52. data/app/models/spree/stock_item.rb +2 -1
  53. data/app/models/spree/stock_movement.rb +11 -6
  54. data/app/models/spree/store.rb +1 -0
  55. data/app/models/spree/store_credit.rb +1 -1
  56. data/app/models/spree/tag.rb +4 -0
  57. data/app/models/spree/tax_rate.rb +6 -0
  58. data/app/models/spree/taxon.rb +3 -3
  59. data/app/models/spree/variant.rb +6 -3
  60. data/app/models/spree/zone.rb +2 -2
  61. data/app/views/spree/shared/_paths.html.erb +8 -0
  62. data/config/initializers/acts_as_taggable_on.rb +9 -0
  63. data/config/initializers/friendly_id.rb +0 -81
  64. data/config/locales/en.yml +11 -0
  65. data/db/default/spree/countries.rb +5 -1
  66. data/db/default/spree/roles.rb +2 -2
  67. data/db/default/spree/states.rb +1 -1
  68. data/db/migrate/20120831092320_spree_one_two.rb +101 -101
  69. data/db/migrate/20120831092359_spree_promo_one_two.rb +14 -14
  70. data/db/migrate/20120905145253_add_tax_rate_label.rb +1 -1
  71. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +2 -2
  72. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +4 -4
  73. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +2 -2
  74. data/db/migrate/20121010142909_add_states_required_to_countries.rb +2 -2
  75. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +3 -3
  76. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +5 -5
  77. data/db/migrate/20121031162139_split_prices_from_variants.rb +10 -10
  78. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +3 -3
  79. data/db/migrate/20121107184631_add_currency_to_line_items.rb +1 -1
  80. data/db/migrate/20121107194006_add_currency_to_orders.rb +1 -1
  81. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +2 -2
  82. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +1 -1
  83. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +2 -2
  84. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +1 -1
  85. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +1 -1
  86. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +1 -1
  87. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +2 -2
  88. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +1 -1
  89. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +1 -1
  90. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +1 -1
  91. data/db/migrate/20130211190146_create_spree_stock_items.rb +2 -2
  92. data/db/migrate/20130211191120_create_spree_stock_locations.rb +1 -1
  93. data/db/migrate/20130213191427_create_default_stock.rb +1 -2
  94. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +1 -1
  95. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +2 -2
  96. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +1 -1
  97. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +3 -3
  98. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +1 -1
  99. data/db/migrate/20130228210442_create_shipping_method_zone.rb +3 -3
  100. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +1 -1
  101. data/db/migrate/20130301162924_create_shipping_method_categories.rb +3 -3
  102. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +1 -1
  103. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +5 -5
  104. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +1 -1
  105. data/db/migrate/20130305143310_create_stock_movements.rb +1 -1
  106. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +3 -3
  107. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +2 -2
  108. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +2 -2
  109. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +2 -2
  110. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +1 -1
  111. data/db/migrate/20130319062004_change_orders_total_precision.rb +5 -5
  112. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +2 -2
  113. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -2
  114. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +2 -2
  115. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +1 -1
  116. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +3 -3
  117. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +3 -3
  118. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  119. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +1 -1
  120. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +1 -1
  121. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +1 -1
  122. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +1 -1
  123. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +2 -2
  124. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +1 -1
  125. data/db/migrate/20130417120035_update_adjustment_states.rb +3 -3
  126. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +4 -4
  127. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +1 -1
  128. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +1 -1
  129. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +1 -1
  130. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
  131. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +1 -1
  132. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +1 -1
  133. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +1 -1
  134. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +1 -1
  135. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +1 -1
  136. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +1 -1
  137. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +1 -1
  138. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +1 -1
  139. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +2 -2
  140. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +4 -4
  141. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +1 -1
  142. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +1 -1
  143. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +2 -2
  144. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +3 -3
  145. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +1 -1
  146. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +1 -1
  147. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +1 -1
  148. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +1 -1
  149. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +1 -1
  150. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +1 -1
  151. data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -4
  152. data/db/migrate/20130807024302_rename_adjustment_fields.rb +1 -1
  153. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +1 -1
  154. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +1 -1
  155. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +2 -2
  156. data/db/migrate/20130813140619_expand_order_number_size.rb +3 -3
  157. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +1 -1
  158. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +2 -2
  159. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +2 -2
  160. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
  161. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +2 -2
  162. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +2 -2
  163. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
  164. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +1 -1
  165. data/db/migrate/20130909115621_change_states_required_for_countries.rb +1 -1
  166. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +1 -1
  167. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +1 -1
  168. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +1 -1
  169. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +2 -2
  170. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +2 -2
  171. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +1 -1
  172. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +1 -1
  173. data/db/migrate/20131118043959_add_included_to_adjustments.rb +2 -2
  174. data/db/migrate/20131118050234_rename_tax_total_fields.rb +1 -1
  175. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +1 -1
  176. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +1 -1
  177. data/db/migrate/20131127001002_add_position_to_classifications.rb +1 -1
  178. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +2 -2
  179. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +1 -1
  180. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +2 -2
  181. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -1
  182. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +1 -1
  183. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +1 -1
  184. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +1 -1
  185. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +1 -1
  186. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +1 -1
  187. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +1 -1
  188. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +1 -1
  189. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +1 -1
  190. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +1 -1
  191. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +1 -1
  192. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +1 -1
  193. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +1 -1
  194. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +1 -1
  195. data/db/migrate/20140213184916_add_more_indexes.rb +1 -1
  196. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +2 -2
  197. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +1 -1
  198. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +1 -1
  199. data/db/migrate/20140309023735_migrate_old_preferences.rb +1 -1
  200. data/db/migrate/20140309024355_create_spree_stores.rb +2 -2
  201. data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
  202. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +1 -1
  203. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +1 -1
  204. data/db/migrate/20140331100557_add_additional_store_fields.rb +1 -1
  205. data/db/migrate/20140410141842_add_many_missing_indexes.rb +1 -1
  206. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +1 -1
  207. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +1 -1
  208. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +5 -5
  209. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +1 -1
  210. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +2 -2
  211. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +1 -1
  212. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +1 -1
  213. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +1 -1
  214. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +1 -1
  215. data/db/migrate/20140625214618_create_spree_refunds.rb +1 -1
  216. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +1 -1
  217. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +1 -1
  218. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +1 -1
  219. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +2 -2
  220. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +1 -1
  221. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +1 -1
  222. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +1 -1
  223. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +1 -1
  224. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +1 -1
  225. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +1 -1
  226. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +1 -1
  227. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +1 -1
  228. data/db/migrate/20140717155155_create_default_refund_reason.rb +1 -1
  229. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +1 -1
  230. data/db/migrate/20140718133010_create_spree_customer_returns.rb +1 -1
  231. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +1 -1
  232. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +5 -5
  233. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +1 -1
  234. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +1 -1
  235. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +2 -2
  236. data/db/migrate/20140725131539_create_spree_reimbursements.rb +1 -1
  237. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +1 -1
  238. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +1 -1
  239. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +1 -1
  240. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +1 -1
  241. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +1 -1
  242. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +1 -1
  243. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -1
  244. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +1 -1
  245. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +1 -1
  246. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +1 -1
  247. data/db/migrate/20140911173301_add_kind_to_zone.rb +1 -1
  248. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +1 -1
  249. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +1 -1
  250. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +1 -1
  251. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +1 -1
  252. data/db/migrate/20141009204607_add_store_id_to_orders.rb +1 -1
  253. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +1 -1
  254. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +1 -1
  255. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +2 -7
  256. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +1 -1
  257. data/db/migrate/20141105213646_update_classifications_positions.rb +1 -1
  258. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +1 -1
  259. data/db/migrate/20141215232040_remove_token_permissions_table.rb +1 -1
  260. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +1 -1
  261. data/db/migrate/20141217215630_update_product_slug_index.rb +1 -1
  262. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +1 -1
  263. data/db/migrate/20150118210639_create_spree_store_credits.rb +1 -1
  264. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +1 -1
  265. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +1 -1
  266. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +1 -1
  267. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +1 -1
  268. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +1 -1
  269. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +1 -1
  270. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +1 -1
  271. data/db/migrate/20150128060325_remove_spree_configurations.rb +1 -1
  272. data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +1 -1
  273. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +1 -1
  274. data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +1 -1
  275. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +1 -1
  276. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +1 -1
  277. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +1 -1
  278. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +1 -1
  279. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +1 -1
  280. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +1 -1
  281. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +1 -1
  282. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +1 -1
  283. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +1 -1
  284. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +1 -1
  285. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +1 -1
  286. data/db/migrate/20150727191614_spree_store_credit_types.rb +1 -1
  287. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +1 -1
  288. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +1 -1
  289. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +1 -1
  290. data/db/migrate/20160219165458_add_indexes.rb +1 -1
  291. data/db/migrate/20160509064646_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +10 -0
  292. data/db/migrate/20160511071954_acts_as_taggable_on_spree_migration.rb +40 -0
  293. data/db/migrate/20160511072249_change_collation_for_spree_tag_names.rb +9 -0
  294. data/db/migrate/20160511072335_add_missing_indexes_to_spree_taggings.rb +14 -0
  295. data/db/migrate/20160608090604_add_zipcode_required_to_spree_countries.rb +7 -0
  296. data/db/migrate/20161014145148_add_created_at_to_variant.rb +8 -0
  297. data/db/migrate/20161014152814_add_null_false_to_spree_variants_timestamps.rb +6 -0
  298. data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
  299. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +3 -3
  300. data/lib/generators/spree/custom_user/templates/migration.rb.tt +2 -2
  301. data/lib/generators/spree/dummy/dummy_generator.rb +11 -11
  302. data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
  303. data/lib/generators/spree/dummy/templates/rails/database.yml +9 -6
  304. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -2
  305. data/lib/generators/spree/install/install_generator.rb +37 -13
  306. data/lib/spree/core/controller_helpers/common.rb +3 -3
  307. data/lib/spree/core/controller_helpers/order.rb +2 -5
  308. data/lib/spree/core/controller_helpers/respond_with.rb +1 -1
  309. data/lib/spree/core/delegate_belongs_to.rb +2 -2
  310. data/lib/spree/core/engine.rb +5 -4
  311. data/lib/spree/core/importer/product.rb +2 -2
  312. data/lib/spree/core/product_duplicator.rb +1 -1
  313. data/lib/spree/core/product_filters.rb +1 -1
  314. data/lib/spree/core/search/base.rb +1 -1
  315. data/lib/spree/core/version.rb +1 -1
  316. data/lib/spree/i18n/initializer.rb +1 -1
  317. data/lib/spree/money.rb +1 -15
  318. data/lib/spree/permitted_attributes.rb +1 -1
  319. data/lib/spree/testing_support/caching.rb +3 -3
  320. data/lib/spree/testing_support/common_rake.rb +0 -2
  321. data/lib/spree/testing_support/controller_requests.rb +4 -4
  322. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
  323. data/lib/spree/testing_support/factories/order_factory.rb +1 -0
  324. data/lib/spree/testing_support/factories/tag_factory.rb +5 -0
  325. data/lib/spree/testing_support/kernel.rb +18 -0
  326. data/lib/spree/testing_support/order_walkthrough.rb +4 -4
  327. data/lib/tasks/core.rake +2 -2
  328. data/spec/helpers/base_helper_spec.rb +200 -0
  329. data/spec/helpers/products_helper_spec.rb +289 -0
  330. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  331. data/spec/lib/i18n_spec.rb +123 -0
  332. data/spec/lib/search/base_spec.rb +86 -0
  333. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +103 -0
  334. data/spec/lib/spree/core/controller_helpers/order_spec.rb +110 -0
  335. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  336. data/spec/lib/spree/core/controller_helpers/store_spec.rb +72 -0
  337. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  338. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  339. data/spec/lib/spree/core/importer/order_spec.rb +605 -0
  340. data/spec/lib/spree/core/number_generator_spec.rb +175 -0
  341. data/spec/lib/spree/core/token_generator_spec.rb +24 -0
  342. data/spec/lib/spree/core/validators/email_spec.rb +53 -0
  343. data/spec/lib/spree/core_spec.rb +23 -0
  344. data/spec/lib/spree/localized_number_spec.rb +48 -0
  345. data/spec/lib/spree/migrations_spec.rb +36 -0
  346. data/spec/lib/spree/money_spec.rb +122 -0
  347. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  348. data/spec/mailers/order_mailer_spec.rb +122 -0
  349. data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
  350. data/spec/mailers/shipment_mailer_spec.rb +81 -0
  351. data/spec/mailers/test_mailer_spec.rb +38 -0
  352. data/spec/models/option_type_prototype_spec.rb +9 -0
  353. data/spec/models/spree/ability_spec.rb +251 -0
  354. data/spec/models/spree/address_spec.rb +402 -0
  355. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  356. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  357. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  358. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +26 -0
  359. data/spec/models/spree/adjustment_spec.rb +189 -0
  360. data/spec/models/spree/app_configuration_spec.rb +26 -0
  361. data/spec/models/spree/asset_spec.rb +28 -0
  362. data/spec/models/spree/calculator/default_tax_spec.rb +152 -0
  363. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  364. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  365. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  366. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  367. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  368. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +47 -0
  369. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  370. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  371. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  372. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  373. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  374. data/spec/models/spree/calculator/shipping.rb +8 -0
  375. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  376. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  377. data/spec/models/spree/calculator_spec.rb +69 -0
  378. data/spec/models/spree/classification_spec.rb +93 -0
  379. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  380. data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
  381. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  382. data/spec/models/spree/country_spec.rb +55 -0
  383. data/spec/models/spree/credit_card_spec.rb +328 -0
  384. data/spec/models/spree/customer_return_spec.rb +240 -0
  385. data/spec/models/spree/exchange_spec.rb +75 -0
  386. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  387. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  388. data/spec/models/spree/gateway_spec.rb +61 -0
  389. data/spec/models/spree/image_spec.rb +8 -0
  390. data/spec/models/spree/inventory_unit_spec.rb +256 -0
  391. data/spec/models/spree/line_item_spec.rb +346 -0
  392. data/spec/models/spree/option_type_spec.rb +14 -0
  393. data/spec/models/spree/option_value_spec.rb +18 -0
  394. data/spec/models/spree/order/address_spec.rb +50 -0
  395. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  396. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  397. data/spec/models/spree/order/checkout_spec.rb +770 -0
  398. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  399. data/spec/models/spree/order/finalizing_spec.rb +114 -0
  400. data/spec/models/spree/order/helpers_spec.rb +5 -0
  401. data/spec/models/spree/order/payment_spec.rb +214 -0
  402. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  403. data/spec/models/spree/order/shipments_spec.rb +43 -0
  404. data/spec/models/spree/order/state_machine_spec.rb +212 -0
  405. data/spec/models/spree/order/store_credit_spec.rb +426 -0
  406. data/spec/models/spree/order/tax_spec.rb +84 -0
  407. data/spec/models/spree/order/totals_spec.rb +24 -0
  408. data/spec/models/spree/order/updating_spec.rb +18 -0
  409. data/spec/models/spree/order/validations_spec.rb +15 -0
  410. data/spec/models/spree/order_contents_spec.rb +297 -0
  411. data/spec/models/spree/order_inventory_spec.rb +239 -0
  412. data/spec/models/spree/order_merger_spec.rb +135 -0
  413. data/spec/models/spree/order_spec.rb +1046 -0
  414. data/spec/models/spree/order_updater_spec.rb +294 -0
  415. data/spec/models/spree/payment/gateway_options_spec.rb +127 -0
  416. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  417. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  418. data/spec/models/spree/payment_method_spec.rb +103 -0
  419. data/spec/models/spree/payment_spec.rb +919 -0
  420. data/spec/models/spree/preference_spec.rb +80 -0
  421. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  422. data/spec/models/spree/preferences/preferable_spec.rb +344 -0
  423. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  424. data/spec/models/spree/preferences/store_spec.rb +46 -0
  425. data/spec/models/spree/price_spec.rb +128 -0
  426. data/spec/models/spree/product/scopes_spec.rb +183 -0
  427. data/spec/models/spree/product_duplicator_spec.rb +103 -0
  428. data/spec/models/spree/product_filter_spec.rb +26 -0
  429. data/spec/models/spree/product_option_type_spec.rb +9 -0
  430. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  431. data/spec/models/spree/product_property_spec.rb +22 -0
  432. data/spec/models/spree/product_spec.rb +619 -0
  433. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
  434. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  435. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  436. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  437. data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
  438. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  439. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  440. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  441. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  442. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  443. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  444. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  445. data/spec/models/spree/promotion/rules/user_spec.rb +45 -0
  446. data/spec/models/spree/promotion_action_spec.rb +10 -0
  447. data/spec/models/spree/promotion_category_spec.rb +17 -0
  448. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  449. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  450. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  451. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  452. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  453. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  454. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  455. data/spec/models/spree/promotion_spec.rb +679 -0
  456. data/spec/models/spree/property_prototype_spec.rb +9 -0
  457. data/spec/models/spree/property_spec.rb +5 -0
  458. data/spec/models/spree/prototype_spec.rb +5 -0
  459. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  460. data/spec/models/spree/refund_reason_spec.rb +20 -0
  461. data/spec/models/spree/refund_spec.rb +195 -0
  462. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  463. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  464. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  465. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  466. data/spec/models/spree/reimbursement_spec.rb +188 -0
  467. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +63 -0
  468. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  469. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  470. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  471. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  472. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  473. data/spec/models/spree/return_authorization_spec.rb +230 -0
  474. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  475. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  476. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  477. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  478. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  479. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  480. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  481. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  482. data/spec/models/spree/return_item_spec.rb +731 -0
  483. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  484. data/spec/models/spree/role_spec.rb +7 -0
  485. data/spec/models/spree/shipment_spec.rb +742 -0
  486. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  487. data/spec/models/spree/shipping_category_spec.rb +19 -0
  488. data/spec/models/spree/shipping_method_spec.rb +95 -0
  489. data/spec/models/spree/shipping_rate_spec.rb +140 -0
  490. data/spec/models/spree/state_spec.rb +29 -0
  491. data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
  492. data/spec/models/spree/stock/content_item_spec.rb +31 -0
  493. data/spec/models/spree/stock/coordinator_spec.rb +61 -0
  494. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  495. data/spec/models/spree/stock/estimator_spec.rb +202 -0
  496. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
  497. data/spec/models/spree/stock/package_spec.rb +182 -0
  498. data/spec/models/spree/stock/packer_spec.rb +70 -0
  499. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  500. data/spec/models/spree/stock/quantifier_spec.rb +126 -0
  501. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  502. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  503. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  504. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  505. data/spec/models/spree/stock_item_spec.rb +432 -0
  506. data/spec/models/spree/stock_location_spec.rb +243 -0
  507. data/spec/models/spree/stock_movement_spec.rb +120 -0
  508. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  509. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  510. data/spec/models/spree/store_credit_spec.rb +786 -0
  511. data/spec/models/spree/store_spec.rb +78 -0
  512. data/spec/models/spree/tax_category_spec.rb +32 -0
  513. data/spec/models/spree/tax_rate_spec.rb +561 -0
  514. data/spec/models/spree/taxon_spec.rb +85 -0
  515. data/spec/models/spree/taxonomy_spec.rb +18 -0
  516. data/spec/models/spree/tracker_spec.rb +21 -0
  517. data/spec/models/spree/user_spec.rb +203 -0
  518. data/spec/models/spree/variant_spec.rb +809 -0
  519. data/spec/models/spree/zone_member_spec.rb +38 -0
  520. data/spec/models/spree/zone_spec.rb +472 -0
  521. data/spec/spec_helper.rb +79 -0
  522. data/spec/support/big_decimal.rb +5 -0
  523. data/spec/support/concerns/adjustment_source.rb +23 -0
  524. data/spec/support/concerns/default_price.rb +37 -0
  525. data/spec/support/rake.rb +13 -0
  526. data/spec/support/test_gateway.rb +2 -0
  527. data/spree_core.gemspec +12 -12
  528. metadata +249 -43
  529. data/config/initializers/premailer_rails.rb +0 -3
@@ -0,0 +1,731 @@
1
+ require 'spec_helper'
2
+
3
+ shared_examples "an invalid state transition" do |status, expected_status|
4
+ let(:status) { status }
5
+
6
+ it "cannot transition to #{expected_status}" do
7
+ expect { subject }.to raise_error(StateMachines::InvalidTransition)
8
+ end
9
+ end
10
+
11
+ describe Spree::ReturnItem, type: :model do
12
+
13
+ all_reception_statuses = Spree::ReturnItem.state_machines[:reception_status].states.map(&:name).map(&:to_s)
14
+ all_acceptance_statuses = Spree::ReturnItem.state_machines[:acceptance_status].states.map(&:name).map(&:to_s)
15
+
16
+ before do
17
+ allow_any_instance_of(Spree::Order).to receive_messages(return!: true)
18
+ end
19
+
20
+ describe '#receive!' do
21
+ let(:now) { Time.current }
22
+ let(:inventory_unit) { create(:inventory_unit, state: 'shipped') }
23
+ let(:return_item) { create(:return_item, inventory_unit: inventory_unit) }
24
+
25
+ before do
26
+ inventory_unit.update_attributes!(state: 'shipped')
27
+ return_item.update_attributes!(reception_status: 'awaiting')
28
+ allow(return_item).to receive(:eligible_for_return?).and_return(true)
29
+ end
30
+
31
+ subject { return_item.receive! }
32
+
33
+
34
+ it 'returns the inventory unit' do
35
+ subject
36
+ expect(inventory_unit.reload.state).to eq 'returned'
37
+ end
38
+
39
+ it 'attempts to accept the return item' do
40
+ expect(return_item).to receive(:attempt_accept)
41
+ subject
42
+ end
43
+
44
+ context 'with a stock location' do
45
+ let(:stock_item) { inventory_unit.find_stock_item }
46
+ let!(:customer_return) { create(:customer_return_without_return_items, return_items: [return_item], stock_location_id: inventory_unit.shipment.stock_location_id) }
47
+
48
+ before do
49
+ inventory_unit.update_attributes!(state: 'shipped')
50
+ return_item.update_attributes!(reception_status: 'awaiting')
51
+ end
52
+
53
+ it 'increases the count on hand' do
54
+ expect { subject }.to change { stock_item.reload.count_on_hand }.by(1)
55
+ end
56
+
57
+ context "when the variant is not resellable" do
58
+ before { return_item.update_attributes(resellable: false) }
59
+ it { expect { subject }.not_to change { stock_item.reload.count_on_hand } }
60
+ end
61
+
62
+ context 'when variant does not track inventory' do
63
+ before do
64
+ inventory_unit.update_attributes!(state: 'shipped')
65
+ inventory_unit.variant.update_attributes!(track_inventory: false)
66
+ return_item.update_attributes!(reception_status: 'awaiting')
67
+ end
68
+
69
+ it 'does not increase the count on hand' do
70
+ expect { subject }.to_not change { stock_item.reload.count_on_hand }
71
+ end
72
+ end
73
+
74
+ context 'when the restock_inventory preference is false' do
75
+ before do
76
+ Spree::Config[:restock_inventory] = false
77
+ end
78
+
79
+ it 'does not increase the count on hand' do
80
+ expect { subject }.to_not change { stock_item.reload.count_on_hand }
81
+ end
82
+ end
83
+ end
84
+ end
85
+
86
+ describe "#display_pre_tax_amount" do
87
+ let(:pre_tax_amount) { 21.22 }
88
+ let(:return_item) { build(:return_item, pre_tax_amount: pre_tax_amount) }
89
+
90
+ it "returns a Spree::Money" do
91
+ expect(return_item.display_pre_tax_amount).to eq(Spree::Money.new(pre_tax_amount))
92
+ end
93
+ end
94
+
95
+ describe ".default_refund_amount_calculator" do
96
+ it "defaults to the default refund amount calculator" do
97
+ expect(Spree::ReturnItem.refund_amount_calculator).to eq Spree::Calculator::Returns::DefaultRefundAmount
98
+ end
99
+ end
100
+
101
+ describe "pre_tax_amount calculations on create" do
102
+ let(:inventory_unit) { build(:inventory_unit) }
103
+ before { subject.save! }
104
+
105
+ context "pre tax amount is not specified" do
106
+ subject { build(:return_item, inventory_unit: inventory_unit) }
107
+
108
+ context "not an exchange" do
109
+ it { expect(subject.pre_tax_amount).to eq Spree::Calculator::Returns::DefaultRefundAmount.new.compute(subject) }
110
+ end
111
+
112
+ context "an exchange" do
113
+ subject { build(:exchange_return_item) }
114
+
115
+ it { expect(subject.pre_tax_amount).to eq 0.0 }
116
+ end
117
+ end
118
+
119
+ context "pre tax amount is specified" do
120
+ subject { build(:return_item, inventory_unit: inventory_unit, pre_tax_amount: 100) }
121
+
122
+ it { expect(subject.pre_tax_amount).to eq 100 }
123
+ end
124
+ end
125
+
126
+ describe ".from_inventory_unit" do
127
+ let(:inventory_unit) { build(:inventory_unit) }
128
+
129
+ subject { Spree::ReturnItem.from_inventory_unit(inventory_unit) }
130
+
131
+ context "with a cancelled return item" do
132
+ let!(:return_item) { create(:return_item, inventory_unit: inventory_unit, reception_status: 'cancelled') }
133
+
134
+ it { is_expected.not_to be_persisted }
135
+ end
136
+
137
+ context "with a non-cancelled return item" do
138
+ let!(:return_item) { create(:return_item, inventory_unit: inventory_unit) }
139
+
140
+ it { is_expected.to be_persisted }
141
+ end
142
+ end
143
+
144
+ describe "reception_status state_machine" do
145
+ subject(:return_item) { create(:return_item) }
146
+
147
+ it "starts off in the awaiting state" do
148
+ expect(return_item).to be_awaiting
149
+ end
150
+ end
151
+
152
+ describe "acceptance_status state_machine" do
153
+ subject(:return_item) { create(:return_item) }
154
+
155
+ it "starts off in the pending state" do
156
+ expect(return_item).to be_pending
157
+ end
158
+ end
159
+
160
+ describe "#receive" do
161
+ let(:inventory_unit) { create(:inventory_unit, order: create(:shipped_order)) }
162
+ let(:return_item) { create(:return_item, reception_status: status, inventory_unit: inventory_unit) }
163
+
164
+ subject { return_item.receive! }
165
+
166
+ context "awaiting status" do
167
+ let(:status) { 'awaiting' }
168
+
169
+ before do
170
+ expect(return_item.inventory_unit).to receive(:return!)
171
+ end
172
+
173
+ before { subject }
174
+
175
+ it "transitions successfully" do
176
+ expect(return_item).to be_received
177
+ end
178
+ end
179
+
180
+ (all_reception_statuses - ['awaiting']).each do |invalid_transition_status|
181
+ context "return_item has a reception status of #{invalid_transition_status}" do
182
+ it_behaves_like "an invalid state transition", invalid_transition_status, 'received'
183
+ end
184
+ end
185
+ end
186
+
187
+ describe "#cancel" do
188
+ let(:return_item) { create(:return_item, reception_status: status) }
189
+
190
+ subject { return_item.cancel! }
191
+
192
+ context "awaiting status" do
193
+ let(:status) { 'awaiting' }
194
+
195
+ before { subject }
196
+
197
+ it "transitions successfully" do
198
+ expect(return_item).to be_cancelled
199
+ end
200
+ end
201
+
202
+ (all_reception_statuses - ['awaiting']).each do |invalid_transition_status|
203
+ context "return_item has a reception status of #{invalid_transition_status}" do
204
+ it_behaves_like "an invalid state transition", invalid_transition_status, 'cancelled'
205
+ end
206
+ end
207
+ end
208
+
209
+ describe "#give" do
210
+ let(:return_item) { create(:return_item, reception_status: status) }
211
+
212
+ subject { return_item.give! }
213
+
214
+ context "awaiting status" do
215
+ let(:status) { 'awaiting' }
216
+
217
+ before { subject }
218
+
219
+ it "transitions successfully" do
220
+ expect(return_item).to be_given_to_customer
221
+ end
222
+ end
223
+
224
+ (all_reception_statuses - ['awaiting']).each do |invalid_transition_status|
225
+ context "return_item has a reception status of #{invalid_transition_status}" do
226
+ it_behaves_like "an invalid state transition", invalid_transition_status, 'give_to_customer'
227
+ end
228
+ end
229
+ end
230
+
231
+ describe "#attempt_accept" do
232
+ let(:return_item) { create(:return_item, acceptance_status: status) }
233
+ let(:validator_errors) { {} }
234
+ let(:validator_double) { double(errors: validator_errors) }
235
+
236
+ subject { return_item.attempt_accept! }
237
+
238
+ before do
239
+ allow(return_item).to receive(:validator).and_return(validator_double)
240
+ end
241
+
242
+ context "pending status" do
243
+ let(:status) { 'pending' }
244
+
245
+ before do
246
+ allow(return_item).to receive(:eligible_for_return?).and_return(true)
247
+ subject
248
+ end
249
+
250
+ it "transitions successfully" do
251
+ expect(return_item).to be_accepted
252
+ end
253
+
254
+ it "has no acceptance status errors" do
255
+ expect(return_item.acceptance_status_errors).to be_empty
256
+ end
257
+ end
258
+
259
+ (all_acceptance_statuses - ['accepted', 'pending']).each do |invalid_transition_status|
260
+ context "return_item has an acceptance status of #{invalid_transition_status}" do
261
+ it_behaves_like "an invalid state transition", invalid_transition_status, 'accepted'
262
+ end
263
+ end
264
+
265
+ context "not eligible for return" do
266
+ let(:status) { 'pending' }
267
+ let(:validator_errors) { { number_of_days: "Return Item is outside the eligible time period" } }
268
+
269
+ before do
270
+ allow(return_item).to receive(:eligible_for_return?).and_return(false)
271
+ end
272
+
273
+ context "manual intervention required" do
274
+ before do
275
+ allow(return_item).to receive(:requires_manual_intervention?).and_return(true)
276
+ subject
277
+ end
278
+
279
+ it "transitions to manual intervention required" do
280
+ expect(return_item).to be_manual_intervention_required
281
+ end
282
+
283
+ it "sets the acceptance status errors" do
284
+ expect(return_item.acceptance_status_errors).to eq validator_errors
285
+ end
286
+ end
287
+
288
+ context "manual intervention not required" do
289
+ before do
290
+ allow(return_item).to receive(:requires_manual_intervention?).and_return(false)
291
+ subject
292
+ end
293
+
294
+ it "transitions to rejected" do
295
+ expect(return_item).to be_rejected
296
+ end
297
+
298
+ it "sets the acceptance status errors" do
299
+ expect(return_item.acceptance_status_errors).to eq validator_errors
300
+ end
301
+ end
302
+ end
303
+ end
304
+
305
+ describe "#reject" do
306
+ let(:return_item) { create(:return_item, acceptance_status: status) }
307
+
308
+ subject { return_item.reject! }
309
+
310
+ context "pending status" do
311
+ let(:status) { 'pending' }
312
+
313
+ before { subject }
314
+
315
+ it "transitions successfully" do
316
+ expect(return_item).to be_rejected
317
+ end
318
+
319
+ it "has no acceptance status errors" do
320
+ expect(return_item.acceptance_status_errors).to be_empty
321
+ end
322
+ end
323
+
324
+ (all_acceptance_statuses - ['accepted', 'pending', 'manual_intervention_required']).each do |invalid_transition_status|
325
+ context "return_item has an acceptance status of #{invalid_transition_status}" do
326
+ it_behaves_like "an invalid state transition", invalid_transition_status, 'rejected'
327
+ end
328
+ end
329
+ end
330
+
331
+ describe "#accept" do
332
+ let(:return_item) { create(:return_item, acceptance_status: status) }
333
+
334
+ subject { return_item.accept! }
335
+
336
+ context "pending status" do
337
+ let(:status) { 'pending' }
338
+
339
+ before { subject }
340
+
341
+ it "transitions successfully" do
342
+ expect(return_item).to be_accepted
343
+ end
344
+
345
+ it "has no acceptance status errors" do
346
+ expect(return_item.acceptance_status_errors).to be_empty
347
+ end
348
+ end
349
+
350
+ (all_acceptance_statuses - ['accepted', 'pending', 'manual_intervention_required']).each do |invalid_transition_status|
351
+ context "return_item has an acceptance status of #{invalid_transition_status}" do
352
+ it_behaves_like "an invalid state transition", invalid_transition_status, 'accepted'
353
+ end
354
+ end
355
+ end
356
+
357
+ describe "#require_manual_intervention" do
358
+ let(:return_item) { create(:return_item, acceptance_status: status) }
359
+
360
+ subject { return_item.require_manual_intervention! }
361
+
362
+ context "pending status" do
363
+ let(:status) { 'pending' }
364
+
365
+ before { subject }
366
+
367
+ it "transitions successfully" do
368
+ expect(return_item).to be_manual_intervention_required
369
+ end
370
+
371
+ it "has no acceptance status errors" do
372
+ expect(return_item.acceptance_status_errors).to be_empty
373
+ end
374
+ end
375
+
376
+ (all_acceptance_statuses - ['accepted', 'pending', 'manual_intervention_required']).each do |invalid_transition_status|
377
+ context "return_item has an acceptance status of #{invalid_transition_status}" do
378
+ it_behaves_like "an invalid state transition", invalid_transition_status, 'manual_intervention_required'
379
+ end
380
+ end
381
+ end
382
+
383
+ describe 'validity for reimbursements' do
384
+ let(:return_item) { create(:return_item, acceptance_status: acceptance_status) }
385
+ let(:acceptance_status) { 'pending' }
386
+
387
+ before { return_item.reimbursement = build(:reimbursement) }
388
+
389
+ subject { return_item }
390
+
391
+ context 'when acceptance_status is accepted' do
392
+ let(:acceptance_status) { 'accepted' }
393
+
394
+ it 'is valid' do
395
+ expect(subject).to be_valid
396
+ end
397
+ end
398
+
399
+ context 'when acceptance_status is accepted' do
400
+ let(:acceptance_status) { 'pending' }
401
+
402
+ it 'is valid' do
403
+ expect(subject).to_not be_valid
404
+ expect(subject.errors.messages).to eq({reimbursement: [I18n.t(:cannot_be_associated_unless_accepted, scope: 'activerecord.errors.models.spree/return_item.attributes.reimbursement')]})
405
+ end
406
+ end
407
+ end
408
+
409
+ describe "#exchange_requested?" do
410
+ context "exchange variant exists" do
411
+ before { allow(subject).to receive(:exchange_variant) { mock_model(Spree::Variant) } }
412
+ it { expect(subject.exchange_requested?).to eq true }
413
+ end
414
+ context "exchange variant does not exist" do
415
+ before { allow(subject).to receive(:exchange_variant) { nil } }
416
+ it { expect(subject.exchange_requested?).to eq false }
417
+ end
418
+ end
419
+
420
+ describe "#exchange_processed?" do
421
+ context "exchange inventory unit exists" do
422
+ before { allow(subject).to receive(:exchange_inventory_unit) { mock_model(Spree::InventoryUnit) } }
423
+ it { expect(subject.exchange_processed?).to eq true }
424
+ end
425
+ context "exchange inventory unit does not exist" do
426
+ before { allow(subject).to receive(:exchange_inventory_unit) { nil } }
427
+ it { expect(subject.exchange_processed?).to eq false }
428
+ end
429
+ end
430
+
431
+ describe "#exchange_required?" do
432
+ context "exchange has been requested and not yet processed" do
433
+ before do
434
+ allow(subject).to receive(:exchange_requested?) { true }
435
+ allow(subject).to receive(:exchange_processed?) { false }
436
+ end
437
+
438
+ it { expect(subject.exchange_required?).to be true }
439
+ end
440
+
441
+ context "exchange has not been requested" do
442
+ before { allow(subject).to receive(:exchange_requested?) { false } }
443
+ it { expect(subject.exchange_required?).to be false }
444
+ end
445
+
446
+ context "exchange has been requested and processed" do
447
+ before do
448
+ allow(subject).to receive(:exchange_requested?) { true }
449
+ allow(subject).to receive(:exchange_processed?) { true }
450
+ end
451
+ it { expect(subject.exchange_required?).to be false }
452
+ end
453
+ end
454
+
455
+ describe "#eligible_exchange_variants" do
456
+ it "uses the exchange variant calculator to compute possible variants to exchange for" do
457
+ return_item = build(:return_item)
458
+ expect(Spree::ReturnItem.exchange_variant_engine).to receive(:eligible_variants).with(return_item.variant)
459
+ return_item.eligible_exchange_variants
460
+ end
461
+ end
462
+
463
+ describe ".exchange_variant_engine" do
464
+ it "defaults to the same product calculator" do
465
+ expect(Spree::ReturnItem.exchange_variant_engine).to eq Spree::ReturnItem::ExchangeVariantEligibility::SameProduct
466
+ end
467
+ end
468
+
469
+ describe "exchange pre_tax_amount" do
470
+ let(:return_item) { build(:return_item) }
471
+
472
+ context "the return item is intended to be exchanged" do
473
+ before do
474
+ return_item.inventory_unit.variant.update_column(:track_inventory, false)
475
+ return_item.exchange_variant = return_item.inventory_unit.variant
476
+ end
477
+
478
+ it do
479
+ return_item.pre_tax_amount = 5.0
480
+ return_item.save!
481
+ expect(return_item.reload.pre_tax_amount).to eq 0.0
482
+ end
483
+ end
484
+
485
+ context "the return item is not intended to be exchanged" do
486
+ it do
487
+ return_item.pre_tax_amount = 5.0
488
+ return_item.save!
489
+ expect(return_item.reload.pre_tax_amount).to eq 5.0
490
+ end
491
+ end
492
+ end
493
+
494
+ describe "#build_exchange_inventory_unit" do
495
+ let(:return_item) { build(:return_item) }
496
+ subject { return_item.build_exchange_inventory_unit }
497
+
498
+ context "the return item is intended to be exchanged" do
499
+ before { allow(return_item).to receive(:exchange_variant).and_return(mock_model(Spree::Variant)) }
500
+
501
+ context "an exchange inventory unit already exists" do
502
+ before { allow(return_item).to receive(:exchange_inventory_unit).and_return(mock_model(Spree::InventoryUnit)) }
503
+ it { expect(subject).to be_nil }
504
+ end
505
+
506
+ context "no exchange inventory unit exists" do
507
+ it "builds a pending inventory unit with references to the return item, variant, and previous inventory unit" do
508
+ expect(subject.variant).to eq return_item.exchange_variant
509
+ expect(subject.pending).to eq true
510
+ expect(subject).not_to be_persisted
511
+ expect(subject.original_return_item).to eq return_item
512
+ expect(subject.line_item).to eq return_item.inventory_unit.line_item
513
+ expect(subject.order).to eq return_item.inventory_unit.order
514
+ end
515
+ end
516
+ end
517
+
518
+ context "the return item is not intended to be exchanged" do
519
+ it { expect(subject).to be_nil }
520
+ end
521
+ end
522
+
523
+ describe "#exchange_shipment" do
524
+ it "returns the exchange inventory unit's shipment" do
525
+ inventory_unit = build(:inventory_unit)
526
+ subject.exchange_inventory_unit = inventory_unit
527
+ expect(subject.exchange_shipment).to eq inventory_unit.shipment
528
+ end
529
+ end
530
+
531
+ describe "#shipment" do
532
+ it "returns the inventory unit's shipment" do
533
+ inventory_unit = build(:inventory_unit)
534
+ subject.inventory_unit = inventory_unit
535
+ expect(subject.shipment).to eq inventory_unit.shipment
536
+ end
537
+ end
538
+
539
+ describe 'inventory_unit uniqueness' do
540
+ let!(:old_return_item) { create(:return_item, reception_status: old_reception_status) }
541
+ let(:old_reception_status) { 'awaiting' }
542
+
543
+ subject do
544
+ build(:return_item, {
545
+ return_authorization: old_return_item.return_authorization,
546
+ inventory_unit: old_return_item.inventory_unit,
547
+ })
548
+ end
549
+
550
+ context 'with other awaiting return items exist for the same inventory unit' do
551
+ let(:old_reception_status) { 'awaiting' }
552
+
553
+ it 'cancels the others' do
554
+ expect {
555
+ subject.save!
556
+ }.to change { old_return_item.reload.reception_status }.from('awaiting').to('cancelled')
557
+ end
558
+
559
+ it 'does not cancel itself' do
560
+ subject.save!
561
+ expect(subject).to be_awaiting
562
+ end
563
+ end
564
+
565
+ context 'with other cancelled return items exist for the same inventory unit' do
566
+ let(:old_reception_status) { 'cancelled' }
567
+
568
+ it 'succeeds' do
569
+ expect { subject.save! }.to_not raise_error
570
+ end
571
+ end
572
+
573
+ context 'with other received return items exist for the same inventory unit' do
574
+ let(:old_reception_status) { 'received' }
575
+
576
+ it 'is invalid' do
577
+ expect(subject).to_not be_valid
578
+ expect(subject.errors.to_a).to eq ["Inventory unit #{subject.inventory_unit_id} has already been taken by return item #{old_return_item.id}"]
579
+ end
580
+ end
581
+
582
+ context 'with other given_to_customer return items exist for the same inventory unit' do
583
+ let(:old_reception_status) { 'given_to_customer' }
584
+
585
+ it 'is invalid' do
586
+ expect(subject).to_not be_valid
587
+ expect(subject.errors.to_a).to eq ["Inventory unit #{subject.inventory_unit_id} has already been taken by return item #{old_return_item.id}"]
588
+ end
589
+ end
590
+ end
591
+
592
+ describe "valid exchange variant" do
593
+ subject { return_item }
594
+
595
+ before { subject.save }
596
+
597
+ context "return item doesn't have an exchange variant" do
598
+ let(:return_item) { create(:return_item) }
599
+
600
+ it "is valid" do
601
+ expect(subject).to be_valid
602
+ end
603
+ end
604
+
605
+ context "return item has an exchange variant" do
606
+ let(:return_item) { create(:exchange_return_item) }
607
+ let(:exchange_variant) { create(:on_demand_variant, product: return_item.inventory_unit.variant.product) }
608
+
609
+ context "the exchange variant is eligible" do
610
+ before { return_item.exchange_variant = exchange_variant }
611
+
612
+ it "is valid" do
613
+ expect(subject).to be_valid
614
+ end
615
+ end
616
+
617
+ context "the exchange variant is not eligible" do
618
+ context "new return item" do
619
+ let(:return_item) { build(:return_item) }
620
+ let(:exchange_variant) { create(:variant, product: return_item.inventory_unit.variant.product) }
621
+
622
+ before { return_item.exchange_variant = exchange_variant }
623
+
624
+ it "is invalid" do
625
+ expect(subject).to_not be_valid
626
+ end
627
+
628
+ it "adds an error message about the invalid exchange variant" do
629
+ subject.valid?
630
+ expect(subject.errors.to_a).to eq ["Invalid exchange variant."]
631
+ end
632
+ end
633
+
634
+ context "the exchange variant has been updated" do
635
+ before do
636
+ other_variant = create(:variant)
637
+ return_item.exchange_variant_id = other_variant.id
638
+ subject.valid?
639
+ end
640
+
641
+ it "is invalid" do
642
+ expect(subject).to_not be_valid
643
+ end
644
+
645
+ it "adds an error message about the invalid exchange variant" do
646
+ expect(subject.errors.to_a).to eq ["Invalid exchange variant."]
647
+ end
648
+ end
649
+
650
+ context "the exchange variant has not been updated" do
651
+ before do
652
+ other_variant = create(:variant)
653
+ return_item.update_column(:exchange_variant_id, other_variant.id)
654
+ return_item.reload
655
+ subject.valid?
656
+ end
657
+
658
+ it "is valid" do
659
+ expect(subject).to be_valid
660
+ end
661
+ end
662
+ end
663
+ end
664
+ end
665
+
666
+ describe "included tax in total" do
667
+ let(:inventory_unit) { create(:inventory_unit, state: 'shipped') }
668
+ let(:return_item) do
669
+ create(
670
+ :return_item,
671
+ inventory_unit: inventory_unit,
672
+ included_tax_total: 10
673
+ )
674
+ end
675
+
676
+ it 'includes included tax total' do
677
+ expect(return_item.pre_tax_amount).to eq 10
678
+ expect(return_item.included_tax_total).to eq 10
679
+ expect(return_item.total).to eq 20
680
+ end
681
+ end
682
+
683
+ describe '#process_inventory_unit!' do
684
+ let(:inventory_unit) { create(:inventory_unit, state: 'shipped') }
685
+ let(:return_item) { create(:return_item, inventory_unit: inventory_unit, reception_status: 'awaiting') }
686
+ let!(:stock_item) { inventory_unit.find_stock_item }
687
+ before { return_item.update_attributes!(reception_status: 'awaiting') }
688
+
689
+ subject { return_item.send(:process_inventory_unit!) }
690
+
691
+ it { expect { subject }.to change { inventory_unit.state }.to('returned').from('shipped') }
692
+
693
+ context 'stock should restock' do
694
+ let(:stock_movement_attributes) do
695
+ {
696
+ stock_item_id: stock_item.id,
697
+ quantity: 1,
698
+ originator: return_item.return_authorization
699
+ }
700
+ end
701
+
702
+ it { expect(subject).to eq(Spree::StockMovement.find_by(stock_movement_attributes)) }
703
+ end
704
+
705
+ context 'stock should not restock' do
706
+ context 'return_item is not resellable' do
707
+ before { return_item.resellable = false }
708
+ it { expect(subject).to be_nil }
709
+ it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
710
+ end
711
+
712
+ context 'variant should not track inventory' do
713
+ before { return_item.variant.track_inventory = false }
714
+ it { expect(subject).to be_nil }
715
+ it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
716
+ end
717
+
718
+ context 'stock_item not present' do
719
+ before { stock_item.destroy }
720
+ it { expect(subject).to be_nil }
721
+ it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
722
+ end
723
+
724
+ context 'when restock inventory preference false' do
725
+ before { Spree::Config[:restock_inventory] = false }
726
+ it { expect(subject).to be_nil }
727
+ it { expect { subject }.to_not change { stock_item.reload.count_on_hand } }
728
+ end
729
+ end
730
+ end
731
+ end