solidus_core 1.3.0.beta1 → 1.3.0.rc1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (68) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +1 -1
  3. data/app/assets/images/noimage/large.png +0 -0
  4. data/app/assets/images/noimage/mini.png +0 -0
  5. data/app/assets/images/noimage/product.png +0 -0
  6. data/app/assets/images/noimage/small.png +0 -0
  7. data/app/models/spree/app_configuration.rb +9 -9
  8. data/app/models/spree/country.rb +1 -0
  9. data/app/models/spree/line_item.rb +7 -1
  10. data/app/models/spree/payment_method.rb +1 -1
  11. data/app/models/spree/preferences/preferable.rb +1 -0
  12. data/app/models/spree/preferences/statically_configurable.rb +2 -2
  13. data/app/models/spree/price.rb +30 -2
  14. data/app/models/spree/product.rb +4 -1
  15. data/app/models/spree/stock/inventory_unit_builder.rb +2 -2
  16. data/app/models/spree/tax/tax_location.rb +4 -0
  17. data/app/models/spree/tax_rate.rb +2 -11
  18. data/app/models/spree/variant/price_selector.rb +35 -0
  19. data/app/models/spree/variant/pricing_options.rb +69 -4
  20. data/app/models/spree/variant/vat_price_generator.rb +58 -0
  21. data/app/models/spree/variant.rb +38 -16
  22. data/config/locales/en.yml +22 -1
  23. data/db/migrate/20140410141842_add_many_missing_indexes.rb +15 -13
  24. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +40 -38
  25. data/db/migrate/20141217215630_update_product_slug_index.rb +4 -2
  26. data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +2 -10
  27. data/db/migrate/20151219020209_add_stock_item_unique_index.rb +2 -2
  28. data/db/migrate/20160509181311_add_country_iso_to_prices.rb +8 -0
  29. data/lib/spree/core/class_constantizer.rb +31 -0
  30. data/lib/spree/core/engine.rb +55 -59
  31. data/lib/spree/core/environment/calculators.rb +6 -1
  32. data/lib/spree/core/environment.rb +5 -2
  33. data/lib/spree/core/environment_extension.rb +16 -12
  34. data/lib/spree/core/price_migrator.rb +32 -0
  35. data/lib/spree/core/search/base.rb +2 -2
  36. data/lib/spree/core/version.rb +1 -1
  37. data/lib/spree/core.rb +4 -0
  38. data/lib/spree/migration_helpers.rb +19 -0
  39. data/lib/spree/money.rb +41 -15
  40. data/lib/spree/promo/environment.rb +2 -1
  41. data/lib/spree/testing_support/controller_requests.rb +22 -7
  42. data/lib/spree/testing_support/factories/state_factory.rb +7 -0
  43. data/lib/spree/testing_support/factories/stock_location_factory.rb +4 -1
  44. data/lib/tasks/migrations/create_vat_prices.rake +11 -0
  45. data/lib/tasks/upgrade.rake +2 -1
  46. data/spec/lib/spree/core/class_constantizer_spec.rb +68 -0
  47. data/spec/lib/spree/core/environment_extension_spec.rb +33 -0
  48. data/spec/lib/spree/core/price_migrator_spec.rb +356 -0
  49. data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +9 -0
  50. data/spec/lib/spree/core/testing_support/factories/stock_location_factory_spec.rb +9 -0
  51. data/spec/lib/spree/money_spec.rb +75 -0
  52. data/spec/models/spree/app_configuration_spec.rb +5 -5
  53. data/spec/models/spree/country_spec.rb +16 -0
  54. data/spec/models/spree/line_item_spec.rb +6 -2
  55. data/spec/models/spree/preferences/preferable_spec.rb +5 -0
  56. data/spec/models/spree/preferences/statically_configurable_spec.rb +4 -0
  57. data/spec/models/spree/price_spec.rb +89 -0
  58. data/spec/models/spree/stock/coordinator_spec.rb +9 -0
  59. data/spec/models/spree/stock/splitter/shipping_category_spec.rb +30 -32
  60. data/spec/models/spree/tax/tax_location_spec.rb +14 -5
  61. data/spec/models/spree/tax/taxation_integration_spec.rb +15 -42
  62. data/spec/models/spree/variant/{pricer_spec.rb → price_selector_spec.rb} +41 -1
  63. data/spec/models/spree/variant/pricing_options_spec.rb +87 -4
  64. data/spec/models/spree/variant/vat_price_generator_spec.rb +69 -0
  65. data/spec/models/spree/variant_spec.rb +57 -8
  66. metadata +14 -5
  67. data/app/models/spree/product_scope/scopes.rb +0 -47
  68. data/app/models/spree/variant/pricer.rb +0 -19
