From 4918b795f15330720ac379fde8d99855ece06c17 Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Sun, 20 Jan 2013 01:38:28 -0800 Subject: [PATCH] NACHA batching, RT#20443 --- FS/FS/Conf.pm | 8 +++---- FS/FS/Schema.pm | 8 +++---- FS/FS/pay_batch/nacha.pm | 28 ++++++++++++++++++---- httemplate/search/elements/cust_pay_batch_top.html | 1 + 4 files changed, 33 insertions(+), 12 deletions(-) diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index 736fe141a..c14600b21 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -3533,7 +3533,7 @@ and customer address. Include units.', 'section' => 'billing', 'description' => 'Default format for batches.', 'type' => 'select', - 'select_enum' => [ 'csv-td_canada_trust-merchant_pc_batch', + 'select_enum' => [ 'NACHA', 'csv-td_canada_trust-merchant_pc_batch', 'csv-chase_canada-E-xactBatch', 'BoM', 'PAP', 'paymentech', 'ach-spiritone', 'RBC' ] @@ -3595,9 +3595,9 @@ and customer address. Include units.', 'section' => 'billing', 'description' => 'Fixed (unchangeable) format for electronic check batches.', 'type' => 'select', - 'select_enum' => [ 'csv-td_canada_trust-merchant_pc_batch', 'BoM', 'PAP', - 'paymentech', 'ach-spiritone', 'RBC', 'td_eft1464', - 'eft_canada' + 'select_enum' => [ 'NACHA', 'csv-td_canada_trust-merchant_pc_batch', 'BoM', + 'PAP', 'paymentech', 'ach-spiritone', 'RBC', + 'td_eft1464', 'eft_canada' ] }, diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index 6fb84d970..70928a801 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -1688,13 +1688,13 @@ sub tables_hashref { 'zip', 'varchar', 'NULL', 10, '', '', 'country', 'char', '', 2, '', '', # 'trancode', 'int', '', '', '', '' - 'payby', 'char', '', 4, '', '', # CARD/BILL/COMP, should be - 'payinfo', 'varchar', '', 512, '', '', + 'payby', 'char', '', 4, '', '', + 'payinfo', 'varchar', 'NULL', 512, '', '', #'exp', @date_type, '', '' - 'exp', 'varchar', 'NULL', 11, '', '', + 'exp', 'varchar', 'NULL', 11, '', '', 'payname', 'varchar', 'NULL', $char_d, '', '', 'amount', @money_type, '', '', - 'status', 'varchar', 'NULL', $char_d, '', '', + 'status', 'varchar', 'NULL', $char_d, '', '', ], 'primary_key' => 'paybatchnum', 'unique' => [], diff --git a/FS/FS/pay_batch/nacha.pm b/FS/FS/pay_batch/nacha.pm index 999cd9eb9..17c175daf 100644 --- a/FS/FS/pay_batch/nacha.pm +++ b/FS/FS/pay_batch/nacha.pm @@ -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 diff --git a/httemplate/search/elements/cust_pay_batch_top.html b/httemplate/search/elements/cust_pay_batch_top.html index 1dcc37ac1..bf3047769 100644 --- a/httemplate/search/elements/cust_pay_batch_top.html +++ b/httemplate/search/elements/cust_pay_batch_top.html @@ -120,6 +120,7 @@ my $fixed = $conf->config("batch-fixed_format-$payby"); tie my %download_formats, 'Tie::IxHash', ( '' => 'Default batch mode', +'NACHA' => '94 byte NACHA', 'csv-td_canada_trust-merchant_pc_batch' => 'CSV file for TD Canada Trust Merchant PC Batch', 'csv-chase_canada-E-xactBatch' => -- 2.11.0