import torrus 1.0.9
[freeside.git] / FS / FS / cust_main / Import.pm
index 4f377b9..7f5a3f0 100644 (file)
@@ -5,13 +5,15 @@ use vars qw( $DEBUG $conf );
 use Storable qw(thaw);
 use Data::Dumper;
 use MIME::Base64;
-use Date::Parse;
 use File::Slurp qw( slurp );
+use FS::Misc::DateTime qw( parse_datetime );
 use FS::UID qw( dbh );
+use FS::Record qw( qsearchs );
 use FS::cust_main;
 use FS::svc_acct;
 use FS::svc_external;
 use FS::svc_phone;
+use FS::part_referral;
 
 $DEBUG = 0;
 
@@ -32,7 +34,8 @@ FS::cust_main::Import - Batch customer importing
     file      => $file,      #filename
     type      => $type,      #csv or xls
     format    => $format,    #extended, extended-plus_company, svc_external,
-                             # or svc_external_svc_phone
+                             #extended-plus_company_and_options
+                             #extended-plus_options, or svc_external_svc_phone
     agentnum  => $agentnum,
     refnum    => $refnum,
     pkgpart   => $pkgpart,
@@ -142,6 +145,19 @@ sub batch_import {
                   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
+                  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
+                  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
@@ -154,6 +170,19 @@ sub batch_import {
                   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
+                  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
+                  svc_acct.username svc_acct._password 
+                  customer_options
+                );
+    $payby = 'BILL';
  } elsif ( $format =~ /^svc_external/ ) {
     @fields = qw( agent_custid refnum
                   last first company address1 address2 city state zip country
@@ -190,7 +219,7 @@ sub batch_import {
     eval "use Spreadsheet::ParseExcel;";
     die $@ if $@;
 
-    my $excel = new Spreadsheet::ParseExcel::Workbook->Parse($filename);
+    my $excel = Spreadsheet::ParseExcel::Workbook->new->Parse($filename);
     $parser = $excel->{Worksheet}[0]; #first sheet
 
     $count = $parser->{MaxRow} || $parser->{MinRow};
@@ -212,6 +241,10 @@ sub batch_import {
   my $oldAutoCommit = $FS::UID::AutoCommit;
   local $FS::UID::AutoCommit = 0;
   my $dbh = dbh;
+
+  #implies ignore_expired_card
+  local($FS::cust_main::import) = 1;
+  local($FS::cust_main::import) = 1;
   
   my $line;
   my $row = 0;
@@ -232,7 +265,8 @@ sub batch_import {
 
     } elsif ( $type eq 'xls' ) {
 
-      last if $row > ($parser->{MaxRow} || $parser->{MinRow});
+      last if $row > ($parser->{MaxRow} || $parser->{MinRow})
+           || ! $parser->{Cells}[$row];
 
       my @row = @{ $parser->{Cells}[$row] };
       @columns = map $_->{Val}, @row;
@@ -261,13 +295,13 @@ sub batch_import {
 
       if ( $field =~ /^cust_pkg\.(pkgpart|setup|bill|susp|adjourn|expire|cancel)$/ ) {
 
-        #$cust_pkg{$1} = str2time( shift @$columns );
+        #$cust_pkg{$1} = parse_datetime( shift @$columns );
         if ( $1 eq 'pkgpart' ) {
           $cust_pkg{$1} = shift @columns;
         } elsif ( $1 eq 'setup' ) {
-          $billtime = str2time(shift @columns);
+          $billtime = parse_datetime(shift @columns);
         } else {
-          $cust_pkg{$1} = str2time( shift @columns );
+          $cust_pkg{$1} = parse_datetime( shift @columns );
         } 
 
       } elsif ( $field =~ /^svc_acct\.(username|_password)$/ ) {
@@ -311,20 +345,34 @@ sub batch_import {
       }
     }
 
-    $cust_main{'payby'} = 'CARD'
-      if defined $cust_main{'payinfo'}
-      && length  $cust_main{'payinfo'};
+    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;
+      }
+    }
 
     my $invoicing_list = $cust_main{'invoicing_list'}
                            ? [ delete $cust_main{'invoicing_list'} ]
                            : [];
 
+    my $customer_options = delete $cust_main{customer_options};
+    $cust_main{tax} = 'Y' if $customer_options =~ /taxexempt/i;
+    push @$invoicing_list, 'POST' if $customer_options =~ /postalinvoice/i;
+
     my $cust_main = new FS::cust_main ( \%cust_main );
 
     use Tie::RefHash;
     tie my %hash, 'Tie::RefHash'; #this part is important
 
     if ( $cust_pkg{'pkgpart'} ) {
+
+      unless ( $cust_pkg{'pkgpart'} =~ /^\d+$/ ) {
+        $dbh->rollback if $oldAutoCommit;
+        return 'illegal pkgpart: '. $cust_pkg{'pkgpart'};
+      }
+
       my $cust_pkg = new FS::cust_pkg ( \%cust_pkg );
 
       my @svc_x = ();
@@ -355,7 +403,6 @@ sub batch_import {
           push @svc_x, $class->new( \%svc_x );
         }
         if ( $svc_phone ) {
-          warn $part_pkg->svcpart_unique_svcdb('svc_phone');
           $svc_phone->svcpart( $part_pkg->svcpart_unique_svcdb('svc_phone') );
           push @svc_x, $svc_phone;
         }