ticket 1568 config options for new echeck fields and addition to selfservice interface
authorjeff <jeff>
Sun, 29 Apr 2007 22:55:14 +0000 (22:55 +0000)
committerjeff <jeff>
Sun, 29 Apr 2007 22:55:14 +0000 (22:55 +0000)
FS/FS/ClientAPI/MyAccount.pm
FS/FS/ClientAPI/Signup.pm
FS/FS/Conf.pm
fs_selfservice/FS-SelfService/cgi/ach_payment_results.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/make_ach_payment.html [new file with mode: 0644]
fs_selfservice/FS-SelfService/cgi/myaccount_menu.html
fs_selfservice/FS-SelfService/cgi/selfservice.cgi
fs_selfservice/FS-SelfService/cgi/signup.cgi
fs_selfservice/FS-SelfService/cgi/signup.html
httemplate/view/cust_main/billing.html

index c249177..9ee770b 100644 (file)
@@ -23,6 +23,7 @@ use FS::cust_main;
 use FS::cust_bill;
 use FS::cust_main_county;
 use FS::cust_pkg;
 use FS::cust_bill;
 use FS::cust_main_county;
 use FS::cust_pkg;
+use FS::payby;
 use HTML::Entities;
 
 #false laziness with FS::cust_main
 use HTML::Entities;
 
 #false laziness with FS::cust_main
@@ -237,6 +238,14 @@ sub payment_info {
 
       'card_types' => card_types(),
 
 
       'card_types' => card_types(),
 
+      'paytypes' => [ @FS::cust_main::paytypes ],
+
+      'stateid_label' => FS::Msgcat::_gettext('stateid'),
+      'stateid_state_label' => FS::Msgcat::_gettext('stateid_state'),
+
+      'show_ss'  => $conf->exists('show_ss'),
+      'show_stateid' => $conf->exists('show_stateid'),
+      'show_paystate' => $conf->exists('show_bankstate'),
     };
 
   }
     };
 
   }
@@ -260,6 +269,7 @@ sub payment_info {
   $return{$_} = $cust_main->get($_) for qw(address1 address2 city state zip);
 
   $return{payby} = $cust_main->payby;
   $return{$_} = $cust_main->get($_) for qw(address1 address2 city state zip);
 
   $return{payby} = $cust_main->payby;
+  $return{stateid_state} = $cust_main->stateid_state;
 
   if ( $cust_main->payby =~ /^(CARD|DCRD)$/ ) {
     $return{card_type} = cardtype($cust_main->payinfo);
 
   if ( $cust_main->payby =~ /^(CARD|DCRD)$/ ) {
     $return{card_type} = cardtype($cust_main->payinfo);
@@ -269,6 +279,15 @@ sub payment_info {
 
   }
 
 
   }
 
+  if ( $cust_main->payby =~ /^(CHEK|DCHK)$/ ) {
+    my ($payinfo1, $payinfo2) = split '@', $cust_main->payinfo;
+    $return{payinfo1} = $payinfo1;
+    $return{payinfo2} = $payinfo2;
+    $return{paytype}  = $cust_main->paytype;
+    $return{paystate} = $cust_main->paystate;
+
+  }
+
   #doubleclick protection
   my $_date = time;
   $return{paybatch} = "webui-MyAccount-$_date-$$-". rand() * 2**32;
   #doubleclick protection
   my $_date = time;
   $return{paybatch} = "webui-MyAccount-$_date-$$-". rand() * 2**32;
@@ -303,19 +322,23 @@ sub process_payment {
     or return { 'error' => gettext('illegal_text'). " paybatch: ". $p->{'paybatch'} };
   my $paybatch = $1;
 
     or return { 'error' => gettext('illegal_text'). " paybatch: ". $p->{'paybatch'} };
   my $paybatch = $1;
 
+  $p->{'payby'} =~ /^([A-Z]{4})$/
+    or return { 'error' => "illegal_payby " . $p->{'payby'} };
+  my $payby = $1;
+
   my $payinfo;
   my $paycvv = '';
   my $payinfo;
   my $paycvv = '';
-  #if ( $payby eq 'CHEK' ) {
-  #
-  #  $p->{'payinfo1'} =~ /^(\d+)$/
-  #    or return { 'error' => "illegal account number ". $p->{'payinfo1'} };
-  #  my $payinfo1 = $1;
-  #   $p->{'payinfo2'} =~ /^(\d+)$/
-  #    or return { 'error' => "illegal ABA/routing number ". $p->{'payinfo2'} };
-  #  my $payinfo2 = $1;
-  #  $payinfo = $payinfo1. '@'. $payinfo2;
-  # 
-  #} elsif ( $payby eq 'CARD' ) {
+  if ( $payby eq 'CHEK' || $payby eq 'DCHK' ) {
+  
+    $p->{'payinfo1'} =~ /^(\d+)$/
+      or return { 'error' => "illegal account number ". $p->{'payinfo1'} };
+    my $payinfo1 = $1;
+     $p->{'payinfo2'} =~ /^(\d+)$/
+      or return { 'error' => "illegal ABA/routing number ". $p->{'payinfo2'} };
+    my $payinfo2 = $1;
+    $payinfo = $payinfo1. '@'. $payinfo2;
+   
+  } elsif ( $payby eq 'CARD' || $payby eq 'DCRD' ) {
    
     $payinfo = $p->{'payinfo'};
     $payinfo =~ s/\D//g;
    
     $payinfo = $p->{'payinfo'};
     $payinfo =~ s/\D//g;
@@ -339,19 +362,23 @@ sub process_payment {
       }
     }
   
       }
     }
   
-  #} else {
-  #  die "unknown payby $payby";
-  #}
+  } else {
+    die "unknown payby $payby";
+  }
 
 
-  my $error = $cust_main->realtime_bop( 'CC', $p->{'amount'},
+  my %payby2fields = (
+    'CARD' => [ qw( paystart_month paystart_year payissue address1 address2 city state zip payip ) ],
+    'CHEK' => [ qw( ss paytype paystate stateid stateid_state payip ) ],
+  );
+
+  my $error = $cust_main->realtime_bop( $FS::payby::payby2bop{$payby}, $p->{'amount'},
     'quiet'    => 1,
     'payinfo'  => $payinfo,
     'paydate'  => $p->{'year'}. '-'. $p->{'month'}. '-01',
     'payname'  => $payname,
     'paybatch' => $paybatch,
     'paycvv'   => $paycvv,
     'quiet'    => 1,
     'payinfo'  => $payinfo,
     'paydate'  => $p->{'year'}. '-'. $p->{'month'}. '-01',
     'payname'  => $payname,
     'paybatch' => $paybatch,
     'paycvv'   => $paycvv,
-    map { $_ => $p->{$_} } qw( paystart_month paystart_year payissue payip
-                               address1 address2 city state zip )
+    map { $_ => $p->{$_} } @{ $payby2fields{$payby} }
   );
   return { 'error' => $error } if $error;
 
   );
   return { 'error' => $error } if $error;
 