@@ -1,63 +1,65 @@
1
1
  class CorrectSomePolymorphicIndexAndAddMoreMissing < ActiveRecord::Migration
2
+ include Spree::MigrationHelpers
3
+
2
4
  def change
3
- add_index :spree_addresses, :country_id
4
- add_index :spree_addresses, :state_id
5
+ safe_add_index :spree_addresses, :country_id
6
+ safe_add_index :spree_addresses, :state_id
5
7
 
6
- remove_index :spree_adjustments, [:source_type, :source_id]
7
- add_index :spree_adjustments, [:source_id, :source_type]
8
+ safe_remove_index :spree_adjustments, [:source_type, :source_id]
9
+ safe_add_index :spree_adjustments, [:source_id, :source_type]
8
10
 
9
- add_index :spree_inventory_units, :return_authorization_id
11
+ safe_add_index :spree_inventory_units, :return_authorization_id
10
12
 
11
- add_index :spree_log_entries, [:source_id, :source_type]
13
+ safe_add_index :spree_log_entries, [:source_id, :source_type]
12
14
 
13
- add_index :spree_orders, :approver_id
14
- add_index :spree_orders, :created_by_id
15
- add_index :spree_orders, :ship_address_id
16
- add_index :spree_orders, :bill_address_id
17
- add_index :spree_orders, :considered_risky
15
+ safe_add_index :spree_orders, :approver_id
16
+ safe_add_index :spree_orders, :created_by_id
17
+ safe_add_index :spree_orders, :ship_address_id
18
+ safe_add_index :spree_orders, :bill_address_id
19
+ safe_add_index :spree_orders, :considered_risky
18
20
 
19
- add_index :spree_orders_promotions, [:order_id, :promotion_id]
21
+ safe_add_index :spree_orders_promotions, [:order_id, :promotion_id]
20
22
 
21
- add_index :spree_payments, [:source_id, :source_type]
23
+ safe_add_index :spree_payments, [:source_id, :source_type]
22
24
 
23
- add_index :spree_product_option_types, :position
25
+ safe_add_index :spree_product_option_types, :position
24
26
 
25
- add_index :spree_product_properties, :position
26
- add_index :spree_product_properties, :property_id
27
+ safe_add_index :spree_product_properties, :position
28
+ safe_add_index :spree_product_properties, :property_id
27
29
 
28
- add_index :spree_promotion_action_line_items, :promotion_action_id
29
- add_index :spree_promotion_action_line_items, :variant_id
30
+ safe_add_index :spree_promotion_action_line_items, :promotion_action_id
31
+ safe_add_index :spree_promotion_action_line_items, :variant_id
30
32
 
31
- add_index :spree_promotion_rules, :promotion_id
33
+ safe_add_index :spree_promotion_rules, :promotion_id
32
34
 
33
- add_index :spree_promotions, :advertise
35
+ safe_add_index :spree_promotions, :advertise
34
36
 
35
- add_index :spree_return_authorizations, :number
36
- add_index :spree_return_authorizations, :order_id
37
- add_index :spree_return_authorizations, :stock_location_id
37
+ safe_add_index :spree_return_authorizations, :number
38
+ safe_add_index :spree_return_authorizations, :order_id
39
+ safe_add_index :spree_return_authorizations, :stock_location_id
38
40
 
39
- add_index :spree_shipments, :address_id
41
+ safe_add_index :spree_shipments, :address_id
40
42
 
