NACHA batching, RT#20443
[freeside.git] / FS / FS / pay_batch / nacha.pm
index 999cd9e..17c175d 100644 (file)
@@ -1,13 +1,15 @@
 package FS::pay_batch::nacha;
 
 use strict;
-use vars qw( %import_info %export_info $name $conf );
+use vars qw( %import_info %export_info $name $conf $entry_hash $DEBUG );
 use Date::Format;
 #use Time::Local 'timelocal';
 #use FS::Conf;
 
 $name = 'NACHA';
 
+$DEBUG = 1;
+
 %import_info = (
   #XXX stub finish me
   'filetype' => 'CSV',
@@ -57,6 +59,10 @@ $name = 'NACHA';
     #though they would probably want them numbered per company
     my $batchnum = substr( ('0'x7). $pay_batch->batchnum, -7);
 
+    $entry_hash = 0;
+
+    warn "building File & Batch Header Records\n" if $DEBUG;
+
     ##
     # File Header Record
     ##
@@ -113,19 +119,28 @@ $name = 'NACHA';
 
     my ($account, $aba) = split('@', $cust_pay_batch->payinfo);
 
+    # "Total of all positions 4-11 on each 6 record"
+    $entry_hash += substr($aba,0,8); 
+
     my $cust_main = $cust_pay_batch->cust_main;
     my $cust_identifier = substr($cust_main->display_custnum. (' 'x15), 0, 15);
 
+    #XXX paytype should actually be in the batch, but this will do for now
+    #27 checking debit, 37 savings debit
+    my $transaction_code = ( $cust_main->paytype =~ /savings/i ? '37' : '27' );
+
     my $cust_name = substr($cust_main->name. (' 'x22), 0, 22);
 
     #non-PPD transactions?  future
 
+    warn "building PPD Record\n" if $DEBUG;
+
     ###
     # PPD Entry Detail Record
     ###
 
     '6'.                              #Record Type Code
-    '27'.                             #27 checking debit, 37 savings debit XXX
+    $transaction_code.                #Transaction Code
     $aba.                             #Receiving DFI Identification, check digit
     substr($account.(' 'x17), 0, 17). #DFI Account number (Left justify)
     sprintf('%010d', $cust_pay_batch->amount * 100). #Amount
@@ -140,6 +155,9 @@ $name = 'NACHA';
   'footer' => sub {
     my( $pay_batch, $batchcount, $batchtotal ) = @_;
 
+    #Only use the final 10 positions in the entry
+    $entry_hash = substr( '00'.$entry_hash, -10); 
+
     $conf->config('batchconfig-nacha-destination') =~ /^\s*(\d{9})\s*$/
       or die 'illegal NACHA Destination';
     my $dest = $1;
@@ -150,6 +168,8 @@ $name = 'NACHA';
 
     my $batchnum = substr( ('0'x7). $pay_batch->batchnum, -7);
 
+    warn "building Batch and File Control Records\n" if $DEBUG;
+
     ###
     # Batch Control Record
     ###
@@ -158,7 +178,7 @@ $name = 'NACHA';
     '225'.                        #Service Class Code (220 credits only,
                                   #                    200 mixed debits&credits)
     sprintf('%06d', $batchcount). #Entry / Addenda Count
-    '1234567890'. #XXX "Entry Hash" Total of all positions 4-11 on each 6 record.  Only use the final 10 positions in the entry
+    $entry_hash.
     sprintf('%012d', $batchtotal * 100). #Debit total
     '000000000000'.               #Credit total
     $origin.                      #Company Identification (Immediate Origin)
@@ -175,7 +195,7 @@ $name = 'NACHA';
     '000001'.                            #Batch Counter (# of batch header recs)
     sprintf('%06d', $batchcount + 4).    #num of physical blocks on the file..?
     sprintf('%08d', $batchcount).        #total # of entry detail and addenda
-    '1234567890'. #XXX "Entry Hash" Total of all positions 4-11 on each 6 record.  Only use the final 10 positions in the entry
+    $entry_hash.
     sprintf('%012d', $batchtotal * 100). #Debit total
     '000000000000'.                      #Credit total
     ( ' 'x39 )                           #Reserved / blank