source: trunk/prototype/modules/calendar/interceptors/DBMapping.php @ 7077

Revision 7077, 62.9 KB checked in by marcieli, 12 years ago (diff)

Ticket #2966 - Inseridos comentários de cabeçalho de arquivos e classes.

Line 
1<?php
2        /**
3        *
4        * Copyright (C) 2011 Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
5        *
6        * This program is free software; you can redistribute it and/or modify
7        * it under the terms of the GNU General Public License as published by
8        * the Free Software Foundation; either version 3 of the License, or
9        * any later version.
10        *
11        * This program is distributed in the hope that it will be useful, but WITHOUT
12        * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
13        * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more
14        * details.
15        *
16        * You should have received a copy of the GNU General Public License
17        * along with this program; if not, write to the Free Software Foundation,
18        * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
19        *
20        * You can contact Prognus Software Livre headquarters at Av. Tancredo Neves,
21        * 6731, PTI, Edifício do Saber, 3º floor, room 306, Foz do Iguaçu - PR - Brasil
22        * or at e-mail address prognus@prognus.com.br.
23        *
24        * Neste arquivo são ser implementadas regras de negócio para consistir e normalizar os dados correspondentes às operações do usuário para o ExpressoCalendar.
25        *
26        * @license    http://www.gnu.org/copyleft/gpl.html GPL
27        * @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
28        * @version    1.0
29        * @sponsor    Caixa Econômica Federal
30        * @since      Arquivo disponibilizado na versão Expresso 2.4.0
31        */
32       
33       
34//Definindo Constantes
35require_once ROOTPATH . '/modules/calendar/constants.php';
36
37require_once ROOTPATH . '/modules/calendar/interceptors/Helpers.php';
38
39use prototype\api\Config as Config;
40
41/**
42* Classe com implementações das regras de negócio para consistir e normalizar os dados correspondentes às operações do usuário para o ExpressoCalendar.
43*
44* @license    http://www.gnu.org/copyleft/gpl.html GPL
45* @author     Consórcio Expresso Livre - 4Linux (www.4linux.com.br) e Prognus Software Livre (www.prognus.com.br)
46* @sponsor    Caixa Econômica Federal
47* @version    1.0
48* @since      Classe disponibilizada na versão Expresso 2.4.0
49*/
50
51class DBMapping extends Helpers {
52
53    static function encodeCreateSchedulable(&$uri, &$params, &$criteria, $original)
54    {
55
56        if (isset($params['startTime']) && !is_numeric($params['startTime']))
57            $params['startTime'] = self::parseTimeDate($params['startTime'], $params['timezone']);
58       
59        $params['rangeStart'] = $params['startTime'];
60       
61        if (isset($params['endTime']) && !is_numeric($params['endTime'])) {
62            $params['endTime'] = self::parseTimeDate($params['endTime'], $params['timezone']);
63
64            if ($params['allDay'])
65                $params['endTime'] = $params['endTime'] + 86400000;
66            }
67           
68        $params['rangeEnd'] = $params['endTime'];
69       
70
71        if (isset($params['due']) && $params['due'] != '' && !is_numeric($params['due']))
72            $params['due'] = self::parseTimeDate($params['due'], $params['timezone']);
73
74        ///////////////////////////////////////////////////////////////////
75
76        $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] : time() . '000';
77        $params['lastUpdate'] = (isset($params['lastUpdate'])) ? $params['lastUpdate'] : time() . '000';
78        $params['uid'] = isset($params['uid']) ? $params['uid'] : self::_makeUid();
79        }
80
81    static function parseTimeDate($time, $timezone) {
82        return strtotime($time . ' ' . $timezone) . '000';
83    }
84
85     public function encodeCreateAlarm( &$uri , &$params , &$criteria , $original ){
86       
87        if(!isset($params['schedulable']) || !isset($params['rangeStart']) || !isset($params['rangeEnd']) )
88        {
89            $participant = Controller::read( array( 'concept' => 'participant' , 'id' => $params['participant'] ) , array('schedulable')  );
90
91            $params['schedulable'] = $participant['schedulable'];
92
93            $params['type'] = self::codeAlarmType($params['type']);
94
95            $params['offset'] = $params['time'] * 1000;
96
97            switch( strtolower($params['unit']) )
98            {
99                case 'd': $params['offset'] *= 24;
100                case 'h': $params['offset'] *= 60;
101                case 'm': $params['offset'] *= 60;
102            }
103        }
104    }
105
106    public function encodeCreateSuggestion(&$uri, &$params, &$criteria, $original) {
107        $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] : time() . '000';
108    }
109
110    public function encodeUpdateAlarm(&$uri, &$params, &$criteria, $original) {
111        if (isset($params['type']))
112            $params['type'] = self::codeAlarmType($params['type']);
113        else{
114            $alarm = Controller::read( array('concept' => 'alarm' , 'id' => $params['id'] ));
115
116            $params['unit'] = $alarm['unit'];
117        }
118        $params['offset'] = $params['time'] * 1000;
119
120
121        switch( strtolower($params['unit']) )
122        {
123            case 'd': $params['offset'] *= 24;
124            case 'h': $params['offset'] *= 60;
125            case 'm': $params['offset'] *= 60;
126        }
127       
128    }
129
130    public function encodeCreateAttachment(&$uri, &$params, &$criteria, $original) {
131
132        if (!isset($params['source']))
133            return false;
134
135        if (isset($_FILES[$params['source']]))
136            if (isset($params['id']))
137                $params = array_merge($_FILES[$params['source']], array('id' => $params['id']));
138            else
139                $params = $_FILES[$params['source']];
140
141        if (isset($params['owner']))
142            $params['owner'] = Config::me('uidNumber');
143    }
144
145///////////////////////////////////////////////////////////////////////////////////////////////////////////////
146
147    public function encodeSignatureAlarmType(&$uri, &$params, &$criteria, $original) {
148        $params['type'] = self::codeAlarmType($params['type']);
149    }
150
151    public function insertOwnerLink(&$uri, &$params, &$criteria, $original) {
152        $params['owner'] = Config::me('uidNumber');
153    }
154
155    public function encodeServiceUser(&$uri, &$params, &$criteria, $original) {
156        if (isset($params['isExternal']) && $params['isExternal'] == '1')
157            $uri['service'] = 'PostgreSQL';
158    }
159
160    public function prepareRepeat(&$uri, &$params, &$criteria, $original) {
161        if (isset($params['startTime']) || isset($params['endTime'])) {
162           
163            if(!isset($params['schedulable']))
164                $params = array_merge($params , Controller::read(array('concept' => 'repeat', 'id' => $params['id']), array('schedulable')));
165 
166            $timezone = Controller::read(array('concept' => 'schedulable', 'id' => $params['schedulable']), array('timezone'));
167
168            if (isset($params['startTime']))
169                $params['startTime'] = self::parseTimeDate($params['startTime'], $timezone['timezone']);
170            if (isset($params['endTime']))
171                $params['endTime'] = self::parseTimeDate($params['endTime'], $timezone['timezone']);
172        }
173    }
174
175    public function findSchedulable(&$uri, &$params, &$criteria, $original) {
176        if (isset($criteria['filter'][2][1]) && $criteria['filter'][2][1] == 'calendar') {
177
178            $sql = ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", '
179                .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", '
180                .'calendar_object.description as "description", calendar_object.dtend as "endTime" , '
181        .'calendar_object.priority as "priority", calendar_object.due as "due", '
182        .'calendar_object.percentage as "percentage", calendar_object.status as "status", '
183                .'calendar_object.location as "location", calendar_object.allday as "allDay", '
184                .'calendar_object.transp as "transparent", calendar_object.class_id as "class", '
185                .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", '
186                .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", '
187                .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", '
188                .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as '
189                .'calendar FROM calendar_to_calendar_object , calendar_object '
190                .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $criteria['filter'][2][2]) . '\')) '
191                .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id '
192        .'AND calendar_object.id NOT IN(select calendar_object_task_id from calendar_task_to_activity_object where owner = \'' . Config::me('uidNumber') . '\') ';     
193           
194            if(isset($criteria['searchEvent']) && $criteria['searchEvent']){
195                $where = 'AND (((upper("summary") like upper(\'%'.$criteria['filter'][1][1][2].'%\') OR upper("description") like upper(\'%'.$criteria['filter'][1][2][2].'%\')))) ORDER BY dtstart LIMIT '.$criteria['limit'].'  OFFSET '.$criteria['offset'].' ';
196                $params = Controller::service('PostgreSQL')->execResultSql($sql.$where);
197
198            }else{
199                $start = array( $criteria['filter'][1][1][1][2] , $criteria['filter'][1][2][1][2], $criteria['filter'][1][3][1][2] );
200                $end = array( $criteria['filter'][1][1][2][2] , $criteria['filter'][1][2][2][2], $criteria['filter'][1][3][2][2] );
201
202                $ids = array();
203                $occ = array();
204
205                if ($occurrences = self::checkOccurrences($start[0], $end[0], $criteria['filter'][2][2]))
206                    foreach ($occurrences as $id => $occurrence) {
207                        $ids[] = $id;
208                        $occ[] = $occurrence;
209                    }   
210
211                $where = 'AND ((range_end >= \'' . $start[0] . '\' AND range_end <= \'' . $end[0] . '\') OR '
212                        .'(range_start >= \'' . $start[1] . '\' AND range_start <= \'' . $end[1] . '\') OR '
213                        .'(range_start <= \'' . $start[2] . '\' AND range_end >= \'' . $end[2] . '\')) '
214                .(!empty($ids) ? ' ' .'AND calendar_object.id NOT IN (\'' . implode('\',\'', $ids) . '\') ' : ' ')
215                .'AND calendar_object.dtstart NOT IN (SELECT calendar_repeat_occurrence.occurrence from calendar_repeat_occurrence, '
216                .'calendar_repeat where (calendar_repeat_occurrence.repeat_id = calendar_repeat.id) '
217                .'AND (calendar_repeat.object_id = calendar_object.id))';
218
219                $params = Controller::service('PostgreSQL')->execResultSql($sql.$where);
220                $params = array_merge($params, $occ);           
221            }
222            $params = self::deepnessFindEvent($uri, $params, $criteria, $original);
223            return false;
224        }
225    }
226
227    public function findTask(&$uri, &$params, &$criteria, $original) {
228
229        if (isset($criteria['filterTasks']) && $criteria['filterTasks']) {
230
231            $sql = ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", '
232            .'calendar_object.dtstart as "startTime", calendar_object.summary as "summary", '
233            .'calendar_object.description as "description", calendar_object.dtend as "endTime" , '
234            .'calendar_object.priority as "priority", calendar_object.due as "due", '
235            .'calendar_object.percentage as "percentage", calendar_object.status as "status", '
236            .'calendar_object.location as "location", calendar_object.allday as "allDay", '
237            .'calendar_object.transp as "transparent", calendar_object.class_id as "class", '
238            .'calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart", '
239            .'calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", '
240            .'calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", '
241            .'calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as '
242            .'calendar FROM calendar_to_calendar_object , calendar_object '
243            .'WHERE ( calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $criteria['filter'][3][2]) . '\')) '
244            .'AND calendar_to_calendar_object.calendar_object_id = calendar_object.id '
245        .'AND calendar_to_calendar_object.calendar_object_id NOT IN (select calendar_object_activity_id from calendar_task_to_activity_object where owner =  \'' . Config::me("uidNumber") . '\' ) '   
246        .'AND calendar_to_calendar_object.calendar_object_id NOT IN (select calendar_object_task_id from calendar_task_to_activity_object where owner =  \'' . Config::me("uidNumber") . '\' ) ';   
247
248        if(isset($criteria['filter'][4]))
249            $sql .= 'AND (((upper("summary") like upper(\'%'.$criteria['filter'][4][1][2].'%\') OR upper("description") like upper(\'%'.$criteria['filter'][4][1][2].'%\'))))';
250
251            $sql .= 'AND (range_start >= \'' . $criteria['filter'][2][2] . '\' AND type_id <= \'' .  $criteria['filter'][1][2] . '\')';
252
253            $params = Controller::service('PostgreSQL')->execResultSql($sql);
254            $params = self::deepnessFindEvent($uri, $params, $criteria, $original);
255            return false;
256        }
257    }
258
259    public function deepnessFindRepeatOccurrence(&$uri, &$result, &$criteria, $original) {
260
261        if (!isset($criteria['deepness']) || $criteria['deepness'] == 0)
262            return;
263
264        foreach ($result as $i => &$res)
265            if (isset($res['repeat']))
266                $res['repeat'] = Controller::read(array('concept' => 'repeat', 'id' => $res['repeat']), false, array('deepness' => intval($criteria['deepness']) - 1));
267    }
268
269    public function deepnessRepeat(&$uri, &$result, &$criteria, $original) {
270
271        if (!isset($criteria['deepness']) || $criteria['deepness'] == 0)
272            return;
273
274        $result['schedulable'] = Controller::find(array('concept' => 'schedulable'), false, array('filter' => array('=', 'id', $result['schedulable']), 'deepness' => intval($criteria['deepness']) - 1));
275        $result['schedulable'] = $result['schedulable'][0];
276    }
277
278    public function saveOccurrences(&$uri, &$result, &$criteria, $original) {
279        $ranges = Controller::find(array('concept' => 'repeatRange'), array('rangeStart', 'rangeEnd'), array('filter' => array('=', 'user', Config::me("uidNumber"))));
280
281        if (!is_array($ranges) || !isset($ranges[0]['rangeStart']) || !isset($ranges[0]['rangeEnd']))
282            return;
283
284        if (isset($result['id']))
285            $id = $result['id'];
286        else
287            $id = $uri['id'];
288
289        $repeat = Controller::read(array('concept' => 'repeat', 'id' => $id));
290
291        unset($repeat['schedulable']);
292        unset($repeat['id']);
293
294        $exceptions = array();
295
296        if (isset($original['properties']['exceptions'])) {
297            $exceptions = explode(',', $original['properties']['exceptions']);
298            unset($repeat['exceptions']);
299        }
300
301        $lastExceptions = Controller::find(array('concept' => 'repeatOccurrence'), array("occurrence"), array('filter' => array('AND', array('=', 'repeat', $id), array('=', 'exception', 1))));
302
303        //Recurepa as execeções anteriores caso exista
304        if (isset($lastExceptions) && count($lastExceptions) && $lastExceptions)
305            foreach ($lastExceptions as $value)
306                array_push($exceptions, $value['occurrence']);
307
308        $params = array_diff(self::decodeRepeat($repeat, $ranges[0]['rangeStart'], $ranges[0]['rangeEnd']), $exceptions);
309
310        Controller::delete(array('concept' => 'repeatOccurrence'), false, array('filter' => array('=', 'repeat', $id)));
311
312        if (!empty($params))
313            Controller::service('PostgreSQL')->execResultSql("INSERT INTO calendar_repeat_occurrence(repeat_id,exception,occurrence)VALUES('" . $id . "','0','" . implode("'),('" . $id . "','0','", $params) . "')" . ( empty($exceptions) ? "" : ",('" . $id . "','1','" . implode("'),('" . $id . "','1','", $exceptions) . "')" ));
314        else if(!empty($exceptions))
315            Controller::service('PostgreSQL')->execResultSql("INSERT INTO calendar_repeat_occurrence(repeat_id,exception,occurrence)VALUES ('" . $id . "','1','" . implode("'),('" . $id . "','1','", $exceptions) . "')" );
316    }       
317
318    public function checkOccurrences($start, $end, $calendarIds) {
319
320        $ranges = Controller::find(array('concept' => 'repeatRange'), array('rangeStart', 'rangeEnd'), array('filter' => array('=', 'user', Config::me("uidNumber"))));
321        $ranges = $ranges[0];
322
323        $origStart = $start;
324        $origEnd = $end;
325
326        if ($initialized = (isset($ranges['rangeStart']) && isset($ranges['rangeEnd']))) {
327            if ($ranges['rangeStart'] <= $start)
328                $start = false;
329            if ($ranges['rangeEnd'] >= $end)
330                $end = false;
331        }
332
333        $repeats = self::findRepeats($calendarIds);
334        if (!is_array($repeats) || empty($repeats))
335            return( false );
336
337        $result = array();
338        $ids = array();
339
340        foreach ($repeats as $repeat) {
341            $ids[] = $id = $repeat['id'];
342            unset($repeat['id']);
343
344            if (!isset($result[$id]))
345                $result[$id] = !$initialized ? array($repeat['startTime']) : array();
346
347            if (!$initialized)
348                $result[$id] = array_merge($result[$id], self::decodeRepeat($repeat, $start, $end));
349            else {
350                if ($start)
351                    $result[$id] = array_merge($result[$id], self::decodeRepeat($repeat, $start, $ranges['rangeStart']));
352
353                if ($end)
354                    $result[$id] = array_merge($result[$id], self::decodeRepeat($repeat, $ranges['rangeEnd'], $end));
355            }
356
357            if (empty($result[$id]))
358                unset($result[$id]);
359        }
360
361        if ($start || $end) {
362            Controller::begin(array('service' => 'PostgreSQL'));
363
364            foreach ($result as $id => $res){
365               
366                $ocurrences = array_unique($res);
367                Controller::service('PostgreSQL')->execResultSql("INSERT INTO calendar_repeat_occurrence(repeat_id,occurrence)VALUES('" . $id . "','" . implode("'),('" . $id . "', '", $ocurrences) . "')");
368            }
369            $data = array();
370
371            if ($start)
372                $data['rangeStart'] = $start;
373
374            if ($end)
375                $data['rangeEnd'] = $end;
376
377            if (!$initialized)
378                $data['user'] = Config::me('uidNumber');
379
380            Controller::call(( $initialized ? 'replace' : 'create'), array('concept' => 'repeatRange'), $data, array('filter' => array('=', 'user', Config::me('uidNumber'))));
381
382            Controller::commit(array('service' => 'PostgreSQL'));
383        }
384
385//      $return = Controller::find( array( 'concept' => 'repeatOccurrence' ), false, array( 'filter' => array( 'AND', array( '>=', 'occurrence', $origStart ), array( '<=', 'occurrence', $origEnd ), array( 'IN', 'repeat', $ids ) ), 'deepness' => $deep ) );
386
387        $return = Controller::service('PostgreSQL')->execResultSql('SELECT calendar_repeat_occurrence.occurrence as "occurrence", calendar_repeat.object_id as "schedulable" FROM calendar_repeat, calendar_repeat_occurrence WHERE calendar_repeat_occurrence.occurrence >= \'' . $origStart . '\' AND calendar_repeat_occurrence.occurrence <= \'' . $origEnd . '\' AND calendar_repeat_occurrence.repeat_id IN (\'' . implode('\',\'', $ids) . '\') AND calendar_repeat.id = calendar_repeat_occurrence.repeat_id AND calendar_repeat_occurrence.exception != 1');
388
389        if (!is_array($return))
390            return( false );
391
392        $result = array();
393        $params = array();
394
395        foreach ($return as $ret) {
396            $currentId = $ret['schedulable'];
397
398            if (!isset($result[$currentId])) {
399                $result[$currentId] = Controller::read(array('concept' => 'schedulable', 'id' => $currentId));
400                $result[$currentId]['occurrences'] = array();
401
402                $calendarToCalendarObj = self::schedulable2calendarToObject($currentId);
403                $result[$currentId]['calendar'] = $calendarToCalendarObj[0]['calendar_id'];
404            }
405
406            $result[$currentId]['occurrences'][] = $ret['occurrence'];
407        }
408
409        return( $result );
410    }
411
412    public static function findRepeats($ids) {
413        return Controller::service('PostgreSQL')->execResultSql('SELECT calendar_repeat.wkst as "wkst", calendar_repeat.byweekno as "byweekno", calendar_repeat.byminute as "byminute", calendar_repeat.bysecond as "bysecond", calendar_repeat.byyearday as "byyearday", calendar_repeat.bymonthday as "bymonthday", calendar_repeat.bysetpos as "bysetpos", calendar_repeat.byday as "byday", calendar_repeat.byhour as "byhour", calendar_repeat.interval as "interval", calendar_repeat.frequency as "frequency", calendar_repeat.until as "endTime", calendar_repeat.id as "id", calendar_repeat.count as "count", calendar_repeat.dtstart as "startTime" FROM calendar_repeat, calendar_to_calendar_object WHERE calendar_repeat.object_id = calendar_to_calendar_object.calendar_object_id AND calendar_to_calendar_object.calendar_id IN (\'' . implode('\',\'', $ids) . '\')');
414    }
415
416//HELPERS
417    public static function decodeRepeat($repeat, $start, $end) {
418
419        date_default_timezone_set('UTC');
420
421        require_once ROOTPATH . '/plugins/when/When.php';
422
423        $r = new When();
424
425        if ($repeat['frequency'] === 'none')
426            return( array() );
427
428        //Nao deve ser usando o horário da repeticao pois nela contem apenas o dias,
429        //deve se recuperar o horário do evento para um correto calculo.
430        if (max($start, $repeat['startTime']) != $repeat['startTime']) {
431            $time = new DateTime('@' . (int) ( $repeat['startTime'] / 1000 ), new DateTimeZone('UTC'));
432
433            $hoursOcurrence = new DateTime('@' . (int) ( $start / 1000 ), new DateTimeZone('UTC'));
434            $hoursOcurrence = $hoursOcurrence->format('H');
435
436            $diffTime = ((($time->format('H') - $hoursOcurrence) * (3600000)) + ($time->format('i') * (60000)));
437            $start = new DateTime('@' . (int) ( ( $start + $diffTime ) / 1000 ), new DateTimeZone('UTC'));
438        }else
439            $start = new DateTime('@' . (int) ( max($start, $repeat['startTime']) / 1000 ), new DateTimeZone('UTC'));
440
441        foreach ($repeat as $rule => $value) {
442            if (!isset($value) || !$value || $value === "0")
443                continue;
444
445            switch (strtolower($rule)) {
446                case "starttime": break;
447                case "frequency":
448                    $r->recur($start, $value);
449                    break;
450                case "endtime":
451                    $r->until(new DateTime('@' . (int) ( $value / 1000 )));
452                    break;
453                case "count": case "interval": case "wkst":
454                    $r->$rule($value);
455                    break;
456                default :
457                    $r->$rule(!is_array($value) ? explode(',', $value) : $value );
458                    break;
459            }
460        }
461
462        $return = array();
463
464        while ($result = $r->next()) {
465            $u = $result->format('U') * 1000;
466
467            if ($u > $end) //data da repetição atual maior que a data final da busca do usuario ?
468                break;
469
470            $return[] = $u;
471        }
472
473        return( $return );
474    }
475
476///////////////////////////////////////////////////////////////////////////////////////////////////////////////
477
478    public function updateCalendar(&$uri, &$params, &$criteria, $original) {       
479        if (isset($params['calendar'])) {
480            if(isset($params['lastCalendar'])){
481                $calendarObjects = self::referenceCalendarToObject($uri['id'], $params['lastCalendar']);
482                $params2['calendar'] = $params['calendar'];
483            }else{
484                $calendarObjects = self::schedulable2calendarToObject($uri['id']);
485                $params2['calendar'] = $params['calendar'];
486            }
487           
488            foreach ($calendarObjects as $calendarObject)
489                Controller::update(array('concept' => 'calendarToSchedulable', 'id' => $calendarObject['calendar_to_calendar_object']), $params2);
490
491            unset($params['calendar']);
492
493            if (count($params) < 1)
494                return false;
495        }
496    }
497
498//Encode Update
499
500    public function encodeUpdateSchedulable(&$uri, &$params, &$criteria, $original) {
501
502        $event = Controller::read(array('concept' => 'schedulable', 'id' => $params['id']));
503                   
504        if (isset($params['startTime'])) {
505
506            if (!is_numeric($params['startTime']))
507                $params['startTime'] = self::parseTimeDate($params['startTime'], $event['timezone']);
508
509            $params['rangeStart'] = $params['startTime'];
510        }
511
512        if (isset($params['endTime'])) {
513
514            if (!is_numeric($params['endTime'])) {
515                        $params['endTime'] = self::parseTimeDate($params['endTime'], $event['timezone']);
516
517                    if ((isset($params['allDay']) && $params['allDay']) || ( !isset($params['allDay']) && $event['allDay']))
518                        $params['endTime'] = $params['endTime'] + 86400000;
519            }
520            $params['rangeEnd'] = $params['endTime'];
521        }
522
523
524        if (isset($params['due']) && $params['due'] != '' && !is_numeric($params['due']))
525            $params['due'] = self::parseTimeDate($params['due'], $event['timezone']);
526
527
528        if($event['type'] == '2'){
529
530            $criteria['historic'] = $params;
531            $criteria['beforeValue'] = $event;
532
533            if(isset($params['startTime']) && $params['startTime'] == $event['startTime'])
534                unset($criteria['historic']['startTime']);
535
536            if(isset($params['endTime']) && $params['endTime'] == $event['endTime'])
537                unset($criteria['historic']['endTime']);
538
539            if(isset($params['due']) && $params['due'] == $event['due'])
540                unset($criteria['historic']['due']);
541
542            //necessário para atulizar a atividade de composta pela tarefa aqui sendo atualizada
543            if(isset($criteria['historic']['startTime']) || isset($criteria['historic']['endTime'])){
544                $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'schedulable', $event['id']), array('=', 'owner', Config::me('uidNumber'))), 'deepness' => 2));
545
546                if(!empty($taskToActivity)){
547                    $activity = Controller::read(array('concept' => 'schedulable', 'id' => $taskToActivity[0]['activity']), array('startTime', 'endTime', 'rangeStart', 'rangeEnd'));
548                    $start = $params['startTime'];
549                    $end = $params['endTime'];
550                    foreach($taskToActivity as $t){
551                         if($t['task']['id'] != $params['id']){
552                            $start = $t['task']['startTime'] < $start ? $t['task']['startTime'] : $start;
553                            $end = $t['task']['endTime'] < $end ? $t['task']['endTime'] : $end;
554                         }
555                    }
556
557                    $toUpdate = array();
558                   
559                    if($start != $activity['startTime'])
560                        $toUpdate['starTime'] = $start;
561                   
562                    if($end != $activity['endTime'])
563                        $toUpdate['endTime'] = $end;
564                     
565                    if(!empty($toUpdate))
566                        Controller::update(array('concept' => 'schedulable', 'id' => $activity['id']), $toUpdate);               
567                }
568            }
569
570            unset($criteria['historic']['rangeEnd']);
571            unset($criteria['historic']['rangeStart']);
572            unset($criteria['historic']['class']);
573            unset($criteria['historic']['type']);
574            unset($criteria['historic']['allDay']);
575            unset($criteria['historic']['id']);           
576        }
577    }
578
579    static function putEvent(&$uri, &$result, &$criteria, $original) {
580        if (Config::module('useCaldav', 'expressoCalendar')) { //Ignorar Put dos eventos ja vindos do caldav
581            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php';
582
583            $eventID = (isset($result['id'])) ? $result['id'] : $uri['id'];
584            $event = Controller::read(array('concept' => 'schedulable', 'id' => $eventID));
585
586            $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $eventID)));
587
588            if (is_array($participants) && count($participants) > 0)
589                foreach ($participants as $ii => $vv) {
590                    if ($vv['isExternal'] == 1)
591                        $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL'));
592                    else
593                        $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user']));
594                }
595
596            $event['URI']['concept'] = 'schedulable';
597            $event['participants'] = $participants;
598
599            $ical = Controller::format(array('service' => 'iCal'), array($event));
600            $calendars = self::schedulable2calendarToObject($original['properties']['id']); //Busca os calendarios do usuario logado que contenham o evento
601            if (is_array($calendars))
602                foreach ($calendars as $calendar)
603                    DAViCalAdapter::putIcal($ical, array('uid' => $event['uid'], 'location' => $calendar['calendar_location']));
604        }
605    }
606
607
608    static function prepareParticipantHistoric(&$uri, &$params, &$criteria, $original){
609       $participant = Controller::read(array('concept' => 'participant', 'id' => $uri['id']));
610       $schedulable = Controller::read(array('concept' => 'schedulable', 'id' => $participant['schedulable']));
611
612
613       if($schedulable['type'] == '2')
614            $criteria['historic']['participant']  = $participant;
615    }
616
617    static function removeParticipantHistoric(&$uri, &$params, &$criteria, $original){
618        if(isset($criteria['historic'])){
619
620            $participant = $criteria['historic']['participant'];
621
622             Controller::create(array('concept' => 'calendarHistoric'),
623                array('schedulable' => $participant['schedulable'],
624                    'user' => Config::me('uidNumber'),
625                    'time' => time() . '000',
626                    'attribute' => 'participant',
627                    'beforeValue' => $participant['user'],
628                    'afterValue' => ''
629                    )
630                );
631
632        }
633
634    }
635
636    static function createParticipantHistoric(&$uri, &$params, &$criteria, $original){
637
638        if(isset($original['properties']) && $original['properties']['isOrganizer'] != '1'){
639            if(!isset($criteria['event'])){
640                $event = Controller::read(array('concept' => 'schedulable', 'id' => $original['properties']['schedulable']));
641                $criteria['event'] = $event;
642            }else
643                $event = $criteria['event'];
644
645            if($event['type'] == '2'){
646                Controller::create(array('concept' => 'calendarHistoric'),
647                    array('schedulable' => $original['properties']['schedulable'],
648                        'user' => Config::me('uidNumber'),
649                        'time' => time() . '000',
650                        'attribute' => 'participant',
651                        'beforeValue' => '',
652                        'afterValue' => $original['properties']['user']
653                        )
654                    );
655            }
656        }
657    }
658
659    static function createHistoric(&$uri, &$result, &$criteria, $original) {
660
661        if(isset($criteria['historic']) && count($criteria['historic'])){
662            $time =  time() . '000';
663
664            foreach($criteria['historic'] as $k => $v){
665                Controller::create(array('concept' => 'calendarHistoric'),
666                    array('schedulable' => $uri['id'],
667                        'user' => Config::me('uidNumber'),
668                        'time' => $time,
669                        'attribute' => $k,
670                        'beforeValue' => $criteria['beforeValue'][$k],
671                        'afterValue' => $v
672                        )
673                    );
674            }
675        }   
676    }
677
678///////////////////////////////////////////////////////////////////////////////////////////////////////////////
679
680    public function verifyCalendarLocation(&$uri, &$params, &$criteria, $original) {
681        if (!isset($params['location']))
682            $params['location'] = Config::me('uid') . '/' . $params['name'];
683    }
684
685    //TODO: Remover apos suporte a ManytoMany na api
686    public function createCalendarToSchedulable(&$uri, &$result, &$criteria, $original) {
687
688        Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $original['properties']['calendar'], 'schedulable' => $result['id']));
689    }
690
691    //TODO: Remover apos suporte a ManytoMany na api
692    public function createTasksToActivity(&$uri, &$result, &$criteria, $original) {
693
694        if(isset($original['properties']['taskToActivity']) && $original['properties']['taskToActivity']){
695
696            foreach($original['properties']['taskToActivity'] as $relational)
697
698                Controller::create(array('concept' => 'taskToActivity'), array('task' => $relational['task'], 'owner' => $relational['owner'], 'activity' => $result['id']));
699
700        }
701    }
702
703    public function removeAttachmentHistoric(&$uri, &$params, &$criteria, $original) {
704
705        if(isset($criteria['historic'])){
706            $attachment = $criteria['historic']['attachment'];
707
708            $attachment['attachment'] = Controller::read(array('concept' => 'attachment', 'id' => $attachment['attachment']), array('name'));
709            Controller::create(array('concept' => 'calendarHistoric'),
710                    array('schedulable' => $attachment['schedulable'],
711                        'user' => Config::me('uidNumber'),
712                        'time' => time() . '000',
713                        'attribute' => 'attachment',
714                        'beforeValue' => $attachment['attachment']['name'],
715                        'afterValue' => ''
716                        )
717                    );
718
719        }
720   
721    }
722
723    public function createAttachmentHistoric(&$uri, &$params, &$criteria, $original) {
724        $event = Controller::read(array('concept' => 'schedulable', 'id' => $original['properties']['schedulable']));
725
726        if($event['type'] == '2'){
727            $attachment = Controller::read(array('concept' => 'attachment', 'id' => $original['properties']['attachment']), array('name'));
728
729            Controller::create(array('concept' => 'calendarHistoric'),
730                array('schedulable' => $original['properties']['schedulable'],
731                    'user' => Config::me('uidNumber'),
732                    'time' => time() . '000',
733                    'attribute' => 'attachment',
734                    'beforeValue' => '',
735                    'afterValue' => $attachment['name']
736                    )
737                );
738
739        }
740    }
741
742    public function deepnessFindCalendarShared(&$uri, &$result, &$criteria, $original) {   
743        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != '0' && count($result) > 0) {
744
745            $calendarIds = array();
746            foreach ($result as $key => $value)
747                array_push($calendarIds, $value['calendar']);
748
749            $calendar = Controller::find(array('concept' => 'calendar'), false, array('filter' => array('AND', array('IN', 'id', $calendarIds))));
750
751            if ($calendar && count($calendar) > 0){
752                $newResult = array();
753                        foreach ($calendar as $key => $value) {
754                            foreach ($result as $k => $r) {
755
756                                if ($r['calendar'] == $value['id']) {
757                                    $r['calendar'] = $value;
758                                    array_push($newResult, $r);
759                                }
760                            }
761                        }
762
763                        foreach ($newResult as $key => &$value) {
764                            if ($value['user'] != 0) {
765                                $user = $value['user'];
766                                $value['user'] = Controller::read(array('concept' => 'user', 'id' => $user));
767
768                                if (!$value['user'])
769                                    $value['user'] = Controller::read(array('concept' => 'group', 'id' => $user));
770                            }
771                        }
772
773                        $result = $newResult;
774            }else
775                  $result = '';
776        }
777    }
778
779    //TODO: Remover apos suporte a deepness na api
780    public function deepnessFindTask(&$uri, &$result, &$criteria, $original) {
781        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0)
782           foreach($result as &$value)
783                $value['task'] = Controller::read(array('concept' => 'schedulable', 'id' => $value['task']));
784           
785       
786        return $result;
787    }
788
789    //TODO: Remover apos suporte a deepness na api
790    public function deepnessFindHistoric(&$uri, &$result, &$criteria, $original) {
791        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) {
792            foreach($result as &$v){
793                $v['user'] = Controller::read(array('concept' => 'user', 'id' => $v['user']));
794
795                if($v['attribute'] == 'participant'){
796                    if($v['beforeValue'] != '')
797                        $v['beforeValue'] = Controller::read(array('concept' => 'user', 'id' => $v['beforeValue']));
798
799                    if($v['afterValue'] != '')
800                        $v['afterValue'] = Controller::read(array('concept' => 'user', 'id' => $v['afterValue']));
801                }
802            }
803        }
804    }
805
806    //TODO: Remover apos suporte a deepness na api
807    public function deepnessFindEvent(&$uri, &$result, &$criteria, $original) {
808        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) {
809            $Time = new DateTime('now', new DateTimeZone('UTC'));
810            $DayLigth = array();
811            foreach ($result as $i => $v) {
812
813                if ( isset($v['calendar']) && (!isset($currentTimezone) || $currentTimezone != $original['criteria']['timezones'][$v['calendar']]))  {
814                    $currentTimezone = isset($original['criteria']['timezones'][$v['calendar']]) ? $original['criteria']['timezones'][$v['calendar']] : $v['timezone'];
815                    $Time->setTimezone(new DateTimeZone($currentTimezone));
816                }
817
818                $Time->setTimestamp((int) ($v['startTime'] / 1000));
819                $DayLigth['calendar']['startTime'] = $Time->format('I') ? 1 : 0;
820
821                $Time->setTimestamp((int) ($v['endTime'] / 1000));
822                $DayLigth['calendar']['endTime'] = $Time->format('I') ? 1 : 0;
823
824                if (!isset($currentTimezone) || ($currentTimezone != $v['timezone'])) {
825                    $currentTimezone = $v['timezone'];
826                    $Time->setTimezone(new DateTimeZone($v['timezone']));
827
828                    $Time->setTimestamp((int) ($v['startTime'] / 1000));
829                    $DayLigth['event']['startTime'] = $Time->format('I') ? 1 : 0;
830
831                    $Time->setTimestamp((int) ($v['endTime'] / 1000));
832                    $DayLigth['event']['endTime'] = $Time->format('I') ? 1 : 0;
833                }else
834                    $DayLigth['event'] = $DayLigth['calendar'];
835
836
837                $result[$i]['DayLigth'] = $DayLigth;
838
839        if(((int)$v['type']) == 2){
840
841            $taskToActivity = Controller::find(array('concept' => 'taskToActivity'), false, array('filter' => array('AND', array('=', 'activity', $v['id']), array('=','owner', Config::me('uidNumber'))) , 'deepness' => 2));
842
843            if($taskToActivity)
844                $result[$i]['taskToActivity'] = $taskToActivity;
845
846            $result[$i]['historic'] = Controller::find(array('concept' => 'calendarHistoric'), false, array('filter' => array('=', 'schedulable', $v['id']) , 'deepness' => 2));
847
848        }
849
850                if (isset($v['id'])) {
851                    $data = self::decodeParticipantsEvent($uri, $v, $criteria, $original);
852
853                    $result[$i]['statusAttendees'] = isset($data['statusAttendees']) ? $data['statusAttendees'] : false;
854                    $result[$i]['sizeAttendees'] = isset($data['sizeAttendees']) ? $data['sizeAttendees'] : false;
855                    $result[$i]['participants'] = $data['attendees'];
856
857                    $attachmentRelation = Controller::find(array('concept' => 'schedulableToAttachment'), false, array('filter' => array('=', 'schedulable', $v['id'])));
858                    if (is_array($attachmentRelation)) {
859                        $attachments = array();
860                        foreach ($attachmentRelation as $key => $value)
861                            if (isset($value['attachment']) || !!$value['attachment'])
862                                $attachments[$key] = $value['attachment'];
863                        //Pega os anexos sem source
864                        $result[$i]['attachments'] = Controller::find(array('concept' => 'attachment'), array('id', 'name', 'type', 'size'), array('filter' => array('IN', 'id', $attachments)));
865                    }
866
867                    $repeat = Controller::find(array('concept' => 'repeat'), false, array('filter' => array('=', 'schedulable', $v['id'])));
868
869                    unset($result[$i]['repeat']);
870
871                    if (is_array($repeat))
872                        $result[$i]['repeat'] = $repeat[0];
873                }
874            }
875        }
876
877        return $result;
878    }
879   
880
881//TODO: Remover apos suporte a deepness na api
882    public function deepnessReadParticipant( &$uri , &$result , &$criteria , $original ){
883       
884       if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0)
885       {
886            if(isset($result['id']) && isset($result['user']))
887            {
888                $result['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $result['user'] , 'service' => ( $result['isExternal'] == 1 ? 'PostgreSQL' : 'OpenLDAP' ) ) );
889
890                if($result['user']['id'] == Config::me('uidNumber'))
891                  $result['alarms'] = Controller::find( array( 'concept' => 'alarm' ) , null , array('filter' => array('=', 'participant' ,$result['id'] ) ) );
892            }
893       }
894       
895     
896       
897   }
898
899    //TODO: Remover apos suporte a deepness na api
900    public function deepnessReadEvent( &$uri , &$result , &$criteria , $original ){             
901   
902       if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0)
903       {
904            if(isset($result['id']))
905            {
906                $result['participants'] = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('=' ,  'schedulable' ,  $result['id']), 'deepness' => $original['criteria']['deepness'] - 1) );
907
908                $repeat =  Controller::find( array( 'concept' => 'repeat' ), false, array( 'filter' => array( '=', 'schedulable', $result['id'] ) ) );
909
910                if(is_array($repeat))
911                    $result['repeat'] = $repeat[0];
912            }
913           
914       }
915       
916       if(isset($result['id']) && $result['type'] == '2'){
917           $result['historic'] =  Controller::find( array( 'concept' => 'calendarHistoric' ), false, array( 'filter' => array( '=', 'schedulable', $result['id'] ) ) );
918       }
919   }
920   
921    //TODO: Remover apos suporte a deepness na api
922    public function deepnessFindParticipant( &$uri , &$result , &$criteria , $original ){
923       if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0)
924       {
925           foreach ($result as $i => &$v)
926           {
927                self::deepnessReadParticipant( $uri, $v, $criteria, $original );
928           }
929       } 
930       
931   }
932
933    //TODO: Remover apos suporte a deepness na api
934    public function deepnessReadCalendarSignature(&$uri, &$result, &$criteria, $original) {
935
936        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0)
937            if (isset($result['calendar'])) {
938                $result['calendar'] = Controller::read(array('concept' => 'calendar', 'id' => $result['calendar']));
939                $result['defaultAlarms'] = Controller::find(array('concept' => 'calendarSignatureAlarm'), false, array('filter' => array('=', 'calendarSignature', $result['id'])));
940            }
941    }
942
943    //TODO: Remover apos suporte a deepness na api
944    public function deepnessFindCalendarSignature(&$uri, &$result, &$criteria, $original) {
945
946        if (isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) {
947            foreach ($result as $i => $v) {
948                if (isset($v['calendar'])) {
949                    $result[$i]['calendar'] = Controller::read(array('concept' => 'calendar', 'id' => $v['calendar']), false, false);
950                    $result[$i]['defaultAlarms'] = Controller::find(array('concept' => 'calendarSignatureAlarm'), false, array('filter' => array('=', 'calendarSignature', $v['id'])));
951                    //Caso não seja o dono da agenda retorna o objeto permission com as acls
952                    if ($result[$i]['isOwner'] == 0) {
953                        $permission = Controller::find(array('concept' => 'calendarToPermission'), false, array('filter' => array('AND', array('=', 'calendar', $v['calendar']), array('=', 'user', Config::me('uidNumber')))));
954
955                        if (!is_array($permission) || !$permission) {
956
957                            $permission = Controller::find(array('concept' => 'calendarToPermission'), false, array('filter' => array('AND', array('=', 'calendar', $v['calendar']), array('=', 'type', '1'))));
958                        }
959                        $result[$i]['permission'] = $permission[0];
960                    }
961                }
962                //TODO - Padronizar retorno do deepness
963                if (isset($v['user']))
964                    $result[$i]['user'] = Controller::read(array('concept' => 'user', 'id' => $v['user']), false, false);
965            }
966        }
967    }
968
969//Decode Find       
970    public function decodeFindConcept(&$uri, &$result, &$criteria, $original) {
971        if ($result && is_array($result)) {
972            $m = array_flip(self::${$uri['concept'] . 'Map'});
973            $new = array();
974            foreach ($result as $i => $v)
975                $new[$i] = self::parseConcept($result[$i], $m);
976
977
978            $result = $new;
979        }
980    }
981
982    public function decodeFindSchedulable(&$uri, &$result, &$criteria, $original) {
983        if ($result && is_array($result)) {
984            $m = array_flip(self::${$uri['concept'] . 'Map'});
985            $m['calendar_id'] = 'calendar';
986            $new = array();
987            foreach ($result as $i => $v)
988                $new[$i] = self::parseConcept($result[$i], $m);
989
990
991            $result = $new;
992        }
993    }
994
995    public function decodeFindAttachment(&$uri, &$result, &$criteria, $original) {
996        if (isset($result))
997            foreach ($result as $key => &$value)
998                $value['source'] = base64_decode($value['source']);
999    }
1000
1001    public function decodeSignatureAlarmType(&$uri, &$result, &$criteria, $original) {
1002        if (is_array($result))
1003            foreach ($result as &$param)
1004                if (isset($param['type']))
1005                    $param['type'] = self::decodeAlarmType($param['type']);
1006    }
1007
1008/////////////////////////////////////////////////////////////////////////
1009
1010    static function decodeParticipantsEvent( &$uri, $result, &$criteria, $original) {
1011        $participants = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $result['id']) ));
1012
1013        if($participants && ($size = count($participants)) < 100){
1014            if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0){
1015                self::deepnessFindParticipant($uri, $participants, $criteria, $original);
1016                 $participants['attendees'] = $participants;
1017            }
1018           
1019        }else if($participants && ($size = count($participants)) > 100){
1020            $owner = Controller::read( array( 'concept' => 'calendarSignature' ) , false ,array( 'filter' => array('AND', array('=', 'calendar'  ,  $result['calendar']), array('=', 'isOwner', '1'))));
1021            $owner = Controller::read( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('AND', array('=', 'schedulable'  ,  $result['id']), array('=', 'user', $owner[0]['user'])), 'deepness' => 2));
1022
1023            if(is_array($owner))
1024                $owner = $owner[0];
1025
1026            $reference = array_slice($participants, 0, 100);
1027            $organizer = false;
1028            $asOwner = false;
1029
1030            foreach($reference as $r => &$v){
1031                if($v['id'] == $owner['id']){
1032                    $v = $owner;
1033                    $asOwner = true;
1034                    continue;
1035                }
1036
1037                self::deepnessReadParticipant($uri, $v, $criteria, $original);
1038
1039                if($v['isOrganizer'] == "1" )
1040                    $organizer = $v;
1041            }
1042
1043            if(!$organizer){
1044                $organizer = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('AND', array('=', 'schedulable'  ,  $result['id']), array('=', 'isOrganizer', '1')), 'deepness' => 2));
1045
1046                array_push($reference, $organizer[0]);
1047
1048            }else if($organizer && ($organizer['id'] != $owner['id']))
1049                array_merge($reference, $organizer);
1050
1051            if(!$asOwner)
1052                array_push($reference, $owner);
1053
1054            $statusAttendees = array( 'default' => 0, 'accepted' => 0, 'tentative' => 0, 'cancelled' => 0, 'unanswered' => 0, 'delegated' => 0 );
1055            $statusLabels = array( 'default', 'accepted', 'tentative', 'cancelled', 'unanswered', 'delegated' );
1056
1057            foreach($participants as $k => &$p){
1058                if(!$organizer && $p['isOrganizer'] == "1"){
1059                    self::deepnessReadParticipant($uri, $p, $criteria, $original);
1060                    $reference = array_merge($reference, array($p));
1061                }
1062
1063                $statusAttendees[$statusLabels[$p['status']]]++;
1064            }
1065
1066            $participants['statusAttendees'] = $statusAttendees;
1067            $participants['sizeAttendees'] = $size;
1068            $participants['attendees'] = $reference;
1069        }
1070       
1071        return $participants;
1072    }
1073   
1074    static function dayAlarm( &$uri , &$params , &$criteria , $original ) {
1075        if(isset($criteria['filter'][1]) && $criteria['filter'][1] == 'date')
1076        {
1077            $target = $criteria['filter'][2];
1078
1079            $params = array();
1080
1081            $al = Controller::service('PostgreSQL')->execSql("SELECT distinct co.id as \"id\", co.cal_uid as \"uid\", co.type_id as \"type\", co.dtstart as \"startTime\", co.summary as \"summary\", co.description as \"description\", co.dtend as \"endTime\", co.location as \"location\", co.allday as \"allDay\", co.transp as transparent, co.class_id as class, ".
1082                "co.range_start as \"rangeStart\", co.range_end as \"rangeEnd\", co.last_update as \"lastUpdate\", co.dtstamp as \"dtstamp\", co.sequence as \"sequence\", co.tzid as \"timezone\", CASE WHEN rep.object_id = co.id THEN occ.occurrence - al.alarm_offset ELSE co.dtstart - al.alarm_offset END as \"sendTime\", ".
1083                "al.unit as \"unit\", al.time as \"time\" FROM calendar_alarm as al, calendar_object as co, calendar_repeat as rep, calendar_repeat_occurrence as occ, calendar_participant as part WHERE ".
1084                "al.action_id = '".ALARM_ALERT."' AND al.sent = '0' AND ( (al.participant_id = part.id) AND (part.user_info_id = '". Config::me('uidNumber') ."') ) AND part.object_id = co.id AND ".
1085                "CASE WHEN rep.object_id = co.id ".
1086                "THEN rep.id = occ.repeat_id AND occ.occurrence - al.alarm_offset >= '$target' AND occ.occurrence - al.alarm_offset <= '".( $target + 86400000)."' ".
1087                "ELSE (co.range_start - al.alarm_offset) >= '$target' AND (co.range_start - al.alarm_offset) <= '".( $target + 86400000)."' END");
1088           
1089            if(is_array($al))
1090              foreach( $al as $v )
1091                $params[] = array('schedulable' =>  $v);
1092             
1093            else
1094              $params = false;
1095 
1096            return false;
1097        }
1098    }
1099   
1100    static private function countMyCalendarsEvent($id, $owner) {
1101                $sig = Controller::find(array('concept' => 'calendarSignature'), array('user', 'calendar', 'isOwner'), array('filter' => array('AND', array('=', 'isOwner', '1'), array('=', 'user', $owner))));
1102                $calendars = array();
1103                foreach ($sig as $val)
1104                        $calendars[] = $val['calendar'];
1105
1106                $return = Controller::find(array('concept' => 'calendarToSchedulable'), null, array('filter' => array('AND', array('IN', 'calendar', $calendars), array('=', 'schedulable', $id))));
1107
1108                return (isset($return[0])) ? count($return) : 0;
1109    }
1110   
1111    public function deleteSchedulable(&$uri, &$params, &$criteria, $original) {
1112        if (Config::module('useCaldav', 'expressoCalendar'))
1113            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php';
1114       
1115        if(isset($criteria['filter']) && $criteria['filter'] && isset($criteria['filter'][1][2])){
1116            $idSchedulable = $criteria['filter'][1][2];
1117            $idCalendar = $criteria['filter'][2][2];
1118            $owner = $criteria['filter'][3][2];
1119
1120            $qtdMyCalendars = self::countMyCalendarsEvent($idSchedulable, $owner);
1121
1122            $link = Controller::read(array('concept' => 'calendarToSchedulable'), false, array('filter' => array('AND', array('=','calendar',$idCalendar), array('=','schedulable',$idSchedulable))));
1123            $link = (is_array($link) && isset($link[0])) ? $link[0] : $link;
1124           
1125            $calendar = Controller::read(array('concept' => 'calendar'), false, array('filter' => array('=','id',$idCalendar)));
1126            $calendar = (is_array($calendar) && isset($calendar[0])) ? $calendar[0] : $calendar;
1127
1128            if($isAttende = !self::ownerSchedulable($idSchedulable, $owner)){
1129                Controller::delete(array('concept' => 'calendarToSchedulable', 'id' => $link['id']));
1130               
1131                if($qtdMyCalendars <= 1){
1132
1133                    $participant = Controller::read(array('concept' => 'participant'), array('id'), array('filter' =>
1134                        array('AND',
1135                            array('=', 'user', $owner),
1136                            array('=', 'schedulable', $idSchedulable)
1137                        )));
1138
1139                    Controller::call(('update'), array('concept' => 'participant', 'id' => $participant[0]['id']), array('status' => STATUS_CANCELLED));
1140                }
1141
1142            }else{
1143                if($qtdMyCalendars > 1 )
1144                    Controller::delete(array('concept' => 'calendarToSchedulable', 'id' => $link['id']));
1145            }
1146
1147            if (Config::module('useCaldav', 'expressoCalendar'))
1148                    DAViCalAdapter::deleteEvent($idSchedulable, array('location' => $calendar['location']));
1149
1150            if($isAttende || ($qtdMyCalendars > 1))
1151                return false;
1152
1153            $uri['id'] = $idSchedulable;
1154           
1155            if(isset($criteria['filter']) && isset($criteria['filter'][4]) && isset($criteria['filter'][4][2])){
1156                Controller::deleteALL(array('concept' => 'taskToActivity'), null, array('filter' => array('=', 'activity', $idSchedulable)));
1157            }
1158        }
1159       
1160    }
1161
1162    public function deleteCalendarToPermissionDependences(&$uri, &$params, &$criteria, $original) {
1163        $permission = Controller::read($uri, array('user', 'calendar'));
1164
1165        $calendarSignature = Controller::find(array('concept' => 'calendarSignature'), array('id'), array('filter' => array('AND', array('=', 'calendar', $permission['calendar']), array('=', 'user', $permission['user']), array('=', 'isOwner', '0'))));
1166
1167        if ($calendarSignature)
1168            Controller::delete(array('concept' => 'calendarSignature', 'id' => $calendarSignature[0]['id']));
1169    }
1170
1171    public function deleteCalendarSignatureDependences(&$uri, &$params, &$criteria, $original) {
1172        $signature = Controller::read($uri, array('isOwner', 'calendar'));
1173
1174        if ($signature['isOwner'] == '1') {
1175            $calendarToSchedulables = Controller::find(array('concept' => 'calendarToSchedulable'), null, array('filter' => array('=', 'calendar', $signature['calendar'])));
1176
1177            $schedulables = array();
1178            if (is_array($calendarToSchedulables))
1179                foreach ($calendarToSchedulables as $key => $calendarToSchedulable)
1180                    $schedulables[] = $calendarToSchedulable['schedulable'];
1181
1182            if (!empty($schedulables))
1183                        Controller::deleteALL(array('concept' => 'schedulable'), null, array('filter' => array('IN', 'id', $schedulables)));
1184
1185            Controller::delete(array('concept' => 'calendar', 'id' => $signature['calendar']));
1186               
1187                $permissions = Controller::find(array('concept' => 'calendarToPermission'), array('id'), array('filter' => array('=', 'calendar', $signature['calendar'])));
1188
1189               
1190               
1191                if($permissions && count($permissions) > 0){
1192                        $ids = array();
1193                        foreach($permissions as $key => $value)
1194                                array_push($ids, $value['id']);
1195               
1196                        Controller::deleteALL(array('concept' => 'calendarToPermission'), null, array('filter' => array('IN', 'id', $ids)));
1197                       
1198                }
1199               
1200               
1201        }
1202    }
1203
1204    public function decodeSchedulablettachment(&$uri, &$params, &$criteria, $original) {
1205        if (isset($original['URI']['id'])){
1206            $schedulableAttachment = Controller::read(array('concept' => 'schedulableToAttachment'), false, array('filter' => array( '=', 'attachment' , $original['URI']['id'] )));
1207            $uri['id'] = $schedulableAttachment[0]['id'];
1208
1209            $params = $schedulableAttachment[0];
1210
1211            $event = Controller::read(array('concept' => 'schedulable', 'id' => $params['schedulable']));
1212            if($event['type'] == '2')
1213                $criteria['historic']['attachment'] = $schedulableAttachment[0];
1214
1215        }
1216    }
1217
1218    public function deleteAttachmentDependences(&$uri, &$params, &$criteria, $original) {
1219        Controller::delete(array('concept' => 'attachment', 'id' => (isset($params['attachment']) ? $params['attachment'] : $original['URI']['id'])));
1220    }
1221   
1222    public function decodeDeleteCalendarSignatureAlarm(&$uri, &$params, &$criteria, $original) {
1223                if ($original['URI']['id'] == '' && isset($original['criteria']['filter'])){
1224                        Controller::deleteAll(array('concept' => 'calendarSignatureAlarm'), null,$original['criteria']);
1225                        return false;
1226                }
1227    }
1228
1229
1230     public function createDefaultGroup(&$uri, &$result, &$criteria, $original) {
1231        if( $original['criteria']['filter'][1][0] == '=' &&
1232        $original['criteria']['filter'][1][1] == 'user' &&
1233        $original['criteria']['filter'][1][2] == $_SESSION['phpgw_session']['account_id']){
1234
1235            $existDefaultGroup = false;
1236
1237            foreach($result as $v){
1238                if($v['type'] == 1 && $v['calendar']['type'] == 1)
1239                    $existDefaultGroup = true;
1240            }
1241
1242            if(!$existDefaultGroup){
1243
1244                $cal = array('name' => 'Sem grupo',
1245                    'description' => 'Sem grupo',
1246                    'timezone' => (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo',
1247                    'dtstamp' => time() . '000',
1248                    'type' => '1'
1249                );
1250
1251                $calCreated = Controller::create(array('concept' => 'calendar'), $cal);
1252
1253                $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'],
1254                    'calendar' => $calCreated['id'],
1255                    'isOwner' => '1',
1256                    'dtstamp' => time() . '000',
1257                    'fontColor' => 'FFFFFF',
1258                    'backgroundColor' => '3366CC',
1259                    'borderColor' => '3366CC',
1260                    'type' => '1'
1261                );
1262
1263                $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig);
1264                $sigCreated = Controller::read(array('concept' => 'calendarSignature', 'id' => $sigCreated['id']), false, array('deepness' => 2 ));
1265
1266                array_push($result, $sigCreated);
1267            }
1268
1269        }
1270
1271     }
1272
1273    public function createDefaultSignature(&$uri, &$result, &$criteria, $original) {
1274
1275    if(count($result) == 0 && isset($criteria['filter'][3]) && isset($criteria['filter'][3]['isRecursion'])){
1276        throw new Exception('It was not possible to find to calendar!');
1277        return false;
1278    }
1279
1280        //Caso uma busca não retorne nenhum resultado e foi buscado pelas assinaturas do usuario logado apenas
1281        $isValidSignature = false;
1282
1283        //Veirifica pois o usuário pode ter varias assinaturas mas não ser dona de nenhuma
1284        if (count($result) > 0) {
1285            foreach ($result as $value) {
1286                if (isset($value['isOwner']) && $value['isOwner'] != 0 && isset($value['type']) && $value['type'] == 0)
1287                    $isValidSignature = true;
1288            }
1289        }
1290
1291        if (!$isValidSignature &&
1292                ( $original['criteria']['filter'][1][0] == '=' &&
1293                $original['criteria']['filter'][1][1] == 'user' &&
1294                $original['criteria']['filter'][1][2] == $_SESSION['phpgw_session']['account_id']
1295                )) {
1296
1297            if (Config::module('useCaldav', 'expressoCalendar')) {
1298                require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php';
1299                $calendario = DAViCalAdapter::findCalendars();
1300            }
1301
1302            if (Config::module('useCaldav', 'expressoCalendar') && is_array($calendario) && count($calendario) > 0) {
1303                foreach ($calendario as $i => $v) {
1304
1305                    $urlA = explode('/', $v->url);
1306                    $name = isset($v->displayname) ? $v->displayname : $urlA[(count($urlA) - 2)];
1307                    $cal = array('name' => $name,
1308                        'description' => isset($v->description) ? $v->description : $name,
1309                        'timezone' => isset($v->timezone) ? $v->timezone : (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo',
1310                        'dtstamp' => time() . '000',
1311                        'location' => $urlA[(count($urlA) - 3)] . '/' . $urlA[(count($urlA) - 2)]
1312                    );
1313
1314                    $calCreated = Controller::create(array('concept' => 'calendar'), $cal);
1315
1316                if(!$calCreated){
1317                    throw new Exception('Error to create calendar');
1318                    return false;
1319                }
1320
1321                    $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'],
1322                        'calendar' => $calCreated['id'],
1323                        'isOwner' => '1',
1324                        'dtstamp' => time() . '000',
1325                        'fontColor' => 'FFFFFF',
1326                        'backgroundColor' => '3366CC',
1327                        'borderColor' => '3366CC',
1328                    );
1329
1330                    $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig);
1331
1332                if(!$sigCreated){
1333                    throw new Exception('Error to create signature');
1334                    return false;
1335                }
1336
1337                    DAViCalAdapter::importCollection($v->url, $calCreated['id']);
1338                }
1339            } else {
1340                //Criaremos uma agenda padrão
1341                $cal = array('name' => 'Calendario',
1342                    'description' => 'Calendario Padrão',
1343                    'timezone' => (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo',
1344                    'dtstamp' => time() . '000'
1345                );
1346
1347                $calCreated = Controller::create(array('concept' => 'calendar'), $cal);
1348
1349                $sig = array('user' => $_SESSION['wallet']['user']['uidNumber'],
1350                    'calendar' => $calCreated['id'],
1351                    'isOwner' => '1',
1352                    'dtstamp' => time() . '000',
1353                    'fontColor' => 'FFFFFF',
1354                    'backgroundColor' => '3366CC',
1355                    'borderColor' => '3366CC',
1356                );
1357
1358                $sigCreated = Controller::create(array('concept' => 'calendarSignature'), $sig);
1359        }
1360   
1361        $original['criteria']['filter'][] = array('isRecursion' => true);
1362        $result = Controller::find($original['URI'], $original['properties'] ? $original['properties'] : null, $original['criteria']);
1363            return false;
1364        }
1365    }
1366
1367    //TODO - Criar conceito separado para participantes externos e remover o criterio notExternal
1368    public function findExternalPaticipants(&$uri, &$result, &$criteria, $original) {
1369        if (Config::me('uidNumber') && !isset($criteria['notExternal'])) {
1370            $newuri['concept'] = 'user';
1371            $newuri['service'] = 'PostgreSQL';
1372
1373            $newCriteria = $original['criteria'];
1374            $valid = true;
1375
1376            $newCriteria['filter'] = array('AND', $newCriteria['filter'], array('=', 'owner', Config::me('uidNumber')));
1377            $externalUsers = Controller::find($newuri, $original['properties'] ? $original['properties'] : null, $newCriteria);
1378
1379            if (is_array($externalUsers)) {
1380                foreach ($externalUsers as $i => $v)
1381                    $externalUsers[$i]['isExternal'] = '1';
1382            }
1383            else
1384                $externalUsers = array();
1385
1386            if (!is_array($result))
1387                $result = array();
1388
1389            return array_merge($result, $externalUsers);
1390        }
1391    }
1392
1393    public function davcalCreateCollection(&$uri, &$params, &$criteria, $original) {
1394        if (Config::module('useCaldav', 'expressoCalendar')) {
1395            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php';
1396            DAViCalAdapter::mkcalendar($params['location'], $params['name'], isset($params['description']) ? $params['description'] : '' );
1397           }
1398    }
1399
1400    public function davcalDeleteCollection(&$uri, &$params, &$criteria, $original) {
1401        if (Config::module('useCaldav', 'expressoCalendar') && Config::module('onRemoveCascadeCalDav')) {
1402            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php';
1403            $calendar = Controller::read($uri);
1404            DAViCalAdapter::rmCalendar($calendar['location']);
1405        }
1406    }
1407
1408    public function davcalUpdateCollection(&$uri, &$params, &$criteria, $original) {
1409        if (Config::module('useCaldav', 'expressoCalendar')) {
1410            require_once ROOTPATH . '/modules/calendar/interceptors/DAViCalAdapter.php';
1411            if (isset($params['location'])) {
1412                $calendar = Controller::read($uri);
1413                if ($calendar['location'] !== $params['location'])
1414                    DAViCalAdapter::mvcalendar($calendar['location'], $params['location']);
1415            }
1416        }
1417    }
1418
1419    private static function _makeUid() {
1420
1421        $date = date('Ymd\THisT');
1422        $unique = substr(microtime(), 2, 4);
1423        $base = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPrRsStTuUvVxXuUvVwWzZ1234567890';
1424        $start = 0;
1425        $end = strlen($base) - 1;
1426        $length = 6;
1427        $str = null;
1428        for ($p = 0; $p < $length; $p++)
1429            $unique .= $base{mt_rand($start, $end)};
1430
1431        return $date . $unique . '@expresso-calendar';
1432    }
1433
1434    private function getStatus($id) {
1435        $a = array(
1436            STATUS_CONFIRMED => 'CONFIRMED',
1437            STATUS_CANCELLED => 'CANCELLED',
1438            STATUS_TENATIVE => 'TENATIVE',
1439            STATUS_UNANSWERED => 'NEEDS-ACTION',
1440            STATUS_DELEGATED => 'DELEGATED'
1441        );
1442        return $a[$id];
1443    }
1444
1445    private static function decodeAlarmType($id) {
1446        $a = array(ALARM_ALERT => 'alert',
1447            ALARM_MAIL => 'mail',
1448            ALARM_SMS => 'sms');
1449
1450        return $a[$id];
1451    }
1452
1453    private static function codeAlarmType($type) {
1454        $a = array('alert' => ALARM_ALERT,
1455            'mail' => ALARM_MAIL,
1456            'sms' => ALARM_SMS);
1457
1458        return $a[$type];
1459    }
1460
1461    private static function codeAlarmUnit($u) {
1462        if ($u === 'd')
1463            return 'days';
1464        if ($u === 'm')
1465            return 'minutes';
1466        if ($u === 'H')
1467            return 'hours';
1468    }
1469
1470    private static function ownerSchedulable($id, $me) {
1471
1472        $isOwner = Controller::find(array('concept' => 'participant'), array('id'), array('filter' =>
1473                    array('AND',
1474                        array('=', 'isOrganizer', '1'),
1475                        array('=', 'user', $me),
1476                        array('=', 'schedulable', $id)
1477                        )));
1478
1479        return ( isset($isOwner[0]['id']) ) ? true : false;
1480    }
1481   
1482   
1483    private static function referenceCalendarToObject($schedulable, $calendar) {
1484        return Controller::service('PostgreSQL')->execResultSql('SELECT calendar_to_calendar_object.id as calendar_to_calendar_Object FROM calendar_to_calendar_object'
1485            . ' WHERE calendar_to_calendar_object.calendar_id = '. $calendar
1486            . ' AND calendar_to_calendar_object.calendar_object_id = ' . addslashes($schedulable));
1487    }
1488   
1489    private static function schedulable2calendarToObject($Schedulable) {
1490        return Controller::service('PostgreSQL')->execResultSql('SELECT calendar_to_calendar_object.id as calendar_to_calendar_Object , calendar.name as calendar_name ,calendar.location as calendar_location, calendar.id as calendar_id FROM calendar_to_calendar_object , calendar , calendar_signature'
1491                        . ' WHERE calendar_signature.user_uidnumber = ' . $_SESSION['wallet']['user']['uidNumber']
1492                        //      .' AND calendar_signature.is_owner = 1'
1493                        . ' AND calendar_signature.calendar_id = calendar.id'
1494                        . ' AND calendar_to_calendar_object.calendar_id = calendar.id'
1495                        . ' AND calendar_to_calendar_object.calendar_object_id = ' . addslashes($Schedulable));
1496    }
1497
1498    protected static function isAllowDeleteInCalendar($calendar) {
1499        $f = Controller::find(array('concept' => 'calendarToPermission'), false, array('filter' => array('AND', array('=', 'user', Config::me('uidNumber')), array('=', 'calendar', $calendar))));
1500        return (strpos($f[0]['acl'], CALENDAR_ACL_REMOVE) === false) ? false : true;
1501    }
1502
1503}
1504
1505?>
Note: See TracBrowser for help on using the repository browser.