solidus_core 2.10.0.beta1 → 2.10.0
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.
- checksums.yaml +4 -4
- data/app/helpers/spree/base_helper.rb +4 -4
- data/app/helpers/spree/products_helper.rb +2 -1
- data/app/jobs/spree/promotion_code_batch_job.rb +2 -2
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/spree/address.rb +11 -15
- data/app/models/spree/adjustment.rb +11 -0
- data/app/models/spree/calculator/price_sack.rb +1 -1
- data/app/models/spree/calculator/shipping/flexi_rate.rb +2 -2
- data/app/models/spree/calculator/tiered_flat_rate.rb +5 -5
- data/app/models/spree/calculator/tiered_percent.rb +6 -6
- data/app/models/spree/carton.rb +1 -1
- data/app/models/spree/credit_card.rb +2 -2
- data/app/models/spree/inventory_unit.rb +1 -19
- data/app/models/spree/line_item.rb +1 -1
- data/app/models/spree/order.rb +3 -2
- data/app/models/spree/order/checkout.rb +1 -1
- data/app/models/spree/order/payments.rb +2 -2
- data/app/models/spree/order_capturing.rb +2 -2
- data/app/models/spree/order_taxation.rb +2 -2
- data/app/models/spree/payment.rb +4 -41
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/payment_method.rb +2 -2
- data/app/models/spree/product.rb +3 -3
- data/app/models/spree/product/scopes.rb +8 -7
- data/app/models/spree/promotion.rb +27 -12
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +1 -1
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
- data/app/models/spree/promotion/rules/option_value.rb +2 -2
- data/app/models/spree/promotion/rules/product.rb +3 -3
- data/app/models/spree/promotion_action.rb +1 -1
- data/app/models/spree/promotion_chooser.rb +2 -2
- data/app/models/spree/promotion_code.rb +9 -8
- data/app/models/spree/promotion_code/batch_builder.rb +3 -3
- data/app/models/spree/promotion_rule.rb +1 -1
- data/app/models/spree/refund.rb +2 -2
- data/app/models/spree/reimbursement.rb +3 -11
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
- data/app/models/spree/return_authorization.rb +1 -7
- data/app/models/spree/return_item.rb +3 -42
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/shipment.rb +4 -38
- data/app/models/spree/shipping_calculator.rb +0 -4
- data/app/models/spree/shipping_method.rb +1 -1
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/differentiator.rb +1 -1
- data/app/models/spree/stock/package.rb +1 -1
- data/app/models/spree/stock_item.rb +1 -1
- data/app/models/spree/stock_quantities.rb +13 -12
- data/app/models/spree/tax_calculator/default.rb +0 -4
- data/app/models/spree/tax_calculator/shipping_rate.rb +0 -3
- data/app/models/spree/tax_rate.rb +4 -0
- data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
- data/app/models/spree/user_last_url_storer.rb +46 -0
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
- data/app/models/spree/variant.rb +9 -9
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
- data/app/models/spree/zone.rb +1 -1
- data/config/initializers/money.rb +2 -0
- data/config/locales/en.yml +12 -0
- data/lib/generators/spree/install/install_generator.rb +3 -0
- data/lib/generators/spree/install/templates/config/initializers/spree.rb.tt +8 -0
- data/lib/spree/app_configuration.rb +18 -3
- data/lib/spree/core.rb +12 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -13
- data/lib/spree/core/engine.rb +2 -2
- data/lib/spree/core/environment_extension.rb +9 -0
- data/lib/spree/core/importer/order.rb +26 -26
- data/lib/spree/core/product_filters.rb +15 -15
- data/lib/spree/core/role_configuration.rb +2 -2
- data/lib/spree/core/search/variant.rb +1 -1
- data/lib/spree/core/state_machines.rb +78 -0
- data/lib/spree/core/state_machines/inventory_unit.rb +42 -0
- data/lib/spree/core/state_machines/payment.rb +61 -0
- data/lib/spree/core/state_machines/reimbursement.rb +33 -0
- data/lib/spree/core/state_machines/return_authorization.rb +32 -0
- data/lib/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
- data/lib/spree/core/state_machines/return_item/reception_status.rb +42 -0
- data/lib/spree/core/state_machines/shipment.rb +58 -0
- data/lib/spree/core/stock_configuration.rb +1 -0
- data/lib/spree/core/validators/email.rb +1 -8
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/money.rb +2 -2
- data/lib/spree/permission_sets/user_management.rb +3 -0
- data/lib/spree/permitted_attributes.rb +3 -3
- data/lib/spree/preferences/static_model_preferences.rb +2 -2
- data/lib/spree/testing_support/dummy_app.rb +4 -1
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +8 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +7 -0
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
- data/solidus_core.gemspec +2 -2
- data/spec/lib/spree/core/environment_extension_spec.rb +12 -1
- data/spec/lib/spree/core/stock_configuration_spec.rb +36 -0
- data/spec/lib/spree/core/validators/email_spec.rb +18 -18
- data/spec/models/spree/address_spec.rb +23 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +2 -2
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +1 -1
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +24 -15
- data/spec/models/spree/carton_spec.rb +8 -0
- data/spec/models/spree/classification_spec.rb +21 -9
- data/spec/models/spree/concerns/user_address_book_spec.rb +4 -4
- data/spec/models/spree/concerns/user_methods_spec.rb +2 -1
- data/spec/models/spree/order_merger_spec.rb +3 -3
- data/spec/models/spree/order_spec.rb +8 -15
- data/spec/models/spree/order_updater_spec.rb +4 -3
- data/spec/models/spree/payment_create_spec.rb +4 -14
- data/spec/models/spree/permission_sets/user_management_spec.rb +2 -0
- data/spec/models/spree/preference_spec.rb +4 -4
- data/spec/models/spree/preferences/preferable_spec.rb +3 -3
- data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -2
- data/spec/models/spree/promotion_rule_spec.rb +6 -6
- data/spec/models/spree/promotion_spec.rb +73 -52
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +1 -1
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
- data/spec/models/spree/returns_calculator_spec.rb +2 -2
- data/spec/models/spree/shipping_calculator_spec.rb +1 -13
- data/spec/models/spree/shipping_method_spec.rb +32 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +2 -2
- data/spec/models/spree/stock/differentiator_spec.rb +2 -2
- data/spec/models/spree/stock/estimator_spec.rb +3 -3
- data/spec/models/spree/stock/package_spec.rb +28 -28
- data/spec/models/spree/stock/simple_coordinator_spec.rb +11 -11
- data/spec/models/spree/stock/splitter/base_spec.rb +4 -4
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +7 -7
- data/spec/models/spree/stock_quantities_spec.rb +1 -1
- data/spec/models/spree/store_credit_spec.rb +1 -1
- data/spec/models/spree/tax_rate_spec.rb +1 -0
- data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
- data/spec/models/spree/user_last_url_storer/rules/authentication_rule_spec.rb +31 -0
- data/spec/models/spree/user_last_url_storer_spec.rb +60 -0
- metadata +17 -12
- data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -162
- data/spec/models/spree/order/updating_spec.rb +0 -18
@@ -93,8 +93,8 @@ module Spree
|
|
93
93
|
else
|
94
94
|
active.available_to_users.available_to_admin
|
95
95
|
end
|
96
|
-
available_payment_methods.select do |
|
97
|
-
store.nil? || store.payment_methods.empty? || store.payment_methods.include?(
|
96
|
+
available_payment_methods.select do |payment|
|
97
|
+
store.nil? || store.payment_methods.empty? || store.payment_methods.include?(payment)
|
98
98
|
end
|
99
99
|
end
|
100
100
|
|
data/app/models/spree/product.rb
CHANGED
@@ -25,7 +25,7 @@ module Spree
|
|
25
25
|
variants_including_master.discard_all
|
26
26
|
self.product_option_types = []
|
27
27
|
self.product_properties = []
|
28
|
-
self.classifications
|
28
|
+
self.classifications.destroy_all
|
29
29
|
self.product_promotion_rules = []
|
30
30
|
end
|
31
31
|
|
@@ -190,7 +190,7 @@ module Spree
|
|
190
190
|
# @return [Hash] option_type as keys, array of variants as values.
|
191
191
|
def categorise_variants_from_option(opt_type, pricing_options = Spree::Config.default_pricing_options)
|
192
192
|
return {} unless option_types.include?(opt_type)
|
193
|
-
variants.with_prices(pricing_options).group_by { |
|
193
|
+
variants.with_prices(pricing_options).group_by { |variant| variant.option_values.detect { |option| option.option_type == opt_type } }
|
194
194
|
end
|
195
195
|
deprecate :categorise_variants_from_option, deprecator: Spree::Deprecation
|
196
196
|
|
@@ -323,7 +323,7 @@ module Spree
|
|
323
323
|
|
324
324
|
def any_variants_not_track_inventory?
|
325
325
|
if variants_including_master.loaded?
|
326
|
-
variants_including_master.any? { |
|
326
|
+
variants_including_master.any? { |variant| !variant.should_track_inventory? }
|
327
327
|
else
|
328
328
|
!Spree::Config.track_inventory_levels || variants_including_master.where(track_inventory: false).exists?
|
329
329
|
end
|
@@ -241,19 +241,20 @@ module Spree
|
|
241
241
|
# Always return array with at least an empty string to avoid SQL errors
|
242
242
|
def prepare_words(words)
|
243
243
|
return [''] if words.blank?
|
244
|
-
|
245
|
-
|
244
|
+
|
245
|
+
splitted = words.split(/[,\s]/).map(&:strip)
|
246
|
+
splitted.any? ? splitted : ['']
|
246
247
|
end
|
247
248
|
|
248
249
|
def get_taxons(*ids_or_records_or_names)
|
249
250
|
taxons = Spree::Taxon.table_name
|
250
|
-
ids_or_records_or_names.flatten.map { |
|
251
|
-
case
|
252
|
-
when Integer then Spree::Taxon.find_by(id:
|
251
|
+
ids_or_records_or_names.flatten.map { |taxon|
|
252
|
+
case taxon
|
253
|
+
when Integer then Spree::Taxon.find_by(id: taxon)
|
253
254
|
when ActiveRecord::Base then t
|
254
255
|
when String
|
255
|
-
Spree::Taxon.find_by(name:
|
256
|
-
Spree::Taxon.where("#{taxons}.permalink LIKE ? OR #{taxons}.permalink = ?", "%/#{
|
256
|
+
Spree::Taxon.find_by(name: taxon) ||
|
257
|
+
Spree::Taxon.where("#{taxons}.permalink LIKE ? OR #{taxons}.permalink = ?", "%/#{taxon}/", "#{taxon}/").first
|
257
258
|
end
|
258
259
|
}.compact.flatten.uniq
|
259
260
|
end
|
@@ -126,9 +126,12 @@ module Spree
|
|
126
126
|
# called anytime order.recalculate happens
|
127
127
|
def eligible?(promotable, promotion_code: nil)
|
128
128
|
return false if inactive?
|
129
|
-
return false if usage_limit_exceeded?
|
130
|
-
return false if promotion_code && promotion_code.usage_limit_exceeded?
|
131
129
|
return false if blacklisted?(promotable)
|
130
|
+
|
131
|
+
excluded_orders = eligibility_excluded_orders(promotable)
|
132
|
+
return false if usage_limit_exceeded?(excluded_orders: excluded_orders)
|
133
|
+
return false if promotion_code&.usage_limit_exceeded?(excluded_orders: excluded_orders)
|
134
|
+
|
132
135
|
!!eligible_rules(promotable, {})
|
133
136
|
end
|
134
137
|
|
@@ -138,7 +141,8 @@ module Spree
|
|
138
141
|
def eligible_rules(promotable, options = {})
|
139
142
|
# Promotions without rules are eligible by default.
|
140
143
|
return [] if rules.none?
|
141
|
-
|
144
|
+
|
145
|
+
eligible = lambda { |rule| rule.eligible?(promotable, options) }
|
142
146
|
specific_rules = rules.for(promotable)
|
143
147
|
return [] if specific_rules.none?
|
144
148
|
|
@@ -165,23 +169,23 @@ module Spree
|
|
165
169
|
|
166
170
|
# Whether the promotion has exceeded it's usage restrictions.
|
167
171
|
#
|
172
|
+
# @param excluded_orders [Array<Spree::Order>] Orders to exclude from usage limit
|
168
173
|
# @return true or false
|
169
|
-
def usage_limit_exceeded?
|
174
|
+
def usage_limit_exceeded?(excluded_orders: [])
|
170
175
|
if usage_limit
|
171
|
-
usage_count >= usage_limit
|
176
|
+
usage_count(excluded_orders: excluded_orders) >= usage_limit
|
172
177
|
end
|
173
178
|
end
|
174
179
|
|
175
180
|
# Number of times the code has been used overall
|
176
181
|
#
|
182
|
+
# @param excluded_orders [Array<Spree::Order>] Orders to exclude from usage count
|
177
183
|
# @return [Integer] usage count
|
178
|
-
def usage_count
|
179
|
-
Spree::Adjustment.
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
merge(Spree::Order.complete).
|
184
|
-
distinct.
|
184
|
+
def usage_count(excluded_orders: [])
|
185
|
+
Spree::Adjustment.promotion.
|
186
|
+
eligible.
|
187
|
+
in_completed_orders(excluded_orders: excluded_orders).
|
188
|
+
where(source_id: actions).
|
185
189
|
count(:order_id)
|
186
190
|
end
|
187
191
|
|
@@ -255,8 +259,19 @@ module Spree
|
|
255
259
|
|
256
260
|
def apply_automatically_disallowed_with_codes_or_paths
|
257
261
|
return unless apply_automatically
|
262
|
+
|
258
263
|
errors.add(:apply_automatically, :disallowed_with_code) if codes.any?
|
259
264
|
errors.add(:apply_automatically, :disallowed_with_path) if path.present?
|
260
265
|
end
|
266
|
+
|
267
|
+
def eligibility_excluded_orders(promotable)
|
268
|
+
if promotable.is_a?(Spree::Order)
|
269
|
+
[promotable]
|
270
|
+
elsif promotable.respond_to?(:order)
|
271
|
+
[promotable.order]
|
272
|
+
else
|
273
|
+
[]
|
274
|
+
end
|
275
|
+
end
|
261
276
|
end
|
262
277
|
end
|
@@ -67,7 +67,7 @@ module Spree
|
|
67
67
|
line_items = actionable_line_items(order)
|
68
68
|
|
69
69
|
actioned_line_items = order.line_item_adjustments.reload.
|
70
|
-
select { |
|
70
|
+
select { |adjustment| adjustment.source == self && adjustment.amount < 0 }.
|
71
71
|
map(&:adjustable)
|
72
72
|
other_line_items = actioned_line_items - [line_item]
|
73
73
|
|
@@ -29,8 +29,8 @@ module Spree
|
|
29
29
|
def preferred_eligible_values
|
30
30
|
values = preferences[:eligible_values] || {}
|
31
31
|
Hash[values.keys.map(&:to_i).zip(
|
32
|
-
values.values.map do |
|
33
|
-
(
|
32
|
+
values.values.map do |value|
|
33
|
+
(value.is_a?(Array) ? value : value.split(",")).map(&:to_i)
|
34
34
|
end
|
35
35
|
)]
|
36
36
|
end
|
@@ -32,15 +32,15 @@ module Spree
|
|
32
32
|
|
33
33
|
case preferred_match_policy
|
34
34
|
when 'all'
|
35
|
-
unless eligible_products.all? { |
|
35
|
+
unless eligible_products.all? { |product| order.products.include?(product) }
|
36
36
|
eligibility_errors.add(:base, eligibility_error_message(:missing_product), error_code: :missing_product)
|
37
37
|
end
|
38
38
|
when 'any'
|
39
|
-
unless order.products.any? { |
|
39
|
+
unless order.products.any? { |product| eligible_products.include?(product) }
|
40
40
|
eligibility_errors.add(:base, eligibility_error_message(:no_applicable_products), error_code: :no_applicable_products)
|
41
41
|
end
|
42
42
|
when 'none'
|
43
|
-
unless order.products.none? { |
|
43
|
+
unless order.products.none? { |product| eligible_products.include?(product) }
|
44
44
|
eligibility_errors.add(:base, eligibility_error_message(:has_excluded_product), error_code: :has_excluded_product)
|
45
45
|
end
|
46
46
|
else
|
@@ -16,7 +16,7 @@ module Spree
|
|
16
16
|
|
17
17
|
belongs_to :promotion, class_name: 'Spree::Promotion', inverse_of: :promotion_actions, optional: true
|
18
18
|
|
19
|
-
scope :of_type, ->(
|
19
|
+
scope :of_type, ->(type) { where(type: Array.wrap(type).map(&:to_s)) }
|
20
20
|
scope :shipping, -> { of_type(Spree::Config.environment.promotions.shipping_actions.to_a) }
|
21
21
|
|
22
22
|
# Updates the state of the order or performs some other action depending on
|
@@ -26,8 +26,8 @@ module Spree
|
|
26
26
|
|
27
27
|
# @return The best promotion from this set of adjustments.
|
28
28
|
def best_promotion_adjustment
|
29
|
-
@best_promotion_adjustment ||= @adjustments.select(&:eligible?).min_by do |
|
30
|
-
[
|
29
|
+
@best_promotion_adjustment ||= @adjustments.select(&:eligible?).min_by do |adjustment|
|
30
|
+
[adjustment.amount, -adjustment.id]
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
@@ -14,22 +14,23 @@ class Spree::PromotionCode < Spree::Base
|
|
14
14
|
|
15
15
|
# Whether the promotion code has exceeded its usage restrictions
|
16
16
|
#
|
17
|
+
# @param excluded_orders [Array<Spree::Order>] Orders to exclude from usage limit
|
17
18
|
# @return true or false
|
18
|
-
def usage_limit_exceeded?
|
19
|
+
def usage_limit_exceeded?(excluded_orders: [])
|
19
20
|
if usage_limit
|
20
|
-
usage_count >= usage_limit
|
21
|
+
usage_count(excluded_orders: excluded_orders) >= usage_limit
|
21
22
|
end
|
22
23
|
end
|
23
24
|
|
24
25
|
# Number of times the code has been used overall
|
25
26
|
#
|
27
|
+
# @param excluded_orders [Array<Spree::Order>] Orders to exclude from usage count
|
26
28
|
# @return [Integer] usage count
|
27
|
-
def usage_count
|
28
|
-
adjustments.
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
count(:order_id)
|
29
|
+
def usage_count(excluded_orders: [])
|
30
|
+
adjustments.
|
31
|
+
eligible.
|
32
|
+
in_completed_orders(excluded_orders: excluded_orders).
|
33
|
+
count(:order_id)
|
33
34
|
end
|
34
35
|
|
35
36
|
def usage_limit
|
@@ -33,12 +33,12 @@ class ::Spree::PromotionCode::BatchBuilder
|
|
33
33
|
def build_promotion_codes
|
34
34
|
generate_random_codes
|
35
35
|
promotion_code_batch.update!(state: "completed")
|
36
|
-
rescue StandardError =>
|
36
|
+
rescue StandardError => error
|
37
37
|
promotion_code_batch.update!(
|
38
|
-
error:
|
38
|
+
error: error.inspect,
|
39
39
|
state: "failed"
|
40
40
|
)
|
41
|
-
raise
|
41
|
+
raise error
|
42
42
|
end
|
43
43
|
|
44
44
|
private
|
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
class PromotionRule < Spree::Base
|
6
6
|
belongs_to :promotion, class_name: 'Spree::Promotion', inverse_of: :promotion_rules, optional: true
|
7
7
|
|
8
|
-
scope :of_type, ->(
|
8
|
+
scope :of_type, ->(type) { where(type: type) }
|
9
9
|
|
10
10
|
validates :promotion, presence: true
|
11
11
|
validate :unique_per_promotion, on: :create
|
data/app/models/spree/refund.rb
CHANGED
@@ -68,8 +68,8 @@ module Spree
|
|
68
68
|
end
|
69
69
|
|
70
70
|
response
|
71
|
-
rescue ActiveMerchant::ConnectionError =>
|
72
|
-
logger.error(I18n.t('spree.gateway_error') + " #{
|
71
|
+
rescue ActiveMerchant::ConnectionError => error
|
72
|
+
logger.error(I18n.t('spree.gateway_error') + " #{error.inspect}")
|
73
73
|
raise Core::GatewayError.new(I18n.t('spree.unable_to_connect_to_gateway'))
|
74
74
|
end
|
75
75
|
|
@@ -59,15 +59,7 @@ module Spree
|
|
59
59
|
class_attribute :reimbursement_failure_hooks
|
60
60
|
self.reimbursement_failure_hooks = []
|
61
61
|
|
62
|
-
|
63
|
-
event :errored do
|
64
|
-
transition to: :errored, from: [:pending, :errored]
|
65
|
-
end
|
66
|
-
|
67
|
-
event :reimbursed do
|
68
|
-
transition to: :reimbursed, from: [:pending, :errored]
|
69
|
-
end
|
70
|
-
end
|
62
|
+
include ::Spree::Config.state_machines.reimbursement
|
71
63
|
|
72
64
|
class << self
|
73
65
|
def build_from_customer_return(customer_return)
|
@@ -112,11 +104,11 @@ module Spree
|
|
112
104
|
if unpaid_amount_within_tolerance?
|
113
105
|
reimbursed!
|
114
106
|
Spree::Event.fire 'reimbursement_reimbursed', reimbursement: self
|
115
|
-
reimbursement_success_hooks.each { |
|
107
|
+
reimbursement_success_hooks.each { |hook| hook.call self }
|
116
108
|
else
|
117
109
|
errored!
|
118
110
|
Spree::Event.fire 'reimbursement_errored', reimbursement: self
|
119
|
-
reimbursement_failure_hooks.each { |
|
111
|
+
reimbursement_failure_hooks.each { |hook| hook.call self }
|
120
112
|
end
|
121
113
|
|
122
114
|
if errored?
|
@@ -63,8 +63,8 @@ module Spree
|
|
63
63
|
|
64
64
|
def sorted_eligible_refund_payments(payments)
|
65
65
|
if eligible_refund_methods = self.eligible_refund_methods
|
66
|
-
payments = payments.select { |
|
67
|
-
payments = payments.sort_by { |
|
66
|
+
payments = payments.select { |payment| eligible_refund_methods.include? payment.payment_method.class }
|
67
|
+
payments = payments.sort_by { |payment| eligible_refund_methods.index(payment.payment_method.class) }
|
68
68
|
end
|
69
69
|
payments
|
70
70
|
end
|
@@ -22,13 +22,7 @@ module Spree
|
|
22
22
|
validate :must_have_shipped_units, on: :create
|
23
23
|
validate :no_previously_exchanged_inventory_units, on: :create
|
24
24
|
|
25
|
-
|
26
|
-
before_transition to: :canceled, do: :cancel_return_items
|
27
|
-
|
28
|
-
event :cancel do
|
29
|
-
transition to: :canceled, from: :authorized, if: lambda { |return_authorization| return_authorization.can_cancel_return_items? }
|
30
|
-
end
|
31
|
-
end
|
25
|
+
include ::Spree::Config.state_machines.return_authorization
|
32
26
|
|
33
27
|
extend DisplayMoney
|
34
28
|
money_methods :pre_tax_total, :amount, :total_excluding_vat
|
@@ -77,22 +77,8 @@ module Spree
|
|
77
77
|
before_create :set_default_amount, unless: :amount_changed?
|
78
78
|
before_save :set_exchange_amount
|
79
79
|
|
80
|
-
|
81
|
-
|
82
|
-
after_transition to: COMPLETED_RECEPTION_STATUSES, do: :check_unexchange
|
83
|
-
after_transition to: :received, do: :process_inventory_unit!
|
84
|
-
|
85
|
-
event(:cancel) { transition to: :cancelled, from: :awaiting }
|
86
|
-
|
87
|
-
event(:receive) { transition to: :received, from: INTERMEDIATE_RECEPTION_STATUSES + [:awaiting] }
|
88
|
-
event(:unexchange) { transition to: :unexchanged, from: [:awaiting] }
|
89
|
-
event(:give) { transition to: :given_to_customer, from: :awaiting }
|
90
|
-
event(:lost) { transition to: :lost_in_transit, from: :awaiting }
|
91
|
-
event(:wrong_item_shipped) { transition to: :shipped_wrong_item, from: :awaiting }
|
92
|
-
event(:short_shipped) { transition to: :short_shipped, from: :awaiting }
|
93
|
-
event(:in_transit) { transition to: :in_transit, from: :awaiting }
|
94
|
-
event(:expired) { transition to: :expired, from: :awaiting }
|
95
|
-
end
|
80
|
+
include ::Spree::Config.state_machines.return_item_reception
|
81
|
+
include ::Spree::Config.state_machines.return_item_acceptance
|
96
82
|
|
97
83
|
extend DisplayMoney
|
98
84
|
money_methods :pre_tax_amount, :amount, :total, :total_excluding_vat
|
@@ -104,31 +90,6 @@ module Spree
|
|
104
90
|
COMPLETED_RECEPTION_STATUSES.map(&:to_s).include?(reception_status.to_s)
|
105
91
|
end
|
106
92
|
|
107
|
-
state_machine :acceptance_status, initial: :pending do
|
108
|
-
event :attempt_accept do
|
109
|
-
transition to: :accepted, from: :accepted
|
110
|
-
transition to: :accepted, from: :pending, if: ->(return_item) { return_item.eligible_for_return? }
|
111
|
-
transition to: :manual_intervention_required, from: :pending, if: ->(return_item) { return_item.requires_manual_intervention? }
|
112
|
-
transition to: :rejected, from: :pending
|
113
|
-
end
|
114
|
-
|
115
|
-
# bypasses eligibility checks
|
116
|
-
event :accept do
|
117
|
-
transition to: :accepted, from: [:accepted, :pending, :manual_intervention_required]
|
118
|
-
end
|
119
|
-
|
120
|
-
# bypasses eligibility checks
|
121
|
-
event :reject do
|
122
|
-
transition to: :rejected, from: [:accepted, :pending, :manual_intervention_required]
|
123
|
-
end
|
124
|
-
|
125
|
-
# bypasses eligibility checks
|
126
|
-
event :require_manual_intervention do
|
127
|
-
transition to: :manual_intervention_required, from: [:accepted, :pending, :manual_intervention_required]
|
128
|
-
end
|
129
|
-
|
130
|
-
after_transition any => any, do: :persist_acceptance_status_errors
|
131
|
-
end
|
132
93
|
|
133
94
|
attr_accessor :skip_customer_return_processing
|
134
95
|
|
@@ -214,7 +175,7 @@ module Spree
|
|
214
175
|
event_paths.delete(:expired)
|
215
176
|
event_paths.delete(:unexchange)
|
216
177
|
|
217
|
-
status_paths.map{ |
|
178
|
+
status_paths.map{ |status| I18n.t("spree.reception_states.#{status}", default: status.to_s.humanize) }.zip(event_paths)
|
218
179
|
end
|
219
180
|
|
220
181
|
def part_of_exchange?
|
@@ -31,7 +31,7 @@ module Spree
|
|
31
31
|
scope :ready, -> { with_state('ready') }
|
32
32
|
scope :shipped, -> { with_state('shipped') }
|
33
33
|
scope :trackable, -> { where("tracking IS NOT NULL AND tracking != ''") }
|
34
|
-
scope :with_state, ->(*
|
34
|
+
scope :with_state, ->(*state) { where(state: state) }
|
35
35
|
# sort by most recent shipped_at, falling back to created_at. add "id desc" to make specs that involve this scope more deterministic.
|
36
36
|
scope :reverse_chronological, -> {
|
37
37
|
order(Arel.sql("coalesce(#{Spree::Shipment.table_name}.shipped_at, #{Spree::Shipment.table_name}.created_at) desc"), id: :desc)
|
@@ -39,41 +39,7 @@ module Spree
|
|
39
39
|
|
40
40
|
scope :by_store, ->(store) { joins(:order).merge(Spree::Order.by_store(store)) }
|
41
41
|
|
42
|
-
|
43
|
-
state_machine initial: :pending, use_transactions: false do
|
44
|
-
event :ready do
|
45
|
-
transition from: :pending, to: :shipped, if: :can_transition_from_pending_to_shipped?
|
46
|
-
transition from: :pending, to: :ready, if: :can_transition_from_pending_to_ready?
|
47
|
-
end
|
48
|
-
|
49
|
-
event :pend do
|
50
|
-
transition from: :ready, to: :pending
|
51
|
-
end
|
52
|
-
|
53
|
-
event :ship do
|
54
|
-
transition from: [:ready, :canceled], to: :shipped
|
55
|
-
end
|
56
|
-
after_transition to: :shipped, do: :after_ship
|
57
|
-
|
58
|
-
event :cancel do
|
59
|
-
transition to: :canceled, from: [:pending, :ready]
|
60
|
-
end
|
61
|
-
after_transition to: :canceled, do: :after_cancel
|
62
|
-
|
63
|
-
event :resume do
|
64
|
-
transition from: :canceled, to: :ready, if: :can_transition_from_canceled_to_ready?
|
65
|
-
transition from: :canceled, to: :pending
|
66
|
-
end
|
67
|
-
after_transition from: :canceled, to: [:pending, :ready, :shipped], do: :after_resume
|
68
|
-
|
69
|
-
after_transition do |shipment, transition|
|
70
|
-
shipment.state_changes.create!(
|
71
|
-
previous_state: transition.from,
|
72
|
-
next_state: transition.to,
|
73
|
-
name: 'shipment'
|
74
|
-
)
|
75
|
-
end
|
76
|
-
end
|
42
|
+
include ::Spree::Config.state_machines.shipment
|
77
43
|
|
78
44
|
self.whitelisted_ransackable_associations = ['order']
|
79
45
|
self.whitelisted_ransackable_attributes = ['number']
|
@@ -142,7 +108,7 @@ module Spree
|
|
142
108
|
# @return [BigDecimal] the amount of this item, taking into consideration
|
143
109
|
# all non-tax adjustments.
|
144
110
|
def total_before_tax
|
145
|
-
amount + adjustments.select { |
|
111
|
+
amount + adjustments.select { |adjustment| !adjustment.tax? && adjustment.eligible? }.sum(&:amount)
|
146
112
|
end
|
147
113
|
|
148
114
|
# @return [BigDecimal] the amount of this shipment before VAT tax
|
@@ -219,7 +185,7 @@ module Spree
|
|
219
185
|
def select_shipping_method(shipping_method)
|
220
186
|
estimator = Spree::Config.stock.estimator_class.new
|
221
187
|
rates = estimator.shipping_rates(to_package, false)
|
222
|
-
rate = rates.detect { |
|
188
|
+
rate = rates.detect { |detected| detected.shipping_method_id == shipping_method.id }
|
223
189
|
rate.selected = true
|
224
190
|
self.shipping_rates = [rate]
|
225
191
|
end
|