fix paymentech batch download, RT#7905
[freeside.git] / FS / FS / pay_batch.pm
index 5ccad5b..90b4eb8 100644 (file)
@@ -231,17 +231,12 @@ sub import_results {
 
   my $reself = $self->select_for_update;
 
-  unless ( $reself->status eq 'I' ) {
+  if ( $reself->status ne 'I' 
+      and !$conf->exists('batch-manual_approval') ) {
     $dbh->rollback if $oldAutoCommit;
     return "batchnum ". $self->batchnum. "no longer in transit";
   }
 
-  my $error = $self->set_status('R');
-  if ( $error ) {
-    $dbh->rollback if $oldAutoCommit;
-    return $error;
-  }
-
   my $total = 0;
   my $line;
 
@@ -388,15 +383,22 @@ sub import_results {
 
   } # foreach (@all_values)
 
+  my $close = 1;
   if ( defined($close_condition) ) {
     # Allow the module to decide whether to close the batch.
     # $close_condition can also die() to abort the whole import.
-    my $close = eval { $close_condition->($self) };
+    $close = eval { $close_condition->($self) };
     if ( $@ ) {
       $dbh->rollback;
       die $@;
     }
-    $self->set_status('I') if !$close;
+  }
+  if ( $close ) {
+    my $error = $self->set_status('R');
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
   }
 
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
@@ -475,18 +477,11 @@ sub export_batch {
     }
   }
 
-  my $delim = exists($info->{'delimiter'}) ? $info->{'delimiter'} : "\n";
+  if ($first_download) { #remove or reduce entries if customer's balance changed
 
-  my $h = $info->{'header'};
-  if(ref($h) eq 'CODE') {
-    $batch .= &$h($self, \@cust_pay_batch) . $delim;
-  }
-  else {
-    $batch .= $h . $delim;
-  }
-  foreach my $cust_pay_batch (@cust_pay_batch) {
+    my @new = ();
+    foreach my $cust_pay_batch (@cust_pay_batch) {
 
-    if ($first_download) {
       my $balance = $cust_pay_batch->cust_main->balance;
       if ($balance <= 0) { # then don't charge this customer
         my $error = $cust_pay_batch->delete;
@@ -505,20 +500,35 @@ sub export_batch {
         }
       }
       # else $balance >= $cust_pay_batch->amount
+
+      push @new, $cust_pay_batch;
     }
+    @cust_pay_batch = @new;
 
+  }
+
+  my $delim = exists($info->{'delimiter'}) ? $info->{'delimiter'} : "\n";
+
+  my $h = $info->{'header'};
+  if (ref($h) eq 'CODE') {
+    $batch .= &$h($self, \@cust_pay_batch). $delim;
+  } else {
+    $batch .= $h. $delim;
+  }
+
+  foreach my $cust_pay_batch (@cust_pay_batch) {
     $batchcount++;
     $batchtotal += $cust_pay_batch->amount;
-    $batch .= &{$info->{'row'}}($cust_pay_batch, $self, $batchcount, $batchtotal) . $delim;
-
+    $batch .=
+      &{$info->{'row'}}($cust_pay_batch, $self, $batchcount, $batchtotal).
+      $delim;
   }
 
   my $f = $info->{'footer'};
-  if(ref($f) eq 'CODE') {
-    $batch .= &$f($self, $batchcount, $batchtotal) . $delim;
-  }
-  else {
-    $batch .= $f . $delim;
+  if (ref($f) eq 'CODE') {
+    $batch .= &$f($self, $batchcount, $batchtotal). $delim;
+  } else {
+    $batch .= $f. $delim;
   }
 
   if ($info->{'autopost'}) {
@@ -538,6 +548,7 @@ sub manual_approve {
   my $date = time;
   my %opt = @_;
   my $paybatch = $opt{'paybatch'} || $self->batchnum;
+  my $usernum = $opt{'usernum'} || die "manual approval requires a usernum";
   my $conf = FS::Conf->new;
   return 'manual batch approval disabled' 
     if ( ! $conf->exists('batch-manual_approval') );
@@ -562,8 +573,9 @@ sub manual_approve {
   ) {
     my $new_cust_pay_batch = new FS::cust_pay_batch { 
       $cust_pay_batch->hash,
-      'paid'  => $cust_pay_batch->amount,
-      '_date' => $date,
+      'paid'    => $cust_pay_batch->amount,
+      '_date'   => $date,
+      'usernum' => $usernum,
     };
     my $error = $new_cust_pay_batch->approve($paybatch);
     if ( $error ) {
@@ -572,9 +584,7 @@ sub manual_approve {
     }
     $payments++;
   }
-  return 'no unresolved payments in batch' if $payments == 0;
   $self->set_status('R');
-  
   $dbh->commit;
   return;
 }