=item payby - `CARD' (credit cards), `BILL' (billing), or `COMP' (free)
-=item payinfo - card number, P.O.#, or comp issuer (4-8 lowercase alphanumerics; think username)
+=item payinfo - card number, check #, or comp issuer (4-8 lowercase alphanumerics; think username), respectively
=item paybatch - text field for tracking card processing
+=item closed - books closed flag, empty or `Y'
+
=back
=head1 METHODS
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
- my $cust_main = qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
- my $old_balance = $cust_main->balance;
-
- my $error = $self->check;
- return $error if $error;
-
if ( $self->invnum ) {
my $cust_bill = qsearchs('cust_bill', { 'invnum' => $self->invnum } )
or do {
$self->custnum($cust_bill->custnum );
}
+ my $cust_main = qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
+ my $old_balance = $cust_main->balance;
+
+ my $error = $self->check;
+ return $error if $error;
+
$error = $self->SUPER::insert;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
}
}
+ if ( $self->paybatch =~ /^webui-/ ) {
+ my @cust_pay = qsearch('cust_pay', {
+ 'custnum' => $self->custnum,
+ 'paybatch' => $self->paybatch,
+ } );
+ if ( scalar(@cust_pay) > 1 ) {
+ $dbh->rollback if $oldAutoCommit;
+ return "a payment with webui token ". $self->paybatch. " already exists";
+ }
+ }
+
$dbh->commit or die $dbh->errstr if $oldAutoCommit;
#false laziness w/ cust_credit::insert
'_date' => $self->_date,
};
$error = $cust_bill_pay->insert;
- if ( $error ) {
+ if ( $error =~
+ /total cust_bill_pay.amount and cust_credit_bill.amount .* for invnum .* greater than cust_bill.charged/ ) {
+ #warn $error;
+ my $cust_bill = qsearchs( 'cust_bill', { 'invnum' => $self->invnum } );
+ $new->custnum($cust_bill->custnum);
+ } elsif ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error;
+ } else {
+ $new->custnum($cust_bill_pay->cust_bill->custnum);
}
- $new->custnum($cust_bill_pay->cust_bill->custnum);
} else {
die;
}
=item delete
-Currently unimplemented (accounting reasons).
+Deletes this payment and all associated applications (see L<FS::cust_bill_pay>),
+unless the closed flag is set.
=cut
sub delete {
- return "Can't (yet?) delete cust_pay records!";
+ my $self = shift;
+ return "Can't delete closed payment" if $self->closed =~ /^Y/i;
+
+ local $SIG{HUP} = 'IGNORE';
+ 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;
+
+ foreach my $cust_bill_pay ( $self->cust_bill_pay ) {
+ my $error = $cust_bill_pay->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+
+ my $error = $self->SUPER::delete(@_);
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+ '';
+
}
=item replace OLD_RECORD
|| $self->ut_money('paid')
|| $self->ut_numbern('_date')
|| $self->ut_textn('paybatch')
+ || $self->ut_enum('closed', [ '', 'Y' ])
;
return $error if $error;
+ return "paid must be > 0 " if $self->paid <= 0;
+
return "unknown cust_main.custnum: ". $self->custnum
unless $self->invnum
|| qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
$self->payby =~ /^(CARD|BILL|COMP)$/ or return "Illegal payby";
$self->payby($1);
+ #false laziness with cust_refund::check
if ( $self->payby eq 'CARD' ) {
my $payinfo = $self->payinfo;
$payinfo =~ s/\D//g;
=head1 VERSION
-$Id: cust_pay.pm,v 1.8 2001-10-09 23:10:16 ivan Exp $
+$Id: cust_pay.pm,v 1.17 2002-02-10 18:56:49 ivan Exp $
=head1 BUGS