summaryrefslogtreecommitdiff
path: root/FS/bin/freeside-rbc-upload
blob: 1d3d0ed4a040ddc86633fd60b66a837330317233 (plain)
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#!/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;

  my $extra_sql;
  $extra_sql = " AND ((payby = 'CHEK' AND type != 'CREDIT') OR (payby != 'CHEK'))" unless FS::pay_batch->can_handle_electronic_refunds('RBC');

  my %hash = (
    table => 'pay_batch',
    hashref   => \%criteria,
    extra_sql => $extra_sql,
  );

  @batches = qsearch(\%hash);
  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;
  if ($batches[0]->type eq "CREDIT") {
    warn "running credit\n";
    die( "Batch number $batchnum is a credit (batch refund) batch, and this format can not handle batch refunds.\n" )
      unless FS::pay_batch->can_handle_electronic_refunds('RBC');
  }
}

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');
  unless ($text) {
    print STDERR "Batch is empty, resolving..." if $opt_v;
    next;
  }
  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;