spree_core 3.2.9 → 3.3.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 (383) hide show
  1. checksums.yaml +4 -4
  2. data/app/models/concerns/spree/named_type.rb +1 -1
  3. data/app/models/concerns/spree/number_as_param.rb +9 -0
  4. data/app/models/concerns/spree/user_address.rb +4 -2
  5. data/app/models/concerns/spree/user_methods.rb +2 -3
  6. data/app/models/spree/ability.rb +1 -2
  7. data/app/models/spree/address.rb +1 -1
  8. data/app/models/spree/base.rb +2 -0
  9. data/app/models/spree/calculator.rb +1 -1
  10. data/app/models/spree/calculator/percent_per_item.rb +4 -3
  11. data/app/models/spree/calculator/returns/default_refund_amount.rb +16 -14
  12. data/app/models/spree/country.rb +1 -1
  13. data/app/models/spree/credit_card.rb +26 -21
  14. data/app/models/spree/customer_return.rb +2 -2
  15. data/app/models/spree/exchange.rb +7 -2
  16. data/app/models/spree/image.rb +1 -1
  17. data/app/models/spree/inventory_unit.rb +39 -3
  18. data/app/models/spree/line_item.rb +2 -7
  19. data/app/models/spree/option_type.rb +1 -1
  20. data/app/models/spree/option_type_prototype.rb +1 -1
  21. data/app/models/spree/option_value.rb +1 -1
  22. data/app/models/spree/option_value_variant.rb +3 -0
  23. data/app/models/spree/order.rb +82 -81
  24. data/app/models/spree/order/checkout.rb +23 -33
  25. data/app/models/spree/order/currency_updater.rb +1 -1
  26. data/app/models/spree/order/payments.rb +1 -1
  27. data/app/models/spree/order/store_credit.rb +6 -1
  28. data/app/models/spree/order_contents.rb +14 -2
  29. data/app/models/spree/order_inventory.rb +64 -60
  30. data/app/models/spree/payment.rb +8 -13
  31. data/app/models/spree/payment/processing.rb +2 -2
  32. data/app/models/spree/payment_method.rb +4 -2
  33. data/app/models/spree/preference.rb +1 -1
  34. data/app/models/spree/preferences/preferable.rb +1 -1
  35. data/app/models/spree/product.rb +1 -1
  36. data/app/models/spree/product/scopes.rb +2 -2
  37. data/app/models/spree/promotion.rb +2 -2
  38. data/app/models/spree/promotion/rules/option_value.rb +13 -5
  39. data/app/models/spree/promotion_rule_user.rb +1 -1
  40. data/app/models/spree/property_prototype.rb +1 -1
  41. data/app/models/spree/prototype_taxon.rb +1 -1
  42. data/app/models/spree/refund.rb +2 -2
  43. data/app/models/spree/reimbursement.rb +2 -1
  44. data/app/models/spree/reimbursement_type.rb +1 -1
  45. data/app/models/spree/return_authorization.rb +1 -0
  46. data/app/models/spree/return_item.rb +35 -9
  47. data/app/models/spree/role.rb +1 -1
  48. data/app/models/spree/role_user.rb +1 -1
  49. data/app/models/spree/shipment.rb +63 -64
  50. data/app/models/spree/shipment_handler.rb +1 -1
  51. data/app/models/spree/shipping_category.rb +1 -1
  52. data/app/models/spree/shipping_method.rb +12 -10
  53. data/app/models/spree/state_change.rb +1 -1
  54. data/app/models/spree/stock/adjuster.rb +35 -14
  55. data/app/models/spree/stock/availability_validator.rb +1 -1
  56. data/app/models/spree/stock/content_item.rb +9 -8
  57. data/app/models/spree/stock/coordinator.rb +3 -9
  58. data/app/models/spree/stock/estimator.rb +1 -1
  59. data/app/models/spree/stock/inventory_unit_builder.rb +10 -9
  60. data/app/models/spree/stock/package.rb +6 -6
  61. data/app/models/spree/stock/packer.rb +8 -15
  62. data/app/models/spree/stock/prioritizer.rb +13 -10
  63. data/app/models/spree/stock/splitter/weight.rb +62 -10
  64. data/app/models/spree/stock_item.rb +42 -29
  65. data/app/models/spree/stock_location.rb +5 -1
  66. data/app/models/spree/stock_movement.rb +1 -2
  67. data/app/models/spree/stock_transfer.rb +2 -3
  68. data/app/models/spree/store.rb +1 -1
  69. data/app/models/spree/store_credit.rb +9 -6
  70. data/app/models/spree/store_credit_category.rb +1 -1
  71. data/app/models/spree/tax_category.rb +1 -1
  72. data/app/models/spree/tax_rate.rb +1 -1
  73. data/app/models/spree/taxon.rb +5 -2
  74. data/app/models/spree/taxonomy.rb +1 -1
  75. data/app/models/spree/tracker.rb +1 -1
  76. data/app/models/spree/variant.rb +4 -3
  77. data/app/models/spree/zone.rb +19 -21
  78. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +61 -0
  79. data/config/locales/en.yml +7 -6
  80. data/db/migrate/20130807024301_upgrade_adjustments.rb +6 -0
  81. data/db/migrate/20130807024302_rename_adjustment_fields.rb +6 -0
  82. data/db/migrate/20161125065505_add_quantity_to_inventory_units.rb +5 -0
  83. data/db/migrate/20170119122701_add_original_return_item_id_to_spree_inventory_units.rb +29 -0
  84. data/db/migrate/20170315152755_add_unique_index_on_number_to_spree_orders.rb +16 -0
  85. data/db/migrate/20170316154338_add_unique_index_on_number_to_spree_stock_transfer.rb +16 -0
  86. data/db/migrate/20170316205511_add_unique_index_on_number_to_spree_shipment.rb +16 -0
  87. data/db/migrate/20170320134043_add_unique_index_on_number_to_spree_payments.rb +17 -0
  88. data/db/migrate/20170320142750_add_unique_index_on_number_to_spree_return_authorizations.rb +16 -0
  89. data/db/migrate/20170320145040_add_unique_index_on_number_to_spree_customer_returns.rb +16 -0
  90. data/db/migrate/20170320145518_add_unique_index_on_number_to_spree_reimbursements.rb +16 -0
  91. data/db/migrate/20170323151450_add_missing_unique_indexes_for_unique_attributes.rb +37 -0
  92. data/db/migrate/20170329110859_add_index_on_stock_location_to_spree_customer_returns.rb +5 -0
  93. data/db/migrate/20170329113917_add_index_on_prototype_to_spree_option_type_prototype.rb +19 -0
  94. data/db/migrate/20170330082155_add_indexes_to_spree_option_value_variant.rb +19 -0
  95. data/db/migrate/20170330132215_add_index_on_promotion_id_to_order_promotions.rb +5 -0
  96. data/db/migrate/20170331101758_add_indexes_for_property_prototype.rb +20 -0
  97. data/db/migrate/20170331103334_add_index_for_prototype_id_to_prototype_taxons.rb +5 -0
  98. data/db/migrate/20170331110454_add_indexes_to_refunds.rb +6 -0
  99. data/db/migrate/20170331111757_add_indexes_to_reimbursement_credits.rb +6 -0
  100. data/db/migrate/20170331115246_add_indexes_to_return_authorizations.rb +6 -0
  101. data/db/migrate/20170331120125_add_indexes_to_return_items.rb +11 -0
  102. data/db/migrate/20170331121725_add_index_to_role_users.rb +18 -0
  103. data/db/migrate/20170331123625_add_index_to_shipping_method_categories.rb +5 -0
  104. data/db/migrate/20170331123832_add_index_to_shipping_method_zones.rb +20 -0
  105. data/db/migrate/20170331124251_add_index_to_spree_shipping_rates.rb +6 -0
  106. data/db/migrate/20170331124513_add_index_to_spree_stock_items.rb +5 -0
  107. data/db/migrate/20170331124924_add_index_to_spree_stock_movement.rb +5 -0
  108. data/db/migrate/20170413211707_change_indexes_on_friendly_id_slugs.rb +10 -0
  109. data/lib/generators/spree/install/install_generator.rb +41 -36
  110. data/lib/spree/core.rb +0 -1
  111. data/lib/spree/core/engine.rb +3 -3
  112. data/lib/spree/core/importer/order.rb +23 -19
  113. data/lib/spree/core/number_generator.rb +3 -5
  114. data/lib/spree/core/product_duplicator.rb +7 -3
  115. data/lib/spree/core/search/base.rb +1 -0
  116. data/lib/spree/core/validators/email.rb +1 -1
  117. data/lib/spree/core/version.rb +1 -1
  118. data/lib/spree/money.rb +1 -15
  119. data/lib/spree/permitted_attributes.rb +1 -1
  120. data/lib/spree/testing_support/common_rake.rb +0 -2
  121. data/lib/spree/testing_support/factories.rb +3 -3
  122. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  123. data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -1
  124. data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
  125. data/lib/spree/testing_support/factories/country_factory.rb +1 -1
  126. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
  127. data/lib/spree/testing_support/factories/customer_return_factory.rb +1 -1
  128. data/lib/spree/testing_support/factories/image_factory.rb +1 -1
  129. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
  130. data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
  131. data/lib/spree/testing_support/factories/options_factory.rb +1 -1
  132. data/lib/spree/testing_support/factories/order_factory.rb +7 -1
  133. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  134. data/lib/spree/testing_support/factories/payment_method_factory.rb +1 -1
  135. data/lib/spree/testing_support/factories/price_factory.rb +1 -1
  136. data/lib/spree/testing_support/factories/product_factory.rb +1 -1
  137. data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
  138. data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
  139. data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -1
  140. data/lib/spree/testing_support/factories/promotion_factory.rb +1 -1
  141. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
  142. data/lib/spree/testing_support/factories/property_factory.rb +1 -1
  143. data/lib/spree/testing_support/factories/prototype_factory.rb +1 -1
  144. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  145. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  146. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
  147. data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
  148. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  149. data/lib/spree/testing_support/factories/role_factory.rb +1 -1
  150. data/lib/spree/testing_support/factories/shipment_factory.rb +1 -1
  151. data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
  152. data/lib/spree/testing_support/factories/shipping_method_factory.rb +2 -1
  153. data/lib/spree/testing_support/factories/state_factory.rb +1 -1
  154. data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
  155. data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
  156. data/lib/spree/testing_support/factories/stock_location_factory.rb +1 -1
  157. data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
  158. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
  159. data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -1
  160. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
  161. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +1 -1
  162. data/lib/spree/testing_support/factories/store_factory.rb +1 -1
  163. data/lib/spree/testing_support/factories/tag_factory.rb +1 -1
  164. data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -1
  165. data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
  166. data/lib/spree/testing_support/factories/taxon_factory.rb +2 -2
  167. data/lib/spree/testing_support/factories/taxonomy_factory.rb +2 -2
  168. data/lib/spree/testing_support/factories/tracker_factory.rb +1 -1
  169. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  170. data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
  171. data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
  172. data/lib/spree/testing_support/factories/zone_member_factory.rb +1 -1
  173. data/lib/spree/testing_support/microdata.rb +3 -0
  174. data/lib/spree/testing_support/order_walkthrough.rb +9 -9
  175. data/lib/tasks/exchanges.rake +8 -10
  176. data/spec/helpers/base_helper_spec.rb +200 -0
  177. data/spec/helpers/products_helper_spec.rb +289 -0
  178. data/spec/lib/calculated_adjustments_spec.rb +7 -0
  179. data/spec/lib/i18n_spec.rb +123 -0
  180. data/spec/lib/search/base_spec.rb +86 -0
  181. data/spec/lib/spree/core/controller_helpers/auth_spec.rb +103 -0
  182. data/spec/lib/spree/core/controller_helpers/order_spec.rb +110 -0
  183. data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
  184. data/spec/lib/spree/core/controller_helpers/store_spec.rb +72 -0
  185. data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
  186. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
  187. data/spec/lib/spree/core/importer/order_spec.rb +607 -0
  188. data/spec/lib/spree/core/number_generator_spec.rb +139 -0
  189. data/spec/lib/spree/core/token_generator_spec.rb +24 -0
  190. data/spec/lib/spree/core/validators/email_spec.rb +54 -0
  191. data/spec/lib/spree/core_spec.rb +23 -0
  192. data/spec/lib/spree/localized_number_spec.rb +54 -0
  193. data/spec/lib/spree/migrations_spec.rb +36 -0
  194. data/spec/lib/spree/money_spec.rb +122 -0
  195. data/spec/lib/tasks/exchanges_spec.rb +136 -0
  196. data/spec/mailers/order_mailer_spec.rb +122 -0
  197. data/spec/mailers/reimbursement_mailer_spec.rb +52 -0
  198. data/spec/mailers/shipment_mailer_spec.rb +81 -0
  199. data/spec/mailers/test_mailer_spec.rb +38 -0
  200. data/spec/models/spree/ability_spec.rb +251 -0
  201. data/spec/models/spree/address_spec.rb +402 -0
  202. data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
  203. data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
  204. data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
  205. data/spec/models/spree/adjustable/adjustments_updater_spec.rb +26 -0
  206. data/spec/models/spree/adjustment_spec.rb +189 -0
  207. data/spec/models/spree/app_configuration_spec.rb +26 -0
  208. data/spec/models/spree/asset_spec.rb +28 -0
  209. data/spec/models/spree/calculator/default_tax_spec.rb +152 -0
  210. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
  211. data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
  212. data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
  213. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
  214. data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
  215. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +47 -0
  216. data/spec/models/spree/calculator/shipping.rb +8 -0
  217. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
  218. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
  219. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
  220. data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
  221. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
  222. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
  223. data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
  224. data/spec/models/spree/calculator_spec.rb +69 -0
  225. data/spec/models/spree/classification_spec.rb +93 -0
  226. data/spec/models/spree/concerns/display_money_spec.rb +43 -0
  227. data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
  228. data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
  229. data/spec/models/spree/country_spec.rb +55 -0
  230. data/spec/models/spree/credit_card_spec.rb +328 -0
  231. data/spec/models/spree/customer_return_spec.rb +240 -0
  232. data/spec/models/spree/exchange_spec.rb +75 -0
  233. data/spec/models/spree/gateway/bogus_simple.rb +20 -0
  234. data/spec/models/spree/gateway/bogus_spec.rb +13 -0
  235. data/spec/models/spree/gateway_spec.rb +61 -0
  236. data/spec/models/spree/image_spec.rb +8 -0
  237. data/spec/models/spree/inventory_unit_spec.rb +256 -0
  238. data/spec/models/spree/line_item_spec.rb +348 -0
  239. data/spec/models/spree/option_type_prototype_spec.rb +9 -0
  240. data/spec/models/spree/option_type_spec.rb +14 -0
  241. data/spec/models/spree/option_value_spec.rb +18 -0
  242. data/spec/models/spree/order/address_spec.rb +50 -0
  243. data/spec/models/spree/order/adjustments_spec.rb +29 -0
  244. data/spec/models/spree/order/callbacks_spec.rb +42 -0
  245. data/spec/models/spree/order/checkout_spec.rb +770 -0
  246. data/spec/models/spree/order/currency_updater_spec.rb +32 -0
  247. data/spec/models/spree/order/finalizing_spec.rb +114 -0
  248. data/spec/models/spree/order/helpers_spec.rb +5 -0
  249. data/spec/models/spree/order/payment_spec.rb +214 -0
  250. data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
  251. data/spec/models/spree/order/shipments_spec.rb +43 -0
  252. data/spec/models/spree/order/state_machine_spec.rb +212 -0
  253. data/spec/models/spree/order/store_credit_spec.rb +457 -0
  254. data/spec/models/spree/order/tax_spec.rb +84 -0
  255. data/spec/models/spree/order/totals_spec.rb +24 -0
  256. data/spec/models/spree/order/updating_spec.rb +18 -0
  257. data/spec/models/spree/order/validations_spec.rb +15 -0
  258. data/spec/models/spree/order_contents_spec.rb +332 -0
  259. data/spec/models/spree/order_inventory_spec.rb +247 -0
  260. data/spec/models/spree/order_merger_spec.rb +135 -0
  261. data/spec/models/spree/order_spec.rb +1067 -0
  262. data/spec/models/spree/order_updater_spec.rb +305 -0
  263. data/spec/models/spree/payment/gateway_options_spec.rb +127 -0
  264. data/spec/models/spree/payment/store_credit_spec.rb +60 -0
  265. data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
  266. data/spec/models/spree/payment_method_spec.rb +108 -0
  267. data/spec/models/spree/payment_spec.rb +922 -0
  268. data/spec/models/spree/preference_spec.rb +80 -0
  269. data/spec/models/spree/preferences/configuration_spec.rb +30 -0
  270. data/spec/models/spree/preferences/preferable_spec.rb +344 -0
  271. data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
  272. data/spec/models/spree/preferences/store_spec.rb +46 -0
  273. data/spec/models/spree/price_spec.rb +128 -0
  274. data/spec/models/spree/product/scopes_spec.rb +174 -0
  275. data/spec/models/spree/product_duplicator_spec.rb +102 -0
  276. data/spec/models/spree/product_filter_spec.rb +26 -0
  277. data/spec/models/spree/product_option_type_spec.rb +9 -0
  278. data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
  279. data/spec/models/spree/product_property_spec.rb +26 -0
  280. data/spec/models/spree/product_spec.rb +626 -0
  281. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +113 -0
  282. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
  283. data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
  284. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
  285. data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
  286. data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
  287. data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
  288. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
  289. data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
  290. data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
  291. data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
  292. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
  293. data/spec/models/spree/promotion/rules/user_spec.rb +45 -0
  294. data/spec/models/spree/promotion_action_spec.rb +10 -0
  295. data/spec/models/spree/promotion_category_spec.rb +17 -0
  296. data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
  297. data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
  298. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
  299. data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
  300. data/spec/models/spree/promotion_rule_spec.rb +29 -0
  301. data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
  302. data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
  303. data/spec/models/spree/promotion_spec.rb +674 -0
  304. data/spec/models/spree/property_prototype_spec.rb +9 -0
  305. data/spec/models/spree/property_spec.rb +5 -0
  306. data/spec/models/spree/prototype_spec.rb +5 -0
  307. data/spec/models/spree/prototype_taxon_spec.rb +9 -0
  308. data/spec/models/spree/refund_reason_spec.rb +20 -0
  309. data/spec/models/spree/refund_spec.rb +195 -0
  310. data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
  311. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
  312. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
  313. data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
  314. data/spec/models/spree/reimbursement_spec.rb +188 -0
  315. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +63 -0
  316. data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
  317. data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
  318. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
  319. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
  320. data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
  321. data/spec/models/spree/return_authorization_spec.rb +230 -0
  322. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
  323. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
  324. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
  325. data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
  326. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
  327. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
  328. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
  329. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
  330. data/spec/models/spree/return_item_spec.rb +734 -0
  331. data/spec/models/spree/returns_calculator_spec.rb +14 -0
  332. data/spec/models/spree/role_spec.rb +7 -0
  333. data/spec/models/spree/shipment_spec.rb +744 -0
  334. data/spec/models/spree/shipping_calculator_spec.rb +45 -0
  335. data/spec/models/spree/shipping_category_spec.rb +19 -0
  336. data/spec/models/spree/shipping_method_spec.rb +125 -0
  337. data/spec/models/spree/shipping_rate_spec.rb +140 -0
  338. data/spec/models/spree/state_spec.rb +29 -0
  339. data/spec/models/spree/stock/availability_validator_spec.rb +42 -0
  340. data/spec/models/spree/stock/content_item_spec.rb +31 -0
  341. data/spec/models/spree/stock/coordinator_spec.rb +61 -0
  342. data/spec/models/spree/stock/differentiator_spec.rb +39 -0
  343. data/spec/models/spree/stock/estimator_spec.rb +202 -0
  344. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +37 -0
  345. data/spec/models/spree/stock/package_spec.rb +182 -0
  346. data/spec/models/spree/stock/packer_spec.rb +70 -0
  347. data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
  348. data/spec/models/spree/stock/quantifier_spec.rb +126 -0
  349. data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
  350. data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
  351. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
  352. data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
  353. data/spec/models/spree/stock_item_spec.rb +465 -0
  354. data/spec/models/spree/stock_location_spec.rb +243 -0
  355. data/spec/models/spree/stock_movement_spec.rb +120 -0
  356. data/spec/models/spree/stock_transfer_spec.rb +50 -0
  357. data/spec/models/spree/store_credit_event_spec.rb +101 -0
  358. data/spec/models/spree/store_credit_spec.rb +798 -0
  359. data/spec/models/spree/store_spec.rb +78 -0
  360. data/spec/models/spree/tax_category_spec.rb +32 -0
  361. data/spec/models/spree/tax_rate_spec.rb +561 -0
  362. data/spec/models/spree/taxon_spec.rb +93 -0
  363. data/spec/models/spree/taxonomy_spec.rb +18 -0
  364. data/spec/models/spree/tracker_spec.rb +21 -0
  365. data/spec/models/spree/user_spec.rb +203 -0
  366. data/spec/models/spree/variant_spec.rb +818 -0
  367. data/spec/models/spree/zone_member_spec.rb +38 -0
  368. data/spec/models/spree/zone_spec.rb +472 -0
  369. data/spec/spec_helper.rb +82 -0
  370. data/spec/support/big_decimal.rb +5 -0
  371. data/spec/support/concerns/adjustment_source.rb +23 -0
  372. data/spec/support/concerns/default_price.rb +37 -0
  373. data/spec/support/rake.rb +13 -0
  374. data/spec/support/test_gateway.rb +2 -0
  375. data/spree_core.gemspec +13 -13
  376. metadata +252 -45
  377. data/app/models/concerns/spree/user_api_authentication.rb +0 -19
  378. data/app/models/spree/calculator/free_shipping.rb +0 -23
  379. data/config/initializers/premailer_rails.rb +0 -3
  380. data/config/initializers/user_class_extensions.rb +0 -10
  381. data/spec/fixtures/microdata.html +0 -22
  382. data/spec/fixtures/microdata_itemref.html +0 -15
  383. data/spec/fixtures/microdata_no_itemscope.html +0 -20
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aaffc297e301b4c04ae9b9622f80d75561d9db45
4
- data.tar.gz: f65a262c8ad7454482456cc83a838f661aab498d
3
+ metadata.gz: 0c9fdf952e713bfe4540fa0cc02c50e0b0d1d463
4
+ data.tar.gz: fe6f1d0bc7723acc565b94ea5b846ede4836c3bc
5
5
  SHA512:
