solidus_core 1.2.3 → 1.3.0.beta1

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 (573) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/Rakefile +1 -1
  4. data/app/assets/javascripts/spree.js.coffee.erb +1 -1
  5. data/app/helpers/spree/base_helper.rb +21 -43
  6. data/app/helpers/spree/orders_helper.rb +0 -1
  7. data/app/helpers/spree/products_helper.rb +10 -12
  8. data/app/helpers/spree/taxons_helper.rb +4 -4
  9. data/app/mailers/spree/base_mailer.rb +1 -3
  10. data/app/mailers/spree/carton_mailer.rb +2 -2
  11. data/app/mailers/spree/order_mailer.rb +2 -2
  12. data/app/models/concerns/spree/adjustment_source.rb +12 -16
  13. data/app/models/concerns/spree/calculated_adjustments.rb +17 -14
  14. data/app/models/concerns/spree/default_price.rb +10 -26
  15. data/app/models/concerns/spree/display_money.rb +1 -1
  16. data/app/models/concerns/spree/ordered_property_value_list.rb +10 -12
  17. data/app/models/concerns/spree/ransackable_attributes.rb +6 -5
  18. data/app/models/concerns/spree/user_address_book.rb +87 -81
  19. data/app/models/concerns/spree/user_methods.rb +2 -2
  20. data/app/models/concerns/spree/user_payment_source.rb +12 -8
  21. data/app/models/spree/ability.rb +2 -2
  22. data/app/models/spree/address.rb +37 -38
  23. data/app/models/spree/adjustment.rb +2 -6
  24. data/app/models/spree/app_configuration.rb +60 -5
  25. data/app/models/spree/base.rb +1 -1
  26. data/app/models/spree/calculator/default_tax.rb +28 -24
  27. data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
  28. data/app/models/spree/calculator/flat_rate.rb +2 -2
  29. data/app/models/spree/calculator/flexi_rate.rb +4 -4
  30. data/app/models/spree/calculator/percent_per_item.rb +8 -9
  31. data/app/models/spree/calculator/price_sack.rb +3 -3
  32. data/app/models/spree/calculator/returns/default_refund_amount.rb +11 -12
  33. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
  34. data/app/models/spree/calculator/shipping/flat_rate.rb +2 -2
  35. data/app/models/spree/calculator/shipping/flexi_rate.rb +3 -3
  36. data/app/models/spree/calculator/shipping/per_item.rb +1 -1
  37. data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
  38. data/app/models/spree/calculator/tiered_flat_rate.rb +2 -1
  39. data/app/models/spree/calculator/tiered_percent.rb +2 -1
  40. data/app/models/spree/calculator.rb +3 -3
  41. data/app/models/spree/carton.rb +2 -2
  42. data/app/models/spree/country.rb +7 -4
  43. data/app/models/spree/credit_card.rb +26 -22
  44. data/app/models/spree/customer_return.rb +8 -7
  45. data/app/models/spree/exchange.rb +1 -9
  46. data/app/models/spree/gateway/bogus.rb +31 -31
  47. data/app/models/spree/gateway/bogus_simple.rb +6 -8
  48. data/app/models/spree/gateway.rb +9 -15
  49. data/app/models/spree/image.rb +3 -3
  50. data/app/models/spree/inventory_unit.rb +23 -23
  51. data/app/models/spree/item_adjustments.rb +3 -2
  52. data/app/models/spree/legacy_user.rb +1 -5
  53. data/app/models/spree/line_item.rb +95 -84
  54. data/app/models/spree/option_type.rb +1 -1
  55. data/app/models/spree/option_value.rb +3 -1
  56. data/app/models/spree/order/checkout.rb +45 -44
  57. data/app/models/spree/order/payments.rb +42 -45
  58. data/app/models/spree/order.rb +70 -75
  59. data/app/models/spree/order_cancellations.rb +4 -4
  60. data/app/models/spree/order_capturing.rb +3 -2
  61. data/app/models/spree/order_contents.rb +61 -59
  62. data/app/models/spree/order_inventory.rb +59 -54
  63. data/app/models/spree/order_mutex.rb +0 -1
  64. data/app/models/spree/order_shipping.rb +8 -9
  65. data/app/models/spree/order_stock_location.rb +3 -3
  66. data/app/models/spree/order_update_attributes.rb +0 -2
  67. data/app/models/spree/order_updater.rb +11 -24
  68. data/app/models/spree/payment/processing.rb +26 -37
  69. data/app/models/spree/payment.rb +68 -71
  70. data/app/models/spree/payment_method/check.rb +2 -2
  71. data/app/models/spree/payment_method/store_credit.rb +6 -7
  72. data/app/models/spree/payment_method.rb +11 -8
  73. data/app/models/spree/preferences/configuration.rb +2 -2
  74. data/app/models/spree/preferences/preferable.rb +1 -1
  75. data/app/models/spree/preferences/preferable_class_methods.rb +1 -1
  76. data/app/models/spree/preferences/scoped_store.rb +6 -5
  77. data/app/models/spree/preferences/static_model_preferences.rb +1 -1
  78. data/app/models/spree/preferences/statically_configurable.rb +2 -2
  79. data/app/models/spree/preferences/store.rb +2 -6
  80. data/app/models/spree/price.rb +17 -19
  81. data/app/models/spree/product/scopes.rb +18 -17
  82. data/app/models/spree/product.rb +28 -11
  83. data/app/models/spree/product_property.rb +2 -0
  84. data/app/models/spree/product_scope/scopes.rb +22 -22
  85. data/app/models/spree/promotion/actions/create_adjustment.rb +3 -4
  86. data/app/models/spree/promotion/actions/create_item_adjustments.rb +8 -8
  87. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +3 -3
  88. data/app/models/spree/promotion/actions/free_shipping.rb +4 -4
  89. data/app/models/spree/promotion/rules/first_order.rb +7 -6
  90. data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +2 -3
  91. data/app/models/spree/promotion/rules/item_total.rb +5 -2
  92. data/app/models/spree/promotion/rules/nth_order.rb +3 -4
  93. data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
  94. data/app/models/spree/promotion/rules/option_value.rb +1 -2
  95. data/app/models/spree/promotion/rules/product.rb +4 -4
  96. data/app/models/spree/promotion/rules/taxon.rb +5 -5
  97. data/app/models/spree/promotion/rules/user.rb +1 -1
  98. data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
  99. data/app/models/spree/promotion.rb +8 -8
  100. data/app/models/spree/promotion_action.rb +1 -1
  101. data/app/models/spree/promotion_builder.rb +2 -2
  102. data/app/models/spree/promotion_chooser.rb +1 -0
  103. data/app/models/spree/promotion_code/code_builder.rb +3 -3
  104. data/app/models/spree/promotion_handler/cart.rb +17 -16
  105. data/app/models/spree/promotion_handler/coupon.rb +10 -14
  106. data/app/models/spree/promotion_handler/page.rb +4 -4
  107. data/app/models/spree/promotion_rule.rb +4 -3
  108. data/app/models/spree/prototype.rb +0 -1
  109. data/app/models/spree/refund.rb +3 -3
  110. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
  111. data/app/models/spree/reimbursement.rb +3 -5
  112. data/app/models/spree/reimbursement_performer.rb +0 -5
  113. data/app/models/spree/reimbursement_tax_calculator.rb +2 -7
  114. data/app/models/spree/reimbursement_type/credit.rb +1 -1
  115. data/app/models/spree/reimbursement_type/original_payment.rb +1 -1
  116. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +3 -3
  117. data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
  118. data/app/models/spree/reimbursement_type.rb +1 -1
  119. data/app/models/spree/return_authorization.rb +38 -37
  120. data/app/models/spree/return_item/eligibility_validator/default.rb +4 -4
  121. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +0 -1
  122. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +0 -1
  123. data/app/models/spree/return_item.rb +24 -23
  124. data/app/models/spree/returns_calculator.rb +1 -2
  125. data/app/models/spree/shipment.rb +80 -74
  126. data/app/models/spree/shipping_calculator.rb +4 -5
  127. data/app/models/spree/shipping_manifest.rb +3 -4
  128. data/app/models/spree/shipping_method.rb +54 -23
  129. data/app/models/spree/shipping_method_stock_location.rb +4 -0
  130. data/app/models/spree/shipping_rate.rb +24 -29
  131. data/app/models/spree/shipping_rate_tax.rb +41 -0
  132. data/app/models/spree/state.rb +1 -1
  133. data/app/models/spree/state_change.rb +1 -1
  134. data/app/models/spree/stock/availability_validator.rb +2 -2
  135. data/app/models/spree/stock/coordinator.rb +12 -13
  136. data/app/models/spree/stock/differentiator.rb +1 -0
  137. data/app/models/spree/stock/estimator.rb +18 -25
  138. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  139. data/app/models/spree/stock/package.rb +19 -9
  140. data/app/models/spree/stock/packer.rb +2 -3
  141. data/app/models/spree/stock/prioritizer.rb +3 -2
  142. data/app/models/spree/stock/quantifier.rb +2 -3
  143. data/app/models/spree/stock/shipping_rate_selector.rb +0 -1
  144. data/app/models/spree/stock/shipping_rate_sorter.rb +0 -1
  145. data/app/models/spree/stock/splitter/backordered.rb +0 -2
  146. data/app/models/spree/stock/splitter/base.rb +3 -2
  147. data/app/models/spree/stock/splitter/shipping_category.rb +2 -1
  148. data/app/models/spree/stock/splitter/weight.rb +2 -2
  149. data/app/models/spree/stock_item.rb +36 -37
  150. data/app/models/spree/stock_location.rb +17 -13
  151. data/app/models/spree/stock_movement.rb +1 -3
  152. data/app/models/spree/stock_transfer.rb +8 -8
  153. data/app/models/spree/store.rb +6 -0
  154. data/app/models/spree/store_credit.rb +24 -24
  155. data/app/models/spree/store_credit_category.rb +1 -2
  156. data/app/models/spree/tax/item_adjuster.rb +37 -0
  157. data/app/models/spree/tax/order_adjuster.rb +38 -0
  158. data/app/models/spree/tax/shipping_rate_taxer.rb +31 -0
  159. data/app/models/spree/tax/tax_helpers.rb +49 -0
  160. data/app/models/spree/tax/tax_location.rb +33 -0
  161. data/app/models/spree/tax_category.rb +1 -1
  162. data/app/models/spree/tax_rate.rb +46 -111
  163. data/app/models/spree/taxon.rb +36 -12
  164. data/app/models/spree/taxonomy.rb +10 -10
  165. data/app/models/spree/validations/db_maximum_length_validator.rb +0 -1
  166. data/app/models/spree/variant/pricer.rb +19 -0
  167. data/app/models/spree/variant/pricing_options.rb +31 -0
  168. data/app/models/spree/variant/scopes.rb +9 -9
  169. data/app/models/spree/variant.rb +95 -89
  170. data/app/models/spree/variant_property_rule.rb +1 -1
  171. data/app/models/spree/variant_property_rule_value.rb +2 -0
  172. data/app/models/spree/zone.rb +60 -24
  173. data/config/initializers/friendly_id.rb +1 -1
  174. data/config/locales/en.yml +337 -51
  175. data/config/routes.rb +1 -1
  176. data/db/default/spree/countries.rb +9 -15
  177. data/db/default/spree/roles.rb +1 -2
  178. data/db/default/spree/states.rb +7 -11
  179. data/db/default/spree/store_credit.rb +2 -2
  180. data/db/default/spree/stores.rb +2 -1
  181. data/db/migrate/20120831092320_spree_one_two.rb +100 -101
  182. data/db/migrate/20120831092359_spree_promo_one_two.rb +12 -12
  183. data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +1 -1
  184. data/db/migrate/20121009142519_add_lock_version_to_variant.rb +1 -1
  185. data/db/migrate/20121010142909_add_states_required_to_countries.rb +1 -1
  186. data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +2 -2
  187. data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +4 -4
  188. data/db/migrate/20121031162139_split_prices_from_variants.rb +8 -8
  189. data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +2 -2
  190. data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +1 -1
  191. data/db/migrate/20121124203911_add_position_to_taxonomies.rb +1 -1
  192. data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +1 -2
  193. data/db/migrate/20130211190146_create_spree_stock_items.rb +1 -1
  194. data/db/migrate/20130213191427_create_default_stock.rb +12 -21
  195. data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +1 -1
  196. data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +2 -2
  197. data/db/migrate/20130228210442_create_shipping_method_zone.rb +1 -1
  198. data/db/migrate/20130301162924_create_shipping_method_categories.rb +2 -2
  199. data/db/migrate/20130304162240_create_spree_shipping_rates.rb +4 -4
  200. data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +2 -3
  201. data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +1 -1
  202. data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +1 -1
  203. data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +1 -1
  204. data/db/migrate/20130319062004_change_orders_total_precision.rb +4 -4
  205. data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +1 -3
  206. data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -4
  207. data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +1 -3
  208. data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +2 -2
  209. data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +2 -2
  210. data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
  211. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +3 -3
  212. data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +1 -1
  213. data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +3 -3
  214. data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +1 -1
  215. data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +2 -2
  216. data/db/migrate/20130807024301_upgrade_adjustments.rb +3 -3
  217. data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +1 -1
  218. data/db/migrate/20130813140619_expand_order_number_size.rb +2 -2
  219. data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +1 -1
  220. data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +1 -1
  221. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
  222. data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +1 -1
  223. data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
  224. data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +1 -0
  225. data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +1 -1
  226. data/db/migrate/20131118043959_add_included_to_adjustments.rb +1 -1
  227. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +0 -1
  228. data/db/migrate/20131211112807_create_spree_orders_promotions.rb +1 -1
  229. data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +1 -1
  230. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -0
  231. data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +1 -1
  232. data/db/migrate/20140309023735_migrate_old_preferences.rb +4 -3
  233. data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
  234. data/db/migrate/20140410141842_add_many_missing_indexes.rb +13 -15
  235. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +38 -40
  236. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +4 -4
  237. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
  238. data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +0 -1
  239. data/db/migrate/20140718195325_create_friendly_id_slugs.rb +4 -4
  240. data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +4 -6
  241. data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -0
  242. data/db/migrate/20141217215630_update_product_slug_index.rb +2 -4
  243. data/db/migrate/20150112194216_add_position_to_stock_location.rb +2 -2
  244. data/db/migrate/20150225205344_move_promotion_code_to_promotion_code_value.rb +0 -1
  245. data/db/migrate/20150313201503_copy_shipped_shipments_to_cartons.rb +0 -1
  246. data/db/migrate/20150506181611_create_spree_store_credit_payment_method.rb +3 -3
  247. data/db/migrate/20150515211137_fix_adjustment_order_id.rb +0 -1
  248. data/db/migrate/20150612205731_remove_spree_configurations.rb +2 -2
  249. data/db/migrate/20150619160613_create_adjustment_reason.rb +1 -1
  250. data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +10 -2
  251. data/db/migrate/20150731201146_add_spree_user_addresses.rb +0 -1
  252. data/db/migrate/20150811211025_add_finalized_to_spree_adjustments.rb +1 -1
  253. data/db/migrate/20151001121454_create_spree_shipping_method_stock_locations.rb +13 -0
  254. data/db/migrate/20151002023248_add_foreign_key_to_shipping_method_stock_location.rb +6 -0
  255. data/db/migrate/20151026093607_change_return_item_pre_tax_amount_to_amount.rb +29 -0
  256. data/db/migrate/20160111091912_add_column_available_to_all_on_spree_shipping_method.rb +5 -0
  257. data/db/migrate/20160116133604_add_position_to_spree_payment_methods.rb +5 -0
  258. data/db/migrate/20160122182105_add_carrier_and_service_level_to_spree_shipping_methods.rb +6 -0
  259. data/db/migrate/20160224201413_create_spree_shipping_rate_taxes.rb +11 -0
  260. data/db/migrate/20160229133259_add_cart_tax_country_iso_to_spree_store.rb +5 -0
  261. data/db/migrate/20160301103333_remove_pre_tax_amount_on_line_item_and_shipment.rb +6 -0
  262. data/db/migrate/20160308000300_disallow_adjustment_finalized_nulls.rb +19 -0
  263. data/db/migrate/20160318145302_add_timestamps_to_prices.rb +5 -0
  264. data/db/migrate/20160330204846_add_missing_timestamp_columns.rb +20 -0
  265. data/lib/generators/spree/custom_user/custom_user_generator.rb +3 -8
  266. data/lib/generators/spree/dummy/dummy_generator.rb +17 -19
  267. data/lib/generators/spree/install/install_generator.rb +15 -15
  268. data/lib/generators/spree/install/templates/config/initializers/spree.rb +1 -0
  269. data/lib/spree/core/controller_helpers/auth.rb +2 -4
  270. data/lib/spree/core/controller_helpers/common.rb +42 -43
  271. data/lib/spree/core/controller_helpers/order.rb +5 -9
  272. data/lib/spree/core/controller_helpers/payment_parameters.rb +4 -5
  273. data/lib/spree/core/controller_helpers/pricing.rb +27 -0
  274. data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
  275. data/lib/spree/core/controller_helpers/search.rb +2 -2
  276. data/lib/spree/core/controller_helpers/store.rb +3 -3
  277. data/lib/spree/core/controller_helpers/strong_parameters.rb +4 -4
  278. data/lib/spree/core/current_store.rb +1 -1
  279. data/lib/spree/core/delegate_belongs_to.rb +19 -21
  280. data/lib/spree/core/engine.rb +12 -8
  281. data/lib/spree/core/environment/calculators.rb +0 -1
  282. data/lib/spree/core/environment_extension.rb +4 -4
  283. data/lib/spree/core/importer/order.rb +17 -22
  284. data/lib/spree/core/importer/product.rb +10 -9
  285. data/lib/spree/core/permalinks.rb +16 -16
  286. data/lib/spree/core/product_duplicator.rb +2 -3
  287. data/lib/spree/core/product_filters.rb +15 -16
  288. data/lib/spree/core/role_configuration.rb +2 -2
  289. data/lib/spree/core/search/base.rb +71 -57
  290. data/lib/spree/core/search/variant.rb +2 -4
  291. data/lib/spree/core/unreturned_item_charger.rb +1 -2
  292. data/lib/spree/core/validators/email.rb +2 -2
  293. data/lib/spree/core/version.rb +1 -1
  294. data/lib/spree/core.rb +2 -4
  295. data/lib/spree/i18n.rb +1 -1
  296. data/lib/spree/localized_number.rb +3 -1
  297. data/lib/spree/migrations.rb +27 -26
  298. data/lib/spree/money.rb +19 -4
  299. data/lib/spree/permission_sets/base.rb +1 -1
  300. data/lib/spree/permitted_attributes.rb +7 -7
  301. data/lib/spree/responder.rb +4 -5
  302. data/lib/spree/testing_support/authorization_helpers.rb +1 -1
  303. data/lib/spree/testing_support/caching.rb +8 -8
  304. data/lib/spree/testing_support/capybara_ext.rb +11 -13
  305. data/lib/spree/testing_support/common_rake.rb +4 -4
  306. data/lib/spree/testing_support/controller_requests.rb +1 -1
  307. data/lib/spree/testing_support/extension_rake.rb +1 -2
  308. data/lib/spree/testing_support/factories/address_factory.rb +14 -3
  309. data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
  310. data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
  311. data/lib/spree/testing_support/factories/credit_card_factory.rb +4 -0
  312. data/lib/spree/testing_support/factories/customer_return_factory.rb +4 -6
  313. data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
  314. data/lib/spree/testing_support/factories/order_factory.rb +10 -11
  315. data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
  316. data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -1
  317. data/lib/spree/testing_support/factories/promotion_factory.rb +0 -1
  318. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  319. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
  320. data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
  321. data/lib/spree/testing_support/factories/shipping_method_factory.rb +5 -2
  322. data/lib/spree/testing_support/factories/state_factory.rb +17 -7
  323. data/lib/spree/testing_support/factories/stock_location_factory.rb +4 -4
  324. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +1 -1
  325. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -1
  326. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -2
  327. data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
  328. data/lib/spree/testing_support/factories/user_factory.rb +1 -1
  329. data/lib/spree/testing_support/factories/variant_factory.rb +1 -2
  330. data/lib/spree/testing_support/factories/zone_factory.rb +2 -1
  331. data/lib/spree/testing_support/i18n.rb +4 -5
  332. data/lib/spree/testing_support/order_walkthrough.rb +8 -9
  333. data/lib/spree/testing_support/preferences.rb +1 -1
  334. data/lib/spree/testing_support/sequences.rb +5 -4
  335. data/lib/tasks/core.rake +15 -19
  336. data/lib/tasks/email.rake +3 -3
  337. data/lib/tasks/exchanges.rake +12 -14
  338. data/lib/tasks/migrations/assure_store_on_orders.rake +38 -0
  339. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +2 -2
  340. data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +1 -11
  341. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +17 -0
  342. data/lib/tasks/migrations/migrate_user_addresses.rake +1 -1
  343. data/lib/tasks/order_capturing.rake +1 -1
  344. data/lib/tasks/upgrade.rake +11 -0
  345. data/script/rails +0 -1
  346. data/solidus_core.gemspec +6 -8
  347. data/spec/helpers/base_helper_spec.rb +15 -18
  348. data/spec/helpers/order_helper_spec.rb +2 -2
  349. data/spec/helpers/products_helper_spec.rb +43 -51
  350. data/spec/helpers/taxons_helper_spec.rb +1 -1
  351. data/spec/lib/i18n_spec.rb +11 -11
  352. data/spec/lib/search/base_spec.rb +12 -14
  353. data/spec/lib/search/variant_spec.rb +1 -0
  354. data/spec/lib/spree/core/controller_helpers/order_spec.rb +1 -7
  355. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +26 -28
  356. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +63 -0
  357. data/spec/lib/spree/core/controller_helpers/search_spec.rb +4 -2
  358. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +1 -1
  359. data/spec/lib/spree/core/importer/order_spec.rb +95 -90
  360. data/spec/lib/spree/core/role_configuration_spec.rb +16 -16
  361. data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +35 -0
  362. data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +10 -1
  363. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -1
  364. data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +6 -1
  365. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +37 -1
  366. data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +2 -2
  367. data/spec/lib/spree/core/testing_support/factories/stock_packer_factory_spec.rb +1 -1
  368. data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +1 -2
  369. data/spec/lib/spree/core/testing_support/preferences_spec.rb +26 -0
  370. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +7 -9
  371. data/spec/lib/spree/core/validators/email_spec.rb +8 -6
  372. data/spec/lib/spree/localized_number_spec.rb +1 -3
  373. data/spec/lib/spree/migrations_spec.rb +2 -2
  374. data/spec/lib/spree/money_spec.rb +75 -6
  375. data/spec/lib/tasks/exchanges_spec.rb +2 -12
  376. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +0 -1
  377. data/spec/lib/tasks/order_capturing_spec.rb +1 -1
  378. data/spec/mailers/carton_mailer_spec.rb +3 -3
  379. data/spec/mailers/order_mailer_spec.rb +9 -11
  380. data/spec/mailers/reimbursement_mailer_spec.rb +2 -2
  381. data/spec/mailers/test_mailer_spec.rb +1 -1
  382. data/spec/models/spree/ability_spec.rb +4 -7
  383. data/spec/models/spree/address_spec.rb +32 -35
  384. data/spec/models/spree/adjustment_reason_spec.rb +0 -2
  385. data/spec/models/spree/adjustment_spec.rb +2 -2
  386. data/spec/models/spree/app_configuration_spec.rb +33 -3
  387. data/spec/models/spree/asset_spec.rb +1 -2
  388. data/spec/models/spree/calculator/default_tax_spec.rb +141 -52
  389. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +1 -1
  390. data/spec/models/spree/calculator/flexi_rate_spec.rb +6 -6
  391. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +1 -1
  392. data/spec/models/spree/calculator/price_sack_spec.rb +2 -2
  393. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +9 -11
  394. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +4 -4
  395. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +2 -2
  396. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +6 -7
  397. data/spec/models/spree/calculator/shipping/per_item_spec.rb +2 -2
  398. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +2 -2
  399. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +1 -2
  400. data/spec/models/spree/calculator/tiered_percent_spec.rb +1 -1
  401. data/spec/models/spree/calculator_spec.rb +3 -8
  402. data/spec/models/spree/carton_spec.rb +1 -1
  403. data/spec/models/spree/classification_spec.rb +1 -1
  404. data/spec/models/spree/concerns/display_money_spec.rb +0 -1
  405. data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +26 -1
  406. data/spec/models/spree/concerns/user_address_book_spec.rb +19 -12
  407. data/spec/models/spree/concerns/user_methods_spec.rb +1 -1
  408. data/spec/models/spree/country_spec.rb +52 -0
  409. data/spec/models/spree/credit_card_spec.rb +17 -12
  410. data/spec/models/spree/customer_return_spec.rb +27 -23
  411. data/spec/models/spree/exchange_spec.rb +2 -7
  412. data/spec/models/spree/gateway/bogus_simple.rb +2 -4
  413. data/spec/models/spree/gateway/bogus_spec.rb +4 -2
  414. data/spec/models/spree/gateway_spec.rb +8 -3
  415. data/spec/models/spree/inventory_unit_spec.rb +13 -14
  416. data/spec/models/spree/item_adjustments_spec.rb +36 -40
  417. data/spec/models/spree/line_item_spec.rb +92 -48
  418. data/spec/models/spree/option_type_spec.rb +1 -1
  419. data/spec/models/spree/option_value_spec.rb +1 -1
  420. data/spec/models/spree/order/address_spec.rb +1 -1
  421. data/spec/models/spree/order/callbacks_spec.rb +3 -3
  422. data/spec/models/spree/order/checkout_spec.rb +55 -48
  423. data/spec/models/spree/order/finalizing_spec.rb +8 -9
  424. data/spec/models/spree/order/payment_spec.rb +20 -20
  425. data/spec/models/spree/order/risk_assessment_spec.rb +1 -1
  426. data/spec/models/spree/order/state_machine_spec.rb +40 -131
  427. data/spec/models/spree/order/tax_spec.rb +11 -12
  428. data/spec/models/spree/order/totals_spec.rb +3 -3
  429. data/spec/models/spree/order/updating_spec.rb +2 -2
  430. data/spec/models/spree/order/validations_spec.rb +2 -2
  431. data/spec/models/spree/order_cancellations_spec.rb +1 -1
  432. data/spec/models/spree/order_capturing_spec.rb +1 -1
  433. data/spec/models/spree/order_contents_spec.rb +10 -11
  434. data/spec/models/spree/order_inventory_spec.rb +11 -11
  435. data/spec/models/spree/order_merger_spec.rb +1 -0
  436. data/spec/models/spree/order_shipping_spec.rb +8 -10
  437. data/spec/models/spree/order_spec.rb +137 -124
  438. data/spec/models/spree/order_stock_location_spec.rb +2 -2
  439. data/spec/models/spree/order_update_attributes_spec.rb +6 -10
  440. data/spec/models/spree/order_updater_spec.rb +4 -8
  441. data/spec/models/spree/payment_create_spec.rb +11 -12
  442. data/spec/models/spree/payment_method/store_credit_spec.rb +10 -6
  443. data/spec/models/spree/payment_method_spec.rb +4 -5
  444. data/spec/models/spree/payment_spec.rb +61 -69
  445. data/spec/models/spree/permission_sets/base_spec.rb +1 -1
  446. data/spec/models/spree/permission_sets/configuration_display.rb +0 -1
  447. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -1
  448. data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -1
  449. data/spec/models/spree/permission_sets/order_display_spec.rb +0 -1
  450. data/spec/models/spree/permission_sets/order_management_spec.rb +0 -1
  451. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -1
  452. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -1
  453. data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -1
  454. data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -1
  455. data/spec/models/spree/permission_sets/report_display_spec.rb +0 -1
  456. data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -1
  457. data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -1
  458. data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +0 -1
  459. data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +6 -6
  460. data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -1
  461. data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -1
  462. data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +0 -1
  463. data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +0 -2
  464. data/spec/models/spree/permission_sets/user_display_spec.rb +0 -1
  465. data/spec/models/spree/permission_sets/user_management_spec.rb +0 -1
  466. data/spec/models/spree/preference_spec.rb +1 -4
  467. data/spec/models/spree/preferences/configuration_spec.rb +2 -7
  468. data/spec/models/spree/preferences/preferable_spec.rb +13 -24
  469. data/spec/models/spree/preferences/scoped_store_spec.rb +1 -1
  470. data/spec/models/spree/preferences/static_model_preferences_spec.rb +5 -6
  471. data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -6
  472. data/spec/models/spree/preferences/store_spec.rb +2 -3
  473. data/spec/models/spree/price_spec.rb +6 -6
  474. data/spec/models/spree/product/scopes_spec.rb +20 -20
  475. data/spec/models/spree/product_duplicator_spec.rb +16 -29
  476. data/spec/models/spree/product_filter_spec.rb +2 -2
  477. data/spec/models/spree/product_spec.rb +53 -20
  478. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +10 -12
  479. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +4 -4
  480. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +9 -9
  481. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +1 -1
  482. data/spec/models/spree/promotion/rules/first_order_spec.rb +10 -10
  483. data/spec/models/spree/promotion/rules/item_total_spec.rb +63 -19
  484. data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +1 -1
  485. data/spec/models/spree/promotion/rules/product_spec.rb +8 -8
  486. data/spec/models/spree/promotion/rules/taxon_spec.rb +4 -4
  487. data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +3 -4
  488. data/spec/models/spree/promotion/rules/user_spec.rb +7 -7
  489. data/spec/models/spree/promotion_builder_spec.rb +10 -8
  490. data/spec/models/spree/promotion_category_spec.rb +1 -1
  491. data/spec/models/spree/promotion_code/code_builder_spec.rb +1 -3
  492. data/spec/models/spree/promotion_code_spec.rb +8 -7
  493. data/spec/models/spree/promotion_handler/cart_spec.rb +1 -1
  494. data/spec/models/spree/promotion_handler/coupon_spec.rb +28 -28
  495. data/spec/models/spree/promotion_handler/page_spec.rb +6 -7
  496. data/spec/models/spree/promotion_rule_spec.rb +1 -2
  497. data/spec/models/spree/promotion_spec.rb +25 -21
  498. data/spec/models/spree/refund_spec.rb +8 -11
  499. data/spec/models/spree/reimbursement/credit_spec.rb +2 -2
  500. data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +6 -4
  501. data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +1 -1
  502. data/spec/models/spree/reimbursement_performer_spec.rb +2 -2
  503. data/spec/models/spree/reimbursement_spec.rb +9 -11
  504. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +4 -5
  505. data/spec/models/spree/reimbursement_type/credit_spec.rb +2 -2
  506. data/spec/models/spree/reimbursement_type/exchange_spec.rb +2 -3
  507. data/spec/models/spree/reimbursement_type/original_payment_spec.rb +4 -4
  508. data/spec/models/spree/reimbursement_type/store_credit_spec.rb +1 -1
  509. data/spec/models/spree/return_authorization_spec.rb +18 -21
  510. data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +7 -7
  511. data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -1
  512. data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -1
  513. data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +1 -1
  514. data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +1 -1
  515. data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +1 -2
  516. data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +3 -5
  517. data/spec/models/spree/return_item_spec.rb +29 -31
  518. data/spec/models/spree/returns_calculator_spec.rb +1 -1
  519. data/spec/models/spree/shipment_spec.rb +59 -43
  520. data/spec/models/spree/shipping_calculator_spec.rb +3 -3
  521. data/spec/models/spree/shipping_manifest_spec.rb +8 -7
  522. data/spec/models/spree/shipping_method_spec.rb +149 -24
  523. data/spec/models/spree/shipping_rate_spec.rb +116 -76
  524. data/spec/models/spree/shipping_rate_tax_spec.rb +83 -0
  525. data/spec/models/spree/state_spec.rb +2 -2
  526. data/spec/models/spree/stock/availability_validator_spec.rb +4 -4
  527. data/spec/models/spree/stock/coordinator_spec.rb +33 -49
  528. data/spec/models/spree/stock/differentiator_spec.rb +1 -1
  529. data/spec/models/spree/stock/estimator_spec.rb +83 -54
  530. data/spec/models/spree/stock/inventory_unit_builder_spec.rb +1 -3
  531. data/spec/models/spree/stock/package_spec.rb +27 -10
  532. data/spec/models/spree/stock/packer_spec.rb +4 -4
  533. data/spec/models/spree/stock/prioritizer_spec.rb +1 -1
  534. data/spec/models/spree/stock/quantifier_spec.rb +2 -6
  535. data/spec/models/spree/stock/splitter/backordered_spec.rb +1 -1
  536. data/spec/models/spree/stock/splitter/base_spec.rb +1 -2
  537. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +1 -3
  538. data/spec/models/spree/stock/splitter/weight_spec.rb +3 -3
  539. data/spec/models/spree/stock_item_spec.rb +16 -16
  540. data/spec/models/spree/stock_location_spec.rb +6 -8
  541. data/spec/models/spree/stock_movement_spec.rb +1 -1
  542. data/spec/models/spree/stock_transfer_spec.rb +1 -3
  543. data/spec/models/spree/store_credit_category_spec.rb +1 -1
  544. data/spec/models/spree/store_credit_event_spec.rb +3 -5
  545. data/spec/models/spree/store_credit_spec.rb +24 -23
  546. data/spec/models/spree/store_spec.rb +21 -2
  547. data/spec/models/spree/tax/item_adjuster_spec.rb +74 -0
  548. data/spec/models/spree/tax/order_adjuster_spec.rb +49 -0
  549. data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +50 -0
  550. data/spec/models/spree/tax/tax_location_spec.rb +68 -0
  551. data/spec/models/spree/tax/taxation_integration_spec.rb +787 -0
  552. data/spec/models/spree/tax_category_spec.rb +2 -2
  553. data/spec/models/spree/tax_rate_spec.rb +185 -536
  554. data/spec/models/spree/taxon_spec.rb +69 -5
  555. data/spec/models/spree/taxonomy_spec.rb +2 -3
  556. data/spec/models/spree/tracker_spec.rb +1 -1
  557. data/spec/models/spree/transfer_item_spec.rb +1 -1
  558. data/spec/models/spree/unit_cancel_spec.rb +9 -14
  559. data/spec/models/spree/user_spec.rb +19 -24
  560. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +1 -1
  561. data/spec/models/spree/variant/pricer_spec.rb +48 -0
  562. data/spec/models/spree/variant/pricing_options_spec.rb +106 -0
  563. data/spec/models/spree/variant/scopes_spec.rb +31 -8
  564. data/spec/models/spree/variant_property_rule_spec.rb +1 -1
  565. data/spec/models/spree/variant_spec.rb +166 -52
  566. data/spec/models/spree/zone_spec.rb +135 -10
  567. data/spec/support/big_decimal.rb +1 -1
  568. data/spec/support/concerns/working_factories.rb +2 -2
  569. data/spec/support/dummy_ability.rb +0 -1
  570. metadata +55 -44
  571. data/lib/generators/spree/dummy/templates/initializers/devise.rb +0 -3
  572. data/lib/spree/migration_helpers.rb +0 -19
  573. data/vendor/assets/stylesheets/skeleton.css +0 -242
