spree_core 3.2.9 → 3.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -13,7 +13,7 @@ module Spree
13
13
  has_many :prototypes, through: :option_type_prototypes, class_name: 'Spree::Prototype'
14
14
 
15
15
  with_options presence: true do
16
- validates :name, uniqueness: { allow_blank: true }
16
+ validates :name, uniqueness: { case_sensitive: false, allow_blank: true }
17
17
  validates :presentation
18
18
  end
19
19
 
@@ -4,6 +4,6 @@ module Spree
4
4
  belongs_to :prototype, class_name: 'Spree::Prototype'
5
5
 
6
6
  validates :prototype, :option_type, presence: true
7
- validates :prototype_id, uniqueness: { scope: :option_type_id }, allow_nil: true
7
+ validates :prototype_id, uniqueness: { scope: :option_type_id }
8
8
  end
9
9
  end
@@ -7,7 +7,7 @@ module Spree
7
7
  has_many :variants, through: :option_value_variants, class_name: 'Spree::Variant'
8
8
 
9
9
  with_options presence: true do
10
- validates :name, uniqueness: { scope: :option_type_id, allow_blank: true }
10
+ validates :name, uniqueness: { scope: :option_type_id }
11
11
  validates :presentation
12
12
  end
13
13
 
@@ -2,5 +2,8 @@ module Spree
2
2
  class OptionValueVariant < Spree::Base
3
3
  belongs_to :option_value, class_name: 'Spree::OptionValue'
4
4
  belongs_to :variant, class_name: 'Spree::Variant'
5
+
6
+ validates :option_value, :variant, presence: true
7
+ validates :option_value_id, uniqueness: { scope: :variant_id }
5
8
  end
6
9
  end
@@ -6,15 +6,14 @@ module Spree
6
6
  PAYMENT_STATES = %w(balance_due credit_owed failed paid void)
7
7
  SHIPMENT_STATES = %w(backorder canceled partial pending ready shipped)
8
8
 
9
- extend FriendlyId
10
- friendly_id :number, slug_column: :number, use: :slugged
11
-
12
9
  include Spree::Order::Checkout
13
10
  include Spree::Order::CurrencyUpdater
14
11
  include Spree::Order::Payments
15
12
  include Spree::Order::StoreCredit
16
13
  include Spree::Core::NumberGenerator.new(prefix: 'R')
17
14
  include Spree::Core::TokenGenerator
15
+
16
+ include NumberAsParam
18
17
 
19
18
  extend Spree::DisplayMoney
20
19
  money_methods :outstanding_balance, :item_total, :adjustment_total,
@@ -46,7 +45,7 @@ module Spree
46
45
  checkout_flow do
47
46
  go_to_state :address
48
47
  go_to_state :delivery
49
- go_to_state :payment, if: ->(order) { order.payment_required? }
48
+ go_to_state :payment, if: ->(order) { order.payment? || order.payment_required? }
50
49
  go_to_state :confirm, if: ->(order) { order.confirmation_required? }
51
50
  go_to_state :complete
52
51
  remove_transition from: :delivery, to: :confirm
@@ -59,21 +58,23 @@ module Spree
59
58
  attr_accessor :temporary_address, :temporary_credit_card
60
59
 
61
60
  if Spree.user_class
62
- belongs_to :user, class_name: Spree.user_class.to_s
63
- belongs_to :created_by, class_name: Spree.user_class.to_s
64
- belongs_to :approver, class_name: Spree.user_class.to_s
65
- belongs_to :canceler, class_name: Spree.user_class.to_s
61
+ belongs_to :user, class_name: Spree.user_class.to_s, optional: true
62
+ belongs_to :created_by, class_name: Spree.user_class.to_s, optional: true
63
+ belongs_to :approver, class_name: Spree.user_class.to_s, optional: true
64
+ belongs_to :canceler, class_name: Spree.user_class.to_s, optional: true
66
65
  else
67
- belongs_to :user
68
- belongs_to :created_by
69
- belongs_to :approver
70
- belongs_to :canceler
66
+ belongs_to :user, optional: true
67
+ belongs_to :created_by, optional: true
68
+ belongs_to :approver, optional: true
69
+ belongs_to :canceler, optional: true
71
70
  end
72
71
 
73
- belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address'
72
+ belongs_to :bill_address, foreign_key: :bill_address_id, class_name: 'Spree::Address',
73
+ optional: true
74
74
  alias_attribute :billing_address, :bill_address
75
75
 
76
- belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
76
+ belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address',
77
+ optional: true
77
78
  alias_attribute :shipping_address, :ship_address
78
79
 
