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
@@ -15,7 +15,7 @@ class Spree::StoreCredit < Spree::Base
15
15
  belongs_to :user, class_name: Spree::UserClassHandle.new
16
16
  belongs_to :created_by, class_name: Spree::UserClassHandle.new
17
17
  belongs_to :category, class_name: "Spree::StoreCreditCategory"
18
- belongs_to :credit_type, class_name: 'Spree::StoreCreditType', :foreign_key => 'type_id'
18
+ belongs_to :credit_type, class_name: 'Spree::StoreCreditType', foreign_key: 'type_id'
19
19
  has_many :store_credit_events
20
20
 
21
21
  validates_presence_of :user_id, :category_id, :type_id, :created_by_id, :currency
@@ -44,7 +44,7 @@ class Spree::StoreCredit < Spree::Base
44
44
  amount - amount_used - amount_authorized
45
45
  end
46
46
 
47
- def authorize(amount, order_currency, options={})
47
+ def authorize(amount, order_currency, options = {})
48
48
  authorization_code = options[:action_authorization_code]
49
49
  if authorization_code
50
50
  if store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
@@ -62,7 +62,7 @@ class Spree::StoreCredit < Spree::Base
62
62
  action_originator: options[:action_originator],
63
63
  action_authorization_code: authorization_code,
64
64
 
65
- amount_authorized: self.amount_authorized + amount,
65
+ amount_authorized: amount_authorized + amount
66
66
  })
67
67
  authorization_code
68
68
  else
@@ -77,10 +77,10 @@ class Spree::StoreCredit < Spree::Base
77
77
  elsif currency != order_currency
78
78
  errors.add(:base, Spree.t('store_credit.currency_mismatch'))
79
79
  end
80
- return errors.blank?
80
+ errors.blank?
81
81
  end
82
82
 
83
- def capture(amount, authorization_code, order_currency, options={})
83
+ def capture(amount, authorization_code, order_currency, options = {})
84
84
  return false unless authorize(amount, order_currency, action_authorization_code: authorization_code)
85
85
  auth_event = store_credit_events.find_by!(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
86
86
 
@@ -95,8 +95,8 @@ class Spree::StoreCredit < Spree::Base
95
95
  action_originator: options[:action_originator],
96
96
  action_authorization_code: authorization_code,
97
97
 
98
- amount_used: self.amount_used + amount,
99
- amount_authorized: self.amount_authorized - auth_event.amount,
98
+ amount_used: amount_used + amount,
99
+ amount_authorized: amount_authorized - auth_event.amount
100
100
  })
101
101
  authorization_code
102
102
  end
@@ -106,15 +106,15 @@ class Spree::StoreCredit < Spree::Base
106
106
  end
107
107
  end
108
108
 
109
- def void(authorization_code, options={})
109
+ def void(authorization_code, options = {})
110
110
  if auth_event = store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code: authorization_code)
