blob: 9791749ee8462919cc19e920a73c6f032693f09f (
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
|
package FS::Cron::pay_batch;
use strict;
use vars qw( @ISA @EXPORT_OK $me $DEBUG );
use Exporter;
use Date::Format;
use FS::UID qw(dbh);
use FS::Record qw( qsearch qsearchs );
use FS::Conf;
use FS::queue;
use FS::agent;
@ISA = qw( Exporter );
@EXPORT_OK = qw ( pay_batch_submit pay_batch_receive );
$DEBUG = 0;
$me = '[FS::Cron::pay_batch]';
#freeside-daily %opt:
# -v: enable debugging
# -l: debugging level
# -m: Experimental multi-process mode uses the job queue for multi-process and/or multi-machine billing.
# -r: Multi-process mode dry run option
# -a: Only process customers with the specified agentnum
sub pay_batch_submit {
my %opt = @_;
local $DEBUG = ($opt{l} || 1) if $opt{v};
# if anything goes wrong, don't try to roll back previously submitted batches
local $FS::UID::AutoCommit = 1;
my $dbh = dbh;
warn "$me batch_submit\n" if $DEBUG;
my $conf = FS::Conf->new;
# need to respect -a somehow, but for now none of this is per-agent
if ( $opt{a} ) {
warn "Payment batch processing skipped in per-agent mode.\n" if $DEBUG;
return;
}
my %gateways;
foreach my $payby ('CARD', 'CHEK') {
my $gatewaynum = $conf->config("batch-gateway-$payby");
next if !$gatewaynum;
my $gateway = FS::payment_gateway->by_key($gatewaynum)
or die "payment_gateway '$gatewaynum' not found\n";
if ( $gateway->batch_processor->can('default_transport') ) {
foreach my $pay_batch (
qsearch('pay_batch', { status => 'O', payby => $payby })
) {
warn "Exporting batch ".$pay_batch->batchnum."\n" if $DEBUG;
eval { $pay_batch->export_to_gateway( $gateway, debug => $DEBUG ); };
if ( $@ ) {
# warn the error and continue. rolling back the transaction once
# we've started sending batches is bad.
warn "error submitting batch ".$pay_batch->batchnum." to gateway '".
$gateway->label."': $@\n";
}
}
} else { #can't(default_transport)
warn "Payment gateway '".$gateway->label.
"' doesn't support automatic transport; skipped.\n";
}
} #$payby
1;
}
sub pay_batch_receive {
my %opt = @_;
local $DEBUG = ($opt{l} || 1) if $opt{v};
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
my $error;
warn "$me batch_receive\n" if $DEBUG;
my $conf = FS::Conf->new;
# need to respect -a somehow, but for now none of this is per-agent
if ( $opt{a} ) {
warn "Payment batch processing skipped in per-agent mode.\n" if $DEBUG;
return;
}
my %gateways;
foreach my $payby ('CARD', 'CHEK') {
my $gatewaynum = $conf->config("batch-gateway-$payby");
next if !$gatewaynum;
# If the same gateway is selected for both paybys, only import it once
$gateways{$gatewaynum} = FS::payment_gateway->by_key($gatewaynum);
if ( !$gateways{$gatewaynum} ) {
$dbh->rollback;
die "batch-gateway-$payby gateway $gatewaynum not found\n";
}
}
foreach my $gateway (values %gateways) {
if ( $gateway->batch_processor->can('default_transport') ) {
warn "Importing results from '".$gateway->label."'\n" if $DEBUG;
$error = eval {
FS::pay_batch->import_from_gateway( gateway =>$gateway, debug => $DEBUG )
} || $@;
if ( $error ) {
# this we can roll back
$dbh->rollback;
die "error receiving from gateway '".$gateway->label."':\n$error\n";
}
}
# else we already warned about it above
} #$gateway
# resolve batches if we can
foreach my $pay_batch (qsearch('pay_batch', { status => 'I' })) {
warn "Trying to resolve batch ".$pay_batch->batchnum."\n" if $DEBUG;
$error = $pay_batch->try_to_resolve;
if ( $error ) {
$dbh->rollback;
die "unable to resolve batch ".$pay_batch->batchnum.":\n$error\n";
}
}
$dbh->commit;
}
1;
|