79
80
  belongs_to :store, class_name: 'Spree::Store'
@@ -87,10 +88,9 @@ module Spree
87
88
  end
88
89
  has_many :reimbursements, inverse_of: :order
89
90
  has_many :line_item_adjustments, through: :line_items, source: :adjustments
90
- has_many :shipment_adjustments, through: :shipments, source: :adjustments
91
91
  has_many :inventory_units, inverse_of: :order
92
- has_many :products, through: :variants
93
92
  has_many :variants, through: :line_items
93
+ has_many :products, through: :variants
94
94
  has_many :refunds, through: :payments
95
95
  has_many :all_adjustments,
96
96
  class_name: 'Spree::Adjustment',
@@ -106,11 +106,12 @@ module Spree
106
106
  pluck(:state).uniq
107
107
  end
108
108
  end
109
+ has_many :shipment_adjustments, through: :shipments, source: :adjustments
109
110
 
110
111
  accepts_nested_attributes_for :line_items
111
112
  accepts_nested_attributes_for :bill_address
112
113
  accepts_nested_attributes_for :ship_address
113
- accepts_nested_attributes_for :payments
114
+ accepts_nested_attributes_for :payments, reject_if: :credit_card_nil_payment?
114
115
  accepts_nested_attributes_for :shipments
115
116
 
116
117
  # Needs to happen before save_permalink is called
@@ -159,13 +160,13 @@ module Spree
159
160
  # Use this method in other gems that wish to register their own custom logic
160
161
  # that should be called after Order#update
161
162
  def self.register_update_hook(hook)
162
- self.update_hooks.add(hook)
163
+ update_hooks.add(hook)
163
164
  end
164
165
 
165
166
  # Use this method in other gems that wish to register their own custom logic
166
167
  # that should be called when determining if two line items are equal.
167
168
  def self.register_line_item_comparison_hook(hook)
168
- self.line_item_comparison_hooks.add(hook)
169
+ line_item_comparison_hooks.add(hook)
169
170
  end
170
171
 
171
172
  # For compatiblity with Calculator::PriceSack
@@ -241,10 +242,10 @@ module Spree
241
242
  end
242
243
 
243
244
  def clone_billing_address
244
- if bill_address and self.ship_address.nil?
245
+ if bill_address && ship_address.nil?
245
246
  self.ship_address = bill_address.clone
246
247
  else
247
- self.ship_address.attributes = bill_address.attributes.except('id', 'updated_at', 'created_at')
248
+ ship_address.attributes = bill_address.attributes.except('id', 'updated_at', 'created_at')
248
249
  end
249
250
  true
250
251
  end
@@ -255,7 +256,7 @@ module Spree
255
256
  end
256
257
 
257
258
  def all_inventory_units_returned?
258
- inventory_units.all? { |inventory_unit| inventory_unit.returned? }
259
+ inventory_units.all?(&:returned?)
259
260
  end
260
261
 
261
262
  def contents
@@ -267,8 +268,8 @@ module Spree
267
268
  self.user = user
268
269
  self.email = user.email if override_email
269
270
  self.created_by ||= user
270
- self.bill_address ||= user.bill_address.try(:clone)
271
- self.ship_address ||= user.ship_address.try(:clone)
271
+ self.bill_address ||= user.bill_address
272
+ self.ship_address ||= user.ship_address
272
273
 
273
274
  changes = slice(:user_id, :email, :created_by_id, :bill_address_id, :ship_address_id)
274
275
 
@@ -283,10 +284,10 @@ module Spree
283
284
  end
284
285
 
285
286
  def find_line_item_by_variant(variant, options = {})
286
- line_items.detect { |line_item|
287
- line_item.variant_id == variant.id &&
288
- line_item_options_match(line_item, options)
289
- }
287
+ line_items.detect do |line_item|
288
+ line_item.variant_id == variant.id &&
289
+ line_item_options_match(line_item, options)
290
+ end
290
291
  end
291
292
 
292
293
  # This method enables extensions to participate in the
@@ -301,9 +302,9 @@ module Spree
301
302
  def line_item_options_match(line_item, options)
302
303
  return true unless options
303
304
 
304
- self.line_item_comparison_hooks.all? { |hook|
305
- self.send(hook, line_item, options)
306
- }
305
+ line_item_comparison_hooks.all? do |hook|
306
+ send(hook, line_item, options)
307
+ end
307
308
  end
308
309
 
309
310
  # Creates new tax charges if there are any applicable rates. If prices already
@@ -323,17 +324,20 @@ module Spree
323
324
  def outstanding_balance
324
325
  if canceled?
325
326
  -1 * payment_total
