solidus_core 1.3.2 → 1.4.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 (139) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +15 -0
  3. data/app/helpers/spree/base_helper.rb +6 -2
  4. data/app/mailers/spree/base_mailer.rb +1 -1
  5. data/app/mailers/spree/carton_mailer.rb +1 -1
  6. data/app/mailers/spree/order_mailer.rb +2 -2
  7. data/app/mailers/spree/reimbursement_mailer.rb +7 -7
  8. data/app/mailers/spree/test_mailer.rb +3 -2
  9. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  10. data/app/models/spree/address.rb +14 -4
  11. data/app/models/spree/adjustment.rb +11 -19
  12. data/app/models/spree/app_configuration.rb +23 -1
  13. data/app/models/spree/base.rb +9 -0
  14. data/app/models/spree/country.rb +2 -2
  15. data/app/models/spree/exchange.rb +1 -1
  16. data/app/models/spree/gateway.rb +1 -1
  17. data/app/models/spree/item_adjustments.rb +7 -0
  18. data/app/models/spree/line_item.rb +1 -13
  19. data/app/models/spree/order/checkout.rb +19 -16
  20. data/app/models/spree/order/payments.rb +0 -2
  21. data/app/models/spree/order.rb +7 -21
  22. data/app/models/spree/order_contents.rb +60 -4
  23. data/app/models/spree/order_merger.rb +2 -4
  24. data/app/models/spree/order_shipping.rb +1 -1
  25. data/app/models/spree/order_update_attributes.rb +0 -2
  26. data/app/models/spree/order_updater.rb +14 -11
  27. data/app/models/spree/payment.rb +2 -3
  28. data/app/models/spree/payment_create.rb +5 -2
  29. data/app/models/spree/payment_method/store_credit.rb +6 -5
  30. data/app/models/spree/product/scopes.rb +2 -1
  31. data/app/models/spree/product.rb +2 -5
  32. data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -3
  33. data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
  34. data/app/models/spree/promotion/rules/option_value.rb +2 -3
  35. data/app/models/spree/promotion/rules/product.rb +9 -3
  36. data/app/models/spree/promotion/rules/taxon.rb +33 -7
  37. data/app/models/spree/promotion/rules/user.rb +2 -3
  38. data/app/models/spree/promotion.rb +16 -6
  39. data/app/models/spree/promotion_handler/coupon.rb +1 -1
  40. data/app/models/spree/shipment.rb +12 -16
  41. data/app/models/spree/stock/estimator.rb +1 -1
  42. data/app/models/spree/stock/package.rb +0 -1
  43. data/app/models/spree/stock_item.rb +2 -6
  44. data/app/models/spree/store.rb +2 -1
  45. data/app/models/spree/tax_rate.rb +1 -1
  46. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +29 -0
  47. data/app/models/spree/wallet/default_payment_builder.rb +26 -0
  48. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +46 -0
  49. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +1 -1
  50. data/app/views/spree/shared/_base_mailer_footer.html.erb +1 -20
  51. data/app/views/spree/shared/_base_mailer_header.html.erb +1 -31
  52. data/config/initializers/spree_user.rb +1 -1
  53. data/config/locales/en.yml +58 -34
  54. data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +1 -1
  55. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +15 -3
  56. data/db/migrate/20160527070401_rename_shipment_address_field.rb +7 -0
  57. data/db/migrate/20160616232103_remove_user_id_from_promotion_rules.rb +11 -0
  58. data/db/migrate/20160718205341_add_payment_id_index_to_spree_refunds.rb +5 -0
  59. data/db/migrate/20160718205859_add_reimbursement_id_index_to_spree_refunds.rb +5 -0
  60. data/lib/generators/spree/dummy/dummy_generator.rb +1 -1
  61. data/lib/generators/spree/dummy/templates/rails/database.yml +3 -1
  62. data/lib/generators/spree/dummy/templates/rails/test.rb +4 -2
  63. data/lib/generators/spree/install/install_generator.rb +6 -16
  64. data/lib/spree/core/controller_helpers/auth.rb +1 -1
  65. data/lib/spree/core/controller_helpers/common.rb +1 -1
  66. data/lib/spree/core/controller_helpers/order.rb +2 -2
  67. data/lib/spree/core/current_store.rb +5 -1
  68. data/lib/spree/core/delegate_belongs_to.rb +1 -1
  69. data/lib/spree/core/routes.rb +6 -32
  70. data/lib/spree/core/search/base.rb +2 -2
  71. data/lib/spree/core/stock_configuration.rb +6 -0
  72. data/lib/spree/core/version.rb +2 -2
  73. data/lib/spree/core.rb +2 -1
  74. data/lib/spree/i18n.rb +7 -0
  75. data/lib/spree/mailer_previews/carton_preview.rb +2 -1
  76. data/lib/spree/mailer_previews/order_preview.rb +8 -3
  77. data/lib/spree/mailer_previews/reimbursement_preview.rb +11 -0
  78. data/lib/spree/migrations.rb +13 -7
  79. data/lib/spree/permitted_attributes.rb +1 -1
  80. data/lib/spree/testing_support/capybara_ext.rb +6 -1
  81. data/lib/spree/testing_support/common_rake.rb +3 -7
  82. data/lib/spree/testing_support/controller_requests.rb +8 -0
  83. data/lib/spree/testing_support/factories/order_factory.rb +30 -8
  84. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  85. data/lib/spree/testing_support/factories/product_factory.rb +6 -0
  86. data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -0
  87. data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +3 -1
  88. data/solidus_core.gemspec +3 -3
  89. data/spec/helpers/base_helper_spec.rb +18 -2
  90. data/spec/lib/i18n_spec.rb +4 -0
  91. data/spec/lib/spree/core/controller_helpers/order_spec.rb +16 -4
  92. data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +75 -59
  93. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +1 -1
  94. data/spec/lib/spree/core/importer/order_spec.rb +4 -2
  95. data/spec/lib/spree/core/stock_configuration_spec.rb +17 -0
  96. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +195 -0
  97. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +6 -0
  98. data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +6 -0
  99. data/spec/lib/spree/migrations_spec.rb +3 -9
  100. data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +1 -1
  101. data/spec/mailers/carton_mailer_spec.rb +1 -1
  102. data/spec/mailers/order_mailer_spec.rb +2 -2
  103. data/spec/mailers/reimbursement_mailer_spec.rb +1 -1
  104. data/spec/models/spree/address_spec.rb +22 -0
  105. data/spec/models/spree/adjustment_spec.rb +0 -10
  106. data/spec/models/spree/carton_spec.rb +1 -1
  107. data/spec/models/spree/country_spec.rb +9 -1
  108. data/spec/models/spree/gateway/bogus_spec.rb +1 -1
  109. data/spec/models/spree/item_adjustments_spec.rb +33 -0
  110. data/spec/models/spree/line_item_spec.rb +2 -21
  111. data/spec/models/spree/order/checkout_spec.rb +32 -45
  112. data/spec/models/spree/order/payment_spec.rb +1 -16
  113. data/spec/models/spree/order_cancellations_spec.rb +8 -3
  114. data/spec/models/spree/order_contents_spec.rb +48 -0
  115. data/spec/models/spree/order_merger_spec.rb +8 -5
  116. data/spec/models/spree/order_shipping_spec.rb +3 -4
  117. data/spec/models/spree/order_spec.rb +23 -59
  118. data/spec/models/spree/order_update_attributes_spec.rb +1 -5
  119. data/spec/models/spree/order_updater_spec.rb +39 -11
  120. data/spec/models/spree/payment_create_spec.rb +61 -0
  121. data/spec/models/spree/payment_method/store_credit_spec.rb +23 -10
  122. data/spec/models/spree/payment_spec.rb +17 -4
  123. data/spec/models/spree/product_spec.rb +1 -1
  124. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +8 -13
  125. data/spec/models/spree/promotion/rules/product_spec.rb +33 -0
  126. data/spec/models/spree/promotion/rules/taxon_spec.rb +52 -8
  127. data/spec/models/spree/promotion_spec.rb +18 -12
  128. data/spec/models/spree/return_authorization_spec.rb +0 -16
  129. data/spec/models/spree/shipment_spec.rb +57 -36
  130. data/spec/models/spree/stock/coordinator_spec.rb +0 -5
  131. data/spec/models/spree/stock/package_spec.rb +0 -1
  132. data/spec/models/spree/stock_item_spec.rb +35 -145
  133. data/spec/models/spree/store_spec.rb +24 -10
  134. data/spec/models/spree/tax_rate_spec.rb +2 -2
  135. data/spec/models/spree/user_spec.rb +1 -1
  136. data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +20 -12
  137. data/spec/support/concerns/working_factories.rb +4 -0
  138. metadata +30 -10
  139. data/config/routes.rb +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 11dfded4cc7b83741076ed919b7e304c7c4f3cf6
