spree_core 3.0.9 → 3.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (627) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/{spree.js.coffee.erb → spree.js.coffee} +13 -4
  3. data/app/helpers/spree/base_helper.rb +5 -2
  4. data/app/helpers/spree/products_helper.rb +37 -12
  5. data/app/mailers/spree/base_mailer.rb +11 -2
  6. data/app/mailers/spree/reimbursement_mailer.rb +6 -6
  7. data/app/models/concerns/spree/acts_as_taggable.rb +11 -0
  8. data/app/models/concerns/spree/adjustment_source.rb +3 -10
  9. data/app/models/concerns/spree/default_price.rb +7 -1
  10. data/app/models/concerns/spree/named_type.rb +1 -1
  11. data/app/models/concerns/spree/ransackable_attributes.rb +6 -1
  12. data/app/models/concerns/spree/user_api_authentication.rb +7 -1
  13. data/app/models/concerns/spree/user_methods.rb +57 -0
  14. data/app/models/concerns/spree/user_reporting.rb +2 -2
  15. data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
  16. data/app/models/spree/ability.rb +9 -1
  17. data/app/models/spree/address.rb +75 -45
  18. data/app/models/spree/adjustable/adjuster/base.rb +25 -0
  19. data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
  20. data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
  21. data/app/models/spree/adjustable/adjustments_updater.rb +22 -45
  22. data/app/models/spree/adjustment.rb +8 -10
  23. data/app/models/spree/app_configuration.rb +14 -8
  24. data/app/models/spree/base.rb +5 -1
  25. data/app/models/spree/calculator/default_tax.rb +2 -10
  26. data/app/models/spree/calculator/free_shipping.rb +6 -5
  27. data/app/models/spree/calculator.rb +1 -6
  28. data/app/models/spree/classification.rb +7 -3
  29. data/app/models/spree/country.rb +15 -3
  30. data/app/models/spree/credit_card.rb +37 -38
  31. data/app/models/spree/customer_return.rb +7 -15
  32. data/app/models/spree/gateway/bogus.rb +12 -12
  33. data/app/models/spree/gateway/bogus_simple.rb +4 -4
  34. data/app/models/spree/gateway.rb +8 -7
  35. data/app/models/spree/image.rb +3 -3
  36. data/app/models/spree/inventory_unit.rb +13 -14
  37. data/app/models/spree/legacy_user.rb +1 -14
  38. data/app/models/spree/line_item.rb +79 -67
  39. data/app/models/spree/log_entry.rb +1 -4
  40. data/app/models/spree/option_type.rb +15 -6
  41. data/app/models/spree/option_type_prototype.rb +9 -0
  42. data/app/models/spree/option_value.rb +11 -3
  43. data/app/models/spree/option_value_variant.rb +6 -0
  44. data/app/models/spree/order/checkout.rb +10 -13
  45. data/app/models/spree/order/currency_updater.rb +1 -1
  46. data/app/models/spree/order/store_credit.rb +96 -0
  47. data/app/models/spree/order.rb +105 -68
  48. data/app/models/spree/order_contents.rb +13 -7
  49. data/app/models/spree/order_inventory.rb +16 -9
  50. data/app/models/spree/order_promotion.rb +6 -0
  51. data/app/models/spree/order_updater.rb +4 -8
  52. data/app/models/spree/payment/gateway_options.rb +8 -4
  53. data/app/models/spree/payment/processing.rb +1 -1
  54. data/app/models/spree/payment.rb +55 -29
  55. data/app/models/spree/payment_method/store_credit.rb +130 -0
  56. data/app/models/spree/payment_method.rb +18 -13
  57. data/app/models/spree/preference.rb +1 -1
  58. data/app/models/spree/preferences/store.rb +2 -2
  59. data/app/models/spree/price.rb +16 -6
  60. data/app/models/spree/product/scopes.rb +22 -13
  61. data/app/models/spree/product.rb +83 -52
  62. data/app/models/spree/product_option_type.rb +7 -2
  63. data/app/models/spree/product_promotion_rule.rb +9 -0
  64. data/app/models/spree/product_property.rb +9 -10
  65. data/app/models/spree/promotion/actions/create_adjustment.rb +1 -1
  66. data/app/models/spree/promotion/actions/create_line_items.rb +21 -3
  67. data/app/models/spree/promotion/rules/country.rb +23 -0
  68. data/app/models/spree/promotion/rules/option_value.rb +13 -10
  69. data/app/models/spree/promotion/rules/product.rb +3 -1
  70. data/app/models/spree/promotion/rules/taxon.rb +3 -2
  71. data/app/models/spree/promotion/rules/user.rb +4 -4
  72. data/app/models/spree/promotion.rb +55 -19
  73. data/app/models/spree/promotion_action.rb +3 -3
  74. data/app/models/spree/promotion_category.rb +1 -1
  75. data/app/models/spree/promotion_handler/cart.rb +3 -17
  76. data/app/models/spree/promotion_handler/coupon.rb +22 -22
  77. data/app/models/spree/promotion_handler/page.rb +2 -2
  78. data/app/models/spree/promotion_rule_taxon.rb +9 -0
  79. data/app/models/spree/promotion_rule_user.rb +9 -0
  80. data/app/models/spree/property.rb +2 -1
  81. data/app/models/spree/property_prototype.rb +9 -0
  82. data/app/models/spree/prototype.rb +8 -3
  83. data/app/models/spree/prototype_taxon.rb +9 -0
  84. data/app/models/spree/refund.rb +10 -7
  85. data/app/models/spree/refund_reason.rb +2 -2
  86. data/app/models/spree/reimbursement.rb +12 -16
  87. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +23 -6
  88. data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
  89. data/app/models/spree/reimbursement_type.rb +5 -1
  90. data/app/models/spree/return_authorization.rb +8 -13
  91. data/app/models/spree/return_authorization_reason.rb +1 -1
  92. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
  93. data/app/models/spree/return_item.rb +14 -13
  94. data/app/models/spree/role.rb +3 -2
  95. data/app/models/spree/role_user.rb +6 -0
  96. data/app/models/spree/shipment.rb +23 -30
  97. data/app/models/spree/shipment_handler.rb +2 -2
  98. data/app/models/spree/shipping_category.rb +6 -3
  99. data/app/models/spree/shipping_method.rb +12 -11
  100. data/app/models/spree/shipping_method_zone.rb +6 -0
  101. data/app/models/spree/shipping_rate.rb +16 -29
  102. data/app/models/spree/state.rb +3 -2
  103. data/app/models/spree/state_change.rb +1 -1
  104. data/app/models/spree/stock/adjuster.rb +9 -2
  105. data/app/models/spree/stock/content_item.rb +10 -12
  106. data/app/models/spree/stock/coordinator.rb +21 -15
  107. data/app/models/spree/stock/estimator.rb +28 -30
  108. data/app/models/spree/stock/inventory_unit_builder.rb +2 -10
  109. data/app/models/spree/stock/package.rb +11 -3
  110. data/app/models/spree/stock/packer.rb +16 -6
  111. data/app/models/spree/stock/prioritizer.rb +25 -15
  112. data/app/models/spree/stock/quantifier.rb +5 -5
  113. data/app/models/spree/stock/splitter/backordered.rb +2 -2
  114. data/app/models/spree/stock/splitter/shipping_category.rb +6 -1
  115. data/app/models/spree/stock_item.rb +15 -18
  116. data/app/models/spree/stock_location.rb +4 -7
  117. data/app/models/spree/stock_movement.rb +16 -9
  118. data/app/models/spree/stock_transfer.rb +11 -12
  119. data/app/models/spree/store.rb +15 -6
  120. data/app/models/spree/store_credit.rb +252 -0
  121. data/app/models/spree/store_credit_category.rb +22 -0
  122. data/app/models/spree/store_credit_event.rb +38 -0
  123. data/app/models/spree/store_credit_type.rb +6 -0
  124. data/app/models/spree/tag.rb +4 -0
  125. data/app/models/spree/tax_category.rb +3 -8
  126. data/app/models/spree/tax_rate.rb +61 -121
  127. data/app/models/spree/taxon.rb +12 -6
  128. data/app/models/spree/tracker.rb +12 -1
  129. data/app/models/spree/validations/db_maximum_length_validator.rb +2 -1
  130. data/app/models/spree/variant.rb +94 -49
  131. data/app/models/spree/zone.rb +23 -19
  132. data/app/models/spree/zone_member.rb +6 -0
  133. data/app/validators/db_maximum_length_validator.rb +11 -0
  134. data/app/views/layouts/spree/base_mailer.html.erb +38 -781
  135. data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
  136. data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
  137. data/app/views/spree/order_mailer/_total.html.erb +8 -0
  138. data/app/views/spree/order_mailer/cancel_email.html.erb +13 -28
  139. data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
  140. data/app/views/spree/order_mailer/confirm_email.html.erb +49 -63
  141. data/app/views/spree/order_mailer/confirm_email.text.erb +1 -1
  142. data/app/views/spree/shared/_base_mailer_header.html.erb +5 -7
  143. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
  144. data/app/views/spree/shared/_error_messages.html.erb +1 -1
  145. data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
  146. data/app/views/spree/shared/_paths.html.erb +8 -0
  147. data/app/views/spree/shipment_mailer/shipped_email.html.erb +21 -14
  148. data/app/views/spree/shipment_mailer/shipped_email.text.erb +3 -3
  149. data/config/initializers/acts_as_taggable_on.rb +9 -0
  150. data/config/initializers/friendly_id.rb +0 -81
  151. data/config/initializers/user_class_extensions.rb +7 -38
  152. data/config/locales/en.yml +137 -12
  153. data/config/routes.rb +7 -0
  154. data/db/default/spree/countries.rb +5 -1
  155. data/db/default/spree/default_reimbursement_type.rb +1 -1
  156. data/db/default/spree/roles.rb +2 -2
  157. data/db/default/spree/states.rb +1 -1
  158. data/db/default/spree/zones.rb +4 -5
  159. data/db/migrate/20120831092320_spree_one_two.rb +101 -101
  160. data/db/migrate/20120831092359_spree_promo_one_two.rb +14 -14
  161. data/db/migrate/20120905145253_add_tax_rate_label.rb +1 -1
  162. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +2 -2
  163. data/db/migrate/20120929093553_remove_unused_preference_columns.rb +4 -4
  164. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +2 -2
  165. data/db/migrate/20121010142909_add_states_required_to_countries.rb +2 -2
  166. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +3 -3
  167. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +5 -5
  168. data/db/migrate/20121031162139_split_prices_from_variants.rb +10 -10
  169. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +3 -3
  170. data/db/migrate/20121107184631_add_currency_to_line_items.rb +1 -1
  171. data/db/migrate/20121107194006_add_currency_to_orders.rb +1 -1
  172. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +2 -2
  173. data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +1 -1
  174. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +2 -2
  175. data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +1 -1
  176. data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +1 -1
  177. data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +1 -1
  178. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +2 -2
  179. data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +1 -1
  180. data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +1 -1
  181. data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +1 -1
  182. data/db/migrate/20130211190146_create_spree_stock_items.rb +2 -2
  183. data/db/migrate/20130211191120_create_spree_stock_locations.rb +1 -1
  184. data/db/migrate/20130213191427_create_default_stock.rb +1 -2
  185. data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +1 -1
  186. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +2 -2
  187. data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +1 -1
  188. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +3 -3
  189. data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +1 -1
  190. data/db/migrate/20130228210442_create_shipping_method_zone.rb +3 -3
  191. data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +1 -1
  192. data/db/migrate/20130301162924_create_shipping_method_categories.rb +3 -3
  193. data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +1 -1
  194. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +5 -5
  195. data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +1 -1
  196. data/db/migrate/20130305143310_create_stock_movements.rb +1 -1
  197. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +3 -3
  198. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +2 -2
  199. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +2 -2
  200. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +2 -2
  201. data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +1 -1
  202. data/db/migrate/20130319062004_change_orders_total_precision.rb +5 -5
  203. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +2 -2
  204. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -2
  205. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +2 -2
  206. data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +1 -1
  207. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +3 -3
  208. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +3 -3
  209. data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
  210. data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +1 -1
  211. data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +1 -1
  212. data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +1 -1
  213. data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +1 -1
  214. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +2 -2
  215. data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +1 -1
  216. data/db/migrate/20130417120035_update_adjustment_states.rb +3 -3
  217. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +4 -4
  218. data/db/migrate/20130418125341_create_spree_stock_transfers.rb +1 -1
  219. data/db/migrate/20130423110707_drop_products_count_on_hand.rb +1 -1
  220. data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +1 -1
  221. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
  222. data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +1 -1
  223. data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +1 -1
  224. data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +1 -1
  225. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +1 -1
  226. data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +1 -1
  227. data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +1 -1
  228. data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +1 -1
  229. data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +1 -1
  230. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +2 -2
  231. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +4 -4
  232. data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +1 -1
  233. data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +1 -1
  234. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +2 -2
  235. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +3 -3
  236. data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +1 -1
  237. data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +1 -1
  238. data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +1 -1
  239. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +1 -1
  240. data/db/migrate/20130806022521_drop_spree_mail_methods.rb +1 -1
  241. data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +1 -1
  242. data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -4
  243. data/db/migrate/20130807024302_rename_adjustment_fields.rb +1 -1
  244. data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +1 -1
  245. data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +1 -1
  246. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +2 -2
  247. data/db/migrate/20130813140619_expand_order_number_size.rb +3 -3
  248. data/db/migrate/20130813232134_rename_activators_to_promotions.rb +1 -1
  249. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +2 -2
  250. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +2 -2
  251. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
  252. data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +2 -2
  253. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +2 -2
  254. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
  255. data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +1 -1
  256. data/db/migrate/20130909115621_change_states_required_for_countries.rb +1 -1
  257. data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +1 -1
  258. data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +2 -2
  259. data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +1 -1
  260. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +2 -2
  261. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +2 -2
  262. data/db/migrate/20131107132123_add_tax_category_to_variants.rb +1 -1
  263. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +1 -1
  264. data/db/migrate/20131118043959_add_included_to_adjustments.rb +2 -2
  265. data/db/migrate/20131118050234_rename_tax_total_fields.rb +1 -1
  266. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +1 -1
  267. data/db/migrate/20131120234456_add_updated_at_to_variants.rb +1 -1
  268. data/db/migrate/20131127001002_add_position_to_classifications.rb +1 -1
  269. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +2 -2
  270. data/db/migrate/20131211192741_unique_shipping_method_categories.rb +1 -1
  271. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +2 -2
  272. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -1
  273. data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +1 -1
  274. data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +1 -1
  275. data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +1 -1
  276. data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +1 -1
  277. data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +1 -1
  278. data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +1 -1
  279. data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +1 -1
  280. data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +1 -1
  281. data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +1 -1
  282. data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +1 -1
  283. data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +1 -1
  284. data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +1 -1
  285. data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +1 -1
  286. data/db/migrate/20140213184916_add_more_indexes.rb +1 -1
  287. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +2 -2
  288. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +1 -1
  289. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +1 -1
  290. data/db/migrate/20140309023735_migrate_old_preferences.rb +1 -1
  291. data/db/migrate/20140309024355_create_spree_stores.rb +2 -2
  292. data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
  293. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +1 -1
  294. data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +1 -1
  295. data/db/migrate/20140331100557_add_additional_store_fields.rb +1 -1
  296. data/db/migrate/20140410141842_add_many_missing_indexes.rb +1 -1
  297. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +1 -1
  298. data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +1 -1
  299. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +5 -5
  300. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +1 -1
  301. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +2 -2
  302. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +1 -1
  303. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +1 -1
  304. data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +1 -1
  305. data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +1 -1
  306. data/db/migrate/20140625214618_create_spree_refunds.rb +1 -1
  307. data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +1 -1
  308. data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +1 -1
  309. data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +1 -1
  310. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +2 -2
  311. data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +1 -1
  312. data/db/migrate/20140710190048_drop_return_authorization_amount.rb +1 -1
  313. data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +1 -1
  314. data/db/migrate/20140713140527_create_spree_refund_reasons.rb +1 -1
  315. data/db/migrate/20140713142214_rename_return_authorization_reason.rb +1 -1
  316. data/db/migrate/20140715182625_create_spree_promotion_categories.rb +1 -1
  317. data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +1 -1
  318. data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +1 -1
  319. data/db/migrate/20140717155155_create_default_refund_reason.rb +1 -1
  320. data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +1 -1
  321. data/db/migrate/20140718133010_create_spree_customer_returns.rb +1 -1
  322. data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +1 -1
  323. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +5 -5
  324. data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +1 -1
  325. data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +1 -1
  326. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +2 -2
  327. data/db/migrate/20140725131539_create_spree_reimbursements.rb +1 -1
  328. data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +1 -1
  329. data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +1 -1
  330. data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +1 -1
  331. data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +1 -1
  332. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +1 -1
  333. data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +1 -1
  334. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -1
  335. data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +1 -1
  336. data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +1 -1
  337. data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +1 -1
  338. data/db/migrate/20140911173301_add_kind_to_zone.rb +1 -1
  339. data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +1 -1
  340. data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +1 -1
  341. data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +1 -1
  342. data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +1 -1
  343. data/db/migrate/20141009204607_add_store_id_to_orders.rb +1 -1
  344. data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +1 -1
  345. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +1 -1
  346. data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +2 -7
  347. data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +1 -1
  348. data/db/migrate/20141105213646_update_classifications_positions.rb +1 -1
  349. data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +1 -1
  350. data/db/migrate/20141215232040_remove_token_permissions_table.rb +1 -1
  351. data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +1 -1
  352. data/db/migrate/20141217215630_update_product_slug_index.rb +1 -1
  353. data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +1 -1
  354. data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
  355. data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
  356. data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
  357. data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
  358. data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +1 -1
  359. data/db/migrate/20150122145607_add_resellable_to_return_items.rb +1 -1
  360. data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +1 -1
  361. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +1 -1
  362. data/db/migrate/20150128060325_remove_spree_configurations.rb +1 -1
  363. data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +1 -1
  364. data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +1 -1
  365. data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +67 -0
  366. data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
  367. data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
  368. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +1 -1
  369. data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
  370. data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +1 -1
  371. data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +1 -1
  372. data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
  373. data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
  374. data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +1 -1
  375. data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
  376. data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
  377. data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
  378. data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
  379. data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
  380. data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
  381. data/db/migrate/20160219165458_add_indexes.rb +14 -0
  382. data/db/migrate/20160509064646_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +10 -0
  383. data/db/migrate/20160511071954_acts_as_taggable_on_spree_migration.rb +40 -0
  384. data/db/migrate/20160511072249_change_collation_for_spree_tag_names.rb +9 -0
  385. data/db/migrate/20160511072335_add_missing_indexes_to_spree_taggings.rb +14 -0
  386. data/db/migrate/20160608090604_add_zipcode_required_to_spree_countries.rb +7 -0
  387. data/db/migrate/20161014145148_add_created_at_to_variant.rb +8 -0
  388. data/db/migrate/20161014152814_add_null_false_to_spree_variants_timestamps.rb +6 -0
  389. data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
  390. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +3 -3
  391. data/lib/generators/spree/custom_user/templates/migration.rb.tt +2 -2
  392. data/lib/generators/spree/dummy/dummy_generator.rb +11 -11
  393. data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
  394. data/lib/generators/spree/dummy/templates/rails/database.yml +38 -28
  395. data/lib/generators/spree/dummy/templates/rails/test.rb +4 -3
  396. data/lib/generators/spree/install/install_generator.rb +37 -13
  397. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  398. data/lib/spree/core/controller_helpers/common.rb +6 -6
  399. data/lib/spree/core/controller_helpers/order.rb +9 -10
  400. data/lib/spree/core/controller_helpers/respond_with.rb +1 -1
  401. data/lib/spree/core/controller_helpers/search.rb +1 -1
  402. data/lib/spree/core/controller_helpers/store.rb +29 -0
  403. data/lib/spree/core/delegate_belongs_to.rb +4 -4
  404. data/lib/spree/core/engine.rb +39 -20
  405. data/lib/spree/core/environment.rb +1 -1
  406. data/lib/spree/core/importer/order.rb +37 -40
  407. data/lib/spree/core/importer/product.rb +2 -2
  408. data/lib/spree/core/number_generator.rb +52 -0
  409. data/lib/spree/core/product_duplicator.rb +1 -1
  410. data/lib/spree/core/product_filters.rb +2 -2
  411. data/lib/spree/core/search/base.rb +4 -3
  412. data/lib/spree/core/version.rb +1 -1
  413. data/lib/spree/core.rb +16 -0
  414. data/lib/spree/i18n/initializer.rb +1 -1
  415. data/lib/spree/localized_number.rb +3 -1
  416. data/lib/spree/permitted_attributes.rb +6 -3
  417. data/lib/spree/testing_support/caching.rb +3 -3
  418. data/lib/spree/testing_support/common_rake.rb +3 -3
  419. data/lib/spree/testing_support/controller_requests.rb +4 -4
  420. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  421. data/lib/spree/testing_support/factories/country_factory.rb +2 -2
  422. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
  423. data/lib/spree/testing_support/factories/order_factory.rb +3 -2
  424. data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
  425. data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -0
  426. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
  427. data/lib/spree/testing_support/factories/refund_factory.rb +9 -1
  428. data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -0
  429. data/lib/spree/testing_support/factories/state_factory.rb +2 -2
  430. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
  431. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
  432. data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
  433. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
  434. data/lib/spree/testing_support/factories/tag_factory.rb +5 -0
  435. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  436. data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
  437. data/lib/spree/testing_support/factories.rb +3 -3
  438. data/lib/spree/testing_support/kernel.rb +18 -0
  439. data/lib/spree/testing_support/microdata.rb +189 -0
  440. data/lib/spree/testing_support/order_walkthrough.rb +4 -4
  441. data/lib/tasks/core.rake +69 -1
  442. data/lib/tasks/exchanges.rake +2 -2
  443. data/spec/fixtures/microdata.html +22 -0
  444. data/spec/fixtures/microdata_itemref.html +15 -0
  445. data/spec/fixtures/microdata_no_itemscope.html +20 -0
  446. data/spec/helpers/base_helper_spec.rb +74 -11
  447. data/spec/helpers/products_helper_spec.rb +80 -15
  448. data/spec/lib/i18n_spec.rb +13 -13
  449. data/spec/lib/search/base_spec.rb +18 -18
  450. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +6 -4
  451. data/spec/lib/spree/core/controller_helpers/order_spec.rb +15 -0
  452. data/spec/lib/spree/core/controller_helpers/store_spec.rb +56 -0
  453. data/spec/lib/spree/core/importer/order_spec.rb +227 -124
  454. data/spec/lib/spree/core/number_generator_spec.rb +175 -0
  455. data/spec/lib/spree/core_spec.rb +23 -0
  456. data/spec/lib/spree/localized_number_spec.rb +11 -1
  457. data/spec/lib/spree/money_spec.rb +6 -6
  458. data/spec/mailers/order_mailer_spec.rb +11 -13
  459. data/spec/mailers/reimbursement_mailer_spec.rb +2 -2
  460. data/spec/mailers/shipment_mailer_spec.rb +26 -8
  461. data/spec/mailers/test_mailer_spec.rb +16 -2
  462. data/spec/models/option_type_prototype_spec.rb +9 -0
  463. data/spec/models/spree/ability_spec.rb +20 -15
  464. data/spec/models/spree/address_spec.rb +144 -33
  465. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  466. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  467. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  468. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +2 -262
  469. data/spec/models/spree/adjustment_spec.rb +28 -2
  470. data/spec/models/spree/app_configuration_spec.rb +6 -3
  471. data/spec/models/spree/asset_spec.rb +9 -6
  472. data/spec/models/spree/calculator/default_tax_spec.rb +39 -14
  473. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +1 -1
  474. data/spec/models/spree/calculator/flexi_rate_spec.rb +6 -6
  475. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +1 -1
  476. data/spec/models/spree/calculator/price_sack_spec.rb +2 -2
  477. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +4 -8
  478. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +4 -4
  479. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +2 -2
  480. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +6 -6
  481. data/spec/models/spree/calculator/shipping/per_item_spec.rb +2 -2
  482. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +1 -1
  483. data/spec/models/spree/calculator/tiered_percent_spec.rb +1 -1
  484. data/spec/models/spree/calculator_spec.rb +3 -3
  485. data/spec/models/spree/classification_spec.rb +1 -1
  486. data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
  487. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  488. data/spec/models/spree/country_spec.rb +45 -8
  489. data/spec/models/spree/credit_card_spec.rb +13 -9
  490. data/spec/models/spree/customer_return_spec.rb +4 -26
  491. data/spec/models/spree/exchange_spec.rb +1 -1
  492. data/spec/models/spree/gateway/bogus_simple.rb +1 -1
  493. data/spec/models/spree/gateway/bogus_spec.rb +1 -1
  494. data/spec/models/spree/gateway_spec.rb +8 -1
  495. data/spec/models/spree/image_spec.rb +4 -1
  496. data/spec/models/spree/inventory_unit_spec.rb +35 -21
  497. data/spec/models/spree/line_item_spec.rb +100 -21
  498. data/spec/models/spree/option_type_spec.rb +3 -3
  499. data/spec/models/spree/option_value_spec.rb +8 -3
  500. data/spec/models/spree/order/address_spec.rb +1 -1
  501. data/spec/models/spree/order/adjustments_spec.rb +1 -1
  502. data/spec/models/spree/order/callbacks_spec.rb +3 -3
  503. data/spec/models/spree/order/checkout_spec.rb +99 -93
  504. data/spec/models/spree/order/currency_updater_spec.rb +4 -4
  505. data/spec/models/spree/order/finalizing_spec.rb +5 -8
  506. data/spec/models/spree/order/helpers_spec.rb +1 -1
  507. data/spec/models/spree/order/payment_spec.rb +21 -21
  508. data/spec/models/spree/order/risk_assessment_spec.rb +1 -1
  509. data/spec/models/spree/order/state_machine_spec.rb +4 -8
  510. data/spec/models/spree/order/store_credit_spec.rb +426 -0
  511. data/spec/models/spree/order/tax_spec.rb +13 -13
  512. data/spec/models/spree/order/totals_spec.rb +2 -2
  513. data/spec/models/spree/order/updating_spec.rb +4 -4
  514. data/spec/models/spree/order/validations_spec.rb +2 -2
  515. data/spec/models/spree/order_contents_spec.rb +45 -4
  516. data/spec/models/spree/order_inventory_spec.rb +28 -17
  517. data/spec/models/spree/order_merger_spec.rb +3 -1
  518. data/spec/models/spree/order_spec.rb +188 -96
  519. data/spec/models/spree/order_updater_spec.rb +43 -32
  520. data/spec/models/spree/payment/gateway_options_spec.rb +10 -2
  521. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  522. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  523. data/spec/models/spree/payment_method_spec.rb +22 -14
  524. data/spec/models/spree/payment_spec.rb +75 -82
  525. data/spec/models/spree/preference_spec.rb +1 -1
  526. data/spec/models/spree/preferences/configuration_spec.rb +2 -2
  527. data/spec/models/spree/preferences/preferable_spec.rb +15 -19
  528. data/spec/models/spree/preferences/scoped_store_spec.rb +1 -1
  529. data/spec/models/spree/preferences/store_spec.rb +3 -3
  530. data/spec/models/spree/price_spec.rb +87 -1
  531. data/spec/models/spree/product/scopes_spec.rb +39 -4
  532. data/spec/models/spree/product_duplicator_spec.rb +2 -2
  533. data/spec/models/spree/product_filter_spec.rb +2 -2
  534. data/spec/models/spree/product_option_type_spec.rb +6 -2
  535. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  536. data/spec/models/spree/product_property_spec.rb +16 -1
  537. data/spec/models/spree/product_spec.rb +196 -41
  538. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +63 -0
  539. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +6 -6
  540. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +1 -1
  541. data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
  542. data/spec/models/spree/promotion/rules/first_order_spec.rb +11 -11
  543. data/spec/models/spree/promotion/rules/item_total_spec.rb +1 -1
  544. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +1 -1
  545. data/spec/models/spree/promotion/rules/product_spec.rb +8 -8
  546. data/spec/models/spree/promotion/rules/taxon_spec.rb +1 -1
  547. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +3 -3
  548. data/spec/models/spree/promotion/rules/user_spec.rb +15 -7
  549. data/spec/models/spree/promotion_action_spec.rb +2 -2
  550. data/spec/models/spree/promotion_category_spec.rb +1 -1
  551. data/spec/models/spree/promotion_handler/cart_spec.rb +1 -1
  552. data/spec/models/spree/promotion_handler/coupon_spec.rb +28 -28
  553. data/spec/models/spree/promotion_handler/page_spec.rb +6 -6
  554. data/spec/models/spree/promotion_rule_spec.rb +2 -2
  555. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  556. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  557. data/spec/models/spree/promotion_spec.rb +141 -65
  558. data/spec/models/spree/property_prototype_spec.rb +9 -0
  559. data/spec/models/spree/property_spec.rb +1 -1
  560. data/spec/models/spree/prototype_spec.rb +1 -1
  561. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  562. data/spec/models/spree/refund_reason_spec.rb +20 -0
  563. data/spec/models/spree/refund_spec.rb +1 -1
  564. data/spec/models/spree/reimbursement/credit_spec.rb +1 -1
  565. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +1 -1
  566. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +1 -1
  567. data/spec/models/spree/reimbursement_performer_spec.rb +1 -1
  568. data/spec/models/spree/reimbursement_spec.rb +3 -30
  569. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +18 -6
  570. data/spec/models/spree/reimbursement_type/credit_spec.rb +1 -1
  571. data/spec/models/spree/reimbursement_type/exchange_spec.rb +1 -1
  572. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
  573. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  574. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  575. data/spec/models/spree/return_authorization_spec.rb +3 -23
  576. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +1 -1
  577. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +1 -1
  578. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +1 -1
  579. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +1 -1
  580. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
  581. data/spec/models/spree/return_item_spec.rb +51 -2
  582. data/spec/models/spree/returns_calculator_spec.rb +2 -2
  583. data/spec/models/spree/role_spec.rb +7 -0
  584. data/spec/models/spree/shipment_spec.rb +24 -22
  585. data/spec/models/spree/shipping_calculator_spec.rb +5 -5
  586. data/spec/models/spree/shipping_category_spec.rb +15 -1
  587. data/spec/models/spree/shipping_method_spec.rb +11 -4
  588. data/spec/models/spree/shipping_rate_spec.rb +40 -41
  589. data/spec/models/spree/state_spec.rb +13 -2
  590. data/spec/models/spree/stock/availability_validator_spec.rb +1 -1
  591. data/spec/models/spree/stock/content_item_spec.rb +9 -0
  592. data/spec/models/spree/stock/coordinator_spec.rb +13 -3
  593. data/spec/models/spree/stock/differentiator_spec.rb +1 -1
  594. data/spec/models/spree/stock/estimator_spec.rb +60 -12
  595. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +1 -1
  596. data/spec/models/spree/stock/package_spec.rb +6 -18
  597. data/spec/models/spree/stock/packer_spec.rb +1 -1
  598. data/spec/models/spree/stock/prioritizer_spec.rb +7 -7
  599. data/spec/models/spree/stock/quantifier_spec.rb +61 -32
  600. data/spec/models/spree/stock/splitter/backordered_spec.rb +1 -1
  601. data/spec/models/spree/stock/splitter/base_spec.rb +1 -1
  602. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +3 -3
  603. data/spec/models/spree/stock_item_spec.rb +30 -8
  604. data/spec/models/spree/stock_location_spec.rb +5 -5
  605. data/spec/models/spree/stock_movement_spec.rb +101 -37
  606. data/spec/models/spree/stock_transfer_spec.rb +1 -1
  607. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  608. data/spec/models/spree/store_credit_spec.rb +786 -0
  609. data/spec/models/spree/store_spec.rb +40 -12
  610. data/spec/models/spree/tax_category_spec.rb +7 -2
  611. data/spec/models/spree/tax_rate_spec.rb +288 -109
  612. data/spec/models/spree/taxon_spec.rb +15 -4
  613. data/spec/models/spree/taxonomy_spec.rb +2 -2
  614. data/spec/models/spree/tracker_spec.rb +1 -1
  615. data/spec/models/spree/user_spec.rb +114 -41
  616. data/spec/models/spree/variant_spec.rb +310 -15
  617. data/spec/models/spree/zone_member_spec.rb +38 -0
  618. data/spec/models/spree/zone_spec.rb +38 -10
  619. data/spec/spec_helper.rb +5 -0
  620. data/spec/support/concerns/{adjustment_source_spec.rb → adjustment_source.rb} +0 -0
  621. data/spec/support/concerns/{default_price_spec.rb → default_price.rb} +9 -0
  622. data/spree_core.gemspec +12 -13
  623. data/vendor/assets/javascripts/jquery.payment.js +239 -84
  624. metadata +136 -65
  625. data/CHANGELOG.md +0 -4
  626. data/app/models/concerns/spree/number_generator.rb +0 -39
  627. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -24
