summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Wells <mark@freeside.biz>2015-02-19 15:45:22 -0800
committerMark Wells <mark@freeside.biz>2015-02-19 15:45:22 -0800
commit428a33ad6d0e01621717840d2db4861f4bee6c21 (patch)
treee28dba39c699109a9a4f92f463fce606b47da98c
parent76a1482705a98e2bbec4ed1e44a50ab01dee8b03 (diff)
fix problems with tax calculation, #33587, from #18509
-rw-r--r--FS/FS/cust_bill_pkg.pm11
-rw-r--r--FS/FS/cust_main_county.pm7
-rw-r--r--FS/FS/tax_rate.pm6
3 files changed, 17 insertions, 7 deletions
diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm
index 13f027b07..2aa2a6fab 100644
--- a/FS/FS/cust_bill_pkg.pm
+++ b/FS/FS/cust_bill_pkg.pm
@@ -954,6 +954,7 @@ sub disintegrate {
my $usage_total;
foreach my $classnum ($self->usage_classes) {
+ next if $classnum eq ''; # null-class usage is included in 'recur'
my $amount = $self->usage($classnum);
next if $amount == 0; # though if so we shouldn't be here
my $usage_item = FS::cust_bill_pkg->new({
@@ -1013,7 +1014,11 @@ sub usage {
my $sql = 'SELECT SUM(COALESCE(amount,0)) FROM cust_bill_pkg_detail '.
' WHERE billpkgnum = '. $self->billpkgnum;
- $sql .= " AND classnum = $classnum" if defined($classnum);
+ if ($classnum =~ /^(\d+)$/) {
+ $sql .= " AND classnum = $1";
+ } elsif (defined($classnum) and $classnum eq '') {
+ $sql .= " AND classnum IS NULL";
+ }
my $sth = dbh->prepare($sql) or die dbh->errstr;
$sth->execute or die $sth->errstr;
@@ -1128,7 +1133,7 @@ sub tax_locationnum {
my $self = shift;
if ( $self->pkgnum ) { # normal sales
return $self->cust_pkg->tax_locationnum;
- } elsif ( $self->feepart ) { # fees
+ } elsif ( $self->feepart and $self->invnum ) { # fees
return $self->cust_bill->cust_main->ship_locationnum;
} else { # taxes
return '';
@@ -1139,7 +1144,7 @@ sub tax_location {
my $self = shift;
if ( $self->pkgnum ) { # normal sales
return $self->cust_pkg->tax_location;
- } elsif ( $self->feepart ) { # fees
+ } elsif ( $self->feepart and $self->invnum ) { # fees
return $self->cust_bill->cust_main->ship_location;
} else { # taxes
return;
diff --git a/FS/FS/cust_main_county.pm b/FS/FS/cust_main_county.pm
index d9cd634d2..6d1ce77fd 100644
--- a/FS/FS/cust_main_county.pm
+++ b/FS/FS/cust_main_county.pm
@@ -309,8 +309,11 @@ sub taxline {
# pertain to this tax def
$taxable_charged -= $_->amount;
}
-
- my $locationnum = $cust_bill_pkg->tax_locationnum;
+
+ # can't determine the tax_locationnum directly for fees; they're not
+ # yet linked to an invoice
+ my $locationnum = $cust_bill_pkg->tax_locationnum
+ || $cust_main->ship_locationnum;
### Monthly capped exemptions ###
if ( $self->exempt_amount && $self->exempt_amount > 0
diff --git a/FS/FS/tax_rate.pm b/FS/FS/tax_rate.pm
index ab1a69eab..12a3e987f 100644
--- a/FS/FS/tax_rate.pm
+++ b/FS/FS/tax_rate.pm
@@ -575,9 +575,11 @@ sub taxline {
} elsif ( $self->unittype == 2 ) {
+ my $locationnum = $cust_bill_pkg->tax_locationnum
+ || $cust_main->ship_locationnum;
# per account
- $units = 1 unless $seen{$cust_bill_pkg->tax_locationnum};
- $seen{$cust_bill_pkg->tax_locationnum} = 1;
+ $units = 1 unless $seen{$locationnum};
+ $seen{$locationnum} = 1;
} else {
# Unittype 19 is used for prepaid wireless E911 charges in many states.