document fields
[freeside.git] / FS / FS / pay_batch.pm
index 31bca2b..1c0a28a 100644 (file)
@@ -14,6 +14,7 @@ use Scalar::Util 'blessed';
 use IO::Scalar;
 use FS::Misc qw(send_email); # for error notification
 use List::Util qw(sum);
+use Try::Tiny;
 
 @ISA = qw(FS::Record);
 
@@ -236,6 +237,8 @@ I<format> - an L<FS::pay_batch> module
 I<gateway> - an L<FS::payment_gateway> object for a batch gateway.  This 
 takes precedence over I<format>.
 
+I<no_close> - do not try to close batches
+
 Supported format keys (defined in the specified FS::pay_batch module) are:
 
 I<filetype> - required, can be CSV, fixed, variable, XML
@@ -470,26 +473,28 @@ sub import_results {
   } # foreach (@all_values)
 
   # decide whether to close batches that had payments posted
-  foreach my $batchnum (keys %target_batches) {
-    my $pay_batch = FS::pay_batch->by_key($batchnum);
-    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.
-      $close = eval { $close_condition->($pay_batch) };
-      if ( $@ ) {
-        $dbh->rollback;
-        die $@;
+  if ( !$param->{no_close} ) {
+    foreach my $batchnum (keys %target_batches) {
+      my $pay_batch = FS::pay_batch->by_key($batchnum);
+      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.
+        $close = eval { $close_condition->($pay_batch) };
+        if ( $@ ) {
+          $dbh->rollback;
+          die $@;
+        }
       }
-    }
-    if ( $close ) {
-      my $error = $pay_batch->set_status('R');
-      if ( $error ) {
-        $dbh->rollback if $oldAutoCommit;
-        return $error;
+      if ( $close ) {
+        my $error = $pay_batch->set_status('R');
+        if ( $error ) {
+          $dbh->rollback if $oldAutoCommit;
+          return $error;
+        }
       }
-    }
-  }
+    } # foreach $batchnum
+  } # if (!$param->{no_close})
 
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
   '';
@@ -1076,16 +1081,21 @@ sub export_to_gateway {
   my $processor = $gateway->batch_processor(%proc_opt);
 
   my @items = map { $_->request_item } $self->cust_pay_batch;
-  my $batch = Business::BatchPayment->create(Batch =>
-    batch_id  => $self->batchnum,
-    items     => \@items
-  );
-  $processor->submit($batch);
+  try {
+    my $batch = Business::BatchPayment->create(Batch =>
+      batch_id  => $self->batchnum,
+      items     => \@items
+    );
+    $processor->submit($batch);
 
-  if ($batch->processor_id) {
-    $self->set('processor_id',$batch->processor_id);
-    $self->replace;
-  }
+    if ($batch->processor_id) {
+      $self->set('processor_id',$batch->processor_id);
+      $self->replace;
+    }
+  } catch {
+    $dbh->rollback if $oldAutoCommit;
+    die $_;
+  };
 
   $dbh->commit or die $dbh->errstr if $oldAutoCommit;
   '';