111
- self.update_attributes!({
111
+ update_attributes!({
112
112
  action: VOID_ACTION,
113
113
  action_amount: auth_event.amount,
114
114
  action_authorization_code: authorization_code,
115
115
  action_originator: options[:action_originator],
116
116
 
117
- amount_authorized: amount_authorized - auth_event.amount,
117
+ amount_authorized: amount_authorized - auth_event.amount
118
118
  })
119
119
  true
120
120
  else
@@ -123,11 +123,11 @@ class Spree::StoreCredit < Spree::Base
123
123
  end
124
124
  end
125
125
 
126
- def credit(amount, authorization_code, order_currency, options={})
126
+ def credit(amount, authorization_code, order_currency, options = {})
127
127
  # Find the amount related to this authorization_code in order to add the store credit back
128
128
  capture_event = store_credit_events.find_by(action: CAPTURE_ACTION, authorization_code: authorization_code)
129
129
 
130
- if currency != order_currency # sanity check to make sure the order currency hasn't changed since the auth
130
+ if currency != order_currency # sanity check to make sure the order currency hasn't changed since the auth
131
131
  errors.add(:base, Spree.t('store_credit.currency_mismatch'))
132
132
  false
133
133
  elsif capture_event && amount <= capture_event.amount
@@ -135,7 +135,7 @@ class Spree::StoreCredit < Spree::Base
135
135
  action: CREDIT_ACTION,
136
136
  action_amount: amount,
137
137
  action_originator: options[:action_originator],
138
- action_authorization_code: authorization_code,
138
+ action_authorization_code: authorization_code
139
139
  }
140
140
  create_credit_record(amount, action_attributes)
141
141
  true
@@ -162,7 +162,7 @@ class Spree::StoreCredit < Spree::Base
162
162
  end
163
163
 
164
164
  def generate_authorization_code
165
- "#{self.id}-SC-#{Time.current.utc.strftime("%Y%m%d%H%M%S%6N")}"
165
+ "#{id}-SC-#{Time.current.utc.strftime('%Y%m%d%H%M%S%6N')}"
166
166
  end
167
167
 
168
168
  def editable?
@@ -208,7 +208,7 @@ class Spree::StoreCredit < Spree::Base
208
208
 
209
209
  private
210
210
 
211
- def create_credit_record(amount, action_attributes={})
211
+ def create_credit_record(amount, action_attributes = {})
212
212
  # Setting credit_to_new_allocation to true will create a new allocation anytime #credit is called
213
213
  # If it is not set, it will update the store credit's amount in place
214
214
  credit = if Spree::Config[:credit_to_new_allocation]
@@ -225,17 +225,17 @@ class Spree::StoreCredit < Spree::Base
225
225
  def create_credit_record_params(amount)
226
226
  {
227
227
  amount: amount,
228
- user_id: self.user_id,
229
- category_id: self.category_id,
230
- created_by_id: self.created_by_id,
231
- currency: self.currency,
232
- type_id: self.type_id,
233
- memo: credit_allocation_memo,
228
+ user_id: user_id,
229
+ category_id: category_id,
230
+ created_by_id: created_by_id,
231
+ currency: currency,
232
+ type_id: type_id,
233
+ memo: credit_allocation_memo
234
234
  }
235
235
  end
236
236
 
237
237
  def credit_allocation_memo
238
- Spree.t("store_credit.credit_allocation_memo", id: self.id)
238
+ Spree.t("store_credit.credit_allocation_memo", id: id)
239
239
  end
240
240
 
241
241
  def store_event
@@ -252,7 +252,7 @@ class Spree::StoreCredit < Spree::Base
252
252
  authorization_code: action_authorization_code || event.authorization_code || generate_authorization_code,
253
253
  user_total_amount: user.total_available_store_credit,
254
254
  originator: action_originator,
255
- update_reason: update_reason,
255
+ update_reason: update_reason
256
256
  })
257
257
  end
258
258
 
@@ -283,7 +283,7 @@ class Spree::StoreCredit < Spree::Base
283
283
  end
284
284
 
285
285
  def associate_credit_type
286
- unless self.type_id
286
+ unless type_id
287
287
  credit_type_name = category.try(:non_expiring?) ? Spree.t("store_credit.non_expiring") : Spree.t("store_credit.expiring")
288
288
  self.credit_type = Spree::StoreCreditType.find_by_name(credit_type_name)
289
289
  end
@@ -5,7 +5,7 @@ class Spree::StoreCreditCategory < Spree::Base
5
5
  class_attribute :reimbursement_category_name
6
6
  self.reimbursement_category_name = Spree.t("store_credit_category.default")
7
7
 
8
- def self.reimbursement_category(reimbursement)
8
+ def self.reimbursement_category(_reimbursement)
9
9
  Spree::StoreCreditCategory.find_by(name: reimbursement_category_name) ||
10
10
  Spree::StoreCreditCategory.first
11
11
  end
@@ -13,5 +13,4 @@ class Spree::StoreCreditCategory < Spree::Base
13
13
  def non_expiring?
14
14
  self.class.non_expiring_credit_types.include? name
15
15
  end
16
-
17
16
  end