6
- metadata.gz: 8d672076c7cd12efd892b3d65cabd2fd06488842645e343f987a7d8921edc1f7b28c02ffb566f1e90ef917e84a088680d17a58620976ecb1575c109bbc1872e6
7
- data.tar.gz: d1443c155f8d7f61b2fd9d7cd7eaeae2877dcbef1069c6d2fa9c8b3c2b6b75e877c74d4df7279c98a9e348e2ff1c7145d5a2b331960bbbdc5c0bb59c15447d95
6
+ metadata.gz: d08fd7351e39b0bf4201ddcb1203bbd79cd793d4c9b65a5af2f42e3455f9e5a3019fcc9cb2d67cb5d9022b6b903e6c261cb5a10a6e5928e462d19e07a864cef1
7
+ data.tar.gz: ed488419461ff914b3175e55e99857c8776e9359495f7c69c935cabd13ef491e9752a8cb01daccd083e9252eba222afcf1b9000705be1d0cb21c616878bfaf1a
@@ -6,7 +6,7 @@ module Spree
6
6
  scope :active, -> { where(active: true) }
7
7
  default_scope { order("LOWER(#{self.table_name}.name)") }
8
8
 
9
- validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
9
+ validates :name, presence: true, uniqueness: { case_sensitive: false }
10
10
  end