41
- add_index :spree_shipping_methods, :tax_category_id
43
+ safe_add_index :spree_shipping_methods, :tax_category_id
42
44
 
43
- add_index :spree_state_changes, [:stateful_id, :stateful_type]
44
- add_index :spree_state_changes, :user_id
45
+ safe_add_index :spree_state_changes, [:stateful_id, :stateful_type]
46
+ safe_add_index :spree_state_changes, :user_id
45
47
 
46
- add_index :spree_stock_locations, :country_id
47
- add_index :spree_stock_locations, :state_id
48
+ safe_add_index :spree_stock_locations, :country_id
49
+ safe_add_index :spree_stock_locations, :state_id
48
50
 
49
- add_index :spree_tax_rates, :deleted_at
50
- add_index :spree_tax_rates, :tax_category_id
51
- add_index :spree_tax_rates, :zone_id
51
+ safe_add_index :spree_tax_rates, :deleted_at
52
+ safe_add_index :spree_tax_rates, :tax_category_id
53
+ safe_add_index :spree_tax_rates, :zone_id
52
54
 
53
- add_index :spree_taxonomies, :position
55
+ safe_add_index :spree_taxonomies, :position
54
56
 
55
- add_index :spree_taxons, :position
57
+ safe_add_index :spree_taxons, :position
56
58
 
57
- add_index :spree_variants, :position
58
- add_index :spree_variants, :track_inventory
59
+ safe_add_index :spree_variants, :position
60
+ safe_add_index :spree_variants, :track_inventory
59
61
 
60
- add_index :spree_zone_members, :zone_id
61
- add_index :spree_zone_members, [:zoneable_id, :zoneable_type]
62
+ safe_add_index :spree_zone_members, :zone_id
63
+ safe_add_index :spree_zone_members, [:zoneable_id, :zoneable_type]
62
64
  end
63
65
  end
@@ -1,6 +1,8 @@
1
1
  class UpdateProductSlugIndex < ActiveRecord::Migration
2
+ include Spree::MigrationHelpers
3
+
2
4
  def change
3
- remove_index :spree_products, :slug
4
- add_index :spree_products, :slug, unique: true
5
+ safe_remove_index :spree_products, :slug
6
+ safe_add_index :spree_products, :slug, unique: true
5
7
  end
6
8
  end
@@ -4,6 +4,8 @@
4
4
  # migration deletes any of the indexes left around in stores using the
5
5
  # out-dated version of that migration
6
6
  class RemoveUnnecessaryIndexes < ActiveRecord::Migration
7
+ include Spree::MigrationHelpers
8
+
7
9
  def up
8
10
  safe_remove_index :spree_credit_cards, :address_id
9
11
  safe_remove_index :spree_gateways, :active
@@ -59,14 +61,4 @@ class RemoveUnnecessaryIndexes < ActiveRecord::Migration
59
61
  safe_add_index :spree_variants, :deleted_at
60
62
  safe_add_index :spree_zones, :default_tax
61
63
  end
62
-
63
- private
64
-
65
- def safe_remove_index(table, column)
66
- remove_index(table, column) if index_exists?(table, column)
67
- end
68
-
69
- def safe_add_index(table, column)
70
- add_index(table, column) if column_exists?(table, column)
71
- end
72
64
  end
@@ -1,8 +1,8 @@
1
1
  class AddStockItemUniqueIndex < ActiveRecord::Migration
2
2
  def change
3
3
  # Add a database-level uniqueness constraint for databases that support it
4
- # (postgres & sqlite)
5
- if connection.adapter_name =~ /postgres|sqlite/i
4
+ # (postgres and sqlite > 3.8)
5
+ if connection.supports_partial_index?
6
6
  add_index 'spree_stock_items', ['variant_id', 'stock_location_id'], where: 'deleted_at is null', unique: true
7
7
  end
8
8
  end
