communigate provisioning phase 2: add svc_domain.trailer -> communigate TrailerText...
[freeside.git] / FS / FS / pay_batch.pm
index ffa6e20..6a27554 100644 (file)
@@ -4,7 +4,6 @@ use strict;
 use vars qw( @ISA $DEBUG %import_info %export_info $conf );
 use Time::Local;
 use Text::CSV_XS;
-use XML::Simple qw(XMLin XMLout);
 use FS::Record qw( dbh qsearch qsearchs );
 use FS::cust_pay;
 use FS::Conf;
@@ -197,12 +196,13 @@ sub import_results {
     or die "unknown format $format";
 
   my $filetype            = $info->{'filetype'};      # CSV or fixed
-  my @fields              = @{ $info->{'fields'} };
+  my @fields              = @{ $info->{'fields'}};
   my $formatre            = $info->{'formatre'};      # for fixed
   my @all_values;
   my $begin_condition     = $info->{'begin_condition'};
   my $end_condition       = $info->{'end_condition'};
   my $end_hook            = $info->{'end_hook'};
+  my $skip_condition      = $info->{'skip_condition'};
   my $hook                = $info->{'hook'};
   my $approved_condition  = $info->{'approved'};
   my $declined_condition  = $info->{'declined'};
@@ -241,11 +241,13 @@ sub import_results {
   # process one line at a time.
 
   if ($filetype eq 'XML') {
+    eval "use XML::Simple";
+    die $@ if $@;
     my @xmlkeys = @{ $info->{'xmlkeys'} };  # for XML
     my $xmlrow  = $info->{'xmlrow'};        # also for XML
 
     # Do everything differently.
-    my $data = XMLin($fh, KeepRoot => 1);
+    my $data = XML::Simple::XMLin($fh, KeepRoot => 1);
     my $rows = $data;
     # $xmlrow = [ RootKey, FirstLevelKey, SecondLevelKey... ]
     $rows = $rows->{$_} foreach( @$xmlrow );
@@ -255,7 +257,7 @@ sub import_results {
     }
     $rows = [ $rows ] if ref($rows) ne 'ARRAY';
     foreach my $row (@$rows) {
-      push @all_values, [ @{$row}{@xmlkeys} ];
+      push @all_values, [ @{$row}{@xmlkeys}, $row ];
     }
   }
   else {
@@ -268,13 +270,14 @@ sub import_results {
           $dbh->rollback if $oldAutoCommit;
           return "can't parse: ". $csv->error_input();
         };
-        push @all_values, [ $csv->fields() ];
+        push @all_values, [ $csv->fields(), $line ];
       }elsif ($filetype eq 'fixed'){
-        my @values = $line =~ /$formatre/;
+        my @values = ( $line =~ /$formatre/ );
         unless (@values) {
           $dbh->rollback if $oldAutoCommit;
           return "can't parse: ". $line;
         };
+        push @values, $line;
         push @all_values, \@values;
       }else{
         $dbh->rollback if $oldAutoCommit;
@@ -287,15 +290,25 @@ sub import_results {
     my @values = @$_;
 
     my %hash;
+    my $line = pop @values;
     foreach my $field ( @fields ) {
       my $value = shift @values;
       next unless $field;
       $hash{$field} = $value;
     }
 
-    if ( defined($end_condition) and &{$end_condition}(\%hash) ) {
+    if ( defined($begin_condition) ) {
+      if ( &{$begin_condition}(\%hash, $line) ) {
+        undef $begin_condition;
+      }
+      else {
+        next;
+      }
+    }
+
+    if ( defined($end_condition) and &{$end_condition}(\%hash, $line) ) {
       my $error;
-      $error = &{$end_hook}(\%hash, $total) if defined($end_hook);
+      $error = &{$end_hook}(\%hash, $total, $line) if defined($end_hook);
       if ( $error ) {
         $dbh->rollback if $oldAutoCommit;
         return $error;
@@ -303,6 +316,10 @@ sub import_results {
       last;
     }
 
+    if ( defined($skip_condition) and &{$skip_condition}(\%hash, $line) ) {
+      next;
+    }
+
     my $cust_pay_batch =
       qsearchs('cust_pay_batch', { 'paybatchnum' => $hash{'paybatchnum'}+0 } );
     unless ( $cust_pay_batch ) {
@@ -387,8 +404,8 @@ sub import_results {
 
 }
 
-sub export_batch {
 # Formerly httemplate/misc/download-batch.cgi
+sub export_batch {
   my $self = shift;
   my $conf = new FS::Conf;
   my $format = shift || $conf->config('batch-default_format')
@@ -396,26 +413,23 @@ sub export_batch {
   my $info = $export_info{$format} or die "Format not found: '$format'\n";
   &{$info->{'init'}}($conf) if exists($info->{'init'});
 
+  my $curuser = $FS::CurrentUser::CurrentUser;
+
   my $oldAutoCommit = $FS::UID::AutoCommit;
   local $FS::UID::AutoCommit = 0;
   my $dbh = dbh;  
 
-  my $error;
-
   my $first_download;
-  if($self->status eq 'O') {
+  my $status = $self->status;
+  if ($status eq 'O') {
     $first_download = 1;
-  }
-  elsif($self->status eq 'I' and
-        $FS::CurrentUser::CurrentUser->access_right('Reprocess batches')) {
+    my $error = $self->set_status('I');
+    die "error updating pay_batch status: $error\n" if $error;
+  } elsif ($status eq 'I' && $curuser->access_right('Reprocess batches')) {
     $first_download = 0;
+  } else {
+    die "No pending batch.\n";
   }
-  else {
-    die "No pending batch.\n"
-  }
-
-  $error = $self->set_status('I');
-  die "error updating pay_batch status: $error\n" if $error;
 
   my $batch = '';
   my $batchtotal = 0;
@@ -434,7 +448,7 @@ sub export_batch {
   foreach my $cust_pay_batch (@cust_pay_batch) {
     if($first_download) {
       my $balance = $cust_pay_batch->cust_main->balance;
-      $error = '';
+      my $error = '';
       if($balance <= 0) { # then don't charge this customer
         $error = $cust_pay_batch->delete;
         undef $cust_pay_batch;
@@ -452,7 +466,7 @@ sub export_batch {
     if($cust_pay_batch) { # that is, it wasn't deleted
       $batchcount++;
       $batchtotal += $cust_pay_batch->amount;
-      $batch .= &{$info->{'row'}}($cust_pay_batch, $self) . "\n";
+      $batch .= &{$info->{'row'}}($cust_pay_batch, $self, $batchcount, $batchtotal) . "\n";
     }
   }
   my $f = $info->{'footer'};
@@ -464,7 +478,7 @@ sub export_batch {
   }
 
   if ($info->{'autopost'}) {
-    $error = &{$info->{'autopost'}}($self, $batch);
+    my $error = &{$info->{'autopost'}}($self, $batch);
     if($error) {
       $dbh->rollback or die $dbh->errstr if $oldAutoCommit;
       die $error;