@@ -10,14 +10,14 @@ module Spree
10
10
  path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
11
11
  convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
12
12
  validates_attachment :attachment,
13
- :presence => true,
14
- :content_type => { :content_type => %w(image/jpeg image/jpg image/png image/gif) }
13
+ presence: true,
14
+ content_type: { content_type: %w(image/jpeg image/jpg image/png image/gif) }
15
15
 
16
16
  # save the w,h of the original image (from which others can be calculated)
17
17
  # we need to look at the write-queue for images which have not been saved yet
18
18
  after_post_process :find_dimensions
19
19
 
20
- #used by admin products autocomplete
20
+ # used by admin products autocomplete
21
21
  def mini_url
22
22
  attachment.url(:mini, false)
23
23
  end
@@ -75,7 +75,7 @@ module Spree
75
75
  inventory_units.map do |iu|
76
76
  iu.update_columns(
77
77
  pending: false,
78
- updated_at: Time.current,
78
+ updated_at: Time.current
79
79
  )
80
80
  end
81
81
  end
@@ -113,35 +113,35 @@ module Spree
113
113
  return_items.not_expired.any?(&:exchange_requested?)
114
114
  end
115
115
 
116
+ def allow_ship?
117
+ on_hand?
118
+ end
119
+
116
120
  private