@@ -0,0 +1,41 @@
1
+ module Spree
2
+ module Adjustable
3
+ module Adjuster
4
+ class Promotion < Spree::Adjustable::Adjuster::Base
5
+ def update
6
+ promo_adjustments = adjustments.competing_promos.reload.map { |a| a.update!(adjustable) }
7
+ promos_total = promo_adjustments.compact.sum
8
+ choose_best_promo_adjustment unless promos_total == 0
9
+ promo_total = best_promo_adjustment.try(:amount).to_f if best_promo_adjustment.try(:promotion?)
10
+
11
+ update_totals(promo_total)
12
+ end
13
+
14
+ private
15
+
16
+ # Picks one (and only one) competing discount to be eligible for
17
+ # this order. This adjustment provides the most discount, and if
18
+ # two adjustments have the same amount, then it will pick the
19
+ # latest one.
20
+ def choose_best_promo_adjustment
21
+ if best_promo_adjustment
22
+ other_promotions = adjustments.competing_promos.where.not(id: best_promo_adjustment.id)
23
+ other_promotions.update_all(eligible: false)
24
+ end
25
+ end
26
+
27
+ def best_promo_adjustment
28
+ @best_promo_adjustment ||= begin
29
+ adjustments.competing_promos.eligible.reorder("amount ASC, created_at DESC, id DESC").first
30
+ end
31
+ end
32
+
33
+ def update_totals(promo_total)
34
+ promo_total ||= 0.0
35
+ @totals[:promo_total] = promo_total
36
+ @totals[:taxable_adjustment_total] += promo_total
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -0,0 +1,26 @@
1
+ module Spree
2
+ module Adjustable
3
+ module Adjuster
4
+ class Tax < Spree::Adjustable::Adjuster::Base
5
+ def update
6
+ tax = adjustments.tax
7
+ included_tax_total = tax.is_included.reload.map(&:update!).compact.sum
8
+ additional_tax_total = tax.additional.reload.map(&:update!).compact.sum
9
+
10
+ update_totals(included_tax_total, additional_tax_total)
11
+ end
12
+
13
+ private
14
+
15
+ def adjustments
16
+ adjustable.try(:all_adjustments) || adjustable.adjustments
17
+ end
18
+
19
+ def update_totals(included_tax_total, additional_tax_total)
20
+ @totals[:included_tax_total] = included_tax_total
21
+ @totals[:additional_tax_total] = additional_tax_total
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -7,63 +7,40 @@ module Spree
7
7
 