4
- data.tar.gz: 93326ebc65ba22635c8dc11cd971d84c5a457b85
3
+ metadata.gz: 8aa4c3e58ebb0c1418f96f55061e429329292ed3
4
+ data.tar.gz: 90e3439877e5e1632c288d009a442a05bce4631d
5
5
  SHA512:
6
- metadata.gz: 897b31dab736b86bf7606a03312e623aaab7a144110d832df807f33fab4046a43466c81b18c634eb7fe24e3d1e92280567dfb93531785f201bc25c70e78bf166
7
- data.tar.gz: 2a91a9348afeb72e55c48efacbc00dcb260422f04734ba0aea8e8c13eae0e0b100202c6b9fa3bba56bef3f8ad7888a2e32ac0e564bed7b60b7f5584ba1f0b54c
6
+ metadata.gz: cc8e9cba50b0b5eb46b7305513e28e395194d01f4b8304d1929eff3bf2db019d8f6b683691df073890aaf955946a3fdd7bf57d5e935c91c403f2dd68d9dd4488
7
+ data.tar.gz: 4b98fa39ceb46b0ccf5c85163bf1fc778f6641eafe8d2e99dd8a249b0657d5232ff74fc025593e3cb14c1ff40b430dc666896d666fd60e7733d404444eac2d05
data/README.md ADDED
@@ -0,0 +1,15 @@
1
+ # solidus\_core
2
+
3
+ Core contains all the models and the majority of the logic for the Solidus
4
+ ecommerce system.
5
+
6
+
7
+ ## Testing
8
+
9
+ Create the test site
10
+
11
+ bundle exec rake test_app
12
+
13
+ Run the tests
14
+
15
+ bundle exec rake spec
@@ -66,7 +66,7 @@ module Spree
66
66
  nil
