RT# 82137 - Added ability for processing fee to be pain on seperate invoice.
[freeside.git] / FS / FS / cust_main / Import.pm
index 19c0d52..49d87f2 100644 (file)
@@ -11,10 +11,12 @@ use FS::UID qw( dbh );
 use FS::Record qw( qsearchs );
 use FS::cust_main;
 use FS::svc_acct;
+use FS::svc_broadband;
 use FS::svc_external;
 use FS::svc_phone;
 use FS::svc_hardware;
 use FS::part_referral;
+use Business::CreditCard 0.35;
 
 $DEBUG = 0;
 
@@ -22,6 +24,8 @@ install_callback FS::UID sub {
   $conf = new FS::Conf;
 };
 
+my %is_location = map { $_ => 1 } FS::cust_main::Location->location_fields;
+
 =head1 NAME
 
 FS::cust_main::Import - Batch customer importing
@@ -95,6 +99,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,6 +130,7 @@ 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'};
 
@@ -150,7 +156,7 @@ sub batch_import {
     @fields = qw( agent_custid refnum
                   last first address1 address2 city state zip country
                   daytime night
-                  ship_last ship_first ship_company ship_address1 ship_address2
+                  ship_last ship_first ship_address1 ship_address2
                   ship_city ship_state ship_zip ship_country
                   payinfo paycvv paydate
                   invoicing_list
@@ -184,6 +190,18 @@ sub batch_import {
                   customer_options
                 );
     $payby = 'BILL';
+ } elsif ( $format =~ /^svc_broadband/ ) {
+    @fields = qw( agent_custid refnum
+                  last first company address1 address2 city state zip country
+                  daytime night
+                  ship_last ship_first ship_company ship_address1 ship_address2
+                  ship_city ship_state ship_zip ship_country
+                  payinfo paycvv paydate
+                  invoicing_list
+                  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
@@ -224,7 +242,7 @@ sub batch_import {
                   payinfo paycvv paydate
                   invoicing_list
                   cust_pkg.pkgpart cust_pkg.bill
-                  svc_acct.username svc_acct._password 
+                  svc_acct.username svc_acct._password svc_acct.slipip
                 );
     push @fields, map "svc_phone.$_", qw(countrycode phonenum sip_password pin);
 
@@ -316,13 +334,14 @@ sub batch_import {
       custbatch => $custbatch,
       agentnum  => $agentnum,
       refnum    => $refnum,
-      country   => $conf->config('countrydefault') || 'US',
       payby     => $payby, #default
       paydate   => '12/2037', #default
     );
     my $billtime = time;
     my %cust_pkg = ( pkgpart => $pkgpart );
     my %svc_x = ();
+    my %bill_location = ();
+    my %ship_location = ();
     foreach my $field ( @fields ) {
 
       if ( $field =~ /^cust_pkg\.(pkgpart|setup|bill|susp|adjourn|expire|cancel)$/ ) {
@@ -336,7 +355,11 @@ sub batch_import {
           $cust_pkg{$1} = parse_datetime( shift @columns );
         } 
 
-      } elsif ( $field =~ /^svc_acct\.(username|_password)$/ ) {
+      } elsif ( $field =~ /^svc_acct\.(username|_password|slipip)$/ ) {
+
+        $svc_x{$1} = shift @columns;
+
+      } elsif ( $field =~ /^svc_broadband\.(ip_addr|mac_addr|sectornum)$/ ) {
 
         $svc_x{$1} = shift @columns;
 
@@ -351,6 +374,14 @@ sub batch_import {
 
         $svc_x{$1} = shift @columns;
 
+      } elsif ( $is_location{$field} ) {
+
+        $bill_location{$field} = shift @columns;
+
+      } elsif ( $field =~ /^ship_(.*)$/ and $is_location{$1} ) {
+
+        $ship_location{$1} = shift @columns;
+      
       } else {
 
         #refnum interception
@@ -379,14 +410,45 @@ sub batch_import {
         my $value = shift @columns;
         $cust_main{$field} = $value if length($value);
       }
+    } # foreach my $field
+    # finished importing columns
+
+    $bill_location{'country'} ||= $conf->config('countrydefault') || 'US';
+    $cust_main{'bill_location'} = FS::cust_location->new(\%bill_location);
+    if ( grep $_, values(%ship_location) ) {
+      $ship_location{'country'} ||= $conf->config('countrydefault') || 'US';
+      $cust_main{'ship_location'} = FS::cust_location->new(\%ship_location);
+    } else {
+      $cust_main{'ship_location'} = $cust_main{'bill_location'};
     }
 
     if ( defined $cust_main{'payinfo'} && length $cust_main{'payinfo'} ) {
-      $cust_main{'payby'} = 'CARD';
-      if ($cust_main{'payinfo'} =~ /\s*([AD]?)(.*)\s*$/) {
-        $cust_main{'payby'} = 'DCRD' if $1 eq 'D';
-        $cust_main{'payinfo'} = $2;
+
+      if ( $cust_main{'payinfo'} =~ /^\s*(\d+\@[\d\.]+)\s*$/ ) {
+
+        $cust_main{'payby'}   = 'CHEK';
+        $cust_main{'payinfo'} = $1;
+
+      } else {
+
+        $cust_main{'payby'} = 'CARD';
+
+        if ($cust_main{'payinfo'} =~ /^\s*([AD]?)(.*)\s*$/) {
+
+          ## 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_main{'payby'} = 'DCRD' if $1 eq 'D';
+          $cust_main{'payinfo'} = $2;
+        }
+
       }
+
     }
 
     $cust_main{$_} = parse_datetime($cust_main{$_})
@@ -421,6 +483,8 @@ sub batch_import {
         $svcdb = 'svc_acct';
       } elsif ( $svc_x{'id'} || $svc_x{'title'} ) {
         $svcdb = 'svc_external';
+      } elsif ( $svc_x{ip_addr} || $svc_x{mac_addr} ) {
+        $svcdb = 'svc_broadband';
       }
 
       my $svc_phone = '';