From: mark Date: Wed, 18 Nov 2009 09:40:04 +0000 (+0000) Subject: RT#4786, RBC batch format X-Git-Tag: freeside_1_9_2~225 X-Git-Url: http://git.freeside.biz/gitweb/?a=commitdiff_plain;h=455a4fe92dd71d6b4a7ee3e62ef4da8dd0db9124;p=freeside.git RT#4786, RBC batch format --- diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm index c0f894fc2..c92557067 100644 --- a/FS/FS/Conf.pm +++ b/FS/FS/Conf.pm @@ -2374,7 +2374,7 @@ worry that config_items is freeside-specific and icky. 'type' => 'select', 'select_enum' => [ 'csv-td_canada_trust-merchant_pc_batch', 'csv-chase_canada-E-xactBatch', 'BoM', 'PAP', - 'paymentech', 'ach-spiritone', + 'paymentech', 'ach-spiritone', 'RBC' ] }, @@ -2394,7 +2394,7 @@ worry that config_items is freeside-specific and icky. 'description' => 'Fixed (unchangeable) format for electronic check batches.', 'type' => 'select', 'select_enum' => [ 'csv-td_canada_trust-merchant_pc_batch', 'BoM', 'PAP', - 'paymentech', 'ach-spiritone', + 'paymentech', 'ach-spiritone', 'RBC' ] }, @@ -2433,6 +2433,13 @@ worry that config_items is freeside-specific and icky. 'type' => 'textarea', }, + { + 'key' => 'batchconfig-RBC', + 'section' => 'billing', + 'description' => 'Configuration for Royal Bank of Canada PDS batching, four lines: 1. Client number, 2. Short name, 3. Long name, 4. Transaction code.', + 'type' => 'textarea', + }, + { 'key' => 'payment_history-years', 'section' => 'UI', diff --git a/FS/FS/pay_batch/RBC.pm b/FS/FS/pay_batch/RBC.pm new file mode 100644 index 000000000..dc6095ccc --- /dev/null +++ b/FS/FS/pay_batch/RBC.pm @@ -0,0 +1,130 @@ +package FS::pay_batch::RBC; + +use strict; +use vars qw(@ISA %import_info %export_info $name); +use Date::Format 'time2str'; +use FS::Conf; + +my $conf; +my ($client_num, $shortname, $longname, $trans_code, $i); + +$name = 'RBC'; +# Royal Bank of Canada ACH Direct Payments Service + +%import_info = ( + 'filetype' => 'fixed', + 'formatre' => + '^(.).{18}(.{4}).{15}(.{19}).{6}(.{30}).{17}(.{9})(.{18}).{6}(.{14}).{23}(.).{9}$', + 'fields' => [ qw( + recordtype + batchnum + paybatchnum + custname + bank + payinfo + paid + status + ) ], + 'hook' => sub { + my $hash = shift; + $hash->{'paid'} = sprintf("%.df", $hash->{'paid'} / 100 ); + $hash->{'_date'} = time; + $hash->{'payinfo'} = $hash->{'payinfo'} . '@' . $hash->{'bank'}; + }, + 'approved' => sub { + my $hash = shift; + $hash->{'status'} eq ' ' + }, + 'declined' => sub { + my $hash = shift; + grep { $hash->{'status'} eq $_ } ('E', 'R', 'U', 'T'); + }, + 'end_hook' => sub { + my( $hash, $total, $line ) = @_; + $total = sprintf("%.2f", $total); + my $batch_total = sprintf("%.2f", substr($line, 140, 18) / 100); + return "Our total $total does not match bank total $batch_total!" + if $total != $batch_total; + ''; + }, + 'end_condition' => sub { + my $hash = shift; + $hash->{recordtype} == '3'; # Account Trailer Record + }, +); + +%export_info = ( + init => sub { + $conf = shift; + ($client_num, + $shortname, + $longname, + $trans_code, + ) = $conf->config("batchconfig-RBC"); + $i = 1; + }, + header => sub { + my $pay_batch = shift; + '000001'. + 'A'. + 'HDR'. + sprintf("%10s", $client_num). + sprintf("%-30s", $longname). + sprintf("%04u", $pay_batch->batchnum). + time2str("%Y%j", $pay_batch->download). + 'CAD'. + '1'. + ' ' x 87 # filler/reserved fields + ; + }, + row => sub { + my ($cust_pay_batch, $pay_batch) = @_; + my ($account, $aba) = split('@', $cust_pay_batch->payinfo); + $i++; + sprintf("%06u", $i). + 'D'. + sprintf("%3s",$trans_code). + sprintf("%10s",$client_num). + ' '. + sprintf("%-19s", $cust_pay_batch->paybatchnum). + '00'. + sprintf("%09u", $aba). + sprintf("%-18s", $account). + ' '. + sprintf("%010u",$cust_pay_batch->amount*100). + ' '. + time2str("%Y%j", $pay_batch->download). + sprintf("%-30s", $cust_pay_batch->cust_main->first . ' ' . + $cust_pay_batch->cust_main->last). + 'E'. # English + ' '. + sprintf("%-15s", $shortname). + 'CAD'. + ' '. + 'CAN'. + ' '. + 'N' # no customer optional information follows + ; +# Note: IAT Address Information and Remittance records are not +# supported. This means you probably can't process payments +# destined to U.S. bank accounts. If you need this feature, contact +# Freeside Internet Services. + }, + footer => sub { + my ($pay_batch, $batchcount, $batchtotal) = @_; + sprintf("%06u", $i + 1). + 'Z'. + 'TRL'. + sprintf("%10s", $client_num). + ' ' x 20 . + sprintf("%06u", $batchcount). + sprintf("%014u", $batchtotal*100). + '00' . + '000000' . # total number of customer information records + ' ' x 84 + ; + }, +); + +1; + diff --git a/httemplate/search/cust_pay_batch.cgi b/httemplate/search/cust_pay_batch.cgi index 2056876b6..169094435 100755 --- a/httemplate/search/cust_pay_batch.cgi +++ b/httemplate/search/cust_pay_batch.cgi @@ -148,6 +148,7 @@ if ( $pay_batch ) { qq!!. qq!!. qq!!. + qq!!. qq!!; } $html_init .= qq!
!; @@ -173,6 +174,7 @@ if ( $pay_batch ) { qq!!. qq!!. qq!!. + qq!!. qq!
!; } $html_init .= qq!!;