solidus_core 2.10.0.beta1 → 2.10.0
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.
- 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
|