don't generate invoices for COMP customers
[freeside.git] / FS / FS / cust_bill_pay.pm
index 045a949..7abbe9a 100644 (file)
@@ -1,12 +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::Record qw( qsearch qsearchs dbh );
-#use FS::cust_bill
+use FS::cust_bill;
+use FS::cust_pay;
 
 @ISA = qw( FS::Record );
 
 
 @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
@@ -64,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
@@ -155,29 +107,63 @@ 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;
 }
 
 }
 
-=back
+=item cust_pay 
+
+Returns the payment (see L<FS::cust_pay>)
+
+=cut
+
+sub cust_pay {
+  my $self = shift;
+  qsearchs( 'cust_pay', { 'paynum' => $self->paynum } );
+}
 
 
-=head1 VERSION
+=item cust_bill 
 
 
-$Id: cust_bill_pay.pm,v 1.1 2001-09-01 20:11:07 ivan Exp $
+Returns the invoice (see L<FS::cust_bill>)
+
+=cut
+
+sub cust_bill {
+  my $self = shift;
+  qsearchs( 'cust_bill', { 'invnum' => $self->invnum } );
+}
+
+=back
 
 =head1 BUGS
 
 Delete and replace methods.
 
 
 =head1 BUGS
 
 Delete and replace methods.
 
-cust_credit_bill isn't checked yet (uncomment around line 111)
+the checks for over-applied payments could be better done like the ones in
+cust_bill_credit
 
 =head1 SEE ALSO
 
 
 =head1 SEE ALSO