117
121
 
118
- def allow_ship?
119
- self.on_hand?
120
- end
122
+ def fulfill_order
123
+ reload
124
+ order.fulfill!
125
+ end
121
126
 
122
- def fulfill_order
123
- self.reload
124
- order.fulfill!
125
- end
127
+ def percentage_of_line_item
128
+ 1 / BigDecimal.new(line_item.quantity)
129
+ end
126
130
 
127
- def percentage_of_line_item
128
- 1 / BigDecimal.new(line_item.quantity)
129
- end
131
+ def current_return_item
132
+ return_items.not_cancelled.first
133
+ end
130
134
 
131
- def current_return_item
132
- return_items.not_cancelled.first
135
+ def ensure_can_destroy
136
+ if !backordered? && !on_hand?
137
+ errors.add(:state, :cannot_destroy, state: state)
138
+ return false
133
139
  end
134
140
 
135
- def ensure_can_destroy
136
- if !backordered? && !on_hand?
137
- errors.add(:state, :cannot_destroy, state: self.state)
138
- return false
139
- end
140
-
141
- unless shipment.pending?
142
- errors.add(:base, :cannot_destroy_shipment_state, state: shipment.state)
143
- return false
144
- end
141
+ unless shipment.pending?
142
+ errors.add(:base, :cannot_destroy_shipment_state, state: shipment.state)
143
+ return false
145
144
  end
