manual echeck payment type, RT#26995
[freeside.git] / FS / FS / cust_payby.pm
index 7bf8c76..ad3d80a 100644 (file)
@@ -6,15 +6,25 @@ use FS::UID;
 use FS::Record qw( qsearchs ); #qsearch;
 use FS::payby;
 use FS::cust_main;
+use Business::CreditCard qw( validate cardtype );
+use FS::Msgcat qw( gettext );
 
-use vars qw( $conf $ignore_expired_card $ignore_banned_card  );
+use vars qw( $conf @encrypted_fields
+             $ignore_expired_card $ignore_banned_card
+             $ignore_invalid_card
+           );
+
+@encrypted_fields = ('payinfo', 'paycvv');
+sub nohistory_fields { ('payinfo', 'paycvv'); }
 
 $ignore_expired_card = 0;
 $ignore_banned_card = 0;
+$ignore_invalid_card = 0;
 
 install_callback FS::UID sub { 
   $conf = new FS::Conf;
   #yes, need it for stuff below (prolly should be cached)
+  $ignore_invalid_card = $conf->exists('allow_invalid_cards');
 };
 
 =head1 NAME
@@ -165,45 +175,25 @@ sub check {
     $self->ut_numbern('custpaybynum')
     || $self->ut_foreign_key('custnum', 'cust_main', 'custnum')
     || $self->ut_number('weight')
-    || $self->ut_('payby')
-    || $self->ut_textn('payinfo')
-    || $self->ut_textn('paycvv')
-    || $self->ut_textn('paymask')
-    || $self->ut_textn('paydate')
+    #encrypted #|| $self->ut_textn('payinfo')
+    #encrypted #|| $self->ut_textn('paycvv')
+#    || $self->ut_textn('paymask') #XXX something
+    #later #|| $self->ut_textn('paydate')
     || $self->ut_numbern('paystart_month')
     || $self->ut_numbern('paystart_year')
-    || $self->ut_textn('payissue')
-    || $self->ut_textn('payname')
-    || $self->ut_textn('paystate')
+    || $self->ut_numbern('payissue')
+#    || $self->ut_textn('payname') #XXX something
+    || $self->ut_alphan('paystate')
     || $self->ut_textn('paytype')
-    || $self->ut_textn('payip')
+    || $self->ut_ipn('payip')
   ;
   return $error if $error;
 
-
   ### from cust_main
 
-
-  #$self->payby =~ /^(CARD|DCRD|CHEK|DCHK|LECB|BILL|COMP|PREPAY|CASH|WEST|MCRD)$/
-  #  or return "Illegal payby: ". $self->payby;
-  #$self->payby($1);
   FS::payby->can_payby($self->table, $self->payby)
     or return "Illegal payby: ". $self->payby;
 
-  $error =    $self->ut_numbern('paystart_month')
-           || $self->ut_numbern('paystart_year')
-           || $self->ut_numbern('payissue')
-           || $self->ut_textn('paytype')
-  ;
-  return $error if $error;
-
-  if ( $self->payip eq '' ) {
-    $self->payip('');
-  } else {
-    $error = $self->ut_ip('payip');
-    return $error if $error;
-  }
-
   # If it is encrypted and the private key is not availaible then we can't
   # check the credit card.
   my $check_payinfo = ! $self->is_encrypted($self->payinfo);
@@ -211,7 +201,8 @@ sub check {
   # Need some kind of global flag to accept invalid cards, for testing
   # on scrubbed data.
   #XXX if ( !$import && $check_payinfo && $self->payby =~ /^(CARD|DCRD)$/ ) {
-  if ( $check_payinfo && $self->payby =~ /^(CARD|DCRD)$/ ) {
+  if ( !$ignore_invalid_card && 
+    $check_payinfo && $self->payby =~ /^(CARD|DCRD)$/ ) {
 
     my $payinfo = $self->payinfo;
     $payinfo =~ s/\D//g;
@@ -283,7 +274,8 @@ sub check {
       $self->payissue('');
     }
 
-  } elsif ( $check_payinfo && $self->payby =~ /^(CHEK|DCHK)$/ ) {
+  } elsif ( !$ignore_invalid_card && 
+    $check_payinfo && $self->payby =~ /^(CHEK|DCHK)$/ ) {
 
     my $payinfo = $self->payinfo;
     $payinfo =~ s/[^\d\@\.]//g;
@@ -361,7 +353,7 @@ sub check {
   if ( $self->paydate eq '' || $self->paydate eq '-' ) {
     return "Expiration date required"
       # shouldn't payinfo_check do this?
-      unless $self->payby =~ /^(BILL|PREPAY|CHEK|DCHK|LECB|CASH|WEST|MCRD|PPAL)$/;
+      unless $self->payby =~ /^(BILL|PREPAY|CHEK|DCHK|LECB|CASH|WEST|MCRD|MCHK|PPAL)$/;
     $self->paydate('');
   } else {
     my( $m, $y );
@@ -390,9 +382,17 @@ sub check {
   ) {
     $self->payname( $self->first. " ". $self->getfield('last') );
   } else {
-    $self->payname =~ /^([\w \,\.\-\'\&]+)$/
-      or return gettext('illegal_name'). " payname: ". $self->payname;
-    $self->payname($1);
+
+    if ( $self->payby =~ /^(CHEK|DCHK)$/ ) {
+      $self->payname =~ /^([\w \,\.\-\']*)$/
+        or return gettext('illegal_name'). " payname: ". $self->payname;
+      $self->payname($1);
+    } else {
+      $self->payname =~ /^([\w \,\.\-\'\&]*)$/
+        or return gettext('illegal_name'). " payname: ". $self->payname;
+      $self->payname($1);
+    }
+
   }
 
   ###