X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main_county.pm;h=bb60abb45df761f98f783e0f7eaeb590951c0aa7;hb=ff8b81d2d58c38dc03684d97d64387693d753e72;hp=62dadadb7864c89bb5ba6d358fbafeb94bc341e3;hpb=812a61c2aea8a9afd53cbf5c245a8a9ddbf6fd33;p=freeside.git diff --git a/FS/FS/cust_main_county.pm b/FS/FS/cust_main_county.pm index 62dadadb7..bb60abb45 100644 --- a/FS/FS/cust_main_county.pm +++ b/FS/FS/cust_main_county.pm @@ -198,16 +198,23 @@ sub _list_sql { map $_->[0], @{ $sth->fetchall_arrayref }; } -=item taxline CUST_BILL_PKG, ... +=item taxline TAXABLES_ARRAYREF, [ OPTION => VALUE ... ] 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_ARRAYREF. Returns a scalar error +message on error. + +Options include custnum and invoice_date and are hints to this method =cut sub taxline { - my $self = shift; + my( $self, $taxables, %opt ) = @_; + 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 +229,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 +250,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 +264,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 +290,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 +299,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 +318,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 #++ @@ -327,7 +351,12 @@ sub taxline { } $dbh->commit or die $dbh->errstr if $oldAutoCommit; - return [ $name, $amount ] + + return { + 'name' => $name, + 'amount' => $amount, + }; + } =back