summaryrefslogtreecommitdiff
path: root/httemplate/view/cust_main
diff options
context:
space:
mode:
Diffstat (limited to 'httemplate/view/cust_main')
-rw-r--r--httemplate/view/cust_main/billing.html10
-rw-r--r--httemplate/view/cust_main/contacts.html14
-rw-r--r--httemplate/view/cust_main/custom.html21
-rwxr-xr-xhttemplate/view/cust_main/packages.html5
-rw-r--r--httemplate/view/cust_main/packages/package.html1
-rw-r--r--httemplate/view/cust_main/packages/services.html44
-rw-r--r--httemplate/view/cust_main/packages/status.html6
-rw-r--r--httemplate/view/cust_main/payment_history.html44
-rw-r--r--httemplate/view/cust_main/payment_history/attempted_payment.html41
-rw-r--r--httemplate/view/cust_main/payment_history/payment.html5
-rw-r--r--httemplate/view/cust_main/payment_history/pending_payment.html61
-rw-r--r--httemplate/view/cust_main/payment_history/voided_payment.html8
12 files changed, 232 insertions, 28 deletions
diff --git a/httemplate/view/cust_main/billing.html b/httemplate/view/cust_main/billing.html
index 54c180b..014ddab 100644
--- a/httemplate/view/cust_main/billing.html
+++ b/httemplate/view/cust_main/billing.html
@@ -132,7 +132,7 @@ Billing information
<TR>
<TD ALIGN="right">Attention</TD>
- <TD BGCOLOR="#ffffff"><% $cust_main->payname %></TD>
+ <TD BGCOLOR="#ffffff"><% $cust_main->payname |h %></TD>
</TR>
% } elsif ( $cust_main->payby eq 'COMP' ) {
@@ -206,6 +206,14 @@ Billing information
<% $cust_main->invoice_terms || 'Default ('. ( $conf->config('invoice_default_terms') || 'Payable upon receipt' ). ')' %>
</TD>
</TR>
+<TR>
+ <TD ALIGN="right">Credit&nbsp;limit</TD>
+ <TD BGCOLOR="#ffffff">
+ <% length($cust_main->credit_limit) ?
+ $money_char.sprintf("%.2f", $cust_main->credit_limit) :
+ 'Unlimited' %>
+ </TD>
+</TR>
% if ( $conf->exists('voip-cust_cdr_spools') ) {
<TR>
diff --git a/httemplate/view/cust_main/contacts.html b/httemplate/view/cust_main/contacts.html
index e88c02e..e91af54 100644
--- a/httemplate/view/cust_main/contacts.html
+++ b/httemplate/view/cust_main/contacts.html
@@ -10,7 +10,7 @@
<TR>
<TD ALIGN="right">Contact name</TD>
<TD COLSPAN=5 BGCOLOR="#ffffff">
- <% $cust_main->get("${pre}last"). ', '. $cust_main->get("${pre}first") %>
+ <% $cust_main->get("${pre}last"). ', '. $cust_main->get("${pre}first") |h %>
</TD>
% if ( $which eq '' && $conf->exists('show_ss') ) {
<TD ALIGN="right">SS#</TD>
@@ -19,11 +19,11 @@
</TR>
<TR>
<TD ALIGN="right">Company</TD>
- <TD COLSPAN=7 BGCOLOR="#ffffff"><% $cust_main->get("${pre}company") %></TD>
+ <TD COLSPAN=7 BGCOLOR="#ffffff"><% $cust_main->get("${pre}company") |h %></TD>
</TR>
<TR>
<TD ALIGN="right">Address</TD>
- <TD COLSPAN=7 BGCOLOR="#ffffff"><% $cust_main->get("${pre}address1") %></TD>
+ <TD COLSPAN=7 BGCOLOR="#ffffff"><% $cust_main->get("${pre}address1") |h %></TD>
</TR>
% if ( $cust_main->get("${pre}address2") ) {
@@ -36,20 +36,20 @@
<TR>
<TD ALIGN="right"><% $address2_label %></TD>
- <TD COLSPAN=7 BGCOLOR="#ffffff"><% $cust_main->get("${pre}address2") %></TD>
+ <TD COLSPAN=7 BGCOLOR="#ffffff"><% $cust_main->get("${pre}address2") |h %></TD>
</TR>
% }
<TR>
<TD ALIGN="right">City</TD>
- <TD BGCOLOR="#ffffff"><% $cust_main->get("${pre}city") %></TD>
+ <TD BGCOLOR="#ffffff"><% $cust_main->get("${pre}city") |h %></TD>
% if ( $cust_main->get("${pre}county") ) {
<TD ALIGN="right">County</TD>
- <TD BGCOLOR="#ffffff"><% $cust_main->get("${pre}county") %></TD>
+ <TD BGCOLOR="#ffffff"><% $cust_main->get("${pre}county") |h %></TD>
% }
<TD ALIGN="right">State</TD>
- <TD BGCOLOR="#ffffff"><% state_label( $cust_main->get("${pre}state"), $cust_main->get("${pre}country") ) %></TD>
+ <TD BGCOLOR="#ffffff"><% state_label( $cust_main->get("${pre}state"), $cust_main->get("${pre}country") ) |h %></TD>
<TD ALIGN="right">Zip</TD>
<TD BGCOLOR="#ffffff"><% $cust_main->get("${pre}zip") %></TD>
</TR>
diff --git a/httemplate/view/cust_main/custom.html b/httemplate/view/cust_main/custom.html
new file mode 100644
index 0000000..8e2e07b
--- /dev/null
+++ b/httemplate/view/cust_main/custom.html
@@ -0,0 +1,21 @@
+<IFRAME id="customframe"
+ src="<% $proxyurl %>"
+ onload="resizeFrame(this)"
+ frameborder=0
+ marginheight="0px"
+ marginwidth="0px"
+ width="100%"
+ scrolling="no"
+>
+</IFRAME>
+<SCRIPT TYPE="text/javascript">
+function resizeFrame(f) {
+ f.style.height = f.contentDocument.body.scrollHeight + 'px';
+}
+</SCRIPT>
+<%init>
+
+my( $cust_main ) = @_;
+
+my $proxyurl = $p.'/misc/custom_link_proxy.cgi?custnum='.$cust_main->custnum;
+</%init>
diff --git a/httemplate/view/cust_main/packages.html b/httemplate/view/cust_main/packages.html
index 811ac3c..660d0ef 100755
--- a/httemplate/view/cust_main/packages.html
+++ b/httemplate/view/cust_main/packages.html
@@ -57,7 +57,9 @@ Current packages
<TD ALIGN="right">
<A HREF="<%$p%>search/report_cust_pkg.html?custnum=<% $cust_main->custnum %>">Package reports</A><BR>
Service reports:
- <A HREF="<%$p%>search/report_svc_acct.html?custnum=<% $cust_main->custnum %>">accounts</A>
+ <A HREF="<%$p%>search/report_svc_acct.html?custnum=<% $cust_main->custnum %>">accounts</A><BR>
+ Usage reports:
+ <A HREF="<%$p%>search/report_cdr.html?custnum=<% $cust_main->custnum %>">CDRs</A>
</TD>
</TR>
@@ -161,6 +163,7 @@ my %conf_opt = (
'legacy_link' => $conf->exists('legacy_link'),
'svc_broadband-manage_link' => scalar($conf->config('svc_broadband-manage_link')),
'maestro-status_test' => $conf->exists('maestro-status_test'),
+ 'cust_pkg-large_pkg_size' => $conf->config('cust_pkg-large_pkg_size'),
);
#subroutines
diff --git a/httemplate/view/cust_main/packages/package.html b/httemplate/view/cust_main/packages/package.html
index 3c486dd..3b58f9e 100644
--- a/httemplate/view/cust_main/packages/package.html
+++ b/httemplate/view/cust_main/packages/package.html
@@ -39,6 +39,7 @@
% if ( $curuser->access_right('Discount customer package')
% && $part_pkg->can_discount
% && ! scalar($cust_pkg->cust_pkg_discount_active)
+% && ! scalar($cust_pkg->part_pkg->part_pkg_discount)
% )
% {
% $br=1;
diff --git a/httemplate/view/cust_main/packages/services.html b/httemplate/view/cust_main/packages/services.html
index 6e30922..512efcc 100644
--- a/httemplate/view/cust_main/packages/services.html
+++ b/httemplate/view/cust_main/packages/services.html
@@ -4,12 +4,40 @@
<TD CLASS="inv" BGCOLOR="<% $bgcolor %>">
<TABLE CLASS="inv" BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+ <SCRIPT TYPE="text/javascript">
+function clearhint_search_cust_svc(obj, str) {
+ if (obj.value == str) obj.value = '';
+}
+ </SCRIPT>
% #foreach my $svcpart (sort {$a->{svcpart} <=> $b->{svcpart}} @{$pkg->{svcparts}}) {
% foreach my $part_svc ( $cust_pkg->part_svc ) {
-% #foreach my $service (@{$svcpart->{services}}) {
-% foreach my $cust_svc ( @{ $part_svc->cust_pkg_svc } ) {
+% if ( $opt{'cust_pkg-large_pkg_size'} > 0 and
+% $opt{'cust_pkg-large_pkg_size'} <= $cust_pkg->num_svcs ) {
+% # summarize
+ <TR>
+ <TD ALIGN="center" VALIGN="top">
+% my $href="${p}search/cust_pkg_svc.html?svcpart=".$part_svc->svcpart.
+% ";pkgnum=".$cust_pkg->pkgnum;
+ <A HREF="<% $href %>"><% $part_svc->svc %></A>&nbsp;
+ <A HREF="<% $href %>"><B>(view all <% $cust_pkg->num_svcs %>)</B></A>
+% my $hint = $hints{$part_svc->svcdb};
+% if ( $hint ) {
+ <BR>
+ <FORM name="svcpart<%$part_svc->svcpart%>_search" STYLE="display:inline"
+ ACTION="<%$p%>search/cust_pkg_svc.html" METHOD="GET">
+ <INPUT TYPE="hidden" NAME="svcpart" VALUE="<%$part_svc->svcpart%>">
+ <INPUT TYPE="hidden" NAME="pkgnum" VALUE="<%$cust_pkg->pkgnum%>">
+ <INPUT TYPE="text" NAME="search_svc"
+ onfocus="clearhint_search_cust_svc(this, '<%$hint%>')" VALUE="<%$hint%>">
+ <INPUT TYPE="submit" VALUE="Search"></FORM>
+% } #$hint
+ </TD>
+ </TR>
+% }
+% else {
+% foreach my $cust_svc ( @{ $part_svc->cust_pkg_svc } ) {
<TR>
<TD ALIGN="right" VALIGN="top"><% FS::UI::Web::svc_link($m, $part_svc, $cust_svc) %></TD>
@@ -65,7 +93,8 @@
</TD>
</TR>
-% }
+% } #foreach $cust_svc
+% }
% if ( ! $cust_pkg->get('cancel')
% && $curuser->access_right('Provision customer service')
@@ -137,4 +166,13 @@ sub svc_unprovision_link {
qq!', 'Permanently unprovision and delete this service?')">Unprovision</A>!;
}
+my %hints = (
+svc_acct => '(user or email)',
+svc_domain => '(domain)',
+svc_broadband => '(ip or mac)',
+svc_forward => '(email)',
+svc_phone => '(phone)',
+svc_pbx => '(phone)',
+);
+
</%init>
diff --git a/httemplate/view/cust_main/packages/status.html b/httemplate/view/cust_main/packages/status.html
index a686843..c05cd5a 100644
--- a/httemplate/view/cust_main/packages/status.html
+++ b/httemplate/view/cust_main/packages/status.html
@@ -54,8 +54,11 @@
<% pkg_status_row_changed( $cust_pkg, %opt, 'colspan'=>$colspan ) %>
<% pkg_status_row_if( $cust_pkg, $last_bill_or_renewed, 'last_bill', %opt, curuser=>$curuser ) %>
-% # pkg_status_row($cust_pkg, 'Next bill', 'bill', %opt)
+% if ( $part_pkg->option('suspend_bill') ) {
+ <% pkg_status_row_if( $cust_pkg, 'Next&nbsp;bill', 'bill', %opt, curuser=>$curuser ) %>
+% }
<% pkg_status_row_if( $cust_pkg, 'Expires', 'expire', %opt, curuser=>$curuser ) %>
+ <% pkg_status_row_if( $cust_pkg, 'Contract ends', 'contract_end', %opt ) %>
<TR>
<TD COLSPAN=<%$colspan%>>
@@ -167,6 +170,7 @@
<% pkg_status_row_if($cust_pkg, 'Will automatically suspend by', 'autosuspend', %opt) %>
<% pkg_status_row_if( $cust_pkg, 'Will suspend on', 'adjourn', %opt, curuser=>$curuser ) %>
<% pkg_status_row_if( $cust_pkg, 'Expires', 'expire', %opt, curuser=>$curuser ) %>
+ <% pkg_status_row_if( $cust_pkg, 'Contract ends', 'contract_end', %opt ) %>
% if ( $part_pkg->freq ) {
diff --git a/httemplate/view/cust_main/payment_history.html b/httemplate/view/cust_main/payment_history.html
index 0dc4c41..046899e 100644
--- a/httemplate/view/cust_main/payment_history.html
+++ b/httemplate/view/cust_main/payment_history.html
@@ -1,7 +1,7 @@
%# payment links
% my $s = 0;
-% if ( $payby{'BILL'} && $curuser->access_right('Post payment') ) {
+% if ( $payby{'BILL'} && $curuser->access_right(['Post payment', 'Post check payment' ]) ) {
<% $s++ ? ' | ' : '' %>
<% include('/elements/popup_link-cust_main.html',
'label' => 'Enter check payment',
@@ -14,7 +14,7 @@
%>
% }
-% if ( $payby{'CASH'} && $curuser->access_right('Post payment') ) {
+% if ( $payby{'CASH'} && $curuser->access_right(['Post payment', 'Post cash payment']) ) {
<% $s++ ? ' | ' : '' %>
<% include('/elements/popup_link-cust_main.html',
'label' => 'Enter cash payment',
@@ -33,7 +33,7 @@
% }
% if ( ( $payby{'CARD'} || $payby{'DCRD'} )
-% && $curuser->access_right('Process payment')
+% && $curuser->access_right(['Process payment', 'Process credit card payment'])
% && ! $cust_main->is_encrypted($cust_main->payinfo)
% ) {
<% $s++ ? ' | ' : '' %>
@@ -41,7 +41,7 @@
% }
% if ( ( $payby{'CHEK'} || $payby{'DCHK'} )
-% && $curuser->access_right('Process payment')
+% && $curuser->access_right(['Process payment', 'Process Echeck payment'])
% && ! $cust_main->is_encrypted($cust_main->payinfo)
% ) {
<% $s++ ? ' | ' : '' %>
@@ -73,7 +73,7 @@
%# refund links
% $s = 0;
-% if ( $payby{'BILL'} && $curuser->access_right('Post refund') ) {
+% if ( $payby{'BILL'} && $curuser->access_right(['Post refund', 'Post check refund']) ) {
<% $s++ ? ' | ' : '' %>
<% include('/elements/popup_link-cust_main.html',
'label' => 'Enter check refund',
@@ -86,7 +86,7 @@
%>
% }
-% if ( $payby{'CASH'} && $curuser->access_right('Post refund') ) {
+% if ( $payby{'CASH'} && $curuser->access_right(['Post refund', 'Post cash refund']) ) {
<% $s++ ? ' | ' : '' %>
<% include('/elements/popup_link-cust_main.html',
'label' => 'Enter cash refund',
@@ -291,7 +291,7 @@
<TR <% $display ? $display.' ID="old_history'.$old_history++.'"' : ''%>>
- <TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
+ <TD VALIGN="top" CLASS="grid" BGCOLOR="<% $bgcolor %>">
% unless ( !$target || $target{$target}++ ) {
<A NAME="<% $target %>">
@@ -308,19 +308,19 @@
<TD CLASS="grid" BGCOLOR="<% $bgcolor %>">
<% $item->{'desc'} %>
</TD>
- <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
+ <TD VALIGN="top" ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
<% $charge %>
</TD>
- <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
+ <TD VALIGN="top" ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
<% $payment %>
</TD>
- <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
+ <TD VALIGN="top" ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
<% $credit %>
</TD>
- <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
+ <TD VALIGN="top" ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
<% $refund %>
</TD>
- <TD ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
+ <TD VALIGN="top" ALIGN="right" CLASS="grid" BGCOLOR="<% $bgcolor %>">
<% $showbalance %>
</TD>
</TR>
@@ -412,6 +412,16 @@ foreach my $cust_pay ($cust_main->cust_pay) {
};
}
+#pending payments
+foreach my $cust_pay_pending ($cust_main->cust_pay_pending) {
+ push @history, {
+ 'date' => $cust_pay_pending->_date,
+ 'desc' => include('payment_history/pending_payment.html', $cust_pay_pending, %opt ),
+ 'void_payment' => $cust_pay_pending->paid,
+ };
+}
+
+
#voided payments
foreach my $cust_pay_void ($cust_main->cust_pay_void) {
push @history, {
@@ -422,6 +432,16 @@ foreach my $cust_pay_void ($cust_main->cust_pay_void) {
}
+#declined payments
+foreach my $cust_pay_pending ($cust_main->cust_pay_pending_attempt) {
+ push @history, {
+ 'date' => $cust_pay_pending->_date,
+ 'desc' => include('payment_history/attempted_payment.html', $cust_pay_pending, %opt ),
+ 'void_payment' => $cust_pay_pending->paid, #??
+ #'target' => $target, #XXX
+ };
+}
+
#credits (some false laziness w/payments)
foreach my $cust_credit ($cust_main->cust_credit) {
push @history, {
diff --git a/httemplate/view/cust_main/payment_history/attempted_payment.html b/httemplate/view/cust_main/payment_history/attempted_payment.html
new file mode 100644
index 0000000..554aa73
--- /dev/null
+++ b/httemplate/view/cust_main/payment_history/attempted_payment.html
@@ -0,0 +1,41 @@
+<I>Payment attempt <% $info |h %></I>
+<%init>
+
+my( $cust_pay_pending, %opt ) = @_;
+
+my $date_format = $opt{'date_format'} || '%m/%d/%Y';
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+my $payby = $cust_pay_pending->payby;
+
+my $payinfo;
+if ( $payby eq 'CARD' ) {
+ $payinfo = $cust_pay_pending->paymask;
+} elsif ( $payby eq 'CHEK' ) {
+ my( $account, $aba ) = split('@', $cust_pay_pending->paymask );
+ $payinfo = "ABA $aba, Acct #$account";
+} else {
+ $payinfo = $cust_pay_pending->payinfo;
+}
+
+$payby =~ s/^BILL$/Check #/ if $payinfo;
+$payby =~ s/^CHEK$/Electronic check /;
+$payby =~ s/^PREP$/Prepaid card /;
+$payby =~ s/^CARD$/Credit card #/;
+$payby =~ s/^COMP$/Complimentary by /;
+$payby =~ s/^CASH$/Cash/;
+$payby =~ s/^WEST$/Western Union/;
+$payby =~ s/^MCRD$/Manual credit card/;
+$payby =~ s/^BILL$//;
+my $info = $payby ? "($payby$payinfo)" : '';
+
+if ( $opt{'pkg-balances'} && $cust_pay_pending->pkgnum ) {
+ my $cust_pkg = qsearchs('cust_pkg', { 'pkgnum'=>$cust_pay_pending->pkgnum } );
+ $info .= ' for '. $cust_pkg->pkg_label_long;
+}
+
+$info .= ': '. $cust_pay_pending->statustext
+ if length($cust_pay_pending->statustext);
+
+</%init>
diff --git a/httemplate/view/cust_main/payment_history/payment.html b/httemplate/view/cust_main/payment_history/payment.html
index 6ec9fdb..e745864 100644
--- a/httemplate/view/cust_main/payment_history/payment.html
+++ b/httemplate/view/cust_main/payment_history/payment.html
@@ -155,11 +155,14 @@ my $view =
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('Refund payment')
+ && $curuser->access_right(\@rights)
) {
$refund = qq! (<A HREF="${p}edit/cust_refund.cgi?payby=$1;!.
qq!paynum=!. $cust_pay->paynum. '"'.
diff --git a/httemplate/view/cust_main/payment_history/pending_payment.html b/httemplate/view/cust_main/payment_history/pending_payment.html
new file mode 100644
index 0000000..40805b1
--- /dev/null
+++ b/httemplate/view/cust_main/payment_history/pending_payment.html
@@ -0,0 +1,61 @@
+<b><font size="+1" color="#FF0000">Pending payment </font></b> <% "$info $status ($link)" %>
+<%init>
+
+my( $cust_pay_pending, %opt ) = @_;
+
+my $conf = new FS::Conf;
+
+my $curuser = $FS::CurrentUser::CurrentUser;
+
+my $payby = $cust_pay_pending->payby;
+
+my $payinfo;
+if ( $payby eq 'CARD' ) {
+ $payinfo = $cust_pay_pending->paymask;
+} elsif ( $payby eq 'CHEK' ) {
+ my( $account, $aba ) = split('@', $cust_pay_pending->paymask );
+ $payinfo = "ABA $aba, Acct #$account";
+} else {
+ $payinfo = $cust_pay_pending->payinfo;
+}
+
+my $target = "$payby$payinfo";
+$payby =~ s/^BILL$/Check #/ if $payinfo;
+$payby =~ s/^CHEK$/Electronic check /;
+$payby =~ s/^PREP$/Prepaid card /;
+$payby =~ s/^CARD$/Credit card #/;
+$payby =~ s/^COMP$/Complimentary by /;
+$payby =~ s/^CASH$/Cash/;
+$payby =~ s/^WEST$/Western Union/;
+$payby =~ s/^MCRD$/Manual credit card/;
+$payby =~ s/^BILL$//;
+my $info = $payby ? "($payby$payinfo)" : '';
+
+my %statusaction = (
+ 'new' => 'delete',
+ 'pending' => 'complete',
+ 'captured' => 'capture',
+);
+
+my $edit_pending =
+ $FS::CurrentUser::CurrentUser->access_right('Edit customer pending payments');
+
+my $status = "Status: ".$cust_pay_pending->status;
+
+my $action = $statusaction{$cust_pay_pending->status};
+
+my $link = "";
+if ( $action && $edit_pending ) {
+ $link = include('/elements/popup_link.html',
+ 'action' => $p. 'edit/cust_pay_pending.html'.
+ '?paypendingnum='. $cust_pay_pending->paypendingnum.
+ ";action=$action",
+ 'label' => $action,
+ 'color' => '#ff0000',
+ 'width' => 655,
+ 'height' => ( $action eq 'delete' ? 480 : 575 ),
+ 'actionlabel' => ucfirst($action). ' pending payment',
+ );
+}
+
+</%init>
diff --git a/httemplate/view/cust_main/payment_history/voided_payment.html b/httemplate/view/cust_main/payment_history/voided_payment.html
index be68ff0..5d7f60c 100644
--- a/httemplate/view/cust_main/payment_history/voided_payment.html
+++ b/httemplate/view/cust_main/payment_history/voided_payment.html
@@ -1,6 +1,10 @@
-<DEL>Payment <% $info %></DEL>
+<DEL>Payment <% $info %> by <% $cust_pay_void->otaker %></DEL>
<I>voided <% time2str($date_format, $cust_pay_void->void_date) %>
-by <% $cust_pay_void->otaker %></I><% $unvoid %>
+% my $void_user = $cust_pay_void->void_access_user;
+% if ($void_user) {
+ by <% $void_user->username %></I>
+% }
+<% $unvoid %>
<%init>
my( $cust_pay_void, %opt ) = @_;