67
67
  end
68
68
 
69
- def breadcrumbs(taxon, separator = " » ", breadcrumb_class = "inline")
69
+ def taxon_breadcrumbs(taxon, separator = " » ", breadcrumb_class = "inline")
70
70
  return "" if current_page?("/") || taxon.nil?
71
71
 
72
72
  crumbs = [[Spree.t(:home), spree.root_path]]
@@ -153,6 +153,10 @@ module Spree
153
153
  end
154
154
  end
155
155
 
156
+ def plural_resource_name(resource_class)
157
+ resource_class.model_name.human(count: Spree::I18N_GENERIC_PLURAL)
158
+ end
159
+
156
160
  private
157
161
 
158
162
  # Returns style of image or nil
@@ -170,7 +174,7 @@ module Spree
170
174
 
171
175
  def define_image_method(style)
172
176
  self.class.send :define_method, "#{style}_image" do |product, *options|
173
- ActiveSupport::Deprecation.warn "Spree image helpers will be deprecated in the near future. Use the provided resource to access the intendend image directly.", caller
177
+ Spree::Deprecation.warn "Spree image helpers will be deprecated in the near future. Use the provided resource to access the intendend image directly.", caller
174
178
  options = options.first || {}
175
179
  if product.images.empty?
176
180
  if !product.is_a?(Spree::Variant) && !product.variant_images.empty?
@@ -4,7 +4,7 @@ module Spree
4
4
  if store
5
5
  store.mail_from_address
6
6
  else
7
- ActiveSupport::Deprecation.warn "A Spree::Store should be provided to determine the from address.", caller
7
+ Spree::Deprecation.warn "A Spree::Store should be provided to determine the from address.", caller
8
8
  Spree::Config[:mails_from]
9
9
  end
10
10
  end
@@ -15,7 +15,7 @@ module Spree
15
15
  # def shipped_email(carton:, order:, resend: false)
16
16
  def shipped_email(options, deprecated_options = {})
17
17
  if options.is_a?(Integer)
18
- ActiveSupport::Deprecation.warn "Calling shipped_email with a carton_id is DEPRECATED. Instead use CartonMailer.shipped_email(order: order, carton: carton)"
18
+ Spree::Deprecation.warn "Calling shipped_email with a carton_id is DEPRECATED. Instead use CartonMailer.shipped_email(order: order, carton: carton)"
19
19
  @carton = Carton.find(options)
20
20
  @order = @carton.orders.first # assume first order
21
21
  @manifest = @carton.manifest # use the entire manifest, since we don't know the precise order
@@ -30,14 +30,14 @@ module Spree
30
30
  if order.respond_to?(:id)
31
31
  order
32
32
  else
33
- ActiveSupport::Deprecation.warn("Calling OrderMailer with an id is deprecated. Pass the Spree::Order object instead.")
33
+ Spree::Deprecation.warn("Calling OrderMailer with an id is deprecated. Pass the Spree::Order object instead.")
34
34
  Spree::Order.find(order)
35
35
  end
36
36
  end
37
37
 
38
38
  def build_subject(subject_text, resend)
39
39
  resend_text = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
40
- "#{resend_text}#{Spree::Store.current.name} #{subject_text} ##{@order.number}"
40
+ "#{resend_text}#{@order.store.name} #{subject_text} ##{@order.number}"
41
41
  end
42
42
  end
43
43
  end
@@ -1,11 +1,11 @@
1
1
  module Spree
2
2
  class ReimbursementMailer < BaseMailer