8
8
  def initialize(adjustable)
9
9
  @adjustable = adjustable
10
- adjustable.reload if shipment? && persisted?
10
+ adjustable.reload if shipment? && adjustable.persisted?
11
11
  end
12
12
 
13
13
  def update
14
- return unless persisted?
15
- update_promo_adjustments
16
- update_tax_adjustments
17
- persist_totals
18
- end
19
-
20
- private
21
-
22
- attr_reader :adjustable
23
- delegate :adjustments, :persisted?, to: :adjustable
14
+ return unless @adjustable.persisted?
15
+
16
+ totals = {
17
+ non_taxable_adjustment_total: 0,
18
+ taxable_adjustment_total: 0
19
+ }
20
+ adjusters.each do |klass|
21
+ klass.adjust(@adjustable, totals)
22
+ end
24
23
 
25
- def update_promo_adjustments
26
- promo_adjustments = adjustments.competing_promos.reload.map { |a| a.update!(adjustable) }
27
- promos_total = promo_adjustments.compact.sum
28
- choose_best_promo_adjustment unless promos_total == 0
29
- @promo_total = best_promo_adjustment.try(:amount).to_f
24
+ persist_totals totals
30
25
  end
31
26
 
32
- def update_tax_adjustments
33
- tax = (adjustable.try(:all_adjustments) || adjustable.adjustments).tax
34
- @included_tax_total = tax.is_included.reload.map(&:update!).compact.sum
35
- @additional_tax_total = tax.additional.reload.map(&:update!).compact.sum
36
- end
27
+ private
37
28
 