11
11
  end
12
12
  end
@@ -0,0 +1,9 @@
1
+ module Spree
2
+ module NumberAsParam
3
+ extend ActiveSupport::Concern
4
+
5
+ def to_param
6
+ number.presence.to_s
7
+ end
8
+ end
9
+ end
@@ -3,10 +3,12 @@ module Spree
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
6
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address',
7
+ optional: true
7
8
  alias_attribute :billing_address, :bill_address
8
9
 
9
- belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
10
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address',
11
+ optional: true
10
12
  alias_attribute :shipping_address, :ship_address
11
13
 
12
14
  accepts_nested_attributes_for :ship_address, :bill_address
@@ -2,7 +2,6 @@ module Spree
2
2
  module UserMethods
3
3
  extend ActiveSupport::Concern
4
4
 
5
- include Spree::UserApiAuthentication
6
5
  include Spree::UserPaymentSource
7
6
  include Spree::UserReporting
8
7
  include Spree::RansackableAttributes
@@ -21,8 +20,8 @@ module Spree
21
20
  has_many :orders, foreign_key: :user_id, class_name: "Spree::Order"
22
21
  has_many :store_credits, foreign_key: :user_id, class_name: 'Spree::StoreCredit'
23
22
 
24
- belongs_to :ship_address, class_name: 'Spree::Address'
25
- belongs_to :bill_address, class_name: 'Spree::Address'
23
+ belongs_to :ship_address, class_name: 'Spree::Address', optional: true
24
+ belongs_to :bill_address, class_name: 'Spree::Address', optional: true
26
25
 
