solidus_core 2.9.0 → 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_address_book.rb +2 -2
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/spree/address.rb +13 -17
- data/app/models/spree/adjustment.rb +20 -9
- data/app/models/spree/asset.rb +1 -1
- data/app/models/spree/base.rb +0 -2
- 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/calculator.rb +1 -1
- data/app/models/spree/carton.rb +3 -3
- data/app/models/spree/classification.rb +2 -2
- data/app/models/spree/credit_card.rb +4 -4
- data/app/models/spree/customer_return.rb +1 -1
- data/app/models/spree/image/paperclip_attachment.rb +1 -1
- data/app/models/spree/inventory_unit.rb +5 -23
- data/app/models/spree/line_item.rb +4 -4
- data/app/models/spree/line_item_action.rb +2 -2
- data/app/models/spree/log_entry.rb +1 -1
- data/app/models/spree/option_value.rb +1 -1
- data/app/models/spree/option_values_variant.rb +2 -2
- data/app/models/spree/order/checkout.rb +1 -1
- data/app/models/spree/order/payments.rb +2 -2
- data/app/models/spree/order.rb +11 -10
- data/app/models/spree/order_cancellations.rb +1 -1
- data/app/models/spree/order_capturing.rb +2 -2
- data/app/models/spree/order_contents.rb +2 -2
- data/app/models/spree/order_mutex.rb +1 -1
- data/app/models/spree/order_promotion.rb +3 -3
- data/app/models/spree/order_shipping.rb +1 -1
- data/app/models/spree/order_taxation.rb +3 -3
- data/app/models/spree/payment/processing.rb +3 -3
- data/app/models/spree/payment.rb +8 -45
- data/app/models/spree/payment_capture_event.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +1 -1
- data/app/models/spree/payment_method.rb +5 -2
- data/app/models/spree/payment_source.rb +1 -1
- data/app/models/spree/price.rb +2 -2
- data/app/models/spree/product/scopes.rb +218 -210
- data/app/models/spree/product.rb +5 -5
- data/app/models/spree/product_option_type.rb +2 -2
- data/app/models/spree/product_promotion_rule.rb +2 -2
- data/app/models/spree/product_property.rb +2 -2
- 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.rb +28 -13
- data/app/models/spree/promotion_action.rb +2 -2
- data/app/models/spree/promotion_chooser.rb +2 -2
- data/app/models/spree/promotion_code/batch_builder.rb +3 -3
- data/app/models/spree/promotion_code.rb +11 -10
- data/app/models/spree/promotion_code_batch.rb +1 -1
- data/app/models/spree/promotion_rule.rb +2 -2
- data/app/models/spree/promotion_rule_role.rb +2 -2
- data/app/models/spree/promotion_rule_store.rb +2 -2
- data/app/models/spree/promotion_rule_taxon.rb +2 -2
- data/app/models/spree/promotion_rule_user.rb +2 -2
- data/app/models/spree/refund.rb +5 -5
- data/app/models/spree/reimbursement/credit.rb +2 -2
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -1
- data/app/models/spree/reimbursement.rb +5 -13
- data/app/models/spree/reimbursement_tax_calculator.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +2 -2
- data/app/models/spree/return_authorization.rb +4 -10
- data/app/models/spree/return_item/eligibility_validator/default.rb +1 -1
- data/app/models/spree/return_item.rb +13 -52
- data/app/models/spree/role_user.rb +2 -2
- data/app/models/spree/shipment.rb +7 -41
- data/app/models/spree/shipping_calculator.rb +0 -4
- data/app/models/spree/shipping_manifest.rb +3 -3
- data/app/models/spree/shipping_method.rb +2 -2
- data/app/models/spree/shipping_method_category.rb +2 -2
- data/app/models/spree/shipping_method_stock_location.rb +2 -2
- data/app/models/spree/shipping_method_zone.rb +2 -2
- data/app/models/spree/shipping_rate.rb +2 -2
- data/app/models/spree/shipping_rate_tax.rb +2 -2
- data/app/models/spree/state.rb +2 -2
- data/app/models/spree/state_change.rb +2 -2
- 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 +3 -3
- data/app/models/spree/stock_location.rb +2 -2
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/stock_quantities.rb +13 -12
- data/app/models/spree/store_credit.rb +8 -8
- data/app/models/spree/store_credit_event.rb +3 -3
- data/app/models/spree/store_payment_method.rb +2 -2
- data/app/models/spree/store_shipping_method.rb +2 -2
- 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 +5 -1
- data/app/models/spree/tax_rate_tax_category.rb +2 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +13 -0
- data/app/models/spree/unit_cancel.rb +5 -2
- data/app/models/spree/user_address.rb +2 -2
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +36 -0
- data/app/models/spree/user_last_url_storer.rb +46 -0
- data/app/models/spree/user_stock_location.rb +2 -2
- data/app/models/spree/variant/scopes.rb +37 -29
- data/app/models/spree/variant.rb +10 -10
- data/app/models/spree/variant_property_rule.rb +1 -1
- data/app/models/spree/variant_property_rule_condition.rb +2 -2
- data/app/models/spree/variant_property_rule_value.rb +2 -2
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
- data/app/models/spree/wallet_payment_source.rb +2 -2
- data/app/models/spree/zone.rb +1 -1
- data/app/models/spree/zone_member.rb +2 -2
- data/config/initializers/inflections.rb +5 -0
- data/config/initializers/money.rb +2 -0
- data/config/locales/en.yml +34 -3
- data/lib/generators/spree/dummy/dummy_generator.rb +2 -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/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 +28 -28
- data/lib/spree/core/importer/product.rb +2 -2
- 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/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/state_machines.rb +78 -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/core.rb +12 -0
- data/lib/spree/money.rb +2 -2
- data/lib/spree/permission_sets/default_customer.rb +1 -1
- 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/rake_tasks.rb +6 -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/lib/spree/testing_support/preferences.rb +54 -15
- data/solidus_core.gemspec +6 -6
- data/spec/lib/search/base_spec.rb +5 -1
- data/spec/lib/search/variant_spec.rb +1 -1
- 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/lib/spree/event_spec.rb +15 -3
- data/spec/models/spree/address_spec.rb +23 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +1 -1
- 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 +10 -2
- 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 +5 -4
- data/spec/models/spree/credit_card_spec.rb +2 -2
- data/spec/models/spree/customer_return_spec.rb +1 -1
- data/spec/models/spree/order/checkout_spec.rb +1 -1
- data/spec/models/spree/order/outstanding_balance_integration_spec.rb +5 -5
- data/spec/models/spree/order/payment_spec.rb +1 -1
- data/spec/models/spree/order_contents_spec.rb +1 -1
- data/spec/models/spree/order_inventory_spec.rb +3 -3
- data/spec/models/spree/order_merger_spec.rb +3 -3
- data/spec/models/spree/order_shipping_spec.rb +1 -1
- data/spec/models/spree/order_spec.rb +14 -21
- data/spec/models/spree/order_updater_spec.rb +4 -3
- data/spec/models/spree/payment_create_spec.rb +6 -16
- data/spec/models/spree/payment_spec.rb +12 -12
- 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/rules/first_repeat_purchase_since_spec.rb +2 -2
- data/spec/models/spree/promotion/rules/nth_order_spec.rb +2 -2
- data/spec/models/spree/promotion_rule_spec.rb +6 -6
- data/spec/models/spree/promotion_spec.rb +71 -54
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +3 -3
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +1 -1
- data/spec/models/spree/return_item_spec.rb +11 -11
- data/spec/models/spree/returns_calculator_spec.rb +2 -2
- data/spec/models/spree/shipment_spec.rb +6 -6
- 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/inventory_units_finalizer_spec.rb +4 -4
- data/spec/models/spree/stock/package_spec.rb +28 -28
- data/spec/models/spree/stock/quantifier_spec.rb +3 -3
- 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 +8 -8
- data/spec/models/spree/tax_category_spec.rb +1 -1
- data/spec/models/spree/tax_rate_spec.rb +1 -0
- data/spec/models/spree/taxon_spec.rb +2 -2
- data/spec/models/spree/taxons/paperclip_attachment_spec.rb +29 -0
- data/spec/models/spree/unit_cancel_spec.rb +5 -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
- data/spec/models/spree/user_spec.rb +3 -3
- metadata +46 -41
- data/spec/migrate/20190106184413_remove_code_from_spree_promotions_spec.rb +0 -148
- data/spec/models/spree/order/updating_spec.rb +0 -18
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
# Payments' state machine
|
|
7
|
+
#
|
|
8
|
+
# for each event the following instance methods are dynamically implemented:
|
|
9
|
+
# #<event_name>
|
|
10
|
+
# #<event_name>!
|
|
11
|
+
# #can_<event_name>?
|
|
12
|
+
#
|
|
13
|
+
# for each state the following instance methods are implemented:
|
|
14
|
+
# #<state_name>?
|
|
15
|
+
#
|
|
16
|
+
module Payment
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
state_machine initial: :checkout do
|
|
21
|
+
# With card payments, happens before purchase or authorization happens
|
|
22
|
+
#
|
|
23
|
+
# Setting it after creating a profile and authorizing a full amount will
|
|
24
|
+
# prevent the payment from being authorized again once Order transitions
|
|
25
|
+
# to complete
|
|
26
|
+
event :started_processing do
|
|
27
|
+
transition from: [:checkout, :pending, :completed, :processing], to: :processing
|
|
28
|
+
end
|
|
29
|
+
# When processing during checkout fails
|
|
30
|
+
event :failure do
|
|
31
|
+
transition from: [:pending, :processing], to: :failed
|
|
32
|
+
end
|
|
33
|
+
# With card payments this represents authorizing the payment
|
|
34
|
+
event :pend do
|
|
35
|
+
transition from: [:checkout, :processing], to: :pending
|
|
36
|
+
end
|
|
37
|
+
# With card payments this represents completing a purchase or capture transaction
|
|
38
|
+
event :complete do
|
|
39
|
+
transition from: [:processing, :pending, :checkout], to: :completed
|
|
40
|
+
end
|
|
41
|
+
event :void do
|
|
42
|
+
transition from: [:pending, :processing, :completed, :checkout], to: :void
|
|
43
|
+
end
|
|
44
|
+
# when the card brand isnt supported
|
|
45
|
+
event :invalidate do
|
|
46
|
+
transition from: [:checkout], to: :invalid
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
after_transition do |payment, transition|
|
|
50
|
+
payment.state_changes.create!(
|
|
51
|
+
previous_state: transition.from,
|
|
52
|
+
next_state: transition.to,
|
|
53
|
+
name: 'payment'
|
|
54
|
+
)
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
# Reimbursement' state machine
|
|
7
|
+
#
|
|
8
|
+
# for each event the following instance methods are dynamically implemented:
|
|
9
|
+
# #<event_name>
|
|
10
|
+
# #<event_name>!
|
|
11
|
+
# #can_<event_name>?
|
|
12
|
+
#
|
|
13
|
+
# for each state the following instance methods are implemented:
|
|
14
|
+
# #<state_name>?
|
|
15
|
+
#
|
|
16
|
+
module Reimbursement
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
state_machine :reimbursement_status, initial: :pending do
|
|
21
|
+
event :errored do
|
|
22
|
+
transition to: :errored, from: [:pending, :errored]
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
event :reimbursed do
|
|
26
|
+
transition to: :reimbursed, from: [:pending, :errored]
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
# Return Authorizations' state machine
|
|
7
|
+
#
|
|
8
|
+
# for each event the following instance methods are dynamically implemented:
|
|
9
|
+
# #<event_name>
|
|
10
|
+
# #<event_name>!
|
|
11
|
+
# #can_<event_name>?
|
|
12
|
+
#
|
|
13
|
+
# for each state the following instance methods are implemented:
|
|
14
|
+
# #<state_name>?
|
|
15
|
+
#
|
|
16
|
+
module ReturnAuthorization
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
state_machine initial: :authorized do
|
|
21
|
+
before_transition to: :canceled, do: :cancel_return_items
|
|
22
|
+
|
|
23
|
+
event :cancel do
|
|
24
|
+
transition to: :canceled, from: :authorized,
|
|
25
|
+
if: lambda { |return_authorization| return_authorization.can_cancel_return_items? }
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
module ReturnItem
|
|
7
|
+
# Return Items' acceptance status state machine
|
|
8
|
+
#
|
|
9
|
+
# for each event the following instance methods are dynamically implemented:
|
|
10
|
+
# #<event_name>
|
|
11
|
+
# #<event_name>!
|
|
12
|
+
# #can_<event_name>?
|
|
13
|
+
#
|
|
14
|
+
# for each state the following instance methods are implemented:
|
|
15
|
+
# #<state_name>?
|
|
16
|
+
#
|
|
17
|
+
module AcceptanceStatus
|
|
18
|
+
extend ActiveSupport::Concern
|
|
19
|
+
|
|
20
|
+
included do
|
|
21
|
+
state_machine :acceptance_status, initial: :pending do
|
|
22
|
+
event :attempt_accept do
|
|
23
|
+
transition to: :accepted, from: :accepted
|
|
24
|
+
transition to: :accepted, from: :pending, if: ->(return_item) { return_item.eligible_for_return? }
|
|
25
|
+
transition to: :manual_intervention_required, from: :pending, if: ->(return_item) { return_item.requires_manual_intervention? }
|
|
26
|
+
transition to: :rejected, from: :pending
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# bypasses eligibility checks
|
|
30
|
+
event :accept do
|
|
31
|
+
transition to: :accepted, from: [:accepted, :pending, :manual_intervention_required]
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
# bypasses eligibility checks
|
|
35
|
+
event :reject do
|
|
36
|
+
transition to: :rejected, from: [:accepted, :pending, :manual_intervention_required]
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# bypasses eligibility checks
|
|
40
|
+
event :require_manual_intervention do
|
|
41
|
+
transition to: :manual_intervention_required, from: [:accepted, :pending, :manual_intervention_required]
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
after_transition any => any, do: :persist_acceptance_status_errors
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
module ReturnItem
|
|
7
|
+
# Return Items' reception status state machine
|
|
8
|
+
#
|
|
9
|
+
# for each event the following instance methods are dynamically implemented:
|
|
10
|
+
# #<event_name>
|
|
11
|
+
# #<event_name>!
|
|
12
|
+
# #can_<event_name>?
|
|
13
|
+
#
|
|
14
|
+
# for each state the following instance methods are implemented:
|
|
15
|
+
# #<state_name>?
|
|
16
|
+
#
|
|
17
|
+
module ReceptionStatus
|
|
18
|
+
extend ActiveSupport::Concern
|
|
19
|
+
|
|
20
|
+
included do
|
|
21
|
+
state_machine :reception_status, initial: :awaiting do
|
|
22
|
+
after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :attempt_accept
|
|
23
|
+
after_transition to: ::Spree::ReturnItem::COMPLETED_RECEPTION_STATUSES, do: :check_unexchange
|
|
24
|
+
after_transition to: :received, do: :process_inventory_unit!
|
|
25
|
+
|
|
26
|
+
event(:cancel) { transition to: :cancelled, from: :awaiting }
|
|
27
|
+
|
|
28
|
+
event(:receive) { transition to: :received, from: ::Spree::ReturnItem::INTERMEDIATE_RECEPTION_STATUSES + [:awaiting] }
|
|
29
|
+
event(:unexchange) { transition to: :unexchanged, from: [:awaiting] }
|
|
30
|
+
event(:give) { transition to: :given_to_customer, from: :awaiting }
|
|
31
|
+
event(:lost) { transition to: :lost_in_transit, from: :awaiting }
|
|
32
|
+
event(:wrong_item_shipped) { transition to: :shipped_wrong_item, from: :awaiting }
|
|
33
|
+
event(:short_shipped) { transition to: :short_shipped, from: :awaiting }
|
|
34
|
+
event(:in_transit) { transition to: :in_transit, from: :awaiting }
|
|
35
|
+
event(:expired) { transition to: :expired, from: :awaiting }
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
# Shipments' state machine
|
|
7
|
+
#
|
|
8
|
+
# for each event the following instance methods are dynamically implemented:
|
|
9
|
+
# #<event_name>
|
|
10
|
+
# #<event_name>!
|
|
11
|
+
# #can_<event_name>?
|
|
12
|
+
#
|
|
13
|
+
# for each state the following instance methods are implemented:
|
|
14
|
+
# #<state_name>?
|
|
15
|
+
#
|
|
16
|
+
module Shipment
|
|
17
|
+
extend ActiveSupport::Concern
|
|
18
|
+
|
|
19
|
+
included do
|
|
20
|
+
state_machine initial: :pending, use_transactions: false do
|
|
21
|
+
event :ready do
|
|
22
|
+
transition from: :pending, to: :shipped, if: :can_transition_from_pending_to_shipped?
|
|
23
|
+
transition from: :pending, to: :ready, if: :can_transition_from_pending_to_ready?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
event :pend do
|
|
27
|
+
transition from: :ready, to: :pending
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
event :ship do
|
|
31
|
+
transition from: [:ready, :canceled], to: :shipped
|
|
32
|
+
end
|
|
33
|
+
after_transition to: :shipped, do: :after_ship
|
|
34
|
+
|
|
35
|
+
event :cancel do
|
|
36
|
+
transition to: :canceled, from: [:pending, :ready]
|
|
37
|
+
end
|
|
38
|
+
after_transition to: :canceled, do: :after_cancel
|
|
39
|
+
|
|
40
|
+
event :resume do
|
|
41
|
+
transition from: :canceled, to: :ready, if: :can_transition_from_canceled_to_ready?
|
|
42
|
+
transition from: :canceled, to: :pending
|
|
43
|
+
end
|
|
44
|
+
after_transition from: :canceled, to: [:pending, :ready, :shipped], do: :after_resume
|
|
45
|
+
|
|
46
|
+
after_transition do |shipment, transition|
|
|
47
|
+
shipment.state_changes.create!(
|
|
48
|
+
previous_state: transition.from,
|
|
49
|
+
next_state: transition.to,
|
|
50
|
+
name: 'shipment'
|
|
51
|
+
)
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Spree
|
|
4
|
+
module Core
|
|
5
|
+
class StateMachines
|
|
6
|
+
attr_writer :reimbursement,
|
|
7
|
+
:return_authorization,
|
|
8
|
+
:return_item_acceptance,
|
|
9
|
+
:return_item_reception,
|
|
10
|
+
:payment,
|
|
11
|
+
:inventory_unit,
|
|
12
|
+
:shipment
|
|
13
|
+
|
|
14
|
+
def return_authorization
|
|
15
|
+
@return_authorization ||= begin
|
|
16
|
+
require 'spree/core/state_machines/return_authorization'
|
|
17
|
+
'Spree::Core::StateMachines::ReturnAuthorization'
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
@return_authorization.constantize
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def return_item_reception
|
|
24
|
+
@return_item_reception_status ||= begin
|
|
25
|
+
require 'spree/core/state_machines/return_item/reception_status'
|
|
26
|
+
'Spree::Core::StateMachines::ReturnItem::ReceptionStatus'
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
@return_item_reception_status.constantize
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def return_item_acceptance
|
|
33
|
+
@return_item_acceptance_status ||= begin
|
|
34
|
+
require 'spree/core/state_machines/return_item/acceptance_status'
|
|
35
|
+
'Spree::Core::StateMachines::ReturnItem::AcceptanceStatus'
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
@return_item_acceptance_status.constantize
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def payment
|
|
42
|
+
@payment ||= begin
|
|
43
|
+
require 'spree/core/state_machines/payment'
|
|
44
|
+
'Spree::Core::StateMachines::Payment'
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
@payment.constantize
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def inventory_unit
|
|
51
|
+
@inventory_unit ||= begin
|
|
52
|
+
require 'spree/core/state_machines/inventory_unit'
|
|
53
|
+
'Spree::Core::StateMachines::InventoryUnit'
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
@inventory_unit.constantize
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
def shipment
|
|
60
|
+
@shipment ||= begin
|
|
61
|
+
require 'spree/core/state_machines/shipment'
|
|
62
|
+
'Spree::Core::StateMachines::Shipment'
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
@shipment.constantize
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def reimbursement
|
|
69
|
+
@reimbursement ||= begin
|
|
70
|
+
require 'spree/core/state_machines/reimbursement'
|
|
71
|
+
'Spree::Core::StateMachines::Reimbursement'
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
@reimbursement.constantize
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
@@ -15,16 +15,9 @@ module Spree
|
|
|
15
15
|
EMAIL_REGEXP = /\A([^@\.]|[^@\.]([^@\s]*)[^@\.])@([^@\s]+\.)+[^@\s]+\z/
|
|
16
16
|
|
|
17
17
|
def validate_each(record, attribute, value)
|
|
18
|
-
unless value
|
|
18
|
+
unless EMAIL_REGEXP.match? value
|
|
19
19
|
record.errors.add(attribute, :invalid, { value: value }.merge!(options))
|
|
20
20
|
end
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
end
|
|
24
|
-
|
|
25
|
-
# @private
|
|
26
|
-
EmailValidator = ActiveSupport::Deprecation::DeprecatedConstantProxy.new(
|
|
27
|
-
'EmailValidator',
|
|
28
|
-
'Spree::EmailValidator',
|
|
29
|
-
message: "EmailValidator is deprecated! Use Spree::EmailValidator instead.\nChange `validates :email, email: true` to `validates :email, 'spree/email' => true`\n"
|
|
30
|
-
)
|
data/lib/spree/core/version.rb
CHANGED
data/lib/spree/core.rb
CHANGED
|
@@ -53,6 +53,17 @@ module Spree
|
|
|
53
53
|
end
|
|
54
54
|
end
|
|
55
55
|
|
|
56
|
+
if Gem::Version.new(Rails.version) < Gem::Version.new('5.2')
|
|
57
|
+
warn <<~HEREDOC
|
|
58
|
+
Rails 5.1 (EOL) is deprecated and will not be supported anymore from the next Solidus version.
|
|
59
|
+
Please, upgrade to a more recent Rails version.
|
|
60
|
+
|
|
61
|
+
Read more on upgrading from Rails 5.1 to Rails 5.2 here:
|
|
62
|
+
https://guides.rubyonrails.org/upgrading_ruby_on_rails.html#upgrading-from-rails-5-1-to-rails-5-2
|
|
63
|
+
|
|
64
|
+
HEREDOC
|
|
65
|
+
end
|
|
66
|
+
|
|
56
67
|
require 'spree/core/version'
|
|
57
68
|
|
|
58
69
|
require 'spree/core/active_merchant_dependencies'
|
|
@@ -85,6 +96,7 @@ require 'spree/core/controller_helpers/search'
|
|
|
85
96
|
require 'spree/core/controller_helpers/store'
|
|
86
97
|
require 'spree/core/controller_helpers/strong_parameters'
|
|
87
98
|
require 'spree/core/role_configuration'
|
|
99
|
+
require 'spree/core/state_machines'
|
|
88
100
|
require 'spree/core/stock_configuration'
|
|
89
101
|
require 'spree/core/validators/email'
|
|
90
102
|
require 'spree/permission_sets'
|
data/lib/spree/money.rb
CHANGED
|
@@ -82,9 +82,9 @@ module Spree
|
|
|
82
82
|
# Maintain compatibility by checking html option renamed to html_wrap.
|
|
83
83
|
if options[:html] || options[:html] == false
|
|
84
84
|
Spree::Deprecation.warn <<-WARN.squish, caller
|
|
85
|
-
Spree::Money#to_html called with Spree::Money#to_html(html: #{options[:html]}),
|
|
85
|
+
Spree::Money#to_html called with Spree::Money#to_html(html: #{options[:html].inspect}),
|
|
86
86
|
which will not be supported in the future.
|
|
87
|
-
Instead use :html_wrap e.g. Spree::Money#to_html(html_wrap: #{options[:html]})
|
|
87
|
+
Instead use :html_wrap e.g. Spree::Money#to_html(html_wrap: #{options[:html].inspect})
|
|
88
88
|
WARN
|
|
89
89
|
end
|
|
90
90
|
if options[:html_wrap] || options[:html]
|
|
@@ -8,7 +8,7 @@ module Spree
|
|
|
8
8
|
can :display, OptionType
|
|
9
9
|
can :display, OptionValue
|
|
10
10
|
can :create, Order
|
|
11
|
-
can [:read, :update], Order do |order, token|
|
|
11
|
+
can [:read, :update], Order, Order.where(user: user) do |order, token|
|
|
12
12
|
order.user == user || (order.guest_token.present? && token == order.guest_token)
|
|
13
13
|
end
|
|
14
14
|
cannot :update, Order do |order|
|
|
@@ -11,6 +11,9 @@ module Spree
|
|
|
11
11
|
can :update_email, Spree.user_class do |user|
|
|
12
12
|
user.spree_roles.none?
|
|
13
13
|
end
|
|
14
|
+
can :update_password, Spree.user_class do |user|
|
|
15
|
+
user.spree_roles.none?
|
|
16
|
+
end
|
|
14
17
|
|
|
15
18
|
cannot [:delete, :destroy], Spree.user_class
|
|
16
19
|
can :manage, Spree::StoreCredit
|
|
@@ -117,10 +117,10 @@ module Spree
|
|
|
117
117
|
:meta_description, :meta_keywords, :meta_title, :child_index
|
|
118
118
|
]
|
|
119
119
|
|
|
120
|
-
#
|
|
120
|
+
# Intentionally leaving off email here to prevent privilege escalation
|
|
121
121
|
# by changing a user with higher priveleges' email to one a lower-priveleged
|
|
122
|
-
# admin owns.
|
|
123
|
-
# controller level
|
|
122
|
+
# admin owns. Creating a user with an email is handled separate at the
|
|
123
|
+
# controller level.
|
|
124
124
|
@@user_attributes = [:password, :password_confirmation]
|
|
125
125
|
|
|
126
126
|
@@variant_attributes = [
|
|
@@ -38,8 +38,12 @@ namespace :db do
|
|
|
38
38
|
# railties:install:migrations and then db:migrate.
|
|
39
39
|
# Migrations should be run one directory at a time
|
|
40
40
|
ActiveRecord::Migrator.migrations_paths.each do |path|
|
|
41
|
-
if
|
|
42
|
-
|
|
41
|
+
if Rails.gem_version >= Gem::Version.new('6.0.0')
|
|
42
|
+
ActiveRecord::MigrationContext.new(
|
|
43
|
+
[path],
|
|
44
|
+
ActiveRecord::SchemaMigration
|
|
45
|
+
).migrate
|
|
46
|
+
elsif Rails.gem_version >= Gem::Version.new('5.2.0')
|
|
43
47
|
ActiveRecord::MigrationContext.new([path]).migrate
|
|
44
48
|
else
|
|
45
49
|
ActiveRecord::Migrator.migrate(path)
|
|
@@ -13,6 +13,7 @@ Rails.env = 'test'
|
|
|
13
13
|
require 'solidus_core'
|
|
14
14
|
|
|
15
15
|
RAILS_52_OR_ABOVE = Gem::Version.new(Rails.version) >= Gem::Version.new('5.2')
|
|
16
|
+
RAILS_6_OR_ABOVE = Gem::Version.new(Rails.version) >= Gem::Version.new('6.0')
|
|
16
17
|
|
|
17
18
|
# @private
|
|
18
19
|
class ApplicationController < ActionController::Base
|
|
@@ -64,7 +65,9 @@ module DummyApp
|
|
|
64
65
|
|
|
65
66
|
if RAILS_52_OR_ABOVE
|
|
66
67
|
config.action_controller.default_protect_from_forgery = true
|
|
67
|
-
|
|
68
|
+
unless RAILS_6_OR_ABOVE
|
|
69
|
+
config.active_record.sqlite3.represent_boolean_as_integer = true
|
|
70
|
+
end
|
|
68
71
|
end
|
|
69
72
|
|
|
70
73
|
# Avoid issues if an old spec/dummy still exists
|
|
@@ -9,6 +9,7 @@ FactoryBot.define do
|
|
|
9
9
|
factory :inventory_unit, class: 'Spree::InventoryUnit' do
|
|
10
10
|
transient do
|
|
11
11
|
order { nil }
|
|
12
|
+
stock_location { nil }
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
variant
|
|
@@ -20,7 +21,13 @@ FactoryBot.define do
|
|
|
20
21
|
end
|
|
21
22
|
end
|
|
22
23
|
state { 'on_hand' }
|
|
23
|
-
shipment
|
|
24
|
+
shipment do
|
|
25
|
+
if stock_location
|
|
26
|
+
build(:shipment, state: 'pending', order: line_item.order, stock_location: stock_location)
|
|
27
|
+
else
|
|
28
|
+
build(:shipment, state: 'pending', order: line_item.order)
|
|
29
|
+
end
|
|
30
|
+
end
|
|
24
31
|
# return_authorization
|
|
25
32
|
end
|
|
26
33
|
end
|
|
@@ -27,8 +27,15 @@ FactoryBot.define do
|
|
|
27
27
|
Spree::Promotion::Actions::CreateItemAdjustments.create!(calculator: calculator, promotion: promotion)
|
|
28
28
|
end
|
|
29
29
|
end
|
|
30
|
+
|
|
30
31
|
factory :promotion_with_item_adjustment, traits: [:with_line_item_adjustment]
|
|
31
32
|
|
|
33
|
+
trait :with_free_shipping do
|
|
34
|
+
after(:create) do |promotion|
|
|
35
|
+
Spree::Promotion::Actions::FreeShipping.create!(promotion: promotion)
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
32
39
|
trait :with_order_adjustment do
|
|
33
40
|
transient do
|
|
34
41
|
weighted_order_adjustment_amount { 10 }
|
|
@@ -17,7 +17,7 @@ FactoryBot.define do
|
|
|
17
17
|
|
|
18
18
|
after(:build) do |package, evaluator|
|
|
19
19
|
evaluator.variants_contents.each do |variant, count|
|
|
20
|
-
package.add_multiple build_list(:inventory_unit, count, variant: variant)
|
|
20
|
+
package.add_multiple build_list(:inventory_unit, count, variant: variant, stock_location: evaluator.stock_location)
|
|
21
21
|
end
|
|
22
22
|
end
|
|
23
23
|
|
|
@@ -44,21 +44,36 @@ module Spree
|
|
|
44
44
|
# This method may be used for stubbing one or more different preferences
|
|
45
45
|
# at the same time.
|
|
46
46
|
#
|
|
47
|
-
# @param [Hash]
|
|
47
|
+
# @param prefs_or_conf_class [Class, Hash] the class we want to stub
|
|
48
|
+
# preferences for or the preferences hash (see prefs param). If this
|
|
49
|
+
# param is an Hash, preferences will be stubbed on Spree::Config.
|
|
50
|
+
# @param prefs [Hash, nil] names and values to be stubbed
|
|
48
51
|
#
|
|
49
|
-
# @example Stubs `currency` and `track_inventory_levels`
|
|
52
|
+
# @example Stubs `currency` and `track_inventory_levels` on `Spree::Config`:
|
|
50
53
|
# stub_spree_preferences(currency: 'EUR', track_inventory_levels: false)
|
|
51
54
|
# expect(Spree::Config.currency).to eql 'EUR'
|
|
52
55
|
#
|
|
56
|
+
# @example Stubs `locale` preference on `Spree::Backend::Config`:
|
|
57
|
+
# stub_spree_preferences(Spree::Backend::Config, locale: 'fr'),
|
|
58
|
+
# expect(Spree::Backend::Config.locale).to eql 'fr'
|
|
59
|
+
#
|
|
53
60
|
# @see https://github.com/solidusio/solidus/issues/3219
|
|
54
61
|
# Solidus #3219 for more details and motivations.
|
|
55
|
-
def stub_spree_preferences(
|
|
62
|
+
def stub_spree_preferences(prefs_or_conf_class, prefs = nil)
|
|
63
|
+
if prefs_or_conf_class.is_a?(Hash)
|
|
64
|
+
preference_store_class = Spree::Config
|
|
65
|
+
preferences = prefs_or_conf_class
|
|
66
|
+
else
|
|
67
|
+
preference_store_class = prefs_or_conf_class
|
|
68
|
+
preferences = prefs
|
|
69
|
+
end
|
|
70
|
+
|
|
56
71
|
preferences.each do |name, value|
|
|
57
|
-
if
|
|
58
|
-
allow(
|
|
72
|
+
if preference_store_class.method(:[]).owner >= preference_store_class.class
|
|
73
|
+
allow(preference_store_class).to receive(:[]).and_call_original
|
|
59
74
|
end
|
|
60
|
-
allow(
|
|
61
|
-
allow(
|
|
75
|
+
allow(preference_store_class).to receive(:[]).with(name) { value }
|
|
76
|
+
allow(preference_store_class).to receive(name) { value }
|
|
62
77
|
end
|
|
63
78
|
end
|
|
64
79
|
|
|
@@ -75,12 +90,30 @@ module Spree
|
|
|
75
90
|
# expect(Spree::Config.currency).to eql 'EUR'
|
|
76
91
|
# end
|
|
77
92
|
# @see Spree::TestingSupport::Preferences#stub_spree_preferences
|
|
78
|
-
def with_unfrozen_spree_preference_store
|
|
79
|
-
frozen_store =
|
|
80
|
-
|
|
93
|
+
def with_unfrozen_spree_preference_store(preference_store_class: Spree::Config)
|
|
94
|
+
frozen_store = preference_store_class.preference_store
|
|
95
|
+
preference_store_class.preference_store = preference_store_class[:unfrozen_preference_store].dup
|
|
81
96
|
yield
|
|
82
97
|
ensure
|
|
83
|
-
|
|
98
|
+
preference_store_class.preference_store = frozen_store
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
# This class method allows to freeze preferences for a specific
|
|
102
|
+
# configuration store class. It also stores the current state into
|
|
103
|
+
# a new preference of that store, so it can be reused when needed
|
|
104
|
+
# (eg. with_unfrozen_spree_preference_store)
|
|
105
|
+
#
|
|
106
|
+
# It is meant to be used by extensions as well, for example if one
|
|
107
|
+
# extension has its own Spree::ExtensionName::Config class, we can
|
|
108
|
+
# freeze it and be sure we always stub values on it during tests.
|
|
109
|
+
#
|
|
110
|
+
# @param preference_store_class [Class] the configuration class we want
|
|
111
|
+
# to freeze.
|
|
112
|
+
def self.freeze_preferences(preference_store_class)
|
|
113
|
+
config_class = preference_store_class.class
|
|
114
|
+
config_class.preference :unfrozen_preference_store, :hash
|
|
115
|
+
preference_store_class.unfrozen_preference_store = preference_store_class.preference_store.dup
|
|
116
|
+
preference_store_class.preference_store.freeze
|
|
84
117
|
end
|
|
85
118
|
end
|
|
86
119
|
end
|
|
@@ -88,9 +121,15 @@ end
|
|
|
88
121
|
|
|
89
122
|
RSpec.configure do |config|
|
|
90
123
|
config.before :suite do
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
124
|
+
%w[
|
|
125
|
+
Spree::Config
|
|
126
|
+
Spree::Frontend::Config
|
|
127
|
+
Spree::Backend::Config
|
|
128
|
+
Spree::Api::Config
|
|
129
|
+
].each do |configuration_class|
|
|
130
|
+
if Object.const_defined?(configuration_class)
|
|
131
|
+
Spree::TestingSupport::Preferences.freeze_preferences(configuration_class.constantize)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
95
134
|
end
|
|
96
135
|
end
|