@@ -0,0 +1,8 @@
1
+ class AddCountryIsoToPrices < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_prices, :country_iso, :string, null: true, limit: 2
4
+
5
+ add_index :spree_prices, :country_iso
6
+ add_index :spree_countries, :iso
7
+ end
8
+ end
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Core
3
+ module ClassConstantizer
4
+ class Set
5
+ include Enumerable
6
+
7
+ def initialize
8
+ @collection = ::Set.new
9
+ end
10
+
11
+ def <<(klass)
12
+ @collection << klass.to_s
13
+ end
14
+
15
+ def concat(klasses)
16
+ klasses.each do |klass|
17
+ self << klass
18
+ end
19
+ end
20
+
21
+ delegate :clear, :empty?, to: :@collection
22
+
23
+ def each
24
+ @collection.each do |klass|
25
+ yield klass.constantize
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -17,102 +17,98 @@ module Spree
17
17
  Spree::Config = app.config.spree.preferences # legacy access
18
18
  end
19
19
 
20
- initializer "spree.default_permissions" do |_app|
20
+ initializer "spree.default_permissions", before: :load_config_initializers do |_app|
21
21
  Spree::RoleConfiguration.configure do |config|
22
22
  config.assign_permissions :default, [Spree::PermissionSets::DefaultCustomer]
23
23
  config.assign_permissions :admin, [Spree::PermissionSets::SuperUser]
24
24
  end
25
25
  end
26
26
 
27
- initializer "spree.register.calculators" do |app|
28
- app.config.spree.calculators.shipping_methods = [
29
- Spree::Calculator::Shipping::FlatPercentItemTotal,
30
- Spree::Calculator::Shipping::FlatRate,
31
- Spree::Calculator::Shipping::FlexiRate,
32
- Spree::Calculator::Shipping::PerItem,
33
- Spree::Calculator::Shipping::PriceSack]
27
+ initializer "spree.register.calculators", before: :load_config_initializers do |app|
28
+ app.config.spree.calculators.shipping_methods = %w[
29
+ Spree::Calculator::Shipping::FlatPercentItemTotal
30
+ Spree::Calculator::Shipping::FlatRate
31
+ Spree::Calculator::Shipping::FlexiRate
32
+ Spree::Calculator::Shipping::PerItem
33
+ Spree::Calculator::Shipping::PriceSack
34
+ ]
34
35
 
35
- app.config.spree.calculators.tax_rates = [
36
- Spree::Calculator::DefaultTax]
36
+ app.config.spree.calculators.tax_rates = %w[
37
+ Spree::Calculator::DefaultTax
38
+ ]
37
39
  end
38
40
 
