<% $payment %> <% "$info$desc$view$apply$refund$void$delete$unapply" %> <%init> my( $cust_pay, %opt ) = @_; my $date_format = $opt{'date_format'} || '%m/%d/%Y'; my $conf = new FS::Conf; my $curuser = $FS::CurrentUser::CurrentUser; my $payby = $cust_pay->payby; my $payinfo; if ( $payby eq 'CARD' ) { $payinfo = $cust_pay->paymask; } elsif ( $payby eq 'CHEK' ) { my( $account, $aba ) = split('@', $cust_pay->paymask ); $payinfo = mt("ABA [_1], Acct #[_2]",$aba,$account); } else { $payinfo = $cust_pay->payinfo; } my @cust_bill_pay = $cust_pay->cust_bill_pay; my @cust_pay_refund = $cust_pay->cust_pay_refund; my $target = "$payby$payinfo"; $payby = translate_payby($payby,$payinfo); my $info = $payby ? "($payby$payinfo)" : ''; my $desc = ''; if ( $opt{'pkg-balances'} && $cust_pay->pkgnum ) { my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum' => $cust_pay->pkgnum } ); $desc .= ' for '. $cust_pkg->pkg_label_long; } my %cust_bill_pay_width = ('width' => 392); my %cust_bill_pay_height = (); if ($conf->exists('cust_bill_pay_pkg-manual')) { %cust_bill_pay_width = ('width' => 592); %cust_bill_pay_height = ('height' => 436); } my( $apply, $ext ) = ( '', '', '', '' ); my $otaker = $cust_pay->otaker; $otaker = 'auto billing' if $otaker eq 'fs_daily'; $otaker = 'customer self-service' if $otaker eq 'fs_selfservice'; my $payment = mt("Payment by [_1]",$otaker); if ( scalar(@cust_bill_pay) == 0 && scalar(@cust_pay_refund) == 0 ) { #completely unapplied $payment = '' . mt("Unapplied Payment by [_1]",$otaker) . ''; if ( $curuser->access_right('Apply payment') ) { if ( $cust_pay->cust_main->total_owed > 0 ) { $apply = ' ('. include( '/elements/popup_link.html', 'label' => mt('apply'), 'action' => "${p}edit/cust_bill_pay.cgi?". $cust_pay->paynum, 'actionlabel' => mt('Apply payment'), %cust_bill_pay_width, %cust_bill_pay_height, ). ')'; } if ( $cust_pay->cust_main->total_unapplied_refunds > 0 ) { $apply.= ' ('. include( '/elements/popup_link.html', 'label' => mt('apply to refund'), 'action' => "${p}edit/cust_pay_refund.cgi?". $cust_pay->paynum, 'actionlabel' => mt('Apply payment to refund'), 'width' => 392, ). ')'; } } } elsif ( scalar(@cust_bill_pay) == 1 && scalar(@cust_pay_refund) == 0 && $cust_pay->unapplied == 0 ) { #applied to one invoice, the usual situation $desc .= ' '. $cust_bill_pay[0]->applied_to_invoice; } elsif ( scalar(@cust_bill_pay) == 0 && scalar(@cust_pay_refund) == 1 && $cust_pay->unapplied == 0 ) { #applied to one refund $desc .= mt(" refunded on [_1]", time2str($date_format, $cust_pay_refund[0]->_date) ); } else { #complicated $desc .= '
'; foreach my $app ( sort { $a->_date <=> $b->_date } ( @cust_bill_pay, @cust_pay_refund ) ) { if ( $app->isa('FS::cust_bill_pay') ) { $desc .= '  '. '$'. $app->amount. ' '. $app->applied_to_invoice. '
'; #' on '. time2str($date_format, $cust_bill_pay->_date). } elsif ( $app->isa('FS::cust_pay_refund') ) { $desc .= '  '. '$'. $app->amount. mt(" refunded on [_1]", time2str($date_format, $app->_date) ) . '
'; } else { die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund"; } } if ( $cust_pay->unapplied > 0 ) { $desc .= '  '. '$'. $cust_pay->unapplied. ' unapplied'; if ( $curuser->access_right('Apply payment') ) { if ( $cust_pay->cust_main->total_owed > 0 ) { $apply = ' ('. include( '/elements/popup_link.html', 'label' => mt('apply'), 'action' => "${p}edit/cust_bill_pay.cgi?". $cust_pay->paynum, 'actionlabel' => mt('Apply payment'), %cust_bill_pay_width, %cust_bill_pay_height, ). ')'; } if ( $cust_pay->cust_main->total_unapplied_refunds > 0 ) { $apply.= ' ('. include( '/elements/popup_link.html', 'label' => mt('apply to refund'), 'action' => "${p}edit/cust_pay_refund.cgi?". $cust_pay->paynum, 'actionlabel' => mt('Apply payment to refund'), 'width' => 392, ). ')'; } } $desc .= '
'; } } my $view = ' ('. include('/elements/popup_link.html', 'label' => mt('view receipt'), 'action' => "${p}view/cust_pay.html?link=popup;paynum=". $cust_pay->paynum, 'actionlabel' => mt('Payment Receipt'), ). ')'; my $refund = ''; my $refund_days = $opt{'card_refund-days'} || 120; my @rights = ('Refund payment'); push @rights, 'Refund credit card payment' if $payby eq 'CARD'; push @rights, 'Refund Echeck payment' if $payby eq 'CHEK'; if ( $cust_pay->closed !~ /^Y/i && $cust_pay->payby =~ /^(CARD|CHEK)$/ && time-$cust_pay->_date < $refund_days*86400 && $cust_pay->unrefunded > 0 && $curuser->access_right(\@rights) ) { $refund = qq! (refund)!; } my $void = ''; my $voidmsg = $cust_pay->payby =~ /^(CARD|CHEK)$/ ? ' (' . mt('do not send anything to the payment gateway').')' : ''; $void = areyousure_link("${p}misc/void-cust_pay.cgi?".$cust_pay->paynum, mt('Are you sure you want to void this payment?'), mt('Void this payment from the database') . $voidmsg, mt('void') ) if ( $cust_pay->closed !~ /^Y/i && ( ( $cust_pay->payby eq 'CARD' && $curuser->access_right('Credit card void') ) || ( $cust_pay->payby eq 'CHEK' && $curuser->access_right('Echeck void') ) || ( $cust_pay->payby !~ /^(CARD|CHEK)$/ && $curuser->access_right('Regular void') ) ) ); my $delete = ''; $delete = areyousure_link("${p}misc/delete-cust_pay.cgi?".$cust_pay->paynum, mt('Are you sure you want to delete this payment?'), mt('Delete this payment from the database completely - not recommended'), mt('delete') ) if ( $cust_pay->closed !~ /^Y/i && $opt{'deletepayments'} && $curuser->access_right('Delete payment') ); my $unapply = ''; $unapply = areyousure_link("${p}misc/unapply-cust_pay.cgi?".$cust_pay->paynum, mt('Are you sure you want to unapply this payment?'), mt('Keep this payment, but dissociate it from the invoices it is currently applied against'), mt('unapply') ) if ( $cust_pay->closed !~ /^Y/i && scalar(@cust_bill_pay) && $curuser->access_right('Unapply payment') );