326
- elsif refunds.exists?
327
- # If refund has happened add it back to total to prevent balance_due payment state
328
- # See: https://github.com/spree/spree/issues/6229 & https://github.com/spree/spree/issues/8136
329
- total - (payment_total + refunds.sum(:amount))
327
+ elsif !reimbursements.includes(:refunds).empty?
328
+ reimbursed = reimbursements.includes(:refunds).inject(0) do |sum, reimbursement|
329
+ sum + reimbursement.refunds.sum(:amount)
330
+ end
331
+ # If reimbursement has happened add it back to total to prevent balance_due payment state
332
+ # See: https://github.com/spree/spree/issues/6229
333
+ total - (payment_total + reimbursed)
330
334
  else
331
335
  total - payment_total
332
336
  end
333
337
  end
334
338
 
335
339
  def outstanding_balance?
336
- self.outstanding_balance != 0
340
+ outstanding_balance != 0
337
341
  end
338
342
 
339
343
  def name
@@ -343,7 +347,7 @@ module Spree
343
347
  end
344
348
 
345
349
  def can_ship?
346
- self.complete? || self.resumed? || self.awaiting_return? || self.returned?
350
+ complete? || resumed? || awaiting_return? || returned?
347
351
  end
348
352
 
349
353
  def credit_cards
@@ -360,7 +364,7 @@ module Spree
360
364
  # Called after transition to complete state when payments will have been processed
361
365
  def finalize!
362
366
  # lock all adjustments (coupon promotions, etc.)
363
- all_adjustments.each{|a| a.close}
367
+ all_adjustments.each(&:close)
364
368
 
365
369
  # update payment and shipment(s) states, and save
366
370
  updater.update_payment_state
@@ -408,7 +412,7 @@ module Spree
408
412
  # Check to see if any line item variants are discontinued.
409
413
  # If so add error and restart checkout.
410
414
  def ensure_line_item_variants_are_not_discontinued
411
- if line_items.any?{ |li| !li.variant || li.variant.discontinued? }
415
+ if line_items.any? { |li| !li.variant || li.variant.discontinued? }
412
416
  restart_checkout_flow
413
417
  errors.add(:base, Spree.t(:discontinued_variants_present))
414
418
  false
@@ -452,21 +456,25 @@ module Spree
452
456
  def state_changed(name)
453
457
  state = "#{name}_state"
454
458
  if persisted?
455
- old_state = self.send("#{state}_was")
456
- new_state = self.send(state)
459
+ old_state = send("#{state}_was")
460
+ new_state = send(state)
457
461
  unless old_state == new_state