27
26
  self.whitelisted_ransackable_associations = %w[bill_address ship_address]
28
27
  self.whitelisted_ransackable_attributes = %w[id email]
@@ -61,8 +61,7 @@ module Spree
61
61
 
62
62
  # Include any abilities registered by extensions, etc.
63
63
  Ability.abilities.merge(abilities_to_register).each do |clazz|
64
- ability = clazz.send(:new, user)
65
- @rules = rules + ability.send(:rules)
64
+ merge clazz.new(user)
66
65
  end
67
66
 
68
67
  # Protect admin role
@@ -11,7 +11,7 @@ module Spree
11
11
  ].freeze
12
12
 
13
13
  belongs_to :country, class_name: "Spree::Country"
14
- belongs_to :state, class_name: "Spree::State"
14
+ belongs_to :state, class_name: "Spree::State", optional: true
15
15
 
16
16
  has_many :shipments, inverse_of: :address
17
17
 
@@ -18,6 +18,8 @@ class Spree::Base < ApplicationRecord
18
18
 
19
19
  self.abstract_class = true
20
20
 
21
+ self.belongs_to_required_by_default = false
22
+
21
23
  def self.spree_base_scopes
22
24
  where(nil)
23
25
  end
@@ -5,7 +5,7 @@ module Spree
5
5
  acts_as_paranoid
