add CASH and WEST payment types (payments only, not cust_main.payby)
authorivan <ivan>
Fri, 21 Oct 2005 15:21:37 +0000 (15:21 +0000)
committerivan <ivan>
Fri, 21 Oct 2005 15:21:37 +0000 (15:21 +0000)
13 files changed:
FS/FS/Conf.pm
FS/FS/cust_main.pm
FS/FS/cust_pay.pm
FS/FS/cust_pay_void.pm
FS/FS/cust_refund.pm
httemplate/edit/cust_main.cgi
httemplate/edit/cust_main/billing.html
httemplate/edit/cust_pay.cgi
httemplate/edit/process/cust_main.cgi
httemplate/search/cust_pay.cgi
httemplate/search/report_cust_pay.html
httemplate/view/cust_bill.cgi
httemplate/view/cust_main/payment_history.html

index 7ba0f35..4edcb99 100644 (file)
@@ -1294,11 +1294,19 @@ httemplate/docs/config.html
   },
 
   {
+    'key'         => 'payby',
+    'section'     => 'billing',
+    'description' => 'Available payment types.',
+    'type'        => 'selectmultiple',
+    'select_enum' => [ qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST COMP) ],
+  },
+
+  {
     'key'         => 'payby-default',
     'section'     => 'UI',
     'description' => 'Default payment type.  HIDE disables display of billing information and sets customers to BILL.',
     'type'        => 'select',
-    'select_enum' => [ '', qw(CARD DCRD CHEK DCHK LECB BILL COMP HIDE) ],
+    'select_enum' => [ '', qw(CARD DCRD CHEK DCHK LECB BILL CASH WEST COMP HIDE) ],
   },
 
   {
index b85dff4..d131af9 100644 (file)
@@ -360,6 +360,7 @@ sub insert {
 
   my $prepay_identifier = '';
   my( $amount, $seconds ) = ( 0, 0 );
+  my $payby = '';
   if ( $self->payby eq 'PREPAY' ) {
 
     $self->payby('BILL');
@@ -373,6 +374,14 @@ sub insert {
       return $error;
     }
 
+    $payby = 'PREP' if $amount;
+
+  } elsif ( $self->payby =~ /^(CASH|WEST)$/ ) {
+
+    $payby = $1;
+    $self->payby('BILL');
+    $amount = $self->paid;
+
   }
 
   my $error = $self->SUPER::insert;
@@ -405,13 +414,15 @@ sub insert {
   }
 
   if ( $amount ) {
-    $error = $self->insert_cust_pay_prepay($amount, $prepay_identifier);
+    $error = $self->insert_cust_pay($payby, $amount, $prepay_identifier);
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;
-      return "inserting prepayment (transaction rolled back): $error";
+      return "inserting payment (transaction rolled back): $error";
     }
   }
 
+
+
   unless ( $import || $skip_fuzzyfiles ) {
     $error = $self->queue_fuzzyfiles_update;
     if ( $error ) {
@@ -691,14 +702,42 @@ If there is an error, returns the error, otherwise returns false.
 =cut
 
 sub insert_cust_pay_prepay {
-  my( $self, $amount ) = splice(@_, 0, 2);
+  shift->insert_cust_pay('PREP', @_);
+}
+
+=item insert_cust_pay_cash AMOUNT [ PAYINFO ]
+
+Inserts a cash payment in the specified amount for this customer.  An optional
+second argument can specify the payment identifier for tracking purposes.
+If there is an error, returns the error, otherwise returns false.
+
+=cut
+
+sub insert_cust_pay_cash {
+  shift->insert_cust_pay('CASH', @_);
+}
+
+=item insert_cust_pay_prepay AMOUNT [ PAYINFO ]
+
+Inserts a Western Union payment in the specified amount for this customer.  An
+optional second argument can specify the prepayment identifier for tracking
+purposes.  If there is an error, returns the error, otherwise returns false.
+
+=cut
+
+sub insert_cust_pay_west {
+  shift->insert_cust_pay('WEST', @_);
+}
+
+sub insert_cust_pay {
+  my( $self, $payby, $amount ) = splice(@_, 0, 3);
   my $payinfo = scalar(@_) ? shift : '';
 
   my $cust_pay = new FS::cust_pay {
     'custnum' => $self->custnum,
     'paid'    => sprintf('%.2f', $amount),
     #'_date'   => #date the prepaid card was purchased???
-    'payby'   => 'PREP',
+    'payby'   => $payby,
     'payinfo' => $payinfo,
   };
   $cust_pay->insert;
@@ -1105,7 +1144,7 @@ sub check {
     }
   }
 
-  $self->payby =~ /^(CARD|DCRD|CHEK|DCHK|LECB|BILL|COMP|PREPAY)$/
+  $self->payby =~ /^(CARD|DCRD|CHEK|DCHK|LECB|BILL|COMP|PREPAY|CASH|WEST)$/
     or return "Illegal payby: ". $self->payby;
 
   $error =    $self->ut_numbern('paystart_month')
@@ -1242,7 +1281,7 @@ sub check {
 
   if ( $self->paydate eq '' || $self->paydate eq '-' ) {
     return "Expriation date required"
-      unless $self->payby =~ /^(BILL|PREPAY|CHEK|LECB)$/;
+      unless $self->payby =~ /^(BILL|PREPAY|CHEK|LECB|CASH|WEST)$/;
     $self->paydate('');
   } else {
     my( $m, $y );
index a7d6990..3772473 100644 (file)
@@ -61,7 +61,8 @@ currently supported:
 L<Time::Local> and L<Date::Parse> for conversion functions.
 
 =item payby - `CARD' (credit cards), `CHEK' (electronic check/ACH),
-`LECB' (phone bill billing), `BILL' (billing), or `COMP' (free)
+`LECB' (phone bill billing), `BILL' (billing), `PREP` (prepaid card),
+`CASH' (cash), `WEST' (Western Union) or `COMP' (free)
 
 =item payinfo - card number, check #, or comp issuer (4-8 lowercase alphanumerics; think username), respectively
 
@@ -373,7 +374,8 @@ sub check {
 
   $self->_date(time) unless $self->_date;
 
-  $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|PREP)$/ or return "Illegal payby";
+  $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|PREP|CASH|WEST)$/
+    or return "Illegal payby";
   $self->payby($1);
 
   #false laziness with cust_refund::check
index 7267929..6437163 100644 (file)
@@ -47,7 +47,8 @@ are currently supported:
 L<Time::Local> and L<Date::Parse> for conversion functions.
 
 =item payby - `CARD' (credit cards), `CHEK' (electronic check/ACH),
-`LECB' (phone bill billing), `BILL' (billing), or `COMP' (free)
+`LECB' (phone bill billing), `BILL' (billing), `CASH' (cash),
+`WEST' (Western Union) or `COMP' (free)
 
 =item payinfo - card number, check #, or comp issuer (4-8 lowercase alphanumerics; think username), respectively
 
@@ -128,7 +129,8 @@ sub check {
 
   $self->void_date(time) unless $self->void_date;
 
-  $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP)$/ or return "Illegal payby";
+  $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|PREP|CASH|WEST)$/
+    or return "Illegal payby";
   $self->payby($1);
 
   #false laziness with cust_refund::check
index 106ccd3..48cc7cc 100644 (file)
@@ -51,7 +51,8 @@ inherits from FS::Record.  The following fields are currently supported:
 L<Time::Local> and L<Date::Parse> for conversion functions.
 
 =item payby - `CARD' (credit cards), `CHEK' (electronic check/ACH),
-`LECB' (Phone bill billing), `BILL' (billing), or `COMP' (free)
+`LECB' (Phone bill billing), `BILL' (billing), `CASH' (cash),
+`WEST' (Western Union), or `COMP' (free)
 
 =item payinfo - card number, P.O.#, or comp issuer (4-8 lowercase alphanumerics; think username)
 
@@ -211,7 +212,8 @@ sub check {
     unless $self->crednum 
            || qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
 
-  $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP)$/ or return "Illegal payby";
+  $self->payby =~ /^(CARD|CHEK|LECB|BILL|COMP|CASH|WEST)$/
+    or return "Illegal payby";
   $self->payby($1);
 
   #false laziness with cust_pay::check
index bfd3968..e10c85f 100755 (executable)
@@ -35,6 +35,7 @@ if ( $cgi->param('error') ) {
   $popnum = $cgi->param('popnum');
   @invoicing_list = split( /\s*,\s*/, $cgi->param('invoicing_list') );
   $same = $cgi->param('same');
+  $cust_main->setfield('paid' => $cgi->param('paid')) if $cgi->param('paid');
 } elsif ( $cgi->keywords ) { #editing
   my( $query ) = $cgi->keywords;
   $query =~ /^(\d+)$/;
@@ -261,7 +262,8 @@ function bottomfixup(what) {
     'payinfo', 'payinfo1', 'payinfo2',
     'payname', 'exp_month', 'exp_year', 'paycvv',
     'paystart_month', 'paystart_year', 'payissue',
-    'payip'
+    'payip',
+    'paid'
   );
 
   var billing_bottomvars = new Array(
@@ -340,6 +342,7 @@ function copyelement(from, to) {
      'payname', 'exp_month', 'exp_year', 'paycvv',
      'paystart_month', 'paystart_year', 'payissue',
      'payip',
+     'paid',
      
      'tax',
      'invoicing_list', 'invoicing_list_POST', 'invoicing_list_FAX'
index 17b1b0c..caac3a9 100644 (file)
@@ -4,6 +4,11 @@ my( $cust_main ) = @_;
 my $conf = new FS::Conf;
 my $payby_default = $conf->config('payby-default');
 
+my @payby = $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 grep /\w/, @payby;
+
 if ( $payby_default eq 'HIDE' ) {
 
   $cust_main->payby('BILL') unless $cust_main->payby;
@@ -294,15 +299,60 @@ if ( $payby_default eq 'HIDE' ) {
 
       '</TABLE>',
 
+    'CASH' =>
+
+      '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+
+        qq!<TR><TD ALIGN="right" WIDTH="200">${r}Amount </TD>!.
+          qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="paid" VALUE="!. ( $payby eq 'CASH' ? $cust_main->paid : '' ). qq!"></TD></TR>!.
+
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+
+      '</TABLE>',
+
+    'WEST' =>
+
+      '<TABLE BGCOLOR="#cccccc" BORDER=0 CELLSPACING=0 HEIGHT=192>'.
+
+        qq!<TR><TD ALIGN="right" WIDTH="200">${r}Amount </TD>!.
+          qq!<TD WIDTH="408"><INPUT TYPE="text" NAME="paid" VALUE="!. ( $payby eq 'WEST' ? $cust_main->paid : '' ). qq!"></TD></TR>!.
+
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+        '<TR><TD>&nbsp;</TD></TR>'.
+
+      '</TABLE>',
+
   );
 
-  tie my %options, 'Tie::IxHash',
+
+  my %allopt = (
     'CARD' => 'Credit card',
     'CHEK' => 'Electronic check',
     'LECB' => 'Phone bill billing',
     'BILL' => 'Billing',
+    'CASH' => 'Cash', # initial payment, then billing',
+    'WEST' => 'Western Union', # initial payment, then billing',
     'COMP' => 'Complimentary',
-  ;
+  );
+  if ( $cust_main->custnum ) { #don't offer CASH and WEST initial payment types
+                               # when editing customer
+    delete $allopt{$_} for qw(CASH WEST);
+  }
+  
+  tie my %options, 'Tie::IxHash',
+    map  { $_ => $allopt{$_} }
+    grep { exists $allopt{$_} }
+         @payby;
+
   my %payby2option = (
     ( map { $_ => $_ } keys %options ),
     'DCRD' => 'CARD',
index c0a679b..b2f3f55 100755 (executable)
@@ -1,8 +1,13 @@
-<!-- mason kludge -->
 <%
 
 my $conf = new FS::Conf;
 
+my %payby = (
+  'BILL' => 'Check',
+  'CASH' => 'Cash',
+  'WEST' => 'Western Union',
+);
+
 my($link, $linknum, $paid, $payby, $payinfo, $quickpay, $_date); 
 if ( $cgi->param('error') ) {
   $link     = $cgi->param('link');
@@ -12,31 +17,29 @@ if ( $cgi->param('error') ) {
   $payinfo  = $cgi->param('payinfo');
   $quickpay = $cgi->param('quickpay');
   $_date    = $cgi->param('_date') ? str2time($cgi->param('_date')) : time;
-} elsif ($cgi->keywords) {
-  my($query) = $cgi->keywords;
-  $query =~ /^(\d+)$/;
-  $link     = 'invnum';
-  $linknum  = $1;
-  $paid     = '';
-  $payby    = 'BILL';
-  $payinfo  = "";
-  $quickpay = '';
-  $_date    = time;
-} elsif ( $cgi->param('custnum')  =~ /^(\d+)$/ ) {
+} elsif ( $cgi->param('custnum') =~ /^(\d+)$/ ) {
   $link     = 'custnum';
   $linknum  = $1;
   $paid     = '';
-  $payby    = 'BILL';
+  $payby    = $cgi->param('payby') || 'BILL';
   $payinfo  = '';
   $quickpay = $cgi->param('quickpay');
   $_date    = time;
+} elsif ( $cgi->param('invnum') =~ /^(\d+)$/ ) {
+  $link     = 'invnum';
+  $linknum  = $1;
+  $paid     = '';
+  $payby    = $cgi->param('payby') || 'BILL';
+  $payinfo  = "";
+  $quickpay = '';
+  $_date    = time;
 } else {
   die "illegal query ". $cgi->keywords;
 }
 
 my $paybatch = "webui-$_date-$$-". rand() * 2**32;
 
-my $title = 'Post payment';
+my $title = 'Post '. $payby{$payby}. ' payment';
 $title .= " against Invoice #$linknum" if $link eq 'invnum';
 
 %>
@@ -97,13 +100,18 @@ Payment
 <TR>
   <TD ALIGN="right">Amount</TD>
   <TD BGCOLOR="#ffffff" ALIGN="right"><%= $money_char %></TD>
-  <TD><INPUT TYPE="text" NAME="paid" VALUE="<%= $paid %>" SIZE=8 MAXLENGTH=8></TD>
-</TR>
-<TR>
-  <TD ALIGN="right">Check #</TD>
-  <TD COLSPAN=2><INPUT TYPE="text" NAME="payinfo" VALUE="<%= $payinfo %>" SIZE=10></TD>
+  <TD><INPUT TYPE="text" NAME="paid" VALUE="<%= $paid %>" SIZE=8 MAXLENGTH=8> by <B><%= $payby{$payby} %></B></TD>
 </TR>
 
+<% if ( $payby eq 'BILL' ) { %>
+
+  <TR>
+    <TD ALIGN="right">Check #</TD>
+    <TD COLSPAN=2><INPUT TYPE="text" NAME="payinfo" VALUE="<%= $payinfo %>" SIZE=10></TD>
+  </TR>
+
+<% } %>
+
 <TR>
 <% if ( $link eq 'custnum' ) { %>
   <TD ALIGN="right">Auto-apply<BR>to invoices</TD>
index 85dbb97..d77aa2f 100755 (executable)
@@ -55,6 +55,9 @@ if ( defined($cgi->param('same')) && $cgi->param('same') eq "Y" ) {
   );
 }
 
+$new->setfield('paid', $cgi->param('paid') )
+  if $cgi->param('paid');
+
 #perhaps this stuff should go to cust_main.pm
 my $cust_pkg = '';
 my $svc_acct = '';
index 89da742..2106a64 100755 (executable)
        }
      
        if ( $cgi->param('payby') ) {
-         $cgi->param('payby') =~ /^(CARD|CHEK|BILL)(-(VisaMC|Amex|Discover))?$/
-           or die "illegal payby ". $cgi->param('payby');
+         $cgi->param('payby') =~
+           /^(CARD|CHEK|BILL|PREP|CASH|WEST)(-(VisaMC|Amex|Discover|Maestro))?$/
+             or die "illegal payby ". $cgi->param('payby');
          push @search, "cust_pay.payby = '$1'";
          if ( $3 ) {
            if ( $3 eq 'VisaMC' ) {
              #avoid posix regexes for portability
              push @search,
-               " (    substring(cust_pay.payinfo from 1 for 1) = '4'  ".
+               " ( (     substring(cust_pay.payinfo from 1 for 1) = '4'     ".
+               "     AND substring(cust_pay.payinfo from 1 for 4) != '4936' ".
+               "     AND substring(cust_pay.payinfo from 1 for 6)           ".
+               "         NOT SIMILAR TO '49030[2-9]'                        ".
+               "     AND substring(cust_pay.payinfo from 1 for 6)           ".
+               "         NOT SIMILAR TO '49033[5-9]'                        ".
+               "     AND substring(cust_pay.payinfo from 1 for 6)           ".
+               "         NOT SIMILAR TO '49110[1-2]'                        ".
+               "     AND substring(cust_pay.payinfo from 1 for 6)           ".
+               "         NOT SIMILAR TO '49117[4-9]'                        ".
+               "     AND substring(cust_pay.payinfo from 1 for 6)           ".
+               "         NOT SIMILAR TO '49118[1-2]'                        ".
+               "   )".
                "   OR substring(cust_pay.payinfo from 1 for 2) = '51' ".
                "   OR substring(cust_pay.payinfo from 1 for 2) = '52' ".
                "   OR substring(cust_pay.payinfo from 1 for 2) = '53' ".
                " ) ";
            } elsif ( $3 eq 'Discover' ) {
              push @search,
-               " substring(cust_pay.payinfo from 1 for 4 ) = '6011' ";
+               "    substring(cust_pay.payinfo from 1 for 4 ) = '6011'  ".
+               " OR substring(cust_pay.payinfo from 1 for 3 ) = '650'   ";
+           } elsif ( $3 eq 'Maestro' ) { 
+             push @search,
+               " (    substring(cust_pay.payinfo from 1 for 2 ) = '63'     ".
+               '   OR substring(cust_pay.payinfo from 1 for 2 ) = '67'     ".
+               '   OR substring(cust_pay.payinfo from 1 for 6 ) = '564182' ".
+               "   OR substring(cust_pay.payinfo from 1 for 4 ) = '4936'   ".
+               "   OR substring(cust_pay.payinfo from 1 for 6 )            ".
+               "      SIMILAR TO '49030[2-9]'                             ".
+               "   OR substring(cust_pay.payinfo from 1 for 6 )            ".
+               "      SIMILAR TO '49033[5-9]'                             ".
+               "   OR substring(cust_pay.payinfo from 1 for 6 )            ".
+               "      SIMILAR TO '49110[1-2]'                             ".
+               "   OR substring(cust_pay.payinfo from 1 for 6 )            ".
+               "      SIMILAR TO '49117[4-9]'                             ".
+               "   OR substring(cust_pay.payinfo from 1 for 6 )            ".
+               "      SIMILAR TO '49118[1-2]'                             ".
+               " ) ";
            } else {
              die "unknown card type $3";
            }
                        'Check #'. $cust_pay->payinfo;
                      } elsif ( $cust_pay->payby eq 'PREP' ) {
                        'Prepaid card #'. $cust_pay->payinfo;
+                     } elsif ( $cust_pay->payby eq 'CASH' ) {
+                       'Cash '. $cust_pay->payinfo;
+                     } elsif ( $cust_pay->payby eq 'WEST' ) {
+                       'Western Union'; #. $cust_pay->payinfo;
                      } else {
                        $cust_pay->payby. ' '. $cust_pay->payinfo;
                      }
index 8b9e273..18501d5 100644 (file)
               <OPTION VALUE="CARD-VisaMC">credit card (Visa/MasterCard)</OPTION>
               <OPTION VALUE="CARD-Amex">credit card (American Express)</OPTION>
               <OPTION VALUE="CARD-Discover">credit card (Discover)</OPTION>
+              <OPTION VALUE="CARD-Maestro">credit card (Maestro/Switch/Solo)</OPTION>
               <OPTION VALUE="CHEK">electronic check / ACH</OPTION>
-              <OPTION VALUE="BILL">check / cash</OPTION>
+              <OPTION VALUE="BILL">check</OPTION>
+              <OPTION VALUE="PREP">prepaid card</OPTION>
+              <OPTION VALUE="CASH">cash</OPTION>
+              <OPTION VALUE="WEST">Western Union</OPTION>
             </SELECT>
         </TD>
       </TR>
index d149cf1..8dcbd3a 100755 (executable)
@@ -8,6 +8,12 @@ my $invnum = $3;
 
 my $conf = new FS::Conf;
 
+my @payby = $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 grep /\w/, @payby;
+my %payby = map { $_=>1 } @payby;
+
 my $cust_bill = qsearchs('cust_bill',{'invnum'=>$invnum});
 die "Invoice #$invnum not found!" unless $cust_bill;
 my $custnum = $cust_bill->getfield('custnum');
@@ -22,8 +28,38 @@ my $link = $templatename ? "$templatename-$invnum" : $invnum;
   "View this customer (#$custnum)" => "${p}view/cust_main.cgi?$custnum",
 )) %>
 
-<% if ( $cust_bill->owed > 0 ) { %>
-  <A HREF="<%= $p %>edit/cust_pay.cgi?<%= $invnum %>">Enter payments (check/cash) against this invoice</A> |
+<% if ( $cust_bill->owed > 0
+        && ( $payby{'BILL'} || $payby{'CASH'} || $payby{'WEST'} )
+      )
+   {
+     my $s = 0;
+%>
+
+  Post 
+
+  <% if ( $payby{'BILL'} ) { %>
+  
+    <%= $s++ ? ' | ' : '' %>
+    <A HREF="<%= $p %>edit/cust_pay.cgi?payby=BILL;invnum=<%= $invnum %>">check</A>
+  
+  <% } %>
+  
+  <% if ( $payby{'CASH'} ) { %>
+  
+    <%= $s++ ? ' | ' : '' %>
+    <A HREF="<%= $p %>edit/cust_pay.cgi?payby=CASH;invnum=<%= $invnum %>">cash</A>
+  
+  <% } %>
+  
+  <% if ( $payby{'WEST'} ) { %>
+  
+    <%= $s++ ? ' | ' : '' %>
+    <A HREF="<%= $p %>edit/cust_pay.cgi?payby=WEST;invnum=<%= $invnum %>">Western Union</A>
+  
+  <% } %>
+
+  payment against this invoice<BR>
+
 <% } %>
 
 <A HREF="<%= $p %>misc/print-invoice.cgi?<%= $link %>">Re-print this invoice</A>
index 6c475c5..e58b624 100644 (file)
@@ -1,13 +1,56 @@
 <%
   my( $cust_main ) = @_;
-  my $conf = new FS::Conf;
   my $custnum = $cust_main->custnum;
+
+  my $conf = new FS::Conf;
+
+  my @payby = $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 grep /\w/, @payby;
+  my %payby = map { $_=>1 } @payby;
+
+  my $s = 0;
+
 %>
 
 <BR><BR><A NAME="history"><FONT SIZE="+2">Payment History</FONT></A><BR>
-<A HREF="<%= $p %>edit/cust_pay.cgi?custnum=<%= $custnum %>">Post cash/check payment</A>
-| <A HREF="<%= $p %>misc/payment.cgi?payby=CARD;custnum=<%= $custnum %>">Process credit card payment</A>
-| <A HREF="<%= $p %>misc/payment.cgi?payby=CHEK;custnum=<%= $custnum %>">Process electronic check (ACH) payment</A>
+
+<% if ( $payby{'BILL'} ) { %>
+
+  <%= $s++ ? ' | ' : '' %>
+  <A HREF="<%= $p %>edit/cust_pay.cgi?payby=BILL;custnum=<%= $custnum %>">Post check payment</A>
+
+<% } %>
+
+<% if ( $payby{'CASH'} ) { %>
+
+  <%= $s++ ? ' | ' : '' %>
+  <A HREF="<%= $p %>edit/cust_pay.cgi?payby=CASH;custnum=<%= $custnum %>">Post cash payment</A>
+
+<% } %>
+
+<% if ( $payby{'WEST'} ) { %>
+
+  <%= $s++ ? ' | ' : '' %>
+  <A HREF="<%= $p %>edit/cust_pay.cgi?payby=WEST;custnum=<%= $custnum %>">Post Western Union payment</A>
+
+<% } %>
+
+<% if ( $payby{'CARD'} || $payby{'DCRD'} ) { %>
+
+  <%= $s++ ? ' | ' : '' %>
+  <A HREF="<%= $p %>misc/payment.cgi?payby=CARD;custnum=<%= $custnum %>">Process credit card payment</A>
+
+<% } %>
+
+<% if ( $payby{'CHEK'} || $payby{'DCHK'} ) { %>
+
+  <%= $s++ ? ' | ' : '' %>
+  <A HREF="<%= $p %>misc/payment.cgi?payby=CHEK;custnum=<%= $custnum %>">Process electronic check (ACH) payment</A>
+
+<% } %>
+
 <BR><A HREF="<%= $p %>edit/cust_credit.cgi?<%= $custnum %>">Post credit</A>
 <BR>
 
@@ -51,8 +94,11 @@ foreach my $cust_pay ($cust_main->cust_pay) {
   $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/^BILL$//;
-  $payby =~ s/^(CARD|COMP)$/$1 /;
   my $info = $payby ? " ($payby$payinfo)" : '';
 
   my( $pre, $post, $desc, $apply, $ext ) = ( '', '', '', '', '' );