X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fpay_batch%2FRBC.pm;h=1da511a52588530e167020a2978c8fd90d5da286;hb=7c079bd8cb5ccf5381ac0c054438efcd0645ddbf;hp=47fc8d49d907854a5b1e60136e2e036b9537d0af;hpb=e464c7a554142cd4df5dae5c688a70000d7d8a0c;p=freeside.git diff --git a/FS/FS/pay_batch/RBC.pm b/FS/FS/pay_batch/RBC.pm index 47fc8d49d..1da511a52 100644 --- a/FS/FS/pay_batch/RBC.pm +++ b/FS/FS/pay_batch/RBC.pm @@ -3,8 +3,10 @@ package FS::pay_batch::RBC; use strict; use vars qw(@ISA %import_info %export_info $name); use Date::Format 'time2str'; +use Date::Parse; use FS::Conf; use Encode 'encode'; +use feature 'state'; my $conf; my ($client_num, $shortname, $longname, $trans_code, $testmode, $i, $declined, $totaloffset); @@ -30,28 +32,46 @@ $name = 'RBC'; 'filetype' => 'fixed', #this only really applies to Debit Detail, but we otherwise only need first char 'formatre' => - '^(.).{18}(.{4}).{3}(.).{11}(.{19}).{6}(.{30}).{17}(.{9})(.{18}).{6}(.{14}).{23}(.).{9}\r?$', + '^(.).{3}(.{10}).{5}(.{4}).{3}(.).{11}(.{19}).{6}(.{30})(.{2})(.{2})(.{4}).{9}(.{9})(.{18}).{6}(.{14}).{23}(.).{9}\r?$', 'fields' => [ qw( recordtype + clientnum batchnum subtype paybatchnum custname + paydate_month + paydate_day + paydate_year bank payinfo paid status ) ], 'hook' => sub { - my $hash = shift; - $hash->{'paid'} = sprintf("%.2f", $hash->{'paid'} / 100 ); - $hash->{'_date'} = time; - $hash->{'payinfo'} =~ s/^(\S+).*/$1/; # these often have trailing spaces - $hash->{'payinfo'} = $hash->{'payinfo'} . '@' . $hash->{'bank'}; + # pull client_num from config and check it against what's in the batch + state $clientnum ||= do { + my $conf = FS::Conf->new; + my @config = $conf->config("batchconfig-RBC"); + $config[0]; + }; + + my $hash = shift; + $hash->{'paid'} = sprintf("%.2f", $hash->{'paid'} / 100 ); + my $paydate = $hash->{'paydate_year'} . $hash->{'paydate_month'} . $hash->{'paydate_day'}; + $hash->{'_date'} = str2time($paydate, 'local'); + $hash->{'payinfo'} =~ s/^(\S+).*/$1/; # these often have trailing spaces + $hash->{'payinfo'} = $hash->{'payinfo'} . '@' . $hash->{'bank'}; + + if ( $clientnum and $hash->{clientnum} ne $clientnum ) { + die "RBC client number in batch (".$hash->{clientnum}.") does not ". + "match configuration.\n"; + } + ''; }, 'approved' => sub { my $hash = shift; - $hash->{'status'} eq ' ' + ($hash->{'status'} eq ' ') || ($hash->{'status'} eq 'W'); }, 'declined' => sub { my $hash = shift; @@ -90,7 +110,6 @@ $name = 'RBC'; my( $hash, $total, $line ) = @_; return "Can't process Credit Detail Record, aborting import" if ($hash->{'recordtype'} eq '2'); - $totaloffset = sprintf("%.2f", $totaloffset / 100 ); $total += $totaloffset; $total = sprintf("%.2f", $total); # We assume here that this is an 'All Records' or 'Input Records' report. @@ -109,7 +128,7 @@ $name = 'RBC'; #we already declined it this run, no takebacks if ($declined->{$hash->{'paybatchnum'}}) { #file counts this as part of total, but we skip - $totaloffset += $hash->{'paid'} + $totaloffset += sprintf("%.2f", $hash->{'paid'} / 100 ) if $hash->{'status'} eq ' '; #false laziness with 'approved' above return 1; } @@ -135,7 +154,8 @@ $name = 'RBC'; my $pay_batch = shift; my $mode = $testmode ? 'TEST' : 'PROD'; my $filenum = $testmode ? 'TEST' : sprintf("%04u", $pay_batch->batchnum); - '$$AAPASTD0152['.$mode.'[NL$$'."\n". + my $qualifier = $pay_batch->type eq 'CREDIT' ? 'D' : 'A'; + '$$AAP'.$qualifier.'STD0152['.$mode.'[NL$$'."\n". '000001'. 'A'. 'HDR'. @@ -160,9 +180,19 @@ $name = 'RBC'; die "invalid branch/routing number '$aba'\n"; } + ## set custname to business name if business checking or savings account is used otherwise leave as first and last name. + my $custname = $cust_pay_batch->cust_main->first . ' ' . $cust_pay_batch->cust_main->last; + $custname = $cust_pay_batch->cust_main->company + if (($cust_pay_batch->cust_main->paytype eq "Business checking" || $cust_pay_batch->cust_main->paytype eq "Business savings") && $cust_pay_batch->cust_main->company); + $i++; + + ## 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; + sprintf("%06u", $i). - 'D'. + $debitorcredit. sprintf("%3s",$trans_code). sprintf("%10s",$client_num). ' '. @@ -175,8 +205,7 @@ $name = 'RBC'; sprintf("%010.0f",$cust_pay_batch->amount*100). ' '. time2str("%Y%j", time + 86400). - sprintf("%-30.30s", encode('utf8', $cust_pay_batch->cust_main->first . ' ' . - $cust_pay_batch->cust_main->last)). + sprintf("%-30.30s", encode('utf8', $custname)). 'E'. # English ' '. sprintf("%-15s", $shortname). @@ -193,13 +222,15 @@ $name = 'RBC'; }, footer => sub { my ($pay_batch, $batchcount, $batchtotal) = @_; + + my $batch_info = '0' x 20 . sprintf("%06u", $batchcount) . sprintf("%014.0f", $batchtotal*100); + $batch_info = sprintf("%06u", $batchcount) . sprintf("%014.0f", $batchtotal*100) . '0' x 20 if ($pay_batch->type eq 'CREDIT'); + sprintf("%06u", $i + 1). 'Z'. 'TRL'. sprintf("%10s", $client_num). - '0' x 20 . - sprintf("%06u", $batchcount). - sprintf("%014.0f", $batchtotal*100). + $batch_info. '00' . '000000' . # total number of customer information records ' ' x 84 @@ -207,5 +238,10 @@ $name = 'RBC'; }, ); +## this format can handle credit transactions +sub can_handle_credits { + 1; +} + 1;