summaryrefslogtreecommitdiff
path: root/FS/bin/freeside-eftca-upload
blob: 9818cbdb5b4a160f589741c021f73b0945f3dbe6 (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
135
136
137
138
139
140
141
142
143
144
145
146
#!/usr/bin/perl

use strict;
use Getopt::Std;
use Date::Format qw(time2str);
use File::Temp qw(tempdir);
use Net::SFTP::Foreign;
use FS::UID qw(adminsuidsetup dbh);
use FS::Record qw(qsearch qsearchs);
use FS::pay_batch;
use FS::Conf;
use FS::Log;

use vars qw( $opt_a $opt_v );
getopts('av');

#$Net::SFTP::Foreign::debug = -1;

sub HELP_MESSAGE { "
  Usage:
    freeside-eftca-upload [ -v ] user batchnum
    freeside-eftca-upload -a [ -v ] user\n
" }

my $user = shift or die &HELP_MESSAGE;
adminsuidsetup $user;

my $log = FS::Log->new('freeside-eftca-upload');
log_info( "EFT Canada upload started\n" );

my @batches; 

if($opt_a) {
  @batches = qsearch('pay_batch', { 'status' => 'O', 'payby' => 'CHEK' })
    or log_info_and_die( "Finished: No open batches found.\n" );
}
else {
  my $batchnum = shift;
  die &HELP_MESSAGE if !$batchnum;
  @batches = qsearchs('pay_batch', { batchnum => $batchnum } );
  log_error_and_die( "Can't find payment batch '$batchnum'\n" ) if !@batches;
}

my $conf = new FS::Conf;

my $tmpdir = tempdir( CLEANUP => 1 ); #DIR=>somewhere?

foreach my $pay_batch (@batches) {

  my $batchnum = $pay_batch->batchnum;
  my $filename = time2str('%Y%m%d', time) . '-' . sprintf('%06d.csv',$batchnum);
  log_info( "Exporting batch $batchnum to $filename...\n" );
  my $text = $pay_batch->export_batch(format => 'eft_canada');
  unless ($text) {
    log_info( "Batch is empty, resolving..." );
    next;
  }
  open OUT, ">$tmpdir/$filename";
  print OUT $text;
  close OUT;

  my @batchconf = $conf->config('batchconfig-eft_canada', $pay_batch->agentnum);
  my $user = $batchconf[0]
    or log_error_and_die( "no EFT Canada batch username configured\n" );
  my $pass = $batchconf[1]
    or log_error_and_die( "no EFT Canada batch password configured\n" );

  my $host = 'ftp.eftcanada.com';
  log_info( "Connecting to $user\@$host...\n" );

  my $sftp = Net::SFTP::Foreign->new( host     => $host,
                                      user     => $user,
                                      password => $pass,
                                      timeout  => 30,
                                    );
  log_error_and_die("failed to connect to '$user\@$host'\n(".$sftp->error.")\n")
      if $sftp->error;

  $sftp->put("$tmpdir/$filename", "$filename")
    or log_error_and_die( "failed to upload file (".$sftp->error.")\n" );

  undef $sftp; #$sftp->disconnect;

  # Auto-approve and close the batch.  Some false laziness with manual_approve.
  my $batchnum = $pay_batch->batchnum;
  my $error;
  foreach my $cpb ( qsearch('cust_pay_batch', { 'batchnum' => $batchnum } ) ) {
    $cpb->setfield('paid', $cpb->amount);
    $error = $cpb->approve($batchnum);
    last if $error;
  }
  $error ||= $pay_batch->set_status('R');
  log_error_and_die( "error closing batch $batchnum: $error\n\n" )
    if $error;
}

log_info( "Finished!\n" );

sub log_info {
  my $log_message = shift;
  $log->info( $log_message );
  print STDERR $log_message if $opt_v;
}

sub log_info_and_die {
  my $log_message = shift;
  $log->info( $log_message );
  die $log_message;
}

sub log_error_and_die {
  my $log_message = shift;
  $log->error( $log_message );
  die $log_message;
}

=head1 NAME

freeside-eftca-upload - Transmit a payment batch to EFT Canada via SFTP.

=head1 SYNOPSIS

  freeside-eftca-upload [ -a ] [ -v ] user batchnum

=head1 DESCRIPTION

Command line tool to upload a payment batch to the EFT Canada gateway.  The 
batch will be exported to a comma-delimited file and transmitted via SFTP.
Use L<freeside-eftca-download> to retrieve the response file.

-a: Send all open batches, instead of specifying a batchnum.

-v: Be verbose.

user: freeside username

batchnum: pay_batch primary key

=head1 SEE ALSO

L<FS::pay_batch>

=cut

1;