recurring indicator for Paymentech batches, #19571
[freeside.git] / FS / FS / pay_batch / paymentech.pm
index 89f0c77..133f8f1 100644 (file)
@@ -2,6 +2,7 @@ package FS::pay_batch::paymentech;
 
 use strict;
 use vars qw(@ISA %import_info %export_info $name);
+use FS::Record 'qsearchs';
 use Time::Local;
 use Date::Format 'time2str';
 use Date::Parse 'str2time';
@@ -9,9 +10,11 @@ use Tie::IxHash;
 use FS::Conf;
 
 my $conf;
-my ($bin, $merchantID, $terminalID, $username);
+my ($bin, $merchantID, $terminalID, $username, $password, $with_recurringInd);
 $name = 'paymentech';
 
+my $gateway;
+
 %import_info = (
   filetype    => 'XML',
   xmlrow         => [ qw(transResponse newOrderResp) ],
@@ -19,18 +22,42 @@ $name = 'paymentech';
     'paybatchnum',
     '_date',
     'approvalStatus',
+    'order_number',
+    'authorization',
     ],
   xmlkeys     => [
     'orderID',
     'respDateTime',
     'approvalStatus',
+    'txRefNum',
+    'authorizationCode',
     ],
   'hook'        => sub {
+      if ( !$gateway ) {
+        # find a gateway configuration that has the same merchantID 
+        # as the batch config, if there is one.  If not, leave 
+        # gateway out entirely.
+        my $merchant = (FS::Conf->new->config('batchconfig-paymentech'))[2];
+        my $g = qsearchs({
+              'table'     => 'payment_gateway',
+              'addl_from' => ' JOIN payment_gateway_option USING (gatewaynum) ',
+              'hashref'   => {  disabled    => '',
+                                optionname  => 'merchant_id',
+                                optionvalue => $merchant,
+                              },
+              });
+        $gateway = ($g ? $g->gatewaynum . '-' : '') . 'PaymenTech';
+      }
       my ($hash, $oldhash) = @_;
       my ($mon, $day, $year, $hour, $min, $sec) = 
         $hash->{'_date'} =~ /^(..)(..)(....)(..)(..)(..)$/;
       $hash->{'_date'} = timelocal($sec, $min, $hour, $day, $mon-1, $year);
       $hash->{'paid'} = $oldhash->{'amount'};
+      $hash->{'paybatch'} = join(':', 
+        $gateway,
+        $hash->{'authorization'},
+        $hash->{'order_number'},
+      );
     },
   'approved'    => sub { my $hash = shift;
                             $hash->{'approvalStatus'} 
@@ -53,7 +80,7 @@ my %paytype = (
     eval "use XML::Writer";
     die $@ if $@;
     my $conf = shift;
-    ($bin, $terminalID, $merchantID, $username) =
+    ($bin, $terminalID, $merchantID, $username, $password, $with_recurringInd) =
        $conf->config('batchconfig-paymentech');
     },
 # Here we do all the work in the header function.
@@ -72,6 +99,7 @@ my %paytype = (
 
     foreach (@cust_pay_batch) {
       $xml->startTag('newOrder', BatchRequestNo => $count++);
+      my $status = $_->cust_main->status;
       tie my %order, 'Tie::IxHash', (
         industryType => 'EC',
         transType    => 'AC',
@@ -80,7 +108,7 @@ my %paytype = (
         terminalID   => $terminalID,
         ($_->payby eq 'CARD') ? (
           ccAccountNum => $_->payinfo,
-          ccExp        => time2str('%m%y', str2time($_->exp))
+          ccExp        => $_->expmmyy,
         ) : (
           ecpCheckRT      => ($_->payinfo =~ /@(\d+)/),
           ecpCheckDDA     => ($_->payinfo =~ /(\d+)@/),
@@ -97,6 +125,13 @@ my %paytype = (
         orderID        => $_->paybatchnum,
         amount         => $_->amount * 100,
         );
+      # only do this if recurringInd is enabled in config, 
+      # and the customer has at least one non-canceled recurring package
+      if ( $with_recurringInd and $status =~ /^active|suspended|ordered$/ ) {
+        # then send RF if this is the first payment on this payinfo,
+        # RS otherwise.
+        $order{'recurringInd'} = $_->payinfo_used ? 'RS' : 'RF';
+      }
       foreach my $key (keys %order) {
         $xml->dataElement($key, $order{$key})
       }
@@ -113,5 +148,18 @@ my %paytype = (
   row => sub {},
 );
 
+# Including this means that there is a Business::BatchPayment module for
+# this gateway and we want to upgrade it.
+# Must return the name of the module, followed by a hash of options.
+
+sub _upgrade_gateway {
+  my $conf = FS::Conf->new;
+  my @batchconfig = $conf->config('batchconfig-paymentech');
+  my %options;
+  @options{ qw(bin terminalID merchantID login password ) } = @batchconfig;
+  $options{'industryType'} = 'EC';
+  ( 'Paymentech', %options );
+}
+
 1;