delete fees, RT#81713
authorIvan Kohler <ivan@freeside.biz>
Fri, 9 Nov 2018 20:36:52 +0000 (12:36 -0800)
committerIvan Kohler <ivan@freeside.biz>
Fri, 9 Nov 2018 20:36:52 +0000 (12:36 -0800)
FS/FS/AccessRight.pm
FS/FS/cust_bill_pkg.pm
FS/FS/cust_event_fee.pm
httemplate/misc/delete_fees.cgi [new file with mode: 0644]
httemplate/search/cust_event_fee.html

index 2024d94..8783627 100644 (file)
@@ -352,6 +352,7 @@ tie my %rights, 'Tie::IxHash',
     { rightname=>'Import', global=>1 }, #some of these are ag-virt'ed now?  give em their own ACLs
     { rightname=>'Export', global=>1 },
     { rightname=> 'Edit rating data', desc=>'Delete CDRs', global=>1 },
     { rightname=>'Import', global=>1 }, #some of these are ag-virt'ed now?  give em their own ACLs
     { rightname=>'Export', global=>1 },
     { rightname=> 'Edit rating data', desc=>'Delete CDRs', global=>1 },
+    { rightname=>'Delete fees', },
   #],
   #
   ###
   #],
   #
   ###
@@ -471,6 +472,7 @@ sub default_superuser_rights {
     'Backdate credit',
     'View legacy typeset statments',
     'Detach customer package',
     'Backdate credit',
     'View legacy typeset statments',
     'Detach customer package',
+    'Delete fees',
   );
 
   no warnings 'uninitialized';
   );
 
   no warnings 'uninitialized';
index 1262c38..d0d62bd 100644 (file)
@@ -491,6 +491,20 @@ sub delete {
     }
   }
 
     }
   }
 
+  #fix the invoice amount
+
+  my $cust_bill = $self->cust_bill;
+  $cust_bill->charged( $cust_bill->charged - $self->setup - $self->recur );
+
+  #not adding a cc surcharge, but this override lets us modify charged
+  $cust_bill->{'Hash'}{'cc_surcharge_replace_hack'} = 1;
+
+  my $error = $cust_bill->replace;
+  if ( $error ) {
+    $dbh->rollback if $oldAutoCommit;
+    return $error;
+  }
+
   my $error = $self->SUPER::delete(@_);
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
   my $error = $self->SUPER::delete(@_);
   if ( $error ) {
     $dbh->rollback if $oldAutoCommit;
index 7b448dd..1896b52 100644 (file)
@@ -3,6 +3,7 @@ use base qw( FS::cust_main_Mixin FS::Record FS::FeeOrigin_Mixin );
 
 use strict;
 use FS::Record qw( qsearch dbh );
 
 use strict;
 use FS::Record qw( qsearch dbh );
+use FS::cust_event;
 
 =head1 NAME
 
 
 =head1 NAME
 
@@ -72,6 +73,36 @@ otherwise returns false.
 
 Delete this record from the database.
 
 
 Delete this record from the database.
 
+=cut
+
+sub delete {
+  my $self = shift;
+
+  my $oldAutoCommit = $FS::UID::AutoCommit;
+  local $FS::UID::AutoCommit = 0;
+  my $dbh = dbh;
+
+  my $cust_bill_pkg = $self->cust_bill_pkg;
+  if ( $cust_bill_pkg ) {
+    my $error = $cust_bill_pkg->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
 
 Replaces the OLD_RECORD with this one in the database.  If there is an error,
 =item replace OLD_RECORD
 
 Replaces the OLD_RECORD with this one in the database.  If there is an error,
@@ -194,10 +225,84 @@ sub cust_pkg {
   }
 }
 
   }
 }
 