145
+ end
146
146
  end
147
147
  end
@@ -49,7 +49,7 @@ module Spree
49
49
  #
50
50
  # We want to select the best promotion for the order, but the remainder
51
51
  # of the calculations here are done in the OrderUpdater instead.
52
- return if Spree::Order === item
52
+ return if item.is_a?(Spree::Order)
53
53
 
54
54
  @item.promo_total = promo_total
55
55
 
@@ -67,13 +67,14 @@ module Spree
67
67
  included_tax_total: @item.included_tax_total,
68
68
  additional_tax_total: @item.additional_tax_total,
69
69
  adjustment_total: @item.adjustment_total,
70
- updated_at: Time.current,
70
+ updated_at: Time.current
71
71
  ) if @item.changed?
72
72
 
73
73
  @item
74
74
  end
75
75
 
76
76
  private
77
+
77
78
  def adjustments
78
79
  # This is done intentionally to avoid loading the association. If the
79
80
  # association is loaded, the records may become stale due to code
@@ -8,11 +8,6 @@ module Spree
8
8
 
9
9
  self.table_name = 'spree_users'
10
10
 
11
- # for url generation
12
- def self.model_name
13
- ActiveModel::Name.new(self, nil, "User")
14
- end
15
-
16
11
  before_destroy :check_completed_orders