38
- def persist_totals
39
- adjustable.update_columns(
40
- promo_total: @promo_total,
41
- included_tax_total: @included_tax_total,
42
- additional_tax_total: @additional_tax_total,
43
- adjustment_total: @promo_total + @additional_tax_total,
44
- updated_at: Time.now
45
- )
29
+ def persist_totals(totals)
30
+ attributes = totals
31
+ attributes[:adjustment_total] = totals[:non_taxable_adjustment_total] +
32
+ totals[:taxable_adjustment_total] +
33
+ totals[:additional_tax_total]
34
+ attributes[:updated_at] = Time.current
35
+ @adjustable.update_columns(totals)
46
36
  end
47
37
 
48
38
  def shipment?
49
- adjustable.is_a?(Shipment)
39
+ @adjustable.is_a?(Shipment)
50
40
  end
51
41
 
52
- # Picks one (and only one) competing discount to be eligible for
53
- # this order. This adjustment provides the most discount, and if
54
- # two adjustments have the same amount, then it will pick the
55
- # latest one.
56
- def choose_best_promo_adjustment
57
- if best_promo_adjustment
58
- other_promotions = adjustments.competing_promos.where.not(id: best_promo_adjustment.id)
59
- other_promotions.update_all(eligible: false)
60
- end
61
- end
62
-
63
- def best_promo_adjustment
64
- @best_promo_adjustment ||= begin
65
- adjustments.competing_promos.eligible.reorder("amount ASC, created_at DESC, id DESC").first
66
- end
42
+ def adjusters
43
+ Rails.application.config.spree.adjusters
67
44
  end
