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
@@ -3,8 +3,7 @@ module Spree
3
3
  extend ActiveSupport::Concern
4
4
 
5
5
  included do
6
- has_many :user_addresses, -> { active }, {foreign_key: "user_id", class_name: "Spree::UserAddress"} do
7
-
6
+ has_many :user_addresses, -> { active }, { foreign_key: "user_id", class_name: "Spree::UserAddress" } do
8
7
  def find_first_by_address_values(address_attrs)
9
8
  detect { |ua| ua.address == Address.new(address_attrs) }
10
9
  end
@@ -13,7 +12,7 @@ module Spree
13
12
  def mark_default(user_address)
14
13
  # the checks of persisted? allow us to build a User and associate Addresses at once
15
14
  ActiveRecord::Base.transaction do
16
- (self - [user_address]).each do |ua| #update_all would be nice, but it bypasses ActiveRecord callbacks
15
+ (self - [user_address]).each do |ua| # update_all would be nice, but it bypasses ActiveRecord callbacks
17
16
  ua.persisted? ? ua.update!(default: false) : ua.default = false
18
17
  end
19
18
  user_address.persisted? ? user_address.update!(default: true, archived: false) : user_address.default = true
@@ -26,109 +25,116 @@ module Spree
26
25
  # bill_address is only minimally used now, but we can't get rid of it without a major version release
27
26
  belongs_to :bill_address, class_name: 'Spree::Address'
28
27
 
29
- def bill_address=(address)
30
- # stow a copy in our address book too
31
- address = save_in_address_book(address.attributes) if address
32
- super(address)
33
- end
28
+ has_one :default_user_address, ->{ default }, class_name: 'Spree::UserAddress', foreign_key: 'user_id'
29
+ has_one :default_address, through: :default_user_address, source: :address
30
+ alias_method :ship_address, :default_address
31
+ end
34
32
 
35
- def bill_address_attributes=(attributes)
36
- self.bill_address = Address.immutable_merge(bill_address, attributes)
37
- end
33
+ def bill_address=(address)
34
+ # stow a copy in our address book too
35
+ address = save_in_address_book(address.attributes) if address
36
+ super(address)
37
+ end
38
38
 
39
- def default_address
40
- user_addresses.default.first.try(:address)
41
- end
39
+ def bill_address_attributes=(attributes)
40
+ self.bill_address = Address.immutable_merge(bill_address, attributes)
41
+ end
42
42
 
43
- def default_address=(address)
44
- save_in_address_book(address.attributes, true) if address
45
- end
43
+ def default_address=(address)
44
+ save_in_address_book(address.attributes, true) if address
45
+ end
46
46
 
47
- def default_address_attributes=(attributes)
48
- # see "Nested Attributes Examples" section of http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for
49
- # this #{fieldname}_attributes= method works with fields_for in the views
50
- # even without declaring accepts_nested_attributes_for
51
- self.default_address = Address.immutable_merge(default_address, attributes)
52
- end
47
+ def default_address_attributes=(attributes)
48
+ # see "Nested Attributes Examples" section of http://apidock.com/rails/ActionView/Helpers/FormHelper/fields_for
49
+ # this #{fieldname}_attributes= method works with fields_for in the views
50
+ # even without declaring accepts_nested_attributes_for
51
+ self.default_address = Address.immutable_merge(default_address, attributes)
52
+ end
53
53
 
54
- alias_method :ship_address, :default_address
55
- alias_method :ship_address_attributes=, :default_address_attributes=
56
-
57
- # saves address in address book
58
- # sets address to the default if automatic_default_address is set to true
59
- # if address is nil, does nothing and returns nil
60
- def ship_address=(address)
61
- be_default = Spree::Config.automatic_default_address
62
- save_in_address_book(address.attributes, be_default) if address
63
- end
54
+ alias_method :ship_address_attributes=, :default_address_attributes=
64
55
 
