solidus_core 4.3.5 → 4.4.1
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 +2 -2
- data/app/mailers/spree/base_mailer.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +1 -1
- data/app/mailers/spree/order_mailer.rb +3 -3
- data/app/mailers/spree/reimbursement_mailer.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/user_address_book.rb +4 -4
- data/app/models/concerns/spree/user_methods.rb +3 -3
- data/app/models/spree/address.rb +6 -6
- data/app/models/spree/adjustment.rb +13 -66
- data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
- data/app/models/spree/carton.rb +2 -2
- data/app/models/spree/credit_card.rb +6 -6
- data/app/models/spree/deprecated_configurable_class.rb +40 -0
- data/app/models/spree/fulfilment_changer.rb +4 -4
- data/app/models/spree/inventory_unit.rb +2 -2
- data/app/models/spree/line_item.rb +1 -4
- data/app/models/spree/null_promotion_adjuster.rb +13 -0
- data/app/models/spree/null_promotion_advertiser.rb +9 -0
- data/app/models/spree/null_promotion_finder.rb +9 -0
- data/app/models/spree/null_promotion_handler.rb +44 -0
- data/app/models/spree/order.rb +15 -22
- data/app/models/spree/order_cancellations.rb +8 -8
- data/app/models/spree/order_mutex.rb +2 -2
- data/app/models/spree/order_shipping.rb +9 -9
- data/app/models/spree/order_updater.rb +6 -10
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/payment.rb +2 -2
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/store_credit.rb +1 -1
- data/app/models/spree/payment_source.rb +5 -1
- data/app/models/spree/permission_set.rb +11 -0
- data/app/models/spree/product.rb +7 -28
- data/app/models/spree/refund.rb +1 -1
- data/app/models/spree/reimbursement.rb +4 -4
- data/app/models/spree/reimbursement_performer.rb +3 -3
- data/app/models/spree/reimbursement_tax_calculator.rb +2 -2
- data/app/models/spree/reimbursement_type/credit.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
- data/app/models/spree/return_item.rb +9 -9
- data/app/models/spree/role.rb +3 -1
- data/app/models/spree/role_permission.rb +8 -0
- data/app/models/spree/shipment.rb +7 -7
- data/app/models/spree/shipping_category.rb +2 -0
- data/app/models/spree/shipping_rate.rb +1 -1
- data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +4 -11
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +2 -2
- data/app/models/spree/stock/simple_coordinator.rb +1 -1
- data/app/models/spree/stock_location.rb +5 -5
- data/app/models/spree/store.rb +1 -1
- data/app/models/spree/store_credit.rb +15 -15
- data/app/models/spree/store_credit_event.rb +3 -3
- data/app/models/spree/tax_calculator/default.rb +2 -2
- data/app/models/spree/tax_calculator/shipping_rate.rb +1 -1
- data/app/models/spree/tax_category.rb +3 -1
- data/app/models/spree/tax_rate.rb +3 -3
- data/app/models/spree/taxonomy.rb +2 -2
- data/app/models/spree/unit_cancel.rb +1 -2
- data/app/models/spree/variant/vat_price_generator.rb +1 -1
- data/app/models/spree/variant.rb +7 -2
- data/app/models/spree/wallet.rb +2 -2
- data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
- data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
- data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
- data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
- data/config/locales/en.yml +4 -90
- data/db/default/spree/permission_sets.rb +10 -0
- data/db/default/spree/return_reasons.rb +3 -1
- data/db/default/spree/states.rb +1 -1
- data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
- data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
- data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
- data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
- data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
- data/db/seeds.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -1
- data/lib/generators/solidus/update/update_generator.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/test.rb +6 -1
- data/lib/spree/app_configuration.rb +53 -84
- data/lib/spree/core/class_constantizer.rb +2 -2
- data/lib/spree/core/controller_helpers/payment_parameters.rb +1 -1
- data/lib/spree/core/engine.rb +1 -0
- data/lib/spree/core/environment/calculators.rb +35 -3
- data/lib/spree/core/environment/promotions.rb +25 -4
- data/lib/spree/core/environment_extension.rb +16 -2
- data/lib/spree/core/importer/order.rb +5 -5
- data/lib/spree/core/importer/product.rb +3 -3
- data/lib/spree/core/nested_class_set.rb +28 -0
- data/lib/spree/core/null_promotion_configuration.rb +84 -0
- data/lib/spree/core/product_filters.rb +1 -1
- data/lib/spree/core/search/variant.rb +2 -2
- data/lib/spree/core/state_machines/order.rb +0 -1
- data/lib/spree/core/validators/email.rb +1 -1
- data/lib/spree/core/version.rb +2 -2
- data/lib/spree/core.rb +2 -6
- data/lib/spree/deprecator.rb +9 -0
- data/lib/spree/i18n.rb +1 -1
- data/lib/spree/mailer_previews/carton_preview.rb +1 -1
- data/lib/spree/permission_sets/base.rb +13 -1
- data/lib/spree/permission_sets/configuration_display.rb +10 -0
- data/lib/spree/permission_sets/configuration_management.rb +10 -0
- data/lib/spree/permission_sets/dashboard_display.rb +12 -0
- data/lib/spree/permission_sets/default_customer.rb +11 -1
- data/lib/spree/permission_sets/order_display.rb +10 -0
- data/lib/spree/permission_sets/order_management.rb +10 -0
- data/lib/spree/permission_sets/product_display.rb +10 -0
- data/lib/spree/permission_sets/product_management.rb +10 -0
- data/lib/spree/permission_sets/restricted_stock_display.rb +10 -0
- data/lib/spree/permission_sets/restricted_stock_management.rb +10 -0
- data/lib/spree/permission_sets/stock_display.rb +10 -0
- data/lib/spree/permission_sets/stock_management.rb +10 -0
- data/lib/spree/permission_sets/super_user.rb +10 -0
- data/lib/spree/permission_sets/user_display.rb +10 -0
- data/lib/spree/permission_sets/user_management.rb +10 -0
- data/lib/spree/permission_sets.rb +0 -2
- data/lib/spree/permitted_attributes.rb +2 -2
- data/lib/spree/preferences/store.rb +2 -2
- data/lib/spree/testing_support/capybara_ext.rb +1 -1
- data/lib/spree/testing_support/dummy_ability.rb +7 -0
- data/lib/spree/testing_support/dummy_app/database.yml +2 -2
- data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +2 -2
- data/lib/spree/testing_support/dummy_app.rb +17 -12
- data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -2
- data/lib/spree/testing_support/factories/calculator_factory.rb +1 -5
- data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +3 -3
- data/lib/spree/testing_support/factories/order_factory.rb +5 -24
- data/lib/spree/testing_support/factories/product_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -1
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
- data/lib/spree/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
- data/lib/spree/testing_support/order_walkthrough.rb +3 -3
- data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
- data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
- data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
- data/lib/tasks/colorado_delivery_fee.rake +2 -2
- data/solidus_core.gemspec +7 -7
- metadata +60 -93
- data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
- data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
- data/app/models/spree/calculator/distributed_amount.rb +0 -33
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
- data/app/models/spree/calculator/flexi_rate.rb +0 -22
- data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
- data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
- data/app/models/spree/calculator/tiered_percent.rb +0 -62
- data/app/models/spree/line_item_action.rb +0 -8
- data/app/models/spree/order_promotion.rb +0 -27
- data/app/models/spree/promotion/actions/create_adjustment.rb +0 -81
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -98
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
- data/app/models/spree/promotion/actions/free_shipping.rb +0 -59
- data/app/models/spree/promotion/order_adjustments_recalculator.rb +0 -92
- data/app/models/spree/promotion/rules/first_order.rb +0 -38
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
- data/app/models/spree/promotion/rules/item_total.rb +0 -86
- data/app/models/spree/promotion/rules/minimum_quantity.rb +0 -59
- data/app/models/spree/promotion/rules/nth_order.rb +0 -45
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
- data/app/models/spree/promotion/rules/option_value.rb +0 -50
- data/app/models/spree/promotion/rules/product.rb +0 -86
- data/app/models/spree/promotion/rules/store.rb +0 -26
- data/app/models/spree/promotion/rules/taxon.rb +0 -91
- data/app/models/spree/promotion/rules/user.rb +0 -34
- data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
- data/app/models/spree/promotion/rules/user_role.rb +0 -45
- data/app/models/spree/promotion.rb +0 -271
- data/app/models/spree/promotion_action.rb +0 -47
- data/app/models/spree/promotion_category.rb +0 -8
- data/app/models/spree/promotion_chooser.rb +0 -34
- data/app/models/spree/promotion_code/batch_builder.rb +0 -64
- data/app/models/spree/promotion_code.rb +0 -54
- data/app/models/spree/promotion_code_batch.rb +0 -27
- data/app/models/spree/promotion_handler/cart.rb +0 -75
- data/app/models/spree/promotion_handler/coupon.rb +0 -123
- data/app/models/spree/promotion_handler/page.rb +0 -26
- data/app/models/spree/promotion_handler/shipping.rb +0 -61
- data/app/models/spree/promotion_rule.rb +0 -55
- data/app/models/spree/promotion_rule_store.rb +0 -10
- data/app/models/spree/promotion_rule_taxon.rb +0 -8
- data/app/models/spree/promotion_rule_user.rb +0 -10
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
- data/bin/rails +0 -13
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
- data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
- data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
- data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
- data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +0 -20
- data/db/migrate/20230322085416_remove_match_policy_from_spree_promotion.rb +0 -5
- data/db/migrate/20230325132905_remove_unused_columns_from_promotion_rules.rb +0 -6
- data/db/migrate/20230325161633_drop_unused_promo_action_line_items.rb +0 -13
- data/db/migrate/20231027084517_add_order_promotions_foreign_key.rb +0 -10
- data/db/migrate/20231031175215_add_promotion_order_promotion_foreign_key.rb +0 -10
- data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
- data/lib/spree/permission_sets/promotion_display.rb +0 -25
- data/lib/spree/permission_sets/promotion_management.rb +0 -25
- data/lib/spree/ransack_4_1_patch.rb +0 -16
- data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -8
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -7
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -8
- data/lib/spree/testing_support/factories/promotion_factory.rb +0 -98
data/app/models/spree/role.rb
CHANGED
@@ -4,8 +4,10 @@ module Spree
|
|
4
4
|
class Role < Spree::Base
|
5
5
|
has_many :role_users, class_name: "Spree::RoleUser", dependent: :destroy
|
6
6
|
has_many :users, through: :role_users
|
7
|
+
has_many :role_permissions, dependent: :destroy
|
8
|
+
has_many :permission_sets, through: :role_permissions
|
7
9
|
|
8
|
-
|
10
|
+
validates :name, presence: true, uniqueness: { case_sensitive: true, allow_blank: true }
|
9
11
|
|
10
12
|
def admin?
|
11
13
|
name == "admin"
|
@@ -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, ->(*state) { where(state:
|
34
|
+
scope :with_state, ->(*state) { where(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)
|
@@ -92,7 +92,7 @@ module Spree
|
|
92
92
|
# @return [BigDecimal] the amount of this item, taking into consideration
|
93
93
|
# all non-tax adjustments.
|
94
94
|
def total_before_tax
|
95
|
-
amount + adjustments.
|
95
|
+
amount + adjustments.reject(&:tax?).sum(&:amount)
|
96
96
|
end
|
97
97
|
|
98
98
|
# @return [BigDecimal] the amount of this shipment before VAT tax
|
@@ -175,7 +175,7 @@ module Spree
|
|
175
175
|
end
|
176
176
|
|
177
177
|
def manifest
|
178
|
-
@manifest ||= Spree::ShippingManifest.new(inventory_units:
|
178
|
+
@manifest ||= Spree::ShippingManifest.new(inventory_units:).items
|
179
179
|
end
|
180
180
|
|
181
181
|
def selected_shipping_rate_id
|
@@ -217,7 +217,7 @@ module Spree
|
|
217
217
|
|
218
218
|
def set_up_inventory(state, variant, _order, line_item)
|
219
219
|
inventory_units.create(
|
220
|
-
state
|
220
|
+
state:,
|
221
221
|
variant_id: variant.id,
|
222
222
|
line_item_id: line_item.id
|
223
223
|
)
|
@@ -263,7 +263,7 @@ module Spree
|
|
263
263
|
self.cost = selected_shipping_rate.cost
|
264
264
|
if changed?
|
265
265
|
update_columns(
|
266
|
-
cost
|
266
|
+
cost:,
|
267
267
|
updated_at: Time.current
|
268
268
|
)
|
269
269
|
end
|
@@ -312,7 +312,7 @@ module Spree
|
|
312
312
|
end
|
313
313
|
|
314
314
|
def after_ship
|
315
|
-
order.shipping.ship_shipment(self, suppress_mailer:
|
315
|
+
order.shipping.ship_shipment(self, suppress_mailer:)
|
316
316
|
end
|
317
317
|
|
318
318
|
def can_get_rates?
|
@@ -339,7 +339,7 @@ module Spree
|
|
339
339
|
|
340
340
|
def ensure_can_destroy
|
341
341
|
if shipped? || canceled?
|
342
|
-
errors.add(:state, :cannot_destroy, state:
|
342
|
+
errors.add(:state, :cannot_destroy, state:)
|
343
343
|
throw :abort
|
344
344
|
end
|
345
345
|
end
|
@@ -31,7 +31,7 @@ module Spree
|
|
31
31
|
tax_explanations = taxes.map(&:label).join(tax_label_separator)
|
32
32
|
|
33
33
|
I18n.t 'spree.shipping_rate.display_price.display_price_with_explanations',
|
34
|
-
price
|
34
|
+
price:,
|
35
35
|
explanations: tax_explanations
|
36
36
|
end
|
37
37
|
alias_method :display_cost, :display_price
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Spree
|
4
|
-
class
|
4
|
+
class SimpleOrderContents
|
5
5
|
attr_accessor :order
|
6
6
|
|
7
7
|
def initialize(order)
|
@@ -38,12 +38,7 @@ module Spree
|
|
38
38
|
if order.update(params)
|
39
39
|
unless order.completed?
|
40
40
|
order.line_items = order.line_items.select { |li| li.quantity > 0 }
|
41
|
-
# Update totals, then check if the order is eligible for any cart promotions.
|
42
|
-
# If we do not update first, then the item total will be wrong and ItemTotal
|
43
|
-
# promotion rules would not be triggered.
|
44
|
-
reload_totals
|
45
41
|
order.check_shipments_and_restart_checkout
|
46
|
-
PromotionHandler::Cart.new(order).activate
|
47
42
|
end
|
48
43
|
reload_totals
|
49
44
|
true
|
@@ -71,10 +66,8 @@ module Spree
|
|
71
66
|
private
|
72
67
|
|
73
68
|
def after_add_or_remove(line_item, options = {})
|
74
|
-
reload_totals
|
75
69
|
shipment = options[:shipment]
|
76
70
|
shipment.present? ? shipment.update_amounts : order.check_shipments_and_restart_checkout
|
77
|
-
PromotionHandler::Cart.new(order, line_item).activate
|
78
71
|
reload_totals
|
79
72
|
line_item
|
80
73
|
end
|
@@ -88,8 +81,8 @@ module Spree
|
|
88
81
|
|
89
82
|
line_item ||= order.line_items.new(
|
90
83
|
quantity: 0,
|
91
|
-
variant
|
92
|
-
adjustments: []
|
84
|
+
variant:,
|
85
|
+
adjustments: []
|
93
86
|
)
|
94
87
|
|
95
88
|
line_item.quantity += quantity.to_i
|
@@ -117,7 +110,7 @@ module Spree
|
|
117
110
|
def grab_line_item_by_variant(variant, raise_error = false, options = {})
|
118
111
|
line_item = order.find_line_item_by_variant(variant, options)
|
119
112
|
|
120
|
-
if
|
113
|
+
if line_item.blank? && raise_error
|
121
114
|
raise ActiveRecord::RecordNotFound, "Line item not found for variant #{variant.sku}"
|
122
115
|
end
|
123
116
|
|
@@ -124,8 +124,8 @@ module Spree
|
|
124
124
|
contents.each { |content_item| content_item.inventory_unit.state = content_item.state.to_s }
|
125
125
|
|
126
126
|
Spree::Shipment.new(
|
127
|
-
order
|
128
|
-
stock_location
|
127
|
+
order:,
|
128
|
+
stock_location:,
|
129
129
|
inventory_units: contents.map(&:inventory_unit)
|
130
130
|
)
|
131
131
|
end
|
@@ -41,7 +41,7 @@ module Spree
|
|
41
41
|
@desired = Spree::StockQuantities.new(inventory_units_by_variant.transform_values(&:count))
|
42
42
|
@availability = Spree::Stock::Availability.new(
|
43
43
|
variants: desired.variants,
|
44
|
-
stock_locations:
|
44
|
+
stock_locations:
|
45
45
|
)
|
46
46
|
|
47
47
|
@allocator = Spree::Config.stock.allocator_class.new(availability)
|
@@ -39,7 +39,7 @@ module Spree
|
|
39
39
|
|
40
40
|
# Wrapper for creating a new stock item respecting the backorderable config
|
41
41
|
def propagate_variant(variant)
|
42
|
-
stock_items.create!(variant
|
42
|
+
stock_items.create!(variant:, backorderable: backorderable_default)
|
43
43
|
end
|
44
44
|
|
45
45
|
# Return either an existing stock item or create a new one. Useful in
|
@@ -55,7 +55,7 @@ module Spree
|
|
55
55
|
#
|
56
56
|
# @return [StockItem] Corresponding StockItem for the StockLocation's variant.
|
57
57
|
def stock_item(variant_id)
|
58
|
-
stock_items.where(variant_id:
|
58
|
+
stock_items.where(variant_id:).order(:id).first
|
59
59
|
end
|
60
60
|
|
61
61
|
# Attempts to look up StockItem for the variant, and creates one if not found.
|
@@ -101,8 +101,8 @@ module Spree
|
|
101
101
|
if quantity < 1 && !stock_item(variant)
|
102
102
|
raise InvalidMovementError.new(I18n.t('spree.negative_movement_absent_item'))
|
103
103
|
end
|
104
|
-
stock_item_or_create(variant).stock_movements.create!(quantity
|
105
|
-
originator:
|
104
|
+
stock_item_or_create(variant).stock_movements.create!(quantity:,
|
105
|
+
originator:)
|
106
106
|
end
|
107
107
|
|
108
108
|
def fill_status(variant, quantity)
|
@@ -121,7 +121,7 @@ module Spree
|
|
121
121
|
|
122
122
|
def ensure_one_default
|
123
123
|
if default
|
124
|
-
Spree::StockLocation.where(default: true).where.not(id:
|
124
|
+
Spree::StockLocation.where(default: true).where.not(id:).find_each do |stock_location|
|
125
125
|
stock_location.default = false
|
126
126
|
stock_location.save!
|
127
127
|
end
|
data/app/models/spree/store.rb
CHANGED
@@ -58,7 +58,7 @@ module Spree
|
|
58
58
|
|
59
59
|
def ensure_default_exists_and_is_unique
|
60
60
|
if default
|
61
|
-
Spree::Store.where.not(id:
|
61
|
+
Spree::Store.where.not(id:).update_all(default: false)
|
62
62
|
elsif Spree::Store.where(default: true).count == 0
|
63
63
|
self.default = true
|
64
64
|
end
|
@@ -58,7 +58,7 @@ class Spree::StoreCredit < Spree::PaymentSource
|
|
58
58
|
def authorize(amount, order_currency, options = {})
|
59
59
|
authorization_code = options[:action_authorization_code]
|
60
60
|
if authorization_code
|
61
|
-
if store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code:
|
61
|
+
if store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code:)
|
62
62
|
# Don't authorize again on capture
|
63
63
|
return true
|
64
64
|
end
|
@@ -92,7 +92,7 @@ class Spree::StoreCredit < Spree::PaymentSource
|
|
92
92
|
|
93
93
|
def capture(amount, authorization_code, order_currency, options = {})
|
94
94
|
return false unless authorize(amount, order_currency, action_authorization_code: authorization_code)
|
95
|
-
auth_event = store_credit_events.find_by!(action: AUTHORIZE_ACTION, authorization_code:
|
95
|
+
auth_event = store_credit_events.find_by!(action: AUTHORIZE_ACTION, authorization_code:)
|
96
96
|
|
97
97
|
if amount <= auth_event.amount
|
98
98
|
if currency != order_currency
|
@@ -117,7 +117,7 @@ class Spree::StoreCredit < Spree::PaymentSource
|
|
117
117
|
end
|
118
118
|
|
119
119
|
def void(authorization_code, options = {})
|
120
|
-
if auth_event = store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code:
|
120
|
+
if auth_event = store_credit_events.find_by(action: AUTHORIZE_ACTION, authorization_code:)
|
121
121
|
update!({
|
122
122
|
action: VOID_ACTION,
|
123
123
|
action_amount: auth_event.amount,
|
@@ -135,7 +135,7 @@ class Spree::StoreCredit < Spree::PaymentSource
|
|
135
135
|
|
136
136
|
def credit(amount, authorization_code, order_currency, options = {})
|
137
137
|
# Find the amount related to this authorization_code in order to add the store credit back
|
138
|
-
capture_event = store_credit_events.find_by(action: CAPTURE_ACTION, authorization_code:
|
138
|
+
capture_event = store_credit_events.find_by(action: CAPTURE_ACTION, authorization_code:)
|
139
139
|
|
140
140
|
if currency != order_currency # sanity check to make sure the order currency hasn't changed since the auth
|
141
141
|
errors.add(:base, I18n.t('spree.store_credit.currency_mismatch'))
|
@@ -221,25 +221,25 @@ class Spree::StoreCredit < Spree::PaymentSource
|
|
221
221
|
|
222
222
|
def create_credit_record_params(amount)
|
223
223
|
{
|
224
|
-
amount
|
225
|
-
user_id
|
226
|
-
category_id
|
227
|
-
created_by_id
|
228
|
-
currency
|
229
|
-
type_id
|
224
|
+
amount:,
|
225
|
+
user_id:,
|
226
|
+
category_id:,
|
227
|
+
created_by_id:,
|
228
|
+
currency:,
|
229
|
+
type_id:,
|
230
230
|
memo: credit_allocation_memo
|
231
231
|
}
|
232
232
|
end
|
233
233
|
|
234
234
|
def credit_allocation_memo
|
235
|
-
I18n.t("spree.store_credit.credit_allocation_memo", id:
|
235
|
+
I18n.t("spree.store_credit.credit_allocation_memo", id:)
|
236
236
|
end
|
237
237
|
|
238
238
|
def store_event
|
239
239
|
return unless saved_change_to_amount? || saved_change_to_amount_used? || saved_change_to_amount_authorized? || [ELIGIBLE_ACTION, INVALIDATE_ACTION].include?(action)
|
240
240
|
|
241
241
|
event = if action
|
242
|
-
store_credit_events.build(action:
|
242
|
+
store_credit_events.build(action:)
|
243
243
|
else
|
244
244
|
store_credit_events.where(action: ALLOCATION_ACTION).first_or_initialize
|
245
245
|
end
|
@@ -247,10 +247,10 @@ class Spree::StoreCredit < Spree::PaymentSource
|
|
247
247
|
event.update!({
|
248
248
|
amount: action_amount || amount,
|
249
249
|
authorization_code: action_authorization_code || event.authorization_code || generate_authorization_code,
|
250
|
-
amount_remaining
|
251
|
-
user_total_amount: user.available_store_credit_total(currency:
|
250
|
+
amount_remaining:,
|
251
|
+
user_total_amount: user.available_store_credit_total(currency:),
|
252
252
|
originator: action_originator,
|
253
|
-
store_credit_reason:
|
253
|
+
store_credit_reason:
|
254
254
|
})
|
255
255
|
end
|
256
256
|
|
@@ -33,15 +33,15 @@ module Spree
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def display_amount
|
36
|
-
Spree::Money.new(amount, { currency:
|
36
|
+
Spree::Money.new(amount, { currency: })
|
37
37
|
end
|
38
38
|
|
39
39
|
def display_user_total_amount
|
40
|
-
Spree::Money.new(user_total_amount, { currency:
|
40
|
+
Spree::Money.new(user_total_amount, { currency: })
|
41
41
|
end
|
42
42
|
|
43
43
|
def display_remaining_amount
|
44
|
-
Spree::Money.new(amount_remaining, { currency:
|
44
|
+
Spree::Money.new(amount_remaining, { currency: })
|
45
45
|
end
|
46
46
|
|
47
47
|
def display_event_date
|
@@ -46,7 +46,7 @@ module Spree
|
|
46
46
|
Spree::Tax::ItemTax.new(
|
47
47
|
label: rate.adjustment_label(amount),
|
48
48
|
tax_rate: rate,
|
49
|
-
amount
|
49
|
+
amount:,
|
50
50
|
included_in_price: rate.included_in_price
|
51
51
|
)
|
52
52
|
end
|
@@ -89,7 +89,7 @@ module Spree
|
|
89
89
|
item_id: item.id,
|
90
90
|
label: rate.adjustment_label(amount),
|
91
91
|
tax_rate: rate,
|
92
|
-
amount
|
92
|
+
amount:,
|
93
93
|
included_in_price: rate.included_in_price
|
94
94
|
)
|
95
95
|
end
|
@@ -4,6 +4,8 @@ module Spree
|
|
4
4
|
class TaxCategory < Spree::Base
|
5
5
|
include Spree::SoftDeletable
|
6
6
|
|
7
|
+
self.allowed_ransackable_attributes = %w[name description]
|
8
|
+
|
7
9
|
after_discard do
|
8
10
|
self.tax_rate_tax_categories = []
|
9
11
|
end
|
@@ -28,7 +30,7 @@ module Spree
|
|
28
30
|
|
29
31
|
def ensure_one_default
|
30
32
|
if is_default
|
31
|
-
Spree::TaxCategory.where(is_default: true).where.not(id:
|
33
|
+
Spree::TaxCategory.where(is_default: true).where.not(id:).update_all(is_default: false, updated_at: Time.current)
|
32
34
|
end
|
33
35
|
end
|
34
36
|
end
|
@@ -11,10 +11,10 @@ module Spree
|
|
11
11
|
include Spree::CalculatedAdjustments
|
12
12
|
include Spree::AdjustmentSource
|
13
13
|
|
14
|
-
enum level
|
14
|
+
enum :level, {
|
15
15
|
item: 0,
|
16
16
|
order: 1
|
17
|
-
},
|
17
|
+
}, suffix: true
|
18
18
|
|
19
19
|
belongs_to :zone, class_name: "Spree::Zone", inverse_of: :tax_rates, optional: true
|
20
20
|
|
@@ -37,7 +37,7 @@ module Spree
|
|
37
37
|
# Finds all tax rates whose zones match a given address
|
38
38
|
scope :for_address, ->(address) { joins(:zone).merge(Spree::Zone.for_address(address)) }
|
39
39
|
scope :for_country,
|
40
|
-
->(country) { for_address(Spree::Tax::TaxLocation.new(country:
|
40
|
+
->(country) { for_address(Spree::Tax::TaxLocation.new(country:)) }
|
41
41
|
scope :active, -> do
|
42
42
|
table = arel_table
|
43
43
|
time = Time.current
|
@@ -21,11 +21,11 @@ module Spree
|
|
21
21
|
def set_name
|
22
22
|
if root
|
23
23
|
root.update_columns(
|
24
|
-
name
|
24
|
+
name:,
|
25
25
|
updated_at: Time.current
|
26
26
|
)
|
27
27
|
else
|
28
|
-
self.root = Spree::Taxon.create!(taxonomy_id: id, name:
|
28
|
+
self.root = Spree::Taxon.create!(taxonomy_id: id, name:)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -20,10 +20,9 @@ class Spree::UnitCancel < Spree::Base
|
|
20
20
|
|
21
21
|
self.adjustment = inventory_unit.line_item.adjustments.create!(
|
22
22
|
source: self,
|
23
|
-
amount
|
23
|
+
amount:,
|
24
24
|
order: inventory_unit.order,
|
25
25
|
label: "#{I18n.t('spree.cancellation')} - #{reason}",
|
26
|
-
eligible: true,
|
27
26
|
finalized: true
|
28
27
|
)
|
29
28
|
|
@@ -41,7 +41,7 @@ module Spree
|
|
41
41
|
def find_or_initialize_price_by(country_iso, currency)
|
42
42
|
variant.prices.detect do |price|
|
43
43
|
price.country_iso == country_iso && price.currency == currency
|
44
|
-
end || variant.prices.build(country_iso
|
44
|
+
end || variant.prices.build(country_iso:, currency:)
|
45
45
|
end
|
46
46
|
|
47
47
|
# nil is added to the array so we always have an export price.
|
data/app/models/spree/variant.rb
CHANGED
@@ -80,6 +80,11 @@ module Spree
|
|
80
80
|
|
81
81
|
after_destroy :destroy_option_values_variants
|
82
82
|
|
83
|
+
scope :template_variants, -> do
|
84
|
+
left_joins(product: { option_types: :option_values }).where(is_master: true).where.not(spree_option_values: { id: nil }).reorder(nil).distinct
|
85
|
+
end
|
86
|
+
scope :non_template_variants, -> { where.not(id: template_variants) }
|
87
|
+
|
83
88
|
# Returns variants that are in stock. When stock locations are provided as
|
84
89
|
# a parameter, the scope is limited to variants that are in stock in the
|
85
90
|
# provided stock locations.
|
@@ -94,7 +99,7 @@ module Spree
|
|
94
99
|
if stock_locations.present?
|
95
100
|
in_stock_variants = in_stock_variants.where(spree_stock_items: { stock_location_id: stock_locations.map(&:id) })
|
96
101
|
end
|
97
|
-
in_stock_variants
|
102
|
+
in_stock_variants.distinct
|
98
103
|
end
|
99
104
|
|
100
105
|
# Returns a scope of Variants which are suppliable. This includes:
|
@@ -194,7 +199,7 @@ module Spree
|
|
194
199
|
#
|
195
200
|
# @return [String] a sentence-ified string of option values.
|
196
201
|
def options_text
|
197
|
-
values = option_values.
|
202
|
+
values = option_values.sort_by do |option_value|
|
198
203
|
option_value.option_type.position
|
199
204
|
end
|
200
205
|
|
data/app/models/spree/wallet.rb
CHANGED
@@ -28,7 +28,7 @@ class Spree::Wallet
|
|
28
28
|
# @param payment_source [PaymentSource] The payment source to add to the wallet
|
29
29
|
# @return [WalletPaymentSource] the generated WalletPaymentSource
|
30
30
|
def add(payment_source)
|
31
|
-
user.wallet_payment_sources.find_or_create_by!(payment_source:
|
31
|
+
user.wallet_payment_sources.find_or_create_by!(payment_source:)
|
32
32
|
end
|
33
33
|
|
34
34
|
# Remove a PaymentSource from the wallet.
|
@@ -37,7 +37,7 @@ class Spree::Wallet
|
|
37
37
|
# @raise [ActiveRecord::RecordNotFound] if the source is not in the wallet.
|
38
38
|
# @return [WalletPaymentSource] the destroyed WalletPaymentSource
|
39
39
|
def remove(payment_source)
|
40
|
-
user.wallet_payment_sources.find_by!(payment_source:
|
40
|
+
user.wallet_payment_sources.find_by!(payment_source:).destroy!
|
41
41
|
end
|
42
42
|
|
43
43
|
# Find a WalletPaymentSource in the wallet by id.
|
@@ -26,7 +26,7 @@
|
|
26
26
|
<td><%= t('.subtotal') %></td>
|
27
27
|
<td><%= @order.display_item_total %></td>
|
28
28
|
</tr>
|
29
|
-
<% @order.adjustments.
|
29
|
+
<% @order.adjustments.each do |adjustment| %>
|
30
30
|
<tr>
|
31
31
|
<td></td>
|
32
32
|
<td><%= sanitize(adjustment.label) %></td>
|
@@ -10,7 +10,7 @@
|
|
10
10
|
<% end %>
|
11
11
|
============================================================
|
12
12
|
<%= t('.subtotal') %> <%= @order.display_item_total %>
|
13
|
-
<% @order.adjustments.
|
13
|
+
<% @order.adjustments.each do |adjustment| %>
|
14
14
|
<%= raw(adjustment.label) %> <%= adjustment.display_amount %>
|
15
15
|
<% end %>
|
16
16
|
<%= t('.total') %> <%= @order.display_total %>
|
@@ -31,8 +31,8 @@
|
|
31
31
|
</td>
|
32
32
|
</tr>
|
33
33
|
<% if @order.line_item_adjustments.exists? %>
|
34
|
-
<% if @order.all_adjustments.promotion.
|
35
|
-
<% @order.all_adjustments.promotion.
|
34
|
+
<% if @order.all_adjustments.promotion.exists? %>
|
35
|
+
<% @order.all_adjustments.promotion.group_by(&:label).each do |label, adjustments| %>
|
36
36
|
<tr>
|
37
37
|
<td></td>
|
38
38
|
<td><%= t('spree.promotion') %> <%= label %>:</td>
|
@@ -48,8 +48,8 @@
|
|
48
48
|
<td><%= Spree::Money.new(shipments.sum(&:total_before_tax), currency: @order.currency) %></td>
|
49
49
|
</tr>
|
50
50
|
<% end %>
|
51
|
-
<% if @order.all_adjustments.
|
52
|
-
<% @order.all_adjustments.
|
51
|
+
<% if @order.all_adjustments.tax.exists? %>
|
52
|
+
<% @order.all_adjustments.tax.group_by(&:label).each do |label, adjustments| %>
|
53
53
|
<tr>
|
54
54
|
<td></td>
|
55
55
|
<td><%= t('spree.tax') %> <%= label %>:</td>
|
@@ -57,7 +57,7 @@
|
|
57
57
|
</tr>
|
58
58
|
<% end %>
|
59
59
|
<% end %>
|
60
|
-
<% @order.adjustments.
|
60
|
+
<% @order.adjustments.each do |adjustment| %>
|
61
61
|
<% next if (adjustment.source_type == 'Spree::TaxRate') and (adjustment.amount == 0) %>
|
62
62
|
<tr>
|
63
63
|
<td></td>
|
@@ -11,8 +11,8 @@
|
|
11
11
|
============================================================
|
12
12
|
<%= t('.subtotal') %> <%= @order.display_item_total %>
|
13
13
|
<% if @order.line_item_adjustments.exists? %>
|
14
|
-
<% if @order.all_adjustments.promotion.
|
15
|
-
<% @order.all_adjustments.promotion.
|
14
|
+
<% if @order.all_adjustments.promotion.exists? %>
|
15
|
+
<% @order.all_adjustments.promotion.group_by(&:label).each do |label, adjustments| %>
|
16
16
|
<%= t('spree.promotion') %>: <%= label %> <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
|
17
17
|
<% end %>
|
18
18
|
<% end %>
|
@@ -22,13 +22,13 @@
|
|
22
22
|
<%= t('spree.shipping') %>: <%= name %> <%= Spree::Money.new(shipments.sum(&:total_before_tax), currency: @order.currency) %>
|
23
23
|
<% end %>
|
24
24
|
|
25
|
-
<% if @order.all_adjustments.
|
26
|
-
<% @order.all_adjustments.
|
25
|
+
<% if @order.all_adjustments.tax.exists? %>
|
26
|
+
<% @order.all_adjustments.tax.group_by(&:label).each do |label, adjustments| %>
|
27
27
|
<%= t('spree.tax') %>: <%= label %> <%= Spree::Money.new(adjustments.sum(&:amount), currency: @order.currency) %>
|
28
28
|
<% end %>
|
29
29
|
<% end %>
|
30
30
|
|
31
|
-
<% @order.adjustments.
|
31
|
+
<% @order.adjustments.each do |adjustment| %>
|
32
32
|
<% next if (adjustment.source_type == 'Spree::TaxRate') and (adjustment.amount == 0) %>
|
33
33
|
<%= adjustment.label %> <%= adjustment.display_amount %>
|
34
34
|
<% end %>
|