17
12
 
18
13
  def self.model_name
@@ -23,6 +18,7 @@ module Spree
23
18
  attr_accessor :password_confirmation
24
19
 
25
20
  private
21
+
26
22
  def check_completed_orders
27
23
  raise Spree::Core::DestroyWithOrdersError if orders.complete.present?
28
24
  end
@@ -1,6 +1,5 @@
1
1
  module Spree
2
2
  class LineItem < Spree::Base
3
- before_validation :invalid_quantity_check
4
3
  belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items, touch: true
5
4
  belongs_to :variant, -> { with_deleted }, class_name: "Spree::Variant", inverse_of: :line_items
6
5
  belongs_to :tax_category, class_name: "Spree::TaxCategory"
@@ -13,25 +12,24 @@ module Spree
13
12
  has_many :line_item_actions, dependent: :destroy
14
13
  has_many :actions, through: :line_item_actions
15
14
 
16
- before_validation :copy_price
17
- before_validation :copy_tax_category
15
+ before_validation :normalize_quantity
16
+ before_validation :set_required_attributes
18
17
 
19
18
  validates :variant, presence: true
20
19
  validates :quantity, numericality: {
21
20
  only_integer: true,
22
- greater_than: -1,
23
- message: Spree.t('validation.must_be_int')
21
+ greater_than: -1
24
22
  }
