source: trunk/prototype/modules/calendar/schedules.php @ 8009

Revision 8009, 12.3 KB checked in by cristiano, 11 years ago (diff)

Ticket #3378 - Correcao BUG edicao de eventos compartilhados com repeticao

Line 
1<?php
2/**
3 * Created by JetBrains PhpStorm.
4 * User: Adriano
5 * Date: 28/12/12
6 * Time: 18:36
7 * To change this template use File | Settings | File Templates.
8 */
9if(!defined('ROOTPATH'))
10    define('ROOTPATH', dirname(__FILE__).'/../..');
11
12require_once ROOTPATH.'/api/controller.php';
13require_once ROOTPATH.'/modules/calendar/constants.php';
14require_once ROOTPATH.'/modules/calendar/interceptors/DBMapping.php';
15
16use prototype\api\Config as Config;
17
18class Schedule{
19
20    function findEventsRange( $start, $end, $calendars, $timezones  ){
21
22        $sql =
23            ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", '
24                .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", '
25                .'calendar_object.description as "description", calendar_object.dtend as "endTime" , '
26                .'calendar_object.priority as "priority", calendar_object.due as "due", '
27                .'calendar_object.percentage as "percentage", calendar_object.status as "status", '
28                .'calendar_object.location as "location", calendar_object.allday as "allDay", '
29                .'calendar_object.transp as "transparent", calendar_object.class_id as "class", '
30                .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", '
31                .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", '
32                .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", '
33
34                .'count(calendar_task_to_activity_object.id) as "tasks", '
35
36                .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as '
37                .'calendar FROM calendar_object left join calendar_task_to_activity_object on ( calendar_object.id = calendar_task_to_activity_object.calendar_object_activity_id  ), calendar_to_calendar_object '
38
39                .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $calendars) . '\')) '
40                .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id '
41                .'AND calendar_object.id NOT IN(select calendar_object_task_id from calendar_task_to_activity_object where owner = \'' . Config::me('uidNumber') . '\') ';
42
43        $ids = array();
44        $occ = array();
45
46        if ($occurrences = DBMapping::checkOccurrences($start, $end, $calendars))
47            foreach ($occurrences as $id => $occurrence) {
48                $ids[] = $id;
49                $occ[] = $occurrence;
50            }
51
52        $where =
53            ' AND ((range_end >= \'' . $start . '\' AND range_end <= \'' . $end . '\') OR '
54                .'(range_start >= \'' . $start . '\' AND range_start <= \'' . $end . '\') OR '
55                .'(range_start <= \'' . $start . '\' AND range_end >= \'' . $end . '\')) '
56                .(!empty($ids) ? ' ' .'AND calendar_object.id NOT IN (\'' . implode('\',\'', $ids) . '\') ' : ' ')
57                .'AND calendar_object.dtstart NOT IN (SELECT calendar_repeat_occurrence.occurrence from calendar_repeat_occurrence, '
58                .'calendar_repeat where (calendar_repeat_occurrence.repeat_id = calendar_repeat.id) '
59                .'AND (calendar_repeat.object_id = calendar_object.id)) '
60                .'group by
61                    calendar_object.id, calendar_object.cal_uid, calendar_object.type_id,
62                    calendar_object.dtstart, calendar_object.summary, calendar_object.description,
63                    calendar_object.dtend, calendar_object.priority, calendar_object.due, calendar_object.percentage,
64                    calendar_object.status, calendar_object.location, calendar_object.allday, calendar_object.transp,
65                    calendar_object.class_id, calendar_object.repeat, calendar_object.range_start, calendar_object.range_end,
66                    calendar_object.last_update, calendar_object.dtstamp, calendar_object.sequence,
67                    calendar_object.tzid, calendar_to_calendar_object.calendar_id
68                ORDER BY
69                    calendar_object.dtstart';
70
71        $params = Controller::service('PostgreSQL')->execResultSql($sql.$where);
72        $params = array_merge($params, $occ);
73
74        return $this->normalizeEvents( $params, $timezones );
75    }
76
77    function findEventsSearch( $summary, $description, $calendars, $timezones, $limit, $offset ){
78
79        $sql = ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", '
80            .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", '
81            .'calendar_object.description as "description", calendar_object.dtend as "endTime" , '
82            .'calendar_object.priority as "priority", calendar_object.due as "due", '
83            .'calendar_object.percentage as "percentage", calendar_object.status as "status", '
84            .'calendar_object.location as "location", calendar_object.allday as "allDay", '
85            .'calendar_object.transp as "transparent", calendar_object.class_id as "class", '
86            .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", '
87            .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", '
88            .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", '
89
90            .'count(calendar_task_to_activity_object.id) as "tasks", '
91
92            .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as '
93            .'calendar FROM calendar_object left join calendar_task_to_activity_object on ( calendar_object.id = calendar_task_to_activity_object.calendar_object_activity_id  ), calendar_to_calendar_object '
94            .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $calendars) . '\')) '
95            .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id '
96            .'AND calendar_object.id NOT IN(select calendar_object_task_id from calendar_task_to_activity_object where owner = \'' . Config::me('uidNumber') . '\') ';
97
98
99            $where = 'AND (((upper("summary") like upper(\'%'.$summary.'%\') OR upper("description") like upper(\'%'.$description.'%\'))))
100                group by
101                    calendar_object.id, calendar_object.cal_uid, calendar_object.type_id,
102                    calendar_object.dtstart, calendar_object.summary, calendar_object.description,
103                    calendar_object.dtend, calendar_object.priority, calendar_object.due, calendar_object.percentage,
104                    calendar_object.status, calendar_object.location, calendar_object.allday, calendar_object.transp,
105                    calendar_object.class_id, calendar_object.repeat, calendar_object.range_start, calendar_object.range_end,
106                    calendar_object.last_update, calendar_object.dtstamp, calendar_object.sequence,
107                    calendar_object.tzid, calendar_to_calendar_object.calendar_id
108                ORDER BY
109                    dtstart LIMIT '.$limit.'  OFFSET '.$offset.' ';
110
111            $params = Controller::service('PostgreSQL')->execResultSql($sql.$where);
112
113        return $this->normalizeEvents( $params, $timezones );
114    }
115
116    function normalizeEvents( &$result, $timezones ){
117
118        $mySig = Controller::find(array('concept' => 'calendarSignature') , array('calendar') , array('filter' => array( 'AND' , array('=' , 'type' , '0' ) , array( '=' , 'user' ,Config::me('uidNumber') ) , array('=' , 'isOwner' , '0' ))));
119
120        $signedCalendars = array();
121        if(is_array($mySig))
122            foreach($mySig as $v)
123            {
124                $tmp = Controller::find(array('concept' => 'calendarToPermission') , array('acl' ,'owner') , array('filter' => array( 'AND' ,array( '=' , 'calendar' , $v['calendar'] ) , array( '=' , 'user' , Config::me('uidNumber')  ) )));
125                $signedCalendars[$v['calendar']] = $tmp[0];
126            }
127
128        $date = new DateTime('now', new DateTimeZone('UTC'));
129        $DayLigth = array();
130
131        foreach ($result as $i => $v) {
132
133            $currentTimezone = (isset($v['calendar']) && isset($timezones[$v['calendar']])) ? $timezones[$v['calendar']] : $v['timezone'];
134
135            $date->setTimestamp((int) ($v['startTime'] / 1000));
136            $date->setTimezone( new DateTimeZone( $v['timezone'] ));
137            $DayLigth['event']['startTime'] = ($date->getTimestamp() + $date->getOffset()).'000';
138
139            $date->setTimezone( new DateTimeZone($currentTimezone));
140            $DayLigth['calendar']['startTime'] = ($date->getTimestamp() + $date->getOffset()).'000';
141
142            $date->setTimestamp((int) ($v['endTime'] / 1000));
143            $date->setTimezone( new DateTimeZone($currentTimezone));
144            $DayLigth['event']['endTime'] = ($date->getTimestamp() + $date->getOffset()).'000';
145
146            if(isset($v['due']) && $v['due'] != '0'){
147                $date->setTimestamp((int) ($v['due'] / 1000));
148                $DayLigth['event']['due'] = ($date->getTimestamp() + $date->getOffset()).'000';
149            }else{
150                $DayLigth['event']['due'] = $v['due'];
151            }
152
153            $date->setTimezone( new DateTimeZone($currentTimezone));
154            $DayLigth['calendar']['endTime'] = ($date->getTimestamp() + $date->getOffset()).'000';
155
156            $result[$i]['DayLigth'] = $DayLigth;
157
158
159            if(isset( $v['occurrences'] ) && count( $v['occurrences'] ) > 0){
160
161                $date->setTimestamp((int) ($v['startTime'] / 1000));
162                $date->setTimezone( new DateTimeZone( $v['timezone'] ));
163
164                foreach( $result[$i]['occurrences'] as &$o){
165
166                    $o = ((int) ($o / 1000) + $date->getOffset()).'000';
167
168                }
169            }
170
171            $attend = (isset($signedCalendars[$result[$i]['calendar']])) ?
172                Controller::read(array('concept' => 'participant'), null, array('filter' => array('AND', array('=','schedulable',$v['id']), array('=','user', $signedCalendars[$result[$i]['calendar']]['owner'] )  ))):
173                Controller::read(array('concept' => 'participant'), null, array('filter' => array('AND', array('=','schedulable',$v['id']), array('=','user', Config::me('uidNumber'))  )));
174
175                $result[$i]['unanswered'] = 0;
176
177            if(count($attend) > 0 && !empty($attend)){
178               if(array_key_exists(0, $attend))
179                  $attend = $attend[0];
180
181                if(isset($signedCalendars[$result[$i]['calendar']])) //Caso agenda compartilhada verificar tmb se tem compartilhamento de escrita
182                    $result[$i]['editable'] = (strpos($signedCalendars[$result[$i]['calendar']]['acl'],"w") >=0  &&  (strstr($attend['acl'],"w") || strstr($attend['acl'],"o") || $attend['isOrganizer'] == '1') ) ? 1 : 0;
183                else
184                   $result[$i]['editable'] = (strstr($attend['acl'],"w") || strstr($attend['acl'],"o") || $attend['isOrganizer'] == '1') ? 1 : 0;
185
186                if($attend['status'] == STATUS_UNANSWERED && !isset($signedCalendars[$result[$i]['calendar']]) )
187                   $result[$i]['unanswered'] = 1;
188
189            }else{
190
191               $result[$i]['editable'] = $v['type'] == '2' ? 0 : 2;
192
193            }
194            if( $v['type'] == 2 && $v['tasks'] > 0)
195                $result[$i]['type'] = 3;
196        }
197
198        return $this->toUtf8( $result );
199    }
200
201    function srtToUtf8($data) {
202        return mb_convert_encoding($data, 'UTF-8', 'UTF-8 , ISO-8859-1');
203    }
204
205    function toUtf8($data) {
206        if (is_array($data)) {
207            $return = array();
208            foreach ($data as $i => $v)
209                $return[$this->srtToUtf8($i)] = (is_array($v)) ? $this->toUtf8($v) : $this->srtToUtf8($v);
210
211            return $return;
212        }else
213            return $this->srtToUtf8($data);
214    }
215
216}
217
218$params = $_GET;
219$schedule = new Schedule();
220
221if(isset( $params['rangeStart'] ))
222    $events = $schedule->findEventsRange( $params['rangeStart'], $params['rangeEnd'], $params['calendar'], $params['timezones'] );
223else
224    $events = $schedule->findEventsSearch( $params['summary'], $params['description'], $params['calendar'], $params['timezones'], $params['limit'], $params['offset'] );
225
226echo json_encode( $events );
227?>
Note: See TracBrowser for help on using the repository browser.