6
6
  end
7
7
 
8
- belongs_to :calculable, polymorphic: true
8
+ belongs_to :calculable, polymorphic: true, optional: true
9
9
 
10
10
  # This method calls a compute_<computable> method. must be overriden in concrete calculator.
11
11
  #
@@ -4,9 +4,6 @@ module Spree
4
4
  # for all matching products in an order. This should not be used as a
5
5
  # shipping calculator since it would be the same thing as a flat percent
6
6
  # off the entire order.
7
- #
8
- #
9
- # TODO Should be deprecated now that we have adjustments at the line item level in spree core
10
7
 
11
8
  class Calculator::PercentPerItem < Calculator
12
9
  preference :percent, :decimal, default: 0
@@ -16,6 +13,10 @@ module Spree
16
13
  end
17
14
 
18
15
  def compute(object=nil)
16
+ ActiveSupport::Deprecation.warn(<<-EOS, caller)
17
+ Spree::Calculator::PercentPerItem will be removed in Spree 3.4
18
+ There is now a Promotion Action which deals with these types of promotions instead
19
+ EOS
19
20
  return 0 if object.nil?
20
21
  object.line_items.reduce(0) do |sum, line_item|
21
22
  sum += value_for_line_item(line_item)
@@ -3,6 +3,7 @@ require_dependency 'spree/returns_calculator'
3
3
  module Spree
