X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_pay_batch.pm;h=f321bb2fee90b355452dcbabb7a7c60485c055e4;hb=a014f2e125028a5a80c0587f36df5e865b70b47f;hp=6acb4fefbae27a6ec74ca9dc2d969c836dcce860;hpb=20c1183d2673b62bd0e29eb65f0a9a2c974b8027;p=freeside.git diff --git a/FS/FS/cust_pay_batch.pm b/FS/FS/cust_pay_batch.pm index 6acb4fefb..f321bb2fe 100644 --- a/FS/FS/cust_pay_batch.pm +++ b/FS/FS/cust_pay_batch.pm @@ -1,11 +1,18 @@ package FS::cust_pay_batch; use strict; -use vars qw( @ISA ); -use FS::Record; -use Business::CreditCard; +use vars qw( @ISA $DEBUG ); +use FS::Record qw(dbh qsearch qsearchs); +use FS::payinfo_Mixin; +use FS::part_bill_event qw(due_events); +use Business::CreditCard 0.28; -@ISA = qw( FS::Record ); +@ISA = qw( FS::Record FS::payinfo_Mixin ); + +# 1 is mostly method/subroutine entry and options +# 2 traces progress of some operations +# 3 is even more information including possibly sensitive data +$DEBUG = 0; =head1 NAME @@ -26,6 +33,8 @@ FS::cust_pay_batch - Object methods for batch cards $error = $record->check; + $error = $record->retriable; + =head1 DESCRIPTION An FS::cust_pay_batch object represents a credit card transaction ready to be @@ -37,7 +46,11 @@ following fields are currently supported: =item paybatchnum - primary key (automatically assigned) -=item cardnum +=item batchnum - indentifies group in batch + +=item payby - CARD/CHEK/LECB/BILL/COMP + +=item payinfo =item exp - card expiration @@ -65,6 +78,8 @@ following fields are currently supported: =item country +=item status + =back =head1 METHODS @@ -94,22 +109,14 @@ otherwise returns false. =item replace OLD_RECORD -#inactive -# -#Replaces the OLD_RECORD with this one in the database. If there is an error, -#returns the error, otherwise returns false. - -=cut - -sub replace { - return "Can't (yet?) replace batched transactions!"; -} +Replaces the OLD_RECORD with this one in the database. If there is an error, +returns the error, otherwise returns false. =item check Checks all fields to make sure this is a valid transaction. If there is an error, returns the error, otherwise returns false. Called by the insert -and repalce methods. +and replace methods. =cut @@ -118,15 +125,14 @@ sub check { my $error = $self->ut_numbern('paybatchnum') - || $self->ut_numbern('trancode') #depriciated - || $self->ut_number('cardnum') + || $self->ut_numbern('trancode') #deprecated || $self->ut_money('amount') || $self->ut_number('invnum') || $self->ut_number('custnum') || $self->ut_text('address1') || $self->ut_textn('address2') || $self->ut_text('city') - || $self->ut_text('state') + || $self->ut_textn('state') ; return $error if $error; @@ -137,17 +143,12 @@ sub check { $self->first =~ /^([\w \,\.\-\']+)$/ or return "Illegal first name"; $self->first($1); - my $cardnum = $self->cardnum; - $cardnum =~ s/\D//g; - $cardnum =~ /^(\d{13,16})$/ - or return "Illegal credit card number"; - $cardnum = $1; - $self->cardnum($cardnum); - validate($cardnum) or return "Illegal credit card number"; - return "Unknown card type" if cardtype($cardnum) eq "Unknown"; + $error = $self->payinfo_check(); + return $error if $error; if ( $self->exp eq '' ) { - return "Expriation date required"; #unless + return "Expiration date required" + unless $self->payby =~ /^(CHEK|DCHK|LECB|WEST)$/; $self->exp(''); } else { if ( $self->exp =~ /^(\d{4})[\/\-](\d{1,2})[\/\-](\d{1,2})$/ ) { @@ -173,23 +174,83 @@ sub check { $self->payname($1); } - $self->zip =~ /^\s*(\w[\w\-\s]{3,8}\w)\s*$/ + #we have lots of old zips in there... don't hork up batch results cause of em + $self->zip =~ /^\s*(\w[\w\-\s]{2,8}\w)\s*$/ or return "Illegal zip: ". $self->zip; $self->zip($1); $self->country =~ /^(\w\w)$/ or return "Illegal country: ". $self->country; $self->country($1); + #$error = $self->ut_zip('zip', $self->country); + #return $error if $error; + #check invnum, custnum, ? - ''; #no error + $self->SUPER::check; } -=back +=item cust_main + +Returns the customer (see L) for this batched credit card +payment. + +=cut + +sub cust_main { + my $self = shift; + qsearchs( 'cust_main', { 'custnum' => $self->custnum } ); +} + +=item retriable + +Marks the corresponding event (see L) for this batched +credit card payment as retriable. Useful if the corresponding financial +institution account was declined for temporary reasons and/or a manual +retry is desired. + +Implementation details: For the named customer's invoice, changes the +statustext of the 'done' (without statustext) event to 'retriable.' -=head1 VERSION +=cut + +sub retriable { + my $self = shift; -$Id: cust_pay_batch.pm,v 1.4 2001-10-30 19:05:27 ivan Exp $ + local $SIG{HUP} = 'IGNORE'; #Hmm + local $SIG{INT} = 'IGNORE'; + local $SIG{QUIT} = 'IGNORE'; + local $SIG{TERM} = 'IGNORE'; + local $SIG{TSTP} = 'IGNORE'; + local $SIG{PIPE} = 'IGNORE'; + + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + my $cust_bill = qsearchs('cust_bill', { 'invnum' => $self->invnum } ) + or return "event $self->eventnum references nonexistant invoice $self->invnum"; + + warn "cust_pay_batch->retriable working with self of " . $self->paybatchnum . " and invnum of " . $self->invnum; + my @cust_bill_event = + sort { $a->part_bill_event->seconds <=> $b->part_bill_event->seconds } + grep { + $_->part_bill_event->eventcode =~ /\$cust_bill->batch_card/ + && $_->status eq 'done' + && ! $_->statustext + } + $cust_bill->cust_bill_event; + # complain loudly if scalar(@cust_bill_event) > 1 ? + my $error = $cust_bill_event[0]->retriable; + if ($error ) { + # gah, even with transactions. + $dbh->commit if $oldAutoCommit; #well. + return "error marking invoice event retriable: $error"; + } + ''; +} + +=back =head1 BUGS