From 4b5d6d7eacc13d69025f05bf70f63e18bd126cdd Mon Sep 17 00:00:00 2001 From: Gaetan Craig-Riou Date: Tue, 4 Apr 2023 11:09:05 +1000 Subject: [PATCH] Fix voucher adjustments association Add missing, "inverse_of" and "dependent" options. Use :nullify as for "dependent" because we would want to keep the adjustments on order even if the voucher is deleted. --- app/models/spree/adjustment.rb | 2 ++ app/models/voucher.rb | 7 ++++++- spec/models/spree/adjustment_spec.rb | 1 + 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/app/models/spree/adjustment.rb b/app/models/spree/adjustment.rb index 06131597db..27adcbac42 100644 --- a/app/models/spree/adjustment.rb +++ b/app/models/spree/adjustment.rb @@ -44,6 +44,8 @@ module Spree belongs_to :tax_rate, -> { where spree_adjustments: { originator_type: 'Spree::TaxRate' } }, foreign_key: 'originator_id' + belongs_to :voucher, -> { where spree_adjustments: { originator_type: 'Spree::Voucher' } }, + foreign_key: 'originator_id', inverse_of: :adjustments validates :label, presence: true validates :amount, numericality: true diff --git a/app/models/voucher.rb b/app/models/voucher.rb index 6522305857..581b6ce707 100644 --- a/app/models/voucher.rb +++ b/app/models/voucher.rb @@ -7,7 +7,8 @@ class Voucher < ApplicationRecord belongs_to :enterprise - has_many :adjustments, as: :originator, class_name: 'Spree::Adjustment' + has_many :adjustments, as: :originator, class_name: 'Spree::Adjustment', inverse_of: :voucher, + dependent: :nullify validates :code, presence: true, uniqueness: { scope: :enterprise_id } @@ -91,6 +92,8 @@ class Voucher < ApplicationRecord # override the one from CalculatedAdjustments # Create an "open" adjustment which will be updated later once tax and other fees have # been applied to the order + # + # rubocop:disable Style/OptionalBooleanParameter def create_adjustment(label, order, mandatory = false, _state = "open", tax_category = nil) amount = compute_amount(order) @@ -106,11 +109,13 @@ class Voucher < ApplicationRecord order.adjustments.create(adjustment_attributes) end + # rubocop:enable Style/OptionalBooleanParameter # override the one from CalculatedAdjustments so we limit adjustment to the maximum amount # needed to cover the order, ie if the voucher covers more than the order.total we only need # to create an adjustment covering the order.total # Doesn't work with taxes for now + # TODO move this to a calculator def compute_amount(order) amount = calculator.compute(order) diff --git a/spec/models/spree/adjustment_spec.rb b/spec/models/spree/adjustment_spec.rb index 927eb7d14c..bbe7b8f245 100644 --- a/spec/models/spree/adjustment_spec.rb +++ b/spec/models/spree/adjustment_spec.rb @@ -18,6 +18,7 @@ module Spree it { is_expected.to belong_to(:order) } it { is_expected.to belong_to(:tax_category) } it { is_expected.to belong_to(:tax_rate) } + it { is_expected.to belong_to(:voucher) } end describe "scopes" do