65
- # saves order.ship_address and order.bill_address in address book
66
- # sets ship_address to the default if automatic_default_address is set to true
67
- # sets bill_address to the default if automatic_default_address is set to true and there is no ship_address
68
- # if one address is nil, does not save that address
69
- def persist_order_address(order)
70
- save_in_address_book(
56
+ # saves address in address book
57
+ # sets address to the default if automatic_default_address is set to true
58
+ # if address is nil, does nothing and returns nil
59
+ def ship_address=(address)
60
+ be_default = Spree::Config.automatic_default_address
61
+ save_in_address_book(address.attributes, be_default) if address
62
+ end
63
+
64
+ # saves order.ship_address and order.bill_address in address book
65
+ # sets ship_address to the default if automatic_default_address is set to true
66
+ # sets bill_address to the default if automatic_default_address is set to true and there is no ship_address
67
+ # if one address is nil, does not save that address
68
+ def persist_order_address(order)
69
+ if order.ship_address
70
+ address = save_in_address_book(
71
71
  order.ship_address.attributes,
72
72
  Spree::Config.automatic_default_address
73
- ) if order.ship_address
73
+ )
74
+ self.ship_address_id = address.id if address && address.persisted?
75
+ end
74
76
 
75
- save_in_address_book(
77
+ if order.bill_address
78
+ address = save_in_address_book(
76
79
  order.bill_address.attributes,
77
80
  order.ship_address.nil? && Spree::Config.automatic_default_address
78
- ) if order.bill_address
81
+ )
82
+ self.bill_address_id = address.id if address && address.persisted?
79
83
  end
80
84
 
81
- # Add an address to the user's list of saved addresses for future autofill
82
- # @param address_attributes HashWithIndifferentAccess of attributes that will be
83
- # treated as value equality to de-dup among existing Addresses
84
- # @param default set whether or not this address will show up from
85
- # #default_address or not
86
- def save_in_address_book(address_attributes, default = false)
87
- return nil unless address_attributes.present?
88
- address_attributes = address_attributes.with_indifferent_access
85
+ save! # In case the ship_address_id or bill_address_id was set
86
+ end
89
87
 
90
- new_address = Address.factory(address_attributes)
91
- return new_address unless new_address.valid?
88
+ # Add an address to the user's list of saved addresses for future autofill
89
+ # @param address_attributes HashWithIndifferentAccess of attributes that will be
90
+ # treated as value equality to de-dup among existing Addresses
91
+ # @param default set whether or not this address will show up from
92
+ # #default_address or not
93
+ def save_in_address_book(address_attributes, default = false)
94
+ return nil unless address_attributes.present?
95
+ address_attributes = address_attributes.with_indifferent_access
92
96
 
93
- first_one = user_addresses.empty?
97
+ new_address = Address.factory(address_attributes)
98
+ return new_address unless new_address.valid?
94
99
 
95
- if address_attributes[:id].present? && new_address.id != address_attributes[:id]
96
- remove_from_address_book(address_attributes[:id])
97
- end
100
+ first_one = user_addresses.empty?
98
101
 
99
- user_address = prepare_user_address(new_address)
100
- user_addresses.mark_default(user_address) if (default || first_one)
102
+ if address_attributes[:id].present? && new_address.id != address_attributes[:id]
103
+ remove_from_address_book(address_attributes[:id])
104
+ end
101
105
 
102
- if persisted?
103
- user_address.save!
104
- user_addresses.reset #ensures proper ordering
105
- end
106
+ user_address = prepare_user_address(new_address)
107
+ user_addresses.mark_default(user_address) if default || first_one
106
108
 
107
- user_address.address
109
+ if persisted?
110
+ user_address.save!
111
+ user_addresses.reset # ensures proper ordering
108
112
  end
109
113
 
110
- def mark_default_address(address)
111
- user_addresses.mark_default(user_addresses.find_by(address: address))
112
- end
114
+ user_address.address
115
+ end
113
116
 
