X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main_county.pm;h=e84fa98f9c2f837448d1cca64846e4545caac000;hb=387c96b0d8f224f3ade27bed9348f37b432bbb8a;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..e84fa98f9 100644 --- a/FS/FS/cust_main_county.pm +++ b/FS/FS/cust_main_county.pm @@ -2,7 +2,7 @@ package FS::cust_main_county; use strict; use vars qw( @ISA @EXPORT_OK $conf - @cust_main_county %cust_main_county $countyflag ); + @cust_main_county %cust_main_county $countyflag ); # $cityflag ); use Exporter; use FS::Record qw( qsearch dbh ); use FS::cust_bill_pkg; @@ -17,6 +17,7 @@ use FS::cust_tax_exempt_pkg; @cust_main_county = (); $countyflag = ''; +#$cityflag = ''; #ask FS::UID to run this stuff for us later $FS::UID::callback{'FS::cust_main_county'} = sub { @@ -55,10 +56,12 @@ currently supported: =item taxnum - primary key (assigned automatically for new tax rates) -=item state +=item city =item county +=item state + =item country =item tax - percentage @@ -116,8 +119,9 @@ sub check { $self->exempt_amount(0) unless $self->exempt_amount; $self->ut_numbern('taxnum') - || $self->ut_anything('state') + || $self->ut_textn('city') || $self->ut_textn('county') + || $self->ut_anything('state') || $self->ut_text('country') || $self->ut_float('tax') || $self->ut_textn('taxclass') # ... @@ -198,16 +202,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 +233,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,9 +254,12 @@ 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; + my $freq = $cust_bill_pkg->freq; + unless ($freq) { + $freq = $part_pkg->freq || 1; # less trustworthy fallback + } if ( $freq !~ /(\d+)$/ ) { $dbh->rollback if $oldAutoCommit; return "daily/weekly package definitions not (yet?)". @@ -254,7 +271,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 +297,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 +306,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 +325,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 +358,12 @@ sub taxline { } $dbh->commit or die $dbh->errstr if $oldAutoCommit; - return [ $name, $amount ] + + return { + 'name' => $name, + 'amount' => $amount, + }; + } =back