[BACK]Return to rt_invoices.pl CVS log [TXT][DIR] Up to [local] / RT / Invoicing

Diff for /RT/Invoicing/rt_invoices.pl between version 1.24 and 1.25

version 1.24, 2011/04/12 20:32:15 version 1.25, 2011/04/19 04:18:13
Line 1 
Line 1 
 #!/usr/bin/perl  #!/usr/bin/perl
 # $AFresh1: rt_invoices.pl,v 1.23 2011/04/08 18:00:16 andrew Exp $  # $AFresh1: rt_invoices.pl,v 1.24 2011/04/12 19:32:15 andrew Exp $
 ########################################################################  ########################################################################
 # Copyright (c) 2011 Andrew Fresh <andrew@afresh1.com>  # Copyright (c) 2011 Andrew Fresh <andrew@afresh1.com>
 #  #
Line 46 
Line 46 
 my $startdate;  my $startdate;
   
 my $customers = $config->get('customers');  my $customers = $config->get('customers');
 while ( my ( $custid, $cust ) = each %{$customers} ) {  
     $cust->{id} = $custid;  
   
     if ( my $invoice = make_invoice($cust) ) {  
         $cust->{invoice} = $invoice;  
     }  
 }  
   
 my @limits = map +{  my @limits = map +{
     attribute  => 'status',      attribute  => 'status',
     operator   => '=',      operator   => '=',
Line 83 
Line 76 
   
 my $iterator = $results->get_iterator;  my $iterator = $results->get_iterator;
 while ( my $ticket = &$iterator ) {  while ( my $ticket = &$iterator ) {
     my $cust = find_customer_for_ticket( $customers, $ticket );      my $cust = find_customer_for_ticket( $ticket );
     if ( !$cust ) {      if ( !$cust ) {
         warn "No customer found for ticket " . $ticket->id;          warn "No customer found for ticket " . $ticket->id;
         next;          next;
     }      }
     if ( !$cust->{invoice} ) {  
         say "$cust->{id} has no open invoices [" . $ticket->id . ']';      say 'Ticket ' . $ticket->id . " belongs to $cust->{id}";
   
       $cust->{invoice} ||= make_invoice($cust);
       if ( !$cust->{invoice}->{end} ) {
           say "  $cust->{id} has no open invoices [" . $ticket->id . ']';
         next;          next;
     }      }
     say 'Giving ticket ' . $ticket->id . " to $cust->{id}";  
     my $invoice = $cust->{invoice};  
   
     my $project = make_project( $ticket, $cust );      my $project = make_project( $ticket, $cust );
     next unless @{ $project->{fees} } || @{ $project->{expenses} };      next unless @{ $project->{fees} } || @{ $project->{expenses} };
   
     foreach my $fee ( @{ $project->{fees} } ) {      foreach my $fee ( @{ $project->{fees} } ) {
         my $hours = hours_for_date( $invoice, $fee->{date} );          my $hours = hours_for_date( $cust->{invoice}, $fee->{date} );
   
         my $h_type          my $h_type
             = exists $hours->{ $fee->{type} }              = exists $hours->{ $fee->{type} }
Line 119 
Line 114 
         }          }
   
         if ($discount_time) {          if ($discount_time) {
             $invoice->{discount}{amount}              $cust->{invoice}->{discount}->{amount}
                 += round( $discount_time * $fee->{rate} );                  += round( $discount_time * $fee->{rate} );
             $invoice->{discount}{hours}{$h_type} += $discount_time;              $cust->{invoice}->{discount}->{hours}{$h_type} += $discount_time;
   
             $h_type = '' if $h_type eq 'default';              $h_type = '' if $h_type eq 'default';
             $fee->{detail} = "$discount_time $h_type Hours Discounted";              $fee->{detail} = "$discount_time $h_type Hours Discounted";
         }          }
     }      }
   
     push @{ $invoice->{projects} }, $project;      push @{ $cust->{invoice}->{projects} }, $project;
 }  }
   
 while ( my ( $custid, $cust ) = each %{$customers} ) {  foreach my $cust ( @{$customers} ) {
     my $invoice = $cust->{invoice};      my $invoice = $cust->{invoice};
     next unless $invoice->{projects} && @{ $invoice->{projects} };      next unless $invoice && $invoice->{projects} && @{ $invoice->{projects} };
   
     my %li = ( custid => $custid, invdate => DateTime->now->ymd, );      my %li = ( custid => $cust->{id}, invdate => DateTime->now->ymd, );
   
     foreach my $project ( @{ $invoice->{projects} } ) {      foreach my $project ( @{ $invoice->{projects} } ) {
         if ( $project->{transactions} ) {          if ( $project->{transactions} ) {
Line 178 
Line 173 
   
     $invoice->{organization} = $from->{organization} || $from->{name};      $invoice->{organization} = $from->{organization} || $from->{name};
     $invoice->{from}         = make_address($from);      $invoice->{from}         = make_address($from);
     $invoice->{to}           = make_address( $cust->{address} || $custid );      $invoice->{to}           = make_address( $cust->{address} || $cust->{id} );
   
     $state->{lastinvoice}++;      $state->{lastinvoice}++;
     $invoice->{id} = $state->{lastinvoice};      $invoice->{id} = $state->{lastinvoice};
Line 218 
Line 213 
     $tt->process( $config->get('invoice_template'), $invoice, $file )      $tt->process( $config->get('invoice_template'), $invoice, $file )
         or die $tt->error . "\n";          or die $tt->error . "\n";
   
     printf "Generated %s for %s: \$%.02f\n", $invoice->{file}, $custid,      printf "Generated %s for %s: \$%.02f\n", $invoice->{file}, $cust->{id},
         $invoice->{total};          $invoice->{total};
 }  }
   
Line 233 
Line 228 
 }  }
   
 sub find_customer_for_ticket {  sub find_customer_for_ticket {
     my ( $customers, $ticket ) = @_;      my ($ticket) = @_;
   
     foreach my $cust ( values %{$customers} ) {      foreach my $cust ( @{$customers} ) {
         next unless $cust->{match};          next unless $cust->{match};
         foreach my $m ( @{ $cust->{match} } ) {          foreach my $m ( @{ $cust->{match} } ) {
             my $type = $m->{type};              my $type = $m->{type};
Line 250 
Line 245 
         }          }
     }      }
   
     return fake_customer( $customers, $ticket );      # Fake customer if we didn't find one
 }  
   
 sub fake_customer {  
     my ( $customers, $ticket ) = @_;  
   
     my $cust = $config->get('default') || {};      my $cust = $config->get('default') || {};
   
     ( $cust->{id} ) = $ticket->requestors;      ( $cust->{id} ) = $ticket->requestors;
     return unless $cust->{id};      return unless $cust->{id};
       push @{$customers}, $cust;
   
     $cust->{match} = [      $cust->{match} = [
         {   type  => 'requestors',          {   type  => 'requestors',
Line 267 
Line 258 
         }          }
     ];      ];
   
     if ( my $invoice = make_invoice($cust) ) {  
         $cust->{invoice} = $invoice;  
     }  
   
     $customers->{ $cust->{id} } = $cust;  
     return $cust;      return $cust;
 }  }
   
Line 348 
Line 334 
   
     # Is the start date more than $freq $per before the end date?      # Is the start date more than $freq $per before the end date?
     my $diff = $billends - $date;      my $diff = $billends - $date;
     return if $diff->in_units($per) < 1;      return {} if $diff->in_units($per) < 1;
   
     if ( $cust->{base_rate} ) {      if ( $cust->{base_rate} ) {
         my ( $project, $hours ) = make_base_project(          my ( $project, $hours ) = make_base_project(
Line 376 
Line 362 
         ];          ];
     }      }
   
     return if $invoice{start} && $invoice{end} < $invoice{start};      return {} if $invoice{start} && $invoice{end} < $invoice{start};
   
     return \%invoice;      return \%invoice;
 }  }
Line 608 
Line 594 
   
     my $c = LoadFile($file) or die "Unable to load $file\n";      my $c = LoadFile($file) or die "Unable to load $file\n";
   
     $c->{customers} ||= {};      $c->{customers} ||= [];
     if ( $c->{default} ) {      if ( $c->{default} ) {
         foreach my $cust ( values %{ $c->{customers} } ) {          foreach my $cust ( @{ $c->{customers} } ) {
             foreach my $k ( keys %{ $c->{default} } ) {              foreach my $k ( keys %{ $c->{default} } ) {
                 $cust->{$k} //= Load( Dump( $c->{default}->{$k} ) );                  $cust->{$k} //= Load( Dump( $c->{default}->{$k} ) );
             }              }

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.25

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>