promised payment date for invoices, #13554
[freeside.git] / httemplate / view / cust_main / payment_history.html
index f2abe0e..63708e6 100644 (file)
@@ -1,56 +1,59 @@
+<TABLE>
+  <TR>
+    <TD ALIGN="left">
+
 %# 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',
+  <& /elements/popup_link-cust_main.html,
+               'label'       => emt('Enter check payment'),
                'action'      => "${p}edit/cust_pay.cgi?popup=1;payby=BILL",
                'cust_main'   => $cust_main,
-               'actionlabel' => 'Enter check payment',
+               'actionlabel' => emt('Enter check payment'),
                'width'       => 392,
-               #default# 'height' => 336,
-            )
-  %>
+  &>
 % } 
 
-% 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',
+  <& /elements/popup_link-cust_main.html,
+               'label'       => emt('Enter cash payment'),
                'action'      => "${p}edit/cust_pay.cgi?popup=1;payby=CASH",
                'cust_main'   => $cust_main,
-               'actionlabel' => 'Enter cash payment',
+               'actionlabel' => emt('Enter cash payment'),
                'width'       => 392,
-               #default# 'height' => 336,
-            )
-  %>
+  &>
 % } 
 
 % if ( $payby{'WEST'} && $curuser->access_right('Post payment') ) { 
   <% $s++ ? ' | ' : '' %>
-  <A HREF="<% $p %>edit/cust_pay.cgi?payby=WEST;custnum=<% $custnum %>">Enter Western Union payment</A>
+  <A HREF="<% $p %>edit/cust_pay.cgi?payby=WEST;custnum=<% $custnum %>"><% mt('Enter Western Union payment') |h %></A>
 % } 
 
+<BR>
+% $s=0;
+
 % 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++ ? ' | ' : '' %>
-  <A HREF="<% $p %>misc/payment.cgi?payby=CARD;custnum=<% $custnum %>">Process credit card payment</A>
+  <A HREF="<% $p %>misc/payment.cgi?payby=CARD;custnum=<% $custnum %>"><% mt('Process credit card payment') |h %></A>
 % } 
 
 % 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++ ? ' | ' : '' %>
-  <A HREF="<% $p %>misc/payment.cgi?payby=CHEK;custnum=<% $custnum %>">Process electronic check (ACH) payment</A>
+  <A HREF="<% $p %>misc/payment.cgi?payby=CHEK;custnum=<% $custnum %>"><% mt('Process electronic check (ACH) payment') |h %></A>
 % } 
 
 % if ( $payby{'MCRD'} && $curuser->access_right('Post payment') ) { 
   <% $s++ ? ' | ' : '' %>
-  <A HREF="<% $p %>edit/cust_pay.cgi?payby=MCRD;custnum=<% $custnum %>">Post manual (offline/POS) credit card payment</A>
+  <A HREF="<% $p %>edit/cust_pay.cgi?payby=MCRD;custnum=<% $custnum %>"><% mt('Post manual (offline/POS) credit card payment') |h %></A>
 % } 
 
 <BR>
 %# credit link
 
 % if ( $curuser->access_right('Post credit') ) { 
-  <% include('/elements/popup_link-cust_main.html',
-               'label'       => 'Enter credit',
+  <& /elements/popup_link-cust_main.html,
+               'label'       => emt('Enter credit'),
                'action'      => "${p}edit/cust_credit.cgi",
                'cust_main'   => $cust_main,
-               'actionlabel' => 'Enter credit',
-               'width'       => 392,
-               #default# 'height' => 336,
-            )
-  %>
+               'actionlabel' => emt('Enter credit'),
+               'width'       => 616, #make room for reasons #540 default
+  &>
   <BR>
 % } 
 
 %# 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',
+  <& /elements/popup_link-cust_main.html,
+               'label'       => emt('Enter check refund'),
                'action'      => "${p}edit/cust_refund.cgi?popup=1;payby=BILL",
                'cust_main'   => $cust_main,
-               'actionlabel' => 'Enter check refund',
+               'actionlabel' => emt('Enter check refund'),
                'width'       => 392,
-               #default# 'height' => 336,
-            )
-  %>
+  &>
 % } 
 
-% 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',
+  <& /elements/popup_link-cust_main.html,
+               'label'       => emt('Enter cash refund'),
                'action'      => "${p}edit/cust_refund.cgi?popup=1;payby=CASH",
                'cust_main'   => $cust_main,
-               'actionlabel' => 'Enter cash refund',
+               'actionlabel' => emt('Enter cash refund'),
                'width'       => 392,
-               #default# 'height' => 336,
-            )
-  %>
+  &>
 % } 
 
 %# someday, perhaps.  very few gateways let you do unlinked refunds at all.
 
 % if ( $payby{'MCRD'} && $curuser->access_right('Post refund') ) { 
   <% $s++ ? ' | ' : '' %>
-  <A HREF="<% $p %>edit/cust_refund.cgi?payby=MCRD;custnum=<% $custnum %>">Post manual (offline/POS) credit card refund</A>
+  <A HREF="<% $p %>edit/cust_refund.cgi?payby=MCRD;custnum=<% $custnum %>"><% mt('Post manual (offline/POS) credit card refund') |h %></A>
 % } 
 
