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
@@ -236,11 +236,6 @@ module Spree
236
236
  updater.update
237
237
  end
238
238
 
239
- def update!
240
- warn "`update!` is deprecated as it conflicts with update! method of rails. Use `update_with_updater!` instead."
241
- update_with_updater!
242
- end
243
-
244
239
  def merger
245
240
  @merger ||= Spree::OrderMerger.new(self)
246
241
  end
@@ -272,8 +267,8 @@ module Spree
272
267
  self.user = user
273
268
  self.email = user.email if override_email
274
269
  self.created_by ||= user
275
- self.bill_address ||= user.bill_address.try(:clone)
276
- self.ship_address ||= user.ship_address.try(:clone)
270
+ self.bill_address ||= user.bill_address
271
+ self.ship_address ||= user.ship_address
277
272
 
278
273
  changes = slice(:user_id, :email, :created_by_id, :bill_address_id, :ship_address_id)
279
274
 
@@ -405,7 +400,7 @@ module Spree
405
400
  end
406
401
 
407
402
  def available_payment_methods
408
- @available_payment_methods ||= PaymentMethod.available_on_front_end
403
+ @available_payment_methods ||= collect_payment_methods
409
404
  end
410
405
 
411
406
  def insufficient_stock_lines
@@ -481,7 +476,6 @@ module Spree
481
476
  Spree::Promotion.order_activatable?(self)
482
477
  end
483
478
 
484
-
485
479
  def shipped?
486
480
  %w(partial shipped).include?(shipment_state)
487
481
  end
@@ -489,6 +483,11 @@ module Spree
489
483
  def create_proposed_shipments
490
484
  all_adjustments.shipping.delete_all
491
485
  shipments.destroy_all
486
+
487
+ # Inventory Units which are not associated to any shipment (unshippable)
488
+ # and are not returned or shipped should be deleted
489
+ inventory_units.on_hand_or_backordered.delete_all
490
+
492
491
  self.shipments = Spree::Stock::Coordinator.new(self).shipments
493
492
  end
494
493
 
@@ -608,22 +607,6 @@ module Spree
608
607
  end
609
608
  alias_method :fully_discounted, :fully_discounted?
610
609
 
611
- def payments_attributes=(attributes)
612
- validate_payments_attributes(attributes)
613
- super(attributes)
614
- end
615
-
616
- def validate_payments_attributes(attributes)
617
- # Ensure the payment methods specified are allowed for this user
618
- payment_methods = Spree::PaymentMethod.where(id: available_payment_methods.map(&:id))
619
- attributes.each do |payment_attributes|
620
- payment_method_id = payment_attributes[:payment_method_id]
621
-
622
- # raise RecordNotFound unless it is an allowed payment method
623
- payment_methods.find(payment_method_id) if payment_method_id
624
- end
625
- end
626
-
627
610
  private
628
611
 
629
612
  def link_by_email
@@ -681,5 +664,9 @@ module Spree
681
664
  def create_token
682
665
  self.guest_token ||= generate_guest_token
683
666
  end
667
+
668
+ def collect_payment_methods
669
+ PaymentMethod.available_on_front_end.select { |pm| pm.available_for_order?(self) }
670
+ end
684
671
  end
685
672
  end
@@ -53,17 +53,16 @@ module Spree
53
53
  end
54
54
 
55
55
  def filter_order_items(params)
56
- filtered_params = params.symbolize_keys
57
- return filtered_params if filtered_params[:line_items_attributes].nil? || filtered_params[:line_items_attributes][:id]
56
+ return params if params[:line_items_attributes].nil? || params[:line_items_attributes][:id]
58
57
 
59
58
  line_item_ids = order.line_items.pluck(:id)
60
59
 
61
60
  params[:line_items_attributes].each_pair do |id, value|
62
61
  unless line_item_ids.include?(value[:id].to_i) || value[:variant_id].present?
63
- filtered_params[:line_items_attributes].delete(id)
62
+ params[:line_items_attributes].delete(id)
64
63
  end
65
64
  end
66
- filtered_params
65
+ params
67
66
  end
68
67
 
69
68
  def order_updater
@@ -82,8 +81,10 @@ module Spree
82
81
  line_item.quantity += quantity.to_i
83
82
  line_item.currency = currency unless currency.nil?
84
83
  else