39
- initializer "spree.register.stock_splitters" do |app|
40
- app.config.spree.stock_splitters = [
41
- Spree::Stock::Splitter::ShippingCategory,
41
+ initializer "spree.register.stock_splitters", before: :load_config_initializers do |app|
42
+ app.config.spree.stock_splitters = %w[
43
+ Spree::Stock::Splitter::ShippingCategory
42
44
  Spree::Stock::Splitter::Backordered
43
45
  ]
44
46
  end
45
47
 
46
- initializer "spree.register.payment_methods" do |app|
47
- app.config.spree.payment_methods = [
48
- Spree::Gateway::Bogus,
49
- Spree::Gateway::BogusSimple,
50
- Spree::PaymentMethod::StoreCredit,
51
- Spree::PaymentMethod::Check]
48
+ initializer "spree.register.payment_methods", before: :load_config_initializers do |app|
49
+ app.config.spree.payment_methods = %w[
50
+ Spree::Gateway::Bogus
51
+ Spree::Gateway::BogusSimple
52
+ Spree::PaymentMethod::StoreCredit
53
+ Spree::PaymentMethod::Check
54
+ ]
52
55
  end
53
56
 
54
57
  # We need to define promotions rules here so extensions and existing apps
55
58
  # can add their custom classes on their initializer files
56
- initializer 'spree.promo.environment' do |app|
57
- app.config.spree.add_class('promotions')
59
+ initializer 'spree.promo.environment', before: :load_config_initializers do |app|
58
60
  app.config.spree.promotions = Spree::Promo::Environment.new
59
61
  app.config.spree.promotions.rules = []
60
62
  end
61
63
 
62
- initializer 'spree.promo.register.promotion.calculators' do |app|
63
- app.config.spree.calculators.add_class('promotion_actions_create_adjustments')
64
- app.config.spree.calculators.promotion_actions_create_adjustments = [
65
- Spree::Calculator::FlatPercentItemTotal,
66
- Spree::Calculator::FlatRate,
67
- Spree::Calculator::FlexiRate,
68
- Spree::Calculator::TieredPercent,
64
+ initializer 'spree.promo.register.promotion.calculators', before: :load_config_initializers do |app|
65
+ app.config.spree.calculators.promotion_actions_create_adjustments = %w[
66
+ Spree::Calculator::FlatPercentItemTotal
67
+ Spree::Calculator::FlatRate
68
+ Spree::Calculator::FlexiRate
69
+ Spree::Calculator::TieredPercent
69
70
  Spree::Calculator::TieredFlatRate
70
71
  ]
71
72
 
72
- app.config.spree.calculators.add_class('promotion_actions_create_item_adjustments')
73
- app.config.spree.calculators.promotion_actions_create_item_adjustments = [
74
- Spree::Calculator::PercentOnLineItem,
75
- Spree::Calculator::FlatRate,
76
- Spree::Calculator::FlexiRate,
73
+ app.config.spree.calculators.promotion_actions_create_item_adjustments = %w[
74
+ Spree::Calculator::PercentOnLineItem
75
+ Spree::Calculator::FlatRate
76
+ Spree::Calculator::FlexiRate
77
77
  Spree::Calculator::TieredPercent
78
78
  ]
79
79
 
80
- app.config.spree.calculators.add_class('promotion_actions_create_quantity_adjustments')
81
- app.config.spree.calculators.promotion_actions_create_quantity_adjustments = [
82
- Spree::Calculator::PercentOnLineItem,
80
+ app.config.spree.calculators.promotion_actions_create_quantity_adjustments = %w[
81
+ Spree::Calculator::PercentOnLineItem
83
82
  Spree::Calculator::FlatRate
84
83
  ]
85
84
  end
86
85
 
87
- # Promotion rules need to be evaluated on after initialize otherwise
88
- # Spree.user_class would be nil and users might experience errors related
89
- # to malformed model associations (Spree.user_class is only defined on
90
- # the app initializer)
91
- config.after_initialize do
92
- Rails.application.config.spree.promotions.rules.concat [
93
- Spree::Promotion::Rules::ItemTotal,
94
- Spree::Promotion::Rules::Product,
95
- Spree::Promotion::Rules::User,
96
- Spree::Promotion::Rules::FirstOrder,
97
- Spree::Promotion::Rules::UserLoggedIn,
98
- Spree::Promotion::Rules::OneUsePerUser,
99
- Spree::Promotion::Rules::Taxon,
100
- Spree::Promotion::Rules::NthOrder,
101
- Spree::Promotion::Rules::OptionValue,
86
+ initializer 'spree.promo.register.promotion.rules', before: :load_config_initializers do |app|
87
+ app.config.spree.promotions.rules = %w[
88
+ Spree::Promotion::Rules::ItemTotal
89
+ Spree::Promotion::Rules::Product
90
+ Spree::Promotion::Rules::User
91
+ Spree::Promotion::Rules::FirstOrder
92
+ Spree::Promotion::Rules::UserLoggedIn
93
+ Spree::Promotion::Rules::OneUsePerUser
94
+ Spree::Promotion::Rules::Taxon
95
+ Spree::Promotion::Rules::NthOrder
96
+ Spree::Promotion::Rules::OptionValue
102
97
  Spree::Promotion::Rules::FirstRepeatPurchaseSince
103
98
  ]
104
99
  end
105
100
 
106
- initializer 'spree.promo.register.promotions.actions' do |app|
107
- app.config.spree.promotions.actions = [
108
- Promotion::Actions::CreateAdjustment,
109
- Promotion::Actions::CreateItemAdjustments,
110
- Promotion::Actions::CreateQuantityAdjustments,
111
- Promotion::Actions::FreeShipping]
101
+ initializer 'spree.promo.register.promotions.actions', before: :load_config_initializers do |app|
102
+ app.config.spree.promotions.actions = %w[
103
+ Spree::Promotion::Actions::CreateAdjustment
104
+ Spree::Promotion::Actions::CreateItemAdjustments
105
+ Spree::Promotion::Actions::CreateQuantityAdjustments
106
+ Spree::Promotion::Actions::FreeShipping
107
+ ]
112
108
  end
113
109
 
114
110
  # filter sensitive information during logging
115
- initializer "spree.params.filter" do |app|
111
+ initializer "spree.params.filter", before: :load_config_initializers do |app|
116
112
  app.config.filter_parameters += [
117
113
  :password,
118
114
  :password_confirmation,
@@ -120,7 +116,7 @@ module Spree
120
116
  :verification_value]
121
117
  end
122
118
 
123
- initializer "spree.core.checking_migrations" do |_app|
119
+ initializer "spree.core.checking_migrations", before: :load_config_initializers do |_app|
124
120
  Migrations.new(config, engine_name).check
125
121
  end
126
122
  end
@@ -4,7 +4,12 @@ module Spree
4
4
  class Calculators
5
5
  include EnvironmentExtension
6
6
 
7
- attr_accessor :shipping_methods, :tax_rates
7
+ add_class_set :shipping_methods
8
+ add_class_set :tax_rates
9
+
10
+ add_class_set :promotion_actions_create_adjustments
11
+ add_class_set :promotion_actions_create_item_adjustments
12
+ add_class_set :promotion_actions_create_quantity_adjustments
8
13
  end
9
14
  end
10
15
  end
@@ -3,12 +3,15 @@ module Spree
3
3
  class Environment
4
4
  include EnvironmentExtension
5
5
 
6
- attr_accessor :calculators, :payment_methods, :preferences,
7
- :stock_splitters
6
+ add_class_set :payment_methods
7
+ add_class_set :stock_splitters
8
+
9
+ attr_accessor :calculators, :preferences, :promotions
8
10
 
9
11
  def initialize
10
12
  @calculators = Calculators.new
11
13
  @preferences = Spree::AppConfiguration.new
14
+ @promotions = Spree::Promo::Environment.new
12
15
  end
13
16
  end
14
17
  end
@@ -1,24 +1,28 @@
1
+ require 'spree/core/class_constantizer'
2
+
1
3
  module Spree
2
4
  module Core
3
5
  module EnvironmentExtension
4
6
  extend ActiveSupport::Concern
5
7
 
6
- def add_class(name)
7
- instance_variable_set "@#{name}", Set.new
8
-
9
- create_method( "#{name}=".to_sym ) { |val|
10
- instance_variable_set( "@" + name, val)
11
- }
8
+ class_methods do
9
+ def add_class_set(name)
10
+ define_method(name) do
11
+ set = instance_variable_get("@#{name}")
12
+ set = send("#{name}=", []) unless set
13
+ set
14
+ end
12
15
 
13
- create_method(name.to_sym) do
14
- instance_variable_get( "@" + name )
16
+ define_method("#{name}=") do |klasses|
17
+ set = ClassConstantizer::Set.new
18
+ set.concat(klasses)
19
+ instance_variable_set("@#{name}", set)
20
+ end
15
21
  end
16
22
  end
17
23
 
18
- private
19
-
20
- def create_method(name, &block)
21
- self.class.send(:define_method, name, &block)
24
+ def add_class(name)
25
+ singleton_class.send(:add_class_set, name)
22
26
  end
23
27
  end
24
28
  end
@@ -0,0 +1,32 @@
1
+ module Spree
2
+ # This class performs a data migration. It's usually run from
3
+ # the `solidus:migrations:create_vat_prices` rake task.
4
+ class PriceMigrator
5
+ # Migrate all variant's prices.
6
+ def self.migrate_default_vat_prices
7
+ # We need to tag the exisiting prices as "default", so that the VatPriceGenerator knows
8
+ # that they include the default zone's VAT.
9
+ Spree::Config.admin_vat_country_iso = Spree::Zone.default_tax.countries.first.iso
10
+ # If we don't remove this ivar, the above line stays without effect because of caching.
11
+ Spree::Config.remove_instance_variable(:@default_pricing_options)
12
+ Spree::Variant.find_each do |variant|
13
+ new(variant).migrate_vat_prices
14
+ end
15
+ # This line stops all weird code paths that generate refunds from happening.
16
+ Spree::Zone.default_tax.update(default_tax: false)
17
+ end
18
+
19
+ attr_reader :variant
20
+
21
+ def initialize(variant)
22
+ @variant = variant
23
+ end
24
+
25
+ def migrate_vat_prices
26
+ # With a default tax zone, all prices include VAT by default. Let's tell them which one!
27
+ variant.prices.update_all(country_iso: Spree::Config.admin_vat_country_iso)
28
+ Spree::Variant::VatPriceGenerator.new(variant).run
29
+ variant.save
30
+ end
31
+ end
32
+ end
@@ -30,7 +30,7 @@ module Spree
30
30
  curr_page = page || 1
31
31
 
32
32
  unless Spree::Config.show_products_without_price
33
- @products = @products.joins(:prices).merge(Spree::Price.where(pricing_options.desired_attributes)).uniq
33
+ @products = @products.joins(:prices).merge(Spree::Price.where(pricing_options.search_arguments)).uniq
34
34
  end
35
35
  @products = @products.page(curr_page).per(per_page)
36
36
  end
@@ -70,7 +70,7 @@ module Spree
70
70
  # separate queries most of the time but opt for a join as soon as any
71
71
  # `where` constraints affecting joined tables are added to the search;
72
72
  # which is the case as soon as a taxon is added to the base scope.
73
- scope = scope.preload(master: :prices)
73
+ scope = scope.preload(master: :currently_valid_prices)
74
74
  scope = scope.preload(master: :images) if include_images
75
75
  scope
76
76
  end
@@ -5,7 +5,7 @@ module Spree
5
5
  end
6
6
 
7
7
  def self.solidus_version
8
- "1.3.0.beta1"
8
+ "1.3.0.rc1"
9
9
  end
10
10
 
11
11
  def self.solidus_gem_version
data/lib/spree/core.rb CHANGED
@@ -63,11 +63,13 @@ end
63
63
 
64
64
  require 'spree/core/version'
65
65
 
66
+ require 'spree/core/class_constantizer'
66
67
  require 'spree/core/environment_extension'
67
68
  require 'spree/core/environment/calculators'
68
69
  require 'spree/core/environment'
69
70
  require 'spree/promo/environment'
70
71
  require 'spree/migrations'
72
+ require 'spree/migration_helpers'
71
73
  require 'spree/core/engine'
72
74
 
73
75
  require 'spree/i18n'
@@ -97,3 +99,5 @@ require 'spree/deprecation'
97
99
 
98
100
  require 'spree/mailer_previews/order_preview'
99
101
  require 'spree/mailer_previews/carton_preview'
102
+
103
+ require 'spree/core/price_migrator'
@@ -0,0 +1,19 @@
1
+ module Spree
2
+ module MigrationHelpers
3
+ def safe_remove_index(table, column)
4
+ remove_index(table, column) if index_exists?(table, column)
5
+ end
6
+
7
+ def safe_add_index(table, column, options = {})
8
+ if columns_exist?(table, column) && !index_exists?(table, column, options)
9
+ add_index(table, column, options)
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def columns_exist?(table, columns)
16
+ Array.wrap(columns).all? { |column| column_exists?(table, column) }
17
+ end
18
+ end
19
+ end
data/lib/spree/money.rb CHANGED
@@ -6,11 +6,18 @@ module Spree
6
6
  # Spree::Money is a relatively thin wrapper around Monetize which handles
7
7
  # formatting via Spree::Config.
8
8
  class Money
9
+ RUBY_NUMERIC_STRING = /\A-?\d+(\.\d+)?\z/
10
+
9
11
  class <<self
10
12
  attr_accessor :default_formatting_rules
11
13
 
12
- def from_money(money)
13
- new(money.to_d, currency: money.currency.iso_code)
14
+ def parse(amount, currency = Spree::Config[:currency])
15
+ new(parse_to_money(amount, currency))
16
+ end
17
+
18
+ # @api private
19
+ def parse_to_money(amount, currency)
20
+ ::Monetize.parse(amount, currency)
14
21
  end
15
22
  end
16
23
  self.default_formatting_rules = {
@@ -23,9 +30,33 @@ module Spree
23
30
 
24
31
  delegate :cents, :currency, :to_d, :zero?, to: :money
25
32
 
26
- # @param amount [#to_s] the value of the money object
27
- # @param options [Hash] the options for creating the money object
28
- # @option options [String] currency the currency for the money object
33
+ # @param amount [Money, #to_s] the value of the money object
34
+ # @param options [Hash] the default options for formatting the money object See #format
35
+ def initialize(amount, options = {})
36
+ if amount.is_a?(::Money)
37
+ @money = amount
38
+ else
39
+ currency = (options[:currency] || Spree::Config[:currency])
40
+ if amount.to_s =~ RUBY_NUMERIC_STRING
41
+ @money = Monetize.from_string(amount, currency)
42
+ else
43
+ @money = Spree::Money.parse_to_money(amount, currency)
44
+ Spree::Deprecation.warn <<-WARN.squish, caller
45
+ Spree::Money was initialized with #{amount.inspect}, which will not be supported in the future.
46
+ Instead use Spree::Money.new(#{@money.to_s.inspect}, options) or Spree::Money.parse(#{amount.inspect})
47
+ WARN
48
+ end
49
+ end
50
+ @options = Spree::Money.default_formatting_rules.merge(options)
51
+ end
52
+
53
+ # @return [String] the value of this money object formatted according to
54
+ # its options
55
+ def to_s
56
+ format
57
+ end
58
+
59
+ # @param options [Hash, String] the options for formatting the money object
29
60
  # @option options [Boolean] with_currency when true, show the currency
30
61
  # @option options [Boolean] no_cents when true, round to the closest dollar
31
62
  # @option options [String] decimal_mark the mark for delimiting the
@@ -36,15 +67,10 @@ module Spree
36
67
  # value comes before the currency symbol
37
68
  # @option options [:before, :after] symbol_position the position of the
38
69
  # currency symbol
39
- def initialize(amount, options = {})
40
- @money = Monetize.parse([amount, (options[:currency] || Spree::Config[:currency])].join)
41
- @options = Spree::Money.default_formatting_rules.merge(options)
42
- end
43
-
44
70
  # @return [String] the value of this money object formatted according to
45
71
  # its options
46
- def to_s
47
- @money.format(@options)
72
+ def format(options = {})
73
+ @money.format(@options.merge(options))
48
74
  end
49
75
 
50
76
  # @note If you pass in options, ensure you pass in the html: true as well.
@@ -52,7 +78,7 @@ module Spree
52
78
  # @return [String] the value of this money object formatted according to
53
79
  # its options and any additional options, by default as html.
54
80
  def to_html(options = { html: true })
55
- output = @money.format(@options.merge(options))
81
+ output = format(options)
56
82
  if options[:html]
57
83
  # 1) prevent blank, breaking spaces
58
84
  # 2) prevent escaping of HTML character entities
@@ -76,12 +102,12 @@ module Spree
76
102
 
77
103
  def -(other)
78
104
  raise TypeError, "Can't subtract #{other.class} to Spree::Money" if !other.respond_to?(:money)
79
- self.class.from_money(@money - other.money)
105
+ self.class.new(@money - other.money)
80
106
  end
81
107
 
82
108
  def +(other)
83
109
  raise TypeError, "Can't add #{other.class} to Spree::Money" if !other.respond_to?(:money)
84
- self.class.from_money(@money + other.money)
110
+ self.class.new(@money + other.money)
85
111
  end
86
112
  end
87
113
  end
@@ -3,7 +3,8 @@ module Spree
3
3
  class Environment
4
4
  include Core::EnvironmentExtension
5
5
 
6
- attr_accessor :rules, :actions
6
+ add_class_set :rules
7
+ add_class_set :actions
7
8
  end
8
9
  end
9
10
  end