work around missing id, RT#83146
[freeside.git] / FS / bin / freeside-paymentech-upload
index 5ae147d..283781d 100755 (executable)
@@ -41,7 +41,17 @@ my @batches;
 if($opt_a) {
   my %criteria = (status => 'O');
   $criteria{'payby'} = uc($opt_p) if $opt_p;
-  @batches = qsearch('pay_batch', \%criteria);
+
+  my $extra_sql;
+  $extra_sql = " AND ((payby = 'CHEK' AND type != 'CREDIT') OR (payby != 'CHEK'))" unless FS::pay_batch->can_handle_electronic_refunds('paymentech');
+
+  my %hash = (
+    table => 'pay_batch',
+    hashref   => \%criteria,
+    extra_sql => $extra_sql,
+  );
+
+  @batches = qsearch(\%hash);
   log_and_die("No open batches found".($opt_p ? " of type '$opt_p'" : '').".\n")
     if !@batches;
 }
@@ -50,6 +60,12 @@ else {
   log_and_die("batchnum not passed\n".&usage) if !$batchnum;
   @batches = qsearchs('pay_batch', { batchnum => $batchnum } );
   log_and_die("Can't find payment batch '$batchnum'\n") if !@batches;
+
+  if ($batches[0]->type eq "CREDIT") {
+    warn "running credit\n";
+    log_and_die( "Batch number $batchnum is a credit (batch refund) batch, and this format can not handle batch refunds.\n" )
+      unless FS::pay_batch->can_handle_electronic_refunds('paymentech');
+  }
 }
 
 my $conf = new FS::Conf;
@@ -68,6 +84,10 @@ foreach my $pay_batch (@batches) {
   my $filename = sprintf('%06d',$batchnum) . '-' .time2str('%Y%m%d%H%M%S', time);
   print STDERR "Exporting batch $batchnum to $filename...\n" if $opt_v;
   my $text = $pay_batch->export_batch(format => 'paymentech');
+  unless ($text) {
+    print STDERR "Batch is empty, resolving..." if $opt_v;
+    next;
+  }
   $text =~ s!<fileID>FILEID</fileID>!<fileID>$filename</fileID>! 
     or log_and_die("couldn't find FILEID tag\n");
   open OUT, ">$tmpdir/$filename.xml";
@@ -80,6 +100,7 @@ foreach my $pay_batch (@batches) {
   log_and_die("failed to create zip file\n") if (! -f "$tmpdir/$filename.zip" );
   push @filenames, $filename;
 }
+log_and_die("All batches empty\n") if !@filenames;
 
 my $host = ($opt_t ? 'orbitalbatchvar.paymentech.net'
                    : 'orbitalbatch.paymentech.net');
@@ -92,7 +113,7 @@ while ($ssh_retry > 0) {
   $sftp = Net::SFTP::Foreign->new( host => $host,
                                    user => $username,
                                    password => $password,
-                                   timeout => 30,
+                                   timeout => 300,
                                  );
   last unless $sftp->error;
   $ssh_retry -= 1;
@@ -121,7 +142,7 @@ freeside-paymentech-upload - Transmit a payment batch to Chase Paymentech via SF
 
 Command line tool to upload a payment batch to the Chase Paymentech gateway.
 The batch will be exported to the Paymentech XML format, packaged in a ZIP 
-file, and transmitted via SFTP.  Use L<paymentech-download> to retrieve the 
+file, and transmitted via SFTP.  Use L<freeside-paymentech-download> to retrieve the
 response file.
 
 -a: Send all open batches, instead of specifying a batchnum.