+    </TD>
+    <TD ALIGN="right" VALIGN="top">
+
+%# invoice reports
+% if ( $curuser->access_right('List invoices') ) { 
+  <A HREF="<% $p %>search/report_cust_bill.html?custnum=<% $custnum %>"><% mt('Invoice reports') |h %></A>
+% } 
 <BR>
 
+%# XXX payments, credits, refund reports
+
 %# tax exemption link
 
-% if ( $curuser->access_right('View customer tax exemptions') ) { 
-  <A HREF="<% $p %>search/cust_tax_exempt_pkg.cgi?custnum=<% $custnum %>">View tax exemptions</A>
+% 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 ) {
+      <A HREF="<% $p %>search/cust_tax_exempt_pkg.cgi?custnum=<% $custnum %>"><% mt('View tax exemptions') |h %></A>
+      <% $add_adjustment ? '|' : '' %>
+%   } 
+
+%   if ( $add_adjustment ) {
+      <& /elements/popup_link.html, {
+           'action' => $p.'edit/cust_tax_adjustment.html?custnum='. $cust_main->custnum,
+           'label'  => emt('Add tax adjustment'),
+           'actionlabel' => emt('Add tax adjustment'),
+           'height' => 200,
+         }
+      &>
+      |
+      <A HREF="<% $p %>search/cust_tax_adjustment.html?custnum=<% $custnum %>"><% mt('View tax adjustments') |h %></A>
+%   } 
+
   <BR>
-% } 
+% }
 
 %# batched payment links
 
 %      && $curuser->access_right('View customer batched payments')
 %    )
 % { 
-    View batched payments:
+    <% mt('View batched payments:') |h %> 
 %   foreach my $status (qw( Queued In-transit Complete All )) {
-      <A HREF="<% $p %>search/cust_pay_batch.cgi?status=<% $status{$status} %>;custnum=<% $custnum %>"><% $status %></A> 
+      <A HREF="<% $p %>search/cust_pay_batch.cgi?status=<% $status{$status} %>;custnum=<% $custnum %>"><% mt($status) |h %></A> 
       <% $status ne 'All' ? '|' : '' %>
 %   }
     <BR>
 %      && scalar($cust_main->cust_pay_pending)
 %    )
 % {
-    <A HREF="<% $p %>search/cust_pay_pending.html?magic=_date;statusNOT=done;custnum=<% $custnum %>">View pending payments</A><BR>
+    <A HREF="<% $p %>search/cust_pay_pending.html?magic=_date;statusNOT=done;custnum=<% $custnum %>"><% mt('View pending payments') |h %></A><BR>
 % }
 
+    </TD>
+  </TR>
+  <TR>
+    <TD COLSPAN=2>
+
 %# and now the table
 
-<% include("/elements/table-grid.html") %>
+<& /elements/table-grid.html &>
 % my $bgcolor1 = '#eeeeee';
 %   my $bgcolor2 = '#ffffff';
 %   my $bgcolor = '';
 
 <TR>
-  <TH CLASS="grid" BGCOLOR="#cccccc">Date</TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc">Description</TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1>Invoice</FONT></TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1>Payment</FONT></TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1>In-house<BR>Credit</FONT></TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1>Refund</FONT></TH>
-  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1>Balance</FONT></TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc"><% mt('Date') |h %></TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc"><% mt('Description') |h %></TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1><% mt('Invoice') |h %></FONT></TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1><% mt('Payment') |h %></FONT></TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1><% mt('In-house Credit') |h %></FONT></TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1><% mt('Refund') |h %></FONT></TH>
+  <TH CLASS="grid" BGCOLOR="#cccccc"><FONT SIZE=-1><% mt('Balance') |h %></FONT></TH>
 </TR>
 
 %#display payment history
 
    <TR ID="balance_forward_row">
      <TD CLASS="grid" BGCOLOR="#dddddd">
-       <% time2str("%D",$date) %>
+       <% time2str($date_format, $date) %>
      </TD>
 
      <TD CLASS="grid" BGCOLOR="#dddddd">
-       <I>Starting balance on <% time2str("%D",$date) %></I>
-       (<A HREF="javascript:void(0);" onClick="show_history();">show prior history</A>)
+       <I><% mt("Starting balance on [_1]", time2str($date_format, $date) ) |h %></I>
+       (<A HREF="javascript:void(0);" onClick="show_history();"><% mt('show prior history') |h %></A>)
      </TD>
 
      <TD CLASS="grid" BGCOLOR="#dddddd"></TD>
 %my %target = ();
 %
 %my $years =  $conf->config('payment_history-years') || 2;
