diff options
| -rw-r--r-- | FS/FS/cust_bill_pkg.pm | 23 | ||||
| -rw-r--r-- | FS/FS/cust_main.pm | 26 | ||||
| -rw-r--r-- | FS/FS/cust_main_county.pm | 63 | 
3 files changed, 95 insertions, 17 deletions
| 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          #++ | 