4
4
  module Calculator::Returns
5
5
  class DefaultRefundAmount < ReturnsCalculator
6
+ attr_reader :inventory_unit
6
7
 
7
8
  def self.description
8
9
  Spree.t(:default_refund_amount)
@@ -10,27 +11,28 @@ module Spree
10
11
 
11
12
  def compute(return_item)
12
13
  return 0.0.to_d if return_item.exchange_requested?
13
- weighted_order_adjustment_amount(return_item.inventory_unit) + weighted_line_item_pre_tax_amount(return_item.inventory_unit)
14
+ @inventory_unit = return_item.inventory_unit
15
+ weighted_order_adjustment_amount(return_item) + weighted_line_item_pre_tax_amount(return_item)
14
16
  end
15
17
 
16
18
  private
17
19
 
18
- def weighted_order_adjustment_amount(inventory_unit)
19
- inventory_unit.order.adjustments.eligible.non_tax.sum(:amount) * percentage_of_order_total(inventory_unit)
20
+ def weighted_order_adjustment_amount(return_item)
21
+ inventory_unit.order.adjustments.eligible.non_tax.sum(:amount) * percentage_of_order_total(return_item)
20
22
  end
21
23
 
22
- def weighted_line_item_pre_tax_amount(inventory_unit)
23
- inventory_unit.line_item.pre_tax_amount * percentage_of_line_item(inventory_unit)
24
+ def percentage_of_order_total(return_item)
25
+ return 0.0 if inventory_unit.order.pre_tax_item_amount.zero?
26
+ weighted_line_item_pre_tax_amount(return_item) / inventory_unit.order.pre_tax_item_amount
24
27
  end
25
28
 
26
- def percentage_of_order_total(inventory_unit)
27
- return 0.0 if inventory_unit.order.pre_tax_item_amount.zero?
28
- weighted_line_item_pre_tax_amount(inventory_unit) / inventory_unit.order.pre_tax_item_amount
29
- end
29
+ def weighted_line_item_pre_tax_amount(return_item)
30
+ inventory_unit.line_item.pre_tax_amount * percentage_of_line_item(return_item)
31
+ end
30
32
 
31
- def percentage_of_line_item(inventory_unit)
32
- 1 / BigDecimal.new(inventory_unit.line_item.quantity)
33
- end
34
- end
35
- end
33
+ def percentage_of_line_item(return_item)
34
+ return_item.return_quantity / BigDecimal.new(inventory_unit.line_item.quantity)
35
+ end
36
+ end
37
+ end
36
38
  end
@@ -14,7 +14,7 @@ module Spree
14
14
 
15
15
  has_many :zones, through: :zone_members, class_name: 'Spree::Zone'
16
16
 
17
- validates :name, :iso_name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
17
+ validates :name, :iso_name, presence: true, uniqueness: { case_sensitive: false }
18
18
 
19
19
  def self.default
20
20
  country_id = Spree::Config[:default_country_id]
@@ -3,7 +3,8 @@ module Spree
3
3
  include ActiveMerchant::Billing::CreditCardMethods
4
4
 
5
5
  belongs_to :payment_method
