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
@@ -1,7 +1,6 @@
1
1
  module Spree
2
2
  class ReturnsCalculator < Calculator
3
-
4
- def compute(return_item)
3
+ def compute(_return_item)
5
4
  raise NotImplementedError, "Please implement 'compute(return_item)' in your calculator: #{self.class.name}"
6
5
  end
7
6
  end
@@ -17,7 +17,7 @@ module Spree
17
17
 
18
18
  before_destroy :ensure_can_destroy
19
19
 
20
- # TODO remove the suppress_mailer temporary variable once we are calling 'ship'
20
+ # TODO: remove the suppress_mailer temporary variable once we are calling 'ship'
21
21
  # from outside of the state machine and can actually pass variables through.
22
22
  attr_accessor :special_instructions, :suppress_mailer
23
23
 
@@ -66,7 +66,7 @@ module Spree
66
66
  shipment.state_changes.create!(
67
67
  previous_state: transition.from,
68
68
  next_state: transition.to,
69
- name: 'shipment',
69
+ name: 'shipment'
70
70
  )
71
71
  end
72
72
  end
@@ -74,12 +74,15 @@ module Spree
74
74
  self.whitelisted_ransackable_associations = ['order']
75
75
  self.whitelisted_ransackable_attributes = ['number']
76
76
 
77
+ delegate :tax_category, to: :selected_shipping_rate, allow_nil: true
78
+
77
79
  def can_transition_from_pending_to_shipped?
78
80
  !requires_shipment?
79
81
  end
80
82
 
81
83
  def can_transition_from_pending_to_ready?
82
- order.can_ship? && !inventory_units.any?(&:backordered?) &&
84
+ order.can_ship? &&
85
+ inventory_units.all? { |iu| iu.allow_ship? || iu.canceled? } &&
83
86
  (order.paid? || !Spree::Config[:require_payment_to_ship])
84
87
  end
85
88
 
@@ -88,8 +91,8 @@ module Spree
88
91
  end
89
92
 
90
93
  extend DisplayMoney
91
- money_methods :cost, :discounted_cost, :final_price, :item_cost
92
- alias display_amount display_cost
94
+ money_methods :cost, :amount, :discounted_cost, :final_price, :item_cost
95
+ alias_attribute :amount, :cost
93
96
 
94
97
  def add_shipping_method(shipping_method, selected = false)
95
98
  shipping_rates.create(shipping_method: shipping_method, selected: selected, cost: cost)
@@ -104,7 +107,7 @@ module Spree
104
107
  end
105
108
 
106
109
  def backordered?
107
- inventory_units.any? { |inventory_unit| inventory_unit.backordered? }
110
+ inventory_units.any?(&:backordered?)
108
111
  end
109
112
 
110
113
  def currency
@@ -116,8 +119,7 @@ module Spree
116
119
  end
117
120
  alias discounted_amount discounted_cost
118
121
 
119
-
120
- def editable_by?(user)
122
+ def editable_by?(_user)
121
123
  !shipped?
122
124
  end
123
125
 
@@ -162,8 +164,12 @@ module Spree
162
164
  inventory_units.includes(:line_item).map(&:line_item).uniq
163
165
  end
164
166
 
167
+ def pre_tax_amount
168
+ discounted_amount - included_tax_total
169
+ end
170
+
165
171
  def ready_or_pending?
166
- self.ready? || self.pending?
172
+ ready? || pending?
167
173
  end
168
174
 
169
175
  def refresh_rates
@@ -173,7 +179,7 @@ module Spree
173
179
  # StockEstimator.new assigment below will replace the current shipping_method
174
180
  original_shipping_method_id = shipping_method.try!(:id)
175
181
 
176
- new_rates = Spree::Config.stock.estimator_class.new(order).shipping_rates(to_package)
182
+ new_rates = Spree::Config.stock.estimator_class.new.shipping_rates(to_package)
177
183
 
178
184
  # If one of the new rates matches the previously selected shipping
179
185
  # method, select that instead of the default provided by the estimator.
@@ -186,7 +192,7 @@ module Spree
186
192
  end
187
193
 
188
194
  self.shipping_rates = new_rates
189
- self.save!
195
+ save!
190
196
 
191
197
  shipping_rates
192
198
  end