114
- def remove_from_address_book(address_id)
115
- user_address = user_addresses.find_by(address_id: address_id)
116
- if user_address
117
- user_address.update_attributes(archived: true, default: false)
118
- else
119
- false
120
- end
117
+ def mark_default_address(address)
118
+ user_addresses.mark_default(user_addresses.find_by(address: address))
119
+ end
120
+
121
+ def remove_from_address_book(address_id)
122
+ user_address = user_addresses.find_by(address_id: address_id)
123
+ if user_address
124
+ user_address.update_attributes(archived: true, default: false)
125
+ else
126
+ false
121
127
  end
128
+ end
122
129
 
123
- private
130
+ private
124
131
 
125
- def prepare_user_address(new_address)
126
- user_address = user_addresses.all_historical.find_first_by_address_values(new_address.attributes)
127
- user_address ||= user_addresses.build
128
- user_address.address = new_address
129
- user_address.archived = false
130
- user_address
131
- end
132
+ def prepare_user_address(new_address)
133
+ user_address = user_addresses.all_historical.find_first_by_address_values(new_address.attributes)
134
+ user_address ||= user_addresses.build
135
+ user_address.address = new_address
136
+ user_address.archived = false
137
+ user_address
132
138
  end
133
139
  end
134
140
  end
@@ -47,7 +47,7 @@ module Spree
47
47
  # @return [Spree::Order] the most-recently-created incomplete order
48
48
  # since the customer's last complete order.
49
49
  def last_incomplete_spree_order(store: nil, only_frontend_viewable: true)
50
- self_orders = self.orders
50
+ self_orders = orders
51
51
  self_orders = self_orders.where(frontend_viewable: true) if only_frontend_viewable
52
52
  self_orders = self_orders.where(store: store) if store
53
53
  self_orders = self_orders.where('updated_at > ?', Spree::Config.completable_order_updated_cutoff_days.days.ago) if Spree::Config.completable_order_updated_cutoff_days
@@ -57,7 +57,7 @@ module Spree
57
57
  end
58
58
 
59
59
  def total_available_store_credit
60
- store_credits.reload.to_a.sum{ |credit| credit.amount_remaining }
60
+ store_credits.reload.to_a.sum(&:amount_remaining)
61
61
  end
62
62
  end
63
63
  end
@@ -4,16 +4,20 @@ module Spree
4
4
 
5
5
  included do
6
6
  has_many :credit_cards, class_name: "Spree::CreditCard", foreign_key: :user_id
7
- def default_credit_card; credit_cards.default.first; end
7
+ end
8
+
9
+ def default_credit_card
10
+ credit_cards.default.first
11
+ end
8
12
 
9
- def payment_sources
10
- credit_cards.with_payment_profile
11
- end
13
+ def payment_sources
14
+ credit_cards.with_payment_profile
15
+ end
12
16
 
13
- def drop_payment_source(source)
14
- gateway = source.payment_method
15
- gateway.disable_customer_profile(source)
16
- end
17
+ def drop_payment_source(source)
18
+ ActiveSupport::Deprecation.warn("User#drop_payment_source is deprecated", caller)
19
+ gateway = source.payment_method
20
+ gateway.disable_customer_profile(source)
17
21
  end
18
22
  end
19
23
  end
@@ -17,11 +17,11 @@ module Spree
17
17
  # the +CanCan::Ability+ module. The registered ability should behave properly as a stand-alone class
18
18
  # and therefore should be easy to test in isolation.
19
19
  def self.register_ability(ability)
20
- self.abilities.add(ability)
20
+ abilities.add(ability)
21
21
  end
22
22
 
23
23
  def self.remove_ability(ability)
24
- self.abilities.delete(ability)
24
+ abilities.delete(ability)
25
25
  end
26
26
 
27
27
  def initialize(current_user)
@@ -97,7 +97,7 @@ module Spree
97
97
  # @return [Boolean] true if the two addresses have the same address fields
98
98
  def ==(other_address)
99
99
  return false unless other_address && other_address.respond_to?(:value_attributes)
100
- self.value_attributes == other_address.value_attributes
100
+ value_attributes == other_address.value_attributes
101
101
  end
102
102
 
103
103
  def same_as?(other_address)
@@ -156,49 +156,48 @@ module Spree
156
156
  end
157
157
 