68
45
  end
69
46
  end
@@ -22,13 +22,13 @@
22
22
  # it might be reinstated.
23
23
  module Spree
24
24
  class Adjustment < Spree::Base
25
- belongs_to :adjustable, polymorphic: true, touch: true
26
- belongs_to :source, polymorphic: true
25
+ with_options polymorphic: true do
26
+ belongs_to :adjustable, touch: true
27
+ belongs_to :source
28
+ end
27
29
  belongs_to :order, class_name: 'Spree::Order', inverse_of: :all_adjustments
28
30
 
29
- validates :adjustable, presence: true
30
- validates :order, presence: true
31
- validates :label, presence: true
31
+ validates :adjustable, :order, :label, presence: true
32
32
  validates :amount, numericality: true
33
33
 
34
34
  state_machine :state, initial: :open do
@@ -67,14 +67,12 @@ module Spree
67
67
  scope :is_included, -> { where(included: true) }
68
68
  scope :additional, -> { where(included: false) }
69
69
  scope :competing_promos, -> { where(source_type: competing_promos_source_types) }
70
+ scope :for_complete_order, -> { joins(:order).merge(Spree::Order.complete) }
71
+ scope :for_incomplete_order, -> { joins(:order).merge(Spree::Order.incomplete) }
70
72
 