458
- self.state_changes.create(
462
+ state_changes.create(
459
463
  previous_state: old_state,
460
464
  next_state: new_state,
461
465
  name: name,
462
- user_id: self.user_id
466
+ user_id: user_id
463
467
  )
464
468
  end
465
469
  end
466
470
  end
467
471
 
468
472
  def coupon_code=(code)
469
- @coupon_code = code.strip.downcase rescue nil
473
+ @coupon_code = begin
474
+ code.strip.downcase
475
+ rescue
476
+ nil
477
+ end
470
478
  end
471
479
 
472
480
  def can_add_coupon?
@@ -479,7 +487,12 @@ module Spree
479
487
 
480
488
  def create_proposed_shipments
481
489
  all_adjustments.shipping.delete_all
482
- shipments.destroy_all
490
+
491
+ shipment_ids = shipments.map(&:id)
492
+ StateChange.where(stateful_type: "Spree::Shipment", stateful_id: shipment_ids).delete_all
493
+ ShippingRate.where(shipment_id: shipment_ids).delete_all
494
+
495
+ shipments.delete_all
483
496
 
484
497
  # Inventory Units which are not associated to any shipment (unshippable)
485
498
  # and are not returned or shipped should be deleted
@@ -501,19 +514,19 @@ module Spree
501
514
  # to delivery again so that proper updated shipments are created.
502
515
  # e.g. customer goes back from payment step and changes order items
503
516
  def ensure_updated_shipments
504
- if shipments.any? && !self.completed?
505
- self.shipments.destroy_all
506
- self.update_column(:shipment_total, 0)
517
+ if shipments.any? && !completed?
518
+ shipments.destroy_all
519
+ update_column(:shipment_total, 0)
507
520
  restart_checkout_flow
508
521
  end
509
522
  end
510
523
 
511
524
  def restart_checkout_flow
512
- self.update_columns(
525
+ update_columns(
513
526
  state: 'cart',
514
527
  updated_at: Time.current,
515
528
  )
516
- self.next! if self.line_items.size > 0
529
+ next! if !line_items.empty?
517
530
  end
518
531
 
519
532
  def refresh_shipment_rates(shipping_method_filter = ShippingMethod::DISPLAY_ON_FRONT_END)
@@ -531,13 +544,13 @@ module Spree
531
544
  end
532
545
 
533
546
  def is_risky?
534
- payments.risky.size > 0
547
+ !payments.risky.empty?
535
548
  end
536
549
 
537
550
  def canceled_by(user)
538
- self.transaction do
551
+ transaction do
539
552
  cancel!
540
- self.update_columns(
553
+ update_columns(
541
554
  canceler_id: user.id,
542
555
  canceled_at: Time.current,
543
556
  )
@@ -545,9 +558,9 @@ module Spree
545
558
  end
546
559
 
547
560
  def approved_by(user)
548
- self.transaction do
561
+ transaction do
549
562
  approve!
550
- self.update_columns(
563
+ update_columns(
551
564
  approver_id: user.id,
552
565
  approved_at: Time.current,
553
566
  )
@@ -555,7 +568,7 @@ module Spree
555
568
  end
556
569
 
557
570
  def approved?
558
- !!self.approved_at
571
+ !!approved_at
559
572
  end
560
573
 
561
574
  def can_approve?
@@ -576,7 +589,7 @@ module Spree
576
589
  update_column(:considered_risky, false)
577
590
  end
578
591
 
579
- def reload(options=nil)
592
+ def reload(options = nil)
580
593
  remove_instance_variable(:@tax_zone) if defined?(@tax_zone)
581
594
  super
582
595
  end
@@ -604,36 +617,20 @@ module Spree
604
617
  end
605
618
  alias_method :fully_discounted, :fully_discounted?
606
619
 
607
- def payments_attributes=(attributes)
608
- validate_payments_attributes(attributes)
609
- super(attributes)
610
- end
611
-
612
- def validate_payments_attributes(attributes)
613
- # Ensure the payment methods specified are allowed for this user
614
- payment_methods = Spree::PaymentMethod.where(id: available_payment_methods.map(&:id))
615
- attributes.each do |payment_attributes|
616
- payment_method_id = payment_attributes[:payment_method_id]
617
-
618
- # raise RecordNotFound unless it is an allowed payment method
619
- payment_methods.find(payment_method_id) if payment_method_id
620
- end
621
- end
622
-
623
620
  private
624
621
 
625
622
  def link_by_email
626
- self.email = user.email if self.user
623
+ self.email = user.email if user
627
624
  end
628
625
 
629
626
  # Determine if email is required (we don't want validation errors before we hit the checkout)
630
627
  def require_email
631
- true unless new_record? or ['cart', 'address'].include?(state)
628
+ true unless new_record? || ['cart', 'address'].include?(state)
632
629
  end
633
630
 
634
631
  def ensure_line_items_present
635
632
  unless line_items.present?
636
- errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) and return false
633
+ errors.add(:base, Spree.t(:there_are_no_items_for_this_order)) && (return false)
637
634
  end
638
635
  end
639
636
 
@@ -642,19 +639,19 @@ module Spree
642
639
  # After this point, order redirects back to 'address' state and asks user to pick a proper address
643
640
  # Therefore, shipments are not necessary at this point.
644
641
  shipments.destroy_all
645
- errors.add(:base, Spree.t(:items_cannot_be_shipped)) and return false
642
+ errors.add(:base, Spree.t(:items_cannot_be_shipped)) && (return false)
646
643
  end
647
644
  end
648
645
 
649
646
  def after_cancel
650
- shipments.each { |shipment| shipment.cancel! }
651
- payments.completed.each { |payment| payment.cancel! }
647
+ shipments.each(&:cancel!)
648
+ payments.completed.each(&:cancel!)
652
649
 
653
650
  # Free up authorized store credits
654
651
  payments.store_credits.pending.each(&:void!)
655
652
 
656
653
  send_cancel_email
657
- self.update_with_updater!
654
+ update_with_updater!
658
655
  end
659
656
 
660
657
  def send_cancel_email
@@ -662,7 +659,7 @@ module Spree
662
659
  end
663
660
 
664
661
  def after_resume
665
- shipments.each { |shipment| shipment.resume! }
662
+ shipments.each(&:resume!)
666
663
  consider_risk
667
664
  end
668
665
 
@@ -681,5 +678,9 @@ module Spree
681
678
  def collect_payment_methods
682
679
  PaymentMethod.available_on_front_end.select { |pm| pm.available_for_order?(self) }
683
680
  end
681
+
682
+ def credit_card_nil_payment?(attributes)
683
+ payments.store_credits.present? && attributes[:amount].to_f.zero?
684
+ end
684
685
  end
685
686
  end
@@ -15,12 +15,9 @@ module Spree
15
15
  self.removed_transitions ||= []
16
16
 
17
17
  def self.checkout_flow(&block)
18
- if block_given?
19
- @checkout_flow = block
20
- define_state_machine!
21
- else
22
- @checkout_flow
23
- end
18
+ return @checkout_flow unless block_given?
19
+ @checkout_flow = block
20
+ define_state_machine!
24
21
  end
25
22
 
26
23
  def self.define_state_machine!
@@ -46,7 +43,6 @@ module Spree
46
43
 
47
44
  # Persist the state on the order
48
45
  after_transition do |order, transition|
49
- order.state = order.state
50
46
  order.state_changes.create(
51
47
  previous_state: transition.from,
52
48
  next_state: transition.to,
@@ -62,7 +58,7 @@ module Spree
62
58
 
63
59
  event :return do
64
60
  transition to: :returned,
65
- from: [:complete, :awaiting_return, :canceled, :returned, :resumed],
61
+ from: [:complete, :awaiting_return, :canceled, :resumed],
66
62
  if: :all_inventory_units_returned?
67
63
  end
68
64
 
@@ -125,14 +121,9 @@ module Spree
125
121
 
126
122
  def self.go_to_state(name, options = {})
127
123
  self.checkout_steps[name] = options
128
- previous_states.each do |state|
129
- add_transition({ from: state, to: name }.merge(options))
130
- end
131
- if options[:if]
132
- previous_states << name
133
- else
134
- self.previous_states = [name]
135
- end
124
+ self.previous_states.each { |state| add_transition({ from: state, to: name }.merge(options)) }
125
+ return self.previous_states << name if options[:if]
126
+ self.previous_states = [name]
136
127
  end
137
128
 
138
129
  def self.insert_checkout_step(name, options = {})
@@ -226,7 +217,11 @@ module Spree
226
217
  # rails would slice parameters containg ruby objects, apparently
227
218
  existing_card_id = @updating_params[:order] ? @updating_params[:order].delete(:existing_card) : nil
228
219
 
229
- attributes = @updating_params[:order] ? @updating_params[:order].permit(permitted_params).delete_if { |_k, v| v.nil? } : {}
220
+ attributes = if @updating_params[:order]
221
+ @updating_params[:order].permit(permitted_params).delete_if { |_k, v| v.nil? }
222
+ else
223
+ {}
224
+ end
230
225
 
231
226
  if existing_card_id.present?
232
227
  credit_card = CreditCard.find existing_card_id
@@ -263,34 +258,29 @@ module Spree
263
258
  end
264
259
 
265
260
  def clone_billing
266
- if !bill_address_id && user.bill_address.try(:valid?)
267
- self.bill_address = user.bill_address.try(:clone)
268
- end
261
+ return unless !bill_address_id && user.bill_address.try(:valid?)
262
+ self.bill_address = user.bill_address.try(:clone)
269
263
  end
270
264
 
271
265
  def clone_shipping
272
- if !ship_address_id && user.ship_address.try(:valid?)
273
- self.ship_address = user.ship_address.try(:clone)
274
- end
266
+ return unless !ship_address_id && user.ship_address.try(:valid?)
267
+ self.ship_address = user.ship_address.try(:clone)
275
268
  end
276
269
 
277
270
  def persist_user_address!
278
- if !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id
279
- user.persist_order_address(self)
280
- end
271
+ return unless !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id
272
+ user.persist_order_address(self)
281
273
  end
282
274
 
283
275
  def persist_user_credit_card
284
- if !temporary_credit_card && user_id && valid_credit_cards.present?
285
- valid_credit_cards.first.update(user_id: user_id, default: true)
286
- end
276
+ return unless !temporary_credit_card && user_id && valid_credit_cards.present?
277
+ valid_credit_cards.first.update(user_id: user_id, default: true)
287
278
  end
288
279
 
289
280
  def assign_default_credit_card
290
- if payments.from_credit_card.size == 0 && user_has_valid_default_card? && payment_required?
291
- cc = user.default_credit_card
292
- payments.create!(payment_method_id: cc.payment_method_id, source: cc, amount: total)
293
- end
281
+ return unless payments.from_credit_card.size.empty? && user_has_valid_default_card? && payment_required?
282
+ cc = user.default_credit_card
283
+ payments.create!(payment_method_id: cc.payment_method_id, source: cc, amount: total)
294
284
  end
295
285
 
296
286
  def user_has_valid_default_card?