RT#37064: Add action link to manually refund a payment
[freeside.git] / httemplate / view / cust_main / payment_history.html
index 204647f..1cd8386 100644 (file)
   <A HREF="<% $p %>edit/cust_pay.cgi?payby=MCRD;custnum=<% $custnum %>"><% mt('Post manual (offline/POS) credit card payment') |h %></A>
 % } 
 
   <A HREF="<% $p %>edit/cust_pay.cgi?payby=MCRD;custnum=<% $custnum %>"><% mt('Post manual (offline/POS) credit card payment') |h %></A>
 % } 
 
+% if ( $payby{'MCRD'} && $curuser->access_right('Post payment') ) { 
+  <% $s++ ? ' | ' : '' %>
+  <A HREF="<% $p %>edit/cust_pay.cgi?payby=MCHK;custnum=<% $custnum %>"><% mt('Post manual (offline) electronic check payment') |h %></A>
+% } 
+
 <% $s ? '<BR>' : '' %>
 
 %# credit links
 <% $s ? '<BR>' : '' %>
 
 %# credit links
   <A HREF="<% $p %>edit/cust_refund.cgi?payby=MCRD;custnum=<% $custnum %>"><% mt('Post manual (offline/POS) credit card refund') |h %></A>
 % } 
 
   <A HREF="<% $p %>edit/cust_refund.cgi?payby=MCRD;custnum=<% $custnum %>"><% mt('Post manual (offline/POS) credit card refund') |h %></A>
 % } 
 
+% if ( $payby{'MCHK'} && $curuser->access_right('Post refund') ) { 
+  <% $s++ ? ' | ' : '' %>
+  <A HREF="<% $p %>edit/cust_refund.cgi?payby=MCRD;custnum=<% $custnum %>"><% mt('Post manual (offline) electronic check refund') |h %></A>
+% } 
+
     </TD>
     <TD ALIGN="right" VALIGN="top">
 
 %# invoice reports, combined statement
 % if ( $curuser->access_right('List invoices') ) { 
     </TD>
     <TD ALIGN="right" VALIGN="top">
 
 %# invoice reports, combined statement
 % if ( $curuser->access_right('List invoices') ) { 
-%   if ( $num_cust_bill > 0 ) {
-  <A HREF="<% $p %>view/cust_main_statement-pdf.cgi?<% $custnum %>"><%
-  mt('Download typeset statement PDF') |h %></A>
+%   if ( $curuser->access_right('Resend invoices')
+%          && $cust_main->invoicing_list_emailonly ) {
+
+  <A HREF="<% $p %>misc/email-customer-statement.html?table=cust_main;agent_virt_agentnum=<% $cust_main->agentnum %>;custnum=<% $custnum %>"><% mt('Email statement to this customer') |h %></A>
   <BR>
   <BR>
+
+%   }
+%   if ( $num_cust_bill > 0
+%          && $curuser->access_right('View legacy typeset statements')
+%   ) {
+      <A HREF="<% $p %>view/cust_main_statement-pdf.cgi?<% $custnum %>"><%
+      mt('Download typeset statement PDF') |h %></A>
+      <BR>
 %   }
   <A HREF="<% $p %>search/report_cust_bill.html?custnum=<% $custnum %>"><% mt('Invoice reports') |h %></A>
 % } 
 %   }
   <A HREF="<% $p %>search/report_cust_bill.html?custnum=<% $custnum %>"><% mt('Invoice reports') |h %></A>
 % } 
