From 7afd80e3dfcaa34b04f693c40949d7408f7a7ac1 Mon Sep 17 00:00:00 2001 From: Christopher Burger Date: Fri, 12 Apr 2019 13:16:57 -0400 Subject: [PATCH] RT# 79913 - added ability to mass transfer customers to new agent --- FS/FS/cust_main_Mixin.pm | 96 +++++++++++++++++++++++++++++++++++ httemplate/elements/menubar.html | 7 ++- httemplate/elements/select-agent.html | 3 +- httemplate/search/cust_main.cgi | 4 ++ httemplate/search/cust_main.html | 9 ++++ 5 files changed, 117 insertions(+), 2 deletions(-) diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm index e31a31031..b5434e516 100644 --- a/FS/FS/cust_main_Mixin.pm +++ b/FS/FS/cust_main_Mixin.pm @@ -599,6 +599,102 @@ sub process_email_search_result { } +sub customer_agent_transfer_search_result { + my($class, $param) = @_; + + my $newagentnum = $param->{agentnum}; + my $error = ''; + my @customers; + + my $job = delete $param->{'job'} + or die "customer_agent_transfer_search_result must run from the job queue.\n"; + + my $list = $param->{'list'}; + + if ($param->{'search'}) { + my $sql_query = $class->search($param->{'search'}); + $sql_query->{'select'} = $sql_query->{'table'} . '.*'; + @customers = qsearch($sql_query); + } + + @customers = @$list if !@customers && $list; + my $num_cust = scalar(@customers); + + my( $num, $last, $min_sec ) = (0, time, 5); #progresbar + + # Transactionize + my $oldAutoCommit = $FS::UID::AutoCommit; + local $FS::UID::AutoCommit = 0; + my $dbh = dbh; + + foreach my $obj ( @customers ) { + + #progressbar first, so that the count is right + $num++; + if ( time - $min_sec > $last ) { + my $error = $job->update_statustext( + int( 100 * $num / $num_cust ) + ); + die $error if $error; + $last = time; + } + + my $cust_main = $obj->cust_main; + if ( !$cust_main ) { + next; # unlinked object nothing to do + } + + $cust_main->agentnum($newagentnum); + $error = $cust_main->replace; + + if ( $error ) { + $dbh->rollback if $oldAutoCommit; + return "transfering to new agent: $error"; + } + + } # foreach $obj + + $dbh->commit if $oldAutoCommit; + return ''; +} + +=item process_customer_agent_transfer_search_result + +Mass transfers customers to new agent. + +Is Transactionized so entire list transfers or none. + +excepts either a list of cust_main objects in the base64 encoded cgi param list +or a list of search fields in the base64 encoded cgi param search. + +=cut + +sub process_customer_agent_transfer_search_result { + my $job = shift; + + my $param = shift; + warn Dumper($param) if $DEBUG; + + $param->{'job'} = $job; + + $param->{'search'} = thaw(decode_base64($param->{'search'})) + or die "process_customer_agent_transfer_search_result.\n" if $param->{'search'}; + + $param->{'list'} = thaw(decode_base64($param->{'list'})) + or die "process_customer_agent_transfer_search_result.\n" if $param->{'list'};; + + my $table = $param->{'table'} + or die "process_customer_agent_transfer_search_result.\n"; + + eval "use FS::$table;"; + die "error loading FS::$table: $@\n" if $@; + + my $error = "FS::$table"->customer_agent_transfer_search_result( $param ); + + die $error if $error; + +} + =item conf Returns a configuration handle (L) set to the customer's locale, diff --git a/httemplate/elements/menubar.html b/httemplate/elements/menubar.html index c14904337..ffe83ec57 100644 --- a/httemplate/elements/menubar.html +++ b/httemplate/elements/menubar.html @@ -52,7 +52,12 @@ while (@_) { } - push @html, qq!$item!; + if ($item eq 'popup') { + push @html, $url; + } + else { + push @html, qq!$item!; + } } diff --git a/httemplate/elements/select-agent.html b/httemplate/elements/select-agent.html index fd2c57eac..2bd0095da 100644 --- a/httemplate/elements/select-agent.html +++ b/httemplate/elements/select-agent.html @@ -3,7 +3,7 @@ 'name_col' => 'agent', 'value' => $agentnum || '', 'agent_virt' => 1, - 'empty_label' => emt('all'), + 'empty_label' => $empty_label, 'hashref' => { 'disabled' => '' }, 'order_by' => ' ORDER BY agent', 'disable_empty' => $disable_empty, @@ -18,6 +18,7 @@ $opt{'records'} = delete $opt{'agents'} if $opt{'agents'}; my $curuser = $FS::CurrentUser::CurrentUser; +my $empty_label = $opt{'empty_label'} ? $opt{'empty_label'} : 'all'; my $disable_empty = 0; if ( $opt{'agent_null_right'} ) { if ( $curuser->access_right($opt{'agent_null_right'}) ) { diff --git a/httemplate/search/cust_main.cgi b/httemplate/search/cust_main.cgi index cce4f0d7d..24d49c588 100755 --- a/httemplate/search/cust_main.cgi +++ b/httemplate/search/cust_main.cgi @@ -38,6 +38,10 @@ ( <% mt("$linklabel canceled customers") |h %> ) % } +% unless ($cgi->param('browse')) { + <& /elements/agent_transfer_link.html, {'list' => \@cust_main} &> +% } + % if ( $cgi->param('referral_custnum') ) { % $cgi->param('referral_custnum') =~ /^(\d+)$/ % or errorpage(emt("Illegal referral_custnum")); diff --git a/httemplate/search/cust_main.html b/httemplate/search/cust_main.html index 4c7fa14aa..83ca7217d 100755 --- a/httemplate/search/cust_main.html +++ b/httemplate/search/cust_main.html @@ -161,4 +161,13 @@ if ( $FS::CurrentUser::CurrentUser->access_right('Bulk send customer notices') ) "${p}misc/email-customers.html?table=cust_main&classnums=invoice&$query"; } +### +# agent transfer link +### + +my $agent_transfer_link = include('/elements/agent_transfer_link.html', { + 'search' => \%search_hash, +}); +push @$menubar, emt('popup') => '
'.$agent_transfer_link.'
'; + -- 2.11.0