don't generate invoices for COMP customers
[freeside.git] / FS / FS / cust_bill_pay.pm
index 6d08b59..7abbe9a 100644 (file)
@@ -1,13 +1,18 @@
-package cust_bill_pay;
+package FS::cust_bill_pay;
 
 use strict;
 
 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,72 +70,18 @@ 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 ( $pay_total > $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 ( $bill_total > $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
 
 =item delete
 
-Currently unimplemented (accounting reasons).
+Deletes this payment application, unless the closed flag for the parent payment
+(see L<FS::cust_pay>) is set.
 
 =cut
 
 sub delete {
 
 =cut
 
 sub delete {
-  return "Can't (yet?) delete cust_bill_pay records!";
+  my $self = shift;
+  return "Can't delete application for closed payment"
+    if $self->cust_pay->closed =~ /^Y/i;
+  $self->SUPER::delete(@_);
 }
 
 =item replace OLD_RECORD
 }
 
 =item replace OLD_RECORD
@@ -156,16 +107,31 @@ sub check {
   my $error = 
     $self->ut_numbern('billpaynum')
     || $self->ut_number('invnum')
   my $error = 
     $self->ut_numbern('billpaynum')
     || $self->ut_number('invnum')
-    || $self->ut_numner('paynum')
+    || $self->ut_number('paynum')
     || $self->ut_money('amount')
     || $self->ut_numbern('_date')
   ;
   return $error if $error;
 
     || $self->ut_money('amount')
     || $self->ut_numbern('_date')
   ;
   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;
 
+  return "Cannot apply more than remaining value of invoice"
+    unless $self->amount <= $cust_bill->owed;
 
 
-  ''; #no error
+  return "Cannot apply more than remaining value of payment"
+    unless $self->amount <= $cust_pay->unapplied;
+
+  $self->SUPER::check;
 }
 
 =item cust_pay 
 }
 
 =item cust_pay 
@@ -176,14 +142,21 @@ Returns the payment (see L<FS::cust_pay>)
 
 sub cust_pay {
   my $self = shift;
 
 sub cust_pay {
   my $self = shift;
-  qsearchs( 'cust_pay', { 'invnum' => $self->invnum } );
+  qsearchs( 'cust_pay', { 'paynum' => $self->paynum } );
 }
 
 }
 
-=back
+=item cust_bill 
 
 
-=head1 VERSION
+Returns the invoice (see L<FS::cust_bill>)
 
 
-$Id: cust_bill_pay.pm,v 1.3 2001-09-02 01:27:11 ivan Exp $
+=cut
+
+sub cust_bill {
+  my $self = shift;
+  qsearchs( 'cust_bill', { 'invnum' => $self->invnum } );
+}
+
+=back
 
 =head1 BUGS
 
 
 =head1 BUGS