superedit-APPLE_ICAL_SE_SYNC.php 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. <?php
  2. function apple_bash_variables_set_to_exec(){
  3. //function needed by apple to correctly set paths. exit from this function should be used like:
  4. // $cmd_share=apple_bash_variables_set_to_exec().' sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --list-principals resources';
  5. // exec($cmd_share, $out,$exit);
  6. //
  7. return "export PATH=/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/local/bin:/Applications/Server.app/Contents/ServerRoot/usr/bin:/Applications/Server.app/Contents/ServerRoot/usr/sbin
  8. ";
  9. }
  10. function APPLE_ICAL_SE_SYNC() {
  11. //function to share events from SE/Procesy5 to Apple CalDavServer
  12. // creating resources: locations/resources
  13. // sharing them to correct groups/owners according to source record policy
  14. //
  15. // at the moment @2014-01-15 working only one way
  16. // -TODO update added events 2 way
  17. // -TODO verify perms for shared calendar
  18. // -TODO add events to localisations/resources also (when they are joined somehow in system PROJECTS-LOCATIONS--Table1,Table2,Table3
  19. /*
  20. $options = $cal->DoOptionsRequest();
  21. DEBUG_S(-3,'options',$options);
  22. if ( isset($options["PROPFIND"]) ) {
  23. // Fetch some information about the events in that calendar
  24. $cal->SetDepth(1);
  25. $folder_xml = $cal->DoXMLRequest("PROPFIND", '<?xml version="1.0" encoding="utf-8" ?><propfind xmlns="DAV:"><prop><getcontentlength/><getcontenttype/><resourcetype/><getetag/></prop></propfind>' );
  26. }
  27. DEBUG_S(-3,'folder_xml',$folder_xml);
  28. $events = $cal->GetEvents("20070101T000000Z","20140201T000000Z");
  29. DEBUG_S(-3,'events',$events);
  30. */
  31. //die('eof TEST');
  32. $GMT_OFFSET=3600; //jaka roznica czasu do wprowadzania wydarzen w sekundach TODO w konfigu;
  33. $_REQUEST['ID']=addslashes($_REQUEST['ID']);
  34. $sql_tables_arr[]="show tables like 'USERS2_MARKETING'";
  35. $sql_tables_arr[]="show tables like 'IN7_MK_BAZA_DYSTRYBUCJI'";
  36. $sql_tables_arr[]="show tables like 'DEVICES'";
  37. $sql_tables_arr[]="show tables like 'TELBOXES'";
  38. foreach($sql_tables_arr as $sql_tables) {
  39. $rt=DB::query($sql_tables);
  40. //! 1 wyszukanie tabel
  41. while($t=DB::fetch_array($rt)) {
  42. if(!strstr($t[0],'_HIST'))
  43. $tbls[]=$t[0];
  44. }
  45. }
  46. DEBUG_S(-3,'tabele do przejscia',$tbls,__FILE__,__FUNCTION__,__LINE__);
  47. echo "APPLE_ICAL_SE_SYNC";
  48. /*
  49. //! szukamy ostatniej daty zsynchronizwanego wydarzenia lokalnie
  50. $sql="select unix_timestamp(max(TIMESTAMP))+".$GMT_OFFSET." as MAX_LEFT from CRM_APPLE_ICAL_SYNC_PGSQL";
  51. $res_max_left=DB::query($sql);
  52. while($h=DB::fetch($res_max_left)) { $max_ts_left=$h->MAX_LEFT;}
  53. DEBUG_S(-3,'maxymalna data synchr z lewej MAX_LEFT = '.$max_ts_left,null,__FILE__,__FUNCTION__,__LINE__);
  54. //! szukamy ostatniej daty dodanego/zsynchronizowanego wydarzenia zdalnie
  55. //(calendar_metadata resource_id , created,modified - 2013-05-17 11:09:16.409332 )
  56. $dbconn = pg_connect("host='/Library/Server/PostgreSQL For Server Services/Socket' port=5432 user=caldav dbname=caldav");
  57. $psql="select extract( epoch from max(cm.modified)) from calendar_metadata as cm
  58. left join calendar_object_revisions as cor on cor.calendar_resource_id=cm.resource_id
  59. where cor.resource_name like '%-ical-sqix-sync%'
  60. " ;
  61. $qry=pg_query($dbconn,$psql);
  62. $fch = pg_fetch_row($qry); list($max_ts_right)=explode(".",$fch[0]);
  63. DEBUG_S(-3,'maxymalna data synchr z prawej MAX_RIGHT = '.$max_ts_right,$psql,__FILE__,__FUNCTION__,__LINE__);
  64. // sync_events_from_mac($max_ts_left,$max_ts_right);
  65. */
  66. $uid='4720124D-5F20-4EAB-B501-4872E33F9A5C'; //is a.binder
  67. $calendar_type='tasks';
  68. // $events_in_server_cal=mac_ical_get_events_etag('4720124D-5F20-4EAB-B501-4872E33F9A5C','calendar');
  69. $events_in_server=mac_ical_get_events_etag($uid,$calendar_type);
  70. //$events_in_server = (object)array_merge((array)$events_in_server_cal, (array)$events_in_server_task);
  71. DEBUG_S(-3,'All Events in server ',$events_in_server,__FILE__,__FUNCTION__,__LINE__);
  72. mac_ical_parse_events_detect_what_to_sync($events_in_server,$uid,$calendar_type);
  73. //! FOREACH $tbls
  74. foreach($tbls as $table) {
  75. $sql="describe `".$table."`";
  76. $res=DB::query($sql);
  77. $found_ID=false;
  78. $found_L_APPOITMENT_DATE=false;
  79. $found_L_APPOITMENT_USER=false;
  80. $found_L_APPOITMENT_PERIOD=false;
  81. $found_L_APPOITMENT_INFO=false;
  82. $found_A_RECORD_UPDATE_DATE=false;
  83. //! 2 sprawdzenie czy sa pola do synchronizacji
  84. //odczytujemy wszystkie eventy z serwera dla potrzeb synchronizacji
  85. while($h=DB::fetch_array($res)) {
  86. if($h[0]=='ID') $found_ID=true;
  87. if($h[0]=='L_APPOITMENT_DATE') $found_L_APPOITMENT_DATE=true;
  88. if($h[0]=='L_APPOITMENT_USER') $found_L_APPOITMENT_USER=true;
  89. if($h[0]=='L_APPOITMENT_PERIOD') $found_L_APPOITMENT_PERIOD=true;
  90. if($h[0]=='L_APPOITMENT_INFO') $found_L_APPOITMENT_INFO=true;
  91. if($h[0]=='A_RECORD_UPDATE_DATE') $found_A_RECORD_UPDATE_DATE=true;
  92. }
  93. if(($found_ID)&&($found_L_APPOITMENT_PERIOD)&&($found_L_APPOITMENT_USER)&&($found_L_APPOITMENT_PERIOD)&&($found_L_APPOITMENT_INFO)&&($found_A_RECORD_UPDATE_DATE)) {
  94. echo "<br>Bede synchronizowac ".$table;
  95. $sql="select t1.*
  96. from `".$table."` as t1
  97. left join CRM_APPLE_ICAL_SYNC_PGSQL as cs
  98. on ( cs.LOCAL_TABLE='".$table."' and cs.LOCAL_ID=t1.ID )
  99. where cs.ID is null and
  100. t1.L_APPOITMENT_DATE>0 and ( t1.L_APPOITMENT_USER like '%a.binder%' or t1.L_APPOITMENT_USER like 'xx%crash%' or t1.L_APPOITMENT_USER like 'xx%bzyk%' or t1.L_APPOITMENT_USER like 'xx%moksik%')
  101. limit 2;
  102. ";
  103. DEBUG_S(-3,'SQL',$sql,__FILE__,__FUNCTION__,__LINE__);
  104. $res_rigt=DB::query($sql);
  105. //! 3 szukamy nowych wydarzen do dodania do kalendarza
  106. while($ROW_WITH_L_APP=DB::fetch($res_rigt)) {
  107. insert_new_event_to_mac_ical($ROW_WITH_L_APP,$table);
  108. }
  109. //! 4 dodajemy nowe resource do kalendarzy -
  110. //patrzymy jakie sa pola w danej tabeli - szukajac specjalnej kolumny L_CALENDAR
  111. $sql="describe ".$table;
  112. $res_rigt=DB::query($sql);
  113. $has_L_CALENDAR=false;
  114. while($ROW_WITH_L_APP=DB::fetch($res_rigt)) {
  115. if($ROW_WITH_L_APP->Field=='L_CALENDAR') $has_L_CALENDAR=true;
  116. }
  117. if($has_L_CALENDAR) {
  118. $sql="select t1.*
  119. from `".$table."` as t1
  120. left join _SYNC_ICAL_RESOURCES as cs
  121. on ( cs.LOCAL_TABLE='".$table."' and cs.LOCAL_ID=t1.ID )
  122. where cs.GUID is null and
  123. t1.L_CALENDAR='YES'
  124. limit 100;
  125. ";
  126. DEBUG_S(-3,'SQL',$sql,__FILE__,__FUNCTION__,__LINE__);
  127. $res_rigt=DB::query($sql);
  128. while($ROW_WITH_L_APP=DB::fetch($res_rigt)) {
  129. mac_ical_try_create_calendar($ROW_WITH_L_APP,$table);
  130. }
  131. }
  132. //! todo szukamy ostatniej daty aktualizacji rekordu ze wszystkich tabel dla danego usera
  133. //! todo szukamy date ostatniej aktualizacji eventu u uzytkownika
  134. //! todo szukamy daty ostatniej synchronizacji
  135. }
  136. }
  137. }
  138. function mac_ical_try_create_calendar($ROW_WITH_L_APP,$table) {
  139. //$ROW_WITH_L_APP=DB::fetch(zapytanie sql)
  140. //$table= nazwa tabeli
  141. //funkcja która probuje stworzyć kalendarz w przypadku kiedy tabela posiada kolumny CALENDAR oraz CALENDAR_RESOURCE_ID
  142. // jezeli nie jest puste CALENDAR_RESOURCE_ID to system probuje je stworzyc i zaktualiozwac informacje o numerze resource ID
  143. // to ma byc jednorazowa akcja
  144. if(isset($ROW_WITH_L_APP->L_CALENDAR) ) {
  145. if(($ROW_WITH_L_APP->L_CALENDAR=='YES')) {
  146. //bedziemy tworzyc nowy resource
  147. mac_ical_create_resource_bash($ROW_WITH_L_APP,$table);
  148. }
  149. }
  150. }
  151. function mac_ical_get_long_name($ROW_WITH_L_APP,$table) {
  152. $name=$ROW_WITH_L_APP->ID;
  153. if(!empty($ROW_WITH_L_APP->M_DISTRIBUTOR)) $name.="_".substr($ROW_WITH_L_APP->M_DISTRIBUTOR, 0,50);
  154. if(!empty($ROW_WITH_L_APP->M_DIST_DESC)) $name.="_".substr($ROW_WITH_L_APP->M_DIST_DESC, 0,50);
  155. if(!empty($ROW_WITH_L_APP->T_DEVICE_TYPE)) $name.="_".substr($ROW_WITH_L_APP->T_DEVICE_TYPE, 0,50);
  156. if(!empty($ROW_WITH_L_APP->T_DEVICE_INFO)) $name.="_".substr($ROW_WITH_L_APP->T_DEVICE_INFO, 0,50);
  157. if(!empty($ROW_WITH_L_APP->T_DEVICE_SERIAL)) $name.="_".substr($ROW_WITH_L_APP->T_DEVICE_SERIAL, 0,50);
  158. if(!empty($ROW_WITH_L_APP->T_PRODUCER)) $name.="_".substr($ROW_WITH_L_APP->T_PRODUCER, 0,50);
  159. if(!empty($ROW_WITH_L_APP->T_TELBOX_NAME)) $name.="_".substr($ROW_WITH_L_APP->T_TELBOX_NAME, 0,50);
  160. if(!empty($ROW_WITH_L_APP->S_ADDRESS_STREET)) $name.="_".substr($ROW_WITH_L_APP->S_ADDRESS_STREET, 0,50);
  161. if(!empty($ROW_WITH_L_APP->S_OTHER_INFO)) $name.="_".substr($ROW_WITH_L_APP->S_OTHER_INFO, 0,50);
  162. $name=preg_replace('((?![a-z]|[A-Z]|[0-9]|[\ ]|[_]|[-]).)', '', $name);
  163. return $name;
  164. }
  165. function mac_ical_get_short_name($ROW_WITH_L_APP,$table) {
  166. $name=$ROW_WITH_L_APP->ID."_".$table;
  167. return $name;
  168. }
  169. function mac_ical_parse_exit_if_added($exit){
  170. if(strstr($exit[0],'Added')) DEBUG_S(-3,'successfully added new object to calendar');
  171. else { DEBUG_S(-3,'error adding to calendar server',$exit,__FILE__,__FUNCTION__,__LINE__);
  172. die();
  173. }
  174. die('cos');
  175. }
  176. function mac_ical_notify_created_obj_db($created_resource_UUID,$resource_type,$table,$ROW_WITH_L_APP) {
  177. //function to notify DB that record was created
  178. $sql="insert into _SYNC_ICAL_RESOURCES (ID,LOCAL_TABLE,LOCAL_ID,RES_TYPE,GUID) values ('','".$table."','".$ROW_WITH_L_APP->ID."','".$resource_type."','".$created_resource_UUID."')";
  179. DEBUG_S(-3,'sql to notify DB ',$sql,__FILE__,__FUNCTION__,__LINE__);
  180. DB::query($sql);
  181. }
  182. function mac_ical_create_resource_bash($ROW_WITH_L_APP,$table) {
  183. $resource_name=mac_ical_get_long_name($ROW_WITH_L_APP,$table);
  184. $resource_short_name=mac_ical_get_short_name($ROW_WITH_L_APP,$table);
  185. //funkcja zaklada nowy resource w lokalnym kalendarzu za pomoca komend roota calendarservermanage_principals
  186. if($table=='IN7_MK_BAZA_DYSTRYBUCJI') $resource_type='resources';
  187. else if($table=='TELBOXES') $resource_type='locations';
  188. else $resource_type='resources';
  189. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --add ".$resource_type." '".$resource_name."' ".$resource_short_name; $out="";$exit="";
  190. //$cmd_share='declare';
  191. // $cmd_share=apple_bash_variables_set_to_exec().' sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --list-principals resources';
  192. // $cmd_share='/Users/plabudda/se-dev-pl/SE/stuff/calendarserver_manage_principals_bridge --list-principals resources';
  193. exec($cmd_share, $out,$exit);
  194. DEBUG_S(-3,'share calendar cmd/out/exit',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  195. mac_ical_parse_exit_if_added($out);
  196. $created_resource_UUID=mac_ical_find_resource_id_by_shortname($resource_short_name,$resource_type);
  197. mac_ical_notify_created_obj_db($created_resource_UUID,$resource_type,$table,$ROW_WITH_L_APP);
  198. mac_ical_share_resource_bash($created_resource_UUID,$ROW_WITH_L_APP->A_CLASSIFIED,$ROW_WITH_L_APP->A_ADM_COMPANY,$ROW_WITH_L_APP->L_APPOITMENT_USER);
  199. }
  200. function mac_ical_find_resource_id_by_shortname($shortname,$resource_type) {
  201. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --list-principals ".$resource_type." |grep ".$shortname." |awk -F ' ' '{ print \$NF }'" ;
  202. exec($cmd_share, $out,$exit);
  203. DEBUG_S(3,'share calendar cmd/out/exit',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  204. foreach($out as $test) {
  205. $exit="";$out2="";
  206. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --list-principals ".$resource_type." |grep ".$shortname." |grep ".$test ;
  207. exec($cmd_share, $out2,$exit);
  208. DEBUG_S(3,'specific search for resource ',array($cmd_share,$out2,$exit),__FILE__,__FUNCTION__,__LINE__);
  209. if(!empty($out2[0])) return $test;
  210. }
  211. DEBUG_S(-3,'error finding resource',array($shortname,$resource_type),__FILE__,__FUNCTION__,__FILE__);
  212. die();
  213. }
  214. function mac_ical_share_resource_bash($resource_id,$group_read,$group_write,$owner) {
  215. //! sprawdzmy jakie sa powiazane proxy do read
  216. $admin_uid=get_apple_uid('users',$_SESSION['CONFIG']['CALDAV_USERNAME']); //todo - this should be cached variable
  217. $owner_uid=get_apple_uid('users',$owner); //todo - this should be cached variable
  218. $group_read_uid=get_apple_uid('groups',$group_read); //todo - this should be cached variable
  219. $group_write_uid=get_apple_uid('groups',$group_write); //todo - this should be cached variable
  220. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --list-write-proxies ".$resource_id." |awk '{ print \$NF }'" ; $out="";$exit="";
  221. exec($cmd_share, $out,$exit);
  222. DEBUG_S(-3,'look for read proxies to correct (except admin:'.$admin_uid.', owner:'.$owner_uid.', group_read:'.$group_read_uid.', group_write_uid:'.$group_write_uid.')',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  223. // we parse data like this : ( we try tu parse starting from line 3 )
  224. // [0] => Read/write proxies for "642_BIALLNET Spz oo_Sprawy zwiazane z przygotowaniem dokumentacji oraz" (resources:642_IN7_MK_BAZA_DYSTRYBUCJI):
  225. // [1] => Full name Record name UUID
  226. // [2] => --------- ----------- ----
  227. // [3] => Arkadiusz Binder a.binder 4720124D-5F20-4EAB-B501-4872E33F9A5C
  228. // [4] => Workgroup workgroup AEE3F607-1F5B-4E3A-A3D2-785BC23DA17D
  229. // [5] =>
  230. //
  231. foreach($out as $i=>$test) {
  232. if(($i>=3)&&(!empty($test))) {
  233. if(!(in_array($test, array($admin_uid,$owner_uid,$group_write_uid)))) {
  234. //! We remove write proxy which is not correct
  235. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --remove-proxy ".$test." ".$resource_id ; $out="";$exit="";
  236. exec($cmd_share, $out,$exit);
  237. DEBUG_S(-3,'We remove write proxy which is not correct',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  238. }
  239. }
  240. }
  241. // similar code from upper lines
  242. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --list-read-proxies ".$resource_id." |awk '{ print \$NF }'" ; $out="";$exit="";
  243. exec($cmd_share, $out,$exit);
  244. DEBUG_S(-3,'look for read proxies to correct (except admin:'.$admin_uid.', owner:'.$owner_uid.', group_read:'.$group_read_uid.', group_write_uid:'.$group_write_uid.')',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  245. foreach($out as $i=>$test) {
  246. if(($i>=3)&&(!empty($test))) {
  247. if(!(in_array($test, array($group_read_uid)))) {
  248. //! We remove read proxy which is not correct
  249. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --remove-proxy ".$test." ".$resource_id ; $out="";$exit="";
  250. exec($cmd_share, $out,$exit);
  251. DEBUG_S(-3,'We remove read proxy which is not correct',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  252. }
  253. }
  254. }
  255. //! we make sharing for read / write ... owner
  256. if((!empty($group_read))&&($group_read<>$group_write)) {
  257. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --add-read-proxy groups:".$group_read." ".$resource_id; $out="";$exit="";
  258. exec($cmd_share, $out,$exit);
  259. DEBUG_S(-3,'share calendar for group_read',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  260. }
  261. if(!empty($group_write)) {
  262. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --add-write-proxy groups:".$group_write." ".$resource_id; $out="";$exit="";
  263. exec($cmd_share, $out,$exit);
  264. DEBUG_S(-3,'share calendar for group_write',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  265. }
  266. if(!empty($owner)) {
  267. $cmd_share=apple_bash_variables_set_to_exec()." sudo /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals --add-write-proxy users:".$owner." ".$resource_id; $out="";$exit="";
  268. exec($cmd_share, $out,$exit);
  269. DEBUG_S(-3,'share calendar for owner',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  270. }
  271. }
  272. function get_apple_uid($resource_type,$resource_name) {
  273. // $cmd=apple_bash_variables_set_to_exec()." sudo calendarserver_manage_principals --list-principals ".$resource_type." |awk -F ' ' '{ print \$(NF-1)\" \"\$NF }' |grep ".$resource_name." |awk '{ print \$2 }'";
  274. $cmd='dscl -q /LDAPv3/127.0.0.1 -read /'.$resource_type.'/'.$resource_name.' GeneratedUID';
  275. $uid=exec($cmd, $out);
  276. if(empty($uid)) {
  277. $cmd='dscl -q /Local/Default/ -read /'.$resource_type.'/'.$resource_name.' GeneratedUID';
  278. $uid=exec($cmd, $out);
  279. DEBUG_S(3,'Finding dscl in LOCAL cmd/out/found ',array($cmd,$out,$uid),__FILE__,__FUNCTION__,__LINE__);
  280. }
  281. //$uid=exec($cmd, $out);
  282. $uid=str_replace('GeneratedUID: ', '', $uid);
  283. DEBUG_S(3,'Finding dscl command/out/found ',array($cmd,$out,$uid),__FILE__,__FUNCTION__,__LINE__);
  284. return $uid;
  285. }
  286. function mac_ical_parse_test_return_added_obj($ret) {
  287. if(strstr($ret, 'Invalid') || strstr($ret,'Failed')) {
  288. DEBUG_S(-3,'Error adding object',$ret,__FILE__,__FUNCTION__,__LINE__);
  289. die();
  290. }
  291. DEBUG_S(-3,'Returnet info from server (OK?) ',$ret,__FILE__,__FUNCTION__,__LINE__);
  292. return true;
  293. }
  294. function mac_ical_create_url_for_edit_obj($ROW_WITH_APP,$table) {
  295. //TODO @2014-01 wykryc numer zasobu dla URL do edycji
  296. $dt_res=DB::query("select ID from CRM_LISTA_ZASOBOW where `DESC`='".$table."' and `TYPE`='TABELA' ");
  297. while($dt=DB::fetch($dt_res)) {
  298. return $_SERVER['SCRIPT_URI']."/index.php?MENU_INIT=VIEWTABLE_AJAX&ZASOB_ID=".$dt->ID."#EDIT/".$ROW_WITH_L_APP->ID ;
  299. }
  300. }
  301. function mac_ical_notify_added_event_to_db($ROW_WITH_L_APP,$table,$resource_name,$icalendar_type,$md5_v,$user_uid){
  302. $sql="insert into CRM_APPLE_ICAL_SYNC_PGSQL (ID, LOCAL_ID,LOCAL_TABLE,TIMESTAMP,resource_name,resource_id,RESOURCE_TYPE,etag,L_APPOITMENT_USER,user_uid) values
  303. ('','".$ROW_WITH_L_APP->ID."','".$table."',now(),".$resource_name.",'',".$icalendar_type.",'".md5($v)."','".$ROW_WITH_L_APP->L_APPOITMENT_USER."','".$user_uid."') ";
  304. DEBUG_S(-3,"SQL do potw wgrania wydarzenia: ",$sql,__FILE__,__FUNCTION__,__LINE__);
  305. DB::query($sql);
  306. }
  307. function INIT_TABLE() {
  308. $sql="CREATE TABLE IF NOT EXISTS `_APPLE_ICAL_SE_SYNC_TIMESTAMP` (
  309. `TIMESTAMP` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'data do kiedy byly zsynchronizowane eventy'
  310. )";
  311. DB::query($sql);
  312. }
  313. function mac_ical_get_events_etag($uid,$calendar_type) {
  314. INIT_TABLE();
  315. require_once('stuff/caldav-client.php');
  316. DEBUG_S(-3,'url',$_SESSION['CONFIG']['CALDAV_URL']);
  317. $cal = new CalDAVClient( $_SESSION['CONFIG']['CALDAV_URL']."/calendars/__uids__/{$uid}/{$calendar_type}/", $_SESSION['CONFIG']['CALDAV_USERNAME'], $_SESSION['CONFIG']['CALDAV_PASSWORD'], "" );
  318. $options = $cal->DoOptionsRequest();
  319. DEBUG_S(-3,'options',$options);
  320. //szukam do kiedy byla ostatnia synchronizacja
  321. $sql="select max(`TIMESTAMP`) as last_sync_ts from _APPLE_ICAL_SE_SYNC_TIMESTAMP";
  322. $res=DB::query($sql);
  323. $last_sync_ts=0;
  324. while($h=DB::fetch($res)) {
  325. $last_sync_ts=$h->last_sync_ts;
  326. }
  327. // <C:getctag />
  328. $xmlC = <<<PROPP
  329. <?xml version="1.0" encoding="utf-8" ?>
  330. <D:propfind xmlns:D="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
  331. <D:prop>
  332. <D:displayname />
  333. <D:resourcetype />
  334. <D:getlastmodified />
  335. <D:getetag />
  336. </D:prop>
  337. </D:propfind>
  338. PROPP;
  339. //if ( isset($options["PROPFIND"]) ) {
  340. // Fetch some information about the events in that calendar
  341. $cal->SetDepth(1);
  342. $folder_xml = $cal->DoXMLRequest("PROPFIND", $xmlC);
  343. DEBUG_S(3,'folder_xml',$folder_xml,__FILE__,__FUNCTION__,__LINE__);
  344. // }
  345. /*if ( isset($options["PROPFIND"]) ) {
  346. // Fetch some information about the events in that calendar
  347. $cal->SetDepth(1);
  348. /*
  349. $folder_xml = $cal->DoXMLRequest("PROPFIND", '<?xml version="1.0" encoding="utf-8" ?><propfind xmlns="DAV:"><prop><getcontentlength/><getcontenttype/><resourcetype/><getetag/></prop></propfind>' );
  350. }
  351. */
  352. DEBUG_S(-3,'folder_xml',$folder_xml,__FILE__,__FUNCTION__,__LINE__);
  353. return simplexml_load_string($folder_xml);
  354. }
  355. function mac_ical_parse_events_detect_what_to_sync($events_in_server,$uid,$calendar_type) {
  356. //function to parse events from server to detect what to sync (if etag is differ)
  357. foreach ($events_in_server->response as $id=>$object) {
  358. $href=$object->href;
  359. $getetag=ereg_replace('"','', $object->propstat->prop->getetag);
  360. $displayname=$object->propstat->prop->displayname;
  361. $getlastmodified=$object->propstat->prop->getlastmodified;
  362. //echo "<hr> objects ".$href." ".$getetag." / ".$displayname;
  363. if(!empty($href) && !empty($getetag) && !empty($displayname)) {
  364. $sql="select LOCAL_TABLE,LOCAL_ID ,resource_name , etag , unix_timestamp(TIMESTAMP) as modified from CRM_APPLE_ICAL_SYNC_PGSQL where resource_name='{$displayname}'";
  365. // echo $sql;
  366. $res=DB::query($sql);
  367. while ($h=DB::fetch($res)) {
  368. $modifed_time=strtotime($getlastmodified);
  369. 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__);
  370. //print_r($modifed_time);
  371. $sql_="select unix_timestamp(A_RECORD_UPDATE_DATE) as modified from `{$h->LOCAL_TABLE}` where ID={$h->LOCAL_ID}";
  372. $res_=DB::query($sql_);
  373. while($h_=DB::fetch($res_)) {
  374. echo "<br>Modifieds: ".$modifed_time." (".$getlastmodified."=".date(strtotime($getlastmodified)).") h ".$h->modified." h_:".$h_->modified;
  375. if($h_->modified>$h->modified) $h->modified=$h_->modified;
  376. }
  377. //@2014-02-11 cos tu jest zjebane z timestampami z kalendarza - jakby zawyzal
  378. //if($h->etag<>$getetag) mac_ical_parse_event_to_sync($displayname,$uid,$calendar_type,$modifed_time,$getetag);
  379. if($h->modified<>$modifed_time) mac_ical_parse_event_to_sync($displayname,$uid,$calendar_type,$modifed_time,$getetag);
  380. }
  381. }
  382. }
  383. }
  384. function mac_ical_parse_event_to_sync($event,$uid,$calendar_type,$modifed_time,$getetag){
  385. echo "<br>!!! - trzeba synchronizowac!!! {$event},{$uid},{$calendar_type}";
  386. require_once('stuff/caldav-client.php');
  387. $cal = new CalDAVClient( $_SESSION['CONFIG']['CALDAV_URL']."/calendars/__uids__/{$uid}/{$calendar_type}/{$event}", $_SESSION['CONFIG']['CALDAV_USERNAME'], $_SESSION['CONFIG']['CALDAV_PASSWORD'], "" );
  388. $folder_xml = $cal->DoGETRequest("");
  389. DEBUG_S(3,'folder_xml',$folder_xml,__FILE__,__FUNCTION__,__LINE__);
  390. require_once "stuff/iCalcreator.class.php";
  391. $config=array();
  392. $vcalendar = new vcalendar($config );
  393. $vcalendar->parse( $folder_xml );
  394. if($calendar_type=='tasks') $vevent=$vcalendar->getComponent( "vtodo" );
  395. else if($calendar_type=='calendar') $vevent=$vcalendar->getComponent( "vevent" );
  396. DEBUG_S(-3,"vevent getcomponent",$vevent);
  397. //get event from database
  398. $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 ";
  399. $res_caisp=DB::query($sql);
  400. while($h=DB::fetch($res_caisp)) {
  401. $local_syn=$h;
  402. $sql="select *,unix_timestamp(A_RECORD_UPDATE_DATE) as TIMESTAMP from `{$h->LOCAL_TABLE}` where `ID`={$h->LOCAL_ID}";
  403. $res_lt=DB::query($sql);
  404. while($h_=DB::fetch($res_lt)) {
  405. $local_rec=$h_;
  406. }
  407. }
  408. if($local_rec->TIMESTAMP>$modifed_time) {
  409. echo "sync from local to CalDav";
  410. } else if($local_rec->TIMESTAMP<$modifed_time) {
  411. echo "sync from CalDav to Local";
  412. if($calendar_type=='tasks') {
  413. //die('todo');
  414. $new_L_APPOITMENT_DATE=$vevent->due[value][year]."-".$vevent->due[value][month]."-".$vevent->due[value][day];
  415. $new_L_APPOITMENT_INFO=mysql_real_escape_string($vevent->summary[value]);
  416. $hist_L_APPOITMENT_INFO=mysql_real_escape_string($vevent->description[0][value]);
  417. //todo ? czy to wszystko - moze completed trzeba tez zsynchronizowac w inny sposob?!
  418. } else DEBUG_S(-3,'538 do stworzenia sposob synchronizacji z Caldav VEVENT',null,__FILE__,__FUNCTION__,__LINE__);
  419. //todo do historycznych tabel trzba zapisac funkcja PIOTR
  420. $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}";
  421. $sql_local_etag="update CRM_APPLE_ICAL_SYNC_PGSQL set `TIMESTAMP`=from_unixtime({$modifed_time}) where ID={$local_syn->ID} ";
  422. 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__);
  423. DB::query($sql_local_upd);
  424. DB::query($sql_local_etag);
  425. }
  426. }
  427. function insert_new_event_to_mac_ical($ROW_WITH_L_APP,$table) {
  428. DEBUG_S(-3,'f. insert_new_event_to_mac_ical dla tabeli '.$table,$ROW_WITH_L_APP,__FILE__,__FUNCTION__,__LINE__);
  429. $GMT_OFFSET=3600; //jaka roznica czasu do wprowadzania wydarzen w sekundach TODO w konfigu;
  430. $user_uid=exec('dscl -q /LDAPv3/127.0.0.1 -read /Users/'.$ROW_WITH_L_APP->L_APPOITMENT_USER.' GeneratedUID', $out);
  431. //$uniqid=uniqid();
  432. $user_uid=str_replace('GeneratedUID: ', '', $user_uid);
  433. echo "tutaj".$user_uid;
  434. if(!empty($user_uid)) {
  435. require_once "stuff/iCalcreator.class.php";
  436. $config = array( "unique_id" => "ical-sqix-sync",
  437. "TZID" => "Europe/Warsaw"
  438. );
  439. // , "TZNAME" => "CEST"
  440. $vcalendar = new vcalendar( $config );
  441. $config = $vcalendar->getConfig();
  442. $tz = "Europe/Warsaw";
  443. $xprops = array( "X-LIC-LOCATION" => $tz );
  444. iCalUtilityFunctions::createTimezone( $vcalendar, $tz, $xprops );
  445. $attachments_mode=0;
  446. $organizer="''";
  447. $organizer_object='null';
  448. $recurrance_min='null';
  449. $recurrance_max='null';
  450. $access=0;
  451. $schedule_object='FALSE';
  452. $schedule_tag="''";
  453. $schedule_etags="''";
  454. $private_comments='FALSE';
  455. $created="LOCALTIMESTAMP";
  456. $modified="LOCALTIMESTAMP";
  457. echo "<br>".$ROW_WITH_L_APP->L_APPOITMENT_DATE." - to <br>";
  458. $date_parse=str_replace(array('_',':',' '),'-',$ROW_WITH_L_APP->L_APPOITMENT_DATE);
  459. $date_parse=explode('-',$ROW_WITH_L_APP->L_APPOITMENT_DATE);
  460. DEBUG_S(-3,'exploded L_APPOITMENT_DATE',$date_parse,__FILE__,__FUNCTION__,__LINE__);
  461. foreach($date_parse as $id=>$val) {
  462. settype($date_parse[$id], "integer");
  463. }
  464. settype($ROW_WITH_L_APP->L_APPOITMENT_PERIOD,"integer");
  465. //print_r($date_parse);
  466. $date_YEAR = $date_parse[0];
  467. $date_MONTH = $date_parse[1];
  468. $date_DAY = $date_parse[2];
  469. $date_HOUR = $date_parse[3];
  470. $date_MIN = $date_parse[4];
  471. echo "<hr>time";
  472. $start_date="'".date('Y-m-d H:i:s',strtotime($date_YEAR."-".$date_MONTH."-".$date_DAY." ".$date_HOUR.":".$date_MIN))."'";
  473. $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)."'";
  474. $description="Import zadan z systemu Procesy5 z ";//tabeli ".$table." dla rekordu";
  475. $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' );
  476. foreach($fields_desc as $fld) {
  477. if(!empty($ROW_WITH_L_APP->$fld)) $description.="
  478. [".$fld."] = ".$ROW_WITH_L_APP->$fld;
  479. }
  480. $url=mac_ical_create_url_for_edit_obj($ROW_WITH_APP,$table);
  481. if(!empty($url)) $description.="\n ".$url ;
  482. //unset($date_HOUR);unset($date_MIN);
  483. if(!empty($date_HOUR)) {
  484. ///to bedzie EVENT
  485. $calendar_resource_name="calendar";
  486. // $config = $vcalendar->getConfig();
  487. // $vevent = new vevent( $vcalendar->getConfig() );
  488. $vevent = & $vcalendar->newComponent( "vevent" );
  489. $icalendar_type="'VEVENT'";
  490. $vevent->setProperty( "DTSTART",array('year'=>$date_YEAR,'month'=>$date_MONTH,'day'=>$date_DAY,'hour'=>$date_HOUR,'minute'=>$date_MIN,'second'=>0));
  491. $vevent->setProperty( "duration", array("min"=>$ROW_WITH_L_APP->L_APPOITMENT_PERIOD) );
  492. $vevent->setProperty( "CALSCALE", "GREGORIAN" );
  493. $vevent->setProperty( "summary", "(P5)".$ROW_WITH_L_APP->L_APPOITMENT_INFO." ".$ROW_WITH_L_APP->L_APPOITMENT_TYPE);
  494. $vevent->setProperty( "description", $description);
  495. // $vcalendar->setComponent( $vevent );
  496. $fbtype="(select id from free_busy_type where description='busy')";
  497. } else {
  498. //echo "<hr>bedzie VTODO";
  499. $calendar_resource_name="tasks";
  500. $fbtype="(select id from free_busy_type where description='free')";
  501. $vevent = & $vcalendar->newComponent( "vtodo" );
  502. $vevent->setProperty( "due",array('year'=>$date_YEAR,'month'=>$date_MONTH,'day'=>$date_DAY,'hour'=>$date_HOUR,'minute'=>$date_MIN,'second'=>0));
  503. $vevent->setProperty( "dtstart",array('year'=>$date_YEAR,'month'=>$date_MONTH,'day'=>$date_DAY));
  504. $vevent->setProperty( "CALSCALE", "GREGORIAN" );
  505. $vevent->setProperty( "summary", "(P5)".$ROW_WITH_L_APP->L_APPOITMENT_INFO." ".$ROW_WITH_L_APP->L_APPOITMENT_TYPE );
  506. $vevent->setProperty( "description", $description);
  507. $icalendar_type="'VTODO'";
  508. }
  509. // $vcalendar->setProperty( "TZID", "Europe/Warsaw");
  510. // $vcalendar->setProperty( "TZOFFSETFROM", '0100');
  511. // $vcalendar->setProperty( "TZOFFSETTO", '0100');
  512. 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 );
  513. if(empty($date_YEAR)) return ;
  514. //echo "*".$date_MONTH."*";
  515. //var_dump($date_MONTH);
  516. var_dump($date_MONTH);
  517. $uniqid_ind=$vcalendar->getProperty( 'uid' );
  518. $uniqid=key($uniqid_ind);
  519. $vcalendar->parse();
  520. DEBUG_S(-3,'uniqid',$uniqid);
  521. // var_dump($uniqid);
  522. $dropbox_id="'".$uniqid.".dropbox'";
  523. $resource_name="'".$uniqid.".ics'";
  524. $icalendar_uid="'".$uniqid."'";
  525. // $vevent->setProperty( "LOCATION", "Central Plaza" );
  526. //$v=4;
  527. //var_dump($v);
  528. //echo "<br>Return cal<br>";
  529. //echo "<br><pre>";
  530. $v=$vcalendar->createCalendar();
  531. DEBUG_S(-3,'v',$v,__FILE__,__FUNCTION__,__LINE__);
  532. //DEBUG_S(-3,'SERVER',$_SERVER,__FILE__,__FUNCTION__,__LINE__);
  533. /*
  534. $uid = "event-12345";
  535. $v="BEGIN:VCALENDAR
  536. VERSION:2.0
  537. PRODID:-//ical-sqix-sync//NONSGML kigkonsult.se iCalcreator 2.16.12//
  538. BEGIN:VEVENT
  539. DTSTAMP:20140103T130527Z
  540. DTSTART:20140104T130000Z
  541. DTEND:20140104T140000Z
  542. UID:{$uid}
  543. DESCRIPTION:Import zadan z systemu Procesy5 z
  544. LOCATION:Office
  545. SUMMARY:test kalendarza 7 RELATE
  546. END:VEVENT
  547. END:VCALENDAR";
  548. echo $v;
  549. */
  550. // $v=$vcalendar->createCalendar();
  551. $icalendar_text="'".$v."'";
  552. $md5="'".md5($v)."'";
  553. //echo "</pre>";
  554. /*
  555. Plan taki do synchronizacji kalendarzy
  556. [ baza translate ]
  557. [ LOCAL_ID ]
  558. [ LOCAL_TABLE ]
  559. [ TIMESTAMP ]
  560. [ REMOTE_ID ]
  561. [ REMOTE_TABLE ]
  562. 1) lokalnie ( dodaje nowe wydarzenie USERS2_MARKETING (
  563. id,
  564. data+czas,
  565. L_APP_INFO ,
  566. L_APP_USER)
  567. 2) foreach table, ktore maja cos w L_APP_DATE szukam w translate
  568. a) jak pusto, to
  569. - dodaje do ICAL’a ( REMOTE_TABLE, REMOTE_ID )
  570. - dodaje do [TRANSLATE] [REMOTE_ID,REMOTE_TABLE,LOCAL_ID,LOCAL_TABLE,TIMESTAMP]
  571. c) trzeba wykryc resource_id -> calendar_home_resource_id w calendar_home ( po owner_uid )
  572. b) trzeba wykryc calendar_home_resource_id w calendar_bind
  573. c) trzeba wykryc w calendar_bind calendar_resource_id (zawsze calendar),
  574. (itd...)
  575. 4) synchronizacja od strony lokalnej - jezeli rekord LOCAL i A_UPD_DAT jest > CRM_APPLE_ICAL_SYNC_PGSQL.Timestamp, to jedziemy
  576. a) zaktualizuj rekord w caldavie
  577. aa)- zmiana terminow -> edytuj
  578. bb)- zmiana wlasciciela -> kopiuj nowy obiekt, stary zaznacz skasowano
  579. 5) synchronizacja od strony caldav'a
  580. a) - przesun spotkanie
  581. b) - skasuj spotkanie - wyrzuc siebie z osoby odpowiedzialnej
  582. */
  583. // include 'webdav/vendor/autoload.php';
  584. //echo 'SabreDAV ', \Sabre\DAV\Version::VERSION, ' is installed.';
  585. require_once('stuff/caldav-client.php');
  586. // $cal = new CalDAVClient( "https://biuro.biall-net.pl/", "a.binder", "xxxx", "" );
  587. $dav_target=$_SESSION['CONFIG']['CALDAV_URL']."/calendars/__uids__/".$user_uid."/".$calendar_resource_name."/{$uniqid}.ics";
  588. DEBUG_S(-3,'Dav target',$dav_target,__FILE__,__FUNCTION__,__LINE__);
  589. $cal = new CalDAVClient( $dav_target, $_SESSION['CONFIG']['CALDAV_USERNAME'], $_SESSION['CONFIG']['CALDAV_PASSWORD'], "" );
  590. //$cal->DoPUTRequest("",$icalendar,"");
  591. //! udostepnienie kalendarza konta docelowego dla administratora - wymaga echo "_www ALL = NOPASSWD: /Applications/Server.app/Contents/ServerRoot/usr/sbin/calendarserver_manage_principals " >> /etc/sudoers;
  592. $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="";
  593. exec($cmd_share, $out,$exit);
  594. DEBUG_S(-3,'share calendar cmd/out/exit',array($cmd_share,$out,$exit),__FILE__,__FUNCTION__,__LINE__);
  595. $ret=$cal->DoPUTRequest("",$v,'*');
  596. DEBUG_S(-3,'ret/md5',array($ret,$md5),__FILE__,__FUNCTION__,__LINE__);
  597. mac_ical_parse_test_return_added_obj($ret);
  598. // die();
  599. echo "<br>".$user_uid;
  600. /*
  601. $dbconn = pg_connect("host='/Library/Server/PostgreSQL For Server Services/Socket' port=5432 user=caldav dbname=caldav");
  602. $sql_insert_pgsql="insert into calendar_object ( resource_id , calendar_resource_id , resource_name , icalendar_text, icalendar_uid ,
  603. icalendar_type , attachments_mode, dropbox_id, organizer, organizer_object, recurrance_min, recurrance_max, access, schedule_object,
  604. schedule_tag , schedule_etags , private_comments , md5, created, modified )
  605. select
  606. (
  607. select max(resource_id) as max from calendar_object
  608. union select max(resource_id) as max from calendar_metadata
  609. order by max desc
  610. limit 1
  611. )+1 as resource_id
  612. , t2.calendar_resource_id , ".$resource_name." , ".$icalendar_text." , ".$icalendar_uid."
  613. , ".$icalendar_type." , ".$attachments_mode." , ".$dropbox_id." , ".$organizer." , ".$organizer_object."
  614. , ".$recurrance_min." , ".$recurrance_max." , ".$access." , ".$schedule_object."
  615. , ".$schedule_tag." , ".$schedule_etags." , ".$private_comments." , ".$md5." , ".$created." , ".$modified."
  616. from calendar_home as t1
  617. join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
  618. where
  619. t1.owner_uid='".$user_uid."'
  620. ;
  621. SELECT resource_id from calendar_object where resource_name=".$resource_name." LIMIT 1;
  622. ";
  623. echo "<br>".$sql_insert_pgsql;
  624. $qry=pg_query($dbconn,$sql_insert_pgsql);
  625. $fch = pg_fetch_row($qry);
  626. echo "<br>\n Inserted id resource id:";
  627. print_r($fch);
  628. $sql_insert_pgsql="insert into calendar_object_revisions
  629. ( calendar_home_resource_id, calendar_resource_id, calendar_name, resource_name, revision, deleted )
  630. select
  631. t2.calendar_home_resource_id , t2.calendar_resource_id
  632. , NULL
  633. , ".$resource_name."
  634. , ( select max(revision) as max from calendar_object_revisions )+1 as revision
  635. , FALSE
  636. from calendar_home as t1
  637. join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
  638. where
  639. t1.owner_uid='".$user_uid."' ";
  640. echo "<br>".$sql_insert_pgsql;
  641. pg_query($dbconn,$sql_insert_pgsql);
  642. $sql_insert_pgsql="insert into time_range ( calendar_resource_id , calendar_object_resource_id, floating , start_date, end_date , fbtype , transparent )
  643. select t2.calendar_resource_id , ".$fch[0]." , FALSE , ".$start_date.",".$end_date." , ".$fbtype." , FALSE
  644. from calendar_home as t1
  645. join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
  646. where
  647. t1.owner_uid='".$user_uid."' ";
  648. echo "<br>".$sql_insert_pgsql;
  649. pg_query($dbconn,$sql_insert_pgsql);
  650. //aktualizacja info, ze cos zostalo dodane itp
  651. $sql_insert_pgsql="update calendar_metadata set modified=LOCALTIMESTAMP where
  652. resource_id=(select t2.calendar_resource_id from calendar_home as t1
  653. join calendar_bind as t2 on ( t1.resource_id=t2.calendar_home_resource_id and t2.calendar_resource_name=".$calendar_resource_name." )
  654. where t1.owner_uid='".$user_uid."' ) , supported_components=".$icalendar_type." ";
  655. echo "<br>".$sql_insert_pgsql;
  656. pg_query($dbconn,$sql_insert_pgsql);
  657. */
  658. //teraz confirm , ze jest zaimportowane
  659. mac_ical_notify_added_event_to_db($ROW_WITH_L_APP,$table,$resource_name,$icalendar_type,md5($v),$user_uid);
  660. //pg_last_oid($res2);
  661. } //not empty
  662. }