summaryrefslogtreecommitdiff
path: root/FS/FS/pay_batch/paymentech.pm
diff options
context:
space:
mode:
Diffstat (limited to 'FS/FS/pay_batch/paymentech.pm')
-rw-r--r--FS/FS/pay_batch/paymentech.pm117
1 files changed, 117 insertions, 0 deletions
diff --git a/FS/FS/pay_batch/paymentech.pm b/FS/FS/pay_batch/paymentech.pm
new file mode 100644
index 0000000..89f0c77
--- /dev/null
+++ b/FS/FS/pay_batch/paymentech.pm
@@ -0,0 +1,117 @@
+package FS::pay_batch::paymentech;
+
+use strict;
+use vars qw(@ISA %import_info %export_info $name);
+use Time::Local;
+use Date::Format 'time2str';
+use Date::Parse 'str2time';
+use Tie::IxHash;
+use FS::Conf;
+
+my $conf;
+my ($bin, $merchantID, $terminalID, $username);
+$name = 'paymentech';
+
+%import_info = (
+ filetype => 'XML',
+ xmlrow => [ qw(transResponse newOrderResp) ],
+ fields => [
+ 'paybatchnum',
+ '_date',
+ 'approvalStatus',
+ ],
+ xmlkeys => [
+ 'orderID',
+ 'respDateTime',
+ 'approvalStatus',
+ ],
+ 'hook' => sub {
+ my ($hash, $oldhash) = @_;
+ my ($mon, $day, $year, $hour, $min, $sec) =
+ $hash->{'_date'} =~ /^(..)(..)(....)(..)(..)(..)$/;
+ $hash->{'_date'} = timelocal($sec, $min, $hour, $day, $mon-1, $year);
+ $hash->{'paid'} = $oldhash->{'amount'};
+ },
+ 'approved' => sub { my $hash = shift;
+ $hash->{'approvalStatus'}
+ },
+ 'declined' => sub { my $hash = shift;
+ ! $hash->{'approvalStatus'}
+ },
+);
+
+my %paytype = (
+ 'personal checking' => 'C',
+ 'personal savings' => 'S',
+ 'business checking' => 'X',
+ 'business savings' => 'X',
+ );
+
+%export_info = (
+ init => sub {
+# Load this at run time
+ eval "use XML::Writer";
+ die $@ if $@;
+ my $conf = shift;
+ ($bin, $terminalID, $merchantID, $username) =
+ $conf->config('batchconfig-paymentech');
+ },
+# Here we do all the work in the header function.
+ header => sub {
+ my $pay_batch = shift;
+ my @cust_pay_batch = @{(shift)};
+ my $count = 1;
+ my $output;
+ my $xml = new XML::Writer(OUTPUT => \$output, DATA_MODE => 1, DATA_INDENT => 2);
+ $xml->startTag('transRequest', RequestCount => scalar(@cust_pay_batch) + 1);
+ $xml->startTag('batchFileID');
+ $xml->dataElement(userID => $username);
+ $xml->dataElement(fileDateTime => time2str('%Y%m%d%H%M%S', time));
+ $xml->dataElement(fileID => 'FILEID');
+ $xml->endTag('batchFileID');
+
+ foreach (@cust_pay_batch) {
+ $xml->startTag('newOrder', BatchRequestNo => $count++);
+ tie my %order, 'Tie::IxHash', (
+ industryType => 'EC',
+ transType => 'AC',
+ bin => $bin,
+ merchantID => $merchantID,
+ terminalID => $terminalID,
+ ($_->payby eq 'CARD') ? (
+ ccAccountNum => $_->payinfo,
+ ccExp => time2str('%m%y', str2time($_->exp))
+ ) : (
+ ecpCheckRT => ($_->payinfo =~ /@(\d+)/),
+ ecpCheckDDA => ($_->payinfo =~ /(\d+)@/),
+ ecpBankAcctType => $paytype{lc($_->cust_main->paytype)},
+ ecpDelvMethod => 'A',
+ ),
+ avsZip => substr($_->zip, 0, 10),
+ avsAddress1 => substr($_->address1, 0, 30),
+ avsAddress2 => substr($_->address2, 0, 30),
+ avsCity => substr($_->city, 0, 20),
+ avsState => $_->state,
+ avsName => substr($_->first . ' ' . $_->last, 0, 30),
+ avsCountryCode => $_->country,
+ orderID => $_->paybatchnum,
+ amount => $_->amount * 100,
+ );
+ foreach my $key (keys %order) {
+ $xml->dataElement($key, $order{$key})
+ }
+ $xml->endTag('newOrder');
+ }
+ $xml->startTag('endOfDay', BatchRequestNo => $count);
+ $xml->dataElement(bin => $bin);
+ $xml->dataElement(merchantID => $merchantID);
+ $xml->dataElement(terminalID => $terminalID);
+ $xml->endTag('endOfDay');
+ $xml->endTag('transRequest');
+ return $output;
+ },
+ row => sub {},
+);
+
+1;
+