- my( $pre, $post, $desc, $apply, $ext ) = ( '', '', '', '', '' );
- if ( scalar(@cust_bill_pay) == 0
- && scalar(@cust_pay_refund) == 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
- && scalar(@cust_pay_refund) == 0
- && $cust_pay->unapplied == 0 ) {
- #applied to one invoice, the usual situation
- $desc = ' applied to Invoice #'. $cust_bill_pay[0]->invnum;
- } elsif ( scalar(@cust_bill_pay) == 0
- && scalar(@cust_pay_refund) == 1
- && $cust_pay->unapplied == 0 ) {
- #applied to one refund
- $desc = ' refunded on '. time2str("%D", $cust_pay_refund[0]->_date);
- } else {
- #complicated
- $desc = '<BR>';
- foreach my $app ( sort { $a->_date <=> $b->_date }
- ( @cust_bill_pay, @cust_pay_refund ) ) {
- if ( $app->isa('FS::cust_bill_pay') ) {
- $desc .= ' '.
- '$'. $app->amount.
- ' applied to Invoice #'. $app->invnum.
- '<BR>';
- #' on '. time2str("%D", $cust_bill_pay->_date).
- } elsif ( $app->isa('FS::cust_pay_refund') ) {
- $desc .= ' '.
- '$'. $app->amount.
- ' refunded on'. time2str("%D", $app->_date).
- '<BR>';
- } else {
- die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund";
- }
- }
- 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 $refund = '';
- my $refund_days = $conf->config('card_refund-days') || 120;
- if ( $cust_pay->closed !~ /^Y/i
- && $cust_pay->payby =~ /^(CARD|CHEK)$/
- && time-$cust_pay->_date < $refund_days*86400
- && $cust_pay->unrefunded > 0
- ) {
- $refund = qq! (<A HREF="!. qq!${p}edit/cust_refund.cgi?payby=$1;!.
- qq!paynum=!. $cust_pay->paynum. qq!">refund</A>)!;
- }
-
- my $void = '';
- if ( $cust_pay->closed !~ /^Y/i
- && $cust_pay->payby !~ /^(CARD|CHEK)$/
- ) {
- $void = qq! (<A HREF="javascript:areyousure('!.
- qq!${p}misc/void-cust_pay.cgi?!. $cust_pay->paynum.
- qq!', 'Are you sure you want to void this payment?')">!.
- qq!void</A>)!;
- }
-
- my $delete = '';
- if ( $cust_pay->closed !~ /^Y/i && $conf->exists('deletepayments') ) {
- $delete = qq! (<A HREF="javascript:areyousure('!.
- qq!${p}misc/delete-cust_pay.cgi?!. $cust_pay->paynum.
- qq!', 'Are you sure you want to delete this payment?')">!.
- qq!delete</A>)!;
- }
-
- my $unapply = '';
- if ( $cust_pay->closed !~ /^Y/i
- && $conf->exists('unapplypayments')
- && scalar(@cust_bill_pay) ) {
- $unapply = qq! (<A HREF="javascript:areyousure('!.
- qq!${p}misc/unapply-cust_pay.cgi?!. $cust_pay->paynum.
- qq!', 'Are you sure you want to unapply this payment?')">!.
- qq!unapply</A>)!;
- }
-
- push @history, {
- 'date' => $cust_pay->_date,
- 'desc' => $pre. "Payment$post$info$desc".
- "$apply$refund$void$delete$unapply",
- 'payment' => $cust_pay->paid,
- 'target' => $target,
- };
- }
-
- #voided payments
- foreach my $cust_pay_void ($cust_main->cust_pay_void) {
-
- my $payby = $cust_pay_void->payby;
- my $payinfo = $payby eq 'CARD'
- ? $cust_pay_void->payinfo_masked
- : $cust_pay_void->payinfo;
-
- $payby =~ s/^BILL$/Check #/ if $payinfo;
- $payby =~ s/^CHEK$/Electronic check /;
- $payby =~ s/^BILL$//;
- $payby =~ s/^(CARD|COMP)$/$1 /;
- my $info = $payby ? " ($payby$payinfo)" : '';
-
- push @history, {
- 'date' => $cust_pay_void->_date,
- 'desc' => "<DEL>Payment $info</DEL> <I>voided ".
- time2str("%D", $cust_pay_void->void_date).
- " by ". $cust_pay_void->otaker. '</i>',
- 'void_payment' => $cust_pay_void->paid,
- };
-
- }
-
- #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, the usual situation
- $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:areyousure('!.
- qq!${p}misc/delete-cust_credit.cgi?!. $cust_credit->crednum.
- qq!', 'Are you sure you want to delete this credit?')">!.
- qq!delete</A>)!;
- }
-
- my $unapply = '';
- if ( $cust_credit->closed !~ /^Y/i
- && $conf->exists('unapplycredits')
- && scalar(@cust_credit_bill) ) {
- $unapply = qq! (<A HREF="javascript:areyousure('!.
- qq!${p}misc/unapply-cust_credit.cgi?!. $cust_credit->crednum.
- qq!', 'Are you sure you want to unapply this credit?')">!.
- 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 = $payby eq 'CARD'
- ? $cust_refund->payinfo_masked
- : $cust_refund->payinfo;
-
- $payby =~ s/^BILL$/Check #/ if $payinfo;
- $payby =~ s/^CHEK$/Electronic check /;
- $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>