1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
package RTx::Schedule;
use base qw( Exporter );
use strict;
use RTx::Calendar qw( FindTickets LocalDate );
use FS::Record qw( qsearch qsearchs );
use FS::access_user;
use FS::sched_avail;
our $VERSION = '0.01';
our @EXPORT_OK = qw( UserDaySchedule );
#ala Calendar.html
# Default Query and Format
our $DefaultFormat = "__Starts__ __Due__";
our $DefaultQuery = "( Status = 'new' OR Status = 'open' OR Status = 'stalled')
AND ( Type = 'reminder' OR 'Type' = 'ticket' )";
sub UserDaySchedule {
my %arg = @_;
my $username = $arg{username};
my $date = $arg{date};
my $Tickets;
if ( $arg{Tickets} ) {
$Tickets = $arg{Tickets};
} else {
my $Query = $DefaultQuery;
# # we overide them if needed
# $TempQuery = $Query if $Query;
# $TempFormat = $Format if $Format;
# # we search all date types in Format string
# my @Dates = grep { $TempFormat =~ m/__${_}(Relative)?__/ } @DateTypes;
my @Dates = qw( Starts Due );
# # used to display or not a date in Element/CalendarEvent
# my %DateTypes = map { $_ => 1 } @Dates;
#
# $TempQuery .= DatesClauses(\@Dates, $start->strftime("%F"), $end->strftime("%F"));
my %t = FindTickets( $arg{CurrentUser}, $Query, \@Dates, $date x2 );
$Tickets = $t{ $date };
}
#block out unavailable times
#alas. abstractions break, freeside-specific stuff to get availability
# move availability to RT side? make it all callback/pluggable?
use Date::Parse qw( str2time );
#my $wday = (localtime(str2time($date)))[6];
my $access_user = qsearchs('access_user', { 'username'=>$username })#disabled?
or die "unknown user $username";
my @sched_item = $access_user->sched_item #disabled?
or die "$username not an installer";
my $sched_item = $sched_item[0];
my @sched_avail = qsearch('sched_avail', {
itemnum => $sched_item->itemnum,
override_date => 99, #XXX override date via $date
});
@sched_avail = qsearch('sched_avail', {
itemnum => $sched_item->itemnum,
wday => (localtime(str2time($date)))[6],
override_date => '',
})
unless @sched_avail;
return (
#avail/unavailable times
'avail' => [
map [ $_->stime, $_->etime ],
@sched_avail
],
#block out / show / color code existing appointments
'scheduled' => {
map {
#$_->Id => [ $_->StartsObj, $t->DueObj ];
my($sm, $sh) = ($_->StartsObj->Localtime('user'))[1,2];
my $starts = $sh*60 + $sm;
my $due;
if ( LocalDate($_->DueObj->Unix) eq $date ) { #same day, use it
my($dm, $dh) = ($_->DueObj->Localtime('user'))[1,2];
$due = $dh*60 + $dm;
} else {
$due = 1439;#not today, we don't handle multi-day appointments, so
}
#XXX color code existing appointments by... city? proximity? etc.
my $col = '99ff99'; #green for now
$_->Id => [ $starts, $due, $col, $_ ];
}
grep {
LocalDate($_->StartsObj->Unix) eq $date
and $_->OwnerObj->Name eq $username
}
@$Tickets
},
);
}
1;
__END__
=head1 NAME
RTx::Schedule - Scheduling extension for Request Tracker
=head1 DESCRIPTION
This RT extension adds scheduling functionality to Request Tracker.
=head1 CONFIGURATION
CalendarWeeklyStartMin (default 480, 8am)
CalendarWeeklyEndMin (default 1080, 6pm)
CalendarWeeklySizeMin (default 30)
CalendarWeeklySlots (unused now?)
=head1 AUTHOR
Ivan Kohler
=head1 COPYRIGHT
Copyright 2014 Freeside Internet Services, Inc.
This program is free software; you can redistribute it and/or
modify it under the same terms as Request Tracker itself.
|