don't double \r on old templates
[freeside.git] / fs_signup / FS-SignupClient / cgi / signup.cgi
index 0b2370a..08d8a4d 100755 (executable)
@@ -1,6 +1,6 @@
 #!/usr/bin/perl -Tw
 #
-# $Id: signup.cgi,v 1.17 2002-04-06 21:39:22 ivan Exp $
+# $Id: signup.cgi,v 1.29 2002-05-30 22:45:20 ivan Exp $
 
 use strict;
 use vars qw( @payby $cgi $locales $packages $pops $init_data $error
@@ -8,17 +8,24 @@ use vars qw( @payby $cgi $locales $packages $pops $init_data $error
              $country $zip $daytime $night $fax $invoicing_list $payby $payinfo
              $paydate $payname $referral_custnum
              $pkgpart $username $password $password2 $sec_phrase $popnum
+             $agentnum
              $ieak_file $ieak_template $cck_file $cck_template
-             $signup_html $signup_template $success_html $success_template
+             $signup_html $signup_template
+             $success_html $success_template
+             $decline_html $decline_template
              $ac $exch $loc
+             $email_name $pkg
              $self_url
            );
-use subs qw( print_form print_okay expselect signup_default success_default );
+use subs qw( print_form print_okay print_decline
+             signup_default success_default decline_default
+             expselect );
 use CGI;
-use CGI::Carp qw(fatalsToBrowser);
+#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 );
-use Text::Template;
 
 #acceptable payment methods
 #
@@ -29,14 +36,24 @@ use Text::Template;
 
 $ieak_file = '/usr/local/freeside/ieak.template';
 $cck_file = '/usr/local/freeside/cck.template';
-$signup_html = '/usr/local/freeside/signup.html';
-$success_html = '/usr/local/freeside/success.html';
+$signup_html = -e 'signup.html'
+                 ? 'signup.html'
+                 : '/usr/local/freeside/signup.html';
+$success_html = -e 'success.html'
+                  ? 'success.html'
+                  : '/usr/local/freeside/success.html';
+$decline_html = -e 'decline.html'
+                  ? 'decline.html'
+                  : '/usr/local/freeside/decline.html';
+
 
 if ( -e $ieak_file ) {
   my $ieak_txt = Text::Template::_load_text($ieak_file)
     or die $Text::Template::ERROR;
   $ieak_txt =~ /^(.*)$/s; #untaint the template source - it's trusted
   $ieak_txt = $1;
+  $ieak_txt =~ s/\r//g; # don't double \r on old templates
+  $ieak_txt =~ s/\n/\r\n/g;
   $ieak_template = new Text::Template ( TYPE => 'STRING', SOURCE => $ieak_txt )
     or die $Text::Template::ERROR;
 } else {
@@ -54,6 +71,7 @@ if ( -e $cck_file ) {
   $cck_template = '';
 }
 
+$agentnum = '';
 if ( -e $signup_html ) {
   my $signup_txt = Text::Template::_load_text($signup_html)
     or die $Text::Template::ERROR;
@@ -64,6 +82,11 @@ if ( -e $signup_html ) {
                                           DELIMITERS => [ '<%=', '%>' ]
                                         )
     or die $Text::Template::ERROR;
+  if ( $signup_txt =~
+         /<\s*INPUT TYPE="?hidden"?\s+NAME="?agentnum"?\s+VALUE="?(\d+)"?\s*>/si
+  ) {
+    $agentnum = $1;
+  }
 } else {
   $signup_template = new Text::Template ( TYPE => 'STRING',
                                           SOURCE => &signup_default,
@@ -90,7 +113,28 @@ if ( -e $success_html ) {
     or die $Text::Template::ERROR;
 }
 
+if ( -e $decline_html ) {
+  my $decline_txt = Text::Template::_load_text($decline_html)
+    or die $Text::Template::ERROR;
+  $decline_txt =~ /^(.*)$/s; #untaint the template source - it's trusted
+  $decline_txt = $1;
+  $decline_template = new Text::Template ( TYPE => 'STRING',
+                                           SOURCE => $decline_txt,
+                                           DELIMITERS => [ '<%=', '%>' ],
+                                         )
+    or die $Text::Template::ERROR;
+} else {
+  $decline_template = new Text::Template ( TYPE => 'STRING',
+                                           SOURCE => &decline_default,
+                                           DELIMITERS => [ '<%=', '%>' ],
+                                         )
+    or die $Text::Template::ERROR;
+}
+
+
 ( $locales, $packages, $pops, $init_data ) = signup_info();
+@payby = @{$init_data->{'payby'}} if @{$init_data->{'payby'}};
+$packages = $init_data->{agentnum2part_pkg}{$agentnum} if $agentnum;
 
 $cgi = new CGI;
 
@@ -117,44 +161,86 @@ if ( defined $cgi->param('magic') ) {
 
     $error = '';
 
+    $last             = $cgi->param('last');
+    $first            = $cgi->param('first');
+    $ss               = $cgi->param('ss');
+    $company          = $cgi->param('company');
+    $address1         = $cgi->param('address1');
+    $address2         = $cgi->param('address2');
+    $city             = $cgi->param('city');
+    #$county,
+    #$state,
+    $zip              = $cgi->param('zip');
+    #$country,
+    $daytime          = $cgi->param('daytime');
+    $night            = $cgi->param('night');
+    $fax              = $cgi->param('fax');
+    #$payby,
+    #$payinfo,
+    #$paydate,
+    #$payname,
+    #$invoicing_list,
+    $referral_custnum = $cgi->param('ref');
+    $pkgpart          = $cgi->param('pkgpart');
+    $username         = $cgi->param('username');
+    $sec_phrase       = $cgi->param('sec_phrase');
+    $password         = $cgi->param('_password');
+    $popnum           = $cgi->param('popnum');
+    #$agentnum, #         = $cgi->param('agentnum'),
+
     if ( $cgi->param('_password') ne $cgi->param('_password2') ) {
-      $error = "Passwords don't match";
+      $error = $init_data->{msgcat}{passwords_dont_match}; #msgcat
       $password  = '';
       $password2 = '';
     } else {
       $password2 = $cgi->param('_password2');
 
-      $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'),
+      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,
+        'first'            => $first,
+        'ss'               => $ss,
+        'company'          => $company,
+        'address1'         => $address1,
+        'address2'         => $address2,
+        'city'             => $city,
         'county'           => $county,
         'state'            => $state,
-        'zip'              => $zip              = $cgi->param('zip'),
+        'zip'              => $zip,
         'country'          => $country,
-        'daytime'          => $daytime          = $cgi->param('daytime'),
-        'night'            => $night            = $cgi->param('night'),
-        'fax'              => $fax              = $cgi->param('fax'),
+        'daytime'          => $daytime,
+        'night'            => $night,
+        'fax'              => $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'),
+        'referral_custnum' => $referral_custnum,
+        'pkgpart'          => $pkgpart,
+        'username'         => $username,
+        'sec_phrase'       => $sec_phrase,
+        '_password'        => $password,
+        'popnum'           => $popnum,
+        'agentnum'         => $agentnum,
       } );
 
     }
     
-    if ( $error ) {
+    if ( $error eq '_decline' ) {
+      print_decline();
+    } elsif ( $error ) {
       print_form();
     } else {
       print_okay();
@@ -206,6 +292,11 @@ sub print_form {
 
 }
 
+sub print_decline {
+  print $cgi->header( '-expires' => 'now' ),
+        $decline_template->fill_in();
+}
+
 sub print_okay {
   my $user_agent = new HTTP::Headers::UserAgent $ENV{HTTP_USER_AGENT};
 
@@ -216,12 +307,19 @@ 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";
-  my $email_name = $1;
+    or die "fatal: invalid email_name got past FS::SignupClient::new_customer";
+  $email_name = $1; #global for template
+
+  my $pop = pop_info($cgi->param('popnum'));
+    #or die "fatal: invalid popnum got past FS::SignupClient::new_customer";
+  if ( $pop ) {
+    ( $ac, $exch, $loc ) = ( $pop->{'ac'}, $pop->{'exch'}, $pop->{'loc'} );
+  } else {
+    ( $ac, $exch, $loc ) = ( '', '', ''); #presumably you're not using them.
+  }
 
-  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'} );
+  #global for template
+  $pkg = ( grep { $_->{'pkgpart'} eq $pkgpart } @$packages )[0]->{'pkg'};
 
   if ( $ieak_template
        && $user_agent->platform eq 'ia32'
@@ -263,6 +361,12 @@ sub pop_info {
 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;
 
@@ -345,6 +449,23 @@ 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
+}
+
+sub decline_default { #html to use if there is a decline
+  <<'END';
+<HTML><HEAD><TITLE>Processing error</TITLE></HEAD>
+<BODY BGCOLOR="#e8e8e8"><FONT SIZE=7>Processing error</FONT><BR><BR>
+There has been an error processing your account.  Please contact customer
+support.
 </BODY></HTML>
 END
 }
@@ -428,31 +549,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>!;
+        }
+
       }
     }
   %>
@@ -479,13 +622,11 @@ Contact Information
 </TR>
 <TR>
   <TD ALIGN="right">Password</TD>
-  <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>">
-  (blank to generate)</TD>
+  <TD><INPUT TYPE="password" NAME="_password" VALUE="<%= $password %>"></TD>
 </TR>
 <TR>
   <TD ALIGN="right">Re-enter Password</TD>
-  <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>">
-  </TD>
+  <TD><INPUT TYPE="password" NAME="_password2" VALUE="<%= $password2 %>"></TD>
 </TR>
 <%=
   if ( $init_data->{'security_phrase'} ) {
@@ -500,10 +641,14 @@ ENDOUT
     $OUT .= '<INPUT TYPE="hidden" NAME="sec_phrase" VALUE="">';
   }
 %>
-<TR>
-  <TD ALIGN="right">Access number</TD>
-  <TD><%= popselector($popnum) %></TD>
-</TR>
+<%=
+  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>