@@ -413,9 +432,10 @@ my %opt = (
       (
         'View invoices', 'Void invoices', 'Unvoid invoices', 'Delete invoices',
         'Apply payment', 'Refund credit card payment', 'Refund Echeck payment',
       (
         'View invoices', 'Void invoices', 'Unvoid invoices', 'Delete invoices',
         'Apply payment', 'Refund credit card payment', 'Refund Echeck payment',
+        'Post refund', 'Post check refund', 'Post cash refund ', 'Refund payment',
         'Credit card void', 'Echeck void', 'Void payments', 'Unvoid payments',
         'Delete payment', 'Unapply payment',
         'Credit card void', 'Echeck void', 'Void payments', 'Unvoid payments',
         'Delete payment', 'Unapply payment',
-        'Apply credit', 'Delete Credit', 'Unapply credit',
+        'Apply credit', 'Delete credit', 'Unapply credit', 'Void credit', 'Unvoid credit',
         'Delete refund',
         'Billing event reports', 'View customer billing events',
       )
         'Delete refund',
         'Billing event reports', 'View customer billing events',
       )
@@ -432,6 +452,8 @@ $opt{'date_format'} ||= '%m/%d/%Y';
 foreach my $legacy_cust_bill ($cust_main->legacy_cust_bill) {
   push @history, {
     'date'   => $legacy_cust_bill->_date,
 foreach my $legacy_cust_bill ($cust_main->legacy_cust_bill) {
   push @history, {
     'date'   => $legacy_cust_bill->_date,
+    'order'  => 1,
+    'num'    => $legacy_cust_bill->legacyid,
     'desc'   => include('payment_history/legacy_invoice.html', $legacy_cust_bill, %opt ),
     'charge_nobal' => $legacy_cust_bill->charged,
   };
     'desc'   => include('payment_history/legacy_invoice.html', $legacy_cust_bill, %opt ),
     'charge_nobal' => $legacy_cust_bill->charged,
   };
@@ -442,6 +464,8 @@ my $num_cust_bill = 0;
 foreach my $cust_bill ($cust_main->cust_bill) {
   push @history, {
     'date'   => $cust_bill->_date,
 foreach my $cust_bill ($cust_main->cust_bill) {
   push @history, {
     'date'   => $cust_bill->_date,
+    'order'  => 1,
+    'num'    => $cust_bill->invnum,
     'desc'   => include('payment_history/invoice.html', $cust_bill, %opt ),
     'charge' => $cust_bill->charged,
   };
     'desc'   => include('payment_history/invoice.html', $cust_bill, %opt ),
     'charge' => $cust_bill->charged,
   };
@@ -452,6 +476,8 @@ foreach my $cust_bill ($cust_main->cust_bill) {
 foreach my $cust_bill_void ($cust_main->cust_bill_void) {
   push @history, {
     'date'        => $cust_bill_void->_date,
 foreach my $cust_bill_void ($cust_main->cust_bill_void) {
   push @history, {
     'date'        => $cust_bill_void->_date,
+    'order'       => 0,
+    'num'         => $cust_bill_void->invnum,
     'desc'        => include('payment_history/voided_invoice.html', $cust_bill_void, %opt ),
     'void_charge' => $cust_bill_void->charged,
   };
     'desc'        => include('payment_history/voided_invoice.html', $cust_bill_void, %opt ),
     'void_charge' => $cust_bill_void->charged,
   };
@@ -461,6 +487,8 @@ foreach my $cust_bill_void ($cust_main->cust_bill_void) {
 foreach my $cust_statement ($cust_main->cust_statement) {
   push @history, {
     'date'   => $cust_statement->_date,
 foreach my $cust_statement ($cust_main->cust_statement) {
   push @history, {
     'date'   => $cust_statement->_date,
+    'order'  => 2,
+    'num'    => $cust_statement->statementnum,
     'desc'   => include('payment_history/statement.html', $cust_statement, %opt ),
     #'charge' => $cust_bill->charged,
   };
     'desc'   => include('payment_history/statement.html', $cust_statement, %opt ),
     #'charge' => $cust_bill->charged,
   };
@@ -470,6 +498,8 @@ foreach my $cust_statement ($cust_main->cust_statement) {
 foreach my $cust_pay ($cust_main->cust_pay) {
   push @history, {
     'date'    => $cust_pay->_date,
 foreach my $cust_pay ($cust_main->cust_pay) {
   push @history, {
     'date'    => $cust_pay->_date,
+    'order'   => 6,
+    'num'     => $cust_pay->paynum,
     'desc'    => include('payment_history/payment.html', $cust_pay, %opt ),
     'payment' => $cust_pay->paid,
     #'target'  => $target, #XXX
     'desc'    => include('payment_history/payment.html', $cust_pay, %opt ),
     'payment' => $cust_pay->paid,
     #'target'  => $target, #XXX
@@ -480,6 +510,8 @@ foreach my $cust_pay ($cust_main->cust_pay) {
 foreach my $cust_pay_pending ($cust_main->cust_pay_pending) {
   push @history, {
     'date'    => $cust_pay_pending->_date,
 foreach my $cust_pay_pending ($cust_main->cust_pay_pending) {
   push @history, {
     'date'    => $cust_pay_pending->_date,
+    'order'   => 4,
+    'num'     => $cust_pay_pending->paypendingnum,
     'desc'    => include('payment_history/pending_payment.html', $cust_pay_pending, %opt ),
     'void_payment' => $cust_pay_pending->paid, 
   };
     'desc'    => include('payment_history/pending_payment.html', $cust_pay_pending, %opt ),
     'void_payment' => $cust_pay_pending->paid, 
   };
@@ -490,6 +522,8 @@ foreach my $cust_pay_pending ($cust_main->cust_pay_pending) {
 foreach my $cust_pay_void ($cust_main->cust_pay_void) {
   push @history, {
     'date'   => $cust_pay_void->_date,
 foreach my $cust_pay_void ($cust_main->cust_pay_void) {
   push @history, {
     'date'   => $cust_pay_void->_date,
+    'order'  => 3,
+    'num'    => $cust_pay_void->paynum,
     'desc'   => include('payment_history/voided_payment.html', $cust_pay_void, %opt ),
     'void_payment' => $cust_pay_void->paid,
   };
     'desc'   => include('payment_history/voided_payment.html', $cust_pay_void, %opt ),
     'void_payment' => $cust_pay_void->paid,
   };
@@ -500,6 +534,8 @@ foreach my $cust_pay_void ($cust_main->cust_pay_void) {
 foreach my $cust_credit_void ($cust_main->cust_credit_void) {
   push @history, {
     'date'        => $cust_credit_void->_date,
 foreach my $cust_credit_void ($cust_main->cust_credit_void) {
   push @history, {
     'date'        => $cust_credit_void->_date,
+    'order'       => 7,
+    'num'         => $cust_credit_void->paynum,
     'desc'        => include('payment_history/voided_credit.html', $cust_credit_void, %opt ),
     'void_credit' => $cust_credit_void->amount,
   };
     'desc'        => include('payment_history/voided_credit.html', $cust_credit_void, %opt ),
     'void_credit' => $cust_credit_void->amount,
   };
@@ -509,6 +545,8 @@ foreach my $cust_credit_void ($cust_main->cust_credit_void) {
 foreach my $cust_pay_pending ($cust_main->cust_pay_pending_attempt) {
   push @history, {
     'date'    => $cust_pay_pending->_date,
 foreach my $cust_pay_pending ($cust_main->cust_pay_pending_attempt) {
   push @history, {
     'date'    => $cust_pay_pending->_date,
+    'order'   => 5,
+    'num'     => $cust_pay_pending->paypendingnum,
     'desc'    => include('payment_history/attempted_payment.html', $cust_pay_pending, %opt ),
     'void_payment' => $cust_pay_pending->paid, #??
     #'target'  => $target, #XXX
     'desc'    => include('payment_history/attempted_payment.html', $cust_pay_pending, %opt ),
     'void_payment' => $cust_pay_pending->paid, #??
     #'target'  => $target, #XXX
@@ -521,6 +559,8 @@ foreach my $cust_pay_batch (
   my $pay_batch = $cust_pay_batch->pay_batch;
   push @history, {
     'date'    => $pay_batch->upload,
   my $pay_batch = $cust_pay_batch->pay_batch;
   push @history, {
     'date'    => $pay_batch->upload,
+    'order'   => 5,
+    'num'     => $cust_pay_batch->paybatchnum,
     'desc'    => include('payment_history/attempted_batch_payment.html', $cust_pay_batch, %opt),
     'void_payment' => $cust_pay_batch->amount,
   };
     'desc'    => include('payment_history/attempted_batch_payment.html', $cust_pay_batch, %opt),
     'void_payment' => $cust_pay_batch->amount,
   };
@@ -530,6 +570,8 @@ foreach my $cust_pay_batch (
 foreach my $cust_credit ($cust_main->cust_credit) {
   push @history, {
     'date'   => $cust_credit->_date,
 foreach my $cust_credit ($cust_main->cust_credit) {
   push @history, {
     'date'   => $cust_credit->_date,
+    'order'  => 8,
+    'num'    => $cust_credit->crednum,
     'desc'   => include('payment_history/credit.html', $cust_credit, %opt ),
     'credit' => $cust_credit->amount,
   };
     'desc'   => include('payment_history/credit.html', $cust_credit, %opt ),
     'credit' => $cust_credit->amount,
   };
@@ -540,6 +582,8 @@ foreach my $cust_credit ($cust_main->cust_credit) {
 foreach my $cust_refund ($cust_main->cust_refund) {
   push @history, {
     'date'   => $cust_refund->_date,
 foreach my $cust_refund ($cust_main->cust_refund) {
   push @history, {
     'date'   => $cust_refund->_date,
+    'order'  => 9,
+    'num'    => $cust_refund->refundnum,
     'desc'   => include('payment_history/refund.html', $cust_refund, %opt),
     'refund' => $cust_refund->refund,
   };
     'desc'   => include('payment_history/refund.html', $cust_refund, %opt),
     'refund' => $cust_refund->refund,
   };
@@ -551,7 +595,12 @@ my $years =  $conf->config('payment_history-years') || 2;
 my $older_than = time - $years * 31556926; #60*60*24*365.2422
 my $balance = 0;
 
 my $older_than = time - $years * 31556926; #60*60*24*365.2422
 my $balance = 0;
 
-@history = sort { $a->{date} <=> $b->{date} } @history;
+@history = sort {    $a->{date}  <=> $b->{date}
+                  or $a->{order} <=> $b->{order}
+                  or $a->{num}   <=> $b->{num}
+                }
+             @history;
+
 my $i = 0;
 my $balance_forward;
 foreach my $item (@history) {
 my $i = 0;
 my $balance_forward;
 foreach my $item (@history) {
@@ -578,7 +627,11 @@ if ( @history and $history[-1]->{'hide'} ) {
 
 # then sort in user-pref order
 if ( $curuser->option('history_order') eq 'newest' ) {
 
 # then sort in user-pref order
 if ( $curuser->option('history_order') eq 'newest' ) {
-  @history = sort { $b->{date} <=> $a->{date} } @history;
+  @history = sort {    $b->{date}  <=> $a->{date}
+                    or $b->{order} <=> $a->{order} #or still forward here?
+                    or $b->{num}   <=> $a->{num}
+                  }
+               @history;
 } # else it's already oldest-first, and there are no other options yet
 
 sub translate_payby {
 } # else it's already oldest-first, and there are no other options yet
 
 sub translate_payby {
@@ -616,13 +669,18 @@ sub translate_payinfo {
     my $payby = $object->payby;
     my $payinfo = $object->payinfo;
 
     my $payby = $object->payby;
     my $payinfo = $object->payinfo;
 
-    my $conf = new FS::Conf;
-
     if ( $payby eq 'CARD' ) {
         $payinfo = $object->paymask;
     } elsif ( $payby eq 'CHEK' ) {
     if ( $payby eq 'CARD' ) {
         $payinfo = $object->paymask;
     } elsif ( $payby eq 'CHEK' ) {
+        #false laziness w/payinfo_Mixin::payby_payinfo_pretty, should use that
         my( $account, $aba ) = split('@', $object->paymask );
         my( $account, $aba ) = split('@', $object->paymask );
-        $payinfo = emt("ABA [_1], Acct #[_2]",$aba,$account);
+        if ( $aba =~ /^(\d{5})\.(\d{3})$/ ) { #blame canada
+          my($branch, $routing) = ($1, $2);
+          $payinfo = emt("Routing [_1], Branch [_2], Acct [_3]",
+                         $routing, $branch, $account);
+        } else {
+          $payinfo = emt("Routing [_1], Acct [_2]", $aba, $account);
+        }
     }
 
     ($payby,$payinfo);
     }
 
     ($payby,$payinfo);