X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2FFS%2FCron%2Frt_tasks.pm;h=077f23cc6c090fbec74c3efadd6a2d4ffd26338d;hb=c63641b613e227a220b432191fe0981a0337e2ef;hp=066aeebdee0bbca3f95e93a68c8ab66563aa1d8d;hpb=29c296af24c09dc904f6fad51edbf3c5f2f085d3;p=freeside.git diff --git a/FS/FS/Cron/rt_tasks.pm b/FS/FS/Cron/rt_tasks.pm index 066aeebde..077f23cc6 100644 --- a/FS/FS/Cron/rt_tasks.pm +++ b/FS/FS/Cron/rt_tasks.pm @@ -1,7 +1,7 @@ package FS::Cron::rt_tasks; use strict; -use vars qw( @ISA @EXPORT_OK $DEBUG ); +use vars qw( @ISA @EXPORT_OK $DEBUG $conf ); use Exporter; use FS::UID qw( dbh driver_name ); use FS::Record qw(qsearch qsearchs); @@ -11,78 +11,120 @@ use FS::Conf; use Date::Parse qw(str2time); @ISA = qw( Exporter ); -@EXPORT_OK = qw ( rt_escalate ); +@EXPORT_OK = qw ( rt_daily ); $DEBUG = 0; +FS::UID->install_callback( sub { + eval "use FS::Conf;"; + die $@ if $@; + $conf = FS::Conf->new; +}); + + my %void = (); -sub rt_escalate { +sub rt_daily { my %opt = @_; + my @custnums = @ARGV; # ick + # RT_External installations should have their own cron scripts for this my $system = $FS::TicketSystem::system; - return if $system ne 'RT_Internal'; + return if !defined($system) || $system ne 'RT_Internal'; - my $conf = new FS::Conf; - return if !$conf->exists('ticket_system-escalation'); + system('/opt/rt3/sbin/rt-fulltext-indexer --quiet --limit 5400 &'); - FS::TicketSystem->init; - $DEBUG = 1 if $opt{'v'}; - RT::Config->Set( LogToScreen => 'debug' ) if $DEBUG; - - #we're at now now (and later). - my $time = $opt{'d'} ? str2time($opt{'d'}) : $^T; - $time += $opt{'y'} * 86400 if $opt{'y'}; - my $error = ''; + # if -d or -y is in use, bail out. There's no reliable way to tell RT + # to use an alternate system time. + if ( $opt{'d'} or $opt{'y'} ) { + warn "Forced date options in use - RT daily tasks skipped.\n"; + return; + } + FS::TicketSystem->init; my $session = FS::TicketSystem->session(); my $CurrentUser = $session->{'CurrentUser'} or die "Failed to create RT session"; + + $DEBUG = 1 if $opt{'v'}; + RT::Config->Set( LogToScreen => 'debug' ) if $DEBUG; # load some modules that aren't handled in FS::TicketSystem foreach (qw( - Search::ActiveTicketsInQueue + Search::ActiveTicketsInQueue Action::EscalatePriority + Action::EscalateQueue + Action::ScheduledResolve )) { eval "use RT::$_"; die $@ if $@; } # adapted from rt-crontool - # Mechanics: - # We're using EscalatePriority, so search in all queues that have a - # priority range defined. Select all active tickets in those queues and - # LinearEscalate them. # to make some actions work without complaining %void = map { $_ => "RT::$_"->new($CurrentUser) } (qw(Scrip ScripAction)); - # Most of this stuff is common to any condition -> action processing - # we might want to do, but escalation is the only one we do now. + # compile actions to be run + my (@actions, @active_tickets); my $queues = RT::Queues->new($CurrentUser); $queues->UnLimit; while (my $queue = $queues->Next) { - if ( $queue->InitialPriority == $queue->FinalPriority ) { - warn "Queue '".$queue->Name."' (skipped)\n" if $DEBUG; - next; - } warn "Queue '".$queue->Name."'\n" if $DEBUG; + my %opt = @_; my $tickets = RT::Tickets->new($CurrentUser); my $search = RT::Search::ActiveTicketsInQueue->new( TicketsObj => $tickets, - Argument => $queue->Name, + Argument => $queue->Id, CurrentUser => $CurrentUser, ); $search->Prepare; + foreach my $custnum ( @custnums ) { + die "invalid custnum passed to rt_daily: $custnum" + if !$custnum =~ /^\d+$/; + $tickets->LimitMemberOf( + "freeside://freeside/cust_main/$custnum", + ENTRYAGGREGATOR => 'OR', + SUBCLAUSE => 'custnum' + ); + } while (my $ticket = $tickets->Next) { warn 'Ticket #'.$ticket->Id()."\n" if $DEBUG; - # We don't need transaction stuff from rt-crontool here - action($ticket, 'EscalatePriority', "CurrentTime:$time"); + my @a = task_actions($ticket); + push @actions, @a; + push @active_tickets, $ticket if @a; # avoid garbage collection + } + } + + # and then commit them all + foreach (grep {$_} @actions) { + my ($val, $msg) = $_->Commit; + if ( $DEBUG ) { + if ($val) { + warn "Action committed: ".ref($_)." #".$_->TicketObj->Id."\n"; + } + else { + warn "Action returned $msg: #".$_->TicketObj->Id."\n"; + } } } return; } +sub task_actions { + my $ticket = shift; + ( + ### escalation ### + $conf->exists('ticket_system-escalation') ? ( + action($ticket, 'EscalatePriority', "CurrentTime: $^T"), + action($ticket, 'EscalateQueue') + ) : (), + + ### scheduled resolve ### + action($ticket, 'ScheduledResolve'), + ); +} + sub action { my $ticket = shift; my $CurrentUser = $ticket->CurrentUser; @@ -98,11 +140,13 @@ sub action { ScripAction => $void{'ScripAction'}, CurrentUser => $CurrentUser, ); - return unless $action_obj->Prepare; - warn "Action prepared: $action\n" if $DEBUG; - $action_obj->Commit; - warn "Action committed: $action\n" if $DEBUG; - return; + if ( $action_obj->Prepare ) { + warn "Action prepared: $action\n" if $DEBUG; + return $action_obj; + } + else { + return; + } } 1;