Skip to content

Commit

Permalink
Fix creating refund with amount in foreign format
Browse files Browse the repository at this point in the history
The numericality validation in rails cannot handle prices
in non-float based amounts (Ie. 100,00 EUR).

Using `Spree::LocalizedNumber` to convert the amount before validation.
  • Loading branch information
tvdeyen committed Apr 21, 2022
1 parent a137ae1 commit 0a32a6e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 0 deletions.
8 changes: 8 additions & 0 deletions core/app/models/spree/refund.rb
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,14 @@ def total_amount_reimbursed_for(reimbursement)
end
end

# Sets this price's amount to a new value, parsing it if the new value is
# a string.
#
# @param price [String, #to_d] a new amount
def amount=(price)
self[:amount] = Spree::LocalizedNumber.parse(price)
end

def description
payment.payment_method.name
end
Expand Down
15 changes: 15 additions & 0 deletions core/spec/models/spree/refund_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,21 @@
it "does not attempt to process a transaction" do
expect(subject.transaction_id).to be_nil
end

context "with a european price format" do
let(:amount) { "100,00" }
let(:payment_amount) { 200.0 }

before do
expect(I18n).to receive(:t).with(:'number.currency.format.separator') do
","
end
end

it "creates a refund record" do
expect { subject }.to change { Spree::Refund.count }.by(1)
end
end
end

describe "#perform!" do
Expand Down

0 comments on commit 0a32a6e

Please sign in to comment.