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
@@ -48,7 +48,7 @@ module Spree
48
48
  class_name: 'Spree::Variant',
49
49
  dependent: :destroy
50
50
 
51
- has_many :prices, -> { order(Spree::Variant.arel_table[:position].asc, Spree::Variant.arel_table[:id].asc, :currency) }, through: :variants
51
+ has_many :prices, -> { order(Spree::Variant.arel_table[:position].asc, Spree::Variant.arel_table[:id].asc, :currency) }, through: :variants_including_master
52
52
 
53
53
  has_many :stock_items, through: :variants_including_master
54
54
 
@@ -59,7 +59,7 @@ module Spree
59
59
  master || build_master
60
60
  end
61
61
 
62
- MASTER_ATTRIBUTES = [:sku, :price, :currency, :display_amount, :display_price, :weight, :height, :width, :depth, :cost_currency, :price_in, :amount_in, :cost_price]
62
+ MASTER_ATTRIBUTES = [:sku, :price, :currency, :display_amount, :display_price, :weight, :height, :width, :depth, :cost_currency, :price_in, :price_for, :amount_in, :cost_price]
63
63
  MASTER_ATTRIBUTES.each do |attr|
64
64
  delegate :"#{attr}", :"#{attr}=", to: :find_or_build_master
65
65
  end
@@ -161,12 +161,16 @@ module Spree
161
161
 
162
162
  # Groups variants by the specified option type.
163
163
  #
164
+ # @deprecated This method is not called in the Solidus codebase
164
165
  # @param opt_type [String] the name of the option type to group by
166
+ # @param pricing_options [Spree::Config.pricing_options_class] the pricing options to search
167
+ # for, default: the default pricing options
165
168
  # @return [Hash] option_type as keys, array of variants as values.
166
- def categorise_variants_from_option(opt_type)
169
+ def categorise_variants_from_option(opt_type, pricing_options = Spree::Config.default_pricing_options)
167
170
  return {} unless option_types.include?(opt_type)
168
- variants.active.group_by { |v| v.option_values.detect { |o| o.option_type == opt_type} }
171
+ variants.with_prices(pricing_options).group_by { |v| v.option_values.detect { |o| o.option_type == opt_type } }
169
172
  end
173
+ deprecate :categorise_variants_from_option, deprecator: Spree::Deprecation
170
174
 
171
175
  # Poor man's full text search.
172
176
  #
@@ -184,12 +188,24 @@ module Spree
184
188
  end
185
189
 
186
190
  # @param current_currency [String] currency to filter variants by; defaults to Spree's default
191
+ # @deprecated This method can only handle prices for currencies
187
192
  # @return [Array<Spree::Variant>] all variants with at least one option value
188
193
  def variants_and_option_values(current_currency = nil)
189
194
  variants.includes(:option_values).active(current_currency).select do |variant|
190
195
  variant.option_values.any?
191
196
  end
192
197
  end
198
+ deprecate variants_and_option_values: :variants_and_option_values_for,
199
+ deprecator: Spree::Deprecation
200
+
201
+ # @param pricing_options [Spree::Variant::PricingOptions] the pricing options to search
202
+ # for, default: the default pricing options
203
+ # @return [Array<Spree::Variant>] all variants with at least one option value
204
+ def variants_and_option_values_for(pricing_options = Spree::Config.default_pricing_options)
205
+ variants.includes(:option_values).with_prices(pricing_options).select do |variant|
206
+ variant.option_values.any?
207
+ end
208
+ end
193
209
 
194
210
  # Groups all of the option values that are associated to the product's variants, grouped by
195
211
  # option type.
@@ -199,10 +215,10 @@ module Spree
199
215
  # @return [Hash<Spree::OptionType, Array<Spree::OptionValue>>] all option types and option values
200
216
  # associated with the products variants grouped by option type
201
217
  def variant_option_values_by_option_type(variant_scope = nil)