6
- belongs_to :user, class_name: Spree.user_class, foreign_key: 'user_id'
6
+ belongs_to :user, class_name: Spree.user_class.to_s, foreign_key: 'user_id',
7
+ optional: true
7
8
  has_many :payments, as: :source
8
9
 
9
10
  before_save :set_last_digits
@@ -53,49 +54,53 @@ module Spree
53
54
  maestro: /^(5[06-8]|6\d)\d{10,17}$/,
54
55
  forbrugsforeningen: /^600722\d{10}$/,
55
56
  laser: /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
56
- }
57
+ }.freeze
57
58
 
58
59
  def expiry=(expiry)
59
60
  return unless expiry.present?
60
61
 
61
62
  self[:month], self[:year] =
62
- if expiry.match(/\d{2}\s?\/\s?\d{2,4}/) # will match mm/yy and mm / yyyy
63
- expiry.delete(' ').split('/')
64
- elsif match = expiry.match(/(\d{2})(\d{2,4})/) # will match mmyy and mmyyyy
65
- [match[1], match[2]]
66
- end
63
+ if expiry =~ /\d{2}\s?\/\s?\d{2,4}/ # will match mm/yy and mm / yyyy
64
+ expiry.delete(' ').split('/')
65
+ elsif match = expiry.match(/(\d{2})(\d{2,4})/) # will match mmyy and mmyyyy
66
+ [match[1], match[2]]
67
+ end
67
68
  if self[:year]
68
- self[:year] = "20#{ self[:year] }" if self[:year] / 100 == 0
69
+ self[:year] = "20#{self[:year]}" if (self[:year] / 100).zero?
69
70
  self[:year] = self[:year].to_i
70
71
  end
71
72
  self[:month] = self[:month].to_i if self[:month]
72
73
  end
73
74
 
74
75
  def number=(num)
75
- @number = num.gsub(/[^0-9]/, '') rescue nil
76
+ @number = begin
77
+ num.gsub(/[^0-9]/, '')
78
+ rescue
79
+ nil
80
+ end
76
81
  end
77
82
 
78
83
  # cc_type is set by jquery.payment, which helpfully provides different
79
84
  # types from Active Merchant. Converting them is necessary.
80
85
  def cc_type=(type)
81
86
  self[:cc_type] = case type
82
- when 'mastercard', 'maestro' then 'master'
83
- when 'amex' then 'american_express'
84
- when 'dinersclub' then 'diners_club'
85
- when '' then try_type_from_number
86
- else type
87
+ when 'mastercard', 'maestro' then 'master'
88
+ when 'amex' then 'american_express'
89
+ when 'dinersclub' then 'diners_club'
90
+ when '' then try_type_from_number
91
+ else type
87
92
  end
88
93
  end
89
94
 
90
95
  def set_last_digits
91
- number.to_s.gsub!(/\s/,'')
92
- verification_value.to_s.gsub!(/\s/,'')
96
+ number.to_s.gsub!(/\s/, '')
97
+ verification_value.to_s.gsub!(/\s/, '')
93
98
  self.last_digits ||= number.to_s.length <= 4 ? number : number.to_s.slice(-4..-1)
94
99
  end
95
100
 
96
101
  def try_type_from_number
97
102
  numbers = number.delete(' ') if number
98
- CARD_TYPES.find{|type, pattern| return type.to_s if numbers =~ pattern}.to_s
103
+ CARD_TYPES.find { |type, pattern| return type.to_s if numbers =~ pattern }.to_s
99
104
  end
100
105
 
101
106
  def verification_value?
@@ -156,13 +161,13 @@ module Spree
156
161
  private
157
162
 
158
163
  def require_card_numbers?
159
- !self.encrypted_data.present? && !self.has_payment_profile?
164
+ !encrypted_data.present? && !has_payment_profile?
160
165
  end
161
166
 
162
167
  def ensure_one_default
163
- if self.user_id && self.default
164
- CreditCard.where(default: true, user_id: self.user_id).where.not(id: self.id)
165
- .update_all(default: false)
168
+ if user_id && default
169
+ CreditCard.where(default: true, user_id: user_id).where.not(id: id).
170
+ update_all(default: false)
166
171
  end
167
172
  end
168
173
  end
@@ -4,11 +4,12 @@ module Spree
4
4
  belongs_to :stock_location
5
5
 
6
6
  has_many :reimbursements, inverse_of: :customer_return
7
- has_many :return_authorizations, through: :return_items
8
7
  has_many :return_items, inverse_of: :customer_return
8
+ has_many :return_authorizations, through: :return_items
9
9
 
10
10
  after_create :process_return!
11
11
 
12
+ validates :number, uniqueness: true
12
13
  validates :return_items, :stock_location, presence: true
13
14
  validate :must_have_return_authorization, on: :create
14
15
  validate :return_items_belong_to_same_order
@@ -36,7 +37,6 @@ module Spree
36
37
  return_items.first.inventory_unit.order
37
38
  end
38
39
 
39
-
40
40
  def pre_tax_total
41
41
  return_items.sum(:pre_tax_amount)
42
42
  end
@@ -18,12 +18,17 @@ module Spree
18
18
  end
19
19
 
20
20
  def perform!
