=head1 DESCRIPTION
-An FS::pay_batch object represents an example. FS::pay_batch inherits from
-FS::Record. The following fields are currently supported:
+An FS::pay_batch object represents an payment batch. FS::pay_batch inherits
+from FS::Record. The following fields are currently supported:
=over 4
=item new HASHREF
-Creates a new example. To add the example to the database, see L<"insert">.
+Creates a new batch. To add the batch to the database, see L<"insert">.
Note that this stores the hash reference, not a distinct copy of the hash it
points to. You can ask the object for a copy with the I<hash> method.
=item check
-Checks all fields to make sure this is a valid example. If there is
+Checks all fields to make sure this is a valid batch. If there is
an error, returns the error, otherwise returns false. Called by the insert
and replace methods.
$self->replace();
}
-=item import results OPTION => VALUE, ...
+=item import_results OPTION => VALUE, ...
Import batch results.
I<filehandle> - open filehandle of results file.
-I<format> - "csv-td_canada_trust-merchant_pc_batch", "csv-chase_canada-E-xactBatch" or "PAP"
+I<format> - "csv-td_canada_trust-merchant_pc_batch", "csv-chase_canada-E-xactBatch", "ach-spiritone", or "PAP"
=cut
sub import_results {
my $self = shift;
- my $param = @_;
+ my $param = ref($_[0]) ? shift : { @_ };
my $fh = $param->{'filehandle'};
my $format = $param->{'format'};
0;
};
+ }elsif ( $format eq 'ach-spiritone' ) {
+
+ $filetype = "CSV";
+
+ @fields = (
+ '', # Name
+ 'paybatchnum', # ID: Number of the transaction
+ 'aba', # ABA Number for the transaction
+ 'payinfo', # Bank Account Number for the transaction
+ '', # Transaction Type: 27 - debit
+ 'paid', # Amount: Amount of the transaction. Dollars and cents
+ # with decimal entered.
+ '', # Default Transaction Type
+ '', # Default Amount: Dollars and cents with decimal entered.
+ );
+
+ $end_condition = sub {
+ '';
+ };
+
+ $hook = sub {
+ my $hash = shift;
+ $hash->{'_date'} = time; # got a better one?
+ $hash->{'payinfo'} = $hash->{'payinfo'} . '@' . $hash->{'aba'};
+ };
+
+ $approved_condition = sub {
+ 1;
+ };
+
+ $declined_condition = sub {
+ 0;
+ };
+
} else {
return "Unknown format $format";
};
my $error = $self->set_status('R');
-
- my $newbatch = new FS::pay_batch { $self->hash };
- $newbatch->status('R'); # Resolved
- $newbatch->upload(time);
- my $error = $newbatch->replace($self);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error
$new_cust_pay_batch->status('Approved');
+ } elsif ( &{$declined_condition}(\%hash) ) {
+
+ $new_cust_pay_batch->status('Declined');
+
+ }
+
+ my $error = $new_cust_pay_batch->replace($cust_pay_batch);
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "error updating status of paybatchnum $hash{'paybatchnum'}: $error\n";
+ }
+
+ if ( $new_cust_pay_batch->status =~ /Approved/i ) {
+
my $cust_pay = new FS::cust_pay ( {
'custnum' => $custnum,
'payby' => $payby,
$cust_pay->cust_main->apply_payments;
- } elsif ( &{$declined_condition}(\%hash) ) {
+ } elsif ( $new_cust_pay_batch->status =~ /Declined/i ) {
- $new_cust_pay_batch->status('Declined');
+ #false laziness w/cust_main::collect
- foreach my $part_bill_event ( due_events ( $new_cust_pay_batch,
- 'DCLN',
- '',
- '') ) {
+ my $due_cust_event = $new_cust_pay_batch->cust_main->due_cust_event(
+ #'check_freq' => '1d', #?
+ 'eventtable' => 'cust_pay_batch',
+ 'objects' => [ $new_cust_pay_batch ],
+ );
+ unless( ref($due_cust_event) ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $due_cust_event;
+ }
- # don't run subsequent events if balance<=0
- last if $cust_pay_batch->cust_main->balance <= 0;
+ foreach my $cust_event ( @$due_cust_event ) {
+
+ #XXX lock event
+
+ #re-eval event conditions (a previous event could have changed things)
+ next unless $cust_event->test_conditions;
- if (my $error = $part_bill_event->do_event($new_cust_pay_batch)) {
+ if ( my $error = $cust_event->do_event() ) {
# gah, even with transactions.
- $dbh->commit if $oldAutoCommit; #well.
- return $error;
+ #$dbh->commit if $oldAutoCommit; #well.
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
}
}
}
- my $error = $new_cust_pay_batch->replace($cust_pay_batch);
- if ( $error ) {
- $dbh->rollback if $oldAutoCommit;
- return "error updating status of paybatchnum $hash{'paybatchnum'}: $error\n";
- }
}