158
158
  private
159
- def state_validate
160
- # Skip state validation without country (also required)
161
- # or when disabled by preference
162
- return if country.blank? || !Spree::Config[:address_requires_state]
163
- return unless country.states_required
164
-
165
- # ensure associated state belongs to country
166
- if state.present?
167
- if state.country == country
168
- self.state_name = nil #not required as we have a valid state and country combo
169
- else
170
- if state_name.present?
171
- self.state = nil
172
- else
173
- errors.add(:state, :invalid)
174
- end
175
- end
159
+
160
+ def state_validate
161
+ # Skip state validation without country (also required)
162
+ # or when disabled by preference
163
+ return if country.blank? || !Spree::Config[:address_requires_state]
164
+ return unless country.states_required
165
+
166
+ # ensure associated state belongs to country
167
+ if state.present?
168
+ if state.country == country
169
+ self.state_name = nil # not required as we have a valid state and country combo
170
+ elsif state_name.present?
171
+ self.state = nil
172
+ else
173
+ errors.add(:state, :invalid)
176
174
  end
175
+ end
176
+
177
+ # ensure state_name belongs to country without states, or that it matches a predefined state name/abbr
178
+ if state_name.present?
179
+ if country.states.present?
180
+ states = country.states.find_all_by_name_or_abbr(state_name)
177
181
 
178
- # ensure state_name belongs to country without states, or that it matches a predefined state name/abbr
179
- if state_name.present?
180
- if country.states.present?
181
- states = country.states.find_all_by_name_or_abbr(state_name)
182
-
183
- if states.size == 1
184
- self.state = states.first
185
- self.state_name = nil
186
- else
187
- errors.add(:state, :invalid)
188
- end
182
+ if states.size == 1
183
+ self.state = states.first
184
+ self.state_name = nil
185
+ else
186
+ errors.add(:state, :invalid)
189
187
  end
190
188
  end
191
-
192
- # ensure at least one state field is populated
193
- errors.add :state, :blank if state.blank? && state_name.blank?
194
189
  end
195
190
 
196
- def postal_code_validate
197
- return if country.blank? || country.iso.blank? || !require_zipcode?
198
- return if !TwitterCldr::Shared::PostalCodes.territories.include?(country.iso.downcase.to_sym)
191
+ # ensure at least one state field is populated
192
+ errors.add :state, :blank if state.blank? && state_name.blank?
193
+ end
199
194
 
200
- postal_code = TwitterCldr::Shared::PostalCodes.for_territory(country.iso)
201
- errors.add(:zipcode, :invalid) if !postal_code.valid?(zipcode.to_s)
202
- end
195
+ def postal_code_validate
196
+ return if country.blank? || country.iso.blank? || !require_zipcode?
197
+ return if !TwitterCldr::Shared::PostalCodes.territories.include?(country.iso.downcase.to_sym)
198
+
199
+ postal_code = TwitterCldr::Shared::PostalCodes.for_territory(country.iso)
200
+ errors.add(:zipcode, :invalid) if !postal_code.valid?(zipcode.to_s)
201
+ end
203
202
  end
204
203
  end
@@ -17,7 +17,7 @@ module Spree
17
17
  belongs_to :adjustable, polymorphic: true, touch: true
18
18
  belongs_to :source, polymorphic: true
19
19
  belongs_to :order, class_name: 'Spree::Order', inverse_of: :all_adjustments
20
- belongs_to :promotion_code, :class_name => 'Spree::PromotionCode'
20
+ belongs_to :promotion_code, class_name: 'Spree::PromotionCode'
21
21
  belongs_to :adjustment_reason, class_name: 'Spree::AdjustmentReason', inverse_of: :adjustments
22
22
 
23
23
  validates :adjustable, presence: true
@@ -43,7 +43,7 @@ module Spree
43
43
  scope :tax, -> { where(source_type: 'Spree::TaxRate') }
44
44
  scope :non_tax, -> do
45
45
  source_type = arel_table[:source_type]
