diff options
| -rw-r--r-- | FS/FS/ClientAPI/MyAccount.pm | 77 | ||||
| -rw-r--r-- | FS/FS/ClientAPI/Signup.pm | 14 | ||||
| -rw-r--r-- | FS/FS/Conf.pm | 7 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/cgi/ach_payment_results.html | 16 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/cgi/make_ach_payment.html | 111 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/cgi/myaccount_menu.html | 2 | ||||
| -rw-r--r-- | fs_selfservice/FS-SelfService/cgi/selfservice.cgi | 75 | ||||
| -rwxr-xr-x | fs_selfservice/FS-SelfService/cgi/signup.cgi | 14 | ||||
| -rwxr-xr-x | fs_selfservice/FS-SelfService/cgi/signup.html | 56 | ||||
| -rw-r--r-- | httemplate/edit/cust_main/billing.html | 4 | ||||
| -rw-r--r-- | httemplate/view/cust_main/billing.html | 2 | 
11 files changed, 345 insertions, 33 deletions
| diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index c24917749..9ee770b20 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -23,6 +23,7 @@ use FS::cust_main;  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 @@ -237,6 +238,14 @@ sub payment_info {        '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{stateid_state} = $cust_main->stateid_state;    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; @@ -303,19 +322,23 @@ sub process_payment {      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 = ''; -  #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; @@ -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, -    map { $_ => $p->{$_} } qw( paystart_month paystart_year payissue payip -                               address1 address2 city state zip ) +    map { $_ => $p->{$_} } @{ $payby2fields{$payby} }    );    return { 'error' => $error } if $error; @@ -359,11 +386,19 @@ sub process_payment {    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( 'payby' => $p->{'auto'} ? 'CARD' : 'DCRD' );      my $error = $new->replace($cust_main);      return { 'error' => $error } if $error;      $cust_main = $new; diff --git a/FS/FS/ClientAPI/Signup.pm b/FS/FS/ClientAPI/Signup.pm index 1f5a2ec1c..6dded4ccf 100644 --- a/FS/FS/ClientAPI/Signup.pm +++ b/FS/FS/ClientAPI/Signup.pm @@ -67,14 +67,24 @@ sub signup_info {      'card_types' => card_types(), +    'paytypes' => [ @FS::cust_main::paytypes ], +      '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      ) }, +    'label' => { map { $_ => FS::Msgcat::_gettext($_) } qw( +      stateid stateid_state +    ) }, +      '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 -      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 -      payinfo paycvv paydate payname +      payinfo paycvv paydate payname paystate paytype        paystart_month paystart_year payissue        payip diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index a3187be10..318d6ad0f 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -1192,6 +1192,13 @@ httemplate/docs/config.html      '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', 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 index 000000000..9fe400faf --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/ach_payment_results.html @@ -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 index 000000000..83d36b9b9 --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/make_ach_payment.html @@ -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 Due</TD> +  <TD> +    <TABLE><TR><TD BGCOLOR="#ffffff"> +      $<%=sprintf("%.2f",$balance)%> +    </TD></TR></TABLE> +  </TD> +</TR> +<TR> +  <TD ALIGN="right">Payment 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 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 number</TD> +  <TD><INPUT TYPE="text" NAME="payinfo1" SIZE=10 MAXLENGTH=20 VALUE="<%=$payinfo1%>"></TD> +</TD><TR> +  <TD ALIGN="right">ABA/Routing number</TD> +  <TD><INPUT TYPE="text" NAME="payinfo2" SIZE=10 MAXLENGTH=9 VALUE="<%=$payinfo2%>"></TD> +</TR><TR> +  <TD ALIGN="right">Bank 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 holder<BR>Social '; +      $OUT .= 'security or tax ID #</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 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> + diff --git a/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html index 47fcfc127..095d59cce 100644 --- a/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html +++ b/fs_selfservice/FS-SelfService/cgi/myaccount_menu.html @@ -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 }, +    { 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 },    ); diff --git a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi index 975203dc8..2e1da4168 100644 --- a/fs_selfservice/FS-SelfService/cgi/selfservice.cgi +++ b/fs_selfservice/FS-SelfService/cgi/selfservice.cgi @@ -66,7 +66,7 @@ $session_id = $cgi->param('session');  #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; @@ -299,6 +299,7 @@ sub payment_results {    process_payment(      'session_id' => $session_id, +    'payby'      => 'CARD',      '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 );  } diff --git a/fs_selfservice/FS-SelfService/cgi/signup.cgi b/fs_selfservice/FS-SelfService/cgi/signup.cgi index 1514db52a..471ef09e8 100755 --- a/fs_selfservice/FS-SelfService/cgi/signup.cgi +++ b/fs_selfservice/FS-SelfService/cgi/signup.cgi @@ -149,6 +149,14 @@ if (    ( defined($cgi->param('magic')) && $cgi->param('magic') eq 'process' )                                ? $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') @@ -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 -              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 -              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              ), diff --git a/fs_selfservice/FS-SelfService/cgi/signup.html b/fs_selfservice/FS-SelfService/cgi/signup.html index c2c5d700a..42334eade 100755 --- a/fs_selfservice/FS-SelfService/cgi/signup.html +++ b/fs_selfservice/FS-SelfService/cgi/signup.html @@ -21,7 +21,7 @@  <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> +<%= +  $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> @@ -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="">!, -      '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"), @@ -142,13 +158,25 @@ Contact Information          $payby{$payby} .= qq!<TR><TD ALIGN="right">CVV2 (<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">!, -      '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), @@ -160,6 +188,22 @@ Contact Information          $paybychecked{$payby} .= qq!<TR><TD ALIGN="right">CVV2 (<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; @@ -282,7 +326,7 @@ function fixup_form() {      // 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]; diff --git a/httemplate/edit/cust_main/billing.html b/httemplate/edit/cust_main/billing.html index 3f57af89a..ad35a1e3f 100644 --- a/httemplate/edit/cust_main/billing.html +++ b/httemplate/edit/cust_main/billing.html @@ -205,6 +205,7 @@  %  %        qq!<TR><TD ALIGN="right" WIDTH="200">${r}Bank name </TD>!.  %          qq!<TD COLSPAN="3" WIDTH="408"><INPUT TYPE="text" NAME="payname" VALUE="!. ( $payby =~ /^(CHEK|DCHK)$/ ? $cust_main->payname : '' ). qq!"></TD></TR>!. +       ( $conf->exists('show_bankstate) ?  %          qq!<TR><TD ALIGN="right" WIDTH="200">$paystate_label</TD>!.  %          qq!<TD COLSPAN="3" WIDTH="408">!.  %          include('select-state.html', @@ -213,6 +214,9 @@  %                    'country' => $cust_main->country,  %                    'prefix' => 'pay',  %                 ). "</TD></TR>". +%         : '<INPUT TYPE="hidden" NAME="paystate" VALUE ="'. +%            $cust_main->paystate. '">' +%       ).  %  %  %        qq!<TR><TD COLSPAN=4 WIDTH="608"><INPUT TYPE="checkbox" NAME="payauto" !. ( $payby eq 'DCHK' ? '' : 'CHECKED' ). '> Charge future payments to this electronic check automatically</TD></TR>'. diff --git a/httemplate/view/cust_main/billing.html b/httemplate/view/cust_main/billing.html index 50e1c82cd..8562f9374 100644 --- a/httemplate/view/cust_main/billing.html +++ b/httemplate/view/cust_main/billing.html @@ -98,10 +98,12 @@ Billing information    <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 || '   ' %></TD>  </TR> +% }  % } elsif ( $cust_main->payby eq 'LECB' ) {  %     $cust_main->payinfo =~ /^(\d{3})(\d{3})(\d{4})$/;  %     my $payinfo = "$1-$2-$3"; | 
