- config option for signup server payment types
[freeside.git] / fs_signup / FS-SignupClient / cgi / signup.cgi
index 573cf5d..7cf4230 100755 (executable)
@@ -1,13 +1,13 @@
 #!/usr/bin/perl -Tw
 #
-# $Id: signup.cgi,v 1.14 2001-09-27 21:32:36 ivan Exp $
+# $Id: signup.cgi,v 1.18 2002-04-07 00:00:40 ivan Exp $
 
 use strict;
-use vars qw( @payby $cgi $locales $packages $pops $error
+use vars qw( @payby $cgi $locales $packages $pops $init_data $error
              $last $first $ss $company $address1 $address2 $city $state $county
              $country $zip $daytime $night $fax $invoicing_list $payby $payinfo
              $paydate $payname $referral_custnum
-             $pkgpart $username $password $popnum
+             $pkgpart $username $password $password2 $sec_phrase $popnum
              $ieak_file $ieak_template $cck_file $cck_template
              $signup_html $signup_template $success_html $success_template
              $ac $exch $loc
@@ -16,9 +16,10 @@ use vars qw( @payby $cgi $locales $packages $pops $error
 use subs qw( print_form print_okay expselect signup_default success_default );
 use CGI;
 use CGI::Carp qw(fatalsToBrowser);
-use HTTP::Headers::UserAgent 2.00;
-use FS::SignupClient 0.02 qw( signup_info new_customer );
 use Text::Template;
+use Business::CreditCard;
+use HTTP::Headers::UserAgent 2.00;
+use FS::SignupClient 0.03 qw( signup_info new_customer );
 
 #acceptable payment methods
 #
@@ -90,7 +91,8 @@ if ( -e $success_html ) {
     or die $Text::Template::ERROR;
 }
 
-( $locales, $packages, $pops ) = signup_info();
+( $locales, $packages, $pops, $init_data ) = signup_info();
+@payby = @{$init_data->{'payby'}} if @{$init_data->{'payby'}};
 
 $cgi = new CGI;
 
@@ -115,37 +117,56 @@ if ( defined $cgi->param('magic') ) {
       $invoicing_list = 'POST';
     }
 
-    $error = new_customer ( {
-      'last'             => $last             = $cgi->param('last'),
-      'first'            => $first            = $cgi->param('first'),
-      'ss'               => $ss               = $cgi->param('ss'),
-      'company'          => $company          = $cgi->param('company'),
-      'address1'         => $address1         = $cgi->param('address1'),
-      'address2'         => $address2         = $cgi->param('address2'),
-      'city'             => $city             = $cgi->param('city'),
-      'county'           => $county,
-      'state'            => $state,
-      'zip'              => $zip              = $cgi->param('zip'),
-      'country'          => $country,
-      'daytime'          => $daytime          = $cgi->param('daytime'),
-      'night'            => $night            = $cgi->param('night'),
-      'fax'              => $fax              = $cgi->param('fax'),
-      'payby'            => $payby,
-      'payinfo'          => $payinfo,
-      'paydate'          => $paydate,
-      'payname'          => $payname,
-      'invoicing_list'   => $invoicing_list,
-      'referral_custnum' => $referral_custnum = $cgi->param('ref'),
-      'pkgpart'          => $pkgpart          = $cgi->param('pkgpart'),
-      'username'         => $username         = $cgi->param('username'),
-      '_password'        => $password         = $cgi->param('_password'),
-      'popnum'           => $popnum           = $cgi->param('popnum'),
-    } );
+    $error = '';
+
+    if ( $cgi->param('_password') ne $cgi->param('_password2') ) {
+      $error = "Passwords don't match"; #msgcat
+      $password  = '';
+      $password2 = '';
+    } else {
+      $password2 = $cgi->param('_password2');
+
+      if ( $payby eq 'CARD' && $cgi->param('CARD_type')
+           && cardtype($payinfo) ne $cgi->param('CARD_type') ) {
+        $error = 'Not an '. $cgi->param('CARD_type'). '| - is: |'. cardtype($payinfo). '|'; #msgcat
+      }
+
+      $error ||= new_customer ( {
+        'last'             => $last             = $cgi->param('last'),
+        'first'            => $first            = $cgi->param('first'),
+        'ss'               => $ss               = $cgi->param('ss'),
+        'company'          => $company          = $cgi->param('company'),
+        'address1'         => $address1         = $cgi->param('address1'),
+        'address2'         => $address2         = $cgi->param('address2'),
+        'city'             => $city             = $cgi->param('city'),
+        'county'           => $county,
+        'state'            => $state,
+        'zip'              => $zip              = $cgi->param('zip'),
+        'country'          => $country,
+        'daytime'          => $daytime          = $cgi->param('daytime'),
+        'night'            => $night            = $cgi->param('night'),
+        'fax'              => $fax              = $cgi->param('fax'),
+        'payby'            => $payby,
+        'payinfo'          => $payinfo,
+        'paydate'          => $paydate,
+        'payname'          => $payname,
+        'invoicing_list'   => $invoicing_list,
+        'referral_custnum' => $referral_custnum = $cgi->param('ref'),
+        'pkgpart'          => $pkgpart          = $cgi->param('pkgpart'),
+        'username'         => $username         = $cgi->param('username'),
+        'sec_phrase'       => $sec_phrase       = $cgi->param('sec_phrase'),
+        '_password'        => $password         = $cgi->param('_password'),
+        'popnum'           => $popnum           = $cgi->param('popnum'),
+      } );
+
+    }
+    
     if ( $error ) {
       print_form();
     } else {
       print_okay();
     }
+
   } else {
     die "unrecognized magic: ". $cgi->param('magic');
   }
@@ -173,6 +194,8 @@ if ( defined $cgi->param('magic') ) {
   $pkgpart = '';
   $username = '';
   $password = '';
+  $password2 = '';
+  $sec_phrase = '';
   $popnum = '';
   $referral_custnum = $cgi->param('ref') || '';
   print_form;
@@ -314,7 +337,7 @@ sub expselect {
     $return .= ">$_";
   }
   $return .= qq!</SELECT>/<SELECT NAME="$prefix!. qq!_year" SIZE="1">!;
-  for ( 1999 .. 2037 ) {
+  for ( 2001 .. 2037 ) {
     $return .= "<OPTION";
     $return .= " SELECTED" if $_ == $y;
     $return .= ">$_";
@@ -412,31 +435,53 @@ Contact Information
 </TD></TR>
 <TR><TD>Email invoice <INPUT TYPE="text" NAME="invoicing_list" VALUE="<%= join(', ', grep { $_ ne 'POST' } split(', ', $invoicing_list ) ) %>">
 </TD></TR>
-<TR><TD>Billing type</TD></TR></TABLE>
+<%= scalar(@payby) > 1 ? '<TR><TD>Billing type</TD></TR>' : '' %>
+</TABLE>
 <TABLE BGCOLOR="#c0c0c0" BORDER=1 WIDTH="100%">
 <TR>
 
   <%=
+
+    my $cardselect = '<SELECT NAME="CARD_type"><OPTION></OPTION>';
+    my %types = (
+                  'VISA' => 'VISA card',
+                  'MasterCard' => 'MasterCard',
+                  'Discover' => 'Discover card',
+                  'American Express' => 'American Express card',
+                );
+    foreach ( keys %types ) {
+      $selected = $cgi->param('CARD_type') eq $types{$_} ? 'SELECTED' : '';
+      $cardselect .= qq!<OPTION $selected VALUE="$types{$_}">$_</OPTION>!;
+    }
+    $cardselect .= '</SELECT>';
+  
     my %payby = (
-      'CARD' => qq!Credit card<BR><font color="#ff0000">*</font><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="">!,
+      '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="">!,
       '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"),
       'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="" MAXLENGTH=80>!,
     );
 
     my %paybychecked = (
-      'CARD' => qq!Credit card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!,
+      'CARD' => qq!Credit card<BR><font color="#ff0000">*</font>$cardselect<INPUT TYPE="text" NAME="CARD_payinfo" VALUE="$payinfo" MAXLENGTH=19><BR><font color="#ff0000">*</font>Exp !. expselect("CARD", $paydate). qq!<BR><font color="#ff0000">*</font>Name on card<BR><INPUT TYPE="text" NAME="CARD_payname" VALUE="$payname">!,
       '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),
       'PREPAY' => qq!Prepaid card<BR><font color="#ff0000">*</font><INPUT TYPE="text" NAME="PREPAY_payinfo" VALUE="$payinfo" MAXLENGTH=80>!,
     );
 
     for (@payby) {
-      $OUT .= qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!;
-      if ($payby eq $_) {
-        $OUT .= qq! CHECKED> $paybychecked{$_}</TD>!;
+      if ( scalar(@payby) == 1) {
+        $OUT .= '<TD VALIGN=TOP>'.
+                qq!<INPUT TYPE="hidden" NAME="payby" VALUE="$_">!.
+                "$paybychecked{$_}</TD>";
       } else {
-        $OUT .= qq!> $payby{$_}</TD>!;
+        $OUT .= qq!<TD VALIGN=TOP><INPUT TYPE="radio" NAME="payby" VALUE="$_"!;
+        if ($payby eq $_) {
+          $OUT .= qq! CHECKED> $paybychecked{$_}</TD>!;
+        } else {
+          $OUT .= qq!> $payby{$_}</TD>!;
+        }
+
       }
     }
   %>
@@ -463,10 +508,28 @@ Contact Information
 </TR>
 <TR>
   <TD ALIGN="right">Password</TD>
-  <TD><INPUT TYPE="text" NAME="_password" VALUE="<%= $password %>">
+  <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>">
   (blank to generate)</TD>
 </TR>
 <TR>
+  <TD ALIGN="right">Re-enter Password</TD>
+  <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>">
+  </TD>
+</TR>
+<%=
+  if ( $init_data->{'security_phrase'} ) {
+    $OUT .= <<ENDOUT;
+<TR>
+  <TD ALIGN="right">Security Phrase</TD>
+  <TD><INPUT TYPE="text" NAME="sec_phrase" VALUE="$sec_phrase">
+  </TD>
+</TR>
+ENDOUT
+  } else {
+    $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">';
+  }
+%>
+<TR>
   <TD ALIGN="right">Access number</TD>
   <TD><%= popselector($popnum) %></TD>
 </TR>