event refactor, landing on HEAD!
[freeside.git] / FS / FS / cust_credit.pm
index 90f9b59..e07461d 100644 (file)
@@ -2,13 +2,16 @@ package FS::cust_credit;
 
 use strict;
 use vars qw( @ISA $conf $unsuspendauto );
+use Date::Format;
 use FS::UID qw( dbh getotaker );
+use FS::Misc qw(send_email);
 use FS::Record qw( qsearch qsearchs );
+use FS::cust_main_Mixin;
 use FS::cust_main;
 use FS::cust_refund;
 use FS::cust_credit_bill;
 
-@ISA = qw( FS::Record );
+@ISA = qw( FS::cust_main_Mixin FS::Record );
 
 #ask FS::UID to run this stuff for us later
 $FS::UID::callback{'FS::cust_credit'} = sub { 
@@ -73,6 +76,12 @@ Creates a new credit.  To add the credit to the database, see L<"insert">.
 =cut
 
 sub table { 'cust_credit'; }
+sub cust_linked { $_[0]->cust_main_custnum; } 
+sub cust_unlinked_msg {
+  my $self = shift;
+  "WARNING: can't find cust_main.custnum ". $self->custnum.
+  ' (cust_credit.crednum '. $self->crednum. ')';
+}
 
 =item insert
 
@@ -104,6 +113,8 @@ sub insert {
     return "error inserting $self: $error";
   }
 
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
   #false laziness w/ cust_credit::insert
   if ( $unsuspendauto && $old_balance && $cust_main->balance <= 0 ) {
     my @errors = $cust_main->unsuspend;
@@ -123,10 +134,13 @@ sub insert {
 
 =item delete
 
-Currently unimplemented.
+Unless the closed flag is set, deletes this credit and all associated
+applications (see L<FS::cust_credit_bill>).  In most cases, you want to use
+the void method instead to leave a record of the deleted credit.
 
 =cut
 
+# very similar to FS::cust_pay::delete
 sub delete {
   my $self = shift;
   return "Can't delete closed credit" if $self->closed =~ /^Y/i;
@@ -150,6 +164,14 @@ sub delete {
     }
   }
 
+  foreach my $cust_credit_refund ( $self->cust_credit_refund ) {
+    my $error = $cust_credit_refund->delete;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
   my $error = $self->SUPER::delete(@_);
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
@@ -158,7 +180,7 @@ sub delete {
 
   if ( $conf->config('deletecredits') ne '' ) {
 
-    my $cust_main = qsearchs('cust_main',{ 'custnum' => $self->custnum });
+    my $cust_main = $self->cust_main;
 
     my $error = send_email(
       'from'    => $conf->config('invoice_from'), #??? well as good as any
@@ -192,8 +214,7 @@ sub delete {
 
 =item replace OLD_RECORD
 
-Credits may not be modified; there would then be no record the credit was ever
-posted.
+You can, but probably shouldn't modify credits... 
 
 =cut
 
@@ -298,12 +319,57 @@ sub credited {
   sprintf( "%.2f", $amount );
 }
 
+=item cust_main
+
+Returns the customer (see L<FS::cust_main>) for this credit.
+
+=cut
+
+sub cust_main {
+  my $self = shift;
+  qsearchs( 'cust_main', { 'custnum' => $self->custnum } );
+}
+
+
+=back
+
+=head1 CLASS METHODS
+
+=over 4
+
+=item credited_sql
+
+Returns an SQL fragment to retreive the unapplied amount.
+
+=cut
+
+sub credited_sql {
+  #my $class = shift;
+
+  "amount
+        - COALESCE(
+                    ( SELECT SUM(amount) FROM cust_credit_refund
+                        WHERE cust_credit.crednum = cust_credit_refund.crednum )
+                    ,0
+                  )
+        - COALESCE(
+                    ( SELECT SUM(amount) FROM cust_credit_bill
+                        WHERE cust_credit.crednum = cust_credit_bill.crednum )
+                    ,0
+                  )
+  ";
+
+}
+
 =back
 
 =head1 BUGS
 
 The delete method.  The replace method.
 
+B<credited> and B<credited_sql> should probably be called B<unapplied> and
+B<unapplied_sql>.
+
 =head1 SEE ALSO
 
 L<FS::Record>, L<FS::cust_credit_refund>, L<FS::cust_refund>,