25
23
  validates :price, numericality: true
26
-
27
24
  validate :ensure_proper_currency
28
- before_destroy :update_inventory
29
- before_destroy :destroy_inventory_units
25
+
26
+ after_create :update_tax_charge
30
27
 
31
28
  after_save :update_inventory
32
29
  after_save :update_adjustments
33
30
 
34
- after_create :update_tax_charge
31
+ before_destroy :update_inventory
32
+ before_destroy :destroy_inventory_units
35
33
 
36
34
  delegate :name, :description, :sku, :should_track_inventory?, to: :variant
37
35
  # @note This will return the product even if it has been deleted.
@@ -39,30 +37,11 @@ module Spree
39
37
  # item, if there is one
40
38
  delegate :product, to: :variant
41
39
 
42
-
43
40
  attr_accessor :target_shipment
44
41
 
45
42
  self.whitelisted_ransackable_associations = ['variant']
46
43
  self.whitelisted_ransackable_attributes = ['variant_id']
47
44
 
48
- # Sets this line item's price, cost price, and currency from this line
49
- # item's variant if they are nil and a variant is present.
50
- def copy_price
51
- if variant
52
- self.price = variant.price if price.nil?
53
- self.cost_price = variant.cost_price if cost_price.nil?
54
- self.currency = variant.currency if currency.nil?
55
- end
56
- end
57
-
58
- # Sets this line item's tax category from this line item's variant if a
59
- # variant is present.
60
- def copy_tax_category
61
- if variant
62
- self.tax_category = variant.tax_category
63
- end
64
- end
65
-
66
45
  # @return [BigDecimal] the amount of this line item, which is the line
67
46
  # item's price multiplied by its quantity.
68
47
  def amount
@@ -76,12 +55,6 @@ module Spree
76
55
  amount + promo_total
77
56
  end
78
57
 
79
- # @return [Spree::Money] the amount of this line item, taking into
80
- # consideration line item promotions.
81
- def discounted_money
82
- Spree::Money.new(discounted_amount, { currency: currency })
83
- end
84
-
85
58
  # @return [BigDecimal] the amount of this line item, taking into
86
59
  # consideration all its adjustments.
87
60
  def final_amount
@@ -89,22 +62,32 @@ module Spree
89
62
  end
90
63
  alias total final_amount
91
64
 
92
- # @return [Spree::Money] the price of this line item
93
- def single_money
94
- Spree::Money.new(price, { currency: currency })
65
+ # @return [BigDecimal] the amount of this line item before included tax
66
+ # @note just like `amount`, this does not include any additional tax
67
+ def pre_tax_amount
68
+ discounted_amount - included_tax_total
95
69
  end
96
- alias single_display_amount single_money
97
70
 
98
- # @return [Spree::Moeny] the amount of this line item
99
- def money
100
- Spree::Money.new(amount, { currency: currency })
101
- end
102
- alias display_total money
103
- alias display_amount money
71
+ extend Spree::DisplayMoney
72
+ money_methods :amount, :discounted_amount, :final_amount, :pre_tax_amount, :price,
73
+ :included_tax_total, :additional_tax_total
74
+ alias discounted_money display_discounted_amount
104
75
 
105
- # Sets the quantity to zero if it is nil or less than zero.
106
- def invalid_quantity_check
107
- self.quantity = 0 if quantity.nil? || quantity < 0
76
+ # @return [Spree::Money] the price of this line item
77
+ alias money_price display_price
78
+ alias single_display_amount display_price
79
+ alias single_money display_price
80
+
81
+ # @return [Spree::Money] the amount of this line item
82
+ alias money display_amount
83
+ alias display_total display_amount
84
+
85
+ # Sets price and currency from a `Spree::Money` object
86
+ #
87
+ # @param [Spree::Money] money - the money object to obtain price and currency from
88
+ def money_price=(money)
89
+ self.price = money.to_d
90
+ self.currency = money.currency.iso_code
108
91
  end
109
92
 
110
93
  # @return [Boolean] true when it is possible to supply the required
@@ -119,59 +102,87 @@ module Spree
119
102
  !sufficient_stock?
120
103
  end
121
104
 
122
- # Sets the options on the line item according to the order's currency or
123
- # one passed in.
105
+ # Sets options on the line item.
106
+ #
107
+ # The options can be arbitrary attributes on the LineItem.
124
108
  #
125
109
  # @param options [Hash] options for this line item
126
- def options=(options={})
110
+ def options=(options = {})
127
111
  return unless options.present?
112
+ assign_attributes options
113
+ end
128
114
 
