summaryrefslogtreecommitdiff
path: root/FS/FS/TaxEngine
diff options
context:
space:
mode:
Diffstat (limited to 'FS/FS/TaxEngine')
-rw-r--r--FS/FS/TaxEngine/internal.pm16
1 files changed, 9 insertions, 7 deletions
diff --git a/FS/FS/TaxEngine/internal.pm b/FS/FS/TaxEngine/internal.pm
index a9b32d133..db7010c18 100644
--- a/FS/FS/TaxEngine/internal.pm
+++ b/FS/FS/TaxEngine/internal.pm
@@ -66,7 +66,7 @@ sub taxline {
my $taxnum = $tax_object->taxnum;
my $exemptions = $self->{exemptions}->{$taxnum} ||= [];
- my $taxable_cents = 0;
+ my $taxable_total = 0;
my $tax_cents = 0;
my $round_per_line_item = $conf->exists('tax-round_per_line_item');
@@ -302,15 +302,17 @@ sub taxline {
});
push @tax_links, $location;
- $taxable_cents += $taxable_charged;
+ $taxable_total += $taxable_charged;
$tax_cents += $this_tax_cents;
} #foreach $cust_bill_pkg
- # calculate tax and rounding error for the whole group
- my $extra_cents = sprintf('%.2f', $taxable_cents * $tax_object->tax / 100)
- * 100 - $tax_cents;
- # make sure we have an integer
- $extra_cents = sprintf('%.0f', $extra_cents);
+ # calculate tax and rounding error for the whole group: total taxable
+ # amount times tax rate (as cents per dollar), minus the tax already
+ # charged
+ # and force 0.5 to round up
+ my $extra_cents = sprintf('%.0f',
+ ($taxable_total * $tax_object->tax) - $tax_cents + 0.00000001
+ );
# if we're rounding per item, then ignore that and don't distribute any
# extra cents.