[Rt-devel] Using Business::Hours to set the CF Response Time
Anders Ekstrand
Anders.Ekstrand at drutt.com
Thu Aug 30 07:48:40 EDT 2007
Hi again,
I finally found a working solution, including two ugly workarounds:
use Business::Hours;
my $BusinessHours = Business::Hours->new();
my $Ticket = $self->TicketObj;
my $cfResponseTime = new RT::CustomField( $RT::SystemUser );
my $responseTime = $Ticket->FirstCustomFieldValue( 'Response Time' );
my $oneWeek = 3600 * 24 * 7;
if ( !$responseTime ) {
my $createdTime = $Ticket->CreatedObj->Unix;
# This call is made to populate Business::Hour's array of business
days.
$BusinessHours->add_seconds( time, $oneWeek );
# The addition of 1 week is made because Business:Hours doesn't handle
times in the past.
my $passedBusinessMinutes = int( $BusinessHours->between(
$Ticket->CreatedObj->Unix + $oneWeek, time + $oneWeek ) / 60 );
$cfResponseTime->LoadByNameAndQueue ( Name=>'Response Time', Queue=>0
);
$Ticket->AddCustomFieldValue( Field => $cfResponseTime, Value =>
$passedBusinessMinutes );
}
return(1);
Best Regards - Anders
> -----Original Message-----
> From: Anders Ekstrand
> Sent: den 30 augusti 2007 11:59
> To: 'Richard Fojta'
> Cc: rt-devel at lists.bestpractical.com
> Subject: RE: [Rt-devel] Using Business::Hours to set the CF Response
> Time
>
> Hi,
>
> and many thanks for your reply.
>
> I still can't get it to work, unfortunately.
>
> I tried it as simple as possible, and it came down to a stand-alone
> perl script as below:
>
> --- cut here ------ cut here ------ cut here ------ cut here ---
> use Business::Hours;
>
> my $BusinessHours = Business::Hours->new();
>
> $BusinessHours->business_hours(
> 0 => { Name => 'Sunday', Start => '7:00', End => '16:00'
> },
> 1 => { Name => 'Monday', Start => '9:00', End => '18:00'
> },
> 2 => { Name => 'Tuesday', Start => '9:00', End => '18:00'
> },
> 3 => { Name => 'Wednesday', Start => '9:00', End => '18:00'
> },
> 4 => { Name => 'Thursday', Start => '9:00', End => '18:00'
> },
> 5 => { Name => 'Friday', Start => '9:00', End => '18:00'
> },
> 6 => { Name => 'Saturday', Start => '8:00', End => '17:00'
> }
> );
>
> print $BusinessHours->between( time + 3600, time + 7200 );
> print "\n";
> --- cut here ------ cut here ------ cut here ------ cut here ---
>
> This one also returns -1...
>
>
> I added a few debug lines into the 'between' sub in 'Hours.pm', to see
> what happened:
>
>
>
> --- cut here ------ cut here ------ cut here ------ cut here ---
> sub between {
> my $self = shift;
> my $start = shift;
> my $end = shift;
>
> if ($start < $self->{'start'}) {
> print "DEBUG1: start=".$start.", self->start=".$self-
> >{'start'}."\n";
> return (-1);
> }
> if ($end > $self->{'end'}) {
> print "DEBUG2: end=".$end.", self->end=".$self->{'end'}."\n";
> return(-1);
> }
>
> my $period = Set::IntSpan->new($start."-".$end);
> my $intersection = intersect $period $self->{'calculated'};
>
> return cardinality $intersection;
>
>
> }
> --- cut here ------ cut here ------ cut here ------ cut here ---
>
> The output then is:
> DEBUG2: end=1188474497, self->end=
> -1
>
>
> I also get the same result if not defining my business hours hash at
> all, which should make Business::Hours to use the default value.
>
>
> It seems like the issue lies deeper :-(
>
> Best Regards - Anders
>
> > -----Original Message-----
> > From: Richard Fojta [mailto:rfojta at gmail.com]
> > Sent: den 28 augusti 2007 17:53
> > To: Anders Ekstrand
> > Cc: rt-devel at lists.bestpractical.com
> > Subject: Re: [Rt-devel] Using Business::Hours to set the CF Response
> > Time
> >
> > Hello,
> > documentation says
> >
> > between START, END
> >
> > Returns the number of business seconds between START and END Both
> > Start and End should be specified in Seconds since the Epoch
> >
> > Returns -1 if Start or End is outside the calculated business hours
> >
> > See http://search.cpan.org/dist/Business-Hours/lib/Business/Hours.pm
> > and use method business_hours. Documenation is copied beneath.
> >
> > Set the business_hours.
> > for this Business::Hours object. Takes a hash of the form :
> >
> > { 0 => { Name => 'Sunday', Start => 'HH:MM', End => 'HH:MM'},
> >
> > 1 => { Name => 'Monday',
> > Start => 'HH:MM',
> > End => 'HH:MM'},
> > ....
> >
> > 6 => { Name => 'Saturday',
> > Start => 'HH:MM',
> > End => 'HH:MM'},
> > };
> >
> > Start and end times are of the form HH:MM. Valid times are
> > from 00:00 to 23:59. If your hours are from 9am to 6pm, use
> > Start => '9:00', End => '18:00'. A given day MUST have a start
> > and end time OR may declare both Start and End to be undef, if
> > there are no valid hours on that day.
> >
> > Note that the ending time is really "what is the first minute
> we're
> > closed.
> > If you specifiy an "End" of 18:00, that means that at 6pm, you
> are
> > closed.
> > The last business second was 17:59:59. \
> >
> > Greetings.
> > Richard Fojta
> >
> > On 8/28/07, Anders Ekstrand <Anders.Ekstrand at drutt.com> wrote:
> > > Hi all,
> > >
> > > I was up to using a scrip to automatically set my custom field
> > "Response
> > > Time" to a proper value, when sending the first response to a
> > customer
> > > in a ticket.
> > >
> > > I found nothing on the RT Wiki that I could use, so I installed
> > > Business::Hours and Set::IntSpan and tried the following scrip on
> my
> > RT
> > > 3.6.5RC2 installation:
> > >
> > >
> > >
> > > use Business::Hours;
> > >
> > > my $BusinessHours = Business::Hours->new();
> > > my $Ticket = $self->TicketObj;
> > > my $cfResponseTime = new RT::CustomField( $RT::SystemUser );
> > > my $responseTime = $Ticket->FirstCustomFieldValue( 'Response Time'
> );
> > >
> > > if ( !$responseTime ) {
> > >
> > > my $createdTime = $Ticket->CreatedObj->Unix;
> > > my $responseTime = $BusinessHours->between( $createdTime, time()
> );
> > >
> > > $cfResponseTime->LoadByNameAndQueue ( Name=>'Response Time',
> > Queue=>0
> > > );
> > > $Ticket->AddCustomFieldValue( Field => $cfResponseTime, Value =>
> > > $responseTime );
> > > }
> > >
> > > return(1);
> > >
> > >
> > >
> > > Unfortunately, the "between" method only returns -1 for me...
> > >
> > > Anybody that has a hint regarding what I could have missed here?
> > >
> > >
> > > Best Regards - Anders Ekstrand
> > > _______________________________________________
> > > List info: http://lists.bestpractical.com/cgi-
> > bin/mailman/listinfo/rt-devel
> > >
More information about the Rt-devel
mailing list