From: jeff Date: Thu, 25 Dec 2008 00:45:57 +0000 (+0000) Subject: fix "texas tax" in 1.9 X-Git-Tag: root_of_webpay_support~175 X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=a96ddd777a87c2f74a9cf408b44d0f6e7347b5f3 fix "texas tax" in 1.9 --- diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm index 1629b79f5..4e7141b52 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 a41415b6b..0d9f95e9c 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 62dadadb7..edf57ab2f 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 #++