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
@@ -0,0 +1,787 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe "Taxation system integration tests" do
4
+ let(:order) { create :order, ship_address: shipping_address, state: "delivery" }
5
+ let(:book_product) do
6
+ create :product,
7
+ price: 20,
8
+ name: "Book",
9
+ tax_category: books_category,
10
+ shipping_category: books_shipping_category
11
+ end
12
+ let(:download_product) do
13
+ create :product,
14
+ price: 10,
15
+ name: "Download",
16
+ tax_category: digital_category,
17
+ shipping_category: digital_shipping_category
18
+ end
19
+ let(:sweater_product) do
20
+ create :product,
21
+ price: 30,
22
+ name: "Download",
23
+ tax_category: normal_category,
24
+ shipping_category: normal_shipping_category
25
+ end
26
+
27
+ let(:book) { book_product.master }
28
+ let(:download) { download_product.master }
29
+ let(:sweater) { sweater_product.master }
30
+
31
+ let(:books_category) { create :tax_category, name: "Books" }
32
+ let(:normal_category) { create :tax_category, name: "Normal" }
33
+ let(:digital_category) { create :tax_category, name: "Digital Goods" }
34
+
35
+ let(:books_shipping_category) { create :shipping_category, name: "Book Shipping" }
36
+ let(:normal_shipping_category) { create :shipping_category, name: "Normal Shipping" }
37
+ let(:digital_shipping_category) { create :shipping_category, name: "Digital Premium Download" }
38
+
39
+ let(:line_item) { order.line_items.first }
40
+ let(:shipment) { order.shipments.first }
41
+ let(:shipping_rate) { shipment.shipping_rates.first }
42
+
43
+ context 'selling from germany' do
44
+ let(:germany) { create :country, iso: "DE" }
45
+ # The weird default_tax boolean is what makes this context one with default included taxes
46
+ let!(:germany_zone) { create :zone, countries: [germany], default_tax: true }
47
+ let(:romania) { create(:country, iso: "RO") }
48
+ let(:romania_zone) { create(:zone, countries: [romania] ) }
49
+ let(:eu_zone) { create(:zone, countries: [romania, germany]) }
50
+ let(:world_zone) { create(:zone, :with_country) }
51
+
52
+ let!(:german_book_vat) do
53
+ create(
54
+ :tax_rate,
55
+ name: "German reduced VAT",
56
+ included_in_price: true,
57
+ amount: 0.07,
58
+ tax_category: books_category,
59
+ zone: eu_zone
60
+ )
61
+ end
62
+ let!(:german_normal_vat) do
63
+ create(
64
+ :tax_rate,
65
+ name: "German VAT",
66
+ included_in_price: true,
67
+ amount: 0.19,
68
+ tax_category: normal_category,
69
+ zone: eu_zone
70
+ )
71
+ end
72
+ let!(:german_digital_vat) do
73
+ create(
74
+ :tax_rate,
75
+ name: "German VAT",
76
+ included_in_price: true,
77
+ amount: 0.19,
78
+ tax_category: digital_category,
79
+ zone: germany_zone
80
+ )
81
+ end
82
+ let!(:romanian_digital_vat) do
83
+ create(
84
+ :tax_rate,
85
+ name: "Romanian VAT",
86
+ included_in_price: true,
87
+ amount: 0.24,
88
+ tax_category: digital_category,
89
+ zone: romania_zone
90
+ )
91
+ end
92
+ let!(:book_shipping_method) do
93
+ create :shipping_method,
94
+ cost: 8.00,
95
+ shipping_categories: [books_shipping_category],
96
+ tax_category: books_category,
97
+ zones: [eu_zone, world_zone]
98
+ end
99
+
100
+ let!(:sweater_shipping_method) do
101
+ create :shipping_method,
102
+ cost: 16.00,
103
+ shipping_categories: [normal_shipping_category],
104
+ tax_category: normal_category,
105
+ zones: [eu_zone, world_zone]
106
+ end
107
+
108
+ let!(:premium_download_shipping_method) do
109
+ create :shipping_method,
110
+ cost: 2.00,
111
+ shipping_categories: [digital_shipping_category],
112
+ tax_category: digital_category,
113
+ zones: [eu_zone, world_zone]
114
+ end
115
+
116
+ before do
117
+ order.contents.add(variant)
118
+ end
119
+
120
+ context 'to germany' do
121
+ let(:shipping_address) { create :address, country_iso_code: "DE" }
122
+
123
+ context 'an order with a book' do
124
+ let(:variant) { book }
125
+
126
+ it 'still has the original price' do
127
+ expect(line_item.price).to eq(20)
128
+ end
129
+
130
+ it 'has one tax adjustment' do
131
+ expect(line_item.adjustments.tax.count).to eq(1)
132
+ end
133
+
134
+ it 'has 1.13 cents of included tax' do
135
+ expect(line_item.included_tax_total).to eq(1.31)
136
+ end
137
+ end
138
+
139
+ context 'an order with a book and a shipment' do
140
+ let(:variant) { book }
141
+
142
+ before { 2.times { order.next! } }
143
+
144
+ it 'has a shipment for 8.00 dollars' do
145
+ expect(shipment.amount).to eq(8.00)
146
+ end
147
+
148
+ it 'has a shipment with 0.52 included tax' do
149
+ expect(shipment.included_tax_total).to eq(0.52)
150
+ end
151
+
152
+ it 'has a shipping rate that correctly reflects the shipment' do
153
+ expect(shipping_rate.display_price).to eq("$8.00 (incl. $0.52 German reduced VAT)")
154
+ end
155
+ end
156
+
157
+ context 'an order with a sweater' do
158
+ let(:variant) { sweater }
159
+
160
+ it 'still has the original price' do
161
+ expect(line_item.price).to eq(30)
162
+ end
163
+
164
+ it 'has one tax adjustment' do
165
+ expect(line_item.adjustments.tax.count).to eq(1)
166
+ end
167
+
168
+ it 'has 4,78 of included tax' do
169
+ expect(line_item.included_tax_total).to eq(4.79)
170
+ end
171
+ end
172
+
173
+ context 'an order with a sweater and a shipment' do
174
+ let(:variant) { sweater }
175
+
176
+ before { 2.times { order.next! } }
177
+
178
+ it 'has a shipment for 16.00 dollars' do
179
+ expect(shipment.amount).to eq(16.00)
180
+ end
181
+
182
+ it 'has a shipment with 2.55 included tax' do
183
+ expect(shipment.included_tax_total).to eq(2.55)
184
+ end
185
+
186
+ it 'has a shipping rate that correctly reflects the shipment' do
187
+ expect(shipping_rate.display_price).to eq("$16.00 (incl. $2.55 German VAT)")
188
+ end
189
+ end
190
+
191
+ context 'an order with a download' do
192
+ let(:variant) { download }
193
+
194
+ it 'still has the original price' do
195
+ expect(line_item.price).to eq(10)
196
+ end
197
+
198
+ it 'has one tax adjustment' do
199
+ expect(line_item.adjustments.tax.count).to eq(1)
200
+ end
201
+
202
+ it 'has 1.60 of included tax' do
203
+ expect(line_item.included_tax_total).to eq(1.60)
204
+ end
205
+ end
206
+
207
+ context 'an order with a download and a shipment' do
208
+ let(:variant) { download }
209
+
210
+ before { 2.times { order.next! } }
211
+
212
+ it 'has a shipment for 4.00 dollars' do
213
+ expect(shipment.amount).to eq(2.00)
214
+ end
215
+
216
+ it 'has a shipment with 0.64 included tax' do
217
+ expect(shipment.included_tax_total).to eq(0.32)
218
+ end
219
+
220
+ it 'has a shipping rate that correctly reflects the shipment' do
221
+ expect(shipping_rate.display_price).to eq("$2.00 (incl. $0.32 German VAT)")
222
+ end
223
+ end
224
+ end
225
+
226
+ context 'to romania' do
227
+ let(:shipping_address) { create :address, country_iso_code: "RO" }
228
+
229
+ context 'an order with a book' do
230
+ let(:variant) { book }
231
+
232
+ it 'still has the original price' do
233
+ expect(line_item.price).to eq(20)
234
+ end
235
+
236
+ it 'is adjusted to the original price' do
237
+ expect(line_item.total).to eq(20)
238
+ end
239
+
240
+ it 'has one tax adjustment' do
241
+ expect(line_item.adjustments.tax.count).to eq(1)
242
+ end
243
+
244
+ it 'has 1.13 cents of included tax' do
245
+ expect(line_item.included_tax_total).to eq(1.31)
246
+ end
247
+
248
+ it 'has a constant amount pre tax' do
249
+ expect(line_item.discounted_amount - line_item.included_tax_total).to eq(18.69)
250
+ end
251
+ end
252
+
253
+ context 'an order with a book and a shipment' do
254
+ let(:variant) { book }
255
+
256
+ before { 2.times { order.next! } }
257
+
258
+ it 'has a shipment for 8.00 dollars' do
259
+ expect(shipment.amount).to eq(8.00)
260
+ end
261
+
262
+ it 'has a shipment with 0.52 included tax' do
263
+ expect(shipment.included_tax_total).to eq(0.52)
264
+ end
265
+
266
+ it 'has a shipping rate that correctly reflects the shipment' do
267
+ expect(shipping_rate.display_price).to eq("$8.00 (incl. $0.52 German reduced VAT)")
268
+ end
269
+ end
270
+
271
+ context 'an order with a sweater' do
272
+ let(:variant) { sweater }
273
+
274
+ it 'still has the original price' do
275
+ expect(line_item.price).to eq(30)
276
+ end
277
+
278
+ it 'has one tax adjustment' do
279
+ expect(line_item.adjustments.tax.count).to eq(1)
280
+ end
281
+
282
+ it 'has 4.79 of included tax' do
283
+ expect(line_item.included_tax_total).to eq(4.79)
284
+ end
285
+
286
+ it 'has a constant amount pre tax' do
287
+ expect(line_item.discounted_amount - line_item.included_tax_total).to eq(25.21)
288
+ end
289
+ end
290
+
291
+ context 'an order with a sweater and a shipment' do
292
+ let(:variant) { sweater }
293
+
294
+ before { 2.times { order.next! } }
295
+
296
+ it 'has a shipment for 16.00 dollars' do
297
+ expect(shipment.amount).to eq(16.00)
298
+ end
299
+
300
+ it 'has a shipment with 2.55 included tax' do
301
+ expect(shipment.included_tax_total).to eq(2.55)
302
+ end
303
+
304
+ it 'has a shipping rate that correctly reflects the shipment' do
305
+ expect(shipping_rate.display_price).to eq("$16.00 (incl. $2.55 German VAT)")
306
+ end
307
+ end
308
+
309
+ context 'an order with a download' do
310
+ let(:variant) { download }
311
+
312
+ it 'still has an adjusted price for romania' do
313
+ pending "waiting for the MOSS refactoring"
314
+ expect(line_item.price).to eq(10.42)
315
+ end
316
+
317
+ it 'has one tax adjustment' do
318
+ expect(line_item.adjustments.tax.count).to eq(1)
319
+ end
320
+
321
+ it 'has 2.02 of included tax' do
322
+ pending 'waiting for the MOSS refactoring'
323
+ expect(line_item.included_tax_total).to eq(2.02)
324
+ end
325
+
326
+ it 'has a constant amount pre tax' do
327
+ pending 'but it changes to 8.06, because Spree thinks both VATs apply'
328
+ expect(line_item.discounted_amount - line_item.included_tax_total).to eq(8.40)
329
+ end
330
+ end
331
+
332
+ context 'an order with a download and a shipment' do
333
+ let(:variant) { download }
334
+
335
+ before { 2.times { order.next! } }
336
+
337
+ it 'it has a shipment with an adjusted price to 2.08' do
338
+ pending 'Waiting for the MOSS refactoring'
339
+ expect(shipment.amount).to eq(2.08)
340
+ end
341
+
342
+ it 'has a shipment with 0.40 included tax' do
343
+ pending 'But the tax is not created'
344
+ expect(shipment.included_tax_total).to eq(0.40)
345
+ end
346
+
347
+ it 'has a shipping rate that correctly reflects the shipment' do
348
+ pending 'But the shipping rate is not adjusted'
349
+ expect(shipping_rate.display_price).to eq("$2.08 (incl. $0.40 Romanian VAT)")
350
+ end
351
+ end
352
+ end
353
+
354
+ # Technically, this can't be the case yet as the order won't pass the shipment stage,
355
+ # but the taxation code shouldn't implicitly depend on the shipping code.
356
+ context 'to an address that does not have a zone associated' do
357
+ let(:shipping_address) { create :address, country_iso_code: "IT" }
358
+
359
+ context 'an order with a book' do
360
+ let(:variant) { book }
361
+
362
+ it 'should sell at the net price' do
363
+ pending "Prices have to be adjusted"
364
+ expect(line_item.price).to eq(18.69)
365
+ end
366
+
367
+ it 'is adjusted to the net price' do
368
+ pending 'This will turn green when the default zone is gone'
369
+ expect(line_item.total).to eq(18.69)
370
+ end
371
+
372
+ it 'has no tax adjustments' do
373
+ pending "Right now it gets a refund"
374
+ expect(line_item.adjustments.tax.count).to eq(0)
375
+ end
376
+
377
+ it 'has no included tax' do
378
+ pending 'This will turn green when the default zone is gone'
379
+ expect(line_item.included_tax_total).to eq(0)
380
+ end
381
+
382
+ it 'has no additional tax' do
383
+ expect(line_item.additional_tax_total).to eq(0)
384
+ end
385
+
386
+ it 'has a constant amount pre tax' do
387
+ expect(line_item.discounted_amount - line_item.included_tax_total).to eq(18.69)
388
+ end
389
+ end
390
+ end
391
+
392
+ # International delivery, no tax applies whatsoever
393
+ context 'to anywhere else in the world' do
394
+ let(:shipping_address) { create :address, country: world_zone.countries.first }
395
+
396
+ context 'an order with a book' do
397
+ let(:variant) { book }
398
+
399
+ it 'should sell at the net price' do
400
+ pending "Prices have to be adjusted"
401
+ expect(line_item.price).to eq(18.69)
402
+ end
403
+
404
+ it 'is adjusted to the net price' do
405
+ expect(line_item.total).to eq(18.69)
406
+ end
407
+
408
+ it 'has no tax adjustments' do
409
+ pending "Right now it gets a refund"
410
+ expect(line_item.adjustments.tax.count).to eq(0)
411
+ end
412
+
413
+ it 'has no included tax' do
414
+ expect(line_item.included_tax_total).to eq(0)
415
+ end
416
+
417
+ it 'has no additional tax' do
418
+ pending 'but there is a refund, still'
419
+ expect(line_item.additional_tax_total).to eq(0)
420
+ end
421
+
422
+ it 'has a constant amount pre tax' do
423
+ pending 'But it has a discount that abuses the additional tax total'
424
+ expect(line_item.discounted_amount - line_item.included_tax_total).to eq(18.69)
425
+ end
426
+
427
+ context 'an order with a book and a shipment' do
428
+ let(:variant) { book }
429
+
430
+ before { 2.times { order.next! } }
431
+
432
+ it 'it has a shipment with an adjusted price to 7.47' do
433
+ pending 'but prices are not adjusted yet'
434
+ expect(shipment.amount).to eq(7.47)
435
+ end
436
+
437
+ it 'has a shipment with no included tax' do
438
+ expect(shipment.included_tax_total).to eq(0)
439
+ end
440
+
441
+ it 'has a shipping rate that correctly reflects the shipment' do
442
+ pending 'since no tax created, no correct display price'
443
+ expect(shipping_rate.display_price).to eq("$7.47")
444
+ end
445
+ end
446
+ end
447
+
448
+ context 'an order with a sweater' do
449
+ let(:variant) { sweater }
450
+
451
+ it 'should sell at the net price' do
452
+ pending 'but prices are not adjusted according to the zone yet'
453
+ expect(line_item.price).to eq(25.21)
454
+ end
455
+
456
+ it 'has no tax adjustments' do
457
+ pending 'but it has a refund'
458
+ expect(line_item.adjustments.tax.count).to eq(0)
459
+ end
460
+
461
+ it 'has no included tax' do
462
+ expect(line_item.included_tax_total).to eq(0)
463
+ end
464
+
465
+ it 'has no additional tax' do
466
+ pending 'but it has a refund for included taxes wtf'
467
+ expect(line_item.additional_tax_total).to eq(0)
468
+ end
469
+
470
+ it 'has a constant amount pre tax' do
471
+ pending 'But it has a discount that abuses the additional tax total'
472
+ expect(line_item.discounted_amount - line_item.included_tax_total).to eq(25.21)
473
+ end
474
+
475
+ context 'an order with a sweater and a shipment' do
476
+ let(:variant) { sweater }
477
+
478
+ before { 2.times { order.next! } }
479
+
480
+ it 'it has a shipment with an adjusted price to 13.45' do
481
+ pending 'But prices are not adjusted yet'
482
+ expect(shipment.amount).to eq(13.45)
483
+ end
484
+
485
+ it 'has a shipment with no included tax' do
486
+ expect(shipment.included_tax_total).to eq(0)
487
+ end
488
+
489
+ it 'has a shipping rate that correctly reflects the shipment' do
490
+ pending 'since no tax created, no correct display price'
491
+ expect(shipping_rate.display_price).to eq("$13.45")
492
+ end
493
+ end
494
+ end
495
+
496
+ context 'an order with a download' do
497
+ let(:variant) { download }
498
+
499
+ it 'should sell at the net price' do
500
+ pending 'but prices are not adjusted yet'
501
+ expect(line_item.price).to eq(8.40)
502
+ end
503
+
504
+ it 'has no tax adjustments' do
505
+ pending 'but a refund is created'
506
+ expect(line_item.adjustments.tax.count).to eq(0)
507
+ end
508
+
509
+ it 'has no included tax' do
510
+ expect(line_item.included_tax_total).to eq(0)
511
+ end
512
+
513
+ it 'has no additional tax' do
514
+ pending 'but an tax refund that disguises as additional tax is created'
515
+ expect(line_item.additional_tax_total).to eq(0)
516
+ end
517
+
518
+ it 'has a constant amount pre tax' do
519
+ pending 'But it has a discount that abuses the additional tax total'
520
+ expect(line_item.discounted_amount - line_item.included_tax_total).to eq(8.40)
521
+ end
522
+ end
523
+
524
+ context 'an order with a download and a shipment' do
525
+ let(:variant) { download }
526
+
527
+ before { 2.times { order.next! } }
528
+
529
+ it 'it has a shipment with an adjusted price to 1.68' do
530
+ pending 'but prices are not adjusted yet'
531
+ expect(shipment.amount).to eq(1.68)
532
+ end
533
+
534
+ it 'has a shipment with no included tax' do
535
+ expect(shipment.included_tax_total).to eq(0)
536
+ end
537
+
538
+ it 'has a shipping rate that correctly reflects the shipment' do
539
+ pending 'since no tax created, no correct display price'
540
+ expect(shipping_rate.display_price).to eq("$1.68")
541
+ end
542
+ end
543
+ end
544
+ end
545
+
546
+ # Choosing New York here because in the US, states matter
547
+ context 'selling from new york' do
548
+ let(:new_york) { create(:state, state_code: "NY") }
549
+ let(:united_states) { new_york.country }
550
+ let(:new_york_zone) { create(:zone, states: [new_york]) }
551
+ let(:united_states_zone) { create(:zone, countries: [united_states]) }
552
+ # Creating two rates for books here to
553
+ # mimick the existing specs
554
+ let!(:new_york_books_tax) do
555
+ create(
556
+ :tax_rate,
557
+ name: "New York Sales Tax",
558
+ tax_category: books_category,
559
+ zone: new_york_zone,
560
+ included_in_price: false,
561
+ amount: 0.05
562
+ )
563
+ end
564
+
565
+ let!(:federal_books_tax) do
566
+ create(
567
+ :tax_rate,
568
+ name: "Federal Sales Tax",
569
+ tax_category: books_category,
570
+ zone: united_states_zone,
571
+ included_in_price: false,
572
+ amount: 0.10
573
+ )
574
+ end
575
+
576
+ let!(:federal_digital_tax) do
577
+ create(
578
+ :tax_rate,
579
+ name: "Federal Sales Tax",
580
+ tax_category: digital_category,
581
+ zone: united_states_zone,
582
+ included_in_price: false,
583
+ amount: 0.20
584
+ )
585
+ end
586
+
587
+ let!(:book_shipping_method) do
588
+ create :shipping_method,
589
+ cost: 8.00,
590
+ shipping_categories: [books_shipping_category],
591
+ tax_category: books_category,
592
+ zones: [united_states_zone]
593
+ end
594
+
595
+ let!(:sweater_shipping_method) do
596
+ create :shipping_method,
597
+ cost: 16.00,
598
+ shipping_categories: [normal_shipping_category],
599
+ tax_category: normal_category,
600
+ zones: [united_states_zone]
601
+ end
602
+
603
+ let!(:premium_download_shipping_method) do
604
+ create :shipping_method,
605
+ cost: 2.00,
606
+ shipping_categories: [digital_shipping_category],
607
+ tax_category: digital_category,
608
+ zones: [united_states_zone]
609
+ end
610
+
611
+ before do
612
+ order.contents.add(variant)
613
+ end
614
+
615
+ context 'to new york' do
616
+ let(:shipping_address) { create :address, state_code: "NY" }
617
+
618
+ # A fictional case for an item with two applicable rates
619
+ context 'an order with a book' do
620
+ let(:variant) { book }
621
+
622
+ it 'still has the original price' do
623
+ expect(line_item.price).to eq(20)
624
+ end
625
+
626
+ it 'sells for the line items amount plus additional tax' do
627
+ expect(line_item.total).to eq(23)
628
+ end
629
+
630
+ it 'has two tax adjustments' do
631
+ expect(line_item.adjustments.tax.count).to eq(2)
632
+ end
633
+
634
+ it 'has no included tax' do
635
+ expect(line_item.included_tax_total).to eq(0)
636
+ end
637
+
638
+ it 'has 15% additional tax' do
639
+ expect(line_item.additional_tax_total).to eq(3)
640
+ end
641
+
642
+ it "should delete adjustments for open order when taxrate is deleted" do
643
+ new_york_books_tax.destroy!
644
+ federal_books_tax.destroy!
645
+ expect(line_item.adjustments.count).to eq(0)
646
+ end
647
+
648
+ it "should not delete adjustments for complete order when taxrate is deleted" do
649
+ order.update_column :completed_at, Time.now
650
+ new_york_books_tax.destroy!
651
+ federal_books_tax.destroy!
652
+ expect(line_item.adjustments.count).to eq(2)
653
+ end
654
+ end
655
+
656
+ context 'an order with a book and a shipment' do
657
+ let(:variant) { book }
658
+
659
+ before { 2.times { order.next! } }
660
+
661
+ it 'it has a shipment with a price of 8.00' do
662
+ expect(shipment.amount).to eq(8.00)
663
+ end
664
+
665
+ it 'has a shipment with no included tax' do
666
+ expect(shipment.included_tax_total).to eq(0)
667
+ end
668
+
669
+ it 'has a shipment with additional tax of 1.20' do
670
+ expect(shipment.additional_tax_total).to eq(1.20)
671
+ end
672
+
673
+ it 'has a shipping rate that correctly reflects the shipment' do
674
+ expect(shipping_rate.display_price).to include("$8.00")
675
+ expect(shipping_rate.display_price).to include("+ $0.80 Federal Sales Tax")
676
+ expect(shipping_rate.display_price).to include("+ $0.40 New York Sales Tax")
677
+ end
678
+ end
679
+
680
+ # This is a fictional case for when no taxes apply at all.
681
+ context 'an order with a sweater' do
682
+ let(:variant) { sweater }
683
+
684
+ it 'still has the original price' do
685
+ expect(line_item.price).to eq(30)
686
+ end
687
+
688
+ it 'sells for the line items amount plus additional tax' do
689
+ expect(line_item.total).to eq(30)
690
+ end
691
+
692
+ it 'has no tax adjustments' do
693
+ expect(line_item.adjustments.tax.count).to eq(0)
694
+ end
695
+
696
+ it 'has no included tax' do
697
+ expect(line_item.included_tax_total).to eq(0)
698
+ end
699
+
700
+ it 'has no additional tax' do
701
+ expect(line_item.additional_tax_total).to eq(0)
702
+ end
703
+ end
704
+
705
+ context 'an order with a sweater and a shipment' do
706
+ let(:variant) { sweater }
707
+
708
+ before { 2.times { order.next! } }
709
+
710
+ it 'it has a shipment with a price of 16.00' do
711
+ expect(shipment.amount).to eq(16.00)
712
+ end
713
+
714
+ it 'has a shipment with no included tax' do
715
+ expect(shipment.included_tax_total).to eq(0)
716
+ end
717
+
718
+ it 'has a shipment with no additional tax' do
719
+ expect(shipment.additional_tax_total).to eq(0)
720
+ end
721
+
722
+ it 'has a shipping rate that correctly reflects the shipment' do
723
+ expect(shipping_rate.display_price).to eq("$16.00")
724
+ end
725
+ end
726
+
727
+ # A fictional case with one applicable rate
728
+ context 'an order with a download' do
729
+ let(:variant) { download }
730
+
731
+ it 'still has the original price' do
732
+ expect(line_item.price).to eq(10)
733
+ end
734
+
735
+ it 'sells for the line items amount plus additional tax' do
736
+ expect(line_item.total).to eq(12)
737
+ end
738
+
739
+ it 'has one tax adjustments' do
740
+ expect(line_item.adjustments.tax.count).to eq(1)
741
+ end
742
+
743
+ it 'has no included tax' do
744
+ expect(line_item.included_tax_total).to eq(0)
745
+ end
746
+
747
+ it 'has 15% additional tax' do
748
+ expect(line_item.additional_tax_total).to eq(2)
749
+ end
750
+ end
751
+
752
+ context 'an order with a download and a shipment' do
753
+ let(:variant) { download }
754
+
755
+ before { 2.times { order.next! } }
756
+
757
+ it 'it has a shipment with a price of 2.00' do
758
+ expect(shipment.amount).to eq(2.00)
759
+ end
760
+
761
+ it 'has a shipment with no included tax' do
762
+ expect(shipment.included_tax_total).to eq(0)
763
+ end
764
+
765
+ it 'has a shipment with additional tax of 0.40' do
766
+ expect(shipment.additional_tax_total).to eq(0.40)
767
+ end
768
+
769
+ it 'has a shipping rate that correctly reflects the shipment' do
770
+ expect(shipping_rate.display_price).to eq("$2.00 (+ $0.40 Federal Sales Tax)")
771
+ end
772
+ end
773
+ end
774
+
775
+ context 'when no tax zone is given' do
776
+ let(:shipping_address) { nil }
777
+
778
+ context 'and we buy a book' do
779
+ let(:variant) { book }
780
+
781
+ it 'does not create adjustments' do
782
+ expect(line_item.adjustments.count).to eq(0)
783
+ end
784
+ end
785
+ end
786
+ end
787
+ end