71513: Card tokenization [v3 backport]
[freeside.git] / FS / FS / cust_main.pm
index 0165bc4..33dab90 100644 (file)
@@ -463,10 +463,11 @@ sub insert {
     if $conf->config('cust_main-auto_agent_custid') && ! $self->agent_custid;
 
   my $error =  $self->check_payinfo_cardtype
+            || $self->check             # needed now for tokenize
+            || $self->realtime_tokenize # needs to happen before initial insert
             || $self->SUPER::insert;
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
-    #return "inserting cust_main record (transaction rolled back): $error";
     return $error;
   }
 
@@ -1555,24 +1556,26 @@ sub replace {
     my $error = $self->check_payinfo_cardtype;
     return $error if $error;
 
-    if ( $conf->exists('business-onlinepayment-verification') ) {
-      #need to standardize paydate for this, false laziness with check
-      my( $m, $y );
-      if ( $self->paydate =~ /^(\d{1,2})[\/\-](\d{2}(\d{2})?)$/ ) {
-        ( $m, $y ) = ( $1, length($2) == 4 ? $2 : "20$2" );
-      } elsif ( $self->paydate =~ /^19(\d{2})[\/\-](\d{1,2})[\/\-]\d+$/ ) {
-        ( $m, $y ) = ( $2, "19$1" );
-      } elsif ( $self->paydate =~ /^(20)?(\d{2})[\/\-](\d{1,2})[\/\-]\d+$/ ) {
-        ( $m, $y ) = ( $3, "20$2" );
-      } else {
-        return "Illegal expiration date: ". $self->paydate;
-      }
-      $m = sprintf('%02d',$m);
-      $self->paydate("$y-$m-01");
+    #need to standardize paydate for this, false laziness with check
+    my( $m, $y );
+    if ( $self->paydate =~ /^(\d{1,2})[\/\-](\d{2}(\d{2})?)$/ ) {
+      ( $m, $y ) = ( $1, length($2) == 4 ? $2 : "20$2" );
+    } elsif ( $self->paydate =~ /^19(\d{2})[\/\-](\d{1,2})[\/\-]\d+$/ ) {
+      ( $m, $y ) = ( $2, "19$1" );
+    } elsif ( $self->paydate =~ /^(20)?(\d{2})[\/\-](\d{1,2})[\/\-]\d+$/ ) {
+      ( $m, $y ) = ( $3, "20$2" );
+    } else {
+      return "Illegal expiration date: ". $self->paydate;
+    }
+    $m = sprintf('%02d',$m);
+    $self->paydate("$y-$m-01");
 
+    if ( $conf->exists('business-onlinepayment-verification') ) {
       $error = $self->realtime_verify_bop({ 'method'=>'CC' });
-      return $error if $error;
+    } else {
+      $error = $self->realtime_tokenize;
     }
+    return $error if $error;
   }
 
   return "Invoicing locale is required"
@@ -1712,7 +1715,7 @@ sub replace {
 
   if ( $self->payby =~ /^(CARD|CHEK|LECB)$/
        && ( ( $self->get('payinfo') ne $old->get('payinfo')
-              && $self->get('payinfo') !~ /^99\d{14}$/ 
+              && !$self->tokenized
             )
             || grep { $self->get($_) ne $old->get($_) } qw(paydate payname)
           )
@@ -1969,7 +1972,7 @@ sub check {
       or return gettext('invalid_card'); # . ": ". $self->payinfo;
 
     my $cardtype = cardtype($payinfo);
-    $cardtype = 'Tokenized' if $self->payinfo =~ /^99\d{14}$/; # token
+    $cardtype = 'Tokenized' if $self->tokenized; # token
 
     return gettext('unknown_card_type') if $cardtype eq 'Unknown';
 
@@ -2185,7 +2188,7 @@ sub check_payinfo_cardtype {
   my $payinfo = $self->payinfo;
   $payinfo =~ s/\D//g;
 
-  if ( $payinfo =~ /^99\d{14}$/ ) {
+  if ( $self->tokenized($payinfo) ) {
     $self->set('paycardtype', 'Tokenized');
     return '';
   }
@@ -5736,6 +5739,11 @@ sub _upgrade_data { #class method
 
 }
 
+sub queueable_upgrade {
+  my $class = shift;
+  FS::cust_main::Billing_Realtime::token_check(@_);
+}
+
 =back
 
 =head1 BUGS