3
- def reimbursement_email(reimbursement, resend = false)
4
- @reimbursement = reimbursement.respond_to?(:id) ? reimbursement : Spree::Reimbursement.find(reimbursement)
5
- store = @reimbursement.order.store
6
- subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
7
- subject += "#{store.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@reimbursement.order.number}"
8
- mail(to: @reimbursement.order.email, from: from_address(store), subject: subject)
9
- end
3
+ def reimbursement_email(reimbursement, resend = false)
4
+ @reimbursement = reimbursement.respond_to?(:id) ? reimbursement : Spree::Reimbursement.find(reimbursement)
5
+ store = @reimbursement.order.store
6
+ subject = (resend ? "[#{Spree.t(:resend).upcase}] " : '')
7
+ subject += "#{store.name} #{Spree.t('reimbursement_mailer.reimbursement_email.subject')} ##{@reimbursement.order.number}"
8
+ mail(to: @reimbursement.order.email, from: from_address(store), subject: subject)
9
+ end
10
10
  end
11
11
  end
@@ -1,8 +1,9 @@
1
1
  module Spree
2
2
  class TestMailer < BaseMailer
3
3
  def test_email(email)
4
- subject = "#{Spree::Store.current.name} #{Spree.t('test_mailer.test_email.subject')}"
5
- mail(to: email, from: from_address(Spree::Store.current), subject: subject)
4
+ store = Spree::Store.default
5
+ subject = "#{store.name} #{Spree.t('test_mailer.test_email.subject')}"
6
+ mail(to: email, from: from_address(store), subject: subject)
6
7
  end
7
8
  end
8
9
  end
@@ -15,7 +15,7 @@ module Spree
15
15
  end
16
16
 
17
17
  def drop_payment_source(source)
18
- ActiveSupport::Deprecation.warn("User#drop_payment_source is deprecated", caller)
18
+ Spree::Deprecation.warn("User#drop_payment_source is deprecated", caller)
19
19
  gateway = source.payment_method
20
20
  gateway.disable_customer_profile(source)
21
21
  end
@@ -1,6 +1,8 @@
1
+ require 'twitter_cldr'
2
+
1
3
  module Spree
2
4
  class Address < Spree::Base
3
- require 'twitter_cldr'
5
+ extend ActiveModel::ForbiddenAttributesProtection
4
6
 
5
7
  belongs_to :country, class_name: "Spree::Country"
6
8
  belongs_to :state, class_name: "Spree::State"
@@ -15,6 +17,7 @@ module Spree
15
17
  alias_attribute :last_name, :lastname
16
18
 
17
19
  DB_ONLY_ATTRS = %w(id updated_at created_at)
20
+ TAXATION_ATTRS = %w(state_id country_id zipcode)
18
21
 
19
22
  self.whitelisted_ransackable_attributes = %w[firstname lastname]
20
23
 
@@ -27,7 +30,7 @@ module Spree
27
30
  end
28
31
 
29
32
  def self.default(user = nil, kind = "bill")
30
- ActiveSupport::Deprecation.warn("Address.default is deprecated. Use User.default_address or Address.build_default", caller)
33
+ Spree::Deprecation.warn("Address.default is deprecated. Use User.default_address or Address.build_default", caller)
31
34
  if user
32
35
  user.send(:"#{kind}_address") || build_default
33
36
  else
@@ -44,6 +47,9 @@ module Spree
44
47
  # @return [Address] address from existing address plus new_attributes as diff
45
48
  # @note, this may return existing_address if there are no changes to value equality
46
49
  def self.immutable_merge(existing_address, new_attributes)
50
+ # Ensure new_attributes is a sanitized hash
51
+ new_attributes = sanitize_for_mass_assignment(new_attributes)
52
+
47
53
  return factory(new_attributes) if existing_address.nil?
48
54
 
49
55
  merged_attributes = value_attributes(existing_address.attributes, new_attributes)
@@ -78,6 +84,10 @@ module Spree
78
84
  self.class.value_attributes(attributes)
79
85
  end
80
86
 
87
+ def taxation_attributes
88
+ self.class.value_attributes(attributes.slice(*TAXATION_ATTRS))
89
+ end
90
+
81
91
  # @return [String] the full name on this address
82
92
  def full_name
83
93
  "#{firstname} #{lastname}".strip
@@ -101,12 +111,12 @@ module Spree
101
111
  end
102
112
 
103
113
  def same_as?(other_address)
104
- ActiveSupport::Deprecation.warn("Address.same_as? is deprecated. It's equivalent to Address.==", caller)
114
+ Spree::Deprecation.warn("Address.same_as? is deprecated. It's equivalent to Address.==", caller)
105
115
  self == other_address
106
116
  end
