PROPP;
//if ( isset($options["PROPFIND"]) ) {
// Fetch some information about the events in that calendar
$cal->SetDepth(1);
$folder_xml = $cal->DoXMLRequest("PROPFIND", $xmlC);
DEBUG_S(3,'folder_xml',$folder_xml,__FILE__,__FUNCTION__,__LINE__);
// }
/*if ( isset($options["PROPFIND"]) ) {
// Fetch some information about the events in that calendar
$cal->SetDepth(1);
/*
$folder_xml = $cal->DoXMLRequest("PROPFIND", '' );
}
*/
DEBUG_S(-3,'folder_xml',$folder_xml,__FILE__,__FUNCTION__,__LINE__);
return simplexml_load_string($folder_xml);
}
function mac_ical_parse_events_detect_what_to_sync($events_in_server,$uid,$calendar_type) {
//function to parse events from server to detect what to sync (if etag is differ)
foreach ($events_in_server->response as $id=>$object) {
$href=$object->href;
$getetag=ereg_replace('"','', $object->propstat->prop->getetag);
$displayname=$object->propstat->prop->displayname;
$getlastmodified=$object->propstat->prop->getlastmodified;
//echo "
objects ".$href." ".$getetag." / ".$displayname;
if(!empty($href) && !empty($getetag) && !empty($displayname)) {
$sql="select LOCAL_TABLE,LOCAL_ID ,resource_name , etag , unix_timestamp(TIMESTAMP) as modified from CRM_APPLE_ICAL_SYNC_PGSQL where resource_name='{$displayname}'";
// echo $sql;
$res=DB::query($sql);
while ($h=DB::fetch($res)) {
$modifed_time=strtotime($getlastmodified);
DEBUG_S(-3,"Znalazlem event zsynchronizowany do weryfikacji czy nie nalezy go zsynchronizowac - etag z serwera ({$getetag}) (getlastmodified={$getlastmodified})rem_modified({$modifed_time}!=loc_mod{$h->modified})",$h,__FILE__,__FUNCTION__,__LINE__);
//print_r($modifed_time);
$sql_="select unix_timestamp(A_RECORD_UPDATE_DATE) as modified from `{$h->LOCAL_TABLE}` where ID={$h->LOCAL_ID}";
$res_=DB::query($sql_);
while($h_=DB::fetch($res_)) {
echo "
Modifieds: ".$modifed_time." (".$getlastmodified."=".date(strtotime($getlastmodified)).") h ".$h->modified." h_:".$h_->modified;
if($h_->modified>$h->modified) $h->modified=$h_->modified;
}
//@2014-02-11 cos tu jest zjebane z timestampami z kalendarza - jakby zawyzal
//if($h->etag<>$getetag) mac_ical_parse_event_to_sync($displayname,$uid,$calendar_type,$modifed_time,$getetag);
if($h->modified<>$modifed_time) mac_ical_parse_event_to_sync($displayname,$uid,$calendar_type,$modifed_time,$getetag);
}
}
}
}
function mac_ical_parse_event_to_sync($event,$uid,$calendar_type,$modifed_time,$getetag){
echo "
!!! - trzeba synchronizowac!!! {$event},{$uid},{$calendar_type}";
require_once('stuff/caldav-client.php');
$cal = new CalDAVClient( $_SESSION['CONFIG']['CALDAV_URL']."/calendars/__uids__/{$uid}/{$calendar_type}/{$event}", $_SESSION['CONFIG']['CALDAV_USERNAME'], $_SESSION['CONFIG']['CALDAV_PASSWORD'], "" );
$folder_xml = $cal->DoGETRequest("");
DEBUG_S(3,'folder_xml',$folder_xml,__FILE__,__FUNCTION__,__LINE__);
require_once "stuff/iCalcreator.class.php";
$config=array();
$vcalendar = new vcalendar($config );
$vcalendar->parse( $folder_xml );
if($calendar_type=='tasks') $vevent=$vcalendar->getComponent( "vtodo" );
else if($calendar_type=='calendar') $vevent=$vcalendar->getComponent( "vevent" );
DEBUG_S(-3,"vevent getcomponent",$vevent);
//get event from database
$sql="select ID,LOCAL_ID, LOCAL_TABLE , unix_timestamp(TIMESTAMP) as TIMESTAMP , RESOURCE_TYPE, etag, L_APPOITMENT_USER , user_uid from CRM_APPLE_ICAL_SYNC_PGSQL where resource_name='{$event}' limit 1 ";
$res_caisp=DB::query($sql);
while($h=DB::fetch($res_caisp)) {
$local_syn=$h;
$sql="select *,unix_timestamp(A_RECORD_UPDATE_DATE) as TIMESTAMP from `{$h->LOCAL_TABLE}` where `ID`={$h->LOCAL_ID}";
$res_lt=DB::query($sql);
while($h_=DB::fetch($res_lt)) {
$local_rec=$h_;
}
}
if($local_rec->TIMESTAMP>$modifed_time) {
echo "sync from local to CalDav";
} else if($local_rec->TIMESTAMP<$modifed_time) {
echo "sync from CalDav to Local";
if($calendar_type=='tasks') {
//die('todo');
$new_L_APPOITMENT_DATE=$vevent->due[value][year]."-".$vevent->due[value][month]."-".$vevent->due[value][day];
$new_L_APPOITMENT_INFO=mysql_real_escape_string($vevent->summary[value]);
$hist_L_APPOITMENT_INFO=mysql_real_escape_string($vevent->description[0][value]);
//todo ? czy to wszystko - moze completed trzeba tez zsynchronizowac w inny sposob?!
} else DEBUG_S(-3,'538 do stworzenia sposob synchronizacji z Caldav VEVENT',null,__FILE__,__FUNCTION__,__LINE__);
//todo do historycznych tabel trzba zapisac funkcja PIOTR
$sql_local_upd="update `{$local_syn->LOCAL_TABLE}` set `L_APPOITMENT_DATE`='{$new_L_APPOITMENT_DATE}' , `L_APPOITMENT_INFO`='{$new_L_APPOITMENT_INFO}' , A_RECORD_UPDATE_DATE=now() where ID={$local_syn->LOCAL_ID}";
$sql_local_etag="update CRM_APPLE_ICAL_SYNC_PGSQL set `TIMESTAMP`=from_unixtime({$modifed_time}) where ID={$local_syn->ID} ";
DEBUG_S(-3,'Lokalnie updatuje dane z serwera CalDav :sql_local_upd/new_L_APPOITMENT_DATE/new_L_APPOITMENT_INFO/hist_L_APPOITMENT_INFO',array($sql_local_upd,$sql_local_etag,$new_L_APPOITMENT_DATE,$new_L_APPOITMENT_INFO,$hist_L_APPOITMENT_INFO),__FILE__,__FUNCTION__,__LINE__);
DB::query($sql_local_upd);
DB::query($sql_local_etag);
}
}
function insert_new_event_to_mac_ical($ROW_WITH_L_APP,$table) {
DEBUG_S(-3,'f. insert_new_event_to_mac_ical dla tabeli '.$table,$ROW_WITH_L_APP,__FILE__,__FUNCTION__,__LINE__);
$GMT_OFFSET=3600; //jaka roznica czasu do wprowadzania wydarzen w sekundach TODO w konfigu;
$user_uid=exec('dscl -q /LDAPv3/127.0.0.1 -read /Users/'.$ROW_WITH_L_APP->L_APPOITMENT_USER.' GeneratedUID', $out);
//$uniqid=uniqid();
$user_uid=str_replace('GeneratedUID: ', '', $user_uid);
echo "tutaj".$user_uid;
if(!empty($user_uid)) {
require_once "stuff/iCalcreator.class.php";
$config = array( "unique_id" => "ical-sqix-sync",
"TZID" => "Europe/Warsaw"
);
// , "TZNAME" => "CEST"
$vcalendar = new vcalendar( $config );
$config = $vcalendar->getConfig();
$tz = "Europe/Warsaw";
$xprops = array( "X-LIC-LOCATION" => $tz );
iCalUtilityFunctions::createTimezone( $vcalendar, $tz, $xprops );
$attachments_mode=0;
$organizer="''";
$organizer_object='null';
$recurrance_min='null';
$recurrance_max='null';
$access=0;
$schedule_object='FALSE';
$schedule_tag="''";
$schedule_etags="''";
$private_comments='FALSE';
$created="LOCALTIMESTAMP";
$modified="LOCALTIMESTAMP";
echo "
".$ROW_WITH_L_APP->L_APPOITMENT_DATE." - to
";
$date_parse=str_replace(array('_',':',' '),'-',$ROW_WITH_L_APP->L_APPOITMENT_DATE);
$date_parse=explode('-',$ROW_WITH_L_APP->L_APPOITMENT_DATE);
DEBUG_S(-3,'exploded L_APPOITMENT_DATE',$date_parse,__FILE__,__FUNCTION__,__LINE__);
foreach($date_parse as $id=>$val) {
settype($date_parse[$id], "integer");
}
settype($ROW_WITH_L_APP->L_APPOITMENT_PERIOD,"integer");
//print_r($date_parse);
$date_YEAR = $date_parse[0];
$date_MONTH = $date_parse[1];
$date_DAY = $date_parse[2];
$date_HOUR = $date_parse[3];
$date_MIN = $date_parse[4];
echo "
time";
$start_date="'".date('Y-m-d H:i:s',strtotime($date_YEAR."-".$date_MONTH."-".$date_DAY." ".$date_HOUR.":".$date_MIN))."'";
$end_date="'".date('Y-m-d H:i:s',strtotime($date_YEAR."-".$date_MONTH."-".$date_DAY." ".$date_HOUR.":".$date_MIN)+60*$ROW_WITH_L_APP->L_APPOITMENT_PERIOD)."'";
$description="Import zadan z systemu Procesy5 z ";//tabeli ".$table." dla rekordu";
$fields_desc=array('ID','P_ID','K_OD_KOGO','K_ZAWARTOSC','ID_PROJECT','M_DIST_DESC','M_DISTRIBUTOR','S_ADDRESS_CITY','A_PROBLEM_DESC','A_PROBLEM','A_PROBLEM_DATE','A_STATUS','T_TELBOX_ADDRESS','P_NAME','P_PHONE','P_OTHER_INFO','T_TELBOX_BUILDING_IN','I_OPER','S_KLATKA','A_RECORD_UPDATE_AUTHOR' );
foreach($fields_desc as $fld) {
if(!empty($ROW_WITH_L_APP->$fld)) $description.="
[".$fld."] = ".$ROW_WITH_L_APP->$fld;
}
$url=mac_ical_create_url_for_edit_obj($ROW_WITH_APP,$table);
if(!empty($url)) $description.="\n ".$url ;
//unset($date_HOUR);unset($date_MIN);
if(!empty($date_HOUR)) {
///to bedzie EVENT
$calendar_resource_name="calendar";
// $config = $vcalendar->getConfig();
// $vevent = new vevent( $vcalendar->getConfig() );
$vevent = & $vcalendar->newComponent( "vevent" );
$icalendar_type="'VEVENT'";
$vevent->setProperty( "DTSTART",array('year'=>$date_YEAR,'month'=>$date_MONTH,'day'=>$date_DAY,'hour'=>$date_HOUR,'minute'=>$date_MIN,'second'=>0));
$vevent->setProperty( "duration", array("min"=>$ROW_WITH_L_APP->L_APPOITMENT_PERIOD) );
$vevent->setProperty( "CALSCALE", "GREGORIAN" );
$vevent->setProperty( "summary", "(P5)".$ROW_WITH_L_APP->L_APPOITMENT_INFO." ".$ROW_WITH_L_APP->L_APPOITMENT_TYPE);
$vevent->setProperty( "description", $description);
// $vcalendar->setComponent( $vevent );
$fbtype="(select id from free_busy_type where description='busy')";
} else {
//echo "
bedzie VTODO";
$calendar_resource_name="tasks";
$fbtype="(select id from free_busy_type where description='free')";
$vevent = & $vcalendar->newComponent( "vtodo" );
$vevent->setProperty( "due",array('year'=>$date_YEAR,'month'=>$date_MONTH,'day'=>$date_DAY,'hour'=>$date_HOUR,'minute'=>$date_MIN,'second'=>0));
$vevent->setProperty( "dtstart",array('year'=>$date_YEAR,'month'=>$date_MONTH,'day'=>$date_DAY));
$vevent->setProperty( "CALSCALE", "GREGORIAN" );
$vevent->setProperty( "summary", "(P5)".$ROW_WITH_L_APP->L_APPOITMENT_INFO." ".$ROW_WITH_L_APP->L_APPOITMENT_TYPE );
$vevent->setProperty( "description", $description);
$icalendar_type="'VTODO'";
}
// $vcalendar->setProperty( "TZID", "Europe/Warsaw");
// $vcalendar->setProperty( "TZOFFSETFROM", '0100');
// $vcalendar->setProperty( "TZOFFSETTO", '0100');
if(!empty($url)) $vevent->setProperty( "url", $_SERVER['SCRIPT_URI']."/index.php?MENU_INIT=VIEWTABLE_AJAX&ZASOB_ID=".$dt->ID."#EDIT/".$ROW_WITH_L_APP->ID );
if(empty($date_YEAR)) return ;
//echo "*".$date_MONTH."*";
//var_dump($date_MONTH);
var_dump($date_MONTH);
$uniqid_ind=$vcalendar->getProperty( 'uid' );
$uniqid=key($uniqid_ind);
$vcalendar->parse();
DEBUG_S(-3,'uniqid',$uniqid);
// var_dump($uniqid);
$dropbox_id="'".$uniqid.".dropbox'";
$resource_name="'".$uniqid.".ics'";
$icalendar_uid="'".$uniqid."'";
// $vevent->setProperty( "LOCATION", "Central Plaza" );
//$v=4;
//var_dump($v);
//echo "
Return cal
";
//echo "
";
$v=$vcalendar->createCalendar();
DEBUG_S(-3,'v',$v,__FILE__,__FUNCTION__,__LINE__);
//DEBUG_S(-3,'SERVER',$_SERVER,__FILE__,__FUNCTION__,__LINE__);
/*
$uid = "event-12345";
$v="BEGIN:VCALENDAR
VERSION:2.0
PRODID:-//ical-sqix-sync//NONSGML kigkonsult.se iCalcreator 2.16.12//
BEGIN:VEVENT
DTSTAMP:20140103T130527Z
DTSTART:20140104T130000Z
DTEND:20140104T140000Z
UID:{$uid}
DESCRIPTION:Import zadan z systemu Procesy5 z
LOCATION:Office
SUMMARY:test kalendarza 7 RELATE
END:VEVENT
END:VCALENDAR";
echo $v;
*/
// $v=$vcalendar->createCalendar();
$icalendar_text="'".$v."'";
$md5="'".md5($v)."'";
//echo "";
/*
Plan taki do synchronizacji kalendarzy
[ baza translate ]
[ LOCAL_ID ]
[ LOCAL_TABLE ]
[ TIMESTAMP ]
[ REMOTE_ID ]
[ REMOTE_TABLE ]
1) lokalnie ( dodaje nowe wydarzenie USERS2_MARKETING (
id,
data+czas,
L_APP_INFO ,
L_APP_USER)
2) foreach table, ktore maja cos w L_APP_DATE szukam w translate
a) jak pusto, to
- dodaje do ICALÄËĂÂĂÂa ( REMOTE_TABLE, REMOTE_ID )
- dodaje do [TRANSLATE] [REMOTE_ID,REMOTE_TABLE,LOCAL_ID,LOCAL_TABLE,TIMESTAMP]
c) trzeba wykryc resource_id -> calendar_home_resource_id w calendar_home ( po owner_uid )
b) trzeba wykryc calendar_home_resource_id w calendar_bind
c) trzeba wykryc w calendar_bind calendar_resource_id (zawsze calendar),
(itd...)
4) synchronizacja od strony lokalnej - jezeli rekord LOCAL i A_UPD_DAT jest > CRM_APPLE_ICAL_SYNC_PGSQL.Timestamp, to jedziemy
a) zaktualizuj rekord w caldavie
aa)- zmiana terminow -> edytuj
bb)- zmiana wlasciciela -> kopiuj nowy obiekt, stary zaznacz skasowano
5) synchronizacja od strony caldav'a
a) - przesun spotkanie
b) - skasuj spotkanie - wyrzuc siebie z osoby odpowiedzialnej
*/
// include 'webdav/vendor/autoload.php';
//echo 'SabreDAV ', \Sabre\DAV\Version::VERSION, ' is installed.';
require_once('stuff/caldav-client.php');
// $cal = new CalDAVClient( "https://biuro.biall-net.pl/", "a.binder", "xxxx", "" );
$dav_target=$_SESSION['CONFIG']['CALDAV_URL']."/calendars/__uids__/".$user_uid."/".$calendar_resource_name."/{$uniqid}.ics";
DEBUG_S(-3,'Dav target',$dav_target,__FILE__,__FUNCTION__,__LINE__);
$cal = new CalDAVClient( $dav_target, $_SESSION['CONFIG']['CALDAV_USERNAME'], $_SESSION['CONFIG']['CALDAV_PASSWORD'], "" );
//$cal->DoPUTRequest("",$icalendar,"");
//! udostepnienie kalendarza konta docelowego dla administratora - wymaga echo "_www ALL = NOPASSWD: /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals " >> /etc/sudoers;
$cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --add-write-proxy=users:".$_SESSION['CONFIG']['CALDAV_USERNAME']." users:".$ROW_WITH_L_APP->L_APPOITMENT_USER; $out="";$exit="";
exec($cmd_share, $out,$exit);
DEBUG_S(-3,'share calendar cmd/out/exit',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
$ret=$cal->DoPUTRequest("",$v,'*');
DEBUG_S(-3,'ret/md5',array($ret,$md5),__FILE__,__FUNCTION__,__LINE__);
mac_ical_parse_test_return_added_obj($ret);
// die();
echo "
".$user_uid;
/*
$dbconn = pg_connect("host='/Library/Server/PostgreSQL For Server Services/Socket' port=5432 user=caldav dbname=caldav");
$sql_insert_pgsql="insert into calendar_object ( resource_id , calendar_resource_id , resource_name , icalendar_text, icalendar_uid ,
icalendar_type , attachments_mode, dropbox_id, organizer, organizer_object, recurrance_min, recurrance_max, access, schedule_object,
schedule_tag , schedule_etags , private_comments , md5, created, modified )
select
(
select max(resource_id) as max from calendar_object
union select max(resource_id) as max from calendar_metadata
order by max desc
limit 1
)+1 as resource_id
, t2.calendar_resource_id , ".$resource_name." , ".$icalendar_text." , ".$icalendar_uid."
, ".$icalendar_type." , ".$attachments_mode." , ".$dropbox_id." , ".$organizer." , ".$organizer_object."
, ".$recurrance_min." , ".$recurrance_max." , ".$access." , ".$schedule_object."
, ".$schedule_tag." , ".$schedule_etags." , ".$private_comments." , ".$md5." , ".$created." , ".$modified."
from calendar_home as t1
join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
where
t1.owner_uid='".$user_uid."'
;
SELECT resource_id from calendar_object where resource_name=".$resource_name." LIMIT 1;
";
echo "
".$sql_insert_pgsql;
$qry=pg_query($dbconn,$sql_insert_pgsql);
$fch = pg_fetch_row($qry);
echo "
\n Inserted id resource id:";
print_r($fch);
$sql_insert_pgsql="insert into calendar_object_revisions
( calendar_home_resource_id, calendar_resource_id, calendar_name, resource_name, revision, deleted )
select
t2.calendar_home_resource_id , t2.calendar_resource_id
, NULL
, ".$resource_name."
, ( select max(revision) as max from calendar_object_revisions )+1 as revision
, FALSE
from calendar_home as t1
join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
where
t1.owner_uid='".$user_uid."' ";
echo "
".$sql_insert_pgsql;
pg_query($dbconn,$sql_insert_pgsql);
$sql_insert_pgsql="insert into time_range ( calendar_resource_id , calendar_object_resource_id, floating , start_date, end_date , fbtype , transparent )
select t2.calendar_resource_id , ".$fch[0]." , FALSE , ".$start_date.",".$end_date." , ".$fbtype." , FALSE
from calendar_home as t1
join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
where
t1.owner_uid='".$user_uid."' ";
echo "
".$sql_insert_pgsql;
pg_query($dbconn,$sql_insert_pgsql);
//aktualizacja info, ze cos zostalo dodane itp
$sql_insert_pgsql="update calendar_metadata set modified=LOCALTIMESTAMP where
resource_id=(select t2.calendar_resource_id from calendar_home as t1
join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
where t1.owner_uid='".$user_uid."' ) , supported_components=".$icalendar_type." ";
echo "
".$sql_insert_pgsql;
pg_query($dbconn,$sql_insert_pgsql);
*/
//teraz confirm , ze jest zaimportowane
mac_ical_notify_added_event_to_db($ROW_WITH_L_APP,$table,$resource_name,$icalendar_type,md5($v),$user_uid);
//pg_last_oid($res2);
} //not empty
}