-%my $older_than = time - $years * 31556736; #60*60*24*365.24
+%my $older_than = time - $years * 31556926; #60*60*24*365.2422
 %my $hidden = 0;
 %my $seen = 0;
 %my $old_history = 0;
 %
 %  my $charge  = exists($item->{'charge'})
 %                  ? sprintf("$money_char\%.2f", $item->{'charge'})
-%                  : '';
+%                  : exists($item->{'charge_nobal'})
+%                    ? sprintf("$money_char\%.2f", $item->{'charge_nobal'})
+%                    : '';
 %
 %  my $payment = exists($item->{'payment'})
 %                  ? sprintf("-&nbsp;$money_char\%.2f", $item->{'payment'})
 
 
   <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 %>">
 % } 
 
-      <% time2str("%D",$item->{'date'}) %>
+      <% time2str($date_format, $item->{'date'}) %>
 % if ( $target && $target{$target} == 1 ) { 
 
         </A>
     <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>
 %}
 
 </TABLE>
+    </TD>
+  </TR>
+</TABLE>
 
 <SCRIPT TYPE="text/javascript">
 
@@ -332,6 +369,7 @@ 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;
 
@@ -351,13 +389,25 @@ my %status = (
 #get payment history
 my @history = ();
 
-my %opt =
+my %opt = (
   ( map { $_ => scalar($conf->config($_)) }
-        qw( card_refund-days )
+        qw( card_refund-days date_format )
   ),
   ( map { $_ => $conf->exists($_) } 
-        qw( deletepayments deleterefunds )
-  );
+        qw( deleteinvoices deletepayments deleterefunds pkg-balances )
+  )
+);
+
+$opt{'date_format'} ||= '%m/%d/%Y';
+
+#legacy invoices
+foreach my $legacy_cust_bill ($cust_main->legacy_cust_bill) {
+  push @history, {
+    'date'   => $legacy_cust_bill->_date,
+    'desc'   => include('payment_history/legacy_invoice.html', $legacy_cust_bill, %opt ),
+    'charge_nobal' => $legacy_cust_bill->charged,
+  };
+}
 
 #invoices
 foreach my $cust_bill ($cust_main->cust_bill) {
@@ -368,6 +418,15 @@ foreach my $cust_bill ($cust_main->cust_bill) {
   };
 }
 
+#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, {
@@ -378,21 +437,41 @@ 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, {
     'date'   => $cust_pay_void->_date,
-    'desc'   => include('payment_history/voided_payment.html', $cust_pay_void),
+    'desc'   => include('payment_history/voided_payment.html', $cust_pay_void, %opt ),
     'void_payment' => $cust_pay_void->paid,
   };
 
 }
 
+#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, {
     'date'   => $cust_credit->_date,
-    'desc'   => include('payment_history/credit.html', $cust_credit),
+    'desc'   => include('payment_history/credit.html', $cust_credit, %opt ),
     'credit' => $cust_credit->amount,
   };
 
@@ -408,4 +487,54 @@ foreach my $cust_refund ($cust_main->cust_refund) {
 
 }
 
+sub translate_payby {
+    my ($payby,$payinfo) = (shift,shift);
+    my %payby = (
+        BILL    => $payinfo ? emt('Check #') : '',
+        CHEK    => emt('Electronic check '),
+        PREP    => emt('Prepaid card '),
+        CARD    => emt('Credit card #'),
+        COMP    => emt('Complimentary by '),
+        CASH    => emt('Cash'),
+        WEST    => emt('Western Union'),
+        MCRD    => emt('Manual credit card'),
+    );
+    $payby = (exists $payby{$payby}) ? $payby{$payby} : $payby; 
+    $payby;
+};
+
+sub translate_payby_refund {
+    my ($payby,$payinfo) = (shift,shift);
+    my %payby = (
+        BILL    => $payinfo ? emt('Check #') : emt('Check'),
+        CHEK    => emt('Electronic check '),
+        CARD    => emt('Credit card #'),
+        COMP    => emt('Complimentary by '),
+    );
+    $payby = (exists $payby{$payby}) ? $payby{$payby} : $payby; 
+    $payby;
+};
+
+sub translate_payinfo {
+    my $object = shift;
+    my $payby = $object->payby;
+    my $payinfo = $object->payinfo;
+
+    my $conf = new FS::Conf;
+
+    if ( $payby eq 'CARD' ) {
+        $payinfo = $object->paymask;
+    } elsif ( $payby eq 'CHEK' ) {
+        my( $account, $aba ) = split('@', $object->paymask );
+        $payinfo = emt("ABA [_1], Acct #[_2]",$aba,$account);
+    }
+
+    ($payby,$payinfo);
+}
+
+sub areyousure_link {
+    my ($url,$msg,$title,$label) = (shift,shift,shift,shift);
+    ' (<A HREF="javascript:areyousure(\''.$url.'\',\''.$msg.'\')" TITLE="'.$title.'">'.$label.'</A>)';
+}
+
 </%init>