46
- where(source_type.not_eq('Spree::TaxRate').or source_type.eq(nil))
46
+ where(source_type.not_eq('Spree::TaxRate').or(source_type.eq(nil)))
47
47
  end
48
48
  scope :price, -> { where(adjustable_type: 'Spree::LineItem') }
49
49
  scope :shipping, -> { where(adjustable_type: 'Spree::Shipment') }
@@ -175,10 +175,6 @@ module Spree
175
175
  amount
176
176
  end
177
177
 
178
- def currency
179
- adjustable ? adjustable.currency : Spree::Config[:currency]
180
- end
181
-
182
178
  private
183
179
 
184
180
  def update_adjustable_adjustment_total
@@ -117,10 +117,21 @@ module Spree
117
117
  preference :currency, :string, default: "USD"
118
118
 
119
119
  # @!attribute [rw] default_country_id
120
- # @deprecated
120
+ # @deprecated Use the default country ISO preference instead
121
121
  # @return [Integer,nil] id of {Country} to be selected by default in dropdowns (default: nil)
122
122
  preference :default_country_id, :integer
123
123
 
124
+ # @!attribute [rw] default_country_iso
125
+ # Default customer country ISO code
126
+ # @return [String] Two-letter ISO code of a {Spree::Country} to assumed as the country of an unidentified customer (default: "US")
127
+ preference :default_country_iso, :string, default: 'US'
128
+
129
+ # @!attribute [rw] admin_vat_country_iso
130
+ # Set this if you want to enter prices in the backend including value added tax.
131
+ # @return [String, nil] Two-letter ISO code of that {Spree::Country} for which
132
+ # prices are entered in the backend (default: nil)
133
+ preference :admin_vat_country_iso, :string, default: nil
134
+
124
135
  # @!attribute [rw] expedited_exchanges
125
136
  # Kicks off an exchange shipment upon return authorization save.
126
137
  # charge customer if they do not return items within timely manner.
@@ -222,7 +233,7 @@ module Spree
222
233
 
223
234
  # @!attribute [rw] show_raw_product_description
224
235
  # @return [Boolean] Don't escape HTML of product descriptions. (default: +false+)
225
- preference :show_raw_product_description, :boolean, :default => false
236
+ preference :show_raw_product_description, :boolean, default: false
226
237
 
227
238
  # @!attribute [rw] tax_using_ship_address
228
239
  # @return [Boolean] Use the shipping address rather than the billing address to determine tax (default: +true+)
@@ -243,7 +254,7 @@ module Spree
243
254
 
244
255
  # @!attribute [rw] mails_from
245
256
  # @return [String] Email address used as +From:+ field in transactional emails.
246
- preference :mails_from, :string, :default => 'spree@example.com'
257
+ preference :mails_from, :string, default: 'spree@example.com'
247
258
 
248
259
  # Store credits configurations
249
260
 
@@ -259,12 +270,38 @@ module Spree
259
270
  # @return [Boolean] Whether use of an address in checkout marks it as user's default
260
271
  preference :automatic_default_address, :boolean, default: true
261
272
 
273
+ # @!attribute [rw] can_restrict_stock_management
274
+ # @return [Boolean] Indicates if stock management can be restricted by location
275
+ preference :can_restrict_stock_management, :boolean, default: false
276
+
262
277
  # searcher_class allows spree extension writers to provide their own Search class
263
278
  attr_writer :searcher_class
264
279
  def searcher_class
265
280
  @searcher_class ||= Spree::Core::Search::Base
266
281
  end
267
282
 
283
+ # Allows implementing custom pricing for variants
284
+ # @!attribute [rw] variant_pricer_class
285
+ # @see Spree::Variant::Pricer
286
+ # @return [Class] an object that conforms to the API of
287
+ # the standard variant pricer class Spree::Variant::Pricer.
288
+ attr_writer :variant_pricer_class
289
+ def variant_pricer_class
290
+ @variant_pricer_class ||= Spree::Variant::Pricer
291
+ end
292
+
293
+ # Shortcut for getting the variant pricer's pricing options class
294
+ #
295
+ # @return [Class] The pricing options class to be used
296
+ delegate :pricing_options_class, to: :variant_pricer_class
297
+
298
+ # Shortcut for the default pricing options
299
+ # @return [variant_pricer_class] An instance of the pricing options class with default desired
300
+ # attributes
301
+ def default_pricing_options
302
+ @default_pricing_options ||= pricing_options_class.new
303
+ end
304
+
268
305
  attr_writer :variant_search_class
