event refactor, landing on HEAD!
[freeside.git] / FS / FS / cust_credit.pm
index 9cc92d2..e07461d 100644 (file)
@@ -134,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;
@@ -161,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;
@@ -169,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
@@ -203,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
 
@@ -323,10 +333,43 @@ sub cust_main {
 
 =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>,