107
117
 
108
118
  def same_as(other_address)
109
- ActiveSupport::Deprecation.warn("Address.same_as is deprecated. It's equivalent to Address.==", caller)
119
+ Spree::Deprecation.warn("Address.same_as is deprecated. It's equivalent to Address.==", caller)
110
120
  self == other_address
111
121
  end
112
122
 
@@ -26,17 +26,14 @@ module Spree
26
26
  validates :amount, numericality: true
27
27
  validates :promotion_code, presence: true, if: :require_promotion_code?
28
28
 
29
- after_create :update_adjustable_adjustment_total
30
- after_destroy :update_adjustable_adjustment_total
31
-
32
29
  scope :not_finalized, -> { where(finalized: false) }
33
30
  scope :open, -> do
34
- ActiveSupport::Deprecation.warn "Adjustment.open is deprecated. Instead use Adjustment.not_finalized", caller
31
+ Spree::Deprecation.warn "Adjustment.open is deprecated. Instead use Adjustment.not_finalized", caller
35
32
  where(finalized: false)
36
33
  end
37
34
  scope :finalized, -> { where(finalized: true) }
38
35
  scope :closed, -> do
39
- ActiveSupport::Deprecation.warn "Adjustment.closed is deprecated. Instead use Adjustment.finalized", caller
36
+ Spree::Deprecation.warn "Adjustment.closed is deprecated. Instead use Adjustment.finalized", caller
40
37
  where(finalized: true)
41
38
  end
42
39
  scope :cancellation, -> { where(source_type: 'Spree::UnitCancel') }
@@ -78,12 +75,12 @@ module Spree
78
75
 
79
76
  # Deprecated methods
80
77
  def state
81
- ActiveSupport::Deprecation.warn "Adjustment#state is deprecated. Instead use Adjustment#finalized?", caller
78
+ Spree::Deprecation.warn "Adjustment#state is deprecated. Instead use Adjustment#finalized?", caller
82
79
  finalized? ? "closed" : "open"
83
80
  end
84
81
 
85
82
  def state=(new_state)
86
- ActiveSupport::Deprecation.warn "Adjustment#state= is deprecated. Instead use Adjustment#finalized=", caller
83
+ Spree::Deprecation.warn "Adjustment#state= is deprecated. Instead use Adjustment#finalized=", caller
87
84
  case new_state
88
85
  when "open"
89
86
  self.finalized = false
@@ -95,32 +92,32 @@ module Spree
95
92
  end
96
93
 
97
94
  def open?
98
- ActiveSupport::Deprecation.warn "Adjustment#open? is deprecated. Instead use Adjustment#finalized?", caller
95
+ Spree::Deprecation.warn "Adjustment#open? is deprecated. Instead use Adjustment#finalized?", caller
99
96
  !closed?
100
97
  end
101
98
 
102
99
  def closed?
103
- ActiveSupport::Deprecation.warn "Adjustment#closed? is deprecated. Instead use Adjustment#finalized?", caller
100
+ Spree::Deprecation.warn "Adjustment#closed? is deprecated. Instead use Adjustment#finalized?", caller
104
101
  finalized?
105
102
  end
106
103
 
107
104
  def open
108
- ActiveSupport::Deprecation.warn "Adjustment#open is deprecated. Instead use Adjustment#unfinalize", caller
105
+ Spree::Deprecation.warn "Adjustment#open is deprecated. Instead use Adjustment#unfinalize", caller
109
106
  unfinalize
110
107
  end
111
108
 
112
109
  def open!
113
- ActiveSupport::Deprecation.warn "Adjustment#open! is deprecated. Instead use Adjustment#unfinalize!", caller
110
+ Spree::Deprecation.warn "Adjustment#open! is deprecated. Instead use Adjustment#unfinalize!", caller
114
111
  unfinalize!
115
112
  end
116
113
 
117
114
  def close
118
- ActiveSupport::Deprecation.warn "Adjustment#close is deprecated. Instead use Adjustment#finalize", caller
115
+ Spree::Deprecation.warn "Adjustment#close is deprecated. Instead use Adjustment#finalize", caller
119
116
  finalize
120
117
  end
121
118
 
122
119
  def close!
123
- ActiveSupport::Deprecation.warn "Adjustment#close! is deprecated. Instead use Adjustment#finalize!", caller
120
+ Spree::Deprecation.warn "Adjustment#close! is deprecated. Instead use Adjustment#finalize!", caller
124
121
  finalize!
125
122
  end
126
123
  # End deprecated methods
@@ -154,7 +151,7 @@ module Spree
154
151
  # @return [BigDecimal] New amount of this adjustment
155
152
  def update!(target = nil)
156
153
  if target