202
- option_value_ids = Spree::OptionValuesVariant.joins(:variant)
203
- .where(spree_variants: { product_id: self.id})
204
- .merge(variant_scope)
205
- .distinct.pluck(:option_value_id)
218
+ option_value_scope = Spree::OptionValuesVariant.joins(:variant)
219
+ .where(spree_variants: { product_id: id })
220
+ option_value_scope = option_value_scope.merge(variant_scope) if variant_scope
221
+ option_value_ids = option_value_scope.distinct.pluck(:option_value_id)
206
222
  Spree::OptionValue.where(id: option_value_ids).
207
223
  includes(:option_type).
208
224
  order("#{Spree::OptionType.table_name}.position, #{Spree::OptionValue.table_name}.position").
@@ -319,14 +335,15 @@ module Spree
319
335
  end
320
336
 
321
337
  def punch_slug
322
- update_column :slug, "#{Time.current.to_i}_#{slug}" # punch slug with date prefix to allow reuse of original
338
+ # punch slug with date prefix to allow reuse of original
339
+ update_column :slug, "#{Time.current.to_i}_#{slug}" unless frozen?
323
340
  end
324
341
 
325
342
  # If the master is invalid, the Product object will be assigned its errors
326
343
  def validate_master
327
344
  unless master.valid?
328
345
  master.errors.each do |att, error|
329
- self.errors.add(att, error)
346
+ errors.add(att, error)
330
347
  end
331
348
  end
332
349
  end
@@ -354,7 +371,7 @@ module Spree
354
371
 
355
372
  def remove_taxon(taxon)
356
373
  removed_classifications = classifications.where(taxon: taxon)
357
- removed_classifications.each &:remove_from_list
374
+ removed_classifications.each(&:remove_from_list)
358
375
  end
359
376
  end
360
377
  end
@@ -2,6 +2,8 @@ module Spree
2
2
  class ProductProperty < Spree::Base
3
3
  include Spree::OrderedPropertyValueList
4
4
 
5
+ acts_as_list scope: :product
6
+
5
7
  belongs_to :product, touch: true, class_name: 'Spree::Product', inverse_of: :product_properties
6
8
  belongs_to :property, class_name: 'Spree::Property', inverse_of: :product_properties
7
9
 
@@ -1,45 +1,45 @@
1
1
  module Spree
2
2
  class ProductScope < Spree::Base
3
- before_validation(:on => :create) do
3
+ before_validation(on: :create) do
4
4
  # Add default empty arguments so scope validates and errors aren't caused when previewing it
5
5
  if name && args = self.class.arguments_for_scope_name(name)
6
- self.arguments ||= ['']*args.length
6
+ self.arguments ||= [''] * args.length
7
7
  end
8
8
  end
9
9
 
10
10
  def self.all_scopes
