Privileges(); if ( !isset($range_start) || !isset($range_end) ) { $request->DoResponse( 400, 'All valid freebusy requests MUST contain a time-range filter' ); } $filtro = "mail=".$mail; $atributos = array("uidNumber"); $uidnumber = ldapDrivers::requestAtributo($filtro, $atributos); if ($uidnumber == false) { dbg_error_log( "POST", "Responding with free/busy error: email usuario não encontrado no diretorio"); $request->DoResponse( 501, 'Database error'); } $cpfuser = $uidnumber['uidNumber']; //8888888888888888888888 Comentado para funcionar com Expresso owner: gabriel Malheiros 10.12.2010 8888888888888888888888888888888888888 // $params = array( ':path_match' => $path_match, ':start' => $range_start->UTC(), ':end' => $range_end->UTC() ); // $where = ' WHERE caldav_data.dav_name ~ :path_match '; // $where .= 'AND rrule_event_overlaps( dtstart, dtend, rrule, :start, :end) '; // $where .= "AND caldav_data.caldav_type IN ( 'VEVENT', 'VTODO' ) "; // $where .= "AND (calendar_item.transp != 'TRANSPARENT' OR calendar_item.transp IS NULL) "; // $where .= "AND (calendar_item.status != 'CANCELLED' OR calendar_item.status IS NULL) "; // $where .= "AND collection.is_calendar AND collection.schedule_transp = 'opaque' "; // if ( $bin_privs != privilege_to_bits('all') ) { // $where .= "AND (calendar_item.class != 'PRIVATE' OR calendar_item.class IS NULL) "; // } // $fbtimes = array(); // $sql = 'SELECT caldav_data.caldav_data, calendar_item.rrule, calendar_item.transp, calendar_item.status, '; // $sql .= "to_char(calendar_item.dtstart at time zone 'GMT',".iCalendar::SqlUTCFormat().') AS start, '; // $sql .= "to_char(calendar_item.dtend at time zone 'GMT',".iCalendar::SqlUTCFormat().') AS finish '; // $sql .= 'FROM caldav_data INNER JOIN calendar_item USING(dav_id,user_no,dav_name,collection_id) '; // $sql .= 'INNER JOIN collection USING(collection_id)'; // $sql .= $where; // if ( isset($c->strict_result_ordering) && $c->strict_result_ordering ) $sql .= ' ORDER BY dav_id'; // $qry = new AwlQuery( $sql, $params ); // if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows() > 0 ) { // while( $calendar_object = $qry->Fetch() ) { // $extra = ''; // if ( $calendar_object->status == 'TENTATIVE' ) { // $extra = ';BUSY-TENTATIVE'; // } // dbg_error_log( "REPORT", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish ); // $ics = new vComponent($calendar_object->caldav_data); // $expanded = expand_event_instances($ics, $range_start, $range_end); // $expansion = $expanded->GetComponents( array('VEVENT'=>true,'VTODO'=>true,'VJOURNAL'=>true) ); // foreach( $expansion AS $k => $v ) { // echo "=====================================================\n"; // printf( "Type: %s\n", $v->GetType()); // print_r($v); // echo "-----------------------------------------------------\n"; // $start_date = $v->GetProperty('DTSTART'); // if ( !isset($start_date) ) continue; // $start_date = new RepeatRuleDateTime($start_date->Value()); // $duration = $v->GetProperty('DURATION'); // $duration = ( !isset($duration) ? 'P1D' : $duration->Value()); // $end_date = clone($start_date); // $end_date->modify( $duration ); // if ( $end_date < $range_start || $start_date > $range_end ) continue; // $thisfb = $start_date->UTC() .'/'. $end_date->UTC() . $extra; // array_push( $fbtimes, $thisfb ); // } // } // } $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)); if ( $qry->Exec("POST",__LINE__,__FILE__) && $qry->rows() > 0 ) { $fbtypee = array(); $fbtype = ""; while( $calendar_object = $qry->Fetch() ) { if ( $calendar_object->is_public == 1 ) { if ( $calendar_object->cal_status == 'A' ) { $extra = ';BUSY'; } elseif ( $calendar_object->cal_status == 'U' ) { $extra = ';BUSY-UNAVAILABLE'; } elseif ( $calendar_object->cal_status == 'T' ) { $extra = ';BUSY-TENTATIVE'; } else { $extra = ';FREE'; } switch ( $calendar_object->cal_type ) { case "E": dbg_error_log( "POST", " FreeBusy: nao recorrente: %s, %s", $calendar_object->datetime, $calendar_object->edatetime ); // $busy_tentative[] = $calendar_object; $dateTime = date_create($fbq_start); $DT_START = $dateTime->format("U"); $dateTime_end = date_create($fbq_end ); $DT_END = $dateTime_end->format("U"); if ( $calendar_object->datetime >= $DT_START && $calendar_object->edatetime <= $DT_END) { if(isset($fbtype)){ $busydate_s = dataSegundosParaT($calendar_object->datetime,1); $busydate_e = dataSegundosParaT($calendar_object->edatetime,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } else { $busydate_s = dataSegundosParaT($calendar_object->datetime,1); $busydate_e = dataSegundosParaT($calendar_object->edatetime,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } } break; case "M": // Cancelled events are ignored dbg_error_log( "POST", " FreeBusy: recorrente: %s, %s", $calendar_object->datetime, $calendar_object->edatetime ); $dateTime = date_create($fbq_start); $DT_START = $dateTime->format("U"); $dateTime_end = date_create($fbq_end ); $DT_END = $dateTime_end->format("U"); $hora_extra = $dateTime->format("G") * 3600; $difer = $calendar_object->edatetime - $calendar_object->datetime; $qryp = new PgQuery( "SELECT * from phpgw_cal_repeats where cal_id = ? ", $calendar_object->cal_id); if ( $qryp->Exec("POST",__LINE__,__FILE__) && $qryp->rows > 0 ) { $calendar_repeats = $qryp->Fetch(); if ( $calendar_repeats->recur_enddate >= $DT_START && $calendar_repeats->recur_enddate <= $DT_END ) { $next_cal = date_create($calendar_object->datetime); $data_diferencial =$DT_START - $calendar_object->datetime; // while ($data_incrementa <= $calendar_repeats->recur_enddate) $intervalo = ($calendar_repeats->recur_interval == 0) ? "1" : "$calendar_repeats->recur_interval"; switch ( $calendar_repeats->recur_type ) { case "1": $modulo = $intervalo * 86400; $soma = $data_diferencial % $modulo; dbg_error_log( "POST", " FreeBusy: diario: %s", $data_diferencial); $data_incrementa = $DT_START - $soma; while ($data_incrementa <= $calendar_repeats->recur_enddate) { if ($data_incrementa >= $DT_START ) { $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $data_incrementa = $data_incrementa + 86400 * $intervalo; } break; case "2": $modulo = $intervalo * 86400; $soma = $data_diferencial % $modulo; $data_incrementa = $DT_START - $soma; dbg_error_log( "POST", " FreeBusy: semanal: %s", $soma ); while ($data_incrementa <= $calendar_repeats->recur_enddate) { $difer_semana = $DT_START - $data_incrementa; if ($data_incrementa >= $DT_START || $difer_semana <= 604800 ) { $semana = str_split(converte_semana($calendar_repeats->recur_data)); $lef = count($semana); for ( $i=0;$i<$lef;$i++ ) { $obj_semana = dataSegundosParaT($data_incrementa,1); $dia_semana = date_create($obj_semana); $week = $dia_semana->format("w") + 1; $diferenca = $semana[$i] - $week; $data_semana = $data_incrementa + $diferenca * 86400; $end = $data_semana + $difer; $busydate_s = dataSegundosParaT($data_semana,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } } $data_incrementa = $data_incrementa + 604800 * $intervalo; } break; case "3": $data_incrementa = $calendar_object->datetime; while ($data_incrementa <= $calendar_repeats->recur_enddate) dbg_error_log( "POST", " FreeBusy: mensal: %s", $soma ); { if ($data_incrementa >= $DT_START ) { $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $i =$intervalo; while ( $i>0 ) { $mes_data = date_create($data_incrementa); $dias_mes = $mes_data->format("t"); $data_incrementa = $data_incrementa + 86400 * $dias_mes; $mes_data = date_create($data_incrementa); $dias_mes = $mes_data->format("t"); $i--; } } break; case "4": $obj_mes = dataSegundosParaT($calendar_object->datetime,1); $data_mes = date_create($obj_mes); $mes = $data_mes->format("m"); $ano = $data_mes->format("Y"); $algo = "${ano}${mes}01T000000Z"; $dia_primeiro = date_create($algo); // $semana_mes = $data_mes->format("W") - $dia_primeiro->format("W"); $difer_semana = $calendar_object->datetime - $dia_primeiro->format("U"); $dividendo = $difer_semana / 604800; $semana_mes = str_split($dividendo); $dia_semana = $data_mes->format("D"); switch ($semana_mes[0]) {case "0": $final = "+0 week $dia_semana"; break; case "1": $final = "+1 week $dia_semana"; break; case "2": $final = "+2 week $dia_semana"; break; case "3": $final = "+3 week $dia_semana"; break; case "5": $final = "-1 week $dia_semana"; break; } $data_incrementa = $calendar_object->datetime; while ($data_incrementa <= $DT_END) { $obj_mes = dataSegundosParaT($data_incrementa,1); $mes_data = date_create($obj_mes); if ($data_incrementa >= $DT_START ) { $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $data_proc = dataSegundosParaT($data_incrementa,1); $data_mais = date("U",strtotime("$data_proc +${intervalo} month")); $mes = date("M",$data_mais); $ano = date("Y",$data_mais); $hora = date("G",$data_mais); $minuto = date("i",$data_mais); $data_incrementa = date("U",strtotime("$final ${mes} ${ano}")); $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60; } break; case "5": $obj_mes = dataSegundosParaT($calendar_object->datetime,1); $date_mes = date_create($obj_mes); $mes = $date_mes->format("m"); $ano = $date_mes->format("Y"); $dia = $date_mes->format("d"); $hora = $date_mes->format("G"); $minuto = $date_mes->format("i"); $data_incrementa = $calendar_object->datetime ; dbg_error_log( "POST", " FreeBusy: anual: %s", $soma ); while ($data_incrementa <= $calendar_repeats->recur_enddate) { if ($data_incrementa >= $DT_START ) { $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60; $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $i =$intervalo; while ($i>0) { $data_incrementa = date("U",strtotime("$ano-$mes-$dia +1 year")); $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60; $i++; } } break; } } else { if ( $calendar_repeats->recur_enddate >= $DT_START || $calendar_repeats->recur_enddate == 0 ) {$next_cal = date_create($calendar_object->datetime); $data_diferencial =$DT_START - $calendar_object->datetime; // while ($data_incrementa <= $calendar_repeats->recur_enddate) $intervalo = ($calendar_repeats->recur_interval == 0) ? "1" : "$calendar_repeats->recur_interval"; switch ( $calendar_repeats->recur_type ) { case "1": $modulo = $intervalo * 86400; $soma = $data_diferencial % $modulo; //$hora_extra = $dateTime->format("G") * 3600; dbg_error_log( "POST", " FreeBusy: diario: %s", $soma ); $data_incrementa = $DT_START - $soma; while ($data_incrementa <= $DT_END) { if ($data_incrementa >= $DT_START ) { $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $data_incrementa = $data_incrementa + 86400 * $intervalo; } break; case "2": $modulo = $intervalo * 86400; $soma = $data_diferencial % $modulo; $data_incrementa = $DT_START - $soma; while ($data_incrementa <= $DT_END) { $difer_semana = $DT_START - $data_incrementa; if ($data_incrementa >= $DT_START || $difer_semana <= 604800 ) { $semana = str_split(converte_semana($calendar_repeats->recur_data)); $lef = count($semana); for ( $i=0;$i<$lef;$i++ ) { $obj_semana = dataSegundosParaT($data_incrementa,1); $dia_semana = date_create($obj_semana); $week = $dia_semana->format("w") + 1; $diferenca = $semana[$i] - $week; $data_semana = $data_incrementa + $diferenca * 86400; $end = $data_semana + $difer; $busydate_s = dataSegundosParaT($data_semana,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } } $data_incrementa = $data_incrementa + 604800 * $intervalo; } break; case "3": $data_incrementa = $calendar_object->datetime; dbg_error_log( "POST", " FreeBusy: mensal: %s", $soma ); while ($data_incrementa <= $DT_END) { if ($data_incrementa >= $DT_START ) { $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $i =$intervalo; while ( $i>0 ) { $obj_mes = dataSegundosParaT($data_incrementa,1); $mes_data = date_create($obj_mes); $dias_mes = $mes_data->format("t"); $data_incrementa = $data_incrementa + 86400 * $dias_mes; $obj_mes = dataSegundosParaT($data_incrementa,1); $mes_data = date_create($obj_mes); $dias_mes = $mes_data->format("t"); $i--; } } break; case "4": $obj_mes = dataSegundosParaT($calendar_object->datetime,1); $data_mes = date_create($obj_mes); $mes = $data_mes->format("m"); $ano = $data_mes->format("Y"); $algo = "${ano}${mes}01T000000Z"; $dia_primeiro = date_create($algo); //$semana_mes = $data_mes->format("W") - $dia_primeiro->format("W"); $difer_semana = $calendar_object->datetime - $dia_primeiro->format("U"); $dividendo = $difer_semana / 604800; $semana_mes = str_split($dividendo); $dia_semana = $data_mes->format("D"); switch ($semana_mes[0]) {case "0": $final = "+0 week $dia_semana"; break; case "1": $final = "+1 week $dia_semana"; break; case "2": $final = "+2 week $dia_semana"; break; case "3": $final = "+3 week $dia_semana"; break; case "5": $final = "-1 week $dia_semana"; break; } $data_incrementa = $calendar_object->datetime; while ($data_incrementa <= $DT_END) { $obj_mes = dataSegundosParaT($data_incrementa,1); $mes_data = date_create($obj_mes); if ($data_incrementa >= $DT_START ) { $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $data_proc = dataSegundosParaT($data_incrementa,1); $data_mais = date("U",strtotime("$data_proc +${intervalo} month")); $mes = date("M",$data_mais); $ano = date("Y",$data_mais); $hora = date("G",$data_mais); $minuto = date("i",$data_mais); $data_incrementa = date("U",strtotime("$final ${mes} ${ano}")); $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60; } break; case "5": $obj_mes = dataSegundosParaT($calendar_object->datetime,1); $date_mes = date_create($obj_mes); $mes = $date_mes->format("m"); $ano = $date_mes->format("Y"); $dia = $date_mes->format("d"); dbg_error_log( "POST", " FreeBusy: Anual: %s", $soma ); $hora = $date_mes->format("G"); $minuto = $date_mes->format("i"); $data_incrementa = $calendar_object->datetime ; while ($data_incrementa <= $DT_END) { if ($data_incrementa >= $DT_START ) { $end = $data_incrementa + $difer; $busydate_s = dataSegundosParaT($data_incrementa,1); $busydate_e = dataSegundosParaT($end,1); $fbtype = "$busydate_s/$busydate_e,".$extra; array_push( $fbtypee, $fbtype); } $i = $intervalo; while ( $i>0 ) { $data_incrementa = date("U",strtotime("$ano-$mes-$dia +1 year")); $data_incrementa = $data_incrementa + $hora * 60 * 60 + $minuto * 60; $i--; } } break; } } } } break; //default: // dbg_error_log( "POST", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish ); // $busy[] = $calendar_object; // break; } } } } $freebusy = new iCalComponent(); $freebusy->SetType('VFREEBUSY'); $freebusy->AddProperty('DTSTAMP', date('Ymd\THis\Z')); $freebusy->AddProperty('DTSTART', $range_start->UTC()); $freebusy->AddProperty('DTEND', $range_end->UTC()); sort( $fbtypee ); foreach( $fbtypee AS $k => $v ) { $text = explode(';',$v,2); $freebusy->AddProperty( 'FREEBUSY', $text[0], (isset($text[1]) ? array('FBTYPE' => $text[1]) : null) ); } return $freebusy; } function dataSegundosParaT($dataseg, $opcao = 0){ if ($opcao!=1){ $teste = getdate($dataseg); return date("Ymd\THis",$teste[0]); } $HorarioTimeZone = new DateTimeZone(date_default_timezone_get()); $HorarioTime = new DateTime("now", $HorarioTimeZone); $teste = getdate($dataseg - $HorarioTimeZone->getoffset($HorarioTime)); return date("Ymd\THis\Z",$teste[0]); } function converte_semana($sema){ $retorna = ""; $param = 1; while( $param <= 64 ){ $numero = $sema & $param; if ( $numero != 0 ){ switch ($numero){ case 1: $retorna .= "1"; break; case 2: $retorna .= "2"; break; case 4: $retorna .= "3"; break; case 8: $retorna .= "4"; break; case 16: $retorna .= "5"; break; case 32: $retorna .= "6"; break; case 64: $retorna .= "7"; break; default: continue; } } $param = $param * 2; } //$nova = substr($retorna, 0, -1); return $retorna; }