129
- opts = options.dup # we will be deleting from the hash, so leave the caller's copy intact
115
+ def pricing_options
116
+ Spree::Config.pricing_options_class.from_line_item(self)
117
+ end
130
118
 
131
- currency = opts.delete(:currency) || order.try(:currency)
119
+ private
132
120
 
133
- if currency
134
- self.currency = currency
135
- self.price = variant.price_in(currency).amount +
136
- variant.price_modifier_amount_in(currency, opts)
137
- else
138
- self.price = variant.price +
139
- variant.price_modifier_amount(opts)
140
- end
121
+ # Sets the quantity to zero if it is nil or less than zero.
122
+ def normalize_quantity
123
+ self.quantity = 0 if quantity.nil? || quantity < 0
124
+ end
141
125
 
142
- self.assign_attributes opts
126
+ # Sets tax category, price-related attributes from
127
+ # its variant if they are nil and a variant is present.
128
+ def set_required_attributes
129
+ return unless variant
130
+ self.tax_category ||= variant.tax_category
131
+ set_pricing_attributes
143
132
  end
144
133
 
145
- private
146
- def update_inventory
147
- if (changed? || target_shipment.present?) && self.order.has_checkout_step?("delivery")
148
- Spree::OrderInventory.new(self.order, self).verify(target_shipment)
149
- end
150
- end
134
+ # Set price, cost_price and currency. This method used to be called #copy_price, but actually
135
+ # did more than just setting the price, hence renamed to #set_pricing_attributes
136
+ def set_pricing_attributes
137
+ # If the legacy method #copy_price has been overridden, handle that gracefully
138
+ return handle_copy_price_override if respond_to?(:copy_price)
151
139
 
152
- def destroy_inventory_units
153
- inventory_units.destroy_all
154
- end
140
+ self.currency ||= order.currency
141
+ self.cost_price ||= variant.cost_price
142
+ self.money_price = variant.price_for(pricing_options) if price.nil?
143
+ true
144
+ end
155
145
 
156
- def update_adjustments
157
- if quantity_changed?
158
- update_tax_charge # Called to ensure pre_tax_amount is updated.
159
- recalculate_adjustments
160
- end
161
- end
146
+ def handle_copy_price_override
147
+ copy_price
148
+ ActiveSupport::Deprecation.warn 'You have overridden Spree::LineItem#copy_price. ' \
149
+ 'This method is now called Spree::LineItem#set_pricing_attributes. ' \
150
+ 'Please adjust your override.',
151
+ caller
152
+ end
162
153
 
163
- def recalculate_adjustments
164
- Spree::ItemAdjustments.new(self).update
154
+ def update_inventory
155
+ if (changed? || target_shipment.present?) && order.has_checkout_step?("delivery")
156
+ Spree::OrderInventory.new(order, self).verify(target_shipment)
165
157
  end
158
+ end
159
+
160
+ def destroy_inventory_units
161
+ inventory_units.destroy_all
162
+ end
166
163
 
167
- def update_tax_charge
168
- Spree::TaxRate.adjust(order.tax_zone, [self])
164
+ def update_adjustments
165
+ if quantity_changed?
166
+ update_tax_charge # Called to ensure pre_tax_amount is updated.
167
+ recalculate_adjustments
169
168
  end
169
+ end
170
+
171
+ def recalculate_adjustments
172
+ Spree::ItemAdjustments.new(self).update
173
+ end
170
174
 
171
- def ensure_proper_currency
172
- unless currency == order.currency
173
- errors.add(:currency, :must_match_order_currency)
174
- end
175
+ def update_tax_charge
176
+ Spree::Tax::ItemAdjuster.new(self).adjust!
177
+ end
178
+
179
+ def ensure_proper_currency
180
+ if currency != order.currency
181
+ Spree::Deprecation.warn "The line items currency is different from it's order currency. " \
182
+ "This behavior is not supported anymore and will be deleted soon.",
183
+ caller
184
+ errors.add(:currency, :must_match_order_currency)
175
185
  end
186
+ end
176
187
  end
177
188
  end
@@ -21,7 +21,7 @@ module Spree
21
21
 
22
22
  default_scope -> { order(:position) }
23
23
 
24
- accepts_nested_attributes_for :option_values, reject_if: lambda { |ov| ov[:name].blank? || ov[:presentation].blank? }, allow_destroy: true
24
+ accepts_nested_attributes_for :option_values, reject_if: lambda { |ov| ov[:name].blank? && ov[:presentation].blank? }, allow_destroy: true
25
25
 
26
26
  after_touch :touch_all_products
27
27
  after_save :touch_all_products
@@ -12,6 +12,8 @@ module Spree
12
12
  after_save :touch, if: :changed?
13
13
  after_touch :touch_all_variants
14
14
 
15
+ delegate :name, :presentation, to: :option_type, prefix: :option_type
16
+
15
17
  self.whitelisted_ransackable_attributes = ['presentation']
16
18
 
17
19
  # Updates the updated_at column on all the variants associated with this
@@ -23,7 +25,7 @@ module Spree
23
25
  # @return [String] a string representation of all option value and its
24
26
  # option type
25
27
  def presentation_with_option_type
26
- "#{self.option_type.presentation} - #{self.presentation}"
28
+ "#{option_type.presentation} - #{presentation}"
27
29
  end
28
30
  end
29
31
  end
@@ -110,7 +110,9 @@ module Spree
110
110
  # calls matter so that we do not process payments
111
111
  # until validations have passed
112
112
  before_transition to: :complete, do: :validate_line_item_availability, unless: :unreturned_exchange?
113
- before_transition to: :complete, do: :ensure_available_shipping_rates
113
+ if states[:delivery]
114
+ before_transition to: :complete, do: :ensure_available_shipping_rates
115
+ end
114
116
  before_transition to: :complete, do: :ensure_promotions_eligible
115
117
  before_transition to: :complete, do: :ensure_line_item_variants_are_not_deleted
116
118
  before_transition to: :complete, do: :ensure_inventory_units, unless: :unreturned_exchange?
@@ -131,7 +133,6 @@ module Spree
131
133
  order.logger.debug "Order #{order.number} transitioned from #{transition.from} to #{transition.to} via #{transition.event}"
132
134
  end
133
135
 
134
-
135
136
  after_failure do |order, transition|
136
137
  order.logger.debug "Order #{order.number} halted transition on event #{transition.event} state #{transition.from}: #{order.errors.full_messages.join}"
137
138
  end
@@ -140,13 +141,13 @@ module Spree
140
141
  alias_method :save_state, :save
141
142
  end
142
143
 
143
- def self.go_to_state(name, options={})
144
- self.checkout_steps[name] = options
144
+ def self.go_to_state(name, options = {})
145
+ checkout_steps[name] = options
145
146
  previous_states.each do |state|
146
- add_transition({from: state, to: name}.merge(options))
147
+ add_transition({ from: state, to: name }.merge(options))
147
148
  end
148
149
  if options[:if]
149
- self.previous_states << name
150
+ previous_states << name
150
151
  else
151
152
  self.previous_states = [name]
152
153
  end
@@ -155,43 +156,43 @@ module Spree
155
156
  def self.insert_checkout_step(name, options = {})
156
157
  before = options.delete(:before)
157
158
  after = options.delete(:after) unless before
158
- after = self.checkout_steps.keys.last unless before || after
159
+ after = checkout_steps.keys.last unless before || after
159
160
 
160
- cloned_steps = self.checkout_steps.clone
161
- cloned_removed_transitions = self.removed_transitions.clone
162
- self.checkout_flow do
161
+ cloned_steps = checkout_steps.clone
162
+ cloned_removed_transitions = removed_transitions.clone
163
+ checkout_flow do
163
164
  cloned_steps.each_pair do |key, value|