85
- opts = { currency: order.currency }.merge ActionController::Parameters.new(options).
86
- permit(PermittedAttributes.line_item_attributes)
84
+ opts = ActionController::Parameters.new(options.to_h).
85
+ permit(PermittedAttributes.line_item_attributes).to_h.
86
+ merge( { currency: order.currency } )
87
+
87
88
  line_item = order.line_items.new(quantity: quantity,
88
89
  variant: variant,
89
90
  options: opts)
@@ -25,6 +25,8 @@ module Spree
25
25
 
26
26
  shipment = determine_target_shipment unless shipment
27
27
  add_to_shipment(shipment, quantity)
28
+ elsif inventory_units.size == line_item.quantity && !line_item.changed?
29
+ remove(inventory_units, shipment)
28
30
  elsif inventory_units.size > line_item.quantity
29
31
  remove(inventory_units, shipment)
30
32
  end
@@ -32,8 +34,9 @@ module Spree
32
34
  end
33
35
 
34
36
  private
37
+
35
38
  def remove(item_units, shipment = nil)
36
- quantity = item_units.size - line_item.quantity
39
+ quantity = set_quantity_to_remove(item_units)
37
40
 
38
41
  if shipment.present?
39
42
  remove_from_shipment(shipment, quantity)
@@ -45,6 +48,14 @@ module Spree
45
48
  end
46
49
  end
47
50
 
51
+ def set_quantity_to_remove(item_units)
52
+ if (item_units.size - line_item.quantity).zero?
53
+ line_item.quantity
54
+ else
55
+ item_units.size - line_item.quantity
56
+ end
57
+ end
58
+
48
59
  # Returns either one of the shipment:
49
60
  #
50
61
  # first unshipped that already includes this variant
@@ -15,7 +15,6 @@ module Spree
15
15
  # object with callbacks (otherwise you will end up in an infinite recursion as the
16
16
  # associations try to save and then in turn try to call +update!+ again.)
17
17
  def update
18
- update_item_count
19
18
  update_totals
20
19
  if order.completed?
21
20
  update_payment_state
@@ -139,7 +138,7 @@ module Spree
139
138
  # will return nil if no shipments are found
140
139
  order.shipment_state = shipment_states.first
141
140
  # TODO inventory unit states?
142
- # if order.shipment_state && order.inventory_units.where(:shipment_id => nil).exists?
141
+ # if order.shipment_state && order.inventory_units.where(shipment_id: nil).exists?
143
142
  # shipments exist but there are unassigned inventory units
144
143
  # order.shipment_state = 'partial'
145
144
  # end
@@ -29,7 +29,7 @@ module Spree
29
29
  # a new pending payment record for the remaining amount to capture later.
30
30
  def capture!(amount = nil)
31
31
  return true if completed?
32
- amount ||= money.amount_in_cents
32
+ amount ||= money.money.cents
33
33
  started_processing!
34
34
  protect_from_connection_error do
35
35
  # Standard ActiveMerchant capture usage
@@ -115,7 +115,7 @@ module Spree
115
115
 
116
116
  def gateway_action(source, action, success_state)
117
117
  protect_from_connection_error do
