-
- <%
- #get payment history
- my @history = ();
-
- #invoices
- foreach my $cust_bill ($cust_main->cust_bill) {
- my $pre = ( $cust_bill->owed > 0 )
- ? '<B><FONT SIZE="+1" COLOR="#FF0000">Open '
- : '';
- my $post = ( $cust_bill->owed > 0 ) ? '</FONT></B>' : '';
- my $invnum = $cust_bill->invnum;
- push @history, {
- 'date' => $cust_bill->_date,
- 'desc' => qq!<A HREF="${p}view/cust_bill.cgi?$invnum">!. $pre.
- "Invoice #$invnum (Balance \$". $cust_bill->owed. ')'.
- $post. '</A>',
- 'charge' => $cust_bill->charged,
- };
- }
-
- #payments (some false laziness w/credits)
- foreach my $cust_pay ($cust_main->cust_pay) {
-
- my $payby = $cust_pay->payby;
- my $payinfo = $cust_pay->payinfo;
- my @cust_bill_pay = $cust_pay->cust_bill_pay;
-
- $payinfo = 'x'x(length($payinfo)-4). substr($payinfo,(length($payinfo)-4))
- if $payby eq 'CARD';
- my $target = "$payby$payinfo";
- $payby =~ s/^BILL$/Check #/ if $payinfo;
- $payby =~ s/^BILL$//;
- $payby =~ s/^(CARD|COMP)$/$1 /;
- my $info = $payby ? " ($payby$payinfo)" : '';
-
- my( $pre, $post, $desc, $apply, $ext ) = ( '', '', '', '', '' );
- if ( scalar(@cust_bill_pay) == 0 ) {
- #completely unapplied
- $pre = '<B><FONT COLOR="#FF0000">Unapplied ';
- $post = '</FONT></B>';
- $apply = qq! (<A HREF="${p}edit/cust_bill_pay.cgi?!.
- $cust_pay->paynum. '">apply</A>)';
- } elsif ( scalar(@cust_bill_pay) == 1 && $cust_pay->unapplied == 0 ) {
- #applied to one invoice
- $desc = ' applied to Invoice #'. $cust_bill_pay[0]->invnum;
- } else {
- #complicated
- $desc = '<BR>';
- foreach my $cust_bill_pay (@cust_bill_pay) {
- $desc .= ' '.
- '$'. $cust_bill_pay->amount.
- ' applied to Invoice #'. $cust_bill_pay->invnum.
- '<BR>';
- #' on '. time2str("%D", $cust_bill_pay->_date).
-
- }
- if ( $cust_pay->unapplied > 0 ) {
- $desc .= ' '.
- '<B><FONT COLOR="#FF0000">$'.
- $cust_pay->unapplied. ' unapplied</FONT></B>'.
- qq! (<A HREF="${p}edit/cust_bill_pay.cgi?!.
- $cust_pay->paynum. '">apply</A>)'.
- '<BR>';
- }
- }
-
- my $delete = '';
- if ( $cust_pay->closed !~ /^Y/i && $conf->exists('deletepayments') ) {
- $delete = qq! (<A HREF="javascript:cust_pay_areyousure('!.
- qq!${p}misc/delete-cust_pay.cgi?!. $cust_pay->paynum.
- qq!')">delete</A>)!;
- }
-
- my $unapply = '';
- if ( $cust_pay->closed !~ /^Y/i
- && $conf->exists('unapplypayments')
- && scalar(@cust_bill_pay) ) {
- $unapply = qq! (<A HREF="javascript:cust_pay_unapply_areyousure('!.
- qq!${p}misc/unapply-cust_pay.cgi?!. $cust_pay->paynum.
- qq!')">unapply</A>)!;
- }
-
- push @history, {
- 'date' => $cust_pay->_date,
- 'desc' => $pre. "Payment$post$info$desc".
- "$apply$delete$unapply",
- 'payment' => $cust_pay->paid,
- 'target' => $target,
- };
- }
-
- #credits (some false laziness w/payments)
- foreach my $cust_credit ($cust_main->cust_credit) {
-
- my @cust_credit_bill = $cust_credit->cust_credit_bill;
- my @cust_credit_refund = $cust_credit->cust_credit_refund;
-
- my( $pre, $post, $desc, $apply, $ext ) = ( '', '', '', '', '' );
- if ( scalar(@cust_credit_bill) == 0
- && scalar(@cust_credit_refund) == 0 ) {
- #completely unapplied
- $pre = '<B><FONT COLOR="#FF0000">Unapplied ';
- $post = '</FONT></B>';
- $apply = qq! (<A HREF="${p}edit/cust_credit_bill.cgi?!.
- $cust_credit->crednum. '">apply</A>)';
- } elsif ( scalar(@cust_credit_bill) == 1
- && scalar(@cust_credit_refund) == 0
- && $cust_credit->credited == 0 ) {
- #applied to one invoice
- $desc = ' applied to Invoice #'. $cust_credit_bill[0]->invnum;
- } elsif ( scalar(@cust_credit_bill) == 0
- && scalar(@cust_credit_refund) == 1
- && $cust_credit->credited == 0 ) {
- #applied to one refund
- $desc = ' refunded on '. time2str("%D", $cust_credit_refund[0]->_date);
- } else {
- #complicated
- $desc = '<BR>';
- foreach my $app ( sort { $a->_date <=> $b->_date }
- ( @cust_credit_bill, @cust_credit_refund ) ) {
- if ( $app->isa('FS::cust_credit_bill') ) {
- $desc .= ' '.
- '$'. $app->amount.
- ' applied to Invoice #'. $app->invnum.
- '<BR>';
- #' on '. time2str("%D", $app->_date).
- } elsif ( $app->isa('FS::cust_credit_refund') ) {
- $desc .= ' '.
- '$'. $app->amount.
- ' refunded on'. time2str("%D", $app->_date).
- '<BR>';
- } else {
- die "$app is not a FS::cust_credit_bill or a FS::cust_credit_refund";
- }
- }
- if ( $cust_credit->credited > 0 ) {
- $desc .= ' <B><FONT COLOR="#FF0000">$'.
- $cust_credit->credited. ' unapplied</FONT></B>'.
- qq! (<A HREF="${p}edit/cust_credit_bill.cgi?!.
- $cust_credit->crednum. '">apply</A>)'.
- '<BR>';
- }
- }
-#
- my $delete = '';
- if ( $cust_credit->closed !~ /^Y/i && $conf->exists('deletecredits') ) {
- $delete = qq! (<A HREF="javascript:cust_credit_areyousure('!.
- qq!${p}misc/delete-cust_credit.cgi?!. $cust_credit->crednum.
- qq!')">delete</A>)!;
- }
-
- my $unapply = '';
- if ( $cust_credit->closed !~ /^Y/i
- && $conf->exists('unapplycredits')
- && scalar(@cust_credit_bill) ) {
- $unapply = qq! (<A HREF="javascript:cust_credit_unapply_areyousure('!.
- qq!${p}misc/unapply-cust_credit.cgi?!. $cust_credit->crednum.
- qq!')">unapply</A>)!;
- }
-
- push @history, {
- 'date' => $cust_credit->_date,
- 'desc' => $pre. "Credit$post by ". $cust_credit->otaker.
- ' ('. $cust_credit->reason. ')'.
- "$desc$apply$delete$unapply",
- 'credit' => $cust_credit->amount,
- };
-
- }
-
- #refunds
- foreach my $cust_refund ($cust_main->cust_refund) {
-
- my $payby = $cust_refund->payby;
- my $payinfo = $cust_refund->payinfo;
-
- $payinfo = 'x'x(length($payinfo)-4). substr($payinfo,(length($payinfo)-4))
- if $payby eq 'CARD';
- $payby =~ s/^BILL$/Check #/ if $payinfo;
- $payby =~ s/^(CARD|COMP)$/$1 /;
-
- push @history, {
- 'date' => $cust_refund->_date,
- 'desc' => "Refund ($payby$payinfo) by ". $cust_refund->otaker,
- 'refund' => $cust_refund->refund,
- };
-
- }
-
- %>
-
- <%= table() %>
- <TR>
- <TH>Date</TH>
- <TH>Description</TH>
- <TH><FONT SIZE=-1>Charge</FONT></TH>
- <TH><FONT SIZE=-1>Payment</FONT></TH>
- <TH><FONT SIZE=-1>In-house<BR>Credit</FONT></TH>
- <TH><FONT SIZE=-1>Refund</FONT></TH>
- <TH><FONT SIZE=-1>Balance</FONT></TH>
- </TR>
-
- <%
- #display payment history
-
- my %target;
- my $balance = 0;
- foreach my $item ( sort { $a->{'date'} <=> $b->{'date'} } @history ) {
-
- my $charge = exists($item->{'charge'})
- ? sprintf('$%.2f', $item->{'charge'})
- : '';
- my $payment = exists($item->{'payment'})
- ? sprintf('- $%.2f', $item->{'payment'})
- : '';
- my $credit = exists($item->{'credit'})
- ? sprintf('- $%.2f', $item->{'credit'})
- : '';
- my $refund = exists($item->{'refund'})
- ? sprintf('$%.2f', $item->{'refund'})
- : '';
-
- my $target = exists($item->{'target'}) ? $item->{'target'} : '';
-
- $balance += $item->{'charge'} if exists $item->{'charge'};
- $balance -= $item->{'payment'} if exists $item->{'payment'};
- $balance -= $item->{'credit'} if exists $item->{'credit'};
- $balance += $item->{'refund'} if exists $item->{'refund'};
- $balance = sprintf("%.2f", $balance);
- $balance =~ s/^\-0\.00$/0.00/; #yay ieee fp
- ( my $showbalance = '$'. $balance ) =~ s/^\$\-/- \$/;
-
- %>
-
- <TR>
- <TD>
- <% unless ( !$target || $target{$target}++ ) { %>
- <A NAME="<%= $target %>">
- <% } %>
- <%= time2str("%D",$item->{'date'}) %>
- <% if ( $target && $target{$target} == 1 ) { %>
- </A>
- <% } %>
- </FONT>
- </TD>
- <TD><%= $item->{'desc'} %></TD>
- <TD ALIGN="right"><%= $charge %></TD>
- <TD ALIGN="right"><%= $payment %></TD>
- <TD ALIGN="right"><%= $credit %></TD>
- <TD ALIGN="right"><%= $refund %></TD>
- <TD ALIGN="right"><%= $showbalance %></TD>
- </TR>
-
- <% } %>
-
- </TABLE>
-