164
- self.go_to_state(name, options) if key == before
165
- self.go_to_state(key, value)
166
- self.go_to_state(name, options) if key == after
165
+ go_to_state(name, options) if key == before
166
+ go_to_state(key, value)
167
+ go_to_state(name, options) if key == after
167
168
  end
168
169
  cloned_removed_transitions.each do |transition|
169
- self.remove_transition(transition)
170
+ remove_transition(transition)
170
171
  end
171
172
  end
172
173
  end
173
174
 
174
175
  def self.remove_checkout_step(name)
175
- cloned_steps = self.checkout_steps.clone
176
- cloned_removed_transitions = self.removed_transitions.clone
177
- self.checkout_flow do
176
+ cloned_steps = checkout_steps.clone
177
+ cloned_removed_transitions = removed_transitions.clone
178
+ checkout_flow do
178
179
  cloned_steps.each_pair do |key, value|
179
- self.go_to_state(key, value) unless key == name
180
+ go_to_state(key, value) unless key == name
180
181
  end
181
182
  cloned_removed_transitions.each do |transition|
182
- self.remove_transition(transition)
183
+ remove_transition(transition)
183
184
  end
184
185
  end
185
186
  end
186
187
 
187
- def self.remove_transition(options={})
188
- self.removed_transitions << options
189
- self.next_event_transitions.delete(find_transition(options))
188
+ def self.remove_transition(options = {})
189
+ removed_transitions << options
190
+ next_event_transitions.delete(find_transition(options))
190
191
  end
191
192
 
192
- def self.find_transition(options={})
193
+ def self.find_transition(options = {})
193
194
  return nil if options.nil? || !options.include?(:from) || !options.include?(:to)
194
- self.next_event_transitions.detect do |transition|
195
+ next_event_transitions.detect do |transition|
195
196
  transition[options[:from].to_sym] == options[:to].to_sym
196
197
  end
197
198
  end
@@ -205,11 +206,11 @@ module Spree
205
206
  end
206
207
 
207
208
  def self.checkout_step_names
208
- self.checkout_steps.keys
209
+ checkout_steps.keys
209
210
  end
210
211
 
211
212
  def self.add_transition(options)
212
- self.next_event_transitions << { options.delete(:from) => options.delete(:to) }.merge(options)
213
+ next_event_transitions << { options.delete(:from) => options.delete(:to) }.merge(options)
213
214
  end
214
215
 
215
216
  def checkout_steps
@@ -223,15 +224,15 @@ module Spree
223
224
  end
224
225
 
225
226
  def has_checkout_step?(step)
226
- step.present? && self.checkout_steps.include?(step)
227
+ step.present? && checkout_steps.include?(step)
227
228
  end
228
229
 
229
230
  def passed_checkout_step?(step)
230
- has_checkout_step?(step) && checkout_step_index(step) < checkout_step_index(self.state)
231
+ has_checkout_step?(step) && checkout_step_index(step) < checkout_step_index(state)
231
232
  end
232
233
 
233
234
  def checkout_step_index(step)
234
- self.checkout_steps.index(step).to_i
235
+ checkout_steps.index(step).to_i
235
236
  end
236
237
 
237
238
  def self.removed_transitions
@@ -243,7 +244,7 @@ module Spree
243
244
  checkout_step_index(state) > checkout_step_index(self.state)
244
245
  end
245
246
 
246
- define_callbacks :updating_from_params, terminator: ->(target, result) { result == false }
247
+ define_callbacks :updating_from_params, terminator: ->(_target, result) { result == false }
247
248
 
248
249
  set_callback :updating_from_params, :before, :update_params_payment_source
249
250
 
@@ -253,7 +254,7 @@ module Spree
253
254
  success = false
254
255
  @updating_params = params
255
256
  run_callbacks :updating_from_params do
256
- attributes = @updating_params[:order] ? @updating_params[:order].permit(permitted_params).delete_if { |k,v| v.nil? } : {}
257
+ attributes = @updating_params[:order] ? @updating_params[:order].permit(permitted_params).delete_if { |_k, v| v.nil? } : {}
257
258
 
258
259
  # Set existing card after setting permitted parameters because
259
260
  # rails would slice parameters containg ruby objects, apparently
@@ -261,7 +262,7 @@ module Spree
261
262
 
262
263
  if existing_card_id.present?
263
264
  credit_card = CreditCard.find existing_card_id
264
- if credit_card.user_id != self.user_id || credit_card.user_id.blank?
265
+ if credit_card.user_id != user_id || credit_card.user_id.blank?
265
266
  raise Core::GatewayError.new Spree.t(:invalid_credit_card)
266
267
  end
267
268
 
@@ -293,35 +294,35 @@ module Spree
293
294
  end
294
295
 
295
296
  def assign_default_addresses!
296
- if self.user
297
+ if user
297
298
  # this is one of 2 places still using User#bill_address
298
299
  self.bill_address ||= user.bill_address if user.bill_address.try!(:valid?)
299
300
  # Skip setting ship address if order doesn't have a delivery checkout step
300
301
  # to avoid triggering validations on shipping address
301
- self.ship_address ||= user.ship_address if user.ship_address.try!(:valid?) && self.checkout_steps.include?("delivery")
302
+ self.ship_address ||= user.ship_address if user.ship_address.try!(:valid?) && checkout_steps.include?("delivery")
302
303
  end
303
304
  end
304
305
 
305
306
  def persist_user_address!
306
- if !self.temporary_address && self.user && self.user.respond_to?(:persist_order_address) && self.bill_address_id
307
- self.user.persist_order_address(self)
307
+ if !temporary_address && user && user.respond_to?(:persist_order_address) && bill_address_id
308
+ user.persist_order_address(self)
308
309
  end
309
310
  end
310
311
 
311
312
  def persist_user_credit_card
312
- if !self.temporary_credit_card && self.user_id && self.valid_credit_cards.present?
313
- default_cc = self.valid_credit_cards.first
314
- # TODO target for refactoring -- why is order checkout responsible for the user -> credit_card relationship?
315
- default_cc.user_id = self.user_id
313
+ if !temporary_credit_card && user_id && valid_credit_cards.present?
314
+ default_cc = valid_credit_cards.first
315
+ # TODO: target for refactoring -- why is order checkout responsible for the user -> credit_card relationship?
316
+ default_cc.user_id = user_id
316
317
  default_cc.default = true
317
318
  default_cc.save
318
319
  end
319
320
  end
320
321
 
321
322
  def assign_default_credit_card
322
- if self.payments.from_credit_card.count == 0 && self.user && self.user.default_credit_card.try(:valid?)
323
- cc = self.user.default_credit_card
324
- self.payments.create!(payment_method_id: cc.payment_method_id, source: cc)
323
+ if payments.from_credit_card.count == 0 && user && user.default_credit_card.try(:valid?)
324
+ cc = user.default_credit_card
325
+ payments.create!(payment_method_id: cc.payment_method_id, source: cc)
325
326
  # this is one of 2 places still using User#bill_address
326
327
  self.bill_address ||= user.default_credit_card.address || user.bill_address
327
328
  end
@@ -359,7 +360,7 @@ module Spree
359
360
  def update_params_payment_source
360
361
  if @updating_params[:order] && (@updating_params[:order][:payments_attributes] || @updating_params[:order][:existing_card])
361
362
  @updating_params[:order][:payments_attributes] ||= [{}]
362
- @updating_params[:order][:payments_attributes].first[:amount] = self.total
363
+ @updating_params[:order][:payments_attributes].first[:amount] = total
363
364
  end
364
365
  end
365
366
  end