118
- response = payment_method.send(action, money.amount_in_cents,
118
+ response = payment_method.send(action, money.money.cents,
119
119
  source,
120
120
  gateway_options)
121
121
  handle_response(response, success_state, :failure)
@@ -143,7 +143,7 @@ module Spree
143
143
  end
144
144
 
145
145
  def record_response(response)
146
- log_entries.create!(:details => response.to_yaml)
146
+ log_entries.create!(details: response.to_yaml)
147
147
  end
148
148
 
149
149
  def protect_from_connection_error
@@ -5,7 +5,7 @@ module Spree
5
5
 
6
6
  DISPLAY = [:both, :front_end, :back_end].freeze
7
7
 
8
- scope :active, -> { where(active: true) }
8
+ scope :active, -> { where(active: true).order(position: :asc) }
9
9
  scope :available, -> { active.where(display_on: [:front_end, :back_end, :both]) }
10
10
  scope :available_on_front_end, -> { active.where(display_on: [:front_end, :both]) }
11
11
  scope :available_on_back_end, -> { active.where(display_on: [:back_end, :both]) }
@@ -67,5 +67,11 @@ module Spree
67
67
  def store_credit?
68
68
  self.class == Spree::PaymentMethod::StoreCredit
69
69
  end
70
+
71
+ # Custom PaymentMethod/Gateway can redefine this method to check method
72
+ # availability for concrete order.
73
+ def available_for_order?(_order)
74
+ true
75
+ end
70
76
  end
71
77
  end
@@ -24,7 +24,7 @@ module Spree::Preferences
24
24
 
25
25
  def exist?(key)
26
26
  @cache.exist?(key) ||
27
- should_persist? && Spree::Preference.where(:key => key).exists?
27
+ should_persist? && Spree::Preference.where(key: key).exists?
28
28
  end
29
29
 
30
30
  def get(key)
@@ -73,7 +73,7 @@ module Spree::Preferences
73
73
  def persist(cache_key, value)
74
74
  return unless should_persist?
75
75
 
76
- preference = Spree::Preference.where(:key => cache_key).first_or_initialize
76
+ preference = Spree::Preference.where(key: cache_key).first_or_initialize
77
77
  preference.value = value
78
78
  preference.save
79
79
  end
@@ -86,7 +86,7 @@ module Spree::Preferences
86
86
  end
87
87
 
88
88
  def should_persist?
89
- @persistence && ActiveRecord::Base.connected? && Spree::Preference.table_exists?
89
+ @persistence and Spree::Preference.table_exists?
90
90
  end
91
91
 
92
92
  end
@@ -39,34 +39,34 @@ module Spree
39
39
  add_simple_scopes simple_scopes
40
40
 
41
41
  add_search_scope :ascend_by_master_price do
42
- joins(:master => :default_price).order("#{price_table_name}.amount ASC")
42
+ joins(master: :default_price).order("#{price_table_name}.amount ASC")
43
43
  end
44
44
 
45
45
  add_search_scope :descend_by_master_price do
46
- joins(:master => :default_price).order("#{price_table_name}.amount DESC")
46
+ joins(master: :default_price).order("#{price_table_name}.amount DESC")
47
47
  end
48
48
 
49
49
  add_search_scope :price_between do |low, high|
50
- joins(:master => :default_price).where(Price.table_name => { :amount => low..high })
50
+ joins(master: :default_price).where(Price.table_name => { amount: low..high })
51
51
  end
52
52
 
53
53
  add_search_scope :master_price_lte do |price|
54
- joins(:master => :default_price).where("#{price_table_name}.amount <= ?", price)
54
+ joins(master: :default_price).where("#{price_table_name}.amount <= ?", price)
55
55
  end
56
56
 
57
57
  add_search_scope :master_price_gte do |price|
58
- joins(:master => :default_price).where("#{price_table_name}.amount >= ?", price)
58
+ joins(master: :default_price).where("#{price_table_name}.amount >= ?", price)
59
59
  end
60
60
 
61
61
  # This scope selects products in taxon AND all its descendants
62
62
  # If you need products only within one taxon use
63
63
  #
64
- # Spree::Product.joins(:taxons).where(Taxon.table_name => { :id => taxon.id })
64
+ # Spree::Product.joins(:taxons).where(Taxon.table_name => { id: taxon.id })
65
65
  #
66
66
  # If you're using count on the result of this scope, you must use the
67
67
  # `:distinct` option as well:
68
68
  #
69
- # Spree::Product.in_taxon(taxon).count(:distinct => true)
69
+ # Spree::Product.in_taxon(taxon).count(distinct: true)
70
70
  #
71
71
  # This is so that the count query is distinct'd:
72
72
  #
@@ -162,8 +162,8 @@ module Spree
162
162
  # there is alternative faster and more elegant solution, it has small drawback though,
163
163
  # it doesn stack with other scopes :/
164
164
  #
165
- # :joins => "LEFT OUTER JOIN (SELECT line_items.variant_id as vid, COUNT(*) as cnt FROM line_items GROUP BY line_items.variant_id) AS popularity_count ON variants.id = vid",
166
- # :order => 'COALESCE(cnt, 0) DESC'
165
+ # joins: "LEFT OUTER JOIN (SELECT line_items.variant_id as vid, COUNT(*) as cnt FROM line_items GROUP BY line_items.variant_id) AS popularity_count ON variants.id = vid",
166
+ # order: 'COALESCE(cnt, 0) DESC'
167
167
  add_search_scope :descend_by_popularity do
168
168
  joins(:master).
169
169
  order(%Q{
@@ -186,23 +186,19 @@ module Spree
186
186
  where("#{Product.quoted_table_name}.deleted_at IS NULL or #{Product.quoted_table_name}.deleted_at >= ?", Time.zone.now)
187
187
  end
188
188
 
189
- def self.not_discontinued(only_not_discontinued = true)
190
- if only_not_discontinued != '0' && only_not_discontinued
191
- where("#{Product.quoted_table_name}.discontinue_on IS NULL or #{Product.quoted_table_name}.discontinue_on >= ?", Time.zone.now)
192
- else
193
- all
194
- end
189
+ add_search_scope :not_discontinued do
190
+ where("#{Product.quoted_table_name}.discontinue_on IS NULL or #{Product.quoted_table_name}.discontinue_on >= ?", Time.zone.now)
195
191
  end
196
- search_scopes << :not_discontinued
192
+
197
193
  # Can't use add_search_scope for this as it needs a default argument
198
194
  def self.available(available_on = nil, currency = nil)
199
195
  available_on ||= Time.current
200
- not_discontinued.joins(master: :prices).where("#{Product.quoted_table_name}.available_on <= ?", available_on).uniq
196
+ not_discontinued.joins(master: :prices).where("#{Product.quoted_table_name}.available_on <= ?", available_on).distinct
201
197
  end
202
198
  search_scopes << :available
203
199
 
204
200
  def self.active(currency = nil)
205
- not_discontinued.available(nil, currency)
201
+ available(nil, currency)
206
202
  end
207
203
  search_scopes << :active
208
204
 
@@ -228,7 +224,7 @@ module Spree
228
224
  #
229
225
  # Don't allow sort_column, a variable coming from params,
230
226
  # to be anything but a column in the database
231
- if ActiveRecord::Base.connection.adapter_name == 'PostgreSQL' && !column_names.include?(sort_column)
227
+ if ApplicationRecord.connection.adapter_name == 'PostgreSQL' && !column_names.include?(sort_column)
232
228
  all
233
229
  else
234
230
  distinct
@@ -260,7 +256,7 @@ module Spree
260
256
  ids_or_records_or_names.flatten.map { |t|
261
257
  case t
262
258
  when Integer then Taxon.find_by(id: t)
263
- when ActiveRecord::Base then t
259
+ when ApplicationRecord then t
264
260
  when String
265
261
  Taxon.find_by(name: t) ||
266
262
  Taxon.where("#{taxons}.permalink LIKE ? OR #{taxons}.permalink = ?", "%/#{t}/", "#{t}/").first
@@ -21,6 +21,7 @@
21
21
  module Spree
22
22
  class Product < Spree::Base
23
23
  extend FriendlyId
24
+ include ActsAsTaggable
24
25
  friendly_id :slug_candidates, use: :history
25
26
 
26
27
  acts_as_paranoid
@@ -115,7 +116,6 @@ module Spree
115
116
 
116
117
  self.whitelisted_ransackable_associations = %w[stores variants_including_master master variants]
117
118
  self.whitelisted_ransackable_attributes = %w[description name slug discontinue_on]
118
- self.whitelisted_ransackable_scopes = %w[not_discontinued]
119
119
 
120
120
  # the master variant is not a member of the variants array
121
121
  def has_variants?
@@ -212,7 +212,7 @@ module Spree
212
212
  end
213
213
 
214
214
  def set_property(property_name, property_value, property_presentation = property_name)
215
- ActiveRecord::Base.transaction do
215
+ ApplicationRecord.transaction do
216
216
  # Works around spree_i18n #301
217
217
  property = Property.create_with(presentation: property_presentation).find_or_create_by(name: property_name)
218
218
  product_property = ProductProperty.where(product: self, property: property).first_or_initialize
@@ -236,6 +236,14 @@ module Spree
236
236
  super || variants_including_master.with_deleted.find_by(is_master: true)
237
237
  end
238
238
 
239
+ def brand
240
+ taxons.joins(:taxonomy).find_by(spree_taxonomies: { name: Spree.t(:taxonomy_brands_name) })
241
+ end
242
+
243
+ def category
244
+ taxons.joins(:taxonomy).find_by(spree_taxonomies: { name: Spree.t(:taxonomy_categories_name) })
245
+ end
246
+
239
247
  private
240
248
 
241
249
  def add_associations_from_prototype
@@ -269,7 +277,7 @@ module Spree
269
277
  price: master.price
270
278
  )
271
279
  end
272
- save
280
+ throw(:abort) unless save
273
281
  end
274
282
 
275
283
  def ensure_master
@@ -5,7 +5,7 @@ module Spree
5
5
  has_many :promotion_action_line_items, foreign_key: :promotion_action_id
6
6
  accepts_nested_attributes_for :promotion_action_line_items
7
7
 
8
- delegate :eligible?, :to => :promotion
8
+ delegate :eligible?, to: :promotion
9
9
 
10
10
  # Adds a line item to the Order if the promotion is eligible
11
11
  #
@@ -37,7 +37,7 @@ module Spree
37
37
  # needs to be manually removed from the order by the customer
38
38
  def perform(options = {})
39
39
  order = options[:order]
40
- return unless self.eligible? order
40
+ return unless eligible? order
41
41
 
42
42
  action_taken = false
43
43
  promotion_action_line_items.each do |item|
@@ -50,12 +50,30 @@ module Spree
50
50
  action_taken
51
51
  end
52
52
 
53
+ # Called by promotion handler when a promotion is removed
54
+ # This will find any line item matching the ones defined in the PromotionAction
55
+ # and remove the same quantity as was added by the PromotionAction.
56
+ # Should help to prevent some of cases listed above the #perform method
57
+ def revert(options = {})
58
+ order = options[:order]
59
+ return if eligible?(order)
60
+
61
+ action_taken = false
62
+ promotion_action_line_items.each do |item|
63
+ line_item = order.find_line_item_by_variant(item.variant)
64
+ next unless line_item.present?
65
+ order.contents.remove(item.variant, (item.quantity || 1))
66
+ action_taken = true
67
+ end
68
+
69
+ action_taken
70
+ end
71
+
53
72
  # Checks that there's enough stock to add the line item to the order
54
73
  def item_available?(item)
55
74
  quantifier = Spree::Stock::Quantifier.new(item.variant)
56
75
  quantifier.can_supply? item.quantity
57
76
  end
58
-
59
77
  end
60
78
  end
61
79
  end
@@ -0,0 +1,23 @@
1
+ # A rule to limit a promotion based on shipment country.
2
+ module Spree
3
+ class Promotion
4
+ module Rules
5
+ class Country < PromotionRule
6
+ preference :country_id, :integer
7
+
8
+ def applicable?(promotable)
9
+ promotable.is_a?(Spree::Order)
10
+ end
11
+
12
+ def eligible?(order, options = {})
13
+ country_id = options[:country_id] || order.ship_address.try(:country_id)
14
+ unless country_id.eql?(preferred_country_id || Spree::Country.default)
15
+ eligibility_errors.add(:base, eligibility_error_message(:wrong_country))
16
+ end
17
+
18
+ eligibility_errors.empty?
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -1,7 +1,20 @@
1
1
  module Spree
2
2
  class Promotion
3
3
  module Rules
4
+ module OptionValueWithNumerificationSupport
5
+ def preferred_eligible_values
6
+ values = super || {}
7
+ Hash[values.keys.map(&:to_i).zip(
8
+ values.values.map do |v|
9
+ (v.is_a?(Array) ? v : v.split(",")).map(&:to_i)
10
+ end
11
+ )]
12
+ end
13
+ end
14
+
4
15
  class OptionValue < PromotionRule
16
+ prepend OptionValueWithNumerificationSupport
17
+
5
18
  MATCH_POLICIES = %w(any)
6
19
  preference :match_policy, :string, default: MATCH_POLICIES.first
7
20
  preference :eligible_values, :hash
@@ -24,16 +37,6 @@ module Spree
24
37
  product_ids.include?(pid) && (value_ids(pid) - ovids).empty?
25
38
  end
26
39
 
27
- def preferred_eligible_values_with_numerification
28
- values = preferred_eligible_values_without_numerification || {}
29
- Hash[values.keys.map(&:to_i).zip(
30
- values.values.map do |v|
31
- (v.is_a?(Array) ? v : v.split(",")).map(&:to_i)
32
- end
33
- )]
34
- end
35
- alias_method_chain :preferred_eligible_values, :numerification
36
-
37
40
  private
38
41
 
39
42
  def product_ids
@@ -44,7 +44,7 @@ module Spree
44
44
 
45
45
  # All taxons in an order
46
46
  def order_taxons(order)
47
- Spree::Taxon.joins(products: {variants_including_master: :line_items}).where(spree_line_items: {order_id: order.id}).uniq
47
+ Spree::Taxon.joins(products: {variants_including_master: :line_items}).where(spree_line_items: {order_id: order.id}).distinct
48
48
  end
49
49
 
50
50
  # ids of taxons rules and taxons rules children
@@ -24,13 +24,14 @@ module Spree
24
24
  validates :path, uniqueness: { allow_blank: true }
25
25
  validates :usage_limit, numericality: { greater_than: 0, allow_nil: true }
26
26
  validates :description, length: { maximum: 255 }, allow_blank: true
27
+ validate :expires_at_must_be_later_than_starts_at, if: -> { starts_at && expires_at }
27
28
 
28
29
  before_save :normalize_blank_values
29
30
 
30
31
  scope :coupons, -> { where.not(code: nil) }
31
32
  scope :advertised, -> { where(advertise: true) }
32
33
  scope :applied, lambda {
33
- joins(<<-SQL).uniq
34
+ joins(<<-SQL).distinct
34
35
  INNER JOIN spree_order_promotions
35
36
  ON spree_order_promotions.promotion_id = #{table_name}.id
36
37
  SQL
@@ -82,6 +83,33 @@ module Spree
82
83
  action_taken
83
84
  end
84
85
 
86
+ # Called when a promotion is removed from the cart
87
+ def deactivate(payload)
88
+ order = payload[:order]
89
+ return unless self.class.order_activatable?(order)
90
+
91
+ payload[:promotion] = self
92
+
93
+ # Track results from actions to see if any action has been taken.
94
+ # Actions should return nil/false if no action has been taken.
95
+ # If an action returns true, then an action has been taken.
96
+ results = actions.map do |action|
97
+ action.revert(payload) if action.respond_to?(:revert)
98
+ end
99
+
100
+ # If an action has been taken, report back to whatever `d this promotion.
101
+ action_taken = results.include?(true)
102
+
103
+ if action_taken
104
+ # connect to the order
105
+ # create the join_table entry.
106
+ orders << order
107
+ save
108
+ end
109
+
110
+ action_taken
111
+ end
112
+
85
113
  # called anytime order.update_with_updater! happens
86
114
  def eligible?(promotable)
87
115
  return false if expired? || usage_limit_exceeded?(promotable) || blacklisted?(promotable)
@@ -194,5 +222,11 @@ module Spree
194
222
  def match_all?
195
223
  match_policy == 'all'
196
224
  end
225
+
226
+ def expires_at_must_be_later_than_starts_at
227
+ if expires_at < starts_at
228
+ errors.add(:expires_at, :invalid_date_range)
229
+ end
230
+ end
197
231
  end
198
232
  end
@@ -24,6 +24,8 @@ module Spree
24
24
  promotions.each do |promotion|
25
25
  if (line_item && promotion.eligible?(line_item)) || promotion.eligible?(order)
26
26
  promotion.activate(line_item: line_item, order: order)
27
+ else
28
+ promotion.deactivate(line_item: line_item, order: order)
27
29
  end
28
30
  end
29
31
  end
@@ -31,23 +33,7 @@ module Spree
31
33
  private
32
34
 
33
35
  def promotions
34
- # AR cannot bind raw ASTs to prepared statements. There always must be a manager around.
35
- # Also Postgresql requires an aliased table for `SELECT * FROM (subexpression) AS alias`.
36
- # And Sqlite3 cannot work on outher parenthesis from `(left UNION right)`.
37
- # So this construct makes both happy.
38
- select = Arel::SelectManager.new(
39
- Promotion,
40
- Promotion.arel_table.create_table_alias(
41
- order.promotions.active.union(Promotion.active.where(code: nil, path: nil)),
42
- Promotion.table_name
43
- ),
44
- )
45
- select.project(Arel.star)
46
-
47
- Promotion.find_by_sql(
48
- select,
49
- order.promotions.bind_values
50
- )
36
+ Promotion.find_by_sql("#{order.promotions.active.to_sql} UNION #{Promotion.active.where(code: nil, path: nil).to_sql}")
51
37
  end
52
38
  end
53
39
  end