RT# 81557 - Added checkbox to validate cc on import, and cc validation.
[freeside.git] / FS / FS / cust_main / Import.pm
index 1b26027..dcedc16 100644 (file)
@@ -14,6 +14,7 @@ use FS::svc_external;
 use FS::svc_phone;
 use FS::svc_hardware;
 use FS::part_referral;
+use Business::CreditCard 0.35;
 
 $DEBUG = 0;
 
@@ -95,6 +96,7 @@ sub process_batch_import {
       agentnum  => $param->{'agentnum'},
       refnum    => $param->{'refnum'},
       pkgpart   => $param->{'pkgpart'},
+      validate_cc => $param->{'validate_cc'},
       #'fields'  => [qw( cust_pkg.setup dayphone first last address1 address2
       #                 city state zip comments                          )],
       'format'  => $param->{'format'},
@@ -125,15 +127,14 @@ sub batch_import {
   my $agentnum  = $param->{agentnum};
   my $refnum    = $param->{refnum};
   my $pkgpart   = $param->{pkgpart};
+  my $validate_cc = $param->{validate_cc};
 
   my $format    = $param->{'format'};
 
   my @fields;
-  my $payby;
   if ( $format eq 'simple' ) {
     @fields = qw( cust_pkg.setup dayphone first last
                   address1 address2 city state zip comments );
-    $payby = 'BILL';
   } elsif ( $format eq 'extended' ) {
     @fields = qw( agent_custid refnum
                   last first address1 address2 city state zip country
@@ -145,7 +146,6 @@ sub batch_import {
                   cust_pkg.pkgpart
                   svc_acct.username svc_acct._password 
                 );
-    $payby = 'BILL';
  } elsif ( $format eq 'extended-plus_options' ) {
     @fields = qw( agent_custid refnum
                   last first address1 address2 city state zip country
@@ -158,7 +158,6 @@ sub batch_import {
                   svc_acct.username svc_acct._password 
                   customer_options
                 );
-    $payby = 'BILL';
  } elsif ( $format eq 'extended-plus_company' ) {
     @fields = qw( agent_custid refnum
                   last first company address1 address2 city state zip country
@@ -170,7 +169,6 @@ sub batch_import {
                   cust_pkg.pkgpart
                   svc_acct.username svc_acct._password 
                 );
-    $payby = 'BILL';
  } elsif ( $format eq 'extended-plus_company_and_options' ) {
     @fields = qw( agent_custid refnum
                   last first company address1 address2 city state zip country
@@ -183,7 +181,6 @@ sub batch_import {
                   svc_acct.username svc_acct._password 
                   customer_options
                 );
-    $payby = 'BILL';
  } elsif ( $format =~ /^svc_broadband/ ) {
     @fields = qw( agent_custid refnum
                   last first company address1 address2 city state zip country
@@ -195,7 +192,6 @@ sub batch_import {
                   cust_pkg.pkgpart cust_pkg.bill
                 );
     push @fields, map "svc_broadband.$_", qw( ip_addr mac_addr sectornum );
-    $payby = 'BILL';
  } elsif ( $format =~ /^svc_external/ ) {
     @fields = qw( agent_custid refnum
                   last first company address1 address2 city state zip country
@@ -209,7 +205,6 @@ sub batch_import {
                 );
     push @fields, map "svc_phone.$_", qw( countrycode phonenum sip_password pin)
       if $format eq 'svc_external_svc_phone';
-    $payby = 'BILL';
   } elsif ( $format eq 'birthdates-acct_phone_hardware') {
     @fields = qw( agent_custid refnum
                   last first company address1 address2 city state zip country
@@ -225,7 +220,6 @@ sub batch_import {
     push @fields, map "svc_phone.$_", qw(countrycode phonenum sip_password pin);
     push @fields, map "svc_hardware.$_", qw(typenum ip_addr hw_addr serial);
 
-    $payby = 'BILL';
   } elsif ( $format eq 'national_id-acct_phone') {
     @fields = qw( agent_custid refnum
                   last first company address1 address2 city state zip country
@@ -240,7 +234,6 @@ sub batch_import {
                 );
     push @fields, map "svc_phone.$_", qw(countrycode phonenum sip_password pin);
 
-    $payby = 'BILL';
   } else {
     die "unknown format $format";
   }
@@ -328,7 +321,6 @@ sub batch_import {
       custbatch => $custbatch,
       agentnum  => $agentnum,
       refnum    => $refnum,
-      payby     => $payby, #default
       paydate   => '12/2037', #default
     );
     my $billtime = time;
@@ -336,6 +328,7 @@ sub batch_import {
     my %svc_x = ();
     my %bill_location = ();
     my %ship_location = ();
+    my $cust_payby = '';
     foreach my $field ( @fields ) {
 
       if ( $field =~ /^cust_pkg\.(pkgpart|setup|bill|susp|adjourn|expire|cancel)$/ ) {
@@ -420,18 +413,33 @@ sub batch_import {
 
       if ( $cust_main{'payinfo'} =~ /^\s*(\d+\@[\d\.]+)\s*$/ ) {
 
-        $cust_main{'payby'}   = 'CHEK';
-        $cust_main{'payinfo'} = $1;
+        delete $cust_main{'payinfo'};
 
-      } else {
+        $cust_payby = new FS::cust_payby {
+          'payby'   => 'CHEK',
+          'payinfo' => $1,
+        };
+
+      } elsif ($cust_main{'payinfo'} =~ /^\s*([AD]?)(.*)\s*$/) {
 
-        $cust_main{'payby'} = 'CARD';
+        delete $cust_main{'payinfo'};
 
-        if ($cust_main{'payinfo'} =~ /^\s*([AD]?)(.*)\s*$/) {
-          $cust_main{'payby'} = 'DCRD' if $1 eq 'D';
-          $cust_main{'payinfo'} = $2;
+        ## validate credit card if requested
+        if ($validate_cc) {
+          validate($2)
+            or return "Invalid card($2) for customer ".$cust_main{'first'}." ".$cust_main{'last'};
+          return "Unknown card type for customer ".$cust_main{'first'}." ".$cust_main{'last'}
+            if cardtype($2) eq "Unknown";
         }
 
+        $cust_payby = new FS::cust_payby {
+          'payby'   => ($1 eq 'D') ? 'DCRD' : 'CARD',
+          'payinfo' => $2,
+          'paycvv'  => delete $cust_main{'paycvv'},
+          'paydate' => delete $cust_main{'paydate'},
+          'payname' => $cust_main{'first'}. ' '. $cust_main{'last'},
+        };
+
       }
 
     }
@@ -513,7 +521,10 @@ sub batch_import {
       $hash{$cust_pkg} = \@svc_x;
     }
 
-    my $error = $cust_main->insert( \%hash, $invoicing_list );
+    my %options = ('invoicing_list' => $invoicing_list);
+    $options{'cust_payby'} = [ $cust_payby ] if $cust_payby;
+
+    my $error = $cust_main->insert( \%hash, %options );
 
     if ( $error ) {
       $dbh->rollback if $oldAutoCommit;