+=item search_sql_where
+
+=cut
+
+sub search_sql_where {
+  my($class, $param) = @_;
+
+  my $where = FS::cust_event->search_sql_where( $param );
+
+  if ( $param->{'billpkgnum'} eq 'NULL' ) {
+    $where .= ' AND billpkgnum IS NULL';
+  } elsif ( $param->{'billpkgnum'} eq 'NOT NULL' ) {
+    $where .= ' AND billpkgnum IS NOT NULL';
+  }
+
+  $where;
+
+}
+
+=item join_sql
+
+=cut
+
+sub join_sql {
+  #my $class = shift;
+
+  ' LEFT JOIN cust_event USING (eventnum)
+    LEFT JOIN cust_bill_pkg USING (billpkgnum)
+    LEFT JOIN cust_bill AS fee_cust_bill USING (invnum)
+    LEFT JOIN part_fee ON (cust_event_fee.feepart = part_fee.feepart )
+  '. FS::cust_event->join_sql();
+
+}
+
 =back
 
 =back
 
+=head1 SUBROUTINES
+
+=over 4
+
+=item process_delete
+
 =cut
 
 =cut
 
+sub process_delete {
+  my( $job, $param ) = @_;
+
+  my $search_sql = FS::cust_event_fee->search_sql_where($param);
+  my $where = $search_sql ? " WHERE $search_sql" : '';
+
+  my @cust_event_fee = qsearch({
+    'table'     => 'cust_event_fee',
+    'addl_from' => FS::cust_event_fee->join_sql(),
+    'hashref'   => {},
+    'extra_sql' => $where,
+  });
+
+  my( $num, $last, $min_sec ) = (0, time, 5); #progresbar foo
+  foreach my $cust_event_fee ( @cust_event_fee ) {
+
+    my $error = $cust_event_fee->delete;
+    die $error if $error;
+
+    if ( $job ) { #progressbar foo
+      $num++;
+      if ( time - $min_sec > $last ) {
+        my $error = $job->update_statustext(
+          int( 100 * $num / scalar(@cust_event_fee) )
+        );
+        die $error if $error;
+        $last = time;
+      }
+    }
+
+  }
+
+}
+
 sub _upgrade_schema {
   my ($class, %opts) = @_;
 
 sub _upgrade_schema {
   my ($class, %opts) = @_;
 
diff --git a/httemplate/misc/delete_fees.cgi b/httemplate/misc/delete_fees.cgi
new file mode 100644 (file)
index 0000000..8344797
--- /dev/null
@@ -0,0 +1,9 @@
+<% $server->process %>
+<%init>
+
+die "access denied"
+  unless $FS::CurrentUser::CurrentUser->access_right('Delete fees');
+
+my $server = new FS::UI::Web::JSRPC 'FS::cust_event_fee::process_delete', $cgi; 
+
+</%init>
index d21a3c3..242eed2 100644 (file)
@@ -73,7 +73,7 @@ my $link_cust = sub {
 </%once>
 <%shared>
 my @scalars = qw(); #qw( agentnum status custnum invnum pkgnum failed );
 </%once>
 <%shared>
 my @scalars = qw(); #qw( agentnum status custnum invnum pkgnum failed );
-my @lists = qw( eventpart );
+my @lists = qw( eventpart billpkgnum );
 my %search;
 </%shared>
 <%init>
 my %search;
 </%shared>
 <%init>
@@ -97,20 +97,9 @@ my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi);
 $search{'beginning'} = $beginning;
 $search{'ending'}    = $ending;
 
 $search{'beginning'} = $beginning;
 $search{'ending'}    = $ending;
 
-my $where = ' WHERE '. FS::cust_event->search_sql_where( \%search );
+my $where = ' WHERE '. FS::cust_event_fee->search_sql_where( \%search );
 
 
-if ( $cgi->param('billpkgnum') eq 'NULL' ) {
-  $where .= ' AND billpkgnum IS NULL';
-} elsif ( $cgi->param('billpkgnum') eq 'NOT NULL' ) {
-  $where .= ' AND billpkgnum IS NOT NULL';
-}
-
-my $join = '
-  LEFT JOIN cust_event USING (eventnum)
-  LEFT JOIN cust_bill_pkg USING (billpkgnum)
-  LEFT JOIN cust_bill AS fee_cust_bill USING (invnum)
-  LEFT JOIN part_fee ON (cust_event_fee.feepart = part_fee.feepart )
-  '. FS::cust_event->join_sql();
+my $join = FS::cust_event_fee->join_sql();
 
 my $sql_query = {
   'table'     => 'cust_event_fee',
 
 my $sql_query = {
   'table'     => 'cust_event_fee',
@@ -131,40 +120,26 @@ my $sql_query = {
 };
 
 my $count_sql = "SELECT COUNT(*) FROM cust_event_fee $join $where";
 };
 
 my $count_sql = "SELECT COUNT(*) FROM cust_event_fee $join $where";
-warn join(',', FS::UI::Web::cust_sql_fields() );
 
 my $conf = new FS::Conf;
 
 my $menubar = [];
 
 my $conf = new FS::Conf;
 
 my $menubar = [];
-
-if ( $curuser->access_right('Delete fees') ) {
-
-#XXX delete fee link
-
-#  push @$menubar, 'Re-print these events' =>
-#                    "javascript:confirm_print_process()",
-#                  'Re-email these events' =>
-#                    "javascript:confirm_email_process()",
-#                ;
-#
-#  push @$menubar, 'Re-fax these events' =>
-#                    "javascript:confirm_fax_process()"
-#    if $conf->exists('hylafax');
-
-}
+push @$menubar, 'Delete these fees' => "javascript:confirm_delete_fees()"
+  if $curuser->access_right('Delete fees');
 
 </%init>
 <%def .init>
 
 </%init>
 <%def .init>
-% # action is part of the target URL, don't need to pass it as a param
-% foreach my $action (qw(print email fax)) {
 <& /elements/progress-init.html,
 <& /elements/progress-init.html,
-  $action.'_form',
+  'delete_fees_form',
   [ @scalars, @lists, 'beginning', 'ending' ],
   [ @scalars, @lists, 'beginning', 'ending' ],
-  "../misc/${action}_events.cgi",
-  { 'message' => "Invoices re-${action}ed" }, #would be nice to show the number of them, but...
-  $action.'_', #key
+  "../misc/delete_fees.cgi",
+  { 'message' => 'Fees deleted', #would be nice to show the number of them...
+    #what we were just displaying is gone, so where to go?
+    # woudl be nice to not keep displaying the deleted data
+    #'url'     => 
+  },
 &>
 &>
-<FORM NAME="<% $action %>_form">
+<FORM NAME="delete_fees_form">
 %   foreach my $param (@scalars, 'beginning', 'ending') {
   <INPUT TYPE="hidden" NAME="<% $param %>" VALUE="<% $search{$param} |h %>">
 %   }
 %   foreach my $param (@scalars, 'beginning', 'ending') {
   <INPUT TYPE="hidden" NAME="<% $param %>" VALUE="<% $search{$param} |h %>">
 %   }
@@ -174,26 +149,14 @@ if ( $curuser->access_right('Delete fees') ) {
 %     }
 %   }
 </FORM>
 %     }
 %   }
 </FORM>
-% } # foreach $action
 <SCRIPT TYPE="text/javascript">
 
 <SCRIPT TYPE="text/javascript">
 
-function confirm_print_process() {
-  if ( ! confirm("Are you sure you want to reprint these invoices?") ) {
+function confirm_delete_fees() {
+  if ( ! confirm("Are you sure you want to delete these fees?") ) {
     return;
   }
     return;
   }
-  print_process();
-}
-function confirm_email_process() {
-  if ( ! confirm("Are you sure you want to re-email these invoices?") ) {
-    return;
-  }
-  email_process();
-}
-function confirm_fax_process() {
-  if ( ! confirm("Are you sure you want to re-fax these invoices?") ) {
-    return;
-  }
-  fax_process();
+  process();
 }
 }
+
 </SCRIPT>
 </%def>
 </SCRIPT>
 </%def>