157
- ActiveSupport::Deprecation.warn("Passing a target to Adjustment#update! is deprecated. The adjustment will use the correct target from it's adjustable association.", caller)
154
+ Spree::Deprecation.warn("Passing a target to Adjustment#update! is deprecated. The adjustment will use the correct target from it's adjustable association.", caller)
158
155
  end
159
156
  return amount if finalized?
160
157
 
@@ -177,11 +174,6 @@ module Spree
177
174
 
178
175
  private
179
176
 
180
- def update_adjustable_adjustment_total
181
- # Cause adjustable's total to be recalculated
182
- ItemAdjustments.new(adjustable).update
183
- end
184
-
185
177
  def require_promotion_code?
186
178
  promotion? && source.promotion.codes.any?
187
179
  end
@@ -349,6 +349,28 @@ module Spree
349
349
  @order_merger_class ||= Spree::OrderMerger
350
350
  end
351
351
 
352
+ # Allows providing your own class for adding default payments to a user's
353
+ # order from their "wallet".
354
+ #
355
+ # @!attribute [rw] default_payment_builder_class
356
+ # @return [Class] a class with the same public interfaces as
357
+ # Spree::Wallet::DefaultPaymentBuilder.
358
+ attr_writer :default_payment_builder_class
359
+ def default_payment_builder_class
360
+ @default_payment_builder_class ||= Spree::Wallet::DefaultPaymentBuilder
361
+ end
362
+
363
+ # Allows providing your own class for adding payment sources to a user's
364
+ # "wallet" after an order moves to the complete state.
365
+ #
366
+ # @!attribute [rw] add_payment_sources_to_wallet_class
367
+ # @return [Class] a class with the same public interfaces
368
+ # as Spree::Wallet::AddPaymentSourcesToWallet.
369
+ attr_writer :add_payment_sources_to_wallet_class
370
+ def add_payment_sources_to_wallet_class
371
+ @add_payment_sources_to_wallet_class ||= Spree::Wallet::AddPaymentSourcesToWallet
372
+ end
373
+
352
374
  def static_model_preferences
353
375
  @static_model_preferences ||= Spree::Preferences::StaticModelPreferences.new
354
376
  end
@@ -387,7 +409,7 @@ module Spree
387
409
 
388
410
  # support all the old preference methods with a warning
389
411
  define_method "preferred_#{old_preference_name}" do
390
- ActiveSupport::Deprecation.warn("#{old_preference_name} is no longer supported on Spree::Config, please access it through #{store_method} on Spree::Store", bc.clean(caller))
412
+ Spree::Deprecation.warn("#{old_preference_name} is no longer supported on Spree::Config, please access it through #{store_method} on Spree::Store", bc.clean(caller))
391
413
  Spree::Store.default.send(store_method)
392
414
  end
393
415
  end
@@ -26,4 +26,13 @@ class Spree::Base < ActiveRecord::Base
26
26
  end
27
27
 
28
28
  self.abstract_class = true
29
+
30
+ # Provides a scope that should be included any time products
31
+ # are fetched with the intention of displaying to the user.
32
+ #
33
+ # Allows individual stores to include any active record scopes or joins
34
+ # when products are displayed.
35
+ def self.display_includes
36
+ where(nil)
37
+ end
29
38
  end
@@ -7,7 +7,7 @@ module Spree
7
7
  validates :name, :iso_name, presence: true
8
8
 
9
9
  def self.states_required_by_country_id
10
- ActiveSupport::Deprecation.warn "Spree::Country.states_required_by_country_id is deprecated and will be removed from future releases, Implement it yourself.", caller
10
+ Spree::Deprecation.warn "Spree::Country.states_required_by_country_id is deprecated and will be removed from future releases, Implement it yourself.", caller
11
11
  states_required = Hash.new(true)
12
12
  all.each { |country| states_required[country.id.to_s] = country.states_required }
13
13
  states_required
@@ -15,7 +15,7 @@ module Spree
15
15
 
16
16
  def self.default
17
17
  if Spree::Config.default_country_id
18
- ActiveSupport::Deprecation.warn("Setting your default country via its ID is deprecated. Please set your default country via the `default_country_iso` setting.", caller)
18
+ Spree::Deprecation.warn("Setting your default country via its ID is deprecated. Please set your default country via the `default_country_iso` setting.", caller)
19
19
  find_by(id: Spree::Config.default_country_id) || find_by!(iso: Spree::Config.default_country_iso)
20
20
  else
21
21
  find_by!(iso: Spree::Config.default_country_iso)
@@ -20,7 +20,7 @@ module Spree
20
20
 
21
21
  def perform!
22
22
  begin