269
306
  def variant_search_class
270
307
  @variant_search_class ||= Spree::Core::Search::Variant
@@ -286,6 +323,11 @@ module Spree
286
323
  @shipping_rate_selector_class ||= Spree::Stock::ShippingRateSelector
287
324
  end
288
325
 
326
+ attr_writer :shipping_rate_taxer_class
327
+ def shipping_rate_taxer_class
328
+ @shipping_rate_taxer_class ||= Spree::Tax::ShippingRateTaxer
329
+ end
330
+
289
331
  # Allows providing your own Mailer for shipped cartons.
290
332
  #
291
333
  # @!attribute [rw] carton_shipped_email_class
@@ -315,6 +357,19 @@ module Spree
315
357
  @stock_configuration ||= Spree::Core::StockConfiguration.new
316
358
  end
317
359
 
360
+ # Default admin VAT location
361
+ #
362
+ # An object that responds to :state_id and :country_id so it can double as a Spree::Address in
363
+ # Spree::Zone.for_address. Takes the `admin_vat_country_iso` as input.
364
+ #
365
+ # @see admin_vat_country_iso The admin VAT country
366
+ # @return [Spree::Tax::TaxLocation] default tax location
367
+ def admin_vat_location
368
+ @default_tax_location ||= Spree::Tax::TaxLocation.new(
369
+ country: Spree::Country.find_by(iso: admin_vat_country_iso)
370
+ )
371
+ end
372
+
318
373
  # all the following can be deprecated when store prefs are no longer supported
319
374
  # @private
320
375
  DEPRECATED_STORE_PREFERENCES = {
@@ -322,7 +377,7 @@ module Spree
322
377
  site_url: :url,
323
378
  default_meta_description: :meta_description,
324
379
  default_meta_keywords: :meta_keywords,
325
- default_seo_title: :seo_title,
380
+ default_seo_title: :seo_title
326
381
  }
327
382
 
328
383
  DEPRECATED_STORE_PREFERENCES.each do |old_preference_name, store_method|
@@ -333,7 +388,7 @@ module Spree
333
388
  # support all the old preference methods with a warning
334
389
  define_method "preferred_#{old_preference_name}" do
335
390
  ActiveSupport::Deprecation.warn("#{old_preference_name} is no longer supported on Spree::Config, please access it through #{store_method} on Spree::Store", bc.clean(caller))
336
- Store.default.send(store_method)
391
+ Spree::Store.default.send(store_method)
337
392
  end
338
393
  end
339
394
  end
@@ -20,7 +20,7 @@ class Spree::Base < ActiveRecord::Base
20
20
  end
21
21
 
22
22
  if Kaminari.config.page_method_name != :page
23
- def self.page num
23
+ def self.page(num)
24
24
  send Kaminari.config.page_method_name, num
25
25
  end
26
26
  end
@@ -2,6 +2,8 @@ require_dependency 'spree/calculator'
2
2
 
3
3
  module Spree
4
4
  class Calculator::DefaultTax < Calculator
5
+ include Spree::Tax::TaxHelpers
6
+
5
7
  def self.description
6
8
  Spree.t(:default_tax)
7
9
  end
@@ -10,58 +12,60 @@ module Spree
10
12
  # Orders created before Spree 2.1 had tax adjustments applied to the order, as a whole.
11
13
  # Orders created with Spree 2.2 and after, have them applied to the line items individually.
12
14
  def compute_order(order)
13
-
14
15
  matched_line_items = order.line_items.select do |line_item|
15
16
  line_item.tax_category == rate.tax_category
16
17
  end
17
18
 
