From bb7e827141c9ed68f30765c9ca2ddcd1d760ad2d Mon Sep 17 00:00:00 2001 From: Ivan Kohler Date: Fri, 9 Nov 2018 12:36:52 -0800 Subject: [PATCH] delete fees, RT#81713 --- FS/FS/AccessRight.pm | 2 + FS/FS/cust_bill_pkg.pm | 14 +++++ FS/FS/cust_event_fee.pm | 105 ++++++++++++++++++++++++++++++++++ httemplate/misc/delete_fees.cgi | 9 +++ httemplate/search/cust_event_fee.html | 71 ++++++----------------- 5 files changed, 147 insertions(+), 54 deletions(-) create mode 100644 httemplate/misc/delete_fees.cgi diff --git a/FS/FS/AccessRight.pm b/FS/FS/AccessRight.pm index 2024d948d..87836279f 100644 --- a/FS/FS/AccessRight.pm +++ b/FS/FS/AccessRight.pm @@ -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=>'Delete fees', }, #], # ### @@ -471,6 +472,7 @@ sub default_superuser_rights { 'Backdate credit', 'View legacy typeset statments', 'Detach customer package', + 'Delete fees', ); no warnings 'uninitialized'; diff --git a/FS/FS/cust_bill_pkg.pm b/FS/FS/cust_bill_pkg.pm index 1262c3874..d0d62bd6a 100644 --- a/FS/FS/cust_bill_pkg.pm +++ b/FS/FS/cust_bill_pkg.pm @@ -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; diff --git a/FS/FS/cust_event_fee.pm b/FS/FS/cust_event_fee.pm index 7b448dd18..1896b52c9 100644 --- a/FS/FS/cust_event_fee.pm +++ b/FS/FS/cust_event_fee.pm @@ -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 FS::cust_event; =head1 NAME @@ -72,6 +73,36 @@ otherwise returns false. 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, @@ -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 +=head1 SUBROUTINES + +=over 4 + +=item process_delete + =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) = @_; diff --git a/httemplate/misc/delete_fees.cgi b/httemplate/misc/delete_fees.cgi new file mode 100644 index 000000000..834479765 --- /dev/null +++ b/httemplate/misc/delete_fees.cgi @@ -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; + + diff --git a/httemplate/search/cust_event_fee.html b/httemplate/search/cust_event_fee.html index d21a3c3d1..242eed22d 100644 --- a/httemplate/search/cust_event_fee.html +++ b/httemplate/search/cust_event_fee.html @@ -73,7 +73,7 @@ my $link_cust = sub { <%shared> my @scalars = qw(); #qw( agentnum status custnum invnum pkgnum failed ); -my @lists = qw( eventpart ); +my @lists = qw( eventpart billpkgnum ); my %search; <%init> @@ -97,20 +97,9 @@ my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); $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', @@ -131,40 +120,26 @@ my $sql_query = { }; 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 = []; - -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'); <%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, - $action.'_form', + 'delete_fees_form', [ @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' => + }, &> -
+ % foreach my $param (@scalars, 'beginning', 'ending') { % } @@ -174,26 +149,14 @@ if ( $curuser->access_right('Delete fees') ) { % } % }
-% } # foreach $action -- 2.11.0