1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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;
|