@@ -359,11 +386,19 @@ sub process_payment {
 
   if ( $p->{'save'} ) {
     my $new = new FS::cust_main { $cust_main->hash };
 
   if ( $p->{'save'} ) {
     my $new = new FS::cust_main { $cust_main->hash };
-    $new->set( $_ => $p->{$_} )
-      foreach qw( payname paystart_month paystart_year payissue payip
-                  address1 address2 city state zip payinfo );
+    if ($payby eq 'CARD' || $payby eq 'DCRD') {
+      $new->set( $_ => $p->{$_} )
+        foreach qw( payname paystart_month paystart_year payissue payip
+                    address1 address2 city state zip payinfo );
+      $new->set( 'payby' => $p->{'auto'} ? 'CARD' : 'DCRD' );
+    } elsif ($payby eq 'CHEK' || $payby eq 'DCHK') {
+      $new->set( $_ => $p->{$_} )
+        foreach qw( payname payip paytype paystate
+                    stateid stateid_state );
+      $new->set( 'payinfo' => $payinfo );
+      $new->set( 'payby' => $p->{'auto'} ? 'CHEK' : 'DCHK' );
+    }
     $new->set( 'paydate' => $p->{'year'}. '-'. $p->{'month'}. '-01' );
     $new->set( 'paydate' => $p->{'year'}. '-'. $p->{'month'}. '-01' );
-    $new->set( 'payby' => $p->{'auto'} ? 'CARD' : 'DCRD' );
     my $error = $new->replace($cust_main);
     return { 'error' => $error } if $error;
     $cust_main = $new;
     my $error = $new->replace($cust_main);
     return { 'error' => $error } if $error;
     $cust_main = $new;
index 1f5a2ec..6dded4c 100644 (file)
@@ -67,14 +67,24 @@ sub signup_info {
 
     'card_types' => card_types(),
 
 
     'card_types' => card_types(),
 
+    'paytypes' => [ @FS::cust_main::paytypes ],
+
     'cvv_enabled' => defined dbdef->table('cust_main')->column('paycvv'), # 1,
 
     'cvv_enabled' => defined dbdef->table('cust_main')->column('paycvv'), # 1,
 
+    'stateid_enabled' => $conf->exists('show_stateid'),
+
+    'paystate_enabled' => $conf->exists('show_bankstate'),
+
     'ship_enabled' => defined dbdef->table('cust_main')->column('ship_last'),#1,
 
     'msgcat' => { map { $_=>gettext($_) } qw(
       passwords_dont_match invalid_card unknown_card_type not_a empty_password illegal_or_empty_text
     ) },
 
     'ship_enabled' => defined dbdef->table('cust_main')->column('ship_last'),#1,
 
     'msgcat' => { map { $_=>gettext($_) } qw(
       passwords_dont_match invalid_card unknown_card_type not_a empty_password illegal_or_empty_text
     ) },
 
+    'label' => { map { $_ => FS::Msgcat::_gettext($_) } qw(
+      stateid stateid_state
+    ) },
+
     'statedefault' => $conf->config('statedefault') || 'CA',
 
     'countrydefault' => $conf->config('countrydefault') || 'US',
     'statedefault' => $conf->config('statedefault') || 'CA',
 
     'countrydefault' => $conf->config('countrydefault') || 'US',
@@ -259,14 +269,14 @@ sub new_customer {
 
       last first ss company address1 address2
       city county state zip country
 
       last first ss company address1 address2
       city county state zip country
-      daytime night fax
+      daytime night fax stateid stateid_state
 
       ship_last ship_first ship_ss ship_company ship_address1 ship_address2
       ship_city ship_county ship_state ship_zip ship_country
       ship_daytime ship_night ship_fax
 
       payby
 
       ship_last ship_first ship_ss ship_company ship_address1 ship_address2
       ship_city ship_county ship_state ship_zip ship_country
       ship_daytime ship_night ship_fax
 
       payby
-      payinfo paycvv paydate payname
+      payinfo paycvv paydate payname paystate paytype
       paystart_month paystart_year payissue
       payip
 
       paystart_month paystart_year payissue
       payip
 
index b54d6f5..a867648 100644 (file)
@@ -925,6 +925,13 @@ httemplate/docs/config.html
     'type'        => 'checkbox',
   },
 
     'type'        => 'checkbox',
   },
 
+  {
+    'key'         => 'show_bankstate',
+    'section'     => 'UI',
+    'description' => "Turns on display/collection of state for bank accounts in the web interface.  Sometimes required by electronic check (ACH) processors.",
+    'type'        => 'checkbox',
+  },
+
   { 
     'key'         => 'agent_defaultpkg',
     'section'     => 'UI',
   { 
     'key'         => 'agent_defaultpkg',
     'section'     => 'UI',
diff --git a/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html b/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html
new file mode 100644 (file)
index 0000000..9fe400f
--- /dev/null
@@ -0,0 +1,16 @@
+<HTML><HEAD><TITLE>MyAccount</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee"><FONT SIZE=5>MyAccount</FONT><BR><BR>
+<%= $url = "$selfurl?session=$session_id;action="; ''; %>
+<%= include('myaccount_menu') %>
+<TD VALIGN="top">
+<FONT SIZE=4>Payment results</FONT><BR><BR>
+<%= if ( $error ) {
+  $OUT .= qq!<FONT SIZE="+1" COLOR="#ff0000">Error processing your payment: $error</FONT>!;
+} else {
+  $OUT .= 'Your payment was processed successfully.  Thank you.';
+} %>
+</TD></TR></TABLE>
+<HR>
+<FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
+</BODY></HTML>
+
diff --git a/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html b/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html
new file mode 100644 (file)
index 0000000..83d36b9
--- /dev/null
@@ -0,0 +1,111 @@
+<HTML><HEAD><TITLE>MyAccount</TITLE></HEAD>
+<BODY BGCOLOR="#eeeeee">
+<script language="JavaScript"><!--
+  var mywindow = -1;
+  function myopen(filename,windowname,properties) {
+    myclose();
+    mywindow = window.open(filename,windowname,properties);
+  }
+  function myclose() {
+    if ( mywindow != -1 )
+      mywindow.close();
+    mywindow = -1
+  }
+//--></script>
+<FONT SIZE=5>MyAccount</FONT><BR><BR>
+<%= $url = "$selfurl?session=$session_id;action="; ''; %>
+<%= include('myaccount_menu') %>
+<TD VALIGN="top">
+<FONT SIZE=4>Make a payment</FONT><BR><BR>
+<FORM NAME="OneTrueForm" METHOD="POST" ACTION="<%=$selfurl%>" onSubmit="document.OneTrueForm.process.disabled=true">
+<INPUT TYPE="hidden" NAME="session" VALUE="<%=$session_id%>">
+<INPUT TYPE="hidden" NAME="action" VALUE="ach_payment_results">
+<TABLE BGCOLOR="#cccccc">
+<TR>
+  <TD ALIGN="right">Amount&nbsp;Due</TD>
+  <TD>
+    <TABLE><TR><TD BGCOLOR="#ffffff">
+      $<%=sprintf("%.2f",$balance)%>
+    </TD></TR></TABLE>
+  </TD>
+</TR>
+<TR>
+  <TD ALIGN="right">Payment&nbsp;amount</TD>
+  <TD>
+    <TABLE><TR><TD BGCOLOR="#ffffff">
+      $<INPUT TYPE="text" NAME="amount" SIZE=8 VALUE="<%=sprintf("%.2f",$balance)%>">
+    </TD></TR></TABLE>
+  </TD>
+</TR><TR>
+  <TD ALIGN="right">Account&nbsp;type</TD>
+  <TD>
+    <SELECT NAME="paytype"><OPTION></OPTION>
+      <%= foreach ( @paytypes ) {
+            $selected = $paytype eq $_ ? ' SELECTED' : '';
+            $OUT .= qq(<OPTION$selected VALUE="$_">$_\n);
+      } %>
+    </SELECT>
+  </TD>
+</TD><TR>
+  <TD ALIGN="right">Account&nbsp;number</TD>
+  <TD><INPUT TYPE="text" NAME="payinfo1" SIZE=10 MAXLENGTH=20 VALUE="<%=$payinfo1%>"></TD>
+</TD><TR>
+  <TD ALIGN="right">ABA/Routing&nbsp;number</TD>
+  <TD><INPUT TYPE="text" NAME="payinfo2" SIZE=10 MAXLENGTH=9 VALUE="<%=$payinfo2%>"></TD>
+</TR><TR>
+  <TD ALIGN="right">Bank&nbsp;name</TD>
+  <TD><INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="payname" VALUE="<%=$payname%>"></TD>
+</TR><TR>
+  <%=
+    $OUT = '';
+    if ($show_paystate) {
+      $OUT .= qq!<TD ALIGN="right">Bank state</TD><TD><SELECT NAME="paystate">!;
+      for ( @states ) {
+        $OUT .= '<OPTION'. ($_ eq $paystate ? ' SELECTED' : '' ). ">$_\n";
+      }
+      $OUT .= '</SELECT></TD></TR><TR>';
+    }
+  %>
+  <%=
+    $OUT = '';
+    if ($show_ss) {
+      $OUT .= '<TD ALIGN="right">Account&nbsp;holder<BR>Social&nbsp;';
+      $OUT .= 'security&nbsp;or&nbsp;tax&nbsp;ID&nbsp;#</TD><TD>';
+      $OUT .= qq!<INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="ss" VALUE="$ss">!;
+      $OUT .= '</TD></TR><TR>';
+    }
+  %>
+  <%=
+    $OUT = '';
+    if ($show_stateid) {
+      $OUT .= '<TD ALIGN="right">';
+      $OUT .= qq!Account&nbsp;holder<BR>$stateid_label</TD><TD>!;
+      $OUT .= qq!<INPUT TYPE="text" SIZE=32 MAXLENGTH=80 NAME="stateid" VALUE="$stateid"></TD>!;
+      $OUT .= qq!<TD ALIGN="right">$stateid_state_label</TD>!;
+      $OUT .= '<TD><SELECT NAME="stateid_state">';
+      for ( @states ) {
+        $OUT .= '<OPTION'. ($_ eq $stateid_state ? ' SELECTED' : '' ). ">$_\n";
+      }
+      $OUT .='</SELECT></TD></TR><TR>';
+    }
+  %>
+  <TD COLSPAN=2>
+    <INPUT TYPE="checkbox" CHECKED NAME="save" VALUE="1">
+    Remember this information
+  </TD>
+</TR><TR>
+  <TD COLSPAN=2>
+    <INPUT TYPE="checkbox"<%= $payby eq 'CHEK' ? ' CHECKED' : '' %> NAME="auto" VALUE="1" onClick="if (this.checked) { document.OneTrueForm.save.checked=true; }">
+    Charge future payments to this account automatically
+  </TD>
+</TR>
+</TABLE>
+<BR>
+<INPUT TYPE="hidden" NAME="paybatch" VALUE="<%=$paybatch%>">
+<INPUT TYPE="submit" NAME="process" VALUE="Process payment"> <!-- onClick="this.disabled=true"> -->
+</FORM>
+</TD></TR></TABLE>
+<HR>
+<FONT SIZE="-2">powered by <a href="http://www.sisd.com/freeside">freeside</a></FONT>
+</BODY></HTML>
+
index 47fcfc1..095d59c 100644 (file)
@@ -21,6 +21,8 @@ if ( 1 ) { #XXXFIXME "enable selfservice prepay features" flag or something, eve
   push @menu, (
     { title=>'Recharge my account with a credit card',
       url=>'make_payment', indent=>2 },
   push @menu, (
     { title=>'Recharge my account with a credit card',
       url=>'make_payment', indent=>2 },
+    { title=>'Recharge my account with a check',
+      url=>'make_ach_payment', indent=>2 },
     { title=>'Recharge my account with a prepaid card',
       url=>'recharge_prepay', indent=>2 },
   );
     { title=>'Recharge my account with a prepaid card',
       url=>'recharge_prepay', indent=>2 },
   );
index 975203d..2e1da41 100644 (file)
@@ -66,7 +66,7 @@ $session_id = $cgi->param('session');
 
 #order|pw_list XXX ???
 $cgi->param('action') =~
 
 #order|pw_list XXX ???
 $cgi->param('action') =~
-    /^(myaccount|view_invoice|make_payment|payment_results|recharge_prepay|recharge_results|logout|change_bill|change_ship|customer_order_pkg|process_order_pkg|customer_change_pkg|process_change_pkg|process_order_recharge|provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|view_usage|view_usage_details|change_password|process_change_password)$/
+    /^(myaccount|view_invoice|make_payment|make_ach_payment|payment_results|ach_payment_results|recharge_prepay|recharge_results|logout|change_bill|change_ship|customer_order_pkg|process_order_pkg|customer_change_pkg|process_change_pkg|process_order_recharge|provision|provision_svc|process_svc_acct|process_svc_external|delete_svc|view_usage|view_usage_details|change_password|process_change_password)$/
   or die "unknown action ". $cgi->param('action');
 my $action = $1;
 
   or die "unknown action ". $cgi->param('action');
 my $action = $1;
 
@@ -299,6 +299,7 @@ sub payment_results {
 
   process_payment(
     'session_id' => $session_id,
 
   process_payment(
     'session_id' => $session_id,
+    'payby'      => 'CARD',
     'amount'     => $amount,
     'payinfo'    => $payinfo,
     'paycvv'     => $paycvv,
     'amount'     => $amount,
     'payinfo'    => $payinfo,
     'paycvv'     => $paycvv,
@@ -317,6 +318,78 @@ sub payment_results {
 
 }
 
 
 }
 
+sub make_ach_payment {
+  payment_info( 'session_id' => $session_id );
+}
+
+sub ach_payment_results {
+
+  #we should only do basic checking here for DoS attacks and things
+  #that couldn't be constructed by the web form...  let process_payment() do
+  #the rest, it gives better error messages
+
+  $cgi->param('amount') =~ /^\s*(\d+(\.\d{2})?)\s*$/
+    or die "illegal amount"; #!!!
+  my $amount = $1;
+
+  my $payinfo1 = $cgi->param('payinfo1');
+  $payinfo1=~ /^(\d+)$/
+    or die "illegal account"; #!!!
+  $payinfo1= $1;
+
+  my $payinfo2 = $cgi->param('payinfo2');
+  $payinfo2=~ /^(\d+)$/
+    or die "illegal ABA/routing code"; #!!!
+  $payinfo2= $1;
+
+  $cgi->param('payname') =~ /^(.{0,80})$/ or die "illegal payname";
+  my $payname = $1;
+
+  $cgi->param('paystate') =~ /^(.{0,2})$/ or die "illegal paystate";
+  my $paystate = $1;
+
+  $cgi->param('paytype') =~ /^(.{0,80})$/ or die "illegal paytype";
+  my $paytype = $1;
+
+  $cgi->param('ss') =~ /^(.{0,80})$/ or die "illegal ss";
+  my $ss = $1;
+
+  $cgi->param('stateid') =~ /^(.{0,80})$/ or die "illegal stateid";
+  my $stateid = $1;
+
+  $cgi->param('stateid_state') =~ /^(.{0,2})$/ or die "illegal stateid_state";
+  my $stateid_state = $1;
+
+  my $save = 0;
+  $save = 1 if $cgi->param('save');
+
+  my $auto = 0;
+  $auto = 1 if $cgi->param('auto');
+
+  $cgi->param('paybatch') =~ /^([\w\-\.]+)$/ or die "illegal paybatch";
+  my $paybatch = $1;
+
+  process_payment(
+    'session_id' => $session_id,
+    'payby'      => 'CHEK',
+    'amount'     => $amount,
+    'payinfo1'   => $payinfo1,
+    'payinfo2'   => $payinfo2,
+    'month'      => '12',
+    'year'       => '2037',
+    'payname'    => $payname,
+    'paytype'    => $paytype,
+    'paystate'   => $paystate,
+    'ss'         => $ss,
+    'stateid'    => $stateid,
+    'stateid_state' => $stateid_state,
+    'save'       => $save,
+    'auto'       => $auto,
+    'paybatch'   => $paybatch,
+  );
+
+}
+
 sub recharge_prepay {
   customer_info( 'session_id' => $session_id );
 }
 sub recharge_prepay {
   customer_info( 'session_id' => $session_id );
 }
index 227f05f..e07b6ee 100755 (executable)
@@ -149,6 +149,14 @@ if (    ( defined($cgi->param('magic')) && $cgi->param('magic') eq 'process' )
                               ? $cgi->param( $payby. '_paycvv' )
                               : ''
                );
                               ? $cgi->param( $payby. '_paycvv' )
                               : ''
                );
+    $cgi->param('paytype' => defined $cgi->param( $payby. '_paytype' )
+                              ? $cgi->param( $payby. '_paytype' )
+                              : ''
+               );
+    $cgi->param('paystate' => defined $cgi->param( $payby. '_paystate' )
+                              ? $cgi->param( $payby. '_paystate' )
+                              : ''
+               );
 
     if ( $cgi->param('invoicing_list') ) {
       $cgi->param('invoicing_list' => $cgi->param('invoicing_list'). ', POST')
 
     if ( $cgi->param('invoicing_list') ) {
       $cgi->param('invoicing_list' => $cgi->param('invoicing_list'). ', POST')
@@ -185,15 +193,15 @@ if (    ( defined($cgi->param('magic')) && $cgi->param('magic') eq 'process' )
         ( map { $_ => scalar($cgi->param($_)) }
             qw( last first ss company
                 address1 address2 city county state zip country
         ( map { $_ => scalar($cgi->param($_)) }
             qw( last first ss company
                 address1 address2 city county state zip country
-                daytime night fax
+                daytime night fax stateid stateid_state
 
                 ship_last ship_first ship_company
                 ship_address1 ship_address2 ship_city ship_county ship_state
                   ship_zip ship_country
                 ship_daytime ship_night ship_fax
 
 
                 ship_last ship_first ship_company
                 ship_address1 ship_address2 ship_city ship_county ship_state
                   ship_zip ship_country
                 ship_daytime ship_night ship_fax
 
-                payby payinfo paycvv paydate payname invoicing_list
-                referral_custnum promo_code reg_code
+                payby payinfo paycvv paydate payname paystate paytype
+                invoicing_list referral_custnum promo_code reg_code
                 pkgpart username sec_phrase _password popnum refnum
                 agentnum
               ),
                 pkgpart username sec_phrase _password popnum refnum
                 agentnum
               ),
index c2c5d70..42334ea 100755 (executable)
@@ -21,7 +21,7 @@
 <INPUT TYPE="hidden" NAME="ss" VALUE="">
 <input type="hidden" name="payby" />
 <%=
 <INPUT TYPE="hidden" NAME="ss" VALUE="">
 <input type="hidden" name="payby" />
 <%=
-  $OUT = join("\n",map { my $method = $_ ; map { qq|<input type="hidden" name="${method}_$_" />| } qw / payinfo payinfo1 payinfo2 payname paycvv month year type  /  } @payby);
+  $OUT = join("\n",map { my $method = $_ ; map { qq|<input type="hidden" name="${method}_$_" />| } qw / payinfo payinfo1 payinfo2 payname paystate paytype paycvv month year type  /  } @payby);
 %>
 
 <%=
 %>
 
 <%=
@@ -94,6 +94,22 @@ Contact Information
   <TD ALIGN="right">Fax</TD>
   <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="<%= $fax %>" SIZE=12></TD>
 </TR>
   <TD ALIGN="right">Fax</TD>
   <TD COLSPAN=5><INPUT TYPE="text" NAME="fax" VALUE="<%= $fax %>" SIZE=12></TD>
 </TR>
+<%=
+  $OUT = '';
+  if ( $stateid_enabled ) {
+    my ($county_html, $state_html, $country_html) =
+      regionselector( {
+        prefix           => 'stateid_',
+        default_state    => $statedefault,
+        default_country  => $countrydefault,
+        locales          => \@cust_main_county,
+      } );
+    $OUT .= qq!<TR><TD ALIGN="right">!. $label{stateid}.'</TD>';
+    $OUT .= qq!<TD><INPUT TYPE="text" NAME="stateid" VALUE="$stateid" SIZE=12></TD>!;
+    $OUT .= qq!<TD ALIGN="right">!. $label{stateid_state} .'</TD>';
+    $OUT .="<TD COLSPAN=3>$county_html $state_html</TD></TR>";
+  }
+%>
 </TABLE><font color="#ff0000">*</font> required fields<BR>
 <BR>Billing information<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%">
 <TR><TD>
 </TABLE><font color="#ff0000">*</font> required fields<BR>
 <BR>Billing information<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%">
 <TR><TD>
@@ -129,8 +145,8 @@ Contact Information
     my %payby = (
       'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!,
       'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!,
     my %payby = (
       'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="">!,
       'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD"). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="">!,
-      'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!,
-      'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!,
+      'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9> Type <SELECT NAME="CHEK_paytype">!. join('', map {qq!<OPTION VALUE="$_">$_</OPTION>!} @paytypes). qq!</SELECT><BR>{$r}Bank State <INPUT TYPE="text" NAME="CHEK_paystate" VALUE="" SIZE=5 MAXLENGTH=4><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="">!,
+      'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="" MAXLENGTH=10> Type <SELECT NAME="DCHK_paytype">!. join('', map {qq!<OPTION VALUE="$_">$_</OPTION>!} @paytypes). qq!</SELECT><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="" SIZE=10 MAXLENGTH=9><BR>{$r}Bank State <INPUT TYPE="text" NAME="DCHK_paystate" VALUE="" SIZE=5 MAXLENGTH=4><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!,
       'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" NAME="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
       'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", "12-2037"). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="Accounts Payable">!,
       'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("COMP"),
       'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" NAME="LECB_payinfo" VALUE="" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
       'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", "12-2037"). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="Accounts Payable">!,
       'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE=""><BR><font color="#ff0000">*</font>Exp !. expselect("COMP"),
@@ -142,13 +158,25 @@ Contact Information
         $payby{$payby} .= qq!<TR><TD ALIGN="right">CVV2&nbsp;(<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)</TD><TD><INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4></TD></TR>!;
       }
     }
         $payby{$payby} .= qq!<TR><TD ALIGN="right">CVV2&nbsp;(<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)</TD><TD><INPUT TYPE="text" NAME=${payby}_paycvv VALUE="" SIZE=4 MAXLENGTH=4></TD></TR>!;
       }
     }
+    if ( $paystate_enabled ) {
+      foreach my $payby ( grep { exists $payby{$_} } qw(CHEK DCHK) ) { 
+        my ($county_html, $state_html, $country_html) =
+          regionselector( {
+            prefix           => "${payby}_pay",
+            default_state    => $statedefault,
+            default_country  => $countrydefault,
+            locales          => \@cust_main_county,
+          } );
+        $payby{$payby} .= "<BR>${r}Bank state $county_html $state_html";
+      }
+    }
 
     my( $account, $aba ) = split('@', $payinfo);
     my %paybychecked = (
       'CARD' => qq!<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"><TR><TD ALIGN="right"><font color="#ff0000">*</font> Card type</TD><TD>$cardselect</TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Card number</TD><TD><INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19></TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Expration</TD><TD>!. expselect("CARD", $paydate). qq!</TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Name on card</TD><TD><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname"></TD></TR>!,
       'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!,
 
     my( $account, $aba ) = split('@', $payinfo);
     my %paybychecked = (
       'CARD' => qq!<TABLE BGCOLOR="#c0c0c0" BORDER=0 CELLSPACING=0 WIDTH="100%"><TR><TD ALIGN="right"><font color="#ff0000">*</font> Card type</TD><TD>$cardselect</TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Card number</TD><TD><INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19></TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Expration</TD><TD>!. expselect("CARD", $paydate). qq!</TD></TR><TR><TD ALIGN="right"><font color="#ff0000">*</font> Name on card</TD><TD><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname"></TD></TR>!,
       'DCRD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="DCRD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("DCRD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="DCRD_payname" VALUE="$payname">!,
-      'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!,
-      'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account" MAXLENGTH=10><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="$payname">!,
+      'CHEK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="CHEK_payinfo1" VALUE="$account" MAXLENGTH=10> Type <SELECT NAME="CHEK_paytype">!. join('', map {qq!<OPTION VALUE="$_"!.($paytype eq $_ ? 'SELECTED' : '').">$_</OPTION>"} @paytypes). qq!</SELECT><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="CHEK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="CHEK_month" VALUE="12"><INPUT TYPE="hidden" NAME="CHEK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="CHEK_payname" VALUE="$payname">!,
+      'DCHK' => qq!Electronic check<BR>${r}Account number <INPUT TYPE="text" NAME="DCHK_payinfo1" VALUE="$account" MAXLENGTH=10> Type <SELECT NAME="DCHK_paytype">!. join('', map {qq!<OPTION VALUE="$_"!.($paytype eq $_ ? 'SELECTED' : '').">$_</OPTION>"} @paytypes). qq!</SELECT><BR>${r}ABA/Routing code <INPUT TYPE="text" NAME="DCHK_payinfo2" VALUE="$aba" SIZE=10 MAXLENGTH=9><INPUT TYPE="hidden" NAME="DCHK_month" VALUE="12"><INPUT TYPE="hidden" NAME="DCHK_year" VALUE="2037"><BR>${r}Bank name <INPUT TYPE="text" NAME="DCHK_payname" VALUE="">!,
       'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
       'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", $paydate). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!,
       'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("COMP", $paydate),
       'LECB' => qq!Phone bill billing<BR>${r}Phone number <INPUT TYPE="text" BANE="LECB_payinfo" VALUE="$payinfo" MAXLENGTH=15 SIZE=16><INPUT TYPE="hidden" NAME="LECB_month" VALUE="12"><INPUT TYPE="hidden" NAME="LECB_year" VALUE="2037"><INPUT TYPE="hidden" NAME="LECB_payname" VALUE="">!,
       'BILL' => qq!Billing<BR>P.O. <INPUT TYPE="text" NAME="BILL_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("BILL", $paydate). qq!<BR><font color="#ff0000">*</font>Attention<BR><INPUT TYPE="text" NAME="BILL_payname" VALUE="$payname">!,
       'COMP' => qq!Complimentary<BR><font color="#ff0000">*</font>Approved by<INPUT TYPE="text" NAME="COMP_payinfo" VALUE="$payinfo"><BR><font color="#ff0000">*</font>Exp !. expselect("COMP", $paydate),
@@ -160,6 +188,22 @@ Contact Information
         $paybychecked{$payby} .= qq!<TR><TD ALIGN="right">CVV2&nbsp;(<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)</TD><TD><INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4></TD></TR>!;
       }
     }
         $paybychecked{$payby} .= qq!<TR><TD ALIGN="right">CVV2&nbsp;(<A HREF="javascript:myopen('cvv2.html','cvv2','toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=no,resizable=yes,copyhistory=no,width=480,height=288')">help</A>)</TD><TD><INPUT TYPE="text" NAME=${payby}_paycvv VALUE="$paycvv" SIZE=4 MAXLENGTH=4></TD></TR>!;
       }
     }
+    if ( $paystate_enabled ) {
+      foreach my $payby ( grep { exists $payby{$_} } qw(CHEK DCHK) ) { 
+        my ($county_html, $state_html, $country_html) =
+          regionselector( {
+            prefix           => "${payby}_pay",
+            selected_county  => $county,
+            selected_state   => $state,
+            selected_country => $country,
+            default_state    => $statedefault,
+            default_country  => $countrydefault,
+            locales          => \@cust_main_county,
+          } );
+        $paybychecked{$payby} .= "<BR>${r}Bank state $county_html $state_html";
+      }
+    }
+
 use Tie::IxHash;
 use HTML::Widgets::SelectLayers;
 
 use Tie::IxHash;
 use HTML::Widgets::SelectLayers;
 
@@ -282,7 +326,7 @@ function fixup_form() {
     
     // copy payment method data up to OneTrueForm
     
     
     // copy payment method data up to OneTrueForm
     
-    var payment_method_elements = new Array( 'payinfo', 'payinfo1', 'payinfo2', 'payname', 'paycvv' , 'month', 'year','type' );
+    var payment_method_elements = new Array( 'payinfo', 'payinfo1', 'payinfo2', 'payname', 'paycvv' , 'paystate', 'paytype', 'month', 'year','type' );
     var payment_method_form_name = document.OneTrueForm.select.options[document.OneTrueForm.select.selectedIndex].value;
     document.OneTrueForm.elements['payby'].value = payment_method_form_name;
     var payment_method_form = document.forms[payment_method_form_name];
     var payment_method_form_name = document.OneTrueForm.select.options[document.OneTrueForm.select.selectedIndex].value;
     document.OneTrueForm.elements['payby'].value = payment_method_form_name;
     var payment_method_form = document.forms[payment_method_form_name];
index 42467bb..3fcb5d4 100644 (file)
@@ -90,10 +90,12 @@ Billing information
   <TD ALIGN="right">Bank name</TD>
   <TD BGCOLOR="#ffffff"><% $cust_main->payname %></TD>
 </TR>
   <TD ALIGN="right">Bank name</TD>
   <TD BGCOLOR="#ffffff"><% $cust_main->payname %></TD>
 </TR>
+% if ( $conf->exists('show_bankstate') ) {
 <TR>
   <TD ALIGN="right"><% $paystate_label %></TD>
   <TD BGCOLOR="#ffffff"><% $cust_main->paystate || '&nbsp;&nbsp;&nbsp;' %></TD>
 </TR>
 <TR>
   <TD ALIGN="right"><% $paystate_label %></TD>
   <TD BGCOLOR="#ffffff"><% $cust_main->paystate || '&nbsp;&nbsp;&nbsp;' %></TD>
 </TR>
+% }
 % } elsif ( $cust_main->payby eq 'LECB' ) {
 %     $cust_main->payinfo =~ /^(\d{3})(\d{3})(\d{4})$/;
 %     my $payinfo = "$1-$2-$3";
 % } elsif ( $cust_main->payby eq 'LECB' ) {
 %     $cust_main->payinfo =~ /^(\d{3})(\d{3})(\d{4})$/;
 %     my $payinfo = "$1-$2-$3";