source: contrib/davical/inc/freebusy-functions.php @ 3733

Revision 3733, 58.5 KB checked in by gabriel.malheiros, 13 years ago (diff)

Ticket #1541 - <Davical customizado para o Expresso.Utiliza Caldav e CardDav?>

Line 
1<?php
2
3/**
4 * Function to include which handles building a free/busy response to
5 * be used in either the REPORT, response to a POST, or response to a
6 * a freebusy GET request.
7 */
8
9include_once('iCalendar.php');
10include_once('RRule-v2.php');
11include_once("drivers_ldap.php");
12
13
14function get_freebusy( $path_match, $mail, $range_start, $range_end, $bin_privs = null ) {
15  global $request;
16
17//  printf( "Path: %s\n", $path_match);
18//  print_r($range_start);
19//  print_r($range_end);
20  $fbq_start=$range_start;
21  $fbq_end=$range_end;
22  //if ( !isset($bin_privs) ) $bin_privs = $request->Privileges();
23  if ( !isset($range_start) || !isset($range_end) ) {
24    $request->DoResponse( 400, 'All valid freebusy requests MUST contain a time-range filter' );
25  }
26  $filtro = "mail=".$mail;
27  $atributos = array("uidNumber");
28  $uidnumber = ldapDrivers::requestAtributo($filtro, $atributos);
29  if ($uidnumber == false) {
30     dbg_error_log( "POST", "Responding with free/busy error: email usuario não encontrado no diretorio");
31     $request->DoResponse( 501, 'Database error');
32  }
33  $cpfuser = $uidnumber['uidNumber'];
34     
35 //8888888888888888888888 Comentado para funcionar com Expresso owner: gabriel Malheiros 10.12.2010 8888888888888888888888888888888888888
36 // $params = array( ':path_match' => $path_match, ':start' => $range_start->UTC(), ':end' => $range_end->UTC() );
37 // $where = ' WHERE caldav_data.dav_name ~ :path_match ';
38 // $where .= 'AND rrule_event_overlaps( dtstart, dtend, rrule, :start, :end) ';
39 // $where .= "AND caldav_data.caldav_type IN ( 'VEVENT', 'VTODO' ) ";
40 // $where .= "AND (calendar_item.transp != 'TRANSPARENT' OR calendar_item.transp IS NULL) ";
41 // $where .= "AND (calendar_item.status != 'CANCELLED' OR calendar_item.status IS NULL) ";
42 // $where .= "AND collection.is_calendar AND collection.schedule_transp = 'opaque' ";
43
44 // if ( $bin_privs != privilege_to_bits('all') ) {
45 //   $where .= "AND (calendar_item.class != 'PRIVATE' OR calendar_item.class IS NULL) ";
46 // }
47
48
49 // $fbtimes = array();
50 // $sql = 'SELECT caldav_data.caldav_data, calendar_item.rrule, calendar_item.transp, calendar_item.status, ';
51 // $sql .= "to_char(calendar_item.dtstart at time zone 'GMT',".iCalendar::SqlUTCFormat().') AS start, ';
52 // $sql .= "to_char(calendar_item.dtend at time zone 'GMT',".iCalendar::SqlUTCFormat().') AS finish ';
53 // $sql .= 'FROM caldav_data INNER JOIN calendar_item USING(dav_id,user_no,dav_name,collection_id) ';
54 // $sql .= 'INNER JOIN collection USING(collection_id)';
55 // $sql .= $where;
56 // if ( isset($c->strict_result_ordering) && $c->strict_result_ordering ) $sql .= ' ORDER BY dav_id';
57 // $qry = new AwlQuery( $sql, $params );
58 // if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows() > 0 ) {
59 //   while( $calendar_object = $qry->Fetch() ) {
60 //     $extra = '';
61 //     if ( $calendar_object->status == 'TENTATIVE' ) {
62 //       $extra = ';BUSY-TENTATIVE';
63 //     }
64 //     dbg_error_log( "REPORT", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish );
65 //     $ics = new vComponent($calendar_object->caldav_data);
66 //     $expanded = expand_event_instances($ics, $range_start, $range_end);
67 //     $expansion = $expanded->GetComponents( array('VEVENT'=>true,'VTODO'=>true,'VJOURNAL'=>true) );
68 //     foreach( $expansion AS $k => $v ) {
69//        echo "=====================================================\n";
70//        printf( "Type: %s\n", $v->GetType());
71//        print_r($v);
72//        echo "-----------------------------------------------------\n";
73 //       $start_date = $v->GetProperty('DTSTART');
74 //       if ( !isset($start_date) ) continue;
75 //       $start_date = new RepeatRuleDateTime($start_date->Value());
76 //       $duration = $v->GetProperty('DURATION');
77 //       $duration = ( !isset($duration) ? 'P1D' : $duration->Value());
78 //       $end_date = clone($start_date);
79 //      $end_date->modify( $duration );
80 //       if ( $end_date < $range_start || $start_date > $range_end ) continue;
81 //       $thisfb = $start_date->UTC() .'/'. $end_date->UTC() . $extra;
82 //       array_push( $fbtimes, $thisfb );
83 //     }
84 //   }
85 // }
86
87 $qry = new AwlQuery( "SELECT p.cal_id,p.cal_type,p.datetime,p.edatetime,p.is_public,u.cal_status from phpgw_cal as p  inner join phpgw_cal_user as u on p.cal_id = u.cal_id  where p.owner= :id or u.cal_login = :id  and u.cal_status != 'R';", array(':id' => $cpfuser));
88    if ( $qry->Exec("POST",__LINE__,__FILE__) && $qry->rows() > 0 ) {                                                                                                                                                           
89      $fbtypee = array();
90      $fbtype = "";
91      while( $calendar_object = $qry->Fetch() ) {                                                                                                                                                                             
92        if ( $calendar_object->is_public == 1 ) {
93           if ( $calendar_object->cal_status == 'A' ) {
94              $extra = ';BUSY';
95            }
96           elseif ( $calendar_object->cal_status == 'U' ) {
97              $extra = ';BUSY-UNAVAILABLE';
98            }
99           elseif ( $calendar_object->cal_status == 'T' ) {
100              $extra = ';BUSY-TENTATIVE';
101            }
102           else
103            {
104             $extra = ';FREE';
105            }                                                                                                                                                                 
106           switch ( $calendar_object->cal_type ) {                                                                                                                                                                           
107                 case "E":                                                                                                                                                                                                   
108                     dbg_error_log( "POST", " FreeBusy: nao recorrente: %s, %s", $calendar_object->datetime, $calendar_object->edatetime );                                                                                   
109                     // $busy_tentative[] = $calendar_object;                                                                                                                                                                 
110                     $dateTime = date_create($fbq_start);                                                                                                                                                                     
111                     $DT_START = $dateTime->format("U");                                                                                                                                                                     
112                     $dateTime_end = date_create($fbq_end );                                                                                                                                                                 
113                     $DT_END = $dateTime_end->format("U");                                                                                                                                                                   
114                     if ( $calendar_object->datetime >= $DT_START && $calendar_object->edatetime <= $DT_END)                                                                                                                 
115                       { if(isset($fbtype)){                                                                                                                                                                                 
116                                                                                                                                                                                                                             
117                          $busydate_s = dataSegundosParaT($calendar_object->datetime,1);                                                                                                                                     
118                          $busydate_e = dataSegundosParaT($calendar_object->edatetime,1);                                                                                                                                     
119                          $fbtype = "$busydate_s/$busydate_e,".$extra;                                                                                                                                                             
120                          array_push( $fbtypee, $fbtype);
121                          }                                                                                                                                                                                                   
122                         else                                                                                                                                                                                                 
123                          {                                                                                                                                                                                                   
124                          $busydate_s = dataSegundosParaT($calendar_object->datetime,1);                                                                                                                                     
125                          $busydate_e = dataSegundosParaT($calendar_object->edatetime,1);                                                                                                                                     
126                          $fbtype = "$busydate_s/$busydate_e,".$extra;                                                                                                                                                                                 
127                          array_push( $fbtypee, $fbtype);
128                          }                                                                                                                                                                                                 
129                       }                                                                                                                                                                                                     
130                     break;                                                                                                                                                                                                   
131
132                 case "M":
133                    // Cancelled events are ignored
134                     dbg_error_log( "POST", " FreeBusy: recorrente: %s, %s", $calendar_object->datetime, $calendar_object->edatetime );
135                     $dateTime = date_create($fbq_start);                                                                             
136                     $DT_START = $dateTime->format("U");                                                                               
137                     $dateTime_end = date_create($fbq_end );                                                                           
138                     $DT_END = $dateTime_end->format("U");                                                                             
139                     $hora_extra = $dateTime->format("G") * 3600;                                                                     
140                     $difer  =  $calendar_object->edatetime - $calendar_object->datetime;                                             
141                     $qryp = new PgQuery( "SELECT * from phpgw_cal_repeats where cal_id = ?  ", $calendar_object->cal_id);             
142                     if ( $qryp->Exec("POST",__LINE__,__FILE__) && $qryp->rows > 0 ) {                                                 
143                        $calendar_repeats = $qryp->Fetch();                                                                           
144                        if ( $calendar_repeats->recur_enddate >= $DT_START && $calendar_repeats->recur_enddate <= $DT_END )           
145                         { $next_cal = date_create($calendar_object->datetime);                                                       
146                                                                                                                                       
147                          $data_diferencial =$DT_START - $calendar_object->datetime;                                                   
148                          // while ($data_incrementa <= $calendar_repeats->recur_enddate)                                             
149                           $intervalo = ($calendar_repeats->recur_interval == 0) ? "1" : "$calendar_repeats->recur_interval";         
150                               switch ( $calendar_repeats->recur_type )                                                               
151                                {                                                                                                     
152                                case "1":                                                                                             
153                                          $modulo = $intervalo * 86400;                                                               
154                                          $soma = $data_diferencial % $modulo;                                                         
155                                          dbg_error_log( "POST", " FreeBusy: diario: %s", $data_diferencial);                         
156                                          $data_incrementa = $DT_START  - $soma;                                                       
157                                          while ($data_incrementa <= $calendar_repeats->recur_enddate)                                 
158                                          {  if ($data_incrementa >= $DT_START )                                                       
159                                                {                                                                                     
160                                                 $end = $data_incrementa + $difer;                                                     
161                                                 $busydate_s = dataSegundosParaT($data_incrementa,1);                                 
162                                                 $busydate_e = dataSegundosParaT($end,1);                                             
163                                                 $fbtype = "$busydate_s/$busydate_e,".$extra;                                               
164                                                 array_push( $fbtypee, $fbtype);
165                                                }                                                                                     
166                                           $data_incrementa =  $data_incrementa + 86400 * $intervalo;                                 
167                                          }                                                                                           
168                                          break;                                                                                       
169                                case "2":                                                                                             
170                                         $modulo = $intervalo * 86400;                                                                 
171                                         $soma = $data_diferencial % $modulo;                                                         
172                                         $data_incrementa = $DT_START - $soma;                                                         
173                                         dbg_error_log( "POST", " FreeBusy: semanal: %s", $soma );                                     
174                                         while ($data_incrementa <= $calendar_repeats->recur_enddate)                                 
175                                          {                                                                                           
176                                            $difer_semana = $DT_START - $data_incrementa;                                             
177                                            if ($data_incrementa >= $DT_START || $difer_semana <= 604800 )                             
178
179                                            {
180                                                $semana = str_split(converte_semana($calendar_repeats->recur_data));   
181                                                $lef = count($semana);                                                 
182                                                for ( $i=0;$i<$lef;$i++ )                                             
183                                                 {                                                                     
184                                                   $obj_semana = dataSegundosParaT($data_incrementa,1);               
185                                                   $dia_semana = date_create($obj_semana);                             
186                                                   $week = $dia_semana->format("w") + 1;                               
187                                                   $diferenca = $semana[$i] - $week;                                   
188                                                   $data_semana = $data_incrementa + $diferenca * 86400;               
189                                                   $end = $data_semana + $difer;                                       
190                                                   $busydate_s = dataSegundosParaT($data_semana,1);                   
191                                                   $busydate_e = dataSegundosParaT($end,1);                           
192                                                   $fbtype = "$busydate_s/$busydate_e,".$extra;                             
193                                                   array_push( $fbtypee, $fbtype);
194                                                  }                                                                     
195                                             }                                                                         
196                                           $data_incrementa =  $data_incrementa + 604800 * $intervalo;                 
197                                          }                                                                           
198                                          break;                                                                       
199                                case "3":                                                                             
200                                          $data_incrementa = $calendar_object->datetime;                               
201                                          while ($data_incrementa <= $calendar_repeats->recur_enddate)                 
202                                          dbg_error_log( "POST", " FreeBusy: mensal: %s", $soma );                     
203                                          {  if ($data_incrementa >= $DT_START )                                       
204                                                {                                                                     
205                                                 $end = $data_incrementa + $difer;                                     
206                                                 $busydate_s = dataSegundosParaT($data_incrementa,1);                 
207                                                 $busydate_e = dataSegundosParaT($end,1);                             
208                                                 $fbtype = "$busydate_s/$busydate_e,".$extra;                               
209                                                 array_push( $fbtypee, $fbtype);
210                                                }                                                                     
211                                           $i =$intervalo;                                                             
212                                           while ( $i>0 )                                                             
213                                           {  $mes_data = date_create($data_incrementa);                               
214                                              $dias_mes = $mes_data->format("t");                                     
215                                              $data_incrementa =  $data_incrementa + 86400 * $dias_mes;               
216                                              $mes_data = date_create($data_incrementa);                               
217                                              $dias_mes = $mes_data->format("t");                                     
218                                              $i--;                                                                   
219                                           }                                                                           
220                                         }                                                                             
221                                          break;                                                                       
222                                                                                                                       
223                                case "4":                                                                             
224                                          $obj_mes = dataSegundosParaT($calendar_object->datetime,1);                 
225                                          $data_mes = date_create($obj_mes);                                           
226                                          $mes = $data_mes->format("m");                                               
227                                          $ano = $data_mes->format("Y");                                               
228                                          $algo = "${ano}${mes}01T000000Z";                                           
229                                          $dia_primeiro = date_create($algo);                                         
230                                          // $semana_mes = $data_mes->format("W") - $dia_primeiro->format("W");       
231                                          $difer_semana = $calendar_object->datetime - $dia_primeiro->format("U");     
232                                          $dividendo = $difer_semana / 604800;                                         
233                                          $semana_mes = str_split($dividendo);                                         
234                                          $dia_semana = $data_mes->format("D");                                       
235                                          switch ($semana_mes[0])                                                     
236                                          {case "0":                                                                   
237                                               $final = "+0 week $dia_semana";                                         
238                                               break;                                                                 
239                                           case "1":                                                                   
240                                               $final = "+1 week $dia_semana";                                         
241                                               break;                                                                 
242                                           case "2":                                                                   
243                                               $final = "+2 week $dia_semana";                                         
244                                               break;                                                                 
245                                           case "3":                                                                   
246                                               $final = "+3 week $dia_semana";                                         
247                                               break;                                                                 
248                                           case "5":                                                                   
249                                               $final = "-1 week $dia_semana";                                         
250                                               break;                                                                 
251                                          }                                                                           
252                                          $data_incrementa = $calendar_object->datetime;                               
253                                          while ($data_incrementa <=  $DT_END)                                         
254                                          {                                                                           
255                                            $obj_mes = dataSegundosParaT($data_incrementa,1);                         
256                                            $mes_data = date_create($obj_mes);                                         
257
258                                              if ($data_incrementa >= $DT_START )
259                                                {                               
260                                                 $end = $data_incrementa + $difer;
261                                                 $busydate_s = dataSegundosParaT($data_incrementa,1);
262                                                 $busydate_e = dataSegundosParaT($end,1);           
263                                                 $fbtype = "$busydate_s/$busydate_e,".$extra;
264                                                 array_push( $fbtypee, $fbtype);             
265                                                }                                                   
266                                              $data_proc = dataSegundosParaT($data_incrementa,1);   
267                                              $data_mais = date("U",strtotime("$data_proc +${intervalo} month"));
268                                              $mes = date("M",$data_mais);                                       
269                                              $ano = date("Y",$data_mais);                                       
270                                              $hora = date("G",$data_mais);                                     
271                                              $minuto = date("i",$data_mais);                                   
272                                              $data_incrementa = date("U",strtotime("$final ${mes} ${ano}"));   
273                                              $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60;                                             
274                                                                                                                                                                 
275                                         }                                                                                                                       
276                                                                                                                                                                 
277                                        break;                                                                                                                   
278
279                         
280                                case "5":
281                                        $obj_mes = dataSegundosParaT($calendar_object->datetime,1);
282                                        $date_mes = date_create($obj_mes);                         
283                                        $mes = $date_mes->format("m");                             
284                                        $ano = $date_mes->format("Y");                             
285                                        $dia = $date_mes->format("d");                             
286                                        $hora = $date_mes->format("G");                           
287                                        $minuto = $date_mes->format("i");                         
288                                        $data_incrementa = $calendar_object->datetime ;           
289                                        dbg_error_log( "POST", " FreeBusy: anual: %s", $soma );   
290                                        while ($data_incrementa <= $calendar_repeats->recur_enddate)
291                                          {  if ($data_incrementa >= $DT_START )                   
292                                            {                                                       
293                                                $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60;
294                                                $end = $data_incrementa + $difer;                                   
295                                                $busydate_s = dataSegundosParaT($data_incrementa,1);                 
296                                                $busydate_e = dataSegundosParaT($end,1);                             
297                                                $fbtype = "$busydate_s/$busydate_e,".$extra;
298                                                array_push( $fbtypee, $fbtype);                               
299                                            }                                                                       
300                                          $i =$intervalo;                                                           
301                                           while ($i>0)                                                             
302                                           {                                                                         
303                                             $data_incrementa =  date("U",strtotime("$ano-$mes-$dia +1 year"));     
304                                             $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60;   
305                                             $i++;                                                                   
306                                           }                                                                         
307                                                                                                                     
308                                          }                                                                         
309                                        break;                                                                       
310
311                               }     
312                                           
313                         }                 
314                        else               
315                          { if ( $calendar_repeats->recur_enddate >= $DT_START || $calendar_repeats->recur_enddate == 0 )
316                              {$next_cal = date_create($calendar_object->datetime);                                                       
317                                                                                                                                           
318                                $data_diferencial =$DT_START - $calendar_object->datetime;                                                   
319                               // while ($data_incrementa <= $calendar_repeats->recur_enddate)                                               
320                               $intervalo = ($calendar_repeats->recur_interval == 0) ? "1" : "$calendar_repeats->recur_interval";           
321                               switch ( $calendar_repeats->recur_type )                                                                     
322                                  {                                                                                                         
323                                case "1":                                                                                                   
324                                          $modulo = $intervalo * 86400;                                                                     
325                                          $soma = $data_diferencial % $modulo;                                                               
326                                          //$hora_extra = $dateTime->format("G") * 3600;                                                     
327                                          dbg_error_log( "POST", " FreeBusy: diario: %s", $soma );                                                         
328                                          $data_incrementa = $DT_START - $soma;                                                                             
329                                          while ($data_incrementa <= $DT_END)                                                                               
330                                          {  if ($data_incrementa >= $DT_START )                                                                           
331                                                {                                                                                                           
332                                                 $end = $data_incrementa + $difer;                                                                         
333                                                 $busydate_s = dataSegundosParaT($data_incrementa,1);                                                       
334                                                 $busydate_e = dataSegundosParaT($end,1);                                                                   
335                                                 $fbtype = "$busydate_s/$busydate_e,".$extra;
336                                                 array_push( $fbtypee, $fbtype);                                                                     
337                                                }                                                                                                           
338                                           $data_incrementa =  $data_incrementa + 86400 * $intervalo;                                                       
339                                          }                                                                                                                 
340                                          break;                                                                                                           
341                                case "2":                                                                                                                   
342                                         $modulo = $intervalo * 86400;                                                                                       
343                                         $soma = $data_diferencial % $modulo;                                                                               
344                                         $data_incrementa = $DT_START - $soma;                                                                               
345                                         while ($data_incrementa <=  $DT_END)                                                                               
346                                          {                                                                                                                 
347                                            $difer_semana = $DT_START - $data_incrementa;                                                                   
348                                            if ($data_incrementa >= $DT_START || $difer_semana <= 604800 )                                                       
349                                             {                                                                                                                   
350                                                $semana = str_split(converte_semana($calendar_repeats->recur_data));                                             
351                                                $lef = count($semana);                                                                                           
352                                                for ( $i=0;$i<$lef;$i++ )                                                                                         
353                                                 {                                                                                                               
354                                                   $obj_semana = dataSegundosParaT($data_incrementa,1);                                                           
355                                                   $dia_semana = date_create($obj_semana);                                                                       
356                                                   $week = $dia_semana->format("w") + 1;                                                                         
357                                                   $diferenca = $semana[$i] - $week;                                                                             
358                                                   $data_semana = $data_incrementa + $diferenca * 86400;                                                         
359                                                   $end = $data_semana + $difer;                                                                                 
360                                                   $busydate_s = dataSegundosParaT($data_semana,1);                                                               
361                                                   $busydate_e = dataSegundosParaT($end,1);                                                                       
362                                                   $fbtype = "$busydate_s/$busydate_e,".$extra;
363                                                   array_push( $fbtypee, $fbtype);                                                                         
364                                                 }                                                                                                               
365                                             }                                                                                                                   
366                                           $data_incrementa =  $data_incrementa + 604800 * $intervalo;                                                           
367                                          }                                                                                                                       
368                                          break;                                                                                                                 
369                                case "3":                                                                                                                         
370                                          $data_incrementa = $calendar_object->datetime;                                                                         
371                                          dbg_error_log( "POST", " FreeBusy: mensal: %s", $soma );                                                               
372                                          while ($data_incrementa <=  $DT_END)                                                                                   
373                                          {  if ($data_incrementa >= $DT_START )                                                                                 
374                                                {                                                                                                                 
375                                                 $end = $data_incrementa + $difer;                                                                               
376                                                 $busydate_s = dataSegundosParaT($data_incrementa,1);                                                             
377                                                 $busydate_e = dataSegundosParaT($end,1);                                                                         
378                                                 $fbtype = "$busydate_s/$busydate_e,".$extra;
379                                                 array_push( $fbtypee, $fbtype);                                                                           
380                                                }                                                                                                                 
381                                           $i =$intervalo;                                                                                                       
382                                           while ( $i>0 )                                                                                                         
383                                           {                                                                                                                     
384                                              $obj_mes = dataSegundosParaT($data_incrementa,1);                                                                   
385                                              $mes_data = date_create($obj_mes);                                                                                 
386                                              $dias_mes = $mes_data->format("t");                                                                                 
387                                              $data_incrementa =  $data_incrementa + 86400 * $dias_mes;                                                           
388                                              $obj_mes = dataSegundosParaT($data_incrementa,1);                                                                   
389                                              $mes_data = date_create($obj_mes);                                                                                 
390                                              $dias_mes = $mes_data->format("t");                                                                                 
391                                              $i--;                                                                                                               
392                                           }                                                                                                                     
393                                         }                                                                                                                       
394                                          break;                                                                                                                 
395                                                                                                                                                                 
396                                case "4":                                                                                                                         
397                                          $obj_mes = dataSegundosParaT($calendar_object->datetime,1);                                                             
398                                          $data_mes = date_create($obj_mes);                                                                                     
399                                          $mes = $data_mes->format("m");                                                                                         
400                                          $ano = $data_mes->format("Y");                                                                                         
401                                          $algo = "${ano}${mes}01T000000Z";                                                                                       
402                                          $dia_primeiro = date_create($algo);                                                                                     
403                                          //$semana_mes = $data_mes->format("W") - $dia_primeiro->format("W");                                                   
404                                          $difer_semana = $calendar_object->datetime - $dia_primeiro->format("U");                                               
405                                          $dividendo = $difer_semana / 604800;                                                                                   
406                                          $semana_mes = str_split($dividendo);                                                                                   
407                                          $dia_semana = $data_mes->format("D");                                                                                   
408                                          switch ($semana_mes[0])                                                                                                 
409                                          {case "0":                                                                                                             
410                                               $final = "+0 week $dia_semana";                                                                                   
411                                               break;                                                                                                             
412                                           case "1":                                                                                                             
413                                               $final = "+1 week $dia_semana";                                                                                   
414                                               break;                                                                                                             
415                                           case "2":                                                                                                             
416                                               $final = "+2 week $dia_semana";                                                                                   
417                                               break;                                                                                                             
418                                           case "3":                                                                                                             
419                                               $final = "+3 week $dia_semana";                                                                                   
420                                               break;                                                                                                             
421                                           case "5":                                                                                                             
422                                               $final = "-1 week $dia_semana";                                                                                   
423                                               break;                                                                                                             
424                                          }                                                                                                                       
425                                                                                                                                                                 
426                                          $data_incrementa = $calendar_object->datetime;                                                                         
427                                          while ($data_incrementa <=  $DT_END)                                                                                   
428                                          {                                                                                                                       
429                                            $obj_mes = dataSegundosParaT($data_incrementa,1);                                                                     
430                                            $mes_data = date_create($obj_mes);                                                                                   
431
432                                              if ($data_incrementa >= $DT_START )                                                       
433                                                {                                                                                       
434                                                 $end = $data_incrementa + $difer;                                                     
435                                                 $busydate_s = dataSegundosParaT($data_incrementa,1);                                   
436                                                 $busydate_e = dataSegundosParaT($end,1);                                               
437                                                 $fbtype = "$busydate_s/$busydate_e,".$extra;
438                                                 array_push( $fbtypee, $fbtype);                                                 
439                                                }                                                                                       
440                                              $data_proc = dataSegundosParaT($data_incrementa,1);                                       
441                                              $data_mais = date("U",strtotime("$data_proc +${intervalo} month"));                       
442                                              $mes = date("M",$data_mais);                                                               
443                                              $ano = date("Y",$data_mais);                                                               
444                                              $hora = date("G",$data_mais);                                                             
445                                              $minuto = date("i",$data_mais);                                                           
446                                              $data_incrementa = date("U",strtotime("$final ${mes} ${ano}"));                           
447                                              $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60;                     
448                                         }                                                                                               
449                                         break;                                                                                         
450
451                         
452                                case "5":
453                                        $obj_mes = dataSegundosParaT($calendar_object->datetime,1);
454                                        $date_mes = date_create($obj_mes);                         
455                                        $mes = $date_mes->format("m");                             
456                                        $ano = $date_mes->format("Y");                             
457                                        $dia = $date_mes->format("d");                             
458                                        dbg_error_log( "POST", " FreeBusy: Anual: %s", $soma );                     
459                                        $hora = $date_mes->format("G");                                             
460                                        $minuto = $date_mes->format("i");                                           
461                                        $data_incrementa = $calendar_object->datetime ;                             
462                                        while ($data_incrementa <=  $DT_END)                                         
463                                          {  if ($data_incrementa >= $DT_START )                                     
464                                            {                                                                       
465                                                $end = $data_incrementa + $difer;                                   
466                                                $busydate_s = dataSegundosParaT($data_incrementa,1);                   
467                                                $busydate_e = dataSegundosParaT($end,1);                               
468                                                $fbtype = "$busydate_s/$busydate_e,".$extra;
469                                                array_push( $fbtypee, $fbtype);                                 
470                                            }                                                                         
471                                          $i = $intervalo;                                                             
472                                           while ( $i>0 )                                                             
473                                           {                                                                           
474                                              $data_incrementa =  date("U",strtotime("$ano-$mes-$dia +1 year"));       
475                                              $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60;   
476                                              $i--;                                                                   
477                                           }                                                                           
478                                                                                                                       
479                                          }                                                                           
480                                        break;                                                                         
481
482                                  }     
483
484                                 
485                                 
486                              }                     
487                          }                         
488                     }                               
489                     break;                         
490                                                     
491                 //default:                         
492                 //  dbg_error_log( "POST", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish );
493                 //  $busy[] = $calendar_object;                                                                                                             
494                 //  break;                                                                                                                                   
495          }                                                                                                                                                   
496        }                                                                                                                                                     
497      }                                                                                                                                                       
498    }                                                                                                         
499
500
501
502
503  $freebusy = new iCalComponent();
504  $freebusy->SetType('VFREEBUSY');
505  $freebusy->AddProperty('DTSTAMP', date('Ymd\THis\Z'));
506  $freebusy->AddProperty('DTSTART', $range_start->UTC());
507  $freebusy->AddProperty('DTEND', $range_end->UTC());
508
509  sort( $fbtypee );
510  foreach( $fbtypee AS $k => $v ) {
511    $text = explode(';',$v,2);
512    $freebusy->AddProperty( 'FREEBUSY', $text[0], (isset($text[1]) ? array('FBTYPE' => $text[1]) : null) );
513  }
514
515  return $freebusy;
516}
517function dataSegundosParaT($dataseg, $opcao = 0){
518        if ($opcao!=1){                         
519                $teste = getdate($dataseg);     
520                return date("Ymd\THis",$teste[0]);
521        }                                         
522        $HorarioTimeZone = new DateTimeZone(date_default_timezone_get());
523        $HorarioTime = new DateTime("now", $HorarioTimeZone);           
524        $teste = getdate($dataseg - $HorarioTimeZone->getoffset($HorarioTime));
525        return date("Ymd\THis\Z",$teste[0]);                                   
526}                   
527function converte_semana($sema){
528        $retorna = "";
529        $param = 1;
530        while( $param <= 64 ){
531                $numero = $sema & $param;
532                if ( $numero != 0 ){
533                        switch ($numero){
534                                case 1:
535                                        $retorna .= "1";
536                                        break;
537                                case 2:
538                                        $retorna .= "2";
539                                        break;
540                                case 4:
541                                        $retorna .= "3";
542                                        break;
543                                case 8:
544                                        $retorna .= "4";
545                                        break;
546                                case 16:
547                                        $retorna .= "5";
548                                        break;
549                                case 32:
550                                        $retorna .= "6";
551                                        break;
552                                case 64:
553                                        $retorna .= "7";
554                                        break;
555                                default:
556                                        continue;
557                        }
558                }
559                $param = $param * 2;
560        }
561        //$nova = substr($retorna, 0, -1);
562        return $retorna;
563}
Note: See TracBrowser for help on using the repository browser.