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
  | 
#!/usr/bin/perl
use strict;
use Getopt::Std;
use DateTime;
use Net::FTPSSL;
use File::Temp qw(tempdir);
use File::Slurp 'write_file';
use FS::UID qw(adminsuidsetup dbh);
use FS::Record qw(qsearch qsearchs);
use FS::pay_batch;
use FS::Conf;
use vars qw( $opt_a $opt_v $opt_p );
getopts('avp:');
sub usage { "
  Usage:
    freeside-rbc-upload [ -v ] user batchnum
    freeside-rbc-upload -a [ -p payby ] [ -v ] user\n
" }
sub debug {
  print STDERR $_[0] if $opt_v;
}
my $user = shift or die &usage;
adminsuidsetup $user;
my @batches; 
# copied from freeside-paymentech-upload, obviously
if($opt_a) {
  my %criteria = (status => 'O');
  $criteria{'payby'} = uc($opt_p) if $opt_p;
  @batches = qsearch('pay_batch', \%criteria);
  die "No open batches found".($opt_p ? " of type '$opt_p'" : '').".\n" 
    if !@batches;
}
else {
  my $batchnum = shift;
  die &usage if !$batchnum;
  @batches = qsearchs('pay_batch', { batchnum => $batchnum } );
  die "Can't find payment batch '$batchnum'\n" if !@batches;
}
my $conf = new FS::Conf;
my ($username, $password) = $conf->config('batchconfig-RBC-login');
$username and $password
  or die "RBC FTP login not configured. Enter your username and password in 'batchconfig-rbc-login'.\n";
my $host = 'ftpssl.rbc.com';
debug "Connecting to $username\@$host...\n";
my $date = DateTime->now->strftime('%Y%m%d');
my $ftp = Net::FTPSSL->new($host,
                           Timeout => 30,
                           Debug => ($opt_v ? 1 : 0),
                           Croak => 1, # rely on auto-rollback when dbh closes
                          );
$ftp->login($username, $password);
my $tmpdir = tempdir( CLEANUP => 1 );
foreach my $pay_batch (@batches) {
  my $batchnum = $pay_batch->batchnum;
  my $filename = $date . '.' . sprintf('%06d', $batchnum);
  debug "Exporting batch $batchnum to $filename\n";
  my $text = $pay_batch->export_batch(format => 'RBC');
  write_file("$tmpdir/$filename", $text);
  debug "Uploading $filename...";
  $ftp->put("$tmpdir/$filename", $filename);
  debug "done.\n";
}
debug "Finished.\n";
=head1 NAME
freeside-rbc-upload - Transmit a payment batch to RBC via FTP/TLS.
=head1 SYNOPSIS
  freeside-rbc-upload [ -a [ -p PAYBY ] ] [ -v ] user batchnum
=head1 DESCRIPTION
Command line tool to upload a payment batch to the Royal Bank of Canada 
ACH service. Use L<freeside-rbc-download> to retrieve the response file.
Options:
-a: Send all open batches, instead of specifying a batchnum.
-p PAYBY: With -a, limit to batches of that payment type, e.g. -p CARD.
-v: Be verbose.
user: freeside username
batchnum: pay_batch primary key
=head1 BUGS
=head1 SEE ALSO
L<FS::pay_batch>
=cut
1;
  |