X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2Fcust_main_Mixin.pm;h=88b1bd06ddf5db264316647052af0b67d97f15a4;hb=810f6c01aa6882f6893d4cbb061d1adafaf79638;hp=ccd1b84c9ff6dd7e33bb5cb3f12181e151d1edf8;hpb=057ae504915d912bc60df87c9914e11752edf680;p=freeside.git diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm index ccd1b84c9..88b1bd06d 100644 --- a/FS/FS/cust_main_Mixin.pm +++ b/FS/FS/cust_main_Mixin.pm @@ -358,7 +358,7 @@ Queue job for status updates. Required. =item search -Hashref of params to the L method. Required. +Hashref of params to the L method. Required. =item msgnum @@ -465,8 +465,7 @@ sub email_search_result { next; # unlinked object; nothing else we can do } - my %to = {}; - if ($to) { $to{'to'} = $to; } + my %to = ( to => $to ) if $to; if ( $msg_template ) { # Now supports other context objects. @@ -578,6 +577,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, @@ -716,7 +811,9 @@ sub unsuspend_balance { } my $balance = $cust_main->balance || 0; if ($balance <= $maxbalance) { - my @errors = $cust_main->unsuspend; + my @errors = $cust_main->unsuspend( + 'reason_type' => $conf->config('unsuspend_reason_type') + ); # side-fx with nested transactions? upstack rolls back? warn "WARNING:Errors unsuspending customer ". $cust_main->custnum. ": ". join(' / ', @errors)