[freeside-commits] freeside/FS/FS cust_bill_pkg.pm, 1.29, 1.30 cust_main.pm, 1.392, 1.393 cust_main_county.pm, 1.21, 1.22

Jeff Finucane,420,, jeff at wavetail.420.am
Wed Dec 24 16:45:59 PST 2008


Update of /home/cvs/cvsroot/freeside/FS/FS
In directory wavetail.420.am:/tmp/cvs-serv12862/FS/FS

Modified Files:
	cust_bill_pkg.pm cust_main.pm cust_main_county.pm 
Log Message:
fix "texas tax" in 1.9

Index: cust_main_county.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_main_county.pm,v
retrieving revision 1.21
retrieving revision 1.22
diff -u -d -r1.21 -r1.22
--- cust_main_county.pm	5 Dec 2008 04:20:09 -0000	1.21
+++ cust_main_county.pm	25 Dec 2008 00:45:57 -0000	1.22
@@ -198,16 +198,34 @@
   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 @@
   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 @@
     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 @@
       #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 @@
           return "fatal: can't lookup exising exemption: ". dbh->errstr;
         };
         $sth->execute(
-          $cust_bill->custnum,
+          $custnum,
           $self->taxnum,
           1900+$year,
           $mon,
@@ -289,6 +310,15 @@
           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 @@
           $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
 
         #++

Index: cust_bill_pkg.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_bill_pkg.pm,v
retrieving revision 1.29
retrieving revision 1.30
diff -u -d -r1.29 -r1.30
--- cust_bill_pkg.pm	8 Dec 2008 10:13:12 -0000	1.29
+++ cust_bill_pkg.pm	25 Dec 2008 00:45:57 -0000	1.30
@@ -11,6 +11,7 @@
 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 @@
     }
   }
 
+  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 @@
 
 }
 
+# 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
 

Index: cust_main.pm
===================================================================
RCS file: /home/cvs/cvsroot/freeside/FS/FS/cust_main.pm,v
retrieving revision 1.392
retrieving revision 1.393
diff -u -d -r1.392 -r1.393
--- cust_main.pm	23 Dec 2008 21:41:09 -0000	1.392
+++ cust_main.pm	25 Dec 2008 00:45:57 -0000	1.393
@@ -2100,6 +2100,7 @@
     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 @@
   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 @@
   
   }
 
+  #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 @@
     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 @@
   #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;



More information about the freeside-commits mailing list