X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=FS%2FFS%2Fcust_main_Mixin.pm;h=ba6fda146e71bac71ae8dd927c37669ae82156e1;hp=bbba8c5f74dce21b6def0c7754dfc4e7dc2f4c35;hb=3d9bb75680d19cb00307e57f4df2ac1c3514cd85;hpb=31807e3e9acddff34011e919728c113e69ad9a26 diff --git a/FS/FS/cust_main_Mixin.pm b/FS/FS/cust_main_Mixin.pm index bbba8c5f7..ba6fda146 100644 --- a/FS/FS/cust_main_Mixin.pm +++ b/FS/FS/cust_main_Mixin.pm @@ -210,19 +210,9 @@ a customer. sub cust_status { my $self = shift; return $self->cust_unlinked_msg unless $self->cust_linked; - - #FS::cust_main::status($self) - #false laziness w/actual cust_main::status - # (make sure FS::cust_main methods are called) - for my $status (qw( prospect active inactive suspended cancelled )) { - my $method = $status.'_sql'; - my $sql = FS::cust_main->$method();; - my $numnum = ( $sql =~ s/cust_main\.custnum/?/g ); - my $sth = dbh->prepare("SELECT $sql") or die dbh->errstr; - $sth->execute( ($self->custnum) x $numnum ) - or die "Error executing 'SELECT $sql': ". $sth->errstr; - return $status if $sth->fetchrow_arrayref->[0]; - } + my $cust_main = $self->cust_main; + return $self->cust_unlinked_msg unless $cust_main; + return $cust_main->cust_status; } =item ucfirst_cust_status @@ -272,6 +262,17 @@ sub cust_statuscolor { : '000000'; } +=item agent_name + +=cut + +sub agent_name { + my $self = shift; + $self->cust_linked + ? $self->cust_main->agent_name + : $self->cust_unlinked_msg; +} + =item prospect_sql =item active_sql @@ -347,10 +348,21 @@ sub cust_search_sql { =item email_search_result HASHREF -Emails a notice to the specified customers. Customers without -invoice email destinations will be skipped. +Emails a notice to the specified customer's contact_email addresses. -Parameters: + +If the user has specified "Invoice recipients" on the send e-mail screen, +contact_email rows containing the invoice_dest flag will be included. +This option is default, if neither 'invoice' nor 'message' are present. + +If the user has specified "Message recipients" on the send e-mail screen, +contact_email rows containing the message_dest flag will be included. + +The selection is indicated by the presence of the text 'message' or +'invoice' within the to_contact_classnum argument. + + +Parameters: =over 4 @@ -360,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 @@ -383,6 +395,22 @@ HTML body Text body +=item to_contact_classnum + +This field contains a comma-separated list. This list may contain: + +- the text "invoice" indicating contacts with invoice_dest flag should + be included +- the text "message" indicating contacts with message_dest flag should + be included +- numbers representing classnum id values for email contact classes. + If any classnum are present, emails should only be sent to contact_email + addresses where contact_email.classnum contains one of these classes. + The classnum 0 also includes where contact_email.classnum IS NULL + +If neither 'invoice' nor 'message' has been specified, this method will +behave as if 'invoice' had been selected + =back Returns an error message, or false for success. @@ -401,13 +429,21 @@ use Digest::SHA qw(sha1); # for duplicate checking sub email_search_result { my($class, $param) = @_; + my $conf = FS::Conf->new; + my $send_to_domain = $conf->config('email-to-voice_domain'); + my $msgnum = $param->{msgnum}; my $from = delete $param->{from}; my $subject = delete $param->{subject}; my $html_body = delete $param->{html_body}; my $text_body = delete $param->{text_body}; + my $to_contact_classnum = delete $param->{to_contact_classnum}; + my $emailtovoice_name = delete $param->{emailtovoice_contact}; + my $error = ''; + my $to = $emailtovoice_name . '@' . $send_to_domain unless !$emailtovoice_name; + my $job = delete $param->{'job'} or die "email_search_result must run from the job queue.\n"; @@ -468,9 +504,14 @@ sub email_search_result { next; # unlinked object; nothing else we can do } + my %to = (); + if ($to) { $to{'to'} = $to; } + my $cust_msg = $msg_template->prepare( 'cust_main' => $cust_main, 'object' => $obj, + 'to_contact_classnum' => $to_contact_classnum, + %to, ); # For non-cust_main searches, we avoid duplicates based on message @@ -558,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, @@ -619,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') { @@ -665,7 +802,7 @@ sub unsuspend_balance { my $self = shift; my $cust_main = $self->cust_main; my $conf = $self->conf; - my $setting = $conf->config('unsuspend_balance'); + my $setting = $conf->config('unsuspend_balance') or return; my $maxbalance; if ($setting eq 'Zero') { $maxbalance = 0; @@ -696,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; # side-fx with nested transactions? upstack rolls back? warn "WARNING:Errors unsuspending customer ". $cust_main->custnum. ": ". join(' / ', @errors) @@ -716,4 +857,3 @@ L, L =cut 1; -