don't generate invoices for COMP customers
[freeside.git] / FS / FS / cust_bill_pay.pm
index 913704b..7abbe9a 100644 (file)
@@ -1,13 +1,18 @@
 package FS::cust_bill_pay;
 
 use strict;
 package FS::cust_bill_pay;
 
 use strict;
-use vars qw( @ISA );
+use vars qw( @ISA $conf );
 use FS::Record qw( qsearch qsearchs dbh );
 use FS::cust_bill;
 use FS::cust_pay;
 
 @ISA = qw( FS::Record );
 
 use FS::Record qw( qsearch qsearchs dbh );
 use FS::cust_bill;
 use FS::cust_pay;
 
 @ISA = qw( FS::Record );
 
+#ask FS::UID to run this stuff for us later
+FS::UID->install_callback( sub { 
+  $conf = new FS::Conf;
+} );
+
 =head1 NAME
 
 FS::cust_bill_pay - Object methods for cust_bill_pay records
 =head1 NAME
 
 FS::cust_bill_pay - Object methods for cust_bill_pay records
@@ -65,64 +70,6 @@ sub table { 'cust_bill_pay'; }
 Adds this record to the database.  If there is an error, returns the error,
 otherwise returns false.
 
 Adds this record to the database.  If there is an error, returns the error,
 otherwise returns false.
 
-=cut
-
-sub insert {
-  my $self = shift;
-
-  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;
-
-  my $error = $self->check;
-  return $error if $error;
-
-  $error = $self->SUPER::insert;
-
-  my $cust_pay = qsearchs('cust_pay', { 'paynum' => $self->paynum } ) or do {
-    $dbh->rollback if $oldAutoCommit;
-    return "unknown cust_pay.paynum: ". $self->paynum;
-  };
-
-  my $pay_total = 0;
-  $pay_total += $_ foreach map { $_->amount }
-    qsearch('cust_bill_pay', { 'paynum' => $self->paynum } );
-
-  if ( sprintf("%.2f", $pay_total) > sprintf("%.2f", $cust_pay->paid) ) {
-    $dbh->rollback if $oldAutoCommit;
-    return "total cust_bill_pay.amount $pay_total for paynum ". $self->paynum.
-           " greater than cust_pay.paid ". $cust_pay->paid;
-  }
-
-  my $cust_bill = qsearchs('cust_bill', { 'invnum' => $self->invnum } ) or do {
-    $dbh->rollback if $oldAutoCommit;
-    return "unknown cust_bill.invnum: ". $self->invnum;
-  };
-
-  my $bill_total = 0;
-  $bill_total += $_ foreach map { $_->amount }
-    qsearch('cust_bill_pay', { 'invnum' => $self->invnum } );
-  $bill_total += $_ foreach map { $_->amount } 
-    qsearch('cust_credit_bill', { 'invnum' => $self->invnum } );
-  if ( sprintf("%.2f", $bill_total) > sprintf("%.2f", $cust_bill->charged) ) {
-    $dbh->rollback if $oldAutoCommit;
-    return "total cust_bill_pay.amount and cust_credit_bill.amount $bill_total".
-           " for invnum ". $self->invnum.
-           " greater than cust_bill.charged ". $cust_bill->charged;
-  }
-
-  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
-
-  '';
-}
-
 =item delete
 
 Deletes this payment application, unless the closed flag for the parent payment
 =item delete
 
 Deletes this payment application, unless the closed flag for the parent payment
@@ -167,10 +114,24 @@ sub check {
   return $error if $error;
 
   return "amount must be > 0" if $self->amount <= 0;
   return $error if $error;
 
   return "amount must be > 0" if $self->amount <= 0;
+  
+  return "Unknown invoice"
+    unless my $cust_bill =
+      qsearchs( 'cust_bill', { 'invnum' => $self->invnum } );
+
+  return "Unknown payment"
+    unless my $cust_pay = 
+      qsearchs( 'cust_pay', { 'paynum' => $self->paynum } );
 
   $self->_date(time) unless $self->_date;
 
 
   $self->_date(time) unless $self->_date;
 
-  ''; #no error
+  return "Cannot apply more than remaining value of invoice"
+    unless $self->amount <= $cust_bill->owed;
+
+  return "Cannot apply more than remaining value of payment"
+    unless $self->amount <= $cust_pay->unapplied;
+
+  $self->SUPER::check;
 }
 
 =item cust_pay 
 }
 
 =item cust_pay 
@@ -197,10 +158,6 @@ sub cust_bill {
 
 =back
 
 
 =back
 
-=head1 VERSION
-
-$Id: cust_bill_pay.pm,v 1.12 2002-02-07 22:29:34 ivan Exp $
-
 =head1 BUGS
 
 Delete and replace methods.
 =head1 BUGS
 
 Delete and replace methods.