refund deletion
authorjeff <jeff>
Mon, 8 Jan 2007 17:36:53 +0000 (17:36 +0000)
committerjeff <jeff>
Mon, 8 Jan 2007 17:36:53 +0000 (17:36 +0000)
FS/FS/AccessRight.pm
FS/FS/Conf.pm
FS/FS/cust_credit_refund.pm
FS/FS/cust_pay_refund.pm
FS/FS/cust_refund.pm
httemplate/misc/delete-cust_refund.cgi [new file with mode: 0755]
httemplate/view/cust_main/payment_history.html

index 4a6da08..038cb41 100644 (file)
@@ -138,6 +138,8 @@ assigned to users and/or groups.
 
   'Delete payment', #aka. deletepayments - Enable deletion of unclosed payments. Be very careful! Only delete payments that were data-entry errors, not adjustments. Optionally specify one or more comma-separated email addresses to be notified when a payment is deleted.
 
+  'Delete refund',
+
 ###
 # customer credit rights
 ###
index f2fda80..0d680b2 100644 (file)
@@ -496,6 +496,13 @@ httemplate/docs/config.html
   },
 
   {
+    'key'         => 'deleterefunds',
+    'section'     => 'billing',
+    'description' => 'Enable deletion of unclosed refunds.  Be very careful!  Only delete refunds that were data-entry errors, not adjustments.',
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'unapplypayments',
     'section'     => 'deprecated',
     'description' => '<B>DEPRECATED</B>, now controlled by ACLs.  Used to enable "unapplication" of unclosed payments.',
index 36c77aa..f237efe 100644 (file)
@@ -70,20 +70,27 @@ otherwise returns false.
 
 sub insert {
   my $self = shift;
-  my $error = $self->SUPER::insert;
-  return $error if $error;
-
-  '';
+  return "Can't apply refund to closed credit"
+    if $self->cust_credit->closed =~ /^Y/i;
+  return "Can't apply credit to closed refund"
+    if $self->cust_refund->closed =~ /^Y/i;
+  $self->SUPER::insert(@_);
 }
 
 =item delete
 
-Currently unimplemented (accounting reasons).
+Remove this cust_credit_refund from the database.  If there is an error, 
+returns the error, otherwise returns false.
 
 =cut
 
 sub delete {
-  return "Can't (yet?) delete cust_credit_refund records!";
+  my $self = shift;
+  return "Can't remove refund from closed credit"
+    if $self->cust_credit->closed =~ /^Y/i;
+  return "Can't remove credit from closed refund"
+    if $self->cust_refund->closed =~ /^Y/i;
+  $self->SUPER::delete(@_);
 }
 
 =item replace OLD_RECORD
index 15e0e53..cb9dbce 100644 (file)
@@ -73,15 +73,26 @@ sub table { 'cust_pay_refund'; }
 Adds this cust_pay_refund to the database.  If there is an error, returns the
 error, otherwise returns false.
 
+=cut
+
+sub insert {
+  my $self = shift;
+  return "Can't apply refund to closed payment"
+    if $self->cust_pay->closed =~ /^Y/i;
+  return "Can't apply payment to closed refund"
+    if $self->cust_refund->closed =~ /^Y/i;
+  $self->SUPER::insert(@_);
+}
+
 =item delete
 
 =cut
 
 sub delete {
   my $self = shift;
-  return "Can't apply refund to closed payment"
+  return "Can't remove refund from closed payment"
     if $self->cust_pay->closed =~ /^Y/i;
-  return "Can't apply closed refund"
+  return "Can't remove payment from closed refund"
     if $self->cust_refund->closed =~ /^Y/i;
   $self->SUPER::delete(@_);
 }
index 3f17f9a..9cd9bf8 100644 (file)
@@ -166,14 +166,52 @@ sub insert {
 
 =item delete
 
-Currently unimplemented (accounting reasons).
+Unless the closed flag is set, deletes this refund and all associated
+applications (see L<FS::cust_credit_refund> and L<FS::cust_pay_refund>).
 
 =cut
 
 sub delete {
   my $self = shift;
   return "Can't delete closed refund" if $self->closed =~ /^Y/i;
-  $self->SUPER::delete(@_);
+
+  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;
+
+  foreach my $cust_credit_refund ( $self->cust_credit_refund ) {
+    my $error = $cust_credit_refund->delete;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
+  foreach my $cust_pay_refund ( $self->cust_pay_refund ) {
+    my $error = $cust_pay_refund->delete;
+    if ( $error ) {
+      $dbh->rollback if $oldAutoCommit;
+      return $error;
+    }
+  }
+
+  my $error = $self->SUPER::delete(@_);
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
+  $dbh->commit or die $dbh->errstr if $oldAutoCommit;
+
+  '';
+
 }
 
 =item replace OLD_RECORD
diff --git a/httemplate/misc/delete-cust_refund.cgi b/httemplate/misc/delete-cust_refund.cgi
new file mode 100755 (executable)
index 0000000..3e44560
--- /dev/null
@@ -0,0 +1,17 @@
+%
+%
+%#untaint refundnum
+%my($query) = $cgi->keywords;
+%$query =~ /^(\d+)$/ || die "Illegal refundnum";
+%my $refundnum = $1;
+%
+%my $cust_refund = qsearchs('cust_refund',{'refundnum'=>$refundnum});
+%my $custnum = $cust_refund->custnum;
+%
+%my $error = $cust_refund->delete;
+%eidiot($error) if $error;
+%
+%print $cgi->redirect($p. "view/cust_main.cgi?". $custnum);
+%
+%
+
index a23ca9a..43c55e8 100644 (file)
 %  $payby =~ s/^CHEK$/Electronic check /;
 %  $payby =~ s/^(CARD|COMP)$/$1 /;
 %
+%  my $delete = '';
+%  if ( $cust_refund->closed !~ /^Y/i
+%       && $conf->exists('deleterefunds')
+%       && $curuser->access_right('Delete refund')
+%     )
+%  {
+%    $delete = qq! (<A HREF="javascript:areyousure('!.
+%              qq!${p}misc/delete-cust_refund.cgi?!. $cust_refund->refundnum.
+%              qq!', 'Are you sure you want to delete this refund?')"!.
+%              qq! TITLE="Delete this refund from the database completely - not recommended"!.
+%              qq!>delete</A>)!;
+%  }
+%
 %  push @history, {
 %    'date'   => $cust_refund->_date,
-%    'desc'   => "Refund ($payby$payinfo) by ". $cust_refund->otaker,
+%    'desc'   => "Refund ($payby$payinfo) by ". $cust_refund->otaker. "<BR>".
+%                $delete,
 %    'refund' => $cust_refund->refund,
 %  };
 %