RT# 74789 - updated format to handle credits in seperated batch files
[freeside.git] / FS / FS / pay_batch / td_eft1464.pm
index 416e28d..e16b0ee 100644 (file)
@@ -48,6 +48,7 @@ my $i;
 
 $name = 'td_eft1464';
 # TD Bank EFT 1464 Byte format
+# https://www.payments.ca/sites/default/files/standard-005.pdf
 
 %import_info = ( filetype => 'NONE' ); 
 # just to suppress warning; importing this format is a fatal error
@@ -65,11 +66,11 @@ $name = 'td_eft1464';
       'retacct',
       'cpacode',
     } = $conf->config("batchconfig-td_eft1464");
-    $opt{'origid'} = sprintf('%-10s', $opt{'origid'});
-    $opt{'shortname'} = sprintf('%-15s', $opt{'shortname'});
-    $opt{'longname'} = sprintf('%-30s', $opt{'longname'});
-    $opt{'retbranch'} = '0004'.sprintf('%5s',$opt{'retbranch'});
-    $opt{'retacct'} = sprintf('%-11s', $opt{'retacct'}). ' ';
+    $opt{'origid'} = sprintf('%-10.10s', $opt{'origid'});
+    $opt{'shortname'} = sprintf('%-15.15s', $opt{'shortname'});
+    $opt{'longname'} = sprintf('%-30.30s', $opt{'longname'});
+    $opt{'retbranch'} = '0004'.sprintf('%5.5s',$opt{'retbranch'});
+    $opt{'retacct'} = sprintf('%-11.11s', $opt{'retacct'}). ' ';
     $i = 1;
   },
   header => sub { 
@@ -101,11 +102,19 @@ $name = 'td_eft1464';
   row => sub {
     my ($cust_pay_batch, $pay_batch) = @_;
     my ($account, $aba) = split('@', $cust_pay_batch->payinfo);
+    if ( $aba =~ /^(\d+)\.(\d+)$/ ) {  #branch.route
+      $aba = $2.$1; #routebranch
+    }
     $i++;
     # The 1464 byte format supports up to 5 payments per line,
     # but we're only going to send 1.
+
+    ## set to D for debit by default, then override to what cust_pay_batch has as payments may not have paycode.
+    my $debitorcredit = 'D';
+    $debitorcredit = $cust_pay_batch->paycode unless !$cust_pay_batch->paycode;
+
     my $control = join('',
-      'D',                  # for 'debit'
+      $debitorcredit,       # D for 'debit' or C for Credit
       sprintf("%09u", $i),  #record number
       $opt{'origid'},
       $opt{'fcn'},
@@ -115,17 +124,17 @@ $name = 'td_eft1464';
       sprintf('%010.0f', $cust_pay_batch->amount*100),
       $opt{'due'}, #due date...? XXX
       sprintf('%09u', $aba),
-      sprintf('%-12s', $account),
+      sprintf('%-12.12s', $account),
       '0' x 22,
       '0' x 3,
       $opt{'shortname'},
-      sprintf('%-30s', 
+      sprintf('%-30.30s', 
         join(' ',
           $cust_pay_batch->first, $cust_pay_batch->last)
       ),
       $opt{'longname'},
       $opt{'origid'},
-      sprintf('%-19s', $cust_pay_batch->paybatchnum), # originator reference num
+      sprintf('%-19.19s', $cust_pay_batch->paybatchnum), # originator reference num
       $opt{'retbranch'},
       $opt{'retacct'}, 
       ' ' x 15,
@@ -137,19 +146,37 @@ $name = 'td_eft1464';
   },
   footer => sub {
     my ($pay_batch, $batchcount, $batchtotal) = @_;
+    my $totaldebittxns = $pay_batch->type eq "DEBIT" ? $batchtotal*100 : 0;
+    my $countdebittxns = $pay_batch->type eq "DEBIT" ? $batchcount : 0;
+    my $totalcredittxns = $pay_batch->type eq "CREDIT" ? $batchtotal*100 : 0;
+    my $countcredittxns = $pay_batch->type eq "CREDIT" ? $batchcount : 0;
     join('',
       'Z',
       sprintf('%09u', $batchcount + 2),
       $opt{'origid'}, 
       $opt{'fcn'},
-      sprintf('%014.0f', $batchtotal*100), # total of debit txns
-      sprintf('%08u', $batchcount), # number of debit txns
-      '0' x 14, # total of credit txns
-      '0' x 8, # total of credit txns
+      sprintf('%014.0f', $totaldebittxns), # total of debit txns
+      sprintf('%08u', $countdebittxns), # number of debit txns
+      sprintf('%014.0f', $totalcredittxns), # total of debit txns
+      sprintf('%08u', $countcredittxns), # number of debit txns
       ' ' x 1396,
     )
   },
 );
 
+## this format can handle credit transactions
+sub can_handle_credits {
+  1;
+}
+
+sub _upgrade_gateway {
+  my $conf = FS::Conf->new;
+  my @batchconfig = $conf->config('batchconfig-td_eft1464');
+  my %options;
+  @options{ qw(originator datacentre short_name long_name return_branch 
+               return_account cpa_code) } = @batchconfig;
+  ( 'TD_EFT', %options );
+}
+
 1;