X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_main_Mixin.pm;h=921ef8f5e490038e702e773c1316ac9cce980b59;hp=cceaa4bc70a0576fa616aecbdd372869f15fe919;hb=5224948de7b1cbc90a2bc7f3f430bc260dd7371e;hpb=d45dd4a826f314fb5459747590d3e11cd80c211f diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm index cceaa4bc7..921ef8f5e 100644 --- a/FS/FS/cust_main_Mixin.pm +++ b/FS/FS/cust_main_Mixin.pm @@ -372,7 +372,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 @@ -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, @@ -660,13 +756,13 @@ sub time2str_local { $self->{_date_format} ||= {}; if (!exists($self->{_dh})) { - my $cust_main = $self->cust_main; - my $locale = $cust_main->locale if $cust_main; - $locale ||= 'en_US'; + my $locale = $self->cust_main->locale if $self->cust_main; + $locale ||= FS::Conf->new->config('locale') || 'en_US'; + my %info = FS::Locales->locale_info($locale); - my $dh = eval { Date::Language->new($info{'name'}) } || - Date::Language->new(); # fall back to English - $self->{_dh} = $dh; + + $self->{_dh} = eval { Date::Language->new($info{'name'}) } + || Date::Language->new(); # fall back to English } if ($format eq 'short') { @@ -737,7 +833,11 @@ 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') + ); + + push @errors, $cust_main->release_hold if $conf->exists('unsuspend-unhold'); # side-fx with nested transactions? upstack rolls back? warn "WARNING:Errors unsuspending customer ". $cust_main->custnum. ": ". join(' / ', @errors)