@@ -206,7 +212,7 @@ module Spree
206
212
  def selected_shipping_rate_id=(id)
207
213
  shipping_rates.update_all(selected: false)
208
214
  shipping_rates.update(id, selected: true)
209
- self.save!
215
+ save!
210
216
  end
211
217
 
212
218
  # Determines the appropriate +state+ according to the following logic:
@@ -217,10 +223,9 @@ module Spree
217
223
  # ready all other cases
218
224
  def determine_state(order)
219
225
  return 'canceled' if order.canceled?
226
+ return 'shipped' if shipped?
220
227
  return 'pending' unless order.can_ship?
221
- return 'pending' if inventory_units.any? &:backordered?
222
- return 'shipped' if state == 'shipped'
223
- if order.paid? || !Spree::Config[:require_payment_to_ship]
228
+ if can_transition_from_pending_to_ready?
224
229
  'ready'
225
230
  else
226
231
  'pending'
@@ -228,7 +233,7 @@ module Spree
228
233
  end
229
234
 
230
235
  def set_up_inventory(state, variant, order, line_item)
231
- self.inventory_units.create(
236
+ inventory_units.create(
232
237
  state: state,
233
238
  variant_id: variant.id,
234
239
  order_id: order.id,
@@ -245,10 +250,6 @@ module Spree
245
250
  selected_shipping_rate.try(:shipping_method) || shipping_rates.first.try(:shipping_method)
246
251
  end
247
252
 
248
- def tax_category
249
- selected_shipping_rate.try(:tax_rate).try(:tax_category)
250
- end
251
-
252
253
  # Only one of either included_tax_total or additional_tax_total is set
253
254
  # This method returns the total of the two. Saves having to check if
254
255
  # tax is included or additional.
@@ -258,6 +259,7 @@ module Spree
258
259
 
259
260
  def to_package
260
261
  package = Stock::Package.new(stock_location)
262
+ package.shipment = self
261
263
  inventory_units.includes(:variant).joins(:variant).group_by(&:state).each do |state, state_inventory_units|
262
264
  package.add_multiple state_inventory_units, state.to_sym
263
265
  end
@@ -269,35 +271,41 @@ module Spree
269
271
  end
270
272
 
271
273
  def tracking_url
274
+ return nil unless tracking && shipping_method
275
+
272
276
  @tracking_url ||= shipping_method.build_tracking_url(tracking)
273
277
  end
274
278
 
275
279
  def update_amounts
276
280
  if selected_shipping_rate
277
- self.update_columns(
278
- cost: selected_shipping_rate.cost,
279
- adjustment_total: adjustments.additional.map(&:update!).compact.sum,
280
- updated_at: Time.current,
281
- )
281
+ self.cost = selected_shipping_rate.cost
282
+ self.adjustment_total = adjustments.additional.map(&:update!).compact.sum
283
+ if changed?
284
+ update_columns(
285
+ cost: cost,
286
+ adjustment_total: adjustment_total,
287
+ updated_at: Time.current
288
+ )
289
+ end
282
290
  end
283
291
  end
284
292
 
285
293
  # Update Shipment and make sure Order states follow the shipment changes
286
294
  def update_attributes_and_order(params = {})
287
- if self.update_attributes params
288
- if params.has_key? :selected_shipping_rate_id
295
+ if update_attributes params
296
+ if params.key? :selected_shipping_rate_id
289
297
  # Changing the selected Shipping Rate won't update the cost (for now)
290
298
  # so we persist the Shipment#cost before calculating order shipment
291
299
  # total and updating payment state (given a change in shipment cost
292
300
  # might change the Order#payment_state)
293
- self.update_amounts
301
+ update_amounts
294
302
 
295
303
  order.updater.update_shipment_total
296
304
  order.updater.update_payment_state
297
305
 
298
306
  # Update shipment state only after order total is updated because it
299
307
  # (via Order#paid?) affects the shipment state (YAY)
300
- self.update_columns(
308
+ update_columns(
301
309
  state: determine_state(order),
302
310
  updated_at: Time.current
303
311
  )
@@ -318,11 +326,13 @@ module Spree
318
326
  def update!(order)
319
327
  old_state = state
320
328
  new_state = determine_state(order)
321
- update_columns(
322
- state: new_state,
323
- updated_at: Time.current,
324
- )
325
- after_ship if new_state == 'shipped' and old_state != 'shipped'
329
+ if new_state != old_state
330
+ update_columns(
331
+ state: new_state,
332
+ updated_at: Time.current
333
+ )
334
+ after_ship if new_state == 'shipped'
335
+ end
326
336
  end
327
337
 
328
338
  def transfer_to_location(variant, quantity, stock_location)
@@ -333,8 +343,8 @@ module Spree
333
343
  transaction do
334
344
  new_shipment = order.shipments.create!(stock_location: stock_location)
335
345
 
336
- order.contents.remove(variant, quantity, {shipment: self})
337
- order.contents.add(variant, quantity, {shipment: new_shipment})
346
+ order.contents.remove(variant, quantity, { shipment: self })
347
+ order.contents.add(variant, quantity, { shipment: new_shipment })
338
348
 
339
349
  refresh_rates
340
350
  save!
@@ -343,16 +353,13 @@ module Spree
343
353
  end
344
354
 
345
355
  def transfer_to_shipment(variant, quantity, shipment_to_transfer_to)
346
- quantity_already_shipment_to_transfer_to = shipment_to_transfer_to.manifest.find{|mi| mi.line_item.variant == variant}.try(:quantity) || 0
347
- final_quantity = quantity + quantity_already_shipment_to_transfer_to
348
-
349
- if (quantity <= 0 || self == shipment_to_transfer_to)
356
+ if quantity <= 0 || self == shipment_to_transfer_to
350
357
  raise ArgumentError
351
358
  end
352
359
 
353
360
  transaction do
354
- order.contents.remove(variant, quantity, {shipment: self})
355
- order.contents.add(variant, quantity, {shipment: shipment_to_transfer_to})
361
+ order.contents.remove(variant, quantity, { shipment: self })
362
+ order.contents.add(variant, quantity, { shipment: shipment_to_transfer_to })
356
363
 
357
364
  refresh_rates
358
365
  save!
@@ -367,48 +374,47 @@ module Spree
367
374
 
368
375
  private
369
376
 
370
- def after_ship
371
- order.shipping.ship_shipment(self, suppress_mailer: suppress_mailer)
372
- end
373
-
374
- def can_get_rates?
375
- order.ship_address && order.ship_address.valid?
376
- end
377
+ def after_ship
378
+ order.shipping.ship_shipment(self, suppress_mailer: suppress_mailer)
379
+ end
377
380
 
378
- def manifest_restock(item)
379
- if item.states["on_hand"].to_i > 0
380
- stock_location.restock item.variant, item.states["on_hand"], self
381
- end
381
+ def can_get_rates?
382
+ order.ship_address && order.ship_address.valid?
383
+ end
382
384
 
383
- if item.states["backordered"].to_i > 0
384
- stock_location.restock_backordered item.variant, item.states["backordered"]
385
- end
385
+ def manifest_restock(item)
386
+ if item.states["on_hand"].to_i > 0
387
+ stock_location.restock item.variant, item.states["on_hand"], self
386
388
  end
387
389
 
388
- def manifest_unstock(item)
389
- stock_location.unstock item.variant, item.quantity, self
390
+ if item.states["backordered"].to_i > 0
391
+ stock_location.restock_backordered item.variant, item.states["backordered"]
390
392
  end
393
+ end
391
394
 
392
- def recalculate_adjustments
393
- Spree::ItemAdjustments.new(self).update
394
- end
395
+ def manifest_unstock(item)
396
+ stock_location.unstock item.variant, item.quantity, self
397
+ end
395
398
 
396
- def set_cost_zero_when_nil
397
- self.cost = 0 unless self.cost
398
- end
399
+ def recalculate_adjustments
400
+ Spree::ItemAdjustments.new(self).update
401
+ end
399
402
 
400
- def update_adjustments
401
- if cost_changed? && state != 'shipped'
402
- recalculate_adjustments
403
- end
404
- end
403
+ def set_cost_zero_when_nil
404
+ self.cost = 0 unless cost
405
+ end
405
406
 
407
+ def update_adjustments
408
+ if cost_changed? && state != 'shipped'
409
+ recalculate_adjustments
410
+ end
411
+ end
406
412
 
407
- def ensure_can_destroy
408
- unless pending?
409
- errors.add(:state, :cannot_destroy, state: self.state)
410
- return false
411
- end
413
+ def ensure_can_destroy
414
+ unless pending?
415
+ errors.add(:state, :cannot_destroy, state: state)
416
+ return false
412
417
  end
418
+ end
413
419
  end
414
420
  end
@@ -1,22 +1,21 @@
1
1
  module Spree
2
2
  class ShippingCalculator < Calculator
3
-
4
- def compute_shipment(shipment)
3
+ def compute_shipment(_shipment)
5
4
  raise NotImplementedError, "Please implement 'compute_shipment(shipment)' in your calculator: #{self.class.name}"
6
5
  end
7
6
 
8
- def compute_package(package)
7
+ def compute_package(_package)
9
8
  raise NotImplementedError, "Please implement 'compute_package(package)' in your calculator: #{self.class.name}"
10
9
  end
11
10
 
12
- def available?(package)
11
+ def available?(_package)
13
12
  true
14
13
  end
15
14
 
16
15
  private
16
+
17
17
  def total(content_items)
18
18
  content_items.map(&:amount).sum
19
19
  end
20
20
  end
21
21
  end
22
-
@@ -7,16 +7,15 @@ class Spree::ShippingManifest
7
7
 
8
8
  def for_order(order)
9
9
  Spree::ShippingManifest.new(
10
- inventory_units: @inventory_units.select {|iu| iu.order_id == order.id }
10
+ inventory_units: @inventory_units.select { |iu| iu.order_id == order.id }
11
11
  )
12
12
  end
13
13
 
14
14
  def items
15
15
  # Grouping by the ID means that we don't have to call out to the association accessor
16
16
  # This makes the grouping by faster because it results in less SQL cache hits.
17
- @inventory_units.group_by(&:variant_id).map do |variant_id, variant_units|
18
- variant_units.group_by(&:line_item_id).map do |line_item_id, units|
19
-
17
+ @inventory_units.group_by(&:variant_id).map do |_variant_id, variant_units|
18
+ variant_units.group_by(&:line_item_id).map do |_line_item_id, units|
20
19
  states = {}
21
20
  units.group_by(&:state).each { |state, iu| states[state] = iu.count }
22
21
 
@@ -4,21 +4,67 @@ module Spree
4
4
  include Spree::CalculatedAdjustments
5
5
  DISPLAY = [:both, :front_end, :back_end]
6
6
 
7
- has_many :shipping_method_categories, :dependent => :destroy
7
+ has_many :shipping_method_categories, dependent: :destroy
8
8
  has_many :shipping_categories, through: :shipping_method_categories
9
9
  has_many :shipping_rates, inverse_of: :shipping_method
10
- has_many :shipments, :through => :shipping_rates
10
+ has_many :shipments, through: :shipping_rates
11
11
  has_many :cartons, inverse_of: :shipping_method
12
12
 
13
13
  has_many :shipping_method_zones
14
14
  has_many :zones, through: :shipping_method_zones
15
15
 
16
- belongs_to :tax_category, -> { with_deleted }, :class_name => 'Spree::TaxCategory'
16
+ belongs_to :tax_category, -> { with_deleted }, class_name: 'Spree::TaxCategory'
17
+ has_many :shipping_method_stock_locations, dependent: :destroy, class_name: "Spree::ShippingMethodStockLocation"
18
+ has_many :stock_locations, through: :shipping_method_stock_locations
17
19
 
18
20
  validates :name, presence: true
19
21
 
20
22
  validate :at_least_one_shipping_category
21
23
 
24
+ # @param shipping_category_ids [Array<Integer>] ids of desired shipping categories
25
+ # @return [ActiveRecord::Relation] shipping methods which are associated
26
+ # with all of the provided shipping categories
27
+ def self.with_all_shipping_category_ids(shipping_category_ids)
28
+ # Some extra care is needed with the having clause to ensure we are
29
+ # counting distinct records of the join table. Otherwise a join could
30
+ # cause this to return incorrect results.
31
+ join_table = ShippingMethodCategory.arel_table
32
+ having = join_table[:id].count(true).eq(shipping_category_ids.count)
33
+ joins(:shipping_method_categories).
34
+ where(spree_shipping_method_categories: { shipping_category_id: shipping_category_ids }).
35
+ group('spree_shipping_methods.id').
36
+ having(having)
37
+ end
38
+
39
+ # @param stock_location [Spree::StockLocation] stock location
40
+ # @return [ActiveRecord::Relation] shipping methods which are available
41
+ # with the stock location or are marked available_to_all
42
+ def self.available_in_stock_location(stock_location)
43
+ smsl_table = ShippingMethodStockLocation.arel_table
44
+
45
+ # We are searching for either a matching entry in the stock location join
46
+ # table or available_to_all being true.
47
+ # We need to use an outer join otherwise a shipping method with no
48
+ # associated stock locations will be filtered out of the results. In
49
+ # rails 5 this will be easy using .left_join and .or, but for now we must
50
+ # use arel to achieve this.
51
+ arel_join =
52
+ arel_table.join(smsl_table, Arel::Nodes::OuterJoin).
53
+ on(arel_table[:id].eq(smsl_table[:shipping_method_id])).
54
+ join_sources
55
+ arel_condition =
56
+ arel_table[:available_to_all].eq(true).or(smsl_table[:stock_location_id].eq(stock_location.id))
57
+
58
+ joins(arel_join).where(arel_condition).distinct
59
+ end
60
+
61
+ # @param address [Spree::Address] address to match against zones
62
+ # @return [ActiveRecord::Relation] shipping methods which are associated
63
+ # with zones matching the provided address
64
+ def self.available_for_address(address)
65
+ joins(:zones).merge(Zone.for_address(address))
66
+ end
67
+
22
68
  def include?(address)
23
69
  return false unless address
24
70
  zones.any? do |zone|
@@ -31,32 +77,17 @@ module Spree
31
77
  tracking_url.gsub(/:tracking/, ERB::Util.url_encode(tracking)) # :url_encode exists in 1.8.7 through 2.1.0
32
78
  end
33
79
 
34
- def self.calculators
35
- spree_calculators.send(model_name_without_spree_namespace).select{ |c| c < Spree::ShippingCalculator }
36
- end
37
-
38
80
  # Some shipping methods are only meant to be set via backend
39
81
  def frontend?
40
- self.display_on != "back_end"
82
+ display_on != "back_end"
41
83
  end
42
84
 
43
85
  private
44
- def compute_amount(calculable)
45
- self.calculator.compute(calculable)
46
- end
47
-
48
- def at_least_one_shipping_category
49
- if self.shipping_categories.empty?
50
- self.errors[:base] << "You need to select at least one shipping category"
51
- end
52
- end
53
-
54
- def self.on_backend_query
55
- "#{table_name}.display_on != 'front_end' OR #{table_name}.display_on IS NULL"
56
- end
57
86
 
58
- def self.on_frontend_query
59
- "#{table_name}.display_on != 'back_end' OR #{table_name}.display_on IS NULL"
87
+ def at_least_one_shipping_category
88
+ if shipping_categories.empty?
89
+ errors[:base] << "You need to select at least one shipping category"
60
90
  end
91
+ end
61
92
  end
62
93
  end
@@ -0,0 +1,4 @@
1
+ class Spree::ShippingMethodStockLocation < Spree::Base
2
+ belongs_to :shipping_method
3
+ belongs_to :stock_location
4
+ end
@@ -2,45 +2,40 @@ module Spree
2
2
  class ShippingRate < Spree::Base
3
3
  belongs_to :shipment, class_name: 'Spree::Shipment'
4
4
  belongs_to :shipping_method, -> { with_deleted }, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
5
- belongs_to :tax_rate, -> { with_deleted }, class_name: 'Spree::TaxRate'
5
+
6
+ has_many :taxes,
7
+ class_name: "Spree::ShippingRateTax",
8
+ foreign_key: "shipping_rate_id",
9
+ dependent: :destroy
6
10
 
7
11
  delegate :order, :currency, to: :shipment
8
- delegate :name, to: :shipping_method
12
+ delegate :name, :tax_category, to: :shipping_method
9
13
  delegate :code, to: :shipping_method, prefix: true
14
+ alias_attribute :amount, :cost
10
15
 
11
- def display_base_price
12
- Spree::Money.new(cost, currency: currency)
13
- end
16
+ alias_method :discounted_amount, :amount
14
17
 
15
- def calculate_tax_amount
16
- tax_rate.calculator.compute_shipping_rate(self)
17
- end
18
+ extend DisplayMoney
19
+ money_methods :amount
18
20
 
19
21
  def display_price
20
- price = display_base_price.to_s
21
- if tax_rate
22
- tax_amount = calculate_tax_amount
23
- if tax_amount != 0
24
- if tax_rate.included_in_price?
25
- if tax_amount > 0
26
- amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
27
- price += " (#{Spree.t(:incl)} #{amount})"
28
- else
29
- amount = "#{display_tax_amount(tax_amount*-1)} #{tax_rate.name}"
30
- price += " (#{Spree.t(:excl)} #{amount})"
31
- end
32
- else
33
- amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
34
- price += " (+ #{amount})"
35
- end
36
- end
37
- end
38
- price
22
+ price = display_amount.to_s
23
+
24
+ return price if taxes.empty? || amount == 0
25
+
26
+ tax_explanations = taxes.map(&:label).join(tax_label_separator)
27
+
28
+ Spree.t :display_price_with_explanations,
29
+ scope: 'shipping_rate.display_price',
30
+ price: price,
31
+ explanations: tax_explanations
39
32
  end
40
33
  alias_method :display_cost, :display_price
41
34
 
42
- def display_tax_amount(tax_amount)
43
- Spree::Money.new(tax_amount, currency: currency)
35
+ private
36
+
37
+ def tax_label_separator
38
+ Spree.t :tax_label_separator, scope: 'shipping_rate.display_price'
44
39
  end
45
40
  end
46
41
  end
@@ -0,0 +1,41 @@
1
+ module Spree
2
+ # Used to persist shipping rate tax estimations.
3
+ # @attr [Spree::ShippingRate] shipping_rate The shipping rate to be taxed
4
+ # @attr [Spree::TaxRate] tax_rate The tax rate used to calculate the tax amount
5
+ # @since 1.3.0
6
+ # @see Spree::Tax::ShippingRateTaxer
7
+ class ShippingRateTax < ActiveRecord::Base
8
+ belongs_to :shipping_rate, class_name: "Spree::ShippingRate"
9
+ belongs_to :tax_rate, class_name: "Spree::TaxRate"
10
+
11
+ extend DisplayMoney
12
+ money_methods :absolute_amount
13
+
14
+ delegate :currency, to: :shipping_rate, allow_nil: true
15
+
16
+ def label
17
+ Spree.t translation_key,
18
+ scope: 'shipping_rate_tax.label',
19
+ amount: display_absolute_amount,
20
+ tax_rate_name: tax_rate.name
21
+ end
22
+
23
+ def absolute_amount
24
+ amount.abs
25
+ end
26
+
27
+ private
28
+
29
+ def translation_key
30
+ if tax_rate.included_in_price?
31
+ if amount > 0
32
+ :vat
33
+ else
34
+ :vat_refund
35
+ end
36
+ else
37
+ :sales_tax
38
+ end
39
+ end
40
+ end
41
+ end
@@ -13,7 +13,7 @@ module Spree
13
13
  # blank is added elsewhere, if needed
14
14
  def self.states_group_by_country_id
15
15
  state_info = Hash.new { |h, k| h[k] = [] }
16
- self.order(:name).each { |state|
16
+ order(:name).each { |state|
17
17
  state_info[state.country_id.to_s].push [state.id, state.name]
18
18
  }
19
19
  state_info
@@ -9,7 +9,7 @@ module Spree
9
9
  end
10
10
 
11
11
  def assign_user
12
- true # don't stop the filters
12
+ true # don't stop the filters
13
13
  end
14
14
  end
15
15
  end
@@ -21,8 +21,8 @@ module Spree
21
21
  quantifier = Stock::Quantifier.new(line_item.variant, stock_location)
22
22
  unless quantifier.can_supply?(quantity)
23
23
  variant = line_item.variant
24
- display_name = %Q{#{variant.name}}
25
- display_name += %Q{ (#{variant.options_text})} unless variant.options_text.blank?
24
+ display_name = variant.name.to_s
25
+ display_name += %{ (#{variant.options_text})} unless variant.options_text.blank?
26
26
 
27
27
  line_item.errors[:quantity] << Spree.t(
28
28
  :selected_quantity_not_available,