summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/cust_bill_pkg.pm23
-rw-r--r--FS/FS/cust_main.pm26
-rw-r--r--FS/FS/cust_main_county.pm63
3 files changed, 95 insertions, 17 deletions
diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm
index 1629b79..4e7141b 100644
--- a/FS/FS/cust_bill_pkg.pm
+++ b/FS/FS/cust_bill_pkg.pm
@@ -11,6 +11,7 @@ use FS::cust_bill_pkg_detail;
use FS::cust_bill_pkg_display;
use FS::cust_bill_pay_pkg;
use FS::cust_credit_bill_pkg;
+use FS::cust_tax_exempt_pkg;
@ISA = qw( FS::cust_main_Mixin FS::Record );
@@ -140,6 +141,17 @@ sub insert {
}
}
+ if ( $self->_cust_tax_exempt_pkg ) {
+ foreach my $cust_tax_exempt_pkg ( @{$self->_cust_tax_exempt_pkg} ) {
+ $cust_tax_exempt_pkg->billpkgnum($self->billpkgnum);
+ $error = $cust_tax_exempt_pkg->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+ }
+
$dbh->commit or die $dbh->errstr if $oldAutoCommit;
'';
@@ -612,6 +624,17 @@ sub cust_bill_pkg_display {
}
+# reserving this name for my friends FS::{tax_rate|cust_main_county}::taxline
+# and FS::cust_main::bill
+
+sub _cust_tax_exempt_pkg {
+ my ( $self ) = @_;
+
+ $self->{Hash}->{_cust_tax_exempt_pkg} or
+ $self->{Hash}->{_cust_tax_exempt_pkg} = [];
+
+}
+
=back
diff --git a/FS/FS/cust_main.pm b/FS/FS/cust_main.pm
index a41415b..0d9f95e 100644
--- a/FS/FS/cust_main.pm
+++ b/FS/FS/cust_main.pm
@@ -2100,6 +2100,7 @@ sub bill {
if $DEBUG;
my $time = $options{'time'} || time;
+ my $invoice_time = $options{'invoice_time'} || $time;
#put below somehow?
local $SIG{HUP} = 'IGNORE';
@@ -2210,7 +2211,11 @@ sub bill {
foreach my $tax ( keys %taxlisthash ) {
my $tax_object = shift @{ $taxlisthash{$tax} };
warn "found ". $tax_object->taxname. " as $tax\n" if $DEBUG > 2;
- my $listref_or_error = $tax_object->taxline( @{ $taxlisthash{$tax} } );
+ my $listref_or_error =
+ $tax_object->taxline( $taxlisthash{$tax},
+ 'custnum' => $self->custnum,
+ 'invoice_time' => $invoice_time
+ );
unless (ref($listref_or_error)) {
$dbh->rollback if $oldAutoCommit;
return $listref_or_error;
@@ -2229,6 +2234,17 @@ sub bill {
}
+ #move the cust_tax_exempt_pkg records to the cust_bill_pkgs we will commit
+ my %packagemap = map { $_->pkgnum => $_ } @cust_bill_pkg;
+ foreach my $tax ( keys %taxlisthash ) {
+ foreach ( @{ $taxlisthash{$tax} }[1 ... scalar(@{ $taxlisthash{$tax} })] ) {
+ next unless ref($_) eq 'FS::cust_bill_pkg'; # shouldn't happen
+
+ push @{ $packagemap{$_->pkgnum}->_cust_tax_exempt_pkg },
+ splice( @{ $_->_cust_tax_exempt_pkg } );
+ }
+ }
+
#some taxes are taxed
my %totlisthash;
@@ -2260,7 +2276,11 @@ sub bill {
my $tax_object = shift @{ $totlisthash{$tax} };
warn "found previously found taxed tax ". $tax_object->taxname. "\n"
if $DEBUG > 2;
- my $listref_or_error = $tax_object->taxline( @{ $totlisthash{$tax} } );
+ my $listref_or_error =
+ $tax_object->taxline( $totlisthash{$tax},
+ 'custnum' => $self->custnum,
+ 'invoice_time' => $invoice_time
+ );
unless (ref($listref_or_error)) {
$dbh->rollback if $oldAutoCommit;
return $listref_or_error;
@@ -2304,7 +2324,7 @@ sub bill {
#create the new invoice
my $cust_bill = new FS::cust_bill ( {
'custnum' => $self->custnum,
- '_date' => ( $options{'invoice_time'} || $time ),
+ '_date' => ( $invoice_time ),
'charged' => $charged,
} );
my $error = $cust_bill->insert;
diff --git a/FS/FS/cust_main_county.pm b/FS/FS/cust_main_county.pm
index 62dadad..edf57ab 100644
--- a/FS/FS/cust_main_county.pm
+++ b/FS/FS/cust_main_county.pm
@@ -198,16 +198,34 @@ sub _list_sql {
map $_->[0], @{ $sth->fetchall_arrayref };
}
-=item taxline CUST_BILL_PKG, ...
+=item taxline TAXABLES, [ OPTIONSHASH ]
Returns a listref of a name and an amount of tax calculated for the list of
-packages. Returns a scalar error message on error.
+packages or amounts referenced by TAXABLES. Returns a scalar error message
+on error.
+
+OPTIONSHASH includes custnum and invoice_date and are hints to this method
=cut
sub taxline {
my $self = shift;
+ my $taxables;
+ my %opt = ();
+
+ if (ref($_[0]) eq 'ARRAY') {
+ $taxables = shift;
+ %opt = @_;
+ }else{
+ $taxables = [ @_ ];
+ # exemptions broken in this case
+ }
+
+ my @exemptions = ();
+ push @exemptions, @{ $_->_cust_tax_exempt_pkg }
+ for grep { ref($_) } @$taxables;
+
local $SIG{HUP} = 'IGNORE';
local $SIG{INT} = 'IGNORE';
local $SIG{QUIT} = 'IGNORE';
@@ -222,10 +240,13 @@ sub taxline {
my $name = $self->taxname || 'Tax';
my $amount = 0;
- foreach my $cust_bill_pkg (@_) {
+ foreach my $cust_bill_pkg (@$taxables) {
- my $cust_bill = $cust_bill_pkg->cust_pkg->cust_bill;
- my $part_pkg = $cust_bill_pkg->part_pkg;
+ my $cust_pkg = $cust_bill_pkg->cust_pkg;
+ my $cust_bill = $cust_pkg->cust_bill if $cust_pkg;
+ my $custnum = $cust_pkg ? $cust_pkg->custnum : $opt{custnum};
+ my $part_pkg = $cust_bill_pkg->part_pkg;
+ my $invoice_date = $cust_bill ? $cust_bill->_date : $opt{invoice_date};
my $taxable_charged = 0;
$taxable_charged += $cust_bill_pkg->setup
@@ -240,7 +261,7 @@ sub taxline {
if ( $self->exempt_amount && $self->exempt_amount > 0 ) {
#my ($mon,$year) = (localtime($cust_bill_pkg->sdate) )[4,5];
my ($mon,$year) =
- (localtime( $cust_bill_pkg->sdate || $cust_bill->_date ) )[4,5];
+ (localtime( $cust_bill_pkg->sdate || $invoice_date ) )[4,5];
$mon++;
my $freq = $part_pkg->freq || 1;
if ( $freq !~ /(\d+)$/ ) {
@@ -254,7 +275,7 @@ sub taxline {
#call the whole thing off if this customer has any old
#exemption records...
my @cust_tax_exempt =
- qsearch( 'cust_tax_exempt' => { custnum=> $cust_bill->custnum } );
+ qsearch( 'cust_tax_exempt' => { custnum=> $custnum } );
if ( @cust_tax_exempt ) {
$dbh->rollback if $oldAutoCommit;
return
@@ -280,7 +301,7 @@ sub taxline {
return "fatal: can't lookup exising exemption: ". dbh->errstr;
};
$sth->execute(
- $cust_bill->custnum,
+ $custnum,
$self->taxnum,
1900+$year,
$mon,
@@ -289,6 +310,15 @@ sub taxline {
return "fatal: can't lookup exising exemption: ". dbh->errstr;
};
my $existing_exemption = $sth->fetchrow_arrayref->[0] || 0;
+
+ foreach ( grep { $_->taxnum == $self->taxnum &&
+ $_->month == $mon &&
+ $_->year == 1900+$year
+ } @exemptions
+ )
+ {
+ $existing_exemption += $_->amount;
+ }
my $remaining_exemption =
$self->exempt_amount - $existing_exemption;
@@ -299,17 +329,22 @@ sub taxline {
$taxable_charged -= $addl;
my $cust_tax_exempt_pkg = new FS::cust_tax_exempt_pkg ( {
- 'billpkgnum' => $cust_bill_pkg->billpkgnum,
'taxnum' => $self->taxnum,
'year' => 1900+$year,
'month' => $mon,
'amount' => sprintf("%.2f", $addl ),
} );
- my $error = $cust_tax_exempt_pkg->insert;
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return "fatal: can't insert cust_tax_exempt_pkg: $error";
- }
+ if ($cust_bill_pkg->billpkgnum) {
+ $cust_tax_exempt_pkg->billpkgnum($cust_bill_pkg->billpkgnum);
+ my $error = $cust_tax_exempt_pkg->insert;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "fatal: can't insert cust_tax_exempt_pkg: $error";
+ }
+ }else{
+ push @exemptions, $cust_tax_exempt_pkg;
+ push @{ $cust_bill_pkg->_cust_tax_exempt_pkg }, $cust_tax_exempt_pkg;
+ } # if $cust_bill_pkg->billpkgnum
} # if $remaining_exemption > 0
#++