communigate provisioning phase 2: add svc_domain.trailer -> communigate TrailerText...
[freeside.git] / FS / FS / pay_batch.pm
index 83bf7a3..6a27554 100644 (file)
@@ -196,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'};
@@ -256,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 {
@@ -269,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;
@@ -288,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;
@@ -304,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 ) {
@@ -388,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')
@@ -397,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;
@@ -435,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;
@@ -453,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'};
@@ -465,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;