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

Revision 5652, 39.6 KB checked in by acoutinho, 12 years ago (diff)

Ticket #2434 - Correcao na criacao e exibicao de alarmes

Line 
1<?php
2//Definindo Constantes
3require_once ROOTPATH.'/modules/calendar/constants.php';
4
5require_once ROOTPATH.'/modules/calendar/interceptors/Helpers.php';
6
7class DBMapping extends Helpers {       
8           
9    public function encodeCreateSchedulable( &$uri , &$params , &$criteria , $original ){                       
10        $params['type_id'] = EVENT_ID;
11       
12       
13                if(!is_numeric($params['startTime']) )
14                        $params['startTime'] =  strtotime( $params['startTime'] . ' ' .$params['timezone']).'000';
15               
16                if (!is_numeric($params['endTime'])){
17                        $params['endTime'] =   strtotime( $params['endTime'] . ' ' .$params['timezone']).'000';
18                       
19                        if($params['allDay'])
20                                $params['endTime'] =  $params['endTime']  + 86400000;
21                }
22    //        if( !isset( $new['repeat'] ))
23    //            $new['range_end'] = '7287926400'; // 12/12/2200
24    //        else
25            $params['rangeEnd'] = $params['endTime'];
26                        $params['rangeStart'] =  $params['startTime'];
27
28            ///////////////////////////////////////////////////////////////////
29
30            $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] :time().'000';
31            $params['lastUpdate'] = (isset($params['lastUpdate'])) ? $params['lastUpdate'] :time().'000';
32            $params['type'] = EVENT_ID;
33            $params['uid'] = isset($params['uid']) ? $params['uid'] : $this->_makeUid();
34           
35        }       
36               
37    public function encodeCreateAlarm( &$uri , &$params , &$criteria , $original ){
38       
39        if(!isset($params['schedulable']) || !isset($params['rangeStart']) || !isset($params['rangeEnd']) )
40        {
41            $participant = Controller::read( array( 'concept' => 'participant' , 'id' => $params['participant'] ) , array('schedulable')  );
42            $schedulable = Controller::read( array( 'concept' => 'schedulable' , 'id' => $participant['schedulable'] ) , array('startTime' , 'endTime' )  );
43
44                       
45/*                     
46                                        if(!is_numeric($params['startTime']) )
47                        $params['startTime'] =  strtotime( $params['startTime'] . ' ' .$params['timezone']).'000';
48               
49                if (!is_numeric($params['endTime'])){
50                        $params['endTime'] =   strtotime( $params['endTime'] . ' ' .$params['timezone']).'000';
51                       
52                        if($params['allDay'])
53                                $params['endTime'] =  $params['endTime']  + 86400000;
54        */
55
56        ob_start();
57        print_r($params);
58        print_r($schedulable);
59       
60        $output = ob_get_clean();
61        file_put_contents( "/tmp/acoutinho.log",  $output , FILE_APPEND);
62       
63       
64                       
65            $params['schedulable'] = $participant['schedulable'];
66            $params['rangeStart'] = strtotime('- '.$params['time'].' '.self::codeAlarmUnit($params['unit']) , (int)($schedulable['startTime'] / 1000)).'000';
67            $params['rangeEnd'] = $schedulable['endTime'];
68        }
69       
70        $params['type'] = self::codeAlarmType($params['type']);
71       
72        } 
73       
74        public function encodeCreateSuggestion( &$uri , &$params , &$criteria , $original ){                   
75        $params['dtstamp'] = (isset($params['dtstamp'])) ? $params['dtstamp'] :time().'000';         
76    }   
77       
78        public function encodeUpdateAlarm( &$uri , &$params , &$criteria , $original ){
79            if(isset($params['type']))
80                $params['type'] = self::codeAlarmType($params['type']);
81        }
82       
83    public function encodeCreateAttachment( &$uri , &$params , &$criteria , $original ){
84       
85                if(!isset($params['source'])) return false;
86               
87                if(isset($_FILES[$params['source']]))
88                        if(isset($params['id']))
89                                $params =  array_merge($_FILES[$params['source']], array('id' => $params['id']));
90                        else
91                                $params =  $_FILES[$params['source']];
92               
93                if(isset($params['owner']))
94                        $params['owner'] = Config::me('uidNumber');
95               
96        }
97
98///////////////////////////////////////////////////////////////////////////////////////////////////////////////
99       
100    public function encodeSignatureAlarmType( &$uri , &$params , &$criteria , $original ){
101        $params['type'] = self::codeAlarmType($params['type']);
102    } 
103       
104
105    public function insertOwnerLink (&$uri , &$params , &$criteria , $original ){
106            $params['owner'] = Config::me('uidNumber');
107      } 
108       
109    public function encodeServiceUser (&$uri , &$params , &$criteria , $original ){
110           if(isset($params['isExternal']) && $params['isExternal'] == '1')
111                $uri['service'] = 'PostgreSQL';
112    } 
113     
114   public function findSchedulable( &$uri , &$params , &$criteria , $original )
115   {
116       if(isset($criteria['filter'][3][1]) && $criteria['filter'][3][1] == 'calendar')
117       {
118         $select = 'calendar_object.id as id ,calendar_object.cal_uid as "uid" , calendar_object.type_id as "type", calendar_object.dtstart as "startTime", calendar_object.summary as "summary", calendar_object.description as "description", calendar_object.dtend as "endTime" , calendar_object.location as "location", calendar_object.allday as "allDay", calendar_object.transp as "transparent", calendar_object.class_id as "class", calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart",calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence",  calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as calendar';
119         $sql = " SELECT $select FROM calendar_to_calendar_object , calendar_object WHERE (range_start >= '".$criteria['filter'][1][2]."' AND range_end <= '".$criteria['filter'][2][2]."' AND calendar_to_calendar_object.calendar_id IN ('".  implode('\',\'', $criteria['filter'][3][2])."')) AND calendar_to_calendar_object.calendar_object_id = calendar_object.id";
120         $params = Controller::service('PostgreSQL')->execResultSql($sql);
121         $params = self::deepnessFindEvent( &$uri , &$params , &$criteria , $original);
122         return false;
123       }
124   }
125   
126///////////////////////////////////////////////////////////////////////////////////////////////////////////////
127
128    public function updateCalendar( &$uri , &$params , &$criteria , $original ){
129        if( isset($params['calendar']))
130        {
131            $calendarObjects = self::schedulable2calendarToObject( $uri['id'] );
132            $params2['calendar'] = $params['calendar'];
133           
134            foreach ($calendarObjects as $calendarObject)
135                Controller::update( array('concept' => 'calendarToSchedulable' , 'id' => $calendarObject['calendar_to_calendar_object']) , $params2 );
136         
137            unset( $params['calendar'] );
138           
139            if(count($params) < 1) return false;
140        }
141    }
142     
143//Encode Update
144
145    public function encodeUpdateSchedulable( &$uri , &$params , &$criteria , $original ){       
146       
147                $event = Controller::find( array( 'concept' => 'schedulable' , array('timezone') ,'id' => $params['id'] ) );   
148               
149                if(isset($params['startTime'])){
150                       
151                        if(!is_numeric($params['startTime']) )
152                                $params['startTime'] =  strtotime( $params['startTime'] . ' ' .$event['timezone']).'000';
153                       
154                        $params['rangeStart'] = $params['startTime'] ;
155                   
156                }if(isset($params['endTime'])){
157                       
158                        if (!is_numeric($params['endTime']))
159                                $params['endTime'] =   strtotime( $params['endTime'] . ' ' .$event['timezone']).'000';
160                       
161                        $params['rangeEnd'] = $params['endTime'] ;       
162                               
163                }   
164     }       
165     
166    static function putEvent(&$uri , &$result , &$criteria , $original)
167    {         
168            if(Config::module('useCaldav')) //Ignorar Put dos eventos ja vindos do caldav
169            {
170                require_once ROOTPATH.'/modules/calendar/interceptors/DAViCalAdapter.php';
171
172                $eventID = (isset($result['id'])) ? $result['id'] : $uri['id'];
173                $event = Controller::read( array( 'concept' => 'schedulable' , 'id' => $eventID ) );
174
175                $participants = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('=' ,  'schedulable' ,  $eventID) ));
176
177                if(is_array($participants) && count($participants) > 0)
178                    foreach ($participants as $ii => $vv)
179                    {
180                        if($vv['isExternal'] == 1 )
181                            $participants[$ii]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $vv['user'] , 'service' => 'PostgreSQL' ) );
182                        else
183                           $participants[$ii]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $vv['user'] ));
184                    }
185
186                $event['URI']['concept'] = 'schedulable';
187                $event['participants'] = $participants;
188               
189                $ical = Controller::format( array( 'service' => 'iCal' ) , array($event) );                 
190                $calendars =  self::schedulable2calendarToObject($original['properties']['id']); //Busca os calendarios do usuario logado que contenham o evento
191                if( is_array($calendars) )
192                    foreach ($calendars as $calendar)
193                        DAViCalAdapter::putIcal($ical , array('uid' => $event['uid'] , 'collection' => $calendar['calendar_location'] ));
194            }
195    }
196///////////////////////////////////////////////////////////////////////////////////////////////////////////////
197   
198    public function verifyCalendarLocation( &$uri , &$params , &$criteria , $original ){
199        if(!isset($params['location']))
200            $params['location'] = $params['name'];
201    }
202   
203     
204    //TODO: Remover apos suporte a ManytoMany na api
205    public function createCalendarToSchedulable( &$uri , &$result , &$criteria , $original ){           
206
207                Controller::create(array('concept' => 'calendarToSchedulable'), array('calendar' => $original['properties']['calendar'], 'schedulable' => $result['id'] ));
208
209   }
210
211        public function createCreateSchedulableToAttachment( &$uri , &$params , &$criteria , $original ){               
212                if(array_key_exists('attachments', $original['properties']))   
213                        foreach($original['properties']['attachments'] as $key => $value){                             
214                                if(isset($params['id']))
215                                        Controller::create(array('concept' => 'schedulableToAttachment'), array('attachment' => $value['attachment'], 'schedulable' => $params['id'] ));
216                        }
217        }
218     
219         public function deepnessFindCalendarShared( &$uri , &$result , &$criteria , $original ){                               
220                if(isset($original['criteria']['deepness']) && count($result) > 0){
221                        $calendarIds = array();
222                        foreach($result as $key => $value)
223                                array_push($calendarIds, $value['calendar']);
224                       
225                        $calendar = Controller::find( array( 'concept' => 'calendar' ) , false ,array( 'filter' => array('AND', array('IN','id', $calendarIds), $original['criteria']['filter'])));
226                       
227                        if(!is_array($calendar))
228                                $result = '';
229
230                        $newResult = array();
231                        foreach($calendar as $key => $value){
232                                foreach($result as $k => $r){
233
234                                        if($r['calendar'] == $value['id']){
235                                                $r['calendar'] = $value;
236                                                array_push($newResult, $r);
237                                        }
238                                }
239                        }
240                       
241                        foreach($newResult as $key => &$value){
242                                if($value['user']  != 0)
243                                        $value['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $value['user'] ));
244                        }
245
246
247                $result = $newResult;
248                }
249    }   
250 
251    //TODO: Remover apos suporte a deepness na api
252    public function deepnessFindEvent( &$uri , &$result , &$criteria , $original ){             
253
254       if(isset($original['criteria']['deepness']))
255       {
256                       
257                        $Time = new DateTime( 'now', new DateTimeZone('UTC') );
258                        $DayLigth = array();
259           foreach ($result as $i => $v)
260           {
261
262                                if(!isset($currentTimezone) || $currentTimezone  != $original['criteria']['timezones'][$v['calendar']]){
263                                        $currentTimezone = $original['criteria']['timezones'][$v['calendar']];
264                                        $Time->setTimezone(new DateTimeZone($currentTimezone));
265                                }
266
267                                $Time->setTimestamp( (int)($v['startTime'] / 1000));
268                                $DayLigth['calendar']['startTime'] =  $Time->format('I') ? 1 : 0;
269                               
270                                $Time->setTimestamp( (int)($v['endTime'] / 1000));
271                                $DayLigth['calendar']['endTime'] =  $Time->format('I') ? 1 : 0;
272                               
273                                if($currentTimezone != $v['timezone']){
274                                        $currentTimezone = $v['timezone'];
275                                        $Time->setTimezone(new DateTimeZone($v['timezone']));
276                               
277                                        $Time->setTimestamp( (int)($v['startTime'] / 1000));
278                                        $DayLigth['event']['startTime'] =  $Time->format('I') ? 1 : 0;
279
280                                        $Time->setTimestamp( (int)($v['endTime'] / 1000));
281                                        $DayLigth['event']['endTime'] =  $Time->format('I') ? 1 : 0;
282                                }else
283                                        $DayLigth['event'] = $DayLigth['calendar'];
284                                       
285                               
286                                $result[$i]['DayLigth'] = $DayLigth;
287                               
288                if(isset($v['id']))
289                {
290                    $participants = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $v['id']) ));
291                   
292                    if(is_array($participants) && count($participants) > 0)
293                    foreach ($participants as $ii => $vv)
294                    {
295                        if($vv['isExternal'] == 1 )
296                            $participants[$ii]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $vv['user'] , 'service' => 'PostgreSQL' ) );
297                        else
298                           $participants[$ii]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $vv['user'] ));
299                   
300                        if($participants[$ii]['user']['id'] == Config::me('uidNumber'))
301                           $participants[$ii]['alarms'] = Controller::find( array( 'concept' => 'alarm' ) , null , array('filter' => array('AND' , array('=', 'participant' ,$vv['id'] ) ,array('=' , 'schedulable', $v['id'])) ) );
302                    }       
303                    $result[$i]['participants'] = $participants;
304                                       
305                                       
306                                       
307                                        $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable'  ,  $v['id']) ));
308                                        if(is_array($attachmentRelation)){
309                                                $attachments = array();
310                                                foreach($attachmentRelation as $key => $value)
311                                                        if(isset($value['attachment']) || !!$value['attachment'])
312                                                                $attachments[$key]  = $value['attachment'];
313                                                //Pega os anexos sem source
314                                                $result[$i]['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , array('id', 'name', 'type', 'size') ,array( 'filter' => array('IN', 'id' , $attachments) ));
315                                        }
316                               
317                                }               
318               
319           }
320       }
321       
322       return $result;
323       
324   }
325
326    //TODO: Remover apos suporte a deepness na api
327    public function deepnessReadEvent( &$uri , &$result , &$criteria , $original ){             
328       
329       if(isset($original['criteria']['deepness']))
330       {
331            if(isset($result['id']))
332            {
333                $participants = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('=' ,  'schedulable' ,  $result['id']) ));
334                if(is_array($participants))
335                    foreach ($participants as $ii => $vv)
336                    {
337                        if($vv['isExternal'] == 1 )
338                            $participants[$ii]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $vv['user'] , 'service' => 'PostgreSQL' ) );
339                        else
340                           $participants[$ii]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $vv['user'] ));
341
342                        if($participants[$ii]['user']['id'] == Config::me('uidNumber'))
343                           $participants[$ii]['alarms'] = Controller::find( array( 'concept' => 'alarm' ) , null , array('filter' => array('AND' , array('=', 'participant' ,$vv['id'] ) ,array('=' , 'schedulable', $result['id'])) ) );
344               } 
345
346                $result['participants'] = $participants;
347                }
348       }
349   }
350   
351    //TODO: Remover apos suporte a deepness na api
352    public function deepnessReadParticipant( &$uri , &$result , &$criteria , $original ){               
353       
354       if(isset($original['criteria']['deepness']))
355       {
356            if(isset($result['id']))
357            {
358                if($result['isExternal'] == 1 )
359                    $result['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $result['user'] , 'service' => 'PostgreSQL' ) );
360                else
361                   $result['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $result['user'] ));
362            }
363       }
364
365   }
366   
367    //TODO: Remover apos suporte a deepness na api
368    public function deepnessFindParticipant( &$uri , &$result , &$criteria , $original ){               
369       
370       if(isset($original['criteria']['deepness']))
371       {
372           foreach ($result as $i => $v)
373           {
374                if(isset($v['id']))
375                {
376                    if($result[$i]['isExternal'] == 1 )
377                        $result[$i]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $result[$i]['user'] , 'service' => 'PostgreSQL' ) );
378                    else
379                       $result[$i]['user'] = Controller::read( array( 'concept' => 'user' , 'id' => $result[$i]['user'] ));
380                }
381           }
382       }
383       
384   }
385   
386    //TODO: Remover apos suporte a deepness na api
387    public function deepnessReadCalendarSignature( &$uri , &$result , &$criteria , $original ){         
388       
389       if(isset($original['criteria']['deepness']))
390            if(isset($result['calendar'])){
391                $result['calendar'] = Controller::read( array( 'concept' => 'calendar' , 'id' => $result['calendar']));
392                                $result['defaultAlarms'] = Controller::find( array( 'concept' => 'calendarSignatureAlarm' ) , false ,array( 'filter' => array('=', 'calendarSignature'  ,  $result['id']) ));     
393                        }
394           
395   }
396   
397     //TODO: Remover apos suporte a deepness na api
398    public function deepnessFindCalendarSignature( &$uri , &$result , &$criteria , $original ){         
399
400        if(isset($original['criteria']['deepness']))
401       {
402           foreach ($result as $i => $v)
403           {
404                if(isset($v['calendar'])){
405                    $result[$i]['calendar'] = Controller::read( array( 'concept' => 'calendar' , 'id' => $v['calendar']), false, false);
406                                        $result[$i]['defaultAlarms'] = Controller::find( array( 'concept' => 'calendarSignatureAlarm' ) , false ,array( 'filter' => array('=', 'calendarSignature'  ,  $v['id']) ));   
407                                        //Caso não seja o dono da agenda retorna o objeto permission com as acls
408                                        if($result[$i]['isOwner'] == 0){
409                                                $permission = Controller::find( array( 'concept' => 'calendarToPermission'), false ,array( 'filter' => array('AND', array('=', 'calendar' ,  $v['calendar']), array('=', 'user', Config::me('uidNumber') ) ) ) );
410
411                                                if(!is_array($permission) || !$permission  ){
412
413                                                        $permission = Controller::find( array( 'concept' => 'calendarToPermission'), false ,array( 'filter' => array('AND', array('=', 'calendar' ,  $v['calendar']), array('=', 'type', '1' ) ) ) );   
414
415                                                }
416                                                $result[$i]['permission'] = $permission[0];
417                                        }
418                                }
419           }
420       }       
421   }
422//Decode Find       
423    public function decodeFindConcept( &$uri , &$result , &$criteria , $original ){             
424        if($result && is_array($result) )
425        {
426            $m = array_flip(self::${$uri['concept'].'Map'});
427            $new = array();
428            foreach ($result as $i => $v)
429                $new[$i] = self::parseConcept( $result[$i] , $m );
430
431
432            $result = $new;
433        }
434    }
435   
436    public function decodeFindSchedulable( &$uri , &$result , &$criteria , $original ){         
437        if($result && is_array($result) )
438        {
439            $m = array_flip(self::${$uri['concept'].'Map'});
440            $m['calendar_id'] = 'calendar';
441            $new = array();
442            foreach ($result as $i => $v)
443                $new[$i] = self::parseConcept( $result[$i] , $m );
444
445
446            $result = $new;
447        }
448    }
449
450    public function decodeFindAttachment( &$uri , &$result , &$criteria , $original ){         
451                if(isset($result))
452                foreach($result as $key => &$value)
453                        $value['source'] = base64_decode($value['source']);
454    }
455
456       
457        public function decodeSignatureAlarmType( &$uri , &$result , &$criteria , $original ){ 
458            if( is_array($result) )
459            foreach($result as &$param)
460                if(isset($param['type']))
461                    $param['type'] = self::decodeAlarmType($param['type']);
462       
463    }
464       
465/////////////////////////////////////////////////////////////////////////
466   
467    static function dayAlarm( &$uri , &$params , &$criteria , $original ) {     
468        if(isset($criteria['filter'][1]) && $criteria['filter'][1] == 'date')
469        {
470            $filter = array( 'AND',
471                      array( '='  , 'sent' , '0') , 
472                      array( '='  , 'type' ,  ALARM_ALERT) , 
473                      array( '>=' , 'rangeStart' , $criteria['filter'][2]) ,
474                      array( '<=' , 'rangeEnd' , $criteria['filter'][2]) );
475
476            //Busca os Alarmes no Range
477            $al = Controller::find( array('concept' => 'alarm'), false ,array( 'filter' => $filter));
478           
479            if(is_array($al))
480            foreach ($al as $i => $v)
481            {
482                $ev =  Controller::read( array( 'concept' => 'schedulable' , 'id' => $v['schedulable']) ) ;
483
484                $unit = 0;
485                switch (strtolower($v['unit'])) {
486                        case 'm': $unit = 60; break;
487                        case 'H': $unit = 3600; break;
488                        case 'd': $unit = 216000; break; }
489               
490                  $al[$i]['sendTime'] = (((int)( $ev['startTime'] / 1000 )) - ( $v['time'] * $unit ));
491                  $al[$i]['schedulable'] =   $ev;
492                       
493            }
494           
495            $params = $al;
496            return false;
497        }
498    }
499
500    public function deleteSchedulable( &$uri , &$params , &$criteria , $original ){
501
502       if(Config::module('useCaldav'))
503            require_once ROOTPATH.'/modules/calendar/interceptors/DAViCalAdapter.php';
504
505        $calendarsToSchedulable = self::schedulable2calendarToObject($uri['id']);
506        if( !self::ownerSchedulable($uri['id']) )
507        {
508             foreach ($calendarsToSchedulable as $i => $v)
509             {
510                   Controller::delete(array('concept' => 'calendarToSchedulable' , 'id' => $v['calendar_to_calendar_object']));
511                   
512                   if(Config::module('useCaldav'))
513                        DAViCalAdapter::deleteEvent($uri['id'], array('calendar' => $v['calendar_name']));
514             }
515             
516             /* Seta o participante como rejeitado */
517             Controller::update(array('concept' => 'participant'), array('status' => STATUS_CANCELLED) ,
518             array('filter' =>
519                 array('AND',
520                        array('=' , 'user'  ,Config::me('uidNumber') ),
521                        array('=' , 'schedulable'  , $uri['id'] )
522                     )));
523           
524            return false; /* Mata o restante da execução */
525        }
526       
527        if(Config::module('useCaldav'))
528            foreach ($calendarsToSchedulable as $i => $v)
529                DAViCalAdapter::deleteEvent($uri['id'], array('calendar' => $v['calendar_name']));
530
531     }
532
533    public function deleteCalendarSignatureDependences( &$uri , &$params , &$criteria , $original ){
534         $signature = Controller::read($uri,array('isOwner','calendar'));
535           
536        if($signature['isOwner'] == '1')
537        {
538           $calendarToSchedulables = Controller::find(array('concept' => 'calendarToSchedulable') , null , array('filter' => array('=' , 'calendar' , $signature['calendar'] )));
539           
540           $schedulables = array();
541           if(is_array($calendarToSchedulables))
542           foreach ($calendarToSchedulables as $key => $calendarToSchedulable)
543                 $schedulables[] = $calendarToSchedulable['schedulable'] ;
544           
545           if( !empty( $schedulables ) )
546              Controller::deleteALL(array('concept' => 'schedulable'),null , array('filter' => array('IN' , 'id' , $schedulables)));
547
548           Controller::delete(array('concept' => 'calendar', 'id' => $signature['calendar']));
549        }
550       
551     }
552         
553        public function deleteAttachmentDependences( &$uri , &$params , &$criteria , $original ){
554
555                if(isset($original['URI']['id']))
556                        Controller::delete(array('concept' => 'schedulableToAttachment', null , array('filter' => array('=' , 'attachment' , $original['URI']['id']))));
557    }
558
559    public function createDefaultSignature( &$uri , &$result , &$criteria , $original ){
560                     
561    //Caso uma busca não retorne nenhum resultado e foi buscado pelas assinaturas do usuario logado apenas
562    if(count($result) <= 0 &&
563            ( $original['criteria']['filter'][0] == '=' &&
564              $original['criteria']['filter'][1] == 'user' &&
565              $original['criteria']['filter'][2] == $_SESSION['phpgw_session']['account_id']
566            ))
567    {       
568       
569        if( Config::module('useCaldav') )
570        {
571            require_once ROOTPATH.'/modules/calendar/interceptors/DAViCalAdapter.php';
572           
573            $calendario = DAViCalAdapter::findCalendars();
574        }
575       
576        if( Config::module('useCaldav') && is_array($calendario) && count($calendario) > 0)
577        {     
578            foreach ($calendario as $i => $v)
579            {
580               
581                $urlA = explode('/', $v->url);
582                $name = isset($v->displayname)? $v->displayname : $urlA[ (count($urlA)-2) ];
583                $cal = array('name' => $name,
584                             'description' =>  isset($v->description)? $v->description : $name,
585                             'timezone' => isset($v->timezone) ? $v->timezone : (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo',
586                             'dtstamp' => time().'000',
587                             'location' => $urlA[ (count($urlA)-2) ]
588                            );
589
590                $calCreated =  Controller::create( array('concept' => 'calendar') , $cal ); 
591               
592               
593
594                $sig = array( 'user' => $_SESSION['wallet']['user']['uidNumber'],
595                                  'calendar' => $calCreated['id'],
596                                  'isOwner' => '1',
597                                  'dtstamp' => time().'000',
598                                  'fontColor' => 'FFFFFF',
599                                  'backgroundColor' => '3366CC',
600                                  'borderColor' => '3366CC',
601                                );
602
603                $sigCreated =  Controller::create( array('concept' => 'calendarSignature') , $sig );
604               
605 
606               DAViCalAdapter::importCollection($v->url , $calCreated['id']);
607             
608            }
609        }
610        else
611        {
612         //Criaremos uma agenda parão
613          $cal = array('name' => 'Calendario',
614                         'description' => 'Calendario Padrão',
615                         'timezone' =>  (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo',
616                         'dtstamp' => time().'000'
617                        );
618         
619          $calCreated =  Controller::create( array('concept' => 'calendar') , $cal ); 
620         
621          $sig = array( 'user' => $_SESSION['wallet']['user']['uidNumber'],
622                          'calendar' => $calCreated['id'],
623                          'isOwner' => '1',
624                          'dtstamp' => time().'000',
625                          'fontColor' => 'FFFFFF',
626                          'backgroundColor' => '3366CC',
627                          'borderColor' => '3366CC',
628                        );
629           
630          $sigCreated =  Controller::create( array('concept' => 'calendarSignature') , $sig );
631        }
632       
633        $result = Controller::find($original['URI'] , $original['properties'] ? $original['properties'] : null , $original['criteria']  );
634        return false; 
635    }
636   
637}
638
639    public function findExternalPaticipants( &$uri , &$result , &$criteria , $original ) {   
640        if(Config::me('uidNumber'))
641        {
642            $newuri['concept'] = 'user';
643            $newuri['service'] = 'PostgreSQL';
644           
645            $newCriteria = $original['criteria'];
646            $valid = true;
647           
648            $newCriteria['filter'] = array('AND',$newCriteria['filter'] , array('=' , 'owner', Config::me('uidNumber')) );       
649            $externalUsers = Controller::find( $newuri , $original['properties'] ? $original['properties'] : null , $newCriteria );
650           
651            if(is_array($externalUsers))
652            {
653                 foreach ($externalUsers as $i => $v)
654                    $externalUsers[$i]['isExternal'] = '1';
655            }
656            else
657                $externalUsers = array();
658
659            if(!is_array($result))
660                $result = array();
661
662            return array_merge($result, $externalUsers);   
663        }
664       
665    }
666
667    public function createSchedulableMails( &$uri , &$result , &$criteria , $original ){
668       
669        require_once (ROOTPATH.'/plugins/icalcreator/iCalcreator.class.php' );
670        require_once (ROOTPATH.'/api/parseTPL.php' );
671        $schedulable = Controller::read( array( 'concept' => 'schedulable' , 'id' => $result['id'] ));
672        $participants = Controller::find( array( 'concept' => 'participant' ) , false ,array( 'filter' => array('=', 'schedulable' ,  $result['id']) )) ;
673       
674       
675        if(is_array($participants) && count($participants) > 0) //Caso exista participants
676        {
677            $att = array();
678            $attList = '<UL> ';
679            $organizer = array();
680            foreach ($participants as $i => $v)
681                        {
682                if($part['isExternal'] == 1)
683                    $att[$i] =  Controller::read( array( 'concept' => 'user' , 'id' => $v['user'] , 'service' => 'PostgreSQL' ) );
684                else
685                    $att[$i] = Controller::read( array( 'concept' => 'user' , 'id' => $v['user'] ));
686           
687               $attList .= '<LI> '.$att[$i]['name'] .'</LI> ';
688               
689               if( isset($v['isOrganizer']) && $v['isOrganizer'] == 1)
690                   $organizer = $att[$i];
691               
692            }
693            $attList .= '</UL>';
694           
695            foreach ($participants as $i => $v)
696                        {                               
697               
698                if($v === $organizer) //Organizador ?
699                    continue;
700               
701                //Criação do ical
702                $ical = null;
703                $ical = new vcalendar();
704                                $ical->setProperty( 'method' , 'REQUEST' );                     
705                                $vschedulable = &$ical->newComponent( 'vschedulable' );
706                                $vschedulable->setProperty( 'uid' , $schedulable['uid'] );
707                                $vschedulable->setProperty( 'dtstart', gmdate( DATE_RFC822 , (int)($schedulable['startTime'] / 1000)));
708                                $vschedulable->setProperty( 'dtend', gmdate( DATE_RFC822 , (int)($schedulable['endTime'] / 1000)));
709                                $vschedulable->setProperty( 'summary',( $schedulable['summary'] ));
710                                $vschedulable->setProperty( 'description', $schedulable['description']);
711                $vschedulable->setProperty( 'location', $schedulable['location']);
712                $params = array();
713                $params['CN'] = $att[$i]['name'];
714                $params['RSVP'] = 'TRUE';
715                $params['ROLE'] = 'REQ-PARTICIPANT';
716                if(isset($att[$i]['mail']))
717                    $vschedulable->setProperty( 'attendee', $att[$i]['mail'] , $params);
718               
719                $vschedulable->setProperty( 'organizer', $organizer['mail'] , array('CN' => $organizer['name']) );
720                                ///////////////////////////////////////////////////////////////////////////
721               
722                //Criação do E-mail
723                $mail = array();
724                $mail['isHtml'] = true; 
725               
726                $timzone = new DateTimeZone('UTC');
727                $sTime = new DateTime( '@'.(int)($schedulable['startTime'] / 1000) , $timzone );
728                $eTime =  new DateTime( '@'.(int)($schedulable['endTime'] / 1000) , $timzone );
729               
730                $mail['body'] = parseTPL::load_tpl(array( 'startDate' =>  date_format( $sTime , 'd/m/Y') ,
731                                                          'startTime' =>  date_format( $sTime , 'H:i') ,
732                                                          'endDate' =>  date_format( $eTime , 'd/m/Y') ,
733                                                          'endTime' =>  date_format( $eTime , 'H:i') ,
734                                                          'schedulableTitle' =>  $schedulable['summary'],
735                                                          'schedulableLocation' =>  $schedulable['location'],
736                                                          'participants' =>  $attList
737                                                        ),ROOTPATH.'/api/templates/notify_create_body.tpl');
738               
739                //TODO: Internacionalização do Subject
740                $mail['subject'] = 'Schedulableo do Calendário : '.$schedulable['summary'] .' @ '.date_format( $sTime , 'd/m/Y H:i') . ' - ' .  date_format( $eTime , 'd/m/Y H:i');
741                $mail['from'] =  $organizer['mail'];
742                $mail['to'] = $att[$i]['mail'];
743                $mail['attachments'][] = array('source' => $ical->createCalendar(), 'type' => 'text/calendar' ,'disposition' => 'inline' ,'name' => 'external.ics');
744                $result['participants'][$i]['sendInvite'] = Controller::create( array( 'service' => 'SMTP' ), $mail );   
745       
746                        }         
747        }
748        }
749
750    public function davcalCreateCollection( &$uri , &$params , &$criteria , $original ){       
751        if( Config::module('useCaldav') )
752        {
753           require_once ROOTPATH.'/modules/calendar/interceptors/DAViCalAdapter.php';
754           DAViCalAdapter::mkcalendar($params['location'] , $params['name'], isset($params['description']) ? $params['description'] : '' );
755        }
756    }
757   
758   public function davcalDeleteCollection( &$uri , &$params , &$criteria , $original ){
759        if( Config::module('useCaldav') &&  Config::module('onRemoveCascadeCalDav'))
760        {
761           require_once ROOTPATH.'/modules/calendar/interceptors/DAViCalAdapter.php';
762           $calendar = Controller::read($uri);
763           DAViCalAdapter::rmCalendar($calendar['location']);
764        }
765    }
766       
767   public function davcalUpdateCollection( &$uri , &$params , &$criteria , $original ){
768        if( Config::module('useCaldav') )
769        {
770           require_once ROOTPATH.'/modules/calendar/interceptors/DAViCalAdapter.php';
771           if(isset($params['location']))
772           {
773                $calendar = Controller::read($uri);
774                if($calendar['location'] !== $params['location'])
775                    DAViCalAdapter::mvcalendar($calendar['location'], $params['location']);
776           }
777        }
778    }
779       
780//HELPERS
781    private static function decodeRepeat( $repeat , $start , $end ) {
782    require_once ROOTPATH.'/plugins/when/When.php';
783
784    $r = new When();
785    $r->recur( new DateTime( '@'.$start , new DateTimeZone('UTC') ), $repeat['frequency'] );
786
787    foreach($repeat as $rule => $value)
788    {                 
789            switch(strtoupper($rule))
790            {
791                    case "ENDTIME":
792                            $r->until( new DateTime( '@'.$value ) );
793                            break;
794                    case "COUNT":
795                            $r->count( $value );
796                            break;
797                    case "INTERVAL":
798                            $r->interval( $value );
799                            break;
800                    case "BYDAY":
801                            if( !is_array( $value ) )
802                                $value = explode( ',' , $value );
803                            $r->byday( $value );
804                            break;
805                    case "BYMONTHDAY":
806                           if( !is_array( $value ) )
807                                $value = explode(',' , $value );
808                            $r->bymonthday($value);
809                            break;
810                    case "BYYEARDAY":
811                              if( !is_array( $value ) )
812                                $value = explode(',', $value );
813                            $r->byyearday( $value );
814                            break;
815                    case "BYWEEKNO":
816                             if(!is_array( $value ))
817                                $value = explode( ',', $value );
818                            $r->byweekno( $value );
819                            break;
820                    case "BYMONTH":
821                             if( !is_array( $value ) )
822                                $value = explode( ',', $value );
823                            $r->bymonth( $value );
824                            break;
825                    case "BYSETPOS":
826                             if( !is_array( $value ) )
827                                $value = explode( ',' , $value );
828                            $r->bysetpos( $value );
829                            break;
830                    case "WKST":
831                            $r->wkst( $value );
832                            break;
833            }
834    }
835
836    $return = array();
837
838    while($result = $r->next())
839    {
840       $u = $result->format('U');
841       if( $u  > $end ) //data da repetição atual maior que a data final da busca do usuario ?
842           break;
843
844      $return[] =  $u;
845    }
846
847    return $return;
848}
849    private function _makeUid() {
850
851            $date   = date('Ymd\THisT');
852            $unique = substr(microtime(), 2, 4);
853            $base   = 'aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPrRsStTuUvVxXuUvVwWzZ1234567890';
854            $start  = 0;
855            $end    = strlen( $base ) - 1;
856            $length = 6;
857            $str    = null;
858            for( $p = 0; $p < $length; $p++ )
859              $unique .= $base{mt_rand( $start, $end )};
860
861            return $date.$unique.'@expresso-calendar';
862    }
863    private function getStatus( $id ){
864             $a = array(
865                                            STATUS_CONFIRMED =>  'CONFIRMED',
866                                            STATUS_CANCELLED =>  'CANCELLED',
867                                            STATUS_TENATIVE =>   'TENATIVE',
868                                            STATUS_UNANSWERED => 'NEEDS-ACTION',
869                                            STATUS_DELEGATED =>  'DELEGATED'
870                                            );
871             return $a[ $id ];
872    }
873    private static function decodeAlarmType( $id ){
874             $a = array(        ALARM_ALERT =>  'alert',
875                                ALARM_MAIL =>  'mail',
876                                ALARM_SMS =>   'sms' );
877
878             return $a[ $id ];
879    }
880    private static function codeAlarmType( $type ){
881             $a = array(        'alert' => ALARM_ALERT  ,
882                                'mail' => ALARM_MAIL   ,
883                                'sms' => ALARM_SMS   );
884
885             return $a[ $type ];
886    }
887    private static function codeAlarmUnit( $u ){
888                if($u === 'd') return 'days';
889                if($u === 'm') return 'minutes';
890                if($u === 'H') return 'hours';
891        }   
892 
893    private static function ownerSchedulable( $id ){
894       
895       $isOwner = Controller::find(array('concept' => 'participant'), array('id') ,
896             array('filter' =>
897                 array('AND',
898                        array('=' , 'isOrganizer' , '1'),
899                        array('=' , 'user'  ,$_SESSION['wallet']['user']['uidNumber'] ),
900                        array('=' , 'schedulable'  ,$id )
901                     )));
902       
903        return ( isset( $isOwner[0]['id'] ) ) ? true : false;
904    }
905
906    private static function schedulable2calendarToObject($Schedulable)
907    {
908      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 FROM calendar_to_calendar_object , calendar , calendar_signature'
909                .' WHERE calendar_signature.user_uidnumber = '.$_SESSION['wallet']['user']['uidNumber']
910                .' AND calendar_signature.is_owner = 1'
911                .' AND calendar_signature.calendar_id = calendar.id'
912                .' AND calendar_to_calendar_object.calendar_id = calendar.id'
913                .' AND calendar_to_calendar_object.calendar_object_id = '.addslashes($Schedulable));
914    }
915                   
916}
917
918?>
Note: See TracBrowser for help on using the repository browser.