=================================================================== RCS file: /cvs/RT/Invoicing/rt_invoices.pl,v retrieving revision 1.43 retrieving revision 1.44 diff -u -r1.43 -r1.44 --- RT/Invoicing/rt_invoices.pl 2011/12/30 03:30:51 1.43 +++ RT/Invoicing/rt_invoices.pl 2011/12/30 05:01:41 1.44 @@ -1,5 +1,5 @@ #!/usr/bin/perl -# $AFresh1: rt_invoices.pl,v 1.42 2011/12/30 03:20:45 andrew Exp $ +# $AFresh1: rt_invoices.pl,v 1.43 2011/12/30 03:30:51 andrew Exp $ ######################################################################## # Copyright (c) 2011 Andrew Fresh # @@ -85,12 +85,10 @@ next if $cust->{no_invoice}; $cust->{invoice} ||= make_invoice($cust); - if ( !$cust->{invoice} ) { - $cust->{no_invoice} = 1; - say "$cust->{id} has no open invoices [" . $ticket->id . ']'; - next; - } + die "$cust->{id} has no open invoices [" . $ticket->id . ']' + unless $cust->{invoice}; + say 'Ticket ' . $ticket->id . " belongs to $cust->{id}"; my $project = make_project( $ticket, $cust ); @@ -133,6 +131,54 @@ push @{ $cust->{invoice}->{projects} }, $project; } + +if ( my $unpaid_invoices = $state->unpaid_invoices() ) { + foreach my $custid ( keys %{$unpaid_invoices} ) { + my %project = ( title => 'Unpaid Invoices', fees => [], ); + my $past_due = 0; + + my $cust; + foreach ( @{$customers} ) { + if ( $_->{id} eq $custid ) { + $cust = $_; + last; + } + } + $cust ||= fake_customer($custid); + + foreach my $id ( sort { $a <=> $b } + keys %{ $unpaid_invoices->{$custid} } ) + { + my $unpaid = $state->get_invoice($id); + my $invdate = ymd_to_DateTime( $unpaid->{invdate} ); + + next + if $cust->{duedate} + && DateTime->compare( $invdate, $cust->{duedate} ) > 0; + + $past_due += $unpaid_invoices->{$custid}->{$id}; + push @{ $project{fees} }, + { + id => $id, + contents => + sprintf( "Invoice %06d from %s", $id, $invdate->ymd ), + count => 1, + rate => $unpaid_invoices->{$custid}->{$id}, + }; + } + + if ($past_due) { + $cust->{invoice} ||= make_invoice(); + + $cust->{invoice}->{past_due} = $past_due; + $cust->{invoice}->{total_due} + = $cust->{invoice}->{total} + $past_due; + + unshift @{ $cust->{invoice}->{projects} }, \%project; + } + } +} + foreach my $cust ( @{$customers} ) { my $invoice = $cust->{invoice}; next unless $invoice && $invoice->{projects} && @{ $invoice->{projects} }; @@ -172,37 +218,6 @@ $invoice->{total} -= round( $invoice->{discount}{amount} ); } - if ( my $unpaid_invoices = $state->unpaid_invoices( $cust->{id} ) ) { - my %project = ( title => 'Unpaid Invoices', fees => [], ); - my $past_due = 0; - - foreach my $id ( sort { $a <=> $b } keys %{$unpaid_invoices} ) { - my $unpaid = $state->get_invoice($id); - my $invdate = ymd_to_DateTime( $unpaid->{invdate} ); - - next - if $cust->{duedate} - && DateTime->compare( $invdate, $cust->{duedate} ) > 0; - - $past_due += $unpaid_invoices->{$id}; - push @{ $project{fees} }, - { - id => $id, - contents => - sprintf( "Invoice %06d from %s", $id, $invdate->ymd ), - count => 1, - rate => $unpaid_invoices->{$id}, - }; - } - - if ($past_due) { - $invoice->{past_due} = $past_due; - $invoice->{total_due} = $invoice->{total} + $invoice->{past_due}; - - unshift @{ $invoice->{projects} }, \%project; - } - } - next unless $invoice->{total} > 0 || $invoice->{total_due}; $invoice->{info} = $config->get('info'); @@ -271,13 +286,17 @@ } } - # Fake customer if we didn't find one - my $cust = $config->new_customer; + return fake_customer($ticket->requestors); +} - ( $cust->{id} ) = $ticket->requestors; - return unless $cust->{id}; +sub fake_customer { + my ($custid) = @_; + return unless $custid; + + my $cust = $config->new_customer; push @{$customers}, $cust; + $cust->{id} = $custid; $cust->{match} = [ { type => 'requestors', regex => $cust->{id}, @@ -324,15 +343,10 @@ sub make_invoice { my ($cust) = @_; - return if $cust->{no_invoice}; - return unless $cust->{billstart}; - my %invoice = ( end => $cust->{billend}->clone->subtract( seconds => 1 ) ); $invoice{start} = $cust->{startinvoicedate}->clone if $cust->{startinvoicedate}; - - return if $invoice{start} && $invoice{start} > $invoice{end}; if ( $cust->{base_rate} ) { my ( $project, $hours ) = make_base_project($cust);