18
- line_items_total = matched_line_items.sum(&:total)
19
+ line_items_total = matched_line_items.sum(&:discounted_amount)
19
20
  if rate.included_in_price
20
- round_to_two_places(line_items_total - ( line_items_total / (1 + rate.amount) ) )
21
+ order_tax_amount = round_to_two_places(line_items_total - ( line_items_total / (1 + rate.amount) ) )
22
+ refund_if_necessary(order_tax_amount, order.tax_zone)
21
23
  else
22
24
  round_to_two_places(line_items_total * rate.amount)
23
25
  end
24
26
  end
25
27
 
26
28
  # When it comes to computing shipments or line items: same same.
27
- def compute_shipment_or_line_item(item)
29
+ def compute_item(item)
28
30
  if rate.included_in_price
29
- deduced_total_by_rate(item.pre_tax_amount, rate)
31
+ deduced_total_by_rate(item, rate)
30
32
  else
31
33
  round_to_two_places(item.discounted_amount * rate.amount)
32
34
  end
33
35
  end
34
36
 
35
- alias_method :compute_shipment, :compute_shipment_or_line_item
36
- alias_method :compute_line_item, :compute_shipment_or_line_item
37
-
38
- def compute_shipping_rate(shipping_rate)
39
- if rate.included_in_price
40
- pre_tax_amount = shipping_rate.cost / (1 + rate.amount)
41
- if rate.zone == shipping_rate.shipment.order.tax_zone
42
- deduced_total_by_rate(pre_tax_amount, rate)
43
- else
44
- deduced_total_by_rate(pre_tax_amount, rate) * - 1
45
- end
46
- else
47
- with_tax_amount = shipping_rate.cost * rate.amount
48
- round_to_two_places(with_tax_amount)
49
- end
50
- end
37
+ alias_method :compute_shipment, :compute_item
38
+ alias_method :compute_line_item, :compute_item
39
+ alias_method :compute_shipping_rate, :compute_item
51
40
 
52
41
  private
53
42
 
54
43
  def rate
55
- self.calculable
44
+ calculable
56
45
  end
57
46
 
58
47
  def round_to_two_places(amount)
59
48
  BigDecimal.new(amount.to_s).round(2, BigDecimal::ROUND_HALF_UP)
60
49
  end
61
50
 
62
- def deduced_total_by_rate(pre_tax_amount, rate)
63
- round_to_two_places(pre_tax_amount * rate.amount)
51
+ def deduced_total_by_rate(item, rate)
52
+ unrounded_net_amount = item.discounted_amount / (1 + sum_of_included_tax_rates(item))
53
+ refund_if_necessary(
54
+ round_to_two_places(unrounded_net_amount * rate.amount),
55
+ item.order.tax_zone
56
+ )
57
+ end
58
+
59
+ def refund_if_necessary(amount, order_tax_zone)
60
+ if default_zone_or_zone_match?(order_tax_zone)
61
+ amount
62
+ else
63
+ amount * -1
64
+ end
64
65
  end
65
66
 
67
+ def default_zone_or_zone_match?(order_tax_zone)
68
+ Zone.default_tax.try!(:contains?, order_tax_zone) || rate.zone.contains?(order_tax_zone)
69
+ end
66
70
  end
67
71
  end
@@ -9,7 +9,7 @@ module Spree
9
9
  end
10
10
 
11
11
  def compute(object)
12
- computed_amount = (object.amount * preferred_flat_percent / 100).round(2)
12
+ computed_amount = (object.amount * preferred_flat_percent / 100).round(2)
13
13
 
14
14
  # We don't want to cause the promotion adjustments to push the order into a negative total.
15
15
  if computed_amount > object.amount
@@ -9,8 +9,8 @@ module Spree
9
9
  Spree.t(:flat_rate_per_order)
10
10
  end
11
11
 
12
- def compute(object=nil)
13
- if object && preferred_currency.upcase == object.currency.upcase
12
+ def compute(object = nil)
13
+ if object && preferred_currency.casecmp(object.currency).zero?
14
14
  preferred_amount
15
15
  else
16
16
  0