<% $payment. ' '. $info. $desc. $view. $email. $change_pkg. $apply. $refund. $void. $unapply %> <%init> my( $cust_pay, %opt ) = @_; my $date_format = $opt{'date_format'} || '%m/%d/%Y'; my @cust_bill_pay = $cust_pay->cust_bill_pay; my @cust_pay_refund = $cust_pay->cust_pay_refund; my $unapplied = $cust_pay->unapplied; my ($payby,$payinfo) = translate_payinfo($cust_pay); 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 ( $opt{'cust_bill_pay_pkg-manual'} ) { %cust_bill_pay_width = ('width' => 592); %cust_bill_pay_height = ('height' => 436); } my $apply = ''; my $italicize_otaker = 0; my $otaker = $cust_pay->otaker; if ( $otaker eq 'fs_daily' ) { $otaker = 'auto billing'; $italicize_otaker = 1; } if ( $otaker eq 'fs_selfservice' ) { $otaker = 'customer self-service'; $italicize_otaker = 1; } my $payment = emt("Payment by [_1]",$otaker); $payment =~ s/$otaker/$otaker<\/i>/ if $italicize_otaker; if ( scalar(@cust_bill_pay) == 0 && scalar(@cust_pay_refund) == 0 ) { #completely unapplied $payment = emt("Unapplied Payment by [_1]",$otaker); $payment =~ s/$otaker/$otaker<\/i>/ if $italicize_otaker; $payment = ''.$payment.''; } elsif ( scalar(@cust_bill_pay) == 1 && scalar(@cust_pay_refund) == 0 && $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 && $unapplied == 0 ) { #applied to one refund $desc .= emt(" 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 .= '  ' . $opt{money_char} . $app->amount . ' ' . $app->applied_to_invoice . '
'; } elsif ( $app->isa('FS::cust_pay_refund') ) { $desc .= '  ' . emt("[_1][_2] refunded on [_3]", $opt{money_char}, $app->amount, time2str($date_format, $app->_date) ) . '
'; } else { die "$app is not a FS::cust_bill_pay or FS::cust_pay_refund"; } } if ( $unapplied > 0 ) { $desc .= '  '. ''. emt("[_1][_2] unapplied", $opt{money_char}, $unapplied). ''; $desc .= '
'; } } if ($unapplied > 0) { if ( $opt{'Apply payment'} ) { if ( $opt{total_owed} > 0 ) { $apply = ' ('. include( '/elements/popup_link.html', 'label' => emt('apply'), 'action' => "${p}edit/cust_bill_pay.cgi?". $cust_pay->paynum, 'actionlabel' => emt('Apply payment'), %cust_bill_pay_width, %cust_bill_pay_height, ). ')'; } if ( $opt{total_unapplied_refunds} > 0 ) { $apply.= ' ('. include( '/elements/popup_link.html', 'label' => emt('apply refund'), 'style' => 'white-space: nowrap', 'action' => "${p}edit/cust_pay_refund.cgi?". $cust_pay->paynum, 'actionlabel' => emt('Apply payment to refund'), 'width' => 392, ). ')'; } $apply .= ' (auto‑apply: ' . ($cust_pay->no_auto_apply ? 'no' : 'yes') . ' | ' . include( '/elements/popup_link.html', 'label' => emt($cust_pay->no_auto_apply ? 'yes' : 'no'), 'action' => "${p}edit/process/cust_pay-no_auto_apply.cgi?paynum=" . $cust_pay->paynum . '&no_auto_apply=' . ($cust_pay->no_auto_apply ? '' : 'Y'), 'actionlabel' => emt('Toggle Auto-Apply'), 'width' => 392, 'height' => 200, ) . ')'; } else { # end if $opt('Apply payment') $apply .= ' (no auto-apply)' if $cust_pay->no_auto_apply; } } # end if $unapplied > 0 my $view = ' ('. include('/elements/popup_link.html', 'label' => emt('view receipt'), 'action' => "${p}view/cust_pay.html?link=popup;paynum=". $cust_pay->paynum, 'actionlabel' => emt('Payment Receipt'), ). ')'; my $email = $opt{'has_email_address'} ? q! (paynum. q!','Email Payment Receipt')" TITLE="Send email receipt">email receipt)! : ''; my $change_pkg = ''; if ( $apply && $opt{'pkg-balances'} && $cust_pay->pkgnum ) { $change_pkg = ' ('. include('/elements/popup_link.html', 'label' => emt('change package'), 'action' => "${p}edit/cust_pay-pkgnum.html?paynum=". $cust_pay->paynum, 'actionlabel' => emt('Change payment package'), 'width' => 763, ). ')'; } my $refund = ''; my $refund_days = $opt{'card_refund-days'} || 120; my @refund_right = grep { $opt{$_} } $FS::CurrentUser::CurrentUser->refund_rights($cust_pay->payby); if ( $cust_pay->closed !~ /^Y/i && $cust_pay->payby =~ /^(CARD|CHEK|BILL)$/ && time-$cust_pay->_date < $refund_days*86400 && $cust_pay->unrefunded > 0 && scalar(@refund_right) ) { my $refundtitle = ($cust_pay->payby =~ /^(CARD|CHEK)$/) ? emt('Send a refund for this payment to the payment gateway') : emt('Record a refund for this payment'); $refund = qq! (' . emt('refund') . ')'; } $refund = '' if ($cust_pay->batchnum && !FS::pay_batch->can_handle_electronic_refunds); my $void = ''; my $voidmsg = $cust_pay->payby =~ /^(CARD|CHEK)$/ ? ' (' . emt('do not send anything to the payment gateway').')' : ''; $void = ' ('. include( '/elements/popup_link.html', 'label' => emt('void'), 'action' => "${p}misc/void-cust_pay.html?".$cust_pay->paynum, 'actionlabel' => emt('Void payment'), 'title' => emt('Void this payment from the database'). $voidmsg, ). ')' if $cust_pay->closed !~ /^Y/i && ( ( $cust_pay->payby eq 'CARD' && $opt{'Credit card void'} ) || ( $cust_pay->payby eq 'CHEK' && $opt{'Echeck void'} ) || ( $cust_pay->payby !~ /^(CARD|CHEK)$/ && $opt{'Void payments'} ) ); my $unapply = ''; if ($opt{'Unapply payment'} && !$cust_pay->closed) { $unapply = areyousure_link("${p}misc/unapply-cust_pay.cgi?".$cust_pay->paynum, emt('Are you sure you want to unapply this payment from invoices?'), emt('Keep this payment, but dissociate it from the invoices it is currently applied against'), emt('unapply') ) if @cust_bill_pay; $unapply .= areyousure_link("${p}misc/unapply-cust_pay_refund.cgi?".$cust_pay->paynum, emt('Are you sure you want to unapply this payment from refunds?'), emt('Keep this payment, but dissociate it from the refunds it is currently applied to'), emt('unapply refunds') ) if $cust_pay->refund_to_unapply; }