@@ -0,0 +1,37 @@
1
+ module Spree
2
+ module Tax
3
+ # Adjust a single taxable item (line item or shipment)
4
+ class ItemAdjuster
5
+ attr_reader :item, :order
6
+
7
+ include TaxHelpers
8
+
9
+ # @param [Spree::LineItem,Spree::Shipment] item to adjust
10
+ # @param [Hash] options like already known tax rates for the order's zone
11
+ def initialize(item, options = {})
12
+ @item = item
13
+ @order = @item.order
14
+ # set instance variable so `TaxRate.match` is only called when necessary
15
+ @rates_for_order_zone = options[:rates_for_order_zone]
16
+ @rates_for_default_zone = options[:rates_for_default_zone]
17
+ @order_tax_zone = options[:order_tax_zone]
18
+ @skip_destroy_adjustments = options[:skip_destroy_adjustments]
19
+ end
20
+
21
+ # Deletes all existing tax adjustments and creates new adjustments for all
22
+ # (geographically and category-wise) applicable tax rates.
23
+ #
24
+ # Creating the adjustments will also run the ItemAdjustments class and
25
+ # persist all taxation and promotion totals on the item.
26
+ #
27
+ # @return [Array<Spree::Adjustment>] newly created adjustments
28
+ def adjust!
29
+ return unless order_tax_zone(order)
30
+ # Using .destroy_all to make sure callbacks fire
31
+ item.adjustments.tax.destroy_all unless @skip_destroy_adjustments
32
+
33
+ rates_for_item(item).map { |rate| rate.adjust(order_tax_zone(order), item) }
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,38 @@
1
+ module Spree
2
+ module Tax
3
+ # Add tax adjustments to all line items and shipments in an order
4
+ class OrderAdjuster
5
+ attr_reader :order
6
+
7
+ include TaxHelpers
8
+
9
+ # @param [Spree::Order] order to be adjusted
10
+ def initialize(order)
11
+ @order = order
12
+ end
13
+
14
+ # Creates tax adjustments for all taxable items (shipments and line items)
15
+ # in the given order.
16
+ def adjust!
17
+ return unless order_tax_zone(order)
18
+
19
+ order.all_adjustments.tax.destroy_all
20
+
21
+ (order.line_items + order.shipments).each do |item|
22
+ ItemAdjuster.new(item, order_wide_options).adjust!
23
+ end
24
+ end
25
+
26
+ private
27
+
28
+ def order_wide_options
29
+ {
30
+ rates_for_order_zone: rates_for_order_zone(order),
31
+ rates_for_default_zone: rates_for_default_zone,
32
+ order_tax_zone: order_tax_zone(order),
33
+ skip_destroy_adjustments: true
34
+ }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Tax
3
+ # Used to build shipping rate taxes
4
+ class ShippingRateTaxer
5
+ include TaxHelpers
6
+
7
+ # Build shipping rate taxes for a shipping rate
8
+ # Modifies the passed-in shipping rate with associated shipping rate taxes.
9
+ # @param [Spree::ShippingRate] shipping_rate The shipping rate to add taxes to.
10
+ # This parameter will be modified.
11
+ # @return [Spree::ShippingRate] The shipping rate with associated tax objects
12
+ def tax(shipping_rate)
13
+ tax_rates_for_shipping_rate(shipping_rate).each do |tax_rate|
14
+ shipping_rate.taxes.build(
15
+ amount: tax_rate.compute_amount(shipping_rate),
16
+ tax_rate: tax_rate
17
+ )
18
+ end
19
+ shipping_rate
20
+ end
21
+
22
+ private
23
+
24
+ def tax_rates_for_shipping_rate(shipping_rate)
25
+ applicable_rates(shipping_rate.order).select do |tax_rate|
26
+ tax_rate.tax_category == shipping_rate.tax_category
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,49 @@
1
+ module Spree
2
+ module Tax
3
+ module TaxHelpers
4
+ private
5
+
6
+ # Imagine with me this scenario:
7
+ # You are living in Spain and you have a store which ships to France.
8
+ # Spain is therefore your default tax rate.
9
+ # When you ship to Spain, you want the Spanish rate to apply.
10
+ # When you ship to France, you want the French rate to apply.
11
+ #
12
+ # Normally, Spree would notice that you have two potentially applicable
13
+ # tax rates for one particular item.
14
+ # When you ship to Spain, only the Spanish one will apply.
15
+ # When you ship to France, you'll see a Spanish refund AND a French tax.
16
+ # This little bit of code at the end stops the Spanish refund from appearing.
17
+ #
18
+ # For further discussion, see https://github.com/spree/spree/issues/4397 and https://github.com/spree/spree/issues/4327.
19
+ def applicable_rates(order)
20
+ order_zone_tax_categories = rates_for_order_zone(order).map(&:tax_category)
21
+ default_rates_with_unmatched_tax_category = rates_for_default_zone.to_a.delete_if do |default_rate|
22
+ order_zone_tax_categories.include?(default_rate.tax_category)
23
+ end
24
+
25
+ (rates_for_order_zone(order) + default_rates_with_unmatched_tax_category).uniq
26
+ end
27
+
28
+ def rates_for_order_zone(order)
29
+ @rates_for_order_zone ||= Spree::TaxRate.for_zone(order_tax_zone(order))
30
+ end
31
+
32
+ def rates_for_default_zone
33
+ @rates_for_default_zone ||= Spree::TaxRate.for_zone(Spree::Zone.default_tax)
34
+ end
35
+
36
+ def order_tax_zone(order)
37
+ @order_tax_zone ||= order.tax_zone
38
+ end
39
+
40
+ def sum_of_included_tax_rates(item)
41
+ rates_for_item(item).map(&:amount).sum
42
+ end
43
+
44
+ def rates_for_item(item)
45
+ applicable_rates(item.order).select { |rate| rate.tax_category == item.tax_category }
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,33 @@
1
+ module Spree
2
+ module Tax
3
+ # A class exclusively used as a drop-in replacement for a default tax address.
4
+ # It responds to `:country_id` and `:state_id`.
5
+ #
6
+ # @attr_reader [Integer] country_id the ID of a Spree::Country object
7
+ # @attr_reader [Integer] state_id the ID of a Spree::State object
8
+ class TaxLocation
9
+ attr_reader :country_id, :state_id
10
+
11
+ # Create a new TaxLocation object
12
+ #
13
+ # @see Spree::Zone.for_address
14
+ #
15
+ # @param [Spree::Country] country a Spree::Country object, default: nil
16
+ # @param [Spree::State] state a Spree::State object, default: nil
17
+ #
18
+ # @return [Spree::Tax::TaxLocation] a Spree::Tax::TaxLocation object
19
+ def initialize(country: nil, state: nil)
20
+ @country_id = country && country.id
21
+ @state_id = state && state.id
22
+ end
23
+
24
+ def ==(other)
25
+ state_id == other.state_id && country_id == other.country_id
26
+ end
27
+
28
+ def empty?
29
+ country_id.nil? && state_id.nil?
30
+ end
31
+ end
32
+ end
33
+ end
@@ -13,7 +13,7 @@ module Spree
13
13
 
