% $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 $money_char = $conf->config('money_char') || '$';
my $curuser = $FS::CurrentUser::CurrentUser;
my @cust_bill_pay = $cust_pay->cust_bill_pay;
my @cust_pay_refund = $cust_pay->cust_pay_refund;
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 ($conf->exists('cust_bill_pay_pkg-manual')) {
%cust_bill_pay_width = ('width' => 592);
%cust_bill_pay_height = ('height' => 436);
}
my $apply = '';
my $otaker = $cust_pay->otaker;
$otaker = 'auto billing' if $otaker eq 'fs_daily';
$otaker = 'customer self-service' if $otaker eq 'fs_selfservice';
my $payment = emt("Payment by [_1]",$otaker);
if ( scalar(@cust_bill_pay) == 0
&& scalar(@cust_pay_refund) == 0 ) {
#completely unapplied
$payment = ''
. emt("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' => 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 ( $cust_pay->cust_main->total_unapplied_refunds > 0 ) {
$apply.= ' ('.
include( '/elements/popup_link.html',
'label' => emt('apply to refund'),
'action' => "${p}edit/cust_pay_refund.cgi?".
$cust_pay->paynum,
'actionlabel' => emt('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 .= 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 .= ' ' . $money_char . $app->amount . ' ' .
$app->applied_to_invoice . '
';
} elsif ( $app->isa('FS::cust_pay_refund') ) {
$desc .= ' ' .
emt("[_1][_2] refunded on [_3]", $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 ( $cust_pay->unapplied > 0 ) {
$desc .= ' '.
'' .
emt("[_1][_2] unapplied", $money_char, $cust_pay->unapplied) .
'';
if ( $curuser->access_right('Apply payment') ) {
if ( $cust_pay->cust_main->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 ( $cust_pay->cust_main->total_unapplied_refunds > 0 ) {
$apply.= ' ('.
include( '/elements/popup_link.html',
'label' => emt('apply to refund'),
'action' => "${p}edit/cust_pay_refund.cgi?".
$cust_pay->paynum,
'actionlabel' => emt('Apply payment to refund'),
'width' => 392,
).
')';
}
}
$desc .= '
';
}
}
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 $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! (' . emt('refund') . ')';
}
my $void = '';
my $voidmsg = $cust_pay->payby =~ /^(CARD|CHEK)$/
? ' (' . emt('do not send anything to the payment gateway').')'
: '';
$void = areyousure_link("${p}misc/void-cust_pay.cgi?".$cust_pay->paynum,
emt('Are you sure you want to void this payment?'),
emt('Void this payment from the database') . $voidmsg,
emt('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,
emt('Are you sure you want to delete this payment?'),
emt('Delete this payment from the database completely - not recommended'),
emt('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,
emt('Are you sure you want to unapply this payment?'),
emt('Keep this payment, but dissociate it from the invoices it is currently applied against'),
emt('unapply')
)
if ( $cust_pay->closed !~ /^Y/i && scalar(@cust_bill_pay)
&& $curuser->access_right('Unapply payment') );
%init>