Taxe Rate: Use same rounding strategy as Stripe for tax amounts #245
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
When computing taxes, Stripe uses the 'commercial round' strategy, meaning that
0.5 will be rounded to 1 (when rounding to an integer) as stated here:
https://docs.stripe.com/billing/taxes/tax-rates#rounding
Localstripe behaves differently, because to achieve rounding it casts the
resulting
float
to anint
with the line:'amount': int(amount * self.percentage / 100.0)
But casting to an
int
doesn't use the same rounding strategy, indeed thePython documentation says:
So this effectively rounds 0.5 to 0, which is different from Stripe behavior.
This actually cause some computation differences for some combinations of tax
rate and amount, so let's update _tax_amount rounding strategy to use the same
one as Stripe.
WARNING: This is a breaking change as it will change the computed total of an
invoice in some scenarios.
Side note: I made sure that this change doesn't break our internal
11*
test suit