23
- shipments = Spree::Stock::Coordinator.new(@order, @reimbursement_objects.map(&:build_exchange_inventory_unit)).shipments
23
+ shipments = Spree::Config.stock.coordinator_class.new(@order, @reimbursement_objects.map(&:build_exchange_inventory_unit)).shipments
24
24
  rescue Spree::Order::InsufficientStock
25
25
  raise UnableToCreateShipments.new("Could not generate shipments for all items. Out of stock?")
26
26
  end
@@ -39,7 +39,7 @@ module Spree
39
39
  end
40
40
 
41
41
  def disable_customer_profile(source)
42
- ActiveSupport::Deprecation.warn("Gateway#disable_customer_profile is deprecated")
42
+ Spree::Deprecation.warn("Gateway#disable_customer_profile is deprecated")
43
43
  if source.is_a? CreditCard
44
44
  source.update_column :gateway_customer_profile_id, nil
45
45
  else
@@ -70,6 +70,13 @@ module Spree
70
70
  updated_at: Time.current
71
71
  ) if @item.changed?
72
72
 
73
+ # In rails 4.2 update_columns isn't reflected in the changed_attributes hash,
74
+ # which means that multiple updates on the same in-memory model will
75
+ # behave incorrectly.
76
+ # In rails 5.0 changed_attributes works with update_columns and this is
77
+ # unnecessary.
78
+ item.attributes_changed_by_setter.except!(:promo_total, :included_tax_total, :additional_tax_total, :adjustment_total)
79
+
73
80
  @item
74
81
  end
75
82
 
@@ -26,7 +26,6 @@ module Spree
26
26
  after_create :update_tax_charge
27
27
 
28
28
  after_save :update_inventory
29
- after_save :update_adjustments
30
29
 
31
30
  before_destroy :update_inventory
32
31
  before_destroy :destroy_inventory_units
@@ -151,7 +150,7 @@ module Spree
151
150
 
152
151
  def handle_copy_price_override
153
152
  copy_price
154
- ActiveSupport::Deprecation.warn 'You have overridden Spree::LineItem#copy_price. ' \
153
+ Spree::Deprecation.warn 'You have overridden Spree::LineItem#copy_price. ' \
155
154
  'This method is now called Spree::LineItem#set_pricing_attributes. ' \
156
155
  'Please adjust your override.',
157
156
  caller
@@ -167,17 +166,6 @@ module Spree
167
166
  inventory_units.destroy_all
168
167
  end
169
168
 
170
- def update_adjustments
171
- if quantity_changed?
172
- update_tax_charge # Called to ensure pre_tax_amount is updated.
173
- recalculate_adjustments
174
- end
175
- end
176
-
177
- def recalculate_adjustments
178
- Spree::ItemAdjustments.new(self).update
179
- end
180
-
181
169
  def update_tax_charge
182
170
  Spree::Tax::ItemAdjuster.new(self).adjust!
183
171
  end
@@ -36,7 +36,7 @@ module Spree
36
36
  # To avoid multiple occurrences of the same transition being defined
37
37
  # On first definition, state_machines will not be defined
38
38
  state_machines.clear if respond_to?(:state_machines)
39
- state_machine :state, initial: :cart, use_transactions: false, action: :save_state do
39
+ state_machine :state, initial: :cart, use_transactions: false do
40
40
  klass.next_event_transitions.each { |t| transition(t.merge(on: :next)) }
41
41
 
42
42
  # Persist the state on the order
@@ -76,7 +76,7 @@ module Spree
76
76
  transition to: :payment, from: :confirm
77
77
  end
78
78
 
79
- after_transition to: :complete, do: :persist_user_credit_card
79
+ after_transition to: :complete, do: :add_payment_sources_to_wallet
80
80
  before_transition to: :payment, do: :set_shipments_cost
81
81
  before_transition to: :payment, do: :create_tax_charge!
82
82
  before_transition to: :payment, do: :assign_default_credit_card
@@ -250,7 +250,7 @@ module Spree
250
250
 
251
251
  # @deprecated Use {OrderUpdateAttributes} instead
252
252
  def update_from_params(params, permitted_params, request_env = {})
253
- ActiveSupport::Deprecation.warn "update_from_params is deprecated. Use the OrderUpdateAttributes class instead", caller
253
+ Spree::Deprecation.warn "update_from_params is deprecated. Use the OrderUpdateAttributes class instead", caller
254
254
  success = false
255
255
  @updating_params = params
256
256
  run_callbacks :updating_from_params do
@@ -309,22 +309,25 @@ module Spree
309
309
  end
310
310
  end
311
311
 