21
- shipments = Spree::Stock::Coordinator.new(@order, @reimbursement_objects.map(&:build_exchange_inventory_unit)).shipments
22
- if shipments.flat_map(&:inventory_units).size != @reimbursement_objects.size
21
+ new_exchange_inventory_units = @reimbursement_objects.map(&:build_default_exchange_inventory_unit)
22
+ shipments = Spree::Stock::Coordinator.new(@order, new_exchange_inventory_units).shipments
23
+ shipments_units = shipments.flat_map(&:inventory_units)
24
+
25
+ if shipments_units.sum(&:quantity) != new_exchange_inventory_units.sum(&:quantity)
23
26
  raise UnableToCreateShipments.new("Could not generate shipments for all items. Out of stock?")
24
27
  end
28
+
25
29
  @order.shipments += shipments
26
30
  @order.save!
31
+
27
32
  shipments.each do |shipment|
28
33
  shipment.update!(@order)
29
34
  shipment.finalize!
@@ -14,7 +14,7 @@ module Spree
14
14
 
15
15
  # save the w,h of the original image (from which others can be calculated)
16
16
  # we need to look at the write-queue for images which have not been saved yet
17
- before_save :find_dimensions, if: :attachment_updated_at_changed?
17
+ before_save :find_dimensions, if: :saved_change_to_attachment_updated_at?
18
18
 
19
19
  #used by admin products autocomplete
20
20
  def mini_url
@@ -1,6 +1,5 @@
1
1
  module Spree
2
2
  class InventoryUnit < Spree::Base
3
-
4
3
  with_options inverse_of: :inventory_units do
5
4
  belongs_to :variant, class_name: "Spree::Variant"
6
5
  belongs_to :order, class_name: "Spree::Order"
@@ -10,7 +9,7 @@ module Spree
10
9
  end
11
10
 
12
11
  has_many :return_items, inverse_of: :inventory_unit
13
- has_one :original_return_item, class_name: "Spree::ReturnItem", foreign_key: :exchange_inventory_unit_id
12
+ belongs_to :original_return_item, class_name: "Spree::ReturnItem"
14
13
 
15
14
  scope :backordered, -> { where state: 'backordered' }
16
15
  scope :on_hand, -> { where state: 'on_hand' }
@@ -25,6 +24,8 @@ module Spree
25
24
  .backordered.order("spree_orders.completed_at ASC")
26
25
  end
27
26
 
27
+ validates :quantity, numericality: { greater_than: 0 }
28
+
28
29
  # state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
29
30
  state_machine initial: :on_hand do
30
31
  event :fill_backorder do
@@ -62,6 +63,27 @@ module Spree
62
63
  variant_id: variant_id).first
63
64
  end
64
65
 
66
+ def self.split(original_inventory_unit, extract_quantity)
67
+ split = original_inventory_unit.dup
68
+ split.quantity = extract_quantity
69
+ original_inventory_unit.quantity -= extract_quantity
70
+ split
71
+ end
72
+
73
+ # This will fail if extract >= available_quantity
74
+ def split_inventory!(extract_quantity)
75
+ split = self.class.split(self, extract_quantity)
76
+ transaction do
77
+ split.save!
78
+ save!
79
+ end
80
+ split
81
+ end
82
+
83
+ def extract_singular_inventory!
84
+ split_inventory!(1)
85
+ end
86
+
65
87
  # Remove variant default_scope `deleted_at: nil`
66
88
  def variant
67
89
  Spree::Variant.unscoped { super }
@@ -79,6 +101,20 @@ module Spree
79
101
  line_item.included_tax_total * percentage_of_line_item
80
102
  end
81
103
 
104
+ def required_quantity
105
+ return @required_quantity unless @required_quantity.nil?
106
+
107
+ if exchanged_unit?
108
+ @required_quantity = original_return_item.return_quantity
109
+ else
110
+ @required_quantity = line_item.quantity
111
+ end
112
+ end
113
+
114
+ def exchanged_unit?
115
+ original_return_item_id?
116
+ end
117
+
82
118
  private
83
119
 
84
120
  def allow_ship?
@@ -91,7 +127,7 @@ module Spree
91
127
  end
92
128
 
93
129
  def percentage_of_line_item
94
- 1 / BigDecimal.new(line_item.quantity)
130
+ quantity / BigDecimal.new(line_item.quantity)
95
131
  end
96
132
 
97
133
  def current_return_item
@@ -85,11 +85,6 @@ module Spree
85
85
  alias total final_amount
86
86
  alias money display_total
87
87
 
88
- def invalid_quantity_check
89
- warn "`invalid_quantity_check` is deprecated. Use private `ensure_valid_quantity` instead."
90
- ensure_valid_quantity
91
- end
92
-
93
88
  def sufficient_stock?
94
89
  Stock::Quantifier.new(variant).can_supply? quantity
95
90
  end
@@ -132,7 +127,7 @@ module Spree
132
127
  end
133
128
 
134
129
  def update_inventory
135
- if (changed? || target_shipment.present?) && order.has_checkout_step?("delivery")
130
+ if (saved_changes? || target_shipment.present?) && order.has_checkout_step?("delivery")
136
131
  verify_order_inventory
137
132
  end
138
133
  end
@@ -146,7 +141,7 @@ module Spree
146
141
  end
147
142
 
148
143
  def update_adjustments
149
- if quantity_changed?
144
+ if saved_change_to_quantity?
150
145
  recalculate_adjustments
151
146
  update_tax_charge # Called to ensure pre_tax_amount is updated.
152
147
  end