71
73
  extend DisplayMoney
72
74
  money_methods :amount
73
75
 
74
- def closed?
75
- state == "closed"
76
- end
77
-
78
76
  def currency
79
77
  adjustable ? adjustable.currency : Spree::Config[:currency]
80
78
  end
@@ -89,7 +87,7 @@ module Spree
89
87
  def update!(target = adjustable)
90
88
  return amount if closed? || source.blank?
91
89
  amount = source.compute_amount(target)
92
- attributes = { amount: amount, updated_at: Time.now }
90
+ attributes = { amount: amount, updated_at: Time.current }
93
91
  attributes[:eligible] = source.promotion.eligible?(target) if promotion?
94
92
  update_columns(attributes)
95
93
  amount
@@ -21,13 +21,21 @@ module Spree
21
21
  class AppConfiguration < Preferences::Configuration
22
22
  # Alphabetized to more easily lookup particular preferences
23
23
  preference :address_requires_state, :boolean, default: true # should state/state_name be required
24
- preference :admin_interface_logo, :string, default: 'logo/spree_50.png'
25
- preference :admin_products_per_page, :integer, default: 10
24
+ preference :admin_interface_logo, :string, default: 'admin/logo.png'
25
+ preference :admin_path, :string, default: '/admin'
26
+ preference :admin_products_per_page, :integer, default: Kaminari.config.default_per_page
27
+ preference :admin_orders_per_page, :integer, default: Kaminari.config.default_per_page
28
+ preference :admin_properties_per_page, :integer, default: Kaminari.config.default_per_page
29
+ preference :admin_promotions_per_page, :integer, default: Kaminari.config.default_per_page
30
+ preference :admin_customer_returns_per_page, :integer, default: Kaminari.config.default_per_page
31
+ preference :admin_users_per_page, :integer, default: Kaminari.config.default_per_page
32
+ preference :admin_show_version, :boolean, default: true
26
33
  preference :allow_checkout_on_gateway_error, :boolean, default: false
27
34
  preference :allow_guest_checkout, :boolean, default: true
28
35
  preference :alternative_shipping_phone, :boolean, default: false # Request extra phone for ship addr
29
36
  preference :always_include_confirm_step, :boolean, default: false # Ensures confirmation step is always in checkout_progress bar, but does not force a confirm step if your payment methods do not support it.
30
37
  preference :always_put_site_name_in_title, :boolean, default: true
38
+ preference :title_site_name_separator, :string, default: '-' # When always_put_site_name_in_title is true, insert a separator character before the site name in the title
31
39
  preference :auto_capture, :boolean, default: false # automatically capture the credit card (as opposed to just authorize and capture later)
32
40
  preference :auto_capture_on_dispatch, :boolean, default: false # Captures payment for each shipment in Shipment#after_ship callback, and makes Shipment.ready when payment authorized.
33
41
  preference :binary_inventory_cache, :boolean, default: false # only invalidate product cache when a stock item changes whether it is in_stock
@@ -40,14 +48,11 @@ module Spree
40
48
  preference :layout, :string, default: 'spree/layouts/spree_application'
41
49
  preference :logo, :string, default: 'logo/spree_50.png'
42
50
  preference :max_level_in_taxons_menu, :integer, default: 1 # maximum nesting level in taxons menu
43
- preference :orders_per_page, :integer, default: 15
44
- preference :properties_per_page, :integer, default: 15
45
51
  preference :products_per_page, :integer, default: 12
46
- preference :promotions_per_page, :integer, default: 15
47
- preference :customer_returns_per_page, :integer, default: 15
48
52
  preference :require_master_price, :boolean, default: true
49
53
  preference :restock_inventory, :boolean, default: true # Determines if a return item is restocked automatically once it has been received
50
54
  preference :return_eligibility_number_of_days, :integer, default: 365
55
+ preference :send_core_emails, :boolean, default: true # Default mail headers settings
51
56
  preference :shipping_instructions, :boolean, default: false # Request instructions/info for shipping
52
57
  preference :show_only_complete_orders_by_default, :boolean, default: true
53
58
  preference :show_variant_full_price, :boolean, default: false #Displays variant full price or difference with product price. Default false to be compatible with older behavior
@@ -56,8 +61,9 @@ module Spree
56
61
  preference :tax_using_ship_address, :boolean, default: true
57
62
  preference :track_inventory_levels, :boolean, default: true # Determines whether to track on_hand values for variants / products.
58
63
 
59
- # Default mail headers settings
60
- preference :send_core_emails, :boolean, default: true
64
+ # Store credits configurations
65
+ preference :non_expiring_credit_types, :array, default: []
66
+ preference :credit_to_new_allocation, :boolean, default: false
61
67
 
62
68
  # searcher_class allows spree extension writers to provide their own Search class
63
69
  def searcher_class
@@ -1,4 +1,4 @@
1
- class Spree::Base < ActiveRecord::Base
1
+ class Spree::Base < ApplicationRecord
2
2
  include Spree::Preferences::Preferable
3
3
  serialize :preferences, Hash
4
4
 
@@ -17,4 +17,8 @@ class Spree::Base < ActiveRecord::Base
17
17
  end
18
18
 
19
19
  self.abstract_class = true
20
+
21
+ def self.spree_base_scopes
22
+ where(nil)
23
+ end
20
24
  end
@@ -2,6 +2,7 @@ require_dependency 'spree/calculator'
2
2
 
3
3
  module Spree
4
4
  class Calculator::DefaultTax < Calculator
5
+ include VatPriceCalculation
5
6
  def self.description
6
7
  Spree.t(:default_tax)
7
8
  end
@@ -38,11 +39,7 @@ module Spree
38
39
  def compute_shipping_rate(shipping_rate)
39
40
  if rate.included_in_price
40
41
  pre_tax_amount = shipping_rate.cost / (1 + rate.amount)
41
- if rate.zone == shipping_rate.shipment.order.tax_zone
42
- deduced_total_by_rate(pre_tax_amount, rate)
43
- else
44
- deduced_total_by_rate(pre_tax_amount, rate) * - 1
45
- end
42
+ deduced_total_by_rate(pre_tax_amount, rate)
46
43
  else