14
14
  def ensure_one_default
15
15
  if is_default
16
- Spree::TaxCategory.where(is_default: true).where.not(id: self.id).update_all(is_default: false, updated_at: Time.current)
16
+ Spree::TaxCategory.where(is_default: true).where.not(id: id).update_all(is_default: false, updated_at: Time.current)
17
17
  end
18
18
  end
19
19
  end
@@ -22,90 +22,17 @@ module Spree
22
22
  belongs_to :tax_category, class_name: "Spree::TaxCategory", inverse_of: :tax_rates
23
23
 
24
24
  has_many :adjustments, as: :source
25
+ has_many :shipping_rate_taxes, class_name: "Spree::ShippingRateTax"
25
26
 
26
27
  validates :amount, presence: true, numericality: true
27
28
  validates :tax_category_id, presence: true
28
29
  validates_with DefaultTaxZoneValidator
29
30
 
30
- scope :by_zone, ->(zone) { where(zone_id: zone) }
31
+ # Finds all tax rates whose zones match a given address
32
+ scope :for_address, ->(address) { joins(:zone).merge(Spree::Zone.for_address(address)) }
31
33
 
32
- # Gets the array of TaxRates appropriate for the specified order
33
- def self.match(order_tax_zone)
34
- return [] unless order_tax_zone
35
- rates = includes(zone: { zone_members: :zoneable }).load.select do |rate|
36
- # Why "potentially"?
37
- # Go see the documentation for that method.
38
- rate.potentially_applicable?(order_tax_zone)
39
- end
40
-
41
- # Imagine with me this scenario:
42
- # You are living in Spain and you have a store which ships to France.
43
- # Spain is therefore your default tax rate.
44
- # When you ship to Spain, you want the Spanish rate to apply.
45
- # When you ship to France, you want the French rate to apply.
46
- #
47
- # Normally, Spree would notice that you have two potentially applicable
48
- # tax rates for one particular item.
49
- # When you ship to Spain, only the Spanish one will apply.
50
- # When you ship to France, you'll see a Spanish refund AND a French tax.
51
- # This little bit of code at the end stops the Spanish refund from appearing.
52
- #
53
- # For further discussion, see https://github.com/spree/spree/issues/4397 and https://github.com/spree/spree/issues/4327.
54
-
55
- remaining_rates = rates.dup
56
- rates.each do |rate|
57
- if rate.included_in_price?
58
- if remaining_rates.any?{|r| r != rate && r.tax_category == rate.tax_category }
59
- remaining_rates.delete(rate)
60
- end
61
- end
62
- end
63
-
64
- remaining_rates
65
- end
66
-
67
- # Pre-tax amounts must be stored so that we can calculate
68
- # correct rate amounts in the future. For example:
69
- # https://github.com/spree/spree/issues/4318#issuecomment-34723428
70
- def self.store_pre_tax_amount(item, rates)
71
- pre_tax_amount = case item
72
- when Spree::LineItem then item.discounted_amount
73
- when Spree::Shipment then item.discounted_cost
74
- end
75
-
76
- included_rates = rates.select(&:included_in_price)
77
- if included_rates.any?
78
- pre_tax_amount /= (1 + included_rates.map(&:amount).sum)
79
- end
80
-
81
- item.update_column(:pre_tax_amount, pre_tax_amount.round(2))
82
- end
83
-
84
- # This method is best described by the documentation on #potentially_applicable?
85
- def self.adjust(order_tax_zone, items)
86
- rates = self.match(order_tax_zone)
87
- tax_categories = rates.map(&:tax_category)
88
- relevant_items, non_relevant_items = items.partition { |item| tax_categories.include?(item.tax_category) }
89
- relevant_items.group_by { |item| item.class.name }.each do |class_name, items|
90
- Spree::Adjustment.where(adjustable_type: class_name, adjustable_id: items.map(&:id)).tax.destroy_all
91
- end
92
- relevant_items.each do |item|
93
- relevant_rates = rates.select { |rate| rate.tax_category == item.tax_category }
94
- store_pre_tax_amount(item, relevant_rates)
95
- relevant_rates.each do |rate|
96
- rate.adjust(order_tax_zone, item)
97
- end
98
- end
99
- non_relevant_items.each do |item|
100
- if item.adjustments.tax.present?
101
- item.adjustments.tax.destroy_all # using destroy_all to ensure adjustment destroy callback fires.
102
- item.update_columns pre_tax_amount: 0
103
- end
104
- end
105
- end
106
-
107
- # Tax rates can *potentially* be applicable to an order.
108
- # We do not know if they are/aren't until we attempt to apply these rates to
34
+ # Finds geographically matching tax rates for a tax zone.
35
+ # We do not know if they are/aren't applicable until we attempt to apply these rates to
109
36
  # the items contained within the Order itself.
