summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristopher Burger <burgerc@freeside.biz>2019-04-12 13:16:57 -0400
committerChristopher Burger <burgerc@freeside.biz>2019-04-12 13:16:57 -0400
commit7afd80e3dfcaa34b04f693c40949d7408f7a7ac1 (patch)
treecdfb8eee2c2668d1b02d6d9c5671eca9e959143f
parent7ff902ccf499a8a2e8598d653dd958cf6a364b26 (diff)
RT# 79913 - added ability to mass transfer customers to new agent
-rw-r--r--FS/FS/cust_main_Mixin.pm96
-rw-r--r--httemplate/elements/menubar.html7
-rw-r--r--httemplate/elements/select-agent.html3
-rwxr-xr-xhttemplate/search/cust_main.cgi4
-rwxr-xr-xhttemplate/search/cust_main.html9
5 files changed, 117 insertions, 2 deletions
diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm
index e31a310..b5434e5 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<FS::Conf>) set to the customer's locale,
diff --git a/httemplate/elements/menubar.html b/httemplate/elements/menubar.html
index c149043..ffe83ec 100644
--- a/httemplate/elements/menubar.html
+++ b/httemplate/elements/menubar.html
@@ -52,7 +52,12 @@ while (@_) {
}
- push @html, qq!<A HREF="$url_base$url" $style>$item</A>!;
+ if ($item eq 'popup') {
+ push @html, $url;
+ }
+ else {
+ push @html, qq!<A HREF="$url_base$url" $style>$item</A>!;
+ }
}
diff --git a/httemplate/elements/select-agent.html b/httemplate/elements/select-agent.html
index fd2c57e..2bd0095 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 cce4f0d..24d49c5 100755
--- a/httemplate/search/cust_main.cgi
+++ b/httemplate/search/cust_main.cgi
@@ -38,6 +38,10 @@
( <a href="<% $cgi->self_url %>"><% mt("$linklabel canceled customers") |h %></a> )
% }
+% 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 4c7fa14..83ca721 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') => '<div style="display:inline-block">'.$agent_transfer_link.'</div>';
+
</%init>