11
11
  {
12
12
  # Scopes for selecting products based on taxon
13
- :taxon => {
14
- :taxons_name_eq => [:taxon_name],
15
- :in_taxons => [:taxon_names],
13
+ taxon: {
14
+ taxons_name_eq: [:taxon_name],
15
+ in_taxons: [:taxon_names]
16
16
  },
17
17
  # product selection based on name, or search
18
- :search => {
19
- :in_name => [:words],
20
- :in_name_or_keywords => [:words],
21
- :in_name_or_description => [:words],
22
- :with_ids => [:ids]
18
+ search: {
19
+ in_name: [:words],
20
+ in_name_or_keywords: [:words],
21
+ in_name_or_description: [:words],
22
+ with_ids: [:ids]
23
23
  },
24
24
  # Scopes for selecting products based on option types and properties
25
- :values => {
26
- :with => [:value],
27
- :with_property => [:property],
28
- :with_property_value => [:property, :value],
29
- :with_option => [:option],
30
- :with_option_value => [:option, :value],
25
+ values: {
26
+ with: [:value],
27
+ with_property: [:property],
28
+ with_property_value: [:property, :value],
29
+ with_option: [:option],
30
+ with_option_value: [:option, :value]
31
31
  },
32
32
  # product selection based upon master price
33
- :price => {
34
- :price_between => [:low, :high],
35
- :master_price_lte => [:amount],
36
- :master_price_gte => [:amount],
37
- },
33
+ price: {
34
+ price_between: [:low, :high],
35
+ master_price_lte: [:amount],
36
+ master_price_gte: [:amount]
37
+ }
38
38
  }
39
39
  end
40
40
 
41
41
  def self.arguments_for_scope_name(name)
42
- if group = all_scopes.detect { |k,v| v[name.to_sym] }
42
+ if group = all_scopes.detect { |_k, v| v[name.to_sym] }
43
43
  group[1][name.to_sym]
44
44
  end
45
45
  end
@@ -22,7 +22,6 @@ module Spree
22
22
  return if promotion_credit_exists?(order)
23
23
 
24
24
  amount = compute_amount(order)
25
- return if amount == 0
26
25
  Spree::Adjustment.create!(
27
26
  amount: amount,
28
27
  order: order,
@@ -37,7 +36,7 @@ module Spree
37
36
  # Ensure a negative amount which does not exceed the sum of the order's
38
37
  # item_total and ship_total
39
38
  def compute_amount(calculable)
40
- amount = self.calculator.compute(calculable).to_f.abs
39
+ amount = calculator.compute(calculable).to_f.abs
41
40
  [(calculable.item_total + calculable.ship_total), amount].min * -1
42
41
  end
43
42
 
@@ -50,11 +49,11 @@ module Spree
50
49
  # Receives an adjustment +source+ (here a PromotionAction object) and tells
51
50
  # if the order has adjustments from that already
52
51
  def promotion_credit_exists?(adjustable)
53
- self.adjustments.where(adjustable_id: adjustable.id).exists?
52
+ adjustments.where(adjustable_id: adjustable.id).exists?
54
53
  end
55
54
 
56
55
  def ensure_action_has_calculator
57
- return if self.calculator
56
+ return if calculator
58
57
  self.calculator = Calculator::FlatPercentItemTotal.new
59
58
  end
60
59
  end
@@ -23,7 +23,7 @@ module Spree
23
23
  current_result = create_adjustment(line_item, order, promotion_code)
24
24
  result ||= current_result
25
25
  end
26
- return result
26
+ result
27
27
  end
28
28
 
29
29
  # Ensure a negative amount which does not exceed the sum of the order's
@@ -31,21 +31,21 @@ module Spree
31
31
  def compute_amount(adjustable)
32
32
  order = adjustable.is_a?(Order) ? adjustable : adjustable.order
33
33
  return 0 unless promotion.line_item_actionable?(order, adjustable)
34
- promotion_amount = self.calculator.compute(adjustable).to_f.abs
34
+ promotion_amount = calculator.compute(adjustable).to_f.abs
35
35
  [adjustable.amount, promotion_amount].min * -1
36
36
  end
37
37
 
38
38
  private
39
39
 
40
40
  def create_adjustment(adjustable, order, promotion_code)
41
- amount = self.compute_amount(adjustable)
41
+ amount = compute_amount(adjustable)
42
42
  return if amount == 0
43
- self.adjustments.create!(
43
+ adjustments.create!(
44
44
  amount: amount,
45
45
  adjustable: adjustable,
46
46
  order: order,
47
47
  promotion_code: promotion_code,
48
- label: "#{Spree.t(:promotion)} (#{promotion.name})",
48
+ label: "#{Spree.t(:promotion)} (#{promotion.name})"
49
49
  )
50
50
  true
51
51
  end
@@ -57,16 +57,16 @@ module Spree
57
57
  # Receives an adjustment +source+ (here a PromotionAction object) and tells
58
58
  # if the order has adjustments from that already
59
59
  def promotion_credit_exists?(adjustable)
60
- self.adjustments.where(adjustable_id: adjustable.id).exists?
60
+ adjustments.where(adjustable_id: adjustable.id).exists?
61
61
  end
62
62
 
63
63
  def ensure_action_has_calculator
64
- return if self.calculator
64
+ return if calculator
65
65
  self.calculator = Calculator::PercentOnLineItem.new
66
66
  end
67
67
 
68
68
  def line_items_to_adjust(promotion, order)
69
- excluded_ids = self.adjustments.
69
+ excluded_ids = adjustments.
70
70
  where(adjustable_id: order.line_items.pluck(:id), adjustable_type: 'Spree::LineItem').
71
71
  pluck(:adjustable_id)
72
72
 
@@ -59,7 +59,7 @@ module Spree::Promotion::Actions
59
59
  order = line_item.order
60
60
  line_items = actionable_line_items(order)
61
61
 
62
- actioned_line_items = order.line_item_adjustments(true).
62
+ actioned_line_items = order.line_item_adjustments.reload.
63
63
  select { |a| a.source == self && a.amount < 0 }.
64
64
  map(&:adjustable)
65
65
  other_line_items = actioned_line_items - [line_item]
@@ -71,7 +71,7 @@ module Spree::Promotion::Actions
71
71
  line_item.quantity
72
72
  ].min
73
73
 
74
- persist_quantity(usable_quantity, line_item)
74
+ persist_quantity(usable_quantity, line_item)
75
75
 
76
76
  amount = adjustment_amount * usable_quantity
77
77
  [line_item.amount, amount].min * -1
@@ -80,7 +80,7 @@ module Spree::Promotion::Actions
80
80
  private
81
81
 
82
82
  def actionable_line_items(order)
83
- order.line_items(true).select do |item|
83
+ order.line_items.reload.select do |item|
84
84
  promotion.line_item_actionable? order, item
85
85
  end
86
86
  end
@@ -2,7 +2,7 @@ module Spree
2
2
  class Promotion
3
3
  module Actions
4
4
  class FreeShipping < Spree::PromotionAction
5
- def perform(payload={})
5
+ def perform(payload = {})
6
6
  order = payload[:order]
7
7
  promotion_code = payload[:promotion_code]
8
8
 
@@ -13,7 +13,7 @@ module Spree
13
13
  amount: compute_amount(shipment),
14
14
  source: self,
15
15
  promotion_code: promotion_code,
16
- label: label,
16
+ label: label
17
17
  )
18
18
  true
19
19
  end
@@ -33,9 +33,9 @@ module Spree
33
33
  private
34
34
 
35
35
  def promotion_credit_exists?(shipment)
36
- shipment.adjustments.where(:source_id => self.id).exists?
36
+ shipment.adjustments.where(source_id: id).exists?
37
37
  end
38
38
  end
39
39
  end
40
40
  end
41
- end
41
+ end
@@ -24,13 +24,14 @@ module Spree
24
24
  end
25
25
 
26
26
  private
27
- def completed_orders
28
- user ? user.orders.complete : orders_by_email
29
- end
30
27
 
31
- def orders_by_email
32
- Spree::Order.where(email: email).complete
33
- end
28
+ def completed_orders
29
+ user ? user.orders.complete : orders_by_email
30
+ end
31
+
32
+ def orders_by_email
33
+ Spree::Order.where(email: email).complete
34
+ end
34
35
  end
35
36
  end
36
37
  end
@@ -15,7 +15,7 @@ module Spree
15
15
  # This is eligible if the user's most recently completed order is more than the preferred days ago
16
16
  # @param order [Spree::Order]
17
17
  # @option options
18
- def eligible?(order, options = {})
18
+ def eligible?(order, _options = {})
19
19
  return false unless order.user
20
20
 
21
21
  last_order = last_completed_order(order.user)
@@ -26,11 +26,10 @@ module Spree
26
26
 
27
27
  private
28
28
 
29
- def last_completed_order user
29
+ def last_completed_order(user)
30
30
  user.orders.complete.order(:completed_at).last
31
31
  end
32
32
  end
33
33
  end
34
34
  end
35
35
  end
36
-
@@ -5,6 +5,7 @@ module Spree
5
5
  # a specific amount
6
6
  class ItemTotal < PromotionRule
7
7
  preference :amount, :decimal, default: 100.00
8
+ preference :currency, :string, default: ->{ Spree::Config[:currency] }
8
9
  preference :operator, :string, default: '>'
9
10
 
10
11
  OPERATORS = ['gt', 'gte']
@@ -13,7 +14,8 @@ module Spree
13
14
  promotable.is_a?(Spree::Order)
14
15
  end
15
16
 
16
- def eligible?(order, options = {})
17
+ def eligible?(order, _options = {})
18
+ return false unless order.currency == preferred_currency
17
19
  item_total = order.item_total
18
20
  unless item_total.send(preferred_operator == 'gte' ? :>= : :>, BigDecimal.new(preferred_amount.to_s))
19
21
  eligibility_errors.add(:base, ineligible_message)
@@ -23,8 +25,9 @@ module Spree
23
25
  end
24
26
 
25
27
  private
28
+
26
29
  def formatted_amount
27
- Spree::Money.new(preferred_amount).to_s
30
+ Spree::Money.new(preferred_amount, currency: preferred_currency).to_s
28
31
  end
29
32
 
30
33
  def ineligible_message
@@ -17,7 +17,7 @@ module Spree
17
17
  # Use the first order rule if you want a promotion to be applied to the first order for a user.
18
18
  # @param order [Spree::Order]
19
19
  # @option options
20
- def eligible?(order, options = {})
20
+ def eligible?(order, _options = {})
21
21
  return false unless order.user
22
22
 
23
23
  nth_order?(order)
@@ -25,7 +25,7 @@ module Spree
25
25
 
26
26
  private
27
27
 
28
- def completed_order_count order
28
+ def completed_order_count(order)
29
29
  order.
30
30
  user.
31
31
  orders.
@@ -34,7 +34,7 @@ module Spree
34
34
  count
35
35
  end
36
36
 
37
- def nth_order? order
37
+ def nth_order?(order)
38
38
  count = completed_order_count(order) + 1
39
39
  count == preferred_nth_order
40
40
  end
@@ -42,4 +42,3 @@ module Spree
42
42
  end
43
43
  end
44
44
  end
45
-
@@ -6,7 +6,7 @@ module Spree
6
6
  promotable.is_a?(Spree::Order)
7
7
  end
8
8
 
9
- def eligible?(order, options = {})
9
+ def eligible?(order, _options = {})
10
10
  if order.user.present?
11
11
  if promotion.used_by?(order.user, [order])
12
12
  eligibility_errors.add(:base, eligibility_error_message(:limit_once_per_user))
@@ -21,4 +21,3 @@ module Spree
21
21
  end
22
22
  end
23
23
  end
24
-
@@ -10,7 +10,7 @@ module Spree
10
10
  promotable.is_a?(Spree::Order)
11
11
  end
12
12
 
13
- def eligible?(promotable, options = {})
13
+ def eligible?(promotable, _options = {})
14
14
  case preferred_match_policy
15
15
  when 'any'
16
16
  promotable.line_items.any? { |item| actionable?(item) }
@@ -18,7 +18,6 @@ module Spree
18
18
  end
19
19
 
20
20
  def actionable?(line_item)
21
-
22
21
  pid = line_item.product.id
23
22
  ovids = line_item.variant.option_values.pluck(:id)
24
23
 
@@ -22,19 +22,19 @@ module Spree
22
22
  promotable.is_a?(Spree::Order)
23
23
  end
24
24
 
25
- def eligible?(order, options = {})
25
+ def eligible?(order, _options = {})
26
26
  return true if eligible_products.empty?
27
27
 
28
28
  if preferred_match_policy == 'all'
29
- unless eligible_products.all? {|p| order.products.include?(p) }
29
+ unless eligible_products.all? { |p| order.products.include?(p) }
30
30
  eligibility_errors.add(:base, eligibility_error_message(:missing_product))
31
31
  end
32
32
  elsif preferred_match_policy == 'any'
33
- unless order.products.any? {|p| eligible_products.include?(p) }
33
+ unless order.products.any? { |p| eligible_products.include?(p) }
34
34
  eligibility_errors.add(:base, eligibility_error_message(:no_applicable_products))
35
35
  end
36
36
  else
37
- unless order.products.none? {|p| eligible_products.include?(p) }
37
+ unless order.products.none? { |p| eligible_products.include?(p) }
38
38
  eligibility_errors.add(:base, eligibility_error_message(:has_excluded_product))
39
39
  end
40
40
  end
@@ -12,7 +12,7 @@ module Spree
12
12
  promotable.is_a?(Spree::Order)
13
13
  end
14
14
 
15
- def eligible?(order, options = {})
15
+ def eligible?(order, _options = {})
16
16
  if preferred_match_policy == 'all'
17
17
  unless (taxons.to_a - taxons_in_order_including_parents(order)).empty?
18
18
  eligibility_errors.add(:base, eligibility_error_message(:missing_taxon))
@@ -44,12 +44,12 @@ module Spree
44
44
 
45
45
  # All taxons in an order
46
46
  def order_taxons(order)
47
- Spree::Taxon.joins(products: {variants_including_master: :line_items}).where(spree_line_items: {order_id: order.id}).uniq
47
+ Spree::Taxon.joins(products: { variants_including_master: :line_items }).where(spree_line_items: { order_id: order.id }).distinct
48
48
  end
49
49
 
50
50
  # ids of taxons rules and taxons rules children
51
51
  def taxons_including_children_ids
52
- taxons.inject([]){ |ids,taxon| ids += taxon.self_and_descendants.ids }
52
+ taxons.flat_map { |taxon| taxon.self_and_descendants.ids }
53
53
  end
54
54
 
55
55
  # taxons order vs taxons rules and taxons rules children
@@ -58,11 +58,11 @@ module Spree
58
58
  end
59
59
 
60
60
  def taxons_in_order_including_parents(order)
61
- order_taxons_in_taxons_and_children(order).inject([]){ |taxons, taxon| taxons << taxon.self_and_ancestors }.flatten.uniq
61
+ order_taxons_in_taxons_and_children(order).flat_map(&:self_and_ancestors).uniq
62
62
  end
63
63
 
64
64
  def taxon_product_ids
65
- Spree::Product.joins(:taxons).where(spree_taxons: {id: taxons.pluck(:id)}).pluck(:id).uniq
65
+ Spree::Product.joins(:taxons).where(spree_taxons: { id: taxons.pluck(:id) }).pluck(:id).uniq
66
66
  end
67
67
  end
68
68
  end
@@ -12,7 +12,7 @@ module Spree
12
12
  promotable.is_a?(Spree::Order)
13
13
  end
14
14
 
15
- def eligible?(order, options = {})
15
+ def eligible?(order, _options = {})
16
16
  users.include?(order.user)
17
17
  end
18
18
 
@@ -6,7 +6,7 @@ module Spree
6
6
  promotable.is_a?(Spree::Order)
7
7
  end
8
8
 
9
- def eligible?(order, options = {})
9
+ def eligible?(order, _options = {})
10
10
  unless order.user.present?
11
11
  eligibility_errors.add(:base, eligibility_error_message(:no_user_specified))
12
12
  end
@@ -35,12 +35,12 @@ module Spree
35
35
  scope :coupons, -> { where.not(code: nil) }
36
36
  scope :advertised, -> { where(advertise: true) }
37
37
  scope :active, -> do
38
- table = self.arel_table
38
+ table = arel_table
39
39
  time = Time.current
40
40
  where(table[:starts_at].eq(nil).or(table[:starts_at].lt(time))).
41
41
  where(table[:expires_at].eq(nil).or(table[:expires_at].gt(time)))
42
42
  end
43
- scope :applied, -> { joins(:order_promotions).uniq }
43
+ scope :applied, -> { joins(:order_promotions).distinct }
44
44
 
45
45
  self.whitelisted_ransackable_associations = ['codes']
46
46
  self.whitelisted_ransackable_attributes = ['path', 'promotion_category_id']
@@ -58,7 +58,7 @@ module Spree
58
58
  raise "Attempted to call code on a Spree::Promotion. Promotions are now tied to multiple code records"
59
59
  end
60
60
 
61
- def code=(val)
61
+ def code=(_val)
62
62
  raise "Attempted to call code= on a Spree::Promotion. Promotions are now tied to multiple code records"
63
63
  end
64
64
 
@@ -68,7 +68,7 @@ module Spree
68
68
  ).first
69
69
  end
70
70
 
71
- def as_json(options={})
71
+ def as_json(options = {})
72
72
  options[:except] ||= :code
73
73
  super
74
74
  end
@@ -91,7 +91,7 @@ module Spree
91
91
  line_item: line_item,
92
92
  user: user,
93
93
  path: path,
94
- promotion_code: promotion_code,
94
+ promotion_code: promotion_code
95
95
  }
96
96
 
97
97
  # Track results from actions to see if any action has been taken.
@@ -107,11 +107,11 @@ module Spree
107
107
  # connect to the order
108
108
  order_promotions.find_or_create_by!(
109
109
  order_id: order.id,
110
- promotion_code_id: promotion_code.try!(:id),
110
+ promotion_code_id: promotion_code.try!(:id)
111
111
  )
112
112
  end
113
113
 
114
- return action_taken
114
+ action_taken
115
115
  end
116
116
 
117
117
  # called anytime order.update! happens
@@ -218,7 +218,7 @@ module Spree
218
218
  !promotable.product.promotionable?
219
219
  when Spree::Order
220
220
  promotable.line_items.any? &&
221
- promotable.line_items.joins(:product).where(spree_products: {promotionable: false}).any?
221
+ promotable.line_items.joins(:product).where(spree_products: { promotionable: false }).any?
222
222
  end
223
223
  end
224
224
 
@@ -16,7 +16,7 @@ module Spree
16
16
  # user based actions to be performed in addition to actions on the order
17
17
  #
18
18
  # @note This method should be overriden in subclassses.
19
- def perform(options = {})
19
+ def perform(_options = {})
20
20
  raise 'perform should be implemented in a sub-class of PromotionAction'
21
21
  end
22
22
  end
@@ -16,7 +16,7 @@ class Spree::PromotionBuilder
16
16
  # @param promotion_attrs [Hash] The desired attributes for the newly promotion
17
17
  # @param attributes [Hash] The desired attributes for this builder
18
18
  # @param user [Spree::User] The user who triggered this promotion build
19
- def initialize(attributes={}, promotion_attributes={})
19
+ def initialize(attributes = {}, promotion_attributes = {})
20
20
  @promotion = Spree::Promotion.new(promotion_attributes)
21
21
  super(attributes)
22
22
  end
@@ -31,7 +31,7 @@ class Spree::PromotionBuilder
31
31
  @promotion.save
32
32
  end
33
33
 
34
- def number_of_codes= value
34
+ def number_of_codes=(value)
35
35
  @number_of_codes = value.presence.try(:to_i)
36
36
  end
37
37
 
@@ -21,6 +21,7 @@ module Spree
21
21
  end
22
22
 
23
23
  private
24
+
24
25
  # @return The best promotion from this set of adjustments.
25
26
  def best_promotion_adjustment
26
27
  @best_promotion_adjustment ||= @adjustments.select(&:eligible?).min_by do |a|
@@ -10,7 +10,7 @@ class ::Spree::PromotionCode::CodeBuilder
10
10
  # +promotion+ Must be a Spree::Promotion.
11
11
  # +base_code+ Must be a String.
12
12
  # +num_codes+ Must be a positive integer greater than zero.
13
- def initialize promotion, base_code, num_codes
13
+ def initialize(promotion, base_code, num_codes)
14
14
  @base_code = base_code
15
15
  @num_codes = num_codes
16
16
  @promotion = promotion
@@ -36,8 +36,8 @@ class ::Spree::PromotionCode::CodeBuilder
36
36
  def generate_random_codes
37
37
  valid_codes = Set.new
38
38
 
39
- while valid_codes.size < num_codes do
40
- new_codes = num_codes.times.map { generate_random_code }.to_set
39
+ while valid_codes.size < num_codes
40
+ new_codes = Array.new(num_codes) { generate_random_code }.to_set
41
41
  valid_codes += get_unique_codes(new_codes)
42
42
  end
43
43