110
37
  # For instance, if a rate passes the criteria outlined in this method,
111
38
  # but then has a tax category that doesn't match against any of the line items
@@ -144,11 +71,20 @@ module Spree
144
71
  # Under no circumstances should negative adjustments be applied for the Spanish tax rates.
145
72
  #
146
73
  # Those rates should never come into play at all and only the French rates should apply.
147
- def potentially_applicable?(order_tax_zone)
148
- # If the rate's zone *contains* the order's tax zone, then it's applicable.
149
- self.zone.contains?(order_tax_zone) ||
150
- # The rate is a VAT and its zone contains the default zone, then it's applicable.
151
- (self.included_in_price? && self.zone.contains?(Spree::Zone.default_tax))
74
+ scope :for_zone, ->(zone) { where(zone_id: Spree::Zone.with_shared_members(zone).pluck(:id)) }
75
+ scope :included_in_price, -> { where(included_in_price: true) }
76
+
77
+ # Create tax adjustments for some items that have the same tax zone.
78
+ #
79
+ # @deprecated Please use Spree::Tax::OrderAdjuster or Spree::Tax::ItemAdjuster instead.
80
+ #
81
+ # @param [Spree::Zone] order_tax_zone is the smalles applicable zone to the order's tax address
82
+ # @param [Array<Spree::LineItem,Spree::Shipment>] items to be adjusted
83
+ def self.adjust(order_tax_zone, items)
84
+ ActiveSupport::Deprecation.warn("Please use Spree::Tax::OrderAdjuster or Spree::Tax::ItemAdjuster instead", caller)
85
+ items.map do |item|
86
+ Spree::Tax::ItemAdjuster.new(item, rates_for_order_zone: for_zone(order_tax_zone)).adjust!
87
+ end
152
88
  end
