%# payment links % my $s = 0; % if ( $payby{'BILL'} && $curuser->access_right('Post payment') ) { <% $s++ ? ' | ' : '' %> <% include('/elements/popup_link-cust_main.html', 'label' => 'Enter check payment', 'action' => "${p}edit/cust_pay.cgi?popup=1;payby=BILL", 'cust_main' => $cust_main, 'actionlabel' => 'Enter check payment', 'width' => 392, #default# 'height' => 336, ) %> % } % if ( $payby{'CASH'} && $curuser->access_right('Post payment') ) { <% $s++ ? ' | ' : '' %> <% include('/elements/popup_link-cust_main.html', 'label' => 'Enter cash payment', 'action' => "${p}edit/cust_pay.cgi?popup=1;payby=CASH", 'cust_main' => $cust_main, 'actionlabel' => 'Enter cash payment', 'width' => 392, #default# 'height' => 336, ) %> % } % if ( $payby{'WEST'} && $curuser->access_right('Post payment') ) { <% $s++ ? ' | ' : '' %> Enter Western Union payment % } % if ( ( $payby{'CARD'} || $payby{'DCRD'} ) % && $curuser->access_right('Process payment') % && ! $cust_main->is_encrypted($cust_main->payinfo) % ) { <% $s++ ? ' | ' : '' %> Process credit card payment % } % if ( ( $payby{'CHEK'} || $payby{'DCHK'} ) % && $curuser->access_right('Process payment') % && ! $cust_main->is_encrypted($cust_main->payinfo) % ) { <% $s++ ? ' | ' : '' %> Process electronic check (ACH) payment % } % if ( $payby{'MCRD'} && $curuser->access_right('Post payment') ) { <% $s++ ? ' | ' : '' %> Post manual (offline/POS) credit card payment % }
%# credit link % if ( $curuser->access_right('Post credit') ) { <% include('/elements/popup_link-cust_main.html', 'label' => 'Enter credit', 'action' => "${p}edit/cust_credit.cgi", 'cust_main' => $cust_main, 'actionlabel' => 'Enter credit', 'width' => 616, #make room for reasons #540 default #default# 'height' => 336, ) %>
% } %# refund links % $s = 0; % if ( $payby{'BILL'} && $curuser->access_right('Post refund') ) { <% $s++ ? ' | ' : '' %> <% include('/elements/popup_link-cust_main.html', 'label' => 'Enter check refund', 'action' => "${p}edit/cust_refund.cgi?popup=1;payby=BILL", 'cust_main' => $cust_main, 'actionlabel' => 'Enter check refund', 'width' => 392, #default# 'height' => 336, ) %> % } % if ( $payby{'CASH'} && $curuser->access_right('Post refund') ) { <% $s++ ? ' | ' : '' %> <% include('/elements/popup_link-cust_main.html', 'label' => 'Enter cash refund', 'action' => "${p}edit/cust_refund.cgi?popup=1;payby=CASH", 'cust_main' => $cust_main, 'actionlabel' => 'Enter cash refund', 'width' => 392, #default# 'height' => 336, ) %> % } %# someday, perhaps. very few gateways let you do unlinked refunds at all. %# Authorize.net makes you sign a special form %# %# % if ( ( $payby{'CARD'} || $payby{'DCRD'} ) %# % && $curuser->access_right('Process refund') %# % && ! $cust_main->is_encrypted($cust_main->payinfo) %# % ) { %# <% $s++ ? ' | ' : '' %> %# Process credit card refund %# % } %# %# % if ( ( $payby{'CHEK'} || $payby{'DCHK'} ) %# % && $curuser->access_right('Process refund') %# % && ! $cust_main->is_encrypted($cust_main->payinfo) %# % ) { %# <% $s++ ? ' | ' : '' %> %# Process electronic check (ACH) refund %# % } % if ( $payby{'MCRD'} && $curuser->access_right('Post refund') ) { <% $s++ ? ' | ' : '' %> Post manual (offline/POS) credit card refund % }
%# tax exemption link % my $view_exemptions = $curuser->access_right('View customer tax exemptions'); % my $add_adjustment = ( $conf->exists('enable_tax_adjustments') % && $curuser->access_right('Add customer tax adjustment') % ); % if ( $view_exemptions || $add_adjustment ) { % if ( $view_exemptions ) { View tax exemptions <% $add_adjustment ? '|' : '' %> % } % if ( $add_adjustment ) { <% include('/elements/popup_link.html', { 'action' => $p.'edit/cust_tax_adjustment.html?custnum='. $cust_main->custnum, 'label' => 'Add tax adjustment', 'actionlabel' => 'Add tax adjustment', #'color' => '#333399', #'width' => 763, 'height' => 200, }) %> | View tax adjustments % }
% } %# batched payment links % if ( ( $conf->exists('batch-enable') || $conf->config('batch-enable_payby') ) % && $curuser->access_right('View customer batched payments') % ) % { View batched payments: % foreach my $status (qw( Queued In-transit Complete All )) { <% $status %> <% $status ne 'All' ? '|' : '' %> % }
% } %# pending payment links % if ( $curuser->access_right('View customer pending payments') % && scalar($cust_main->cust_pay_pending) % ) % { View pending payments
% } %# and now the table <% include("/elements/table-grid.html") %> % my $bgcolor1 = '#eeeeee'; % my $bgcolor2 = '#ffffff'; % my $bgcolor = ''; Date Description Invoice Payment In-house
Credit
Refund Balance %#display payment history %my $money_char = $conf->config('money_char') || '$'; % %sub balance_forward_row { % my( $b, $date, $money_char ) = @_; % ( my $balance_forward = $money_char. $b ) =~ s/^\$\-/- \$/; <% time2str($date_format, $date) %> Starting balance on <% time2str($date_format, $date) %> (show prior history) <% $balance_forward %> %} % %my $balance = 0; %my %target = (); % %my $years = $conf->config('payment_history-years') || 2; %my $older_than = time - $years * 31556926; #60*60*24*365.2422 %my $hidden = 0; %my $seen = 0; %my $old_history = 0; %my $lastdate = 0; % %foreach my $item ( sort { $a->{'date'} <=> $b->{'date'} } @history ) { % % $lastdate = $item->{'date'}; % % my $display; % if ( $item->{'date'} < $older_than ) { % $display = ' STYLE="display:none" '; % $hidden = 1; % } else { % % $display = ''; % % if ( $hidden && ! $seen++ ) { % balance_forward_row($balance, $item->{'date'}, $money_char); % } % % } % % if ( $bgcolor eq $bgcolor1 ) { % $bgcolor = $bgcolor2; % } else { % $bgcolor = $bgcolor1; % } % % my $charge = exists($item->{'charge'}) % ? sprintf("$money_char\%.2f", $item->{'charge'}) % : ''; % % my $payment = exists($item->{'payment'}) % ? sprintf("- $money_char\%.2f", $item->{'payment'}) % : ''; % % $payment ||= sprintf( "- $money_char\%.2f", % $item->{'void_payment'} % ) % if exists($item->{'void_payment'}); % % my $credit = exists($item->{'credit'}) % ? sprintf("- $money_char\%.2f", $item->{'credit'}) % : ''; % % my $refund = exists($item->{'refund'}) % ? sprintf("$money_char\%.2f", $item->{'refund'}) % : ''; % % my $target = exists($item->{'target'}) ? $item->{'target'} : ''; % % $balance += $item->{'charge'} if exists $item->{'charge'}; % $balance -= $item->{'payment'} if exists $item->{'payment'}; % $balance -= $item->{'credit'} if exists $item->{'credit'}; % $balance += $item->{'refund'} if exists $item->{'refund'}; % $balance = sprintf("%.2f", $balance); % $balance =~ s/^\-0\.00$/0.00/; #yay ieee fp % ( my $showbalance = $money_char. $balance ) =~ s/^\$\-/- \$/; % % > % unless ( !$target || $target{$target}++ ) { % } <% time2str($date_format, $item->{'date'}) %> % if ( $target && $target{$target} == 1 ) { % } <% $item->{'desc'} %> <% $charge %> <% $payment %> <% $credit %> <% $refund %> <% $showbalance %> % } %if ( scalar(@history) && $hidden && ! $seen++ ) { % balance_forward_row($balance, $lastdate, $money_char); %} <%init> my( $cust_main ) = @_; my $custnum = $cust_main->custnum; my $conf = new FS::Conf; my $date_format = $conf->config('date_format') || '%m/%d/%Y'; my $curuser = $FS::CurrentUser::CurrentUser; my @payby = grep /\w/, $conf->config('payby'); #@payby = (qw( CARD DCRD CHEK DCHK LECB BILL CASH WEST COMP )) @payby = (qw( CARD DCRD CHEK DCHK LECB BILL CASH COMP )) unless @payby; my %payby = map { $_=>1 } @payby; my %status = ( 'Queued' => 'O', #Open 'In-transit' => 'I', 'Complete' => 'R', #Resolved 'All' => '', ); #get payment history my @history = (); my %opt = ( ( map { $_ => scalar($conf->config($_)) } qw( card_refund-days date_format ) ), ( map { $_ => $conf->exists($_) } qw( deleteinvoices deletepayments deleterefunds pkg-balances ) ) ); #invoices foreach my $cust_bill ($cust_main->cust_bill) { push @history, { 'date' => $cust_bill->_date, 'desc' => include('payment_history/invoice.html', $cust_bill, %opt ), 'charge' => $cust_bill->charged, }; } #statements foreach my $cust_statement ($cust_main->cust_statement) { push @history, { 'date' => $cust_statement->_date, 'desc' => include('payment_history/statement.html', $cust_statement, %opt ), #'charge' => $cust_bill->charged, }; } #payments (some false laziness w/credits) foreach my $cust_pay ($cust_main->cust_pay) { push @history, { 'date' => $cust_pay->_date, 'desc' => include('payment_history/payment.html', $cust_pay, %opt ), 'payment' => $cust_pay->paid, #'target' => $target, #XXX }; } #voided payments foreach my $cust_pay_void ($cust_main->cust_pay_void) { push @history, { 'date' => $cust_pay_void->_date, 'desc' => include('payment_history/voided_payment.html', $cust_pay_void, %opt ), 'void_payment' => $cust_pay_void->paid, }; } #credits (some false laziness w/payments) foreach my $cust_credit ($cust_main->cust_credit) { push @history, { 'date' => $cust_credit->_date, 'desc' => include('payment_history/credit.html', $cust_credit, %opt ), 'credit' => $cust_credit->amount, }; } #refunds foreach my $cust_refund ($cust_main->cust_refund) { push @history, { 'date' => $cust_refund->_date, 'desc' => include('payment_history/refund.html', $cust_refund), 'refund' => $cust_refund->refund, }; }