summaryrefslogtreecommitdiff
path: root/FS/FS/pay_batch/RBC.pm
diff options
context:
space:
mode:
Diffstat (limited to 'FS/FS/pay_batch/RBC.pm')
-rw-r--r--FS/FS/pay_batch/RBC.pm143
1 files changed, 143 insertions, 0 deletions
diff --git a/FS/FS/pay_batch/RBC.pm b/FS/FS/pay_batch/RBC.pm
new file mode 100644
index 0000000..6ee5771
--- /dev/null
+++ b/FS/FS/pay_batch/RBC.pm
@@ -0,0 +1,143 @@
+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}).{3}(.).{11}(.{19}).{6}(.{30}).{17}(.{9})(.{18}).{6}(.{14}).{23}(.).{9}\r?$',
+ 'fields' => [ qw(
+ recordtype
+ batchnum
+ subtype
+ paybatchnum
+ custname
+ 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'};
+ },
+ 'approved' => sub {
+ my $hash = shift;
+ $hash->{'status'} eq ' '
+ },
+ 'declined' => sub {
+ my $hash = shift;
+ grep { $hash->{'status'} eq $_ } ('E', 'R', 'U', 'T');
+ },
+ 'begin_condition' => sub {
+ my $hash = shift;
+ $hash->{recordtype} eq '1'; # Detail Record
+ },
+ 'end_hook' => sub {
+ my( $hash, $total, $line ) = @_;
+ $total = sprintf("%.2f", $total);
+ # We assume here that this is an 'All Records' or 'Input Records'
+ # report.
+ my $batch_total = sprintf("%.2f", substr($line, 59, 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} eq '4'; # Client Trailer Record
+ },
+ 'skip_condition' => sub {
+ my $hash = shift;
+ $hash->{'subtype'} ne '0';
+ },
+);
+
+%export_info = (
+ init => sub {
+ $conf = shift;
+ ($client_num,
+ $shortname,
+ $longname,
+ $trans_code,
+ ) = $conf->config("batchconfig-RBC");
+ $i = 1;
+ },
+ header => sub {
+ my $pay_batch = shift;
+ '$$AAPASTD0152[PROD[NL$$'."\n".
+ '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("%010.0f",$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("%014.0f", $batchtotal*100).
+ '00' .
+ '000000' . # total number of customer information records
+ ' ' x 84
+ ;
+ },
+);
+
+1;
+