153
89
 
154
90
  # Creates necessary tax adjustments for the order.
@@ -156,44 +92,43 @@ module Spree
156
92
  amount = compute_amount(item)
157
93
  return if amount == 0
158
94
 
159
- included = included_in_price && default_zone_or_zone_match?(order_tax_zone)
160
-
161
- if amount < 0
162
- label = Spree.t(:refund) + ' ' + create_label
163
- end
95
+ included = included_in_price && amount > 0
164
96
 
165
- self.adjustments.create!({
166
- :adjustable => item,
167
- :amount => amount,
168
- :order_id => item.order_id,
169
- :label => label || create_label,
170
- :included => included
97
+ adjustments.create!({
98
+ adjustable: item,
99
+ amount: amount,
100
+ order_id: item.order_id,
101
+ label: adjustment_label(amount),
102
+ included: included
171
103
  })
172
104
  end
173
105
 
174
106
  # This method is used by Adjustment#update to recalculate the cost.
175
107
  def compute_amount(item)
176
- if included_in_price && !default_zone_or_zone_match?(item.order.tax_zone)
177
- # In this case, it's a refund.
178
- calculator.compute(item) * - 1
179
- else
180
- calculator.compute(item)
181
- end
182
- end
183
-
184
- def default_zone_or_zone_match?(order_tax_zone)
185
- Zone.default_tax.try!(:contains?, order_tax_zone) || self.zone.contains?(order_tax_zone)
108
+ calculator.compute(item)
186
109
  end
187
110
 
188
111
  private
189
112
 
190
- def create_label
191
- label = ""
192
- label << (name.present? ? name : tax_category.name) + " "
193
- label << (show_rate_in_label? ? "#{amount * 100}%" : "")
194
- label << " (#{Spree.t(:included_in_price)})" if included_in_price?
195
- label
196
- end
113
+ def adjustment_label(amount)
114
+ Spree.t translation_key(amount),
115
+ scope: "adjustment_labels.tax_rates",
116
+ name: name.presence || tax_category.name,
117
+ amount: amount_for_adjustment_label
118
+ end
197
119
 
120
+ def amount_for_adjustment_label
121
+ ActiveSupport::NumberHelper::NumberToPercentageConverter.convert(
122
+ amount * 100,
123
+ locale: I18n.locale
124
+ )
125
+ end
126
+
127
+ def translation_key(amount)
128
+ key = included_in_price? ? "vat" : "sales_tax"
129
+ key += "_refund" if amount < 0
130
+ key += "_with_rate" if show_rate_in_label?
131
+ key.to_sym
132
+ end
198
133
  end
199
134
  end
@@ -13,6 +13,8 @@ module Spree
13
13
  has_many :promotion_rules, through: :promotion_rule_taxons
14
14
 
15
15
  before_create :set_permalink
16
+ before_update :set_permalink
17
+ after_update :update_child_permalinks, if: :permalink_changed?
16
18
 
17
19
  validates :name, presence: true
18
20
  validates :meta_keywords, length: { maximum: 255 }
@@ -47,7 +49,7 @@ module Spree
47
49
  # @return [String] meta_title if set otherwise a string containing the
48
50
  # root name and taxon name
49
51
  def seo_title
50
- unless meta_title.blank?
52
+ if meta_title.present?
51
53
  meta_title
52
54
  else
53
55
  root? ? name : "#{root.name} - #{name}"
@@ -57,11 +59,22 @@ module Spree
57
59
  # Sets this taxons permalink to a valid url encoded string based on its
58
60
  # name and its parents permalink (if present.)
59
61
  def set_permalink
60
- if parent.present?
61
- self.permalink = [parent.permalink, (permalink.blank? ? name.to_url : permalink.split('/').last)].join('/')
62
- else
63
- self.permalink = name.to_url if permalink.blank?
64
- end
62
+ permalink_tail = permalink.split('/').last if permalink.present?
63
+ permalink_tail ||= name.to_url
64
+ self.permalink_part = permalink_tail
65
+ end
66
+
67
+ # Update the permalink for this taxon and all children (if necessary)
68
+ def update_permalinks
69
+ set_permalink
70
+
71
+ # This will trigger update_child_permalinks if permalink has changed
72
+ save!
73
+ end
74
+
75
+ # Update the permalinks for all children
76
+ def update_child_permalinks
77
+ children.each(&:update_permalinks)
65
78
  end
66
79
 
67
80
  # @return [String] this taxon's permalink
@@ -72,16 +85,15 @@ module Spree
72
85
  # @return [ActiveRecord::Relation<Spree::Product>] the active products the
73
86
  # belong to this taxon
74
87
  def active_products
75
- products.active
88
+ products.not_deleted.available
76
89
  end
77
90
 
78
91
  # @return [String] this taxon's ancestors names followed by its own name,
79
92
  # separated by arrows
80
93
  def pretty_name
81
- ancestor_chain = self.ancestors.inject("") do |name, ancestor|
82
- name += "#{ancestor.name} -> "
83
- end
84
- ancestor_chain + "#{name}"
94
+ ancestor_chain = ancestors.map(&:name)
95
+ ancestor_chain << name
96
+ ancestor_chain.join(" -> ")
85
97
  end
86
98
 
87
99
  # @see https://github.com/spree/spree/issues/3390
@@ -92,7 +104,19 @@ module Spree
92
104
  #
93
105
  # NOTE: no :position column needed - awesom_nested_set doesn't handle the
94
106
  # reordering if you bring your own :order_column.
95
- move_to_child_with_index(parent, idx.to_i) unless self.new_record?
107
+ move_to_child_with_index(parent, idx.to_i) unless new_record?
108
+ end
109
+
110
+ def permalink_part
111
+ permalink.split('/').last
112
+ end
113
+
114
+ def permalink_part=(value)
115
+ if parent.present?
116
+ self.permalink = "#{parent.permalink}/#{value}"
117
+ else
118
+ self.permalink = value
119
+ end
96
120
  end
97
121
 
98
122
  private
@@ -12,16 +12,16 @@ module Spree
12
12
  default_scope -> { order(:position) }
13
13
 
14
14
  private
15
- def set_name
16
- if root
17
- root.update_columns(
18
- name: name,
19
- updated_at: Time.current,
20
- )
21
- else
22
- self.root = Taxon.create!(taxonomy_id: id, name: name)
23
- end
24
- end
25
15
 
16
+ def set_name
17
+ if root
18
+ root.update_columns(
19
+ name: name,
20
+ updated_at: Time.current
21
+ )
22
+ else
23
+ self.root = Taxon.create!(taxonomy_id: id, name: name)
24
+ end
25
+ end
26
26
  end
27
27
  end