X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fpay_batch.pm;h=4aeb33169470087498f44e50c6df3281e66cb318;hp=d7dd7bbe46333e2c36929d9b126455bf801974f6;hb=61e54f288c3b6c93bcfdf128c8117f66965f463b;hpb=15a4e1674694b76ecc2af87de479aabe370ac03d diff --git a/FS/FS/pay_batch.pm b/FS/FS/pay_batch.pm index d7dd7bbe4..4aeb33169 100644 --- a/FS/FS/pay_batch.pm +++ b/FS/FS/pay_batch.pm @@ -9,11 +9,12 @@ use List::Util qw(sum); use Time::Local; use Text::CSV_XS; use Date::Parse qw(str2time); -use Business::CreditCard qw(cardtype); +use Business::CreditCard qw( 0.35 cardtype ); use FS::Record qw( dbh qsearch qsearchs ); use FS::Conf; use FS::cust_pay; use FS::Log; +use Try::Tiny; =head1 NAME @@ -614,7 +615,8 @@ sub import_from_gateway { my $error; my $paybatch = $gateway->gatewaynum . '-' . $gateway->gateway_module . - ':' . $item->authorization . ':' . $item->order_number; + ':' . ($item->authorization || '') . + ':' . ($item->order_number || ''); if ( $batch->incoming ) { # This is a one-way batch. @@ -888,7 +890,8 @@ Prepare the batch to be exported. This will: increment expiration dates that are in the past. - If this is the first download for this batch, adjust payment amounts to not be greater than the customer's current balance. If the customer's - balance is zero, the entry will be removed. + balance is zero, the entry will be removed (caution: all cust_pay_batch + entries might be removed!) Use this within a transaction. @@ -903,8 +906,6 @@ sub prepare_for_export { my $status = $self->status; if ($status eq 'O') { $first_download = 1; - my $error = $self->set_status('I'); - return "error updating pay_batch status: $error\n" if $error; } elsif ($status eq 'I' && $curuser->access_right('Reprocess batches')) { $first_download = 0; } elsif ($status eq 'R' && @@ -938,7 +939,7 @@ sub prepare_for_export { my $balance = $cust_pay_batch->cust_main->balance; if ($balance <= 0) { # then don't charge this customer - my $error = $cust_pay_batch->delete; + my $error = $cust_pay_batch->unbatch_and_delete; return $error if $error; } elsif ($balance < $cust_pay_batch->amount) { # reduce the charge to the remaining balance @@ -948,6 +949,11 @@ sub prepare_for_export { } # else $balance >= $cust_pay_batch->amount } + + #need to do this after unbatch_and_delete + my $error = $self->set_status('I'); + return "error updating pay_batch status: $error\n" if $error; + } #if $first_download ''; @@ -961,6 +967,10 @@ module, in which case the configuration options are in 'batchconfig-FORMAT'. Alternatively, GATEWAY can be an L object set to a L module. +Returns the text of the batch. If batch contains no cust_pay_batch entries +(or has them all removed by L) then the batch will be +resolved and a blank string will be returned. All other errors are fatal. + =cut sub export_batch { @@ -996,6 +1006,12 @@ sub export_batch { my $batchcount = 0; my @cust_pay_batch = $self->cust_pay_batch; + unless (@cust_pay_batch) { + # if it's empty, just resolve the batch + $self->set_status('R'); + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + return ''; + } my $delim = exists($info->{'delimiter'}) ? $info->{'delimiter'} : "\n"; @@ -1040,6 +1056,10 @@ that gateway via Business::BatchPayment. OPTIONS may include: - file: override the default transport and write to this file (name or handle) +If batch contains no cust_pay_batch entries (or has them all removed by +L) then nothing will be transported (or written to +the override file) and the batch will be resolved. + =cut sub export_to_gateway { @@ -1060,17 +1080,29 @@ sub export_to_gateway { my $processor = $gateway->batch_processor(%proc_opt); my @items = map { $_->request_item } $self->cust_pay_batch; - my $batch = Business::BatchPayment->create(Batch => - batch_id => $self->batchnum, - items => \@items - ); - $processor->submit($batch); - - if ($batch->processor_id) { - $self->set('processor_id',$batch->processor_id); - $self->replace; + unless (@items) { + # if it's empty, just resolve the batch + $self->set_status('R'); + $dbh->commit or die $dbh->errstr if $oldAutoCommit; + return ''; } + try { + my $batch = Business::BatchPayment->create(Batch => + batch_id => $self->batchnum, + items => \@items + ); + $processor->submit($batch); + + if ($batch->processor_id) { + $self->set('processor_id',$batch->processor_id); + $self->replace; + } + } catch { + $dbh->rollback if $oldAutoCommit; + die $_; + }; + $dbh->commit or die $dbh->errstr if $oldAutoCommit; ''; }