bulk checkin from working on the road:
[freeside.git] / fs_signup / FS-SignupClient / cgi / signup.cgi
index f0d4620..284237d 100755 (executable)
@@ -1,13 +1,13 @@
 #!/usr/bin/perl -Tw
 #
-# $Id: signup.cgi,v 1.13 2001-09-11 11:28:15 ivan Exp $
+# $Id: signup.cgi,v 1.20 2002-04-10 13:42:48 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
@@ -15,10 +15,11 @@ 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 CGI::Carp qw(fatalsToBrowser);
 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,63 @@ 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 = $init_data->{msgcat}{passwords_dont_match}; #msgcat
+      $password  = '';
+      $password2 = '';
+    } else {
+      $password2 = $cgi->param('_password2');
+
+      if ( $payby eq 'CARD' && $cgi->param('CARD_type') ) {
+        $payinfo =~ s/\D//g;
+
+        $payinfo =~ /^(\d{13,16})$/
+          or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
+        $payinfo = $1;
+        validate($payinfo)
+          or $error ||= $init_data->{msgcat}{invalid_card}; #. $self->payinfo;
+        cardtype($payinfo) eq $cgi->param('CARD_type')
+          or $error ||= $init_data->{msgcat}{not_a}. $cgi->param('CARD_type');
+      }
+
+      $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 +201,8 @@ if ( defined $cgi->param('magic') ) {
   $pkgpart = '';
   $username = '';
   $password = '';
+  $password2 = '';
+  $sec_phrase = '';
   $popnum = '';
   $referral_custnum = $cgi->param('ref') || '';
   print_form;
@@ -200,13 +230,15 @@ sub print_okay {
     or die "fatal: invalid password got past FS::SignupClient::new_customer";
   my $password = $1;
   ( $cgi->param('first'). ' '. $cgi->param('last') ) =~ /^(.*)$/
-    or die "fatal: invalid email_name got past FS::SignupCLient::new_customer";
+    or die "fatal: invalid email_name got past FS::SignupClient::new_customer";
   my $email_name = $1;
 
   my $pop = pop_info($cgi->param('popnum'))
     or die "fatal: invalid popnum got past FS::SignupClient::new_customer";
   ( $ac, $exch, $loc ) = ( $pop->{'ac'}, $pop->{'exch'}, $pop->{'loc'} );
 
+  my $pkg = ( grep { $_->{'pkgpart'} eq $pkgpart } @$packages )[0]->{'pkg'};
+
   if ( $ieak_template
        && $user_agent->platform eq 'ia32'
        && $user_agent->os =~ /^win/
@@ -243,6 +275,67 @@ sub pop_info {
   '';
 }
 
+#horrible false laziness with FS/FS/svc_acct_pop.pm::popselector
+sub popselector {
+  my( $popnum, $state ) = @_;
+
+  return '<INPUT TYPE="hidden" NAME="popnum" VALUE="">' unless @$pops;
+  return $pops->[0]{city}. ', '. $pops->[0]{state}.
+         ' ('. $pops->[0]{ac}. ')/'. $pops->[0]{exch}.
+         '<INPUT TYPE="hidden" NAME="popnum" VALUE="'. $pops->[0]{popnum}. '">'
+    if scalar(@$pops) == 1;
+
+  my %pop = ();
+  push @{ $pop{$_->{state}} }, $_ foreach @$pops;
+
+  my $text = <<END;
+    <SCRIPT>
+    function opt(what,href,text) {
+      var optionName = new Option(text, href, false, false)
+      var length = what.length;
+      what.options[length] = optionName;
+    }
+    
+    function popstate_changed(what) {
+      state = what.options[what.selectedIndex].text;
+      for (var i = what.form.popnum.length;i > 0;i--)
+                what.form.popnum.options[i] = null;
+      what.form.popnum.options[0] = new Option("", "", false, true);
+END
+
+  foreach my $popstate ( sort { $a cmp $b } keys %pop ) {
+    $text .= "\nif ( state == \"$popstate\" ) {\n";
+
+    foreach my $pop ( @{$pop{$popstate}}) {
+      my $o_popnum = $pop->{popnum};
+      my $poptext =  $pop->{city}. ', '. $pop->{state}.
+                     ' ('. $pop->{ac}. ')/'. $pop->{exch};
+
+      $text .= "opt(what.form.popnum, \"$o_popnum\", \"$poptext\");\n"
+    }
+    $text .= "}\n";
+  }
+
+  $text .= "}\n</SCRIPT>\n";
+
+  $text .=
+    qq!<SELECT NAME="popstate" SIZE=1 onChange="popstate_changed(this)">!.
+    qq!<OPTION> !;
+  $text .= "<OPTION>$_" foreach sort { $a cmp $b } keys %pop;
+  $text .= '</SELECT>'; #callback? return 3 html pieces?  #'</TD><TD>';
+
+  $text .= qq!<SELECT NAME="popnum" SIZE=1><OPTION> !;
+  foreach my $pop ( @$pops ) {
+    $text .= qq!<OPTION VALUE="!. $pop->{popnum}. '"'.
+             ( ( $popnum && $pop->{popnum} == $popnum ) ? ' SELECTED' : '' ). ">".
+             $pop->{city}. ', '. $pop->{state}.
+               ' ('. $pop->{ac}. ')/'. $pop->{exch};
+  }
+  $text .= '</SELECT>';
+
+  $text;
+}
+
 sub expselect {
   my $prefix = shift;
   my $date = shift || '';
@@ -259,7 +352,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 .= ">$_";
@@ -274,6 +367,13 @@ sub success_default { #html to use if you don't specify a success file
 <HTML><HEAD><TITLE>Signup successful</TITLE></HEAD>
 <BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Signup successful</FONT><BR><BR>
 Thanks for signing up!
+<BR><BR>
+Signup information for <%= $email_name %>:
+<BR><BR>
+Username: <%= $username %><BR>
+Password: <%= $password %><BR>
+Access number: (<%= $ac %>) / $exch - $local<BR>
+Package: <%= $pkg %><BR>
 </BODY></HTML>
 END
 }
@@ -357,31 +457,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>!;
+        }
+
       }
     }
   %>
@@ -408,24 +530,33 @@ Contact Information
 </TR>
 <TR>
   <TD ALIGN="right">Password</TD>
-  <TD><INPUT TYPE="text" NAME="_password" VALUE="<%= $password %>">
-  (blank to generate)</TD>
+  <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>"></TD>
 </TR>
 <TR>
-  <TD ALIGN="right">POP</TD>
-  <TD><SELECT NAME="popnum" SIZE=1><OPTION> 
-
-  <%=
-    foreach my $pop ( @{$pops} ) {
-      $OUT .= '<OPTION VALUE="'. $pop->{'popnum'}. '"';
-      $OUT .= ' SELECTED' if $popnum && $pop->{'popnum'} == $popnum;
-      $OUT .= '>'. $pop->{'popnum'}. ': '. $pop->{'city'}. ', '.
-              $pop->{'state'}. ' ('. $pop->{'ac'}. ')/'. $pop->{'exch'}. "\n";
-    }
-  %>
-
-  </SELECT></TD>
+  <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="">';
+  }
+%>
+<%=
+  if ( scalar(@$pops) ) {
+    $OUT .= '<TR><TD ALIGN="right">Access number</TD><TD>'.
+            popselector($popnum). '</TD></TR>';
+  } else {
+    $OUT .= popselector($popnum);
+  }
+%>
 </TABLE>
 <BR><BR><INPUT TYPE="submit" VALUE="Signup">
 </FORM></BODY></HTML>