312
- def persist_user_credit_card
313
- if !temporary_credit_card && user_id && valid_credit_cards.present?
314
- default_cc = valid_credit_cards.first
315
- # TODO: target for refactoring -- why is order checkout responsible for the user -> credit_card relationship?
316
- default_cc.user_id = user_id
317
- default_cc.default = true
318
- default_cc.save
319
- end
312
+ def add_payment_sources_to_wallet
313
+ Spree::Config.
314
+ add_payment_sources_to_wallet_class.new(self).
315
+ add_to_wallet
320
316
  end
317
+ alias_method :persist_user_credit_card, :add_payment_sources_to_wallet
318
+ deprecate :persist_user_credit_card
321
319
 
322
320
  def assign_default_credit_card
323
- if payments.from_credit_card.count == 0 && user && user.default_credit_card.try(:valid?)
324
- cc = user.default_credit_card
325
- payments.create!(payment_method_id: cc.payment_method_id, source: cc)
326
- # this is one of 2 places still using User#bill_address
327
- self.bill_address ||= user.default_credit_card.address || user.bill_address
321
+ builder = Spree::Config.default_payment_builder_class.new(self)
322
+
323
+ if payment = builder.build
324
+ payments << payment
325
+
326
+ if bill_address.nil?
327
+ # this is one of 2 places still using User#bill_address
328
+ self.bill_address = payment.source.try(:address) ||
329
+ user.bill_address
330
+ end
328
331
  end
329
332
  end
330
333
 
@@ -38,8 +38,6 @@ module Spree
38
38
  def process_payments_with(method)
39
39
  # Don't run if there is nothing to pay.
40
40
  return true if payment_total >= total
41
- # Prevent orders from transitioning to complete without a successfully processed payment.
42
- raise Core::GatewayError.new(Spree.t(:no_payment_found)) if unprocessed_payments.empty?
43
41
 
44
42
  unprocessed_payments.each do |payment|
45
43
  break if payment_total >= total
@@ -27,7 +27,7 @@ module Spree
27
27
  end
28
28
 
29
29
  self.whitelisted_ransackable_associations = %w[shipments user promotions bill_address ship_address line_items]
30
- self.whitelisted_ransackable_attributes = %w[completed_at created_at email number state payment_state shipment_state total]
30
+ self.whitelisted_ransackable_attributes = %w[completed_at created_at email number state payment_state shipment_state total store_id]
31
31
 
32
32
  attr_reader :coupon_code
33
33
  attr_accessor :temporary_address, :temporary_credit_card
@@ -505,7 +505,7 @@ module Spree
505
505
  else
506
506
  adjustments.shipping.destroy_all
507
507
  shipments.destroy_all
508
- self.shipments = Spree::Stock::Coordinator.new(self).shipments
508
+ self.shipments = Spree::Config.stock.coordinator_class.new(self).shipments
509
509
  end
510
510
  end
511
511
 
@@ -590,7 +590,7 @@ module Spree
590
590
  end
591
591
 
592
592
  def token
593
- ActiveSupport::Deprecation.warn("Spree::Order#token is DEPRECATED, please use #guest_token instead.", caller)
593
+ Spree::Deprecation.warn("Spree::Order#token is DEPRECATED, please use #guest_token instead.", caller)
594
594
  guest_token
595
595
  end
596
596
 
@@ -618,6 +618,9 @@ module Spree
618
618
  end
619
619
 
620
620
  def add_store_credit_payments
621
+ return if user.nil?
622
+ return if payments.store_credits.checkout.empty? && user.total_available_store_credit.zero?
623
+
621
624
  payments.store_credits.checkout.each(&:invalidate!)
622
625
 
623
626
  # this can happen when multiple payments are present, auto_capture is
@@ -627,7 +630,7 @@ module Spree
627
630
 
628
631
  remaining_total = outstanding_balance - authorized_total
629
632
 
630
- if user && user.store_credits.any?
633
+ if user.store_credits.any?
631
634
  payment_method = Spree::PaymentMethod::StoreCredit.first
632
635
 
633
636
  user.store_credits.order_by_priority.each do |credit|
@@ -689,23 +692,6 @@ module Spree
689
692
  Spree::Money.new(total_available_store_credit - total_applicable_store_credit, { currency: currency })
690
693
  end
691
694
 
692
- def payments_attributes=(attributes)
693
- validate_payments_attributes(attributes)
694
- super(attributes)
695
- end
696
-
697
- def validate_payments_attributes(attributes)
698
- attributes = Array.wrap(attributes)
699
- # Ensure the payment methods specified are allowed for this user
700
- payment_methods = Spree::PaymentMethod.where(id: available_payment_methods)
701
- attributes.each do |payment_attributes|
702
- payment_method_id = payment_attributes[:payment_method_id]
703
-
704
- # raise RecordNotFound unless it is an allowed payment method
705
- payment_methods.find(payment_method_id) if payment_method_id
706
- end
707
- end
708
-
709
695
  private
710
696
 
711
697
  def associate_store