47
44
  with_tax_amount = shipping_rate.cost * rate.amount
48
45
  round_to_two_places(with_tax_amount)
@@ -55,13 +52,8 @@ module Spree
55
52
  self.calculable
56
53
  end
57
54
 
58
- def round_to_two_places(amount)
59
- BigDecimal.new(amount.to_s).round(2, BigDecimal::ROUND_HALF_UP)
60
- end
61
-
62
55
  def deduced_total_by_rate(pre_tax_amount, rate)
63
56
  round_to_two_places(pre_tax_amount * rate.amount)
64
57
  end
65
-
66
58
  end
67
59
  end
@@ -1,7 +1,3 @@
1
- # TODO: Deprecate this class.
2
- # This calculator will be removed in future versions of Spree.
3
- # The only case where it was used was for Free Shipping Promotions.
4
- # There is now a Promotion Action which deals with these types of promotions instead.
5
1
  module Spree
6
2
  class Calculator::FreeShipping < Calculator
7
3
  def self.description
@@ -9,6 +5,11 @@ module Spree
9
5
  end
10
6
 
11
7
  def compute(object)
8
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
9
+ Spree::Calculator::FreeShipping will be removed in Spree 3.3
10
+ The only case where it was used was for Free Shipping Promotions.
11
+ There is now a Promotion Action which deals with these types of promotions instead
12
+ EOS
12
13
  if object.is_a?(Array)
13
14
  return if object.empty?
14
15
  order = object.first.order
@@ -19,4 +20,4 @@ module Spree
19
20
  order.ship_total
20
21
  end
21
22
  end
22
- end
23
+ end
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class Calculator < Spree::Base
3
3
  # Conditional check for backwards compatibilty since acts as paranoid was added late https://github.com/spree/spree/issues/5858
4
- if connection.table_exists?(:spree_calculators) && connection.column_exists?(:spree_calculators, :deleted_at)
4
+ if connection.data_source_exists?(:spree_calculators) && connection.column_exists?(:spree_calculators, :deleted_at)
5
5
  acts_as_paranoid
6
6
  end
7
7
 
@@ -27,11 +27,6 @@ module Spree
27
27
  'Base Calculator'
28
28
  end
29
29
 
30
- ###################################################################
31
-
32
- def self.register(*klasses)
33
- end
34
-
35
30
  # Returns all calculators applicable for kind of work
36
31
  def self.calculators
37
32
  Rails.application.config.spree.calculators
@@ -2,10 +2,14 @@ module Spree
2
2
  class Classification < Spree::Base
3
3
  self.table_name = 'spree_products_taxons'
4
4
  acts_as_list scope: :taxon
5
- belongs_to :product, class_name: "Spree::Product", inverse_of: :classifications, touch: true
6
- belongs_to :taxon, class_name: "Spree::Taxon", inverse_of: :classifications, touch: true
7
5
 
6
+ with_options inverse_of: :classifications, touch: true do
7
+ belongs_to :product, class_name: "Spree::Product"
8
+ belongs_to :taxon, class_name: "Spree::Taxon"
9
+ end
10
+
11
+ validates :taxon, :product, presence: true
8
12
  # For #3494
9
- validates_uniqueness_of :taxon_id, scope: :product_id, message: :already_linked
13
+ validates :taxon_id, uniqueness: { scope: :product_id, message: :already_linked, allow_blank: true }
10
14
  end
11
15
  end
@@ -1,8 +1,11 @@
1
1
  module Spree
2
2
  class Country < Spree::Base
3
- has_many :states, -> { order('name ASC') }, dependent: :destroy
4
- has_many :addresses, dependent: :nullify
3
+ # we need to have this callback before any dependent: :destroy associations
4
+ # https://github.com/rails/rails/issues/3458
5
+ before_destroy :ensure_not_default
5
6
 
7
+ has_many :states, dependent: :destroy
8
+ has_many :addresses, dependent: :restrict_with_error
6
9
  has_many :zone_members,
7
10
  -> { where(zoneable_type: 'Spree::Country') },
8
11
  class_name: 'Spree::ZoneMember',
@@ -11,7 +14,7 @@ module Spree
11
14
 
12
15
  has_many :zones, through: :zone_members, class_name: 'Spree::Zone'
13
16
 
14
- validates :name, :iso_name, presence: true
17
+ validates :name, :iso_name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
15
18
 
16
19
  def self.default
17
20
  country_id = Spree::Config[:default_country_id]
@@ -25,5 +28,14 @@ module Spree
25
28
  def to_s
26
29
  name
27
30
  end
31
+
32
+ private
33
+
34
+ def ensure_not_default
35
+ if id.eql?(Spree::Config[:default_country_id])
36
+ errors.add(:base, Spree.t(:default_country_cannot_be_deleted))
37
+ throw(:abort)
38
+ end
39
+ end
28
40
  end
29
41
  end
@@ -1,5 +1,7 @@
1
1
  module Spree
2
2
  class CreditCard < Spree::Base
3
+ include ActiveMerchant::Billing::CreditCardMethods
4
+
3
5
  belongs_to :payment_method
4
6
  belongs_to :user, class_name: Spree.user_class, foreign_key: 'user_id'
5
7
  has_many :payments, as: :source
@@ -8,17 +10,23 @@ module Spree
8
10
 
9
11
  after_save :ensure_one_default
10
12
 
13
+ # As of rails 4.2 string columns always return strings, we can override it on model level.
14
+ attribute :month, ActiveRecord::Type::Integer.new
15
+ attribute :year, ActiveRecord::Type::Integer.new
16
+
17
+ attr_reader :number
11
18
  attr_accessor :encrypted_data,
12
- :number,
13
- :imported,
14
- :verification_value
19
+ :imported,
20
+ :verification_value,
21
+ :manual_entry
15
22
 
16
- validates :month, :year, numericality: { only_integer: true }, if: :require_card_numbers?, on: :create
17
- validates :number, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
18
- validates :name, presence: true, if: :require_card_numbers?, on: :create
19
- validates :verification_value, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
23
+ with_options if: :require_card_numbers?, on: :create do
24
+ validates :month, :year, numericality: { only_integer: true }
25
+ validates :number, :verification_value, presence: true, unless: :imported
26
+ validates :name, presence: true
27
+ end
20
28
 
21
- scope :with_payment_profile, -> { where('gateway_customer_profile_id IS NOT NULL') }
29
+ scope :with_payment_profile, -> { where.not(gateway_customer_profile_id: nil) }
22
30
  scope :default, -> { where(default: true) }
23
31
 
24
32
  # needed for some of the ActiveMerchant gateways (eg. SagePay)
@@ -33,28 +41,20 @@ module Spree
33
41
  attr_accessor :track_data
34
42
 
35
43
  CARD_TYPES = {
36
- visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
37
- master: /(^5[1-5][0-9]{14}$)|(^6759[0-9]{2}([0-9]{10})$)|(^6759[0-9]{2}([0-9]{12})$)|(^6759[0-9]{2}([0-9]{13})$)/,
38
- diners_club: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
39
- american_express: /^3[47][0-9]{13}$/,
40
- discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
41
- jcb: /^(?:2131|1800|35\d{3})\d{11}$/
44
+ visa: /^4\d{12}(\d{3})?(\d{3})?$/,
45
+ master: /^(5[1-5]\d{4}|677189|222[1-9]\d{2}|22[3-9]\d{3}|2[3-6]\d{4}|27[01]\d{3}|2720\d{2})\d{10}$/,
46
+ discover: /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
47
+ american_express: /^3[47]\d{13}$/,
48
+ diners_club: /^3(0[0-5]|[68]\d)\d{11}$/,
49
+ jcb: /^35(28|29|[3-8]\d)\d{12}$/,
50
+ switch: /^6759\d{12}(\d{2,3})?$/,
51
+ solo: /^6767\d{12}(\d{2,3})?$/,
52
+ dankort: /^5019\d{12}$/,
53
+ maestro: /^(5[06-8]|6\d)\d{10,17}$/,
54
+ forbrugsforeningen: /^600722\d{10}$/,
55
+ laser: /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
42
56
  }
