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