43
57
 
44
- # As of rails 4.2 string columns always return strings, perhaps we should
45
- # change these to integer columns on db level
46
- def month
47
- if type_casted = super
48
- type_casted.to_i
49
- end
50
- end
51
-
52
- def year
53
- if type_casted = super
54
- type_casted.to_i
55
- end
56
- end
57
-
58
58
  def expiry=(expiry)
59
59
  return unless expiry.present?
60
60
 
@@ -65,7 +65,7 @@ module Spree
65
65
  [match[1], match[2]]
66
66
  end
67
67
  if self[:year]
68
- self[:year] = "20" + self[:year] if self[:year].length == 2
68
+ self[:year] = "20#{ self[:year] }" if self[:year] / 100 == 0
69
69
  self[:year] = self[:year].to_i
70
70
  end
71
71
  self[:month] = self[:month].to_i if self[:month]
@@ -144,12 +144,12 @@ module Spree
144
144
 
145
145
  def to_active_merchant
146
146
  ActiveMerchant::Billing::CreditCard.new(
147
- :number => number,
148
- :month => month,
149
- :year => year,
150
- :verification_value => verification_value,
151
- :first_name => first_name,
152
- :last_name => last_name,
147
+ number: number,
148
+ month: month,
149
+ year: year,
150
+ verification_value: verification_value,
151
+ first_name: first_name,
152
+ last_name: last_name,
153
153
  )
154
154
  end
155
155
 
@@ -161,9 +161,8 @@ module Spree
161
161
 
162
162
  def ensure_one_default
163
163
  if self.user_id && self.default
164
- CreditCard.where(default: true).where.not(id: self.id).where(user_id: self.user_id).each do |ucc|
165
- ucc.update_columns(default: false)
166
- end
164
+ CreditCard.where(default: true, user_id: self.user_id).where.not(id: self.id)
165
+ .update_all(default: false)
167
166
  end
168
167
  end
169
168
  end
@@ -1,5 +1,6 @@
1
1
  module Spree
2
2
  class CustomerReturn < Spree::Base
3
+ include Spree::Core::NumberGenerator.new(prefix: 'CR', length: 9)
3
4
  belongs_to :stock_location
4
5
 
5
6
  has_many :reimbursements, inverse_of: :customer_return
@@ -7,11 +8,8 @@ module Spree
7
8
  has_many :return_items, inverse_of: :customer_return
8
9
 
9
10
  after_create :process_return!
10
- before_create :generate_number
11
-
12
- validates :return_items, presence: true
13
- validates :stock_location, presence: true
14
11
 
12
+ validates :return_items, :stock_location, presence: true
15
13
  validate :must_have_return_authorization, on: :create
16
14
  validate :return_items_belong_to_same_order
17
15
 
@@ -20,6 +18,10 @@ module Spree
20
18
  extend DisplayMoney
21
19
  money_methods pre_tax_total: { currency: Spree::Config[:currency] }
22
20
 
21
+ self.whitelisted_ransackable_attributes = ['number']
22
+
23
+ delegate :id, to: :order, prefix: true, allow_nil: true
24
+
23
25
  def completely_decided?
24
26
  !return_items.undecided.exists?
25
27
  end
@@ -34,9 +36,6 @@ module Spree
34
36
  return_items.first.inventory_unit.order
35
37
  end
36
38
 
37
- def order_id
38
- order.try(:id)
39
- end
40
39
 
41
40
  def pre_tax_total
42
41
  return_items.sum(:pre_tax_amount)
@@ -54,20 +53,13 @@ module Spree
54
53
  end
55
54
  end
56
55
 
57
- def generate_number
58
- self.number ||= loop do
59
- random = "CR#{Array.new(9){rand(9)}.join}"
60
- break random unless self.class.exists?(number: random)
61
- end
62
- end
63
-
64
56
  def process_return!
65
57
  return_items.each(&:receive!)
66
58
  order.return! if order.all_inventory_units_returned?
67
59
  end
68
60
 
69
61
  def return_items_belong_to_same_order
70
- if return_items.select { |return_item| return_item.inventory_unit.order_id != order_id }.any?
62
+ if return_items.any? { |return_item| return_item.inventory_unit.order_id != order_id }
71
63
  errors.add(:base, Spree.t(:return_items_cannot_be_associated_with_multiple_orders))
72
64
  end
73
65
  end
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class Gateway::Bogus < Gateway
3
3
  TEST_VISA = ['4111111111111111','4012888888881881','4222222222222']
4
- TEST_MC = ['5500000000000004','5555555555554444','5105105105105100']
4
+ TEST_MC = ['5500000000000004','5555555555554444','5105105105105100','2223000010309703']
5
5
  TEST_AMEX = ['378282246310005','371449635398431','378734493671000','340000000000009']
6
6
  TEST_DISC = ['6011000000000004','6011111111111117','6011000990139424']
7
7
 
@@ -21,43 +21,43 @@ module Spree
21
21
  return if payment.source.has_payment_profile?
22
22
  # simulate the storage of credit card profile using remote service
23
23
  if success = VALID_CCS.include?(payment.source.number)
24
- payment.source.update_attributes(:gateway_customer_profile_id => generate_profile_id(success))
24
+ payment.source.update_attributes(gateway_customer_profile_id: generate_profile_id(success))
25
25
  end
26
26
  end
27
27
 
28
28
  def authorize(money, credit_card, options = {})
29
29
  profile_id = credit_card.gateway_customer_profile_id
30
30
  if VALID_CCS.include? credit_card.number or (profile_id and profile_id.starts_with? 'BGS-')
31
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'D' })
31
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'D' })
32
32
  else
33
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { :message => 'Bogus Gateway: Forced failure' }, :test => true)
33
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
34
34
  end
35
35
  end
36
36
 
37
37
  def purchase(money, credit_card, options = {})
38
38
  profile_id = credit_card.gateway_customer_profile_id
39
39
  if VALID_CCS.include? credit_card.number or (profile_id and profile_id.starts_with? 'BGS-')
40
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'M' })
40
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'M' })
41
41
  else
42
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', :message => 'Bogus Gateway: Forced failure', :test => true)
42
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
43
43
  end
44
44
  end
45
45
 
46
46
  def credit(money, credit_card, response_code, options = {})
47
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345')
47
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
48
48
  end
49
49
 
50
50
  def capture(money, authorization, gateway_options)
51
51
  if authorization == '12345'
52
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true)
52
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true)
53
53
  else
54
- ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', :error => 'Bogus Gateway: Forced failure', :test => true)
54
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', error: 'Bogus Gateway: Forced failure', test: true)
55
55
  end
56
56
 
57
57
  end
58
58
 
59
59
  def void(response_code, credit_card, options = {})
60
- ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345')
60
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
61
61
  end
62
62
 
63
63
  def cancel(_response_code)
@@ -82,8 +82,8 @@ module Spree
82
82
  record = true
83
83
  prefix = success ? 'BGS' : 'FAIL'
84
84
  while record
85
- random = "#{prefix}-#{Array.new(6){rand(6)}.join}"
86
- record = CreditCard.where(:gateway_customer_profile_id => random).first
85
+ random = "#{ prefix }-#{ Array.new(6) { rand(6) }.join }"
86
+ record = CreditCard.find_by(gateway_customer_profile_id: random)
87
87
  end
88
88
  random
89
89
  end