| 1: | <?php | 
| 2: |  | 
| 3: |  | 
| 4: |  | 
| 5: |  | 
| 6: |  | 
| 7: | namespace Aurora\Modules\Calendar; | 
| 8: |  | 
| 9: | use Afterlogic\DAV\Server; | 
| 10: | use Aurora\System\Api; | 
| 11: | use GuzzleHttp\Client; | 
| 12: | use GuzzleHttp\Exception\ConnectException; | 
| 13: | use Sabre\VObject\ITip\Broker as ITipBroker; | 
| 14: | use Sabre\VObject\ParseException; | 
| 15: |  | 
| 16: |  | 
| 17: |  | 
| 18: |  | 
| 19: |  | 
| 20: |  | 
| 21: |  | 
| 22: |  | 
| 23: |  | 
| 24: |  | 
| 25: | class Manager extends \Aurora\System\Managers\AbstractManagerWithStorage | 
| 26: | { | 
| 27: |  | 
| 28: |  | 
| 29: |  | 
| 30: | public $oStorage; | 
| 31: |  | 
| 32: |  | 
| 33: |  | 
| 34: |  | 
| 35: | public function __construct(\Aurora\System\Module\AbstractModule $oModule = null) | 
| 36: | { | 
| 37: | parent::__construct($oModule, new Storages\Sabredav($this)); | 
| 38: | } | 
| 39: |  | 
| 40: | protected function isCalendarSharingSupported($sUserUUID) | 
| 41: | { | 
| 42: | return true; | 
| 43: | } | 
| 44: |  | 
| 45: |  | 
| 46: |  | 
| 47: |  | 
| 48: |  | 
| 49: |  | 
| 50: |  | 
| 51: |  | 
| 52: |  | 
| 53: | public function getCalendarAccess($sUserUUID, $sCalendarId) | 
| 54: | { | 
| 55: | $oResult = null; | 
| 56: | $oUser = \Aurora\System\Api::getUserById($sUserUUID); | 
| 57: | if ($oUser instanceof \Aurora\Modules\Core\Models\User) { | 
| 58: | $oResult = $this->oStorage->getCalendarAccess($oUser->PublicId, $sCalendarId); | 
| 59: | } | 
| 60: | return $oResult; | 
| 61: | } | 
| 62: |  | 
| 63: |  | 
| 64: |  | 
| 65: |  | 
| 66: |  | 
| 67: |  | 
| 68: | public function getPublicCalendarByHash($sHash) | 
| 69: | { | 
| 70: | return $this->getPublicCalendar($sHash); | 
| 71: | } | 
| 72: |  | 
| 73: |  | 
| 74: |  | 
| 75: |  | 
| 76: |  | 
| 77: |  | 
| 78: | public function getPublicCalendar($sCalendarId) | 
| 79: | { | 
| 80: | $oCalendar = false; | 
| 81: | try { | 
| 82: | $oCalDAVCalendar = $this->oStorage->getPublicCalendar($sCalendarId); | 
| 83: | if ($oCalDAVCalendar) { | 
| 84: | $oCalendar = $this->oStorage->parseCalendar($oCalDAVCalendar); | 
| 85: | } | 
| 86: | } catch (\Exception $oException) { | 
| 87: | $oCalendar = false; | 
| 88: | $this->setLastException($oException); | 
| 89: | } | 
| 90: | return $oCalendar; | 
| 91: | } | 
| 92: |  | 
| 93: |  | 
| 94: |  | 
| 95: |  | 
| 96: |  | 
| 97: |  | 
| 98: |  | 
| 99: |  | 
| 100: |  | 
| 101: | public function getCalendar($sUserPublicId, $sCalendarId) | 
| 102: | { | 
| 103: | $oCalendar = false; | 
| 104: | try { | 
| 105: | $oCalendar = $this->oStorage->getCalendar($sUserPublicId, $sCalendarId); | 
| 106: | } catch (\Exception $oException) { | 
| 107: | $oCalendar = false; | 
| 108: | $this->setLastException($oException); | 
| 109: | } | 
| 110: | return $oCalendar; | 
| 111: | } | 
| 112: |  | 
| 113: |  | 
| 114: |  | 
| 115: |  | 
| 116: |  | 
| 117: |  | 
| 118: | public function getPublicCalendarHash($sCalendarId) | 
| 119: | { | 
| 120: | $oResult = null; | 
| 121: | try { | 
| 122: | $oResult = $this->oStorage->getPublicCalendarHash($sCalendarId); | 
| 123: | } catch (\Exception $oException) { | 
| 124: | $oResult = false; | 
| 125: | $this->setLastException($oException); | 
| 126: | } | 
| 127: | return $oResult; | 
| 128: | } | 
| 129: |  | 
| 130: |  | 
| 131: |  | 
| 132: |  | 
| 133: |  | 
| 134: |  | 
| 135: |  | 
| 136: |  | 
| 137: |  | 
| 138: | public function getCalendarUsers($sUserPublicId, $oCalendar) | 
| 139: | { | 
| 140: | $mResult = null; | 
| 141: | try { | 
| 142: | $mResult = $this->oStorage->getCalendarUsers($sUserPublicId, $oCalendar); | 
| 143: | } catch (\Exception $oException) { | 
| 144: | $mResult = false; | 
| 145: | $this->setLastException($oException); | 
| 146: | } | 
| 147: | return $mResult; | 
| 148: | } | 
| 149: |  | 
| 150: |  | 
| 151: |  | 
| 152: |  | 
| 153: |  | 
| 154: | public function getPublicUser() | 
| 155: | { | 
| 156: | $oResult = null; | 
| 157: | try { | 
| 158: | $oResult = $this->oStorage->getPublicUser(); | 
| 159: | } catch (\Exception $oException) { | 
| 160: | $oResult = false; | 
| 161: | $this->setLastException($oException); | 
| 162: | } | 
| 163: | return $oResult; | 
| 164: | } | 
| 165: |  | 
| 166: |  | 
| 167: |  | 
| 168: |  | 
| 169: |  | 
| 170: | public function getTenantUser($oUser = null) | 
| 171: | { | 
| 172: | $mResult = null; | 
| 173: | try { | 
| 174: | $mResult = $this->oStorage->getTenantUser($oUser); | 
| 175: | } catch (\Exception $oException) { | 
| 176: | $mResult = false; | 
| 177: | $this->setLastException($oException); | 
| 178: | } | 
| 179: | return $mResult; | 
| 180: | } | 
| 181: |  | 
| 182: |  | 
| 183: |  | 
| 184: |  | 
| 185: |  | 
| 186: | public function getPublicAccount() | 
| 187: | { | 
| 188: | $oResult = null; | 
| 189: | try { | 
| 190: | $oResult = $this->oStorage->getPublicAccount(); | 
| 191: | } catch (\Exception $oException) { | 
| 192: | $oResult = false; | 
| 193: | $this->setLastException($oException); | 
| 194: | } | 
| 195: | return $oResult; | 
| 196: | } | 
| 197: |  | 
| 198: |  | 
| 199: |  | 
| 200: |  | 
| 201: |  | 
| 202: |  | 
| 203: |  | 
| 204: |  | 
| 205: | public function getUserCalendars($sUserPublicId) | 
| 206: | { | 
| 207: | return $this->oStorage->getCalendars($sUserPublicId); | 
| 208: | } | 
| 209: |  | 
| 210: |  | 
| 211: |  | 
| 212: |  | 
| 213: |  | 
| 214: |  | 
| 215: |  | 
| 216: |  | 
| 217: |  | 
| 218: |  | 
| 219: |  | 
| 220: |  | 
| 221: | public function createCalendar($sUserPublicId, $sName, $sDescription, $iOrder, $sColor, $sUUID = null) | 
| 222: | { | 
| 223: | $oResult = null; | 
| 224: | try { | 
| 225: | $oResult = $this->oStorage->createCalendar($sUserPublicId, $sName, $sDescription, $iOrder, $sColor, $sUUID); | 
| 226: | } catch (\Exception $oException) { | 
| 227: | $oResult = false; | 
| 228: | $this->setLastException($oException); | 
| 229: | } | 
| 230: | return $oResult; | 
| 231: | } | 
| 232: |  | 
| 233: | public function validateSubscribedCalebdarSource($sSource) | 
| 234: | { | 
| 235: | $isValid = false; | 
| 236: |  | 
| 237: | $client = new Client(); | 
| 238: | try { | 
| 239: | $res = $client->get( | 
| 240: | $sSource, | 
| 241: | [ | 
| 242: | 'headers' => [ | 
| 243: | 'Accept'     => '*/*', | 
| 244: | ], | 
| 245: | 'http_errors' => false | 
| 246: | ] | 
| 247: | ); | 
| 248: | if ($res->getStatusCode() === 200) { | 
| 249: | $data = (string) $res->getBody(); | 
| 250: | try { | 
| 251: | \Sabre\VObject\Reader::read($data); | 
| 252: | $isValid = true; | 
| 253: | } catch (ParseException $oEx) { | 
| 254: | $isValid = false; | 
| 255: | } | 
| 256: | } | 
| 257: | } catch (ConnectException $oEx) { | 
| 258: | } | 
| 259: |  | 
| 260: | return $isValid; | 
| 261: | } | 
| 262: |  | 
| 263: | public function createSubscribedCalendar($sUserPublicId, $sName, $sSource, $iOrder, $sColor, $sUUID = null) | 
| 264: | { | 
| 265: | $oResult = null; | 
| 266: | try { | 
| 267: | $oResult = $this->oStorage->createSubscribedCalendar($sUserPublicId, $sName, $sSource, $iOrder, $sColor, $sUUID); | 
| 268: | } catch (\Exception $oException) { | 
| 269: | $oResult = false; | 
| 270: | $this->setLastException($oException); | 
| 271: | } | 
| 272: | return $oResult; | 
| 273: | } | 
| 274: |  | 
| 275: |  | 
| 276: |  | 
| 277: |  | 
| 278: |  | 
| 279: |  | 
| 280: |  | 
| 281: |  | 
| 282: |  | 
| 283: |  | 
| 284: |  | 
| 285: |  | 
| 286: |  | 
| 287: | public function updateCalendar($sUserPublicId, $sCalendarId, $sName, $sDescription, $iOrder, $sColor) | 
| 288: | { | 
| 289: | $oResult = null; | 
| 290: | try { | 
| 291: | $oResult = $this->oStorage->updateCalendar($sUserPublicId, $sCalendarId, $sName, $sDescription, $iOrder, $sColor); | 
| 292: | } catch (\Exception $oException) { | 
| 293: | $oResult = false; | 
| 294: | $this->setLastException($oException); | 
| 295: | } | 
| 296: | return $oResult; | 
| 297: | } | 
| 298: |  | 
| 299: |  | 
| 300: |  | 
| 301: |  | 
| 302: |  | 
| 303: |  | 
| 304: |  | 
| 305: |  | 
| 306: |  | 
| 307: |  | 
| 308: |  | 
| 309: |  | 
| 310: |  | 
| 311: | public function updateSubscribedCalendar($sUserPublicId, $sCalendarId, $sName, $sSource, $iOrder, $sColor) | 
| 312: | { | 
| 313: | $oResult = null; | 
| 314: | try { | 
| 315: | $oResult = $this->oStorage->updateSubscribedCalendar($sUserPublicId, $sCalendarId, $sName, $sSource, $iOrder, $sColor); | 
| 316: | } catch (\Exception $oException) { | 
| 317: | $oResult = false; | 
| 318: | $this->setLastException($oException); | 
| 319: | } | 
| 320: | return $oResult; | 
| 321: | } | 
| 322: |  | 
| 323: |  | 
| 324: |  | 
| 325: |  | 
| 326: |  | 
| 327: |  | 
| 328: |  | 
| 329: |  | 
| 330: |  | 
| 331: |  | 
| 332: | public function updateCalendarColor($sUserPublicId, $sCalendarId, $sColor) | 
| 333: | { | 
| 334: | $oResult = null; | 
| 335: | try { | 
| 336: | $oResult = $this->oStorage->updateCalendarColor($sUserPublicId, $sCalendarId, $sColor); | 
| 337: | } catch (\Exception $oException) { | 
| 338: | $oResult = false; | 
| 339: | $this->setLastException($oException); | 
| 340: | } | 
| 341: | return $oResult; | 
| 342: | } | 
| 343: |  | 
| 344: | public function deletePrincipalCalendars($sUserPublicId) | 
| 345: | { | 
| 346: | $oResult = null; | 
| 347: | try { | 
| 348: | $oResult = $this->oStorage->deletePrincipalCalendars($sUserPublicId); | 
| 349: | } catch (\Exception $oException) { | 
| 350: | $oResult = false; | 
| 351: | $this->setLastException($oException); | 
| 352: | } | 
| 353: | return $oResult; | 
| 354: | } | 
| 355: |  | 
| 356: |  | 
| 357: |  | 
| 358: |  | 
| 359: |  | 
| 360: |  | 
| 361: |  | 
| 362: |  | 
| 363: |  | 
| 364: | public function deleteCalendar($sUserPublicId, $sCalendarId) | 
| 365: | { | 
| 366: | $oResult = null; | 
| 367: | try { | 
| 368: | $oResult = $this->oStorage->deleteCalendar($sUserPublicId, $sCalendarId); | 
| 369: | } catch (\Exception $oException) { | 
| 370: | $oResult = false; | 
| 371: | $this->setLastException($oException); | 
| 372: | } | 
| 373: | return $oResult; | 
| 374: | } | 
| 375: |  | 
| 376: |  | 
| 377: |  | 
| 378: |  | 
| 379: |  | 
| 380: |  | 
| 381: |  | 
| 382: |  | 
| 383: |  | 
| 384: | public function unsubscribeCalendar($sUserPublicId, $sCalendarId) | 
| 385: | { | 
| 386: | $oResult = null; | 
| 387: | if ($this->isCalendarSharingSupported($sUserPublicId)) { | 
| 388: | try { | 
| 389: | $oResult = $this->oStorage->unsubscribeCalendar($sUserPublicId, $sCalendarId); | 
| 390: | } catch (\Exception $oException) { | 
| 391: | $oResult = false; | 
| 392: | $this->setLastException($oException); | 
| 393: | } | 
| 394: | } | 
| 395: | return $oResult; | 
| 396: | } | 
| 397: |  | 
| 398: |  | 
| 399: |  | 
| 400: |  | 
| 401: |  | 
| 402: |  | 
| 403: |  | 
| 404: |  | 
| 405: |  | 
| 406: |  | 
| 407: |  | 
| 408: |  | 
| 409: |  | 
| 410: |  | 
| 411: | public function updateCalendarShareToAll($sUserPublicId, $sCalendarId, $bShareToAll, $iPermission) | 
| 412: | { | 
| 413: | $sUserId = $this->getTenantUser($sUserPublicId); | 
| 414: | $aShares[] = array( | 
| 415: | 'name' => $sUserId, | 
| 416: | 'email' => $sUserId, | 
| 417: | 'access' => $bShareToAll ? $iPermission : \Aurora\Modules\Calendar\Enums\Permission::RemovePermission | 
| 418: | ); | 
| 419: |  | 
| 420: | return $this->updateCalendarShares($sUserPublicId, $sCalendarId, $aShares); | 
| 421: | } | 
| 422: |  | 
| 423: |  | 
| 424: |  | 
| 425: |  | 
| 426: |  | 
| 427: |  | 
| 428: |  | 
| 429: |  | 
| 430: |  | 
| 431: |  | 
| 432: |  | 
| 433: |  | 
| 434: | public function updateCalendarShares($sUserPublicId, $sCalendarId, $aShares) | 
| 435: | { | 
| 436: | $oResult = false; | 
| 437: | if ($this->isCalendarSharingSupported($sUserPublicId)) { | 
| 438: | $aProcessedEmails = []; | 
| 439: | $oUser = \Aurora\Modules\Core\Module::getInstance()->getUsersManager()->getUserByPublicId($sUserPublicId); | 
| 440: | foreach ($aShares as $aShare) { | 
| 441: | if (in_array($aShare['email'], $aProcessedEmails)) { | 
| 442: | return $oResult; | 
| 443: | } | 
| 444: | $aProcessedEmails[] = $aShare['email']; | 
| 445: | if ($aShare['email'] !== $this->getTenantUser($oUser) && | 
| 446: | $aShare['email'] !== $this->getPublicUser()) { | 
| 447: | $oSharedUser = \Aurora\Modules\Core\Module::getInstance()->getUsersManager()->getUserByPublicId($aShare['email']); | 
| 448: | if ($oSharedUser instanceof \Aurora\Modules\Core\Models\User) { | 
| 449: |  | 
| 450: | } | 
| 451: | unset($oSharedUser); | 
| 452: | } | 
| 453: | } | 
| 454: | $oResult = $this->oStorage->updateCalendarShares($sUserPublicId, $sCalendarId, $aShares); | 
| 455: | } | 
| 456: | return $oResult; | 
| 457: | } | 
| 458: |  | 
| 459: |  | 
| 460: |  | 
| 461: |  | 
| 462: |  | 
| 463: |  | 
| 464: |  | 
| 465: |  | 
| 466: |  | 
| 467: | public function publicCalendar($sCalendarId, $bIsPublic = false, $oUser = null) | 
| 468: | { | 
| 469: | $oResult = null; | 
| 470: | try { | 
| 471: | $oResult = $this->oStorage->publicCalendar($sCalendarId, $bIsPublic, $oUser); | 
| 472: | } catch (\Exception $oException) { | 
| 473: | $oResult = false; | 
| 474: | $this->setLastException($oException); | 
| 475: | } | 
| 476: | return $oResult; | 
| 477: | } | 
| 478: |  | 
| 479: |  | 
| 480: |  | 
| 481: |  | 
| 482: |  | 
| 483: |  | 
| 484: |  | 
| 485: |  | 
| 486: | public function getPublishStatus($sCalendarId) | 
| 487: | { | 
| 488: | $oResult = null; | 
| 489: | try { | 
| 490: | $oResult = $this->oStorage->getPublishStatus($sCalendarId); | 
| 491: | } catch (\Exception $oException) { | 
| 492: | $oResult = false; | 
| 493: | $this->setLastException($oException); | 
| 494: | } | 
| 495: | return $oResult; | 
| 496: | } | 
| 497: |  | 
| 498: |  | 
| 499: |  | 
| 500: |  | 
| 501: |  | 
| 502: |  | 
| 503: |  | 
| 504: |  | 
| 505: |  | 
| 506: |  | 
| 507: |  | 
| 508: |  | 
| 509: |  | 
| 510: |  | 
| 511: | public function updateCalendarShare($sUserPublicId, $sCalendarId, $sUserId, $iPermission) | 
| 512: | { | 
| 513: | $oResult = null; | 
| 514: | if ($this->isCalendarSharingSupported($sUserPublicId)) { | 
| 515: | try { | 
| 516: | $oResult = $this->oStorage->updateCalendarShare($sUserPublicId, $sCalendarId, $sUserId, $iPermission); | 
| 517: | } catch (\Exception $oException) { | 
| 518: | $oResult = false; | 
| 519: | $this->setLastException($oException); | 
| 520: | } | 
| 521: | } | 
| 522: | return $oResult; | 
| 523: | } | 
| 524: |  | 
| 525: |  | 
| 526: |  | 
| 527: |  | 
| 528: |  | 
| 529: |  | 
| 530: |  | 
| 531: |  | 
| 532: |  | 
| 533: | public function exportCalendarToIcs($sUserPublicId, $sCalendarId) | 
| 534: | { | 
| 535: | $mResult = null; | 
| 536: | try { | 
| 537: | $mResult = $this->oStorage->exportCalendarToIcs($sUserPublicId, $sCalendarId); | 
| 538: | } catch (\Exception $oException) { | 
| 539: | $mResult = false; | 
| 540: | $this->setLastException($oException); | 
| 541: | } | 
| 542: | return $mResult; | 
| 543: | } | 
| 544: |  | 
| 545: |  | 
| 546: |  | 
| 547: |  | 
| 548: |  | 
| 549: |  | 
| 550: |  | 
| 551: |  | 
| 552: |  | 
| 553: |  | 
| 554: | public function importToCalendarFromIcs($sUserPublicId, $sCalendarId, $sTempFileName) | 
| 555: | { | 
| 556: | $mResult = null; | 
| 557: | try { | 
| 558: | $mResult = $this->oStorage->importToCalendarFromIcs($sUserPublicId, $sCalendarId, $sTempFileName); | 
| 559: | } catch (\Exception $oException) { | 
| 560: | $mResult = false; | 
| 561: | $this->setLastException($oException); | 
| 562: | } | 
| 563: | return $mResult; | 
| 564: | } | 
| 565: |  | 
| 566: |  | 
| 567: |  | 
| 568: |  | 
| 569: |  | 
| 570: |  | 
| 571: |  | 
| 572: |  | 
| 573: |  | 
| 574: |  | 
| 575: |  | 
| 576: | public function getEvents($sUserUUID, $mCalendarId, $dStart = null, $dFinish = null) | 
| 577: | { | 
| 578: | $aResult = array(); | 
| 579: | try { | 
| 580: | $dStart = ($dStart != null) ? date('Ymd\T000000\Z', intval($dStart)  - 86400) : null; | 
| 581: | $dFinish = ($dFinish != null) ? date('Ymd\T235959\Z', intval($dFinish)) : null; | 
| 582: | $mCalendarId = !is_array($mCalendarId) ? array($mCalendarId) : $mCalendarId; | 
| 583: |  | 
| 584: | foreach ($mCalendarId as $sCalendarId) { | 
| 585: | $aEvents = $this->oStorage->getEvents($sUserUUID, $sCalendarId, $dStart, $dFinish); | 
| 586: | if ($aEvents && is_array($aEvents)) { | 
| 587: | $aResult = array_merge($aResult, $aEvents); | 
| 588: | } | 
| 589: | } | 
| 590: | } catch (\Exception $oException) { | 
| 591: | $aResult = false; | 
| 592: | $this->setLastException($oException); | 
| 593: | } | 
| 594: | return $aResult; | 
| 595: | } | 
| 596: |  | 
| 597: | public function getEventsByUrls($sUserPublicId, $mCalendarId, $aUrls, $dStart, $dEnd, $bExpand) | 
| 598: | { | 
| 599: | $result = []; | 
| 600: | $this->oStorage->init($sUserPublicId); | 
| 601: | $oCalDAVCalendar = $this->oStorage->getCalDAVCalendar('calendar/' . $mCalendarId); | 
| 602: | if ($oCalDAVCalendar) { | 
| 603: | $result = $this->oStorage->getItemsByUrls($sUserPublicId, $oCalDAVCalendar, $aUrls, $dStart, $dEnd, $bExpand); | 
| 604: | } | 
| 605: | return $result; | 
| 606: | } | 
| 607: |  | 
| 608: |  | 
| 609: |  | 
| 610: |  | 
| 611: |  | 
| 612: |  | 
| 613: |  | 
| 614: |  | 
| 615: | public function getPublicEvents($mCalendarId, $dStart = null, $dFinish = null, $bExpand = true, $sDefaultTimeZone = null) | 
| 616: | { | 
| 617: | $aResult = array(); | 
| 618: |  | 
| 619: | $dStart = ($dStart != null) ? date('Ymd\T000000\Z', intval($dStart)  - 86400) : null; | 
| 620: | $dFinish = ($dFinish != null) ? date('Ymd\T235959\Z', intval($dFinish)) : null; | 
| 621: | $mCalendarId = !is_array($mCalendarId) ? array($mCalendarId) : $mCalendarId; | 
| 622: |  | 
| 623: | foreach ($mCalendarId as $sCalendarId) { | 
| 624: | $aEvents = $this->oStorage->getPublicEvents($sCalendarId, $dStart, $dFinish, $bExpand, $sDefaultTimeZone); | 
| 625: | if ($aEvents && is_array($aEvents)) { | 
| 626: | $aResult = array_merge($aResult, $aEvents); | 
| 627: | } | 
| 628: | } | 
| 629: |  | 
| 630: | return $aResult; | 
| 631: | } | 
| 632: |  | 
| 633: |  | 
| 634: |  | 
| 635: |  | 
| 636: |  | 
| 637: |  | 
| 638: |  | 
| 639: |  | 
| 640: |  | 
| 641: |  | 
| 642: |  | 
| 643: | public function getTasks($sUserPublicId, $mCalendarId, $bCompeted = true, $sSearch = '', $dStart = null, $dFinish = null, $bExpand = true) | 
| 644: | { | 
| 645: | $aResult = array(); | 
| 646: | try { | 
| 647: | $now = new \DateTime('now'); | 
| 648: | $now->setTime(0, 0); | 
| 649: | if ($dStart === null) { | 
| 650: | $dStart = $now->getTimestamp() - 86400 * 30; | 
| 651: | } | 
| 652: | if ($dFinish === null) { | 
| 653: | $dFinish = $now->getTimestamp() + 86400 * 30; | 
| 654: | } | 
| 655: |  | 
| 656: | $dStart = ($dStart != null) ? date('Ymd\T000000\Z', intval($dStart)  - 86400) : null; | 
| 657: | $dFinish = ($dFinish != null) ? date('Ymd\T235959\Z', intval($dFinish)) : null; | 
| 658: | $mCalendarId = !is_array($mCalendarId) ? array($mCalendarId) : $mCalendarId; | 
| 659: |  | 
| 660: | foreach ($mCalendarId as $sCalendarId) { | 
| 661: | $aTasks = $this->oStorage->getTasks($sUserPublicId, $sCalendarId, $bCompeted, $sSearch, $dStart, $dFinish, $bExpand); | 
| 662: |  | 
| 663: | if ($aTasks && is_array($aTasks)) { | 
| 664: | $aResult = array_merge($aResult, $aTasks); | 
| 665: | } | 
| 666: | } | 
| 667: | } catch (\Exception $oException) { | 
| 668: | $aResult = false; | 
| 669: | $this->setLastException($oException); | 
| 670: | } | 
| 671: | return $aResult; | 
| 672: | } | 
| 673: |  | 
| 674: |  | 
| 675: |  | 
| 676: |  | 
| 677: |  | 
| 678: |  | 
| 679: |  | 
| 680: |  | 
| 681: |  | 
| 682: |  | 
| 683: | public function getEventsInfo($sUserPublicId, $mCalendarId, $dStart = null, $dEnd = null, $bGetData = false) | 
| 684: | { | 
| 685: | $aResult = array(); | 
| 686: | try { | 
| 687: | $dStart = ($dStart != null) ? date('Ymd\T000000\Z', $dStart  - 86400) : null; | 
| 688: | $dEnd = ($dEnd != null) ? date('Ymd\T235959\Z', $dEnd) : null; | 
| 689: | $mCalendarId = !is_array($mCalendarId) ? array($mCalendarId) : $mCalendarId; | 
| 690: |  | 
| 691: | foreach ($mCalendarId as $sCalendarId) { | 
| 692: | $aEvents = $this->oStorage->getEventsInfo($sUserPublicId, $sCalendarId, $dStart, $dEnd, $bGetData); | 
| 693: | if ($aEvents && is_array($aEvents)) { | 
| 694: | $aResult = array_merge($aResult, $aEvents); | 
| 695: | } | 
| 696: | } | 
| 697: | } catch (\Exception $oException) { | 
| 698: | $aResult = false; | 
| 699: | $this->setLastException($oException); | 
| 700: | } | 
| 701: | return $aResult; | 
| 702: | } | 
| 703: |  | 
| 704: |  | 
| 705: |  | 
| 706: |  | 
| 707: |  | 
| 708: |  | 
| 709: |  | 
| 710: |  | 
| 711: |  | 
| 712: |  | 
| 713: | public function getEvent($sUserPublicId, $sCalendarId, $sEventId) | 
| 714: | { | 
| 715: | $mResult = null; | 
| 716: | try { | 
| 717: | $mResult = array(); | 
| 718: | $aData = $this->oStorage->getEvent($sUserPublicId, $sCalendarId, $sEventId); | 
| 719: | if ($aData !== false) { | 
| 720: | if (isset($aData['vcal'])) { | 
| 721: | $oVCal = $aData['vcal']; | 
| 722: | $oCalendar = $this->oStorage->getCalendar($sUserPublicId, $sCalendarId); | 
| 723: | $mResult = \Aurora\Modules\Calendar\Classes\Parser::parseEvent($sUserPublicId, $oCalendar, $oVCal, $oVCal); | 
| 724: | $mResult['vcal'] = $oVCal; | 
| 725: | } | 
| 726: | } | 
| 727: | } catch (\Exception $oException) { | 
| 728: | $mResult = false; | 
| 729: | $this->setLastException($oException); | 
| 730: | } | 
| 731: | return $mResult; | 
| 732: | } | 
| 733: |  | 
| 734: |  | 
| 735: |  | 
| 736: |  | 
| 737: |  | 
| 738: |  | 
| 739: |  | 
| 740: |  | 
| 741: |  | 
| 742: |  | 
| 743: |  | 
| 744: |  | 
| 745: |  | 
| 746: | public function getBaseEvent($sUserPublicId, $sCalendarId, $sEventId) | 
| 747: | { | 
| 748: | $mResult = null; | 
| 749: | try { | 
| 750: | $mResult = array(); | 
| 751: | $aData = $this->oStorage->getEvent($sUserPublicId, $sCalendarId, $sEventId); | 
| 752: | if ($aData !== false) { | 
| 753: | if (isset($aData['vcal'])) { | 
| 754: | $oVCal = $aData['vcal']; | 
| 755: | $oVCalOriginal = clone $oVCal; | 
| 756: | $oCalendar = $this->oStorage->getCalendar($sUserPublicId, $sCalendarId); | 
| 757: | $oVEvent = $oVCal->getBaseComponents('VEVENT'); | 
| 758: | if (isset($oVEvent[0])) { | 
| 759: | unset($oVCal->VEVENT); | 
| 760: | $oVCal->VEVENT = $oVEvent[0]; | 
| 761: | } | 
| 762: | $oEvent = \Aurora\Modules\Calendar\Classes\Parser::parseEvent($sUserPublicId, $oCalendar, $oVCal, $oVCalOriginal); | 
| 763: | if (isset($oEvent[0])) { | 
| 764: | $mResult = $oEvent[0]; | 
| 765: | } | 
| 766: | } | 
| 767: | } | 
| 768: | } catch (\Exception $oException) { | 
| 769: | $mResult = false; | 
| 770: | $this->setLastException($oException); | 
| 771: | } | 
| 772: | return $mResult; | 
| 773: | } | 
| 774: |  | 
| 775: |  | 
| 776: |  | 
| 777: |  | 
| 778: |  | 
| 779: |  | 
| 780: |  | 
| 781: |  | 
| 782: |  | 
| 783: |  | 
| 784: |  | 
| 785: |  | 
| 786: | public function getExpandedEvent($sUserPublicId, $sCalendarId, $sEventId, $dStart = null, $dEnd = null) | 
| 787: | { | 
| 788: | $mResult = null; | 
| 789: |  | 
| 790: | try { | 
| 791: | $dStart = ($dStart != null) ? date('Ymd\T000000\Z', $dStart) : null; | 
| 792: | $dEnd = ($dEnd != null) ? date('Ymd\T235959\Z', $dEnd) : null; | 
| 793: | $mResult = $this->oStorage->getExpandedEvent($sUserPublicId, $sCalendarId, $sEventId, $dStart, $dEnd); | 
| 794: | } catch (\Exception $oException) { | 
| 795: | $mResult = false; | 
| 796: | $this->setLastException($oException); | 
| 797: | } | 
| 798: | return $mResult; | 
| 799: | } | 
| 800: |  | 
| 801: |  | 
| 802: |  | 
| 803: |  | 
| 804: |  | 
| 805: |  | 
| 806: |  | 
| 807: |  | 
| 808: |  | 
| 809: | public function createEventFromRaw($sUserPublicId, $sCalendarId, $sEventId, $sData) | 
| 810: | { | 
| 811: | $mResult = false; | 
| 812: | $aEvents = array(); | 
| 813: | try { | 
| 814: | $oVCal = \Sabre\VObject\Reader::read($sData); | 
| 815: | if ($oVCal && ($oVCal->VEVENT || $oVCal->VTODO)) { | 
| 816: | if (!empty($sEventId)) { | 
| 817: | $mResult = $this->oStorage->createEvent($sUserPublicId, $sCalendarId, $sEventId, $oVCal); | 
| 818: | } else { | 
| 819: | foreach ($oVCal->VEVENT as $oVEvent) { | 
| 820: | $sUid = (string)$oVEvent->UID; | 
| 821: | if (!isset($aEvents[$sUid])) { | 
| 822: | $aEvents[$sUid] = new \Sabre\VObject\Component\VCalendar(); | 
| 823: | } | 
| 824: | $aEvents[$sUid]->add($oVEvent); | 
| 825: | } | 
| 826: | $aVTodo = !empty($oVCal->VTODO) ? $oVCal->VTODO : []; | 
| 827: | foreach ($aVTodo as $oVTodo) { | 
| 828: | $sUid = (string)$oVTodo->UID; | 
| 829: | if (!isset($aEvents[$sUid])) { | 
| 830: | $aEvents[$sUid] = new \Sabre\VObject\Component\VCalendar(); | 
| 831: | } | 
| 832: | $aEvents[$sUid]->add($oVTodo); | 
| 833: | } | 
| 834: |  | 
| 835: | $aCreatedUids = []; | 
| 836: | foreach ($aEvents as $sUid => $oVCalNew) { | 
| 837: | $sCreatedUid = $this->oStorage->createEvent($sUserPublicId, $sCalendarId, $sUid, $oVCalNew); | 
| 838: | if ($sCreatedUid) { | 
| 839: | $aCreatedUids[] = $sCreatedUid; | 
| 840: | } | 
| 841: | } | 
| 842: | if (!empty($aCreatedUids)) { | 
| 843: | $mResult = $aCreatedUids; | 
| 844: | } | 
| 845: | } | 
| 846: | } | 
| 847: | } catch (\Exception $oException) { | 
| 848: | $this->setLastException($oException); | 
| 849: | } | 
| 850: | return $mResult; | 
| 851: | } | 
| 852: |  | 
| 853: |  | 
| 854: |  | 
| 855: |  | 
| 856: |  | 
| 857: |  | 
| 858: |  | 
| 859: |  | 
| 860: |  | 
| 861: | public function createEvent($sUserPublicId, $oEvent) | 
| 862: | { | 
| 863: | $oResult = null; | 
| 864: | try { | 
| 865: | $oEvent->Id = \Sabre\DAV\UUIDUtil::getUUID(); | 
| 866: |  | 
| 867: | $oVCal = new \Sabre\VObject\Component\VCalendar(); | 
| 868: | $sComponentName = !empty($oEvent->Type) ? $oEvent->Type : 'VEVENT'; | 
| 869: | $oComponent = new \Sabre\VObject\Component\VEvent( | 
| 870: | $oVCal, | 
| 871: | $sComponentName, | 
| 872: | [ | 
| 873: | 'SEQUENCE' => 0, | 
| 874: | 'TRANSP' => 'OPAQUE', | 
| 875: | 'DTSTAMP' => new \DateTime('now', new \DateTimeZone('UTC')), | 
| 876: | ], | 
| 877: | true | 
| 878: | ); | 
| 879: | $oVCal->add($oComponent); | 
| 880: |  | 
| 881: | \Aurora\Modules\Calendar\Classes\Helper::populateVCalendar($sUserPublicId, $oEvent, $oVCal, $oVCal->$sComponentName); | 
| 882: | $aArgs = [ | 
| 883: | 'sUserPublicId' => $sUserPublicId, | 
| 884: | 'oEvent' => $oEvent, | 
| 885: | 'oVCal' => $oVCal | 
| 886: | ]; | 
| 887: | $this->GetModule()->broadcastEvent( | 
| 888: | 'populateVCalendar', | 
| 889: | $aArgs, | 
| 890: | $oVCal->$sComponentName | 
| 891: | ); | 
| 892: | $oResult = $this->oStorage->createEvent($sUserPublicId, $oEvent->IdCalendar, $oEvent->Id, $oVCal); | 
| 893: | } catch (\Exception $oException) { | 
| 894: | $oResult = false; | 
| 895: | $this->setLastException($oException); | 
| 896: | } | 
| 897: | return $oResult; | 
| 898: | } | 
| 899: |  | 
| 900: |  | 
| 901: |  | 
| 902: |  | 
| 903: |  | 
| 904: |  | 
| 905: |  | 
| 906: |  | 
| 907: |  | 
| 908: | public function updateEvent($sUserPublicId, $oEvent) | 
| 909: | { | 
| 910: | $oResult = null; | 
| 911: | try { | 
| 912: | $aData = $this->oStorage->getEvent($sUserPublicId, $oEvent->IdCalendar, $oEvent->Id); | 
| 913: | if ($aData !== false) { | 
| 914: |  | 
| 915: | $oVCal = $aData['vcal']; | 
| 916: |  | 
| 917: | if ($oEvent->Type === 'VTODO' && isset($oVCal->VEVENT)) { | 
| 918: | $sRawEventData = $oVCal->serialize(); | 
| 919: | $sRawEventData = str_replace('VEVENT', 'VTODO', $sRawEventData); | 
| 920: | $oVCal = \Sabre\VObject\Reader::read($sRawEventData); | 
| 921: | } | 
| 922: |  | 
| 923: | if ($oEvent->Type === 'VEVENT' && isset($oVCal->VTODO)) { | 
| 924: | $sRawEventData = $oVCal->serialize(); | 
| 925: | $sRawEventData = str_replace('VTODO', 'VEVENT', $sRawEventData); | 
| 926: | $oVCal = \Sabre\VObject\Reader::read($sRawEventData); | 
| 927: | } | 
| 928: |  | 
| 929: | if ($oVCal) { | 
| 930: | $sComponent = $oEvent->Type; | 
| 931: |  | 
| 932: | $iIndex = \Aurora\Modules\Calendar\Classes\Helper::getBaseVComponentIndex($oVCal->{$sComponent}); | 
| 933: | if ($iIndex !== false) { | 
| 934: | \Aurora\Modules\Calendar\Classes\Helper::populateVCalendar($sUserPublicId, $oEvent, $oVCal, $oVCal->{$sComponent}[$iIndex]); | 
| 935: | $aArgs = [ | 
| 936: | 'sUserPublicId' => $sUserPublicId, | 
| 937: | 'oEvent' => $oEvent, | 
| 938: | 'oVCal' => $oVCal | 
| 939: | ]; | 
| 940: | $this->GetModule()->broadcastEvent( | 
| 941: | 'populateVCalendar', | 
| 942: | $aArgs, | 
| 943: | $oVCal->{$sComponent}[$iIndex] | 
| 944: | ); | 
| 945: | } | 
| 946: |  | 
| 947: | $oVCalResult = clone $oVCal; | 
| 948: | if (!isset($oEvent->RRule)) { | 
| 949: | unset($oVCalResult->{$sComponent}); | 
| 950: | if (isset($oVCal->{$sComponent})) { | 
| 951: | foreach ($oVCal->{$sComponent} as $oVComponent) { | 
| 952: | $oVComponent->SEQUENCE = (int) $oVComponent->SEQUENCE->getValue() + 1; | 
| 953: | if (!isset($oVComponent->{'RECURRENCE-ID'})) { | 
| 954: | $oVCalResult->add($oVComponent); | 
| 955: | } | 
| 956: | } | 
| 957: | } | 
| 958: | } | 
| 959: |  | 
| 960: | $oResult = $this->oStorage->updateEvent($sUserPublicId, $oEvent->IdCalendar, $aData['url'], $oVCalResult); | 
| 961: | } | 
| 962: | } | 
| 963: | } catch (\Exception $oException) { | 
| 964: | $oResult = false; | 
| 965: | $this->setLastException($oException); | 
| 966: | } | 
| 967: | return $oResult; | 
| 968: | } | 
| 969: |  | 
| 970: |  | 
| 971: |  | 
| 972: |  | 
| 973: |  | 
| 974: |  | 
| 975: |  | 
| 976: |  | 
| 977: |  | 
| 978: | public function updateEventRaw($sUserPublicId, $sCalendarId, $sEventUrl, $sData) | 
| 979: | { | 
| 980: | return $this->oStorage->updateEventRaw($sUserPublicId, $sCalendarId, $sEventUrl, $sData); | 
| 981: | } | 
| 982: |  | 
| 983: |  | 
| 984: |  | 
| 985: |  | 
| 986: |  | 
| 987: |  | 
| 988: |  | 
| 989: |  | 
| 990: |  | 
| 991: |  | 
| 992: |  | 
| 993: | public function moveEvent($sUserPublicId, $sCalendarId, $sCalendarIdNew, $sEventId) | 
| 994: | { | 
| 995: | $oResult = null; | 
| 996: | try { | 
| 997: | $aData = $this->oStorage->getEvent($sUserPublicId, $sCalendarId, $sEventId); | 
| 998: | if ($aData !== false && isset($aData['vcal']) && $aData['vcal'] instanceof \Sabre\VObject\Component\VCalendar) { | 
| 999: | $oResult = $this->oStorage->moveEvent($sUserPublicId, $sCalendarId, $sCalendarIdNew, $sEventId, $aData['vcal']->serialize()); | 
| 1000: |  | 
| 1001: | return true; | 
| 1002: | } | 
| 1003: | return false; | 
| 1004: | } catch (\Exception $oException) { | 
| 1005: | $oResult = false; | 
| 1006: | $this->setLastException($oException); | 
| 1007: | } | 
| 1008: | return $oResult; | 
| 1009: | } | 
| 1010: |  | 
| 1011: |  | 
| 1012: |  | 
| 1013: |  | 
| 1014: |  | 
| 1015: |  | 
| 1016: | public function updateEventGroupByMoving($sCalendarId, $sEventId, $sNewCalendarId) | 
| 1017: | { | 
| 1018: | $oContactsModule = \Aurora\System\Api::GetModule('Contacts'); | 
| 1019: | if ($oContactsModule) { | 
| 1020: | $aEvents = $oContactsModule->CallMethod('getGroupEvent', array($sCalendarId, $sEventId)); | 
| 1021: | if (is_array($aEvents) && 0 < count($aEvents)) { | 
| 1022: | foreach ($aEvents as $aEvent) { | 
| 1023: | if (isset($aEvent['id_group'])) { | 
| 1024: | $oContactsModule->CallMethod('removeEventFromGroup', array($aEvent['id_group'], $sCalendarId, $sEventId)); | 
| 1025: | $oContactsModule->CallMethod('addEventToGroup', array($aEvent['id_group'], $sNewCalendarId, $sEventId)); | 
| 1026: | } | 
| 1027: | } | 
| 1028: | } | 
| 1029: | } | 
| 1030: | } | 
| 1031: |  | 
| 1032: |  | 
| 1033: |  | 
| 1034: |  | 
| 1035: |  | 
| 1036: |  | 
| 1037: |  | 
| 1038: |  | 
| 1039: |  | 
| 1040: |  | 
| 1041: |  | 
| 1042: | public function updateExclusion($sUserPublicId, $oEvent, $sRecurrenceId, $bDelete = false) | 
| 1043: | { | 
| 1044: | $oResult = null; | 
| 1045: | try { | 
| 1046: | $oUser = \Aurora\System\Api::getAuthenticatedUser(); | 
| 1047: | $aData = $this->oStorage->getEvent($sUserPublicId, $oEvent->IdCalendar, $oEvent->Id); | 
| 1048: | if ($aData !== false && isset($aData['vcal']) && $aData['vcal'] instanceof \Sabre\VObject\Component\VCalendar) { | 
| 1049: | $oVCal = $aData['vcal']; | 
| 1050: | $sComponent = isset($oVCal->VEVENT) ? 'VEVENT' : 'VTODO'; | 
| 1051: |  | 
| 1052: | $iIndex = \Aurora\Modules\Calendar\Classes\Helper::getBaseVComponentIndex($oVCal->{$sComponent}); | 
| 1053: | if ($iIndex !== false) { | 
| 1054: |  | 
| 1055: | $oVComponent = &$oVCal->{$sComponent}[$iIndex]; | 
| 1056: | $oVComponent->{'LAST-MODIFIED'} = new \DateTime('now', new \DateTimeZone('UTC')); | 
| 1057: |  | 
| 1058: | $oDTExdate = \Aurora\Modules\Calendar\Classes\Helper::prepareDateTime($sRecurrenceId, $oUser->DefaultTimeZone); | 
| 1059: |  | 
| 1060: | $DTSTART = $oVComponent->DTSTART; | 
| 1061: | $oDTStart = $DTSTART->getDatetime(); | 
| 1062: |  | 
| 1063: | $mIndex = \Aurora\Modules\Calendar\Classes\Helper::isRecurrenceExists($oVCal->{$sComponent}, $sRecurrenceId); | 
| 1064: | if ($bDelete) { | 
| 1065: |  | 
| 1066: | if ($oDTExdate === $oDTStart) { | 
| 1067: | $it = new \Sabre\VObject\Recur\EventIterator($oVCal, (string) $oVCal->{$sComponent}[$iIndex]->UID); | 
| 1068: | $it->fastForward($oDTStart); | 
| 1069: | $it->next(); | 
| 1070: |  | 
| 1071: | if ($it->valid()) { | 
| 1072: | $oEventObj = $it->getEventObject(); | 
| 1073: | $oVComponent->DTSTART = $oEventObj->DTSTART; | 
| 1074: | $oVComponent->DTEND = $oEventObj->DTEND; | 
| 1075: | } | 
| 1076: | } | 
| 1077: |  | 
| 1078: | if (isset($oVComponent->EXDATE)) { | 
| 1079: | $oEXDATE = clone $oVComponent->EXDATE; | 
| 1080: | unset($oVComponent->EXDATE); | 
| 1081: | foreach ($oEXDATE as $oExDate) { | 
| 1082: | if ($oExDate->getDateTime() !== $oDTExdate) { | 
| 1083: | $oVComponent->add('EXDATE', $oExDate->getDateTime()); | 
| 1084: | } | 
| 1085: | } | 
| 1086: | } | 
| 1087: | $oVComponent->add('EXDATE', $oDTExdate); | 
| 1088: |  | 
| 1089: | if (false !== $mIndex) { | 
| 1090: | $aVEvents = $oVCal->{$sComponent}; | 
| 1091: | unset($oVCal->{$sComponent}); | 
| 1092: |  | 
| 1093: | foreach ($aVEvents as $oVEvent) { | 
| 1094: | if ($oVEvent->{'RECURRENCE-ID'}) { | 
| 1095: | $iRecurrenceId = \Aurora\Modules\Calendar\Classes\Helper::getTimestamp($oVEvent->{'RECURRENCE-ID'}, $oUser->DefaultTimeZone); | 
| 1096: | if ((int)$iRecurrenceId == (int) $sRecurrenceId) { | 
| 1097: | continue; | 
| 1098: | } | 
| 1099: | } | 
| 1100: | $oVCal->add($oVEvent); | 
| 1101: | } | 
| 1102: | } | 
| 1103: | } else { | 
| 1104: | $oVEventRecur = null; | 
| 1105: | if ($mIndex === false) { | 
| 1106: | $oVEventRecur = $oVCal->add($sComponent, array( | 
| 1107: | 'SEQUENCE' => 1, | 
| 1108: | 'TRANSP' => 'OPAQUE', | 
| 1109: | 'RECURRENCE-ID' => $oDTExdate | 
| 1110: | )); | 
| 1111: | } else { | 
| 1112: | $oVEventRecur = &$oVCal->{$sComponent}[$mIndex]; | 
| 1113: | } | 
| 1114: | if ($oVEventRecur) { | 
| 1115: | $oEvent->RRule = null; | 
| 1116: | \Aurora\Modules\Calendar\Classes\Helper::populateVCalendar($sUserPublicId, $oEvent, $oVCal, $oVEventRecur); | 
| 1117: | $aArgs = [ | 
| 1118: | 'sUserPublicId' => $sUserPublicId, | 
| 1119: | 'oEvent' => $oEvent, | 
| 1120: | 'oVCal' => $oVCal | 
| 1121: | ]; | 
| 1122: | $this->GetModule()->broadcastEvent( | 
| 1123: | 'populateVCalendar', | 
| 1124: | $aArgs, | 
| 1125: | $oVEventRecur | 
| 1126: | ); | 
| 1127: | } | 
| 1128: | } | 
| 1129: | $this->oStorage->updateEvent($sUserPublicId, $oEvent->IdCalendar, $oEvent->Id, $oVCal); | 
| 1130: | return true; | 
| 1131: | } | 
| 1132: | } | 
| 1133: | return false; | 
| 1134: | } catch (\Exception $oException) { | 
| 1135: | $oResult = false; | 
| 1136: | $this->setLastException($oException); | 
| 1137: | } | 
| 1138: | return $oResult; | 
| 1139: | } | 
| 1140: |  | 
| 1141: |  | 
| 1142: |  | 
| 1143: |  | 
| 1144: |  | 
| 1145: |  | 
| 1146: |  | 
| 1147: |  | 
| 1148: |  | 
| 1149: |  | 
| 1150: |  | 
| 1151: | public function deleteExclusion($sUserPublicId, $sCalendarId, $sEventId, $iRecurrenceId) | 
| 1152: | { | 
| 1153: | $oResult = null; | 
| 1154: | try { | 
| 1155: | $aData = $this->oStorage->getEvent($sUserPublicId, $sCalendarId, $sEventId); | 
| 1156: | $oUser = \Aurora\Modules\Core\Module::Decorator()->GetUserByPublicId($sUserPublicId); | 
| 1157: | if ($oUser && $aData !== false && isset($aData['vcal']) && $aData['vcal'] instanceof \Sabre\VObject\Component\VCalendar) { | 
| 1158: | $oVCal = $aData['vcal']; | 
| 1159: |  | 
| 1160: | $sComponent = 'VEVENT'; | 
| 1161: | if ($oVCal->VTODO) { | 
| 1162: | $sComponent = 'VTODO'; | 
| 1163: | } | 
| 1164: |  | 
| 1165: | $aVComponents = $oVCal->{$sComponent}; | 
| 1166: | unset($oVCal->{$sComponent}); | 
| 1167: |  | 
| 1168: | foreach ($aVComponents as $oVComponent) { | 
| 1169: | if (isset($oVComponent->{'RECURRENCE-ID'})) { | 
| 1170: | $iServerRecurrenceId = \Aurora\Modules\Calendar\Classes\Helper::getStrDate($oVComponent->{'RECURRENCE-ID'}, $oUser->DefaultTimeZone, 'Ymd'); | 
| 1171: | if ($iRecurrenceId == $iServerRecurrenceId) { | 
| 1172: | continue; | 
| 1173: | } | 
| 1174: | } | 
| 1175: | $oVCal->add($oVComponent); | 
| 1176: | } | 
| 1177: | return $this->oStorage->updateEvent($sUserPublicId, $sCalendarId, $sEventId, $oVCal); | 
| 1178: | } | 
| 1179: | return false; | 
| 1180: | } catch (\Exception $oException) { | 
| 1181: | $oResult = false; | 
| 1182: | $this->setLastException($oException); | 
| 1183: | } | 
| 1184: | return $oResult; | 
| 1185: | } | 
| 1186: |  | 
| 1187: |  | 
| 1188: |  | 
| 1189: |  | 
| 1190: |  | 
| 1191: |  | 
| 1192: |  | 
| 1193: |  | 
| 1194: | public function getReminders($start = null, $end = null) | 
| 1195: | { | 
| 1196: | $oResult = null; | 
| 1197: | try { | 
| 1198: | $oResult = $this->oStorage->getReminders($start, $end); | 
| 1199: | } catch (\Exception $oException) { | 
| 1200: | $oResult = false; | 
| 1201: | $this->setLastException($oException); | 
| 1202: | } | 
| 1203: | return $oResult; | 
| 1204: | } | 
| 1205: |  | 
| 1206: |  | 
| 1207: |  | 
| 1208: |  | 
| 1209: |  | 
| 1210: |  | 
| 1211: | public function deleteReminder($sEventId) | 
| 1212: | { | 
| 1213: | $oResult = null; | 
| 1214: | try { | 
| 1215: | $oResult = $this->oStorage->deleteReminder($sEventId); | 
| 1216: | } catch (\Exception $oException) { | 
| 1217: | $oResult = false; | 
| 1218: | $this->setLastException($oException); | 
| 1219: | } | 
| 1220: | return $oResult; | 
| 1221: | } | 
| 1222: |  | 
| 1223: |  | 
| 1224: |  | 
| 1225: |  | 
| 1226: |  | 
| 1227: |  | 
| 1228: |  | 
| 1229: | public function deleteReminderByCalendar($sCalendarUri) | 
| 1230: | { | 
| 1231: | $oResult = null; | 
| 1232: | try { | 
| 1233: | $oResult = $this->oStorage->deleteReminderByCalendar($sCalendarUri); | 
| 1234: | } catch (\Exception $oException) { | 
| 1235: | $oResult = false; | 
| 1236: | $this->setLastException($oException); | 
| 1237: | } | 
| 1238: | return $oResult; | 
| 1239: | } | 
| 1240: |  | 
| 1241: |  | 
| 1242: |  | 
| 1243: |  | 
| 1244: |  | 
| 1245: |  | 
| 1246: |  | 
| 1247: | public function deleteOutdatedReminders($time) | 
| 1248: | { | 
| 1249: | $oResult = false; | 
| 1250: | try { | 
| 1251: | $oResult = $this->oStorage->deleteOutdatedReminders($time); | 
| 1252: | } catch (\Exception $oException) { | 
| 1253: | $oResult = false; | 
| 1254: | $this->setLastException($oException); | 
| 1255: | } | 
| 1256: | return $oResult; | 
| 1257: | } | 
| 1258: |  | 
| 1259: |  | 
| 1260: |  | 
| 1261: |  | 
| 1262: |  | 
| 1263: |  | 
| 1264: |  | 
| 1265: |  | 
| 1266: |  | 
| 1267: |  | 
| 1268: | public function updateReminder($sEmail, $sCalendarUri, $sEventId, $sData) | 
| 1269: | { | 
| 1270: | $oResult = null; | 
| 1271: | try { | 
| 1272: | $oCalendar = $this->getCalendar($sEmail, $sCalendarUri); | 
| 1273: | if ($oCalendar) { | 
| 1274: | $oResult = $this->oStorage->updateReminder($oCalendar, $sEventId, $sData); | 
| 1275: | } | 
| 1276: | } catch (\Exception $oException) { | 
| 1277: | $oResult = false; | 
| 1278: | $this->setLastException($oException); | 
| 1279: | } | 
| 1280: | return $oResult; | 
| 1281: | } | 
| 1282: |  | 
| 1283: |  | 
| 1284: |  | 
| 1285: |  | 
| 1286: |  | 
| 1287: |  | 
| 1288: |  | 
| 1289: |  | 
| 1290: | public function getDefaultCalendar($sUserPublicId) | 
| 1291: | { | 
| 1292: | $mResult = null; | 
| 1293: | $aCalendars = $this->getCalendars($sUserPublicId); | 
| 1294: | foreach ($aCalendars as $key => $val) { | 
| 1295: | if (strpos($key, \Afterlogic\DAV\Constants::CALENDAR_DEFAULT_UUID) !== false) { | 
| 1296: | $mResult = $val; | 
| 1297: | break; | 
| 1298: | } | 
| 1299: | } | 
| 1300: | return $mResult; | 
| 1301: | } | 
| 1302: |  | 
| 1303: |  | 
| 1304: |  | 
| 1305: |  | 
| 1306: |  | 
| 1307: |  | 
| 1308: | public function getCalendars($sUserPublicId) | 
| 1309: | { | 
| 1310: | $aCalendars = []; | 
| 1311: | try { | 
| 1312: | $aCalendars = $this->oStorage->getCalendars($sUserPublicId); | 
| 1313: | } catch (\Exception $oException) { | 
| 1314: | $aCalendars = false; | 
| 1315: | $this->setLastException($oException); | 
| 1316: | } | 
| 1317: |  | 
| 1318: | return $aCalendars; | 
| 1319: | } | 
| 1320: |  | 
| 1321: | public function getSharedCalendars($sUserPublicId) | 
| 1322: | { | 
| 1323: | $aCalendars = []; | 
| 1324: | try { | 
| 1325: | $aCalendars = $this->oStorage->getSharedCalendars($sUserPublicId); | 
| 1326: | } catch (\Exception $oException) { | 
| 1327: | $aCalendars = false; | 
| 1328: | $this->setLastException($oException); | 
| 1329: | } | 
| 1330: |  | 
| 1331: | return $aCalendars; | 
| 1332: | } | 
| 1333: |  | 
| 1334: |  | 
| 1335: |  | 
| 1336: |  | 
| 1337: |  | 
| 1338: |  | 
| 1339: |  | 
| 1340: |  | 
| 1341: |  | 
| 1342: |  | 
| 1343: | public function deleteEvent($sUserPublicId, $sCalendarId, $sEventId) | 
| 1344: | { | 
| 1345: | $oResult = false; | 
| 1346: |  | 
| 1347: | $oUser = \Aurora\Modules\Core\Module::Decorator()->GetUserByPublicId($sUserPublicId); | 
| 1348: | if ($oUser instanceof \Aurora\Modules\Core\Models\User) { | 
| 1349: | $aData = $this->oStorage->getEvent($oUser->PublicId, $sCalendarId, $sEventId); | 
| 1350: | if ($aData !== false && isset($aData['vcal']) && $aData['vcal'] instanceof \Sabre\VObject\Component\VCalendar) { | 
| 1351: | $oVCal = $aData['vcal']; | 
| 1352: | $aArgs = [ | 
| 1353: | 'sUserPublicId' => $oUser->PublicId | 
| 1354: | ]; | 
| 1355: | $this->GetModule()->broadcastEvent( | 
| 1356: | 'DeleteEvent', | 
| 1357: | $aArgs, | 
| 1358: | $oVCal | 
| 1359: | ); | 
| 1360: | $oResult = $this->oStorage->deleteEvent($oUser->PublicId, $sCalendarId, $aData['url']); | 
| 1361: | if ($oResult) { | 
| 1362: |  | 
| 1363: |  | 
| 1364: |  | 
| 1365: | } | 
| 1366: | } | 
| 1367: | } | 
| 1368: |  | 
| 1369: | return $oResult; | 
| 1370: | } | 
| 1371: |  | 
| 1372: |  | 
| 1373: |  | 
| 1374: |  | 
| 1375: |  | 
| 1376: |  | 
| 1377: |  | 
| 1378: |  | 
| 1379: |  | 
| 1380: |  | 
| 1381: | public function deleteEventByUrl($sUserPublicId, $sCalendarId, $sEventUrl) | 
| 1382: | { | 
| 1383: | return $this->oStorage->deleteEventByUrl($sUserPublicId, $sCalendarId, $sEventUrl); | 
| 1384: | } | 
| 1385: |  | 
| 1386: |  | 
| 1387: |  | 
| 1388: |  | 
| 1389: |  | 
| 1390: |  | 
| 1391: |  | 
| 1392: |  | 
| 1393: |  | 
| 1394: |  | 
| 1395: | public function processICS($sUserPublicId, $sData, $mFromEmail, $bUpdateAttendeeStatus = false) | 
| 1396: | { | 
| 1397: | $mResult = false; | 
| 1398: | $oAuthenticatedUser = Api::getAuthenticatedUser(); | 
| 1399: | $aAccountEmails = ['mailto:' . $oAuthenticatedUser->PublicId]; | 
| 1400: |  | 
| 1401: | $oUser = \Aurora\Modules\Core\Module::Decorator()->GetUserByPublicId($sUserPublicId); | 
| 1402: | if ($oUser instanceof \Aurora\Modules\Core\Models\User) { | 
| 1403: |  | 
| 1404: | $oMailModuleDecorator = Api::GetModuleDecorator('Mail'); | 
| 1405: | if ($oMailModuleDecorator) { | 
| 1406: | $aUserAccounts = $oMailModuleDecorator->GetAccounts($oUser->Id); | 
| 1407: | foreach ($aUserAccounts as $oMailAccount) { | 
| 1408: | if ($oMailAccount instanceof \Aurora\Modules\Mail\Models\MailAccount) { | 
| 1409: | $aAccountEmails[] = 'mailto:' . $oMailAccount->Email; | 
| 1410: | } | 
| 1411: | } | 
| 1412: | } | 
| 1413: |  | 
| 1414: | $aAccountEmails = array_unique($aAccountEmails); | 
| 1415: |  | 
| 1416: |  | 
| 1417: | $newVCal = \Sabre\VObject\Reader::read($sData); | 
| 1418: | if ($newVCal) { | 
| 1419: | $newBaseVEvent = $newVCal->getBaseComponent('VEVENT'); | 
| 1420: | $sMethod = isset($newVCal->METHOD) ? $newVCal->METHOD->getValue() : 'SAVE'; | 
| 1421: | if (!in_array($sMethod, ['REQUEST', 'REPLY', 'CANCEL', 'PUBLISH', 'SAVE'])) { | 
| 1422: | return false; | 
| 1423: | } | 
| 1424: |  | 
| 1425: | if ($sMethod === 'REPLY') { | 
| 1426: | $aAccountEmails = ['mailto:' . $mFromEmail]; | 
| 1427: | } | 
| 1428: |  | 
| 1429: | if ($newBaseVEvent) { | 
| 1430: | $oldBaseVEvent = null; | 
| 1431: | $sEventId = (string)$newBaseVEvent->UID; | 
| 1432: | $oldSequence = 0; | 
| 1433: | $newSequence = isset($newBaseVEvent->{'SEQUENCE'}) && $newBaseVEvent->{'SEQUENCE'}->getValue() ? $newBaseVEvent->{'SEQUENCE'}->getValue() : 0 ; | 
| 1434: | $sCalendarId = $this->oStorage->findEventInCalendars($sUserPublicId, $sEventId); | 
| 1435: | if ($sCalendarId) { | 
| 1436: | $oldEventData = $this->oStorage->getEvent($sUserPublicId, $sCalendarId, $sEventId); | 
| 1437: | if ($oldEventData !== false) { | 
| 1438: | $oldVCal = $oldEventData['vcal']; | 
| 1439: |  | 
| 1440: | if ($oldVCal) { | 
| 1441: | $oldBaseVEvent = $oldVCal->getBaseComponent('VEVENT'); | 
| 1442: | if ($oldBaseVEvent) { | 
| 1443: | $oldSequence = isset($oldBaseVEvent->{'SEQUENCE'}) && $oldBaseVEvent->{'SEQUENCE'}->getValue() ? $oldBaseVEvent->{'SEQUENCE'}->getValue() : 0 ; | 
| 1444: | } | 
| 1445: | } | 
| 1446: |  | 
| 1447: | $broker = new ITipBroker(); | 
| 1448: | $messages = $broker->parseEvent($newVCal, $aAccountEmails, $oldVCal); | 
| 1449: |  | 
| 1450: | $schedulePlugin = Server::getInstance()->getPlugin('caldav-schedule'); | 
| 1451: | if ($schedulePlugin instanceof \Afterlogic\DAV\CalDAV\Schedule\Plugin) { | 
| 1452: | foreach ($messages as $message) { | 
| 1453: | $schedulePlugin->scheduleLocalDeliveryParent($message); | 
| 1454: | } | 
| 1455: | } | 
| 1456: | } | 
| 1457: | } | 
| 1458: |  | 
| 1459: |  | 
| 1460: | $sWhen = ''; | 
| 1461: | if (isset($newBaseVEvent->DTSTART)) { | 
| 1462: |  | 
| 1463: | $newDTStart = $newBaseVEvent->DTSTART; | 
| 1464: | $sWhenDateFormat = $newDTStart->hasTime() ? 'D, M d, Y, H:i' : 'D, M d, Y'; | 
| 1465: |  | 
| 1466: | $sWhen = \Aurora\Modules\Calendar\Classes\Helper::getStrDate($newDTStart, $oUser->DefaultTimeZone, $sWhenDateFormat); | 
| 1467: |  | 
| 1468: | if ($this->oModule->oModuleSettings->ShowWeekNumbers) { | 
| 1469: | $sWeek = \Aurora\Modules\Calendar\Classes\Helper::getStrDate($newDTStart, $oUser->DefaultTimeZone, 'W'); | 
| 1470: | $sWhen .= ' (' . $this->oModule->i18n('LABEL_WEEK_SHORT') . $sWeek . ')'; | 
| 1471: | } | 
| 1472: | } | 
| 1473: |  | 
| 1474: | $organizerEmail = ''; | 
| 1475: | $organizer = []; | 
| 1476: | if (isset($newBaseVEvent->ORGANIZER)) { | 
| 1477: | $organizerEmail = str_ireplace('mailto:', '', (string) $newBaseVEvent->ORGANIZER); | 
| 1478: | $displayName = ''; | 
| 1479: | if (isset($newBaseVEvent->ORGANIZER['CN'])) { | 
| 1480: |  | 
| 1481: | $cn = $newBaseVEvent->ORGANIZER['CN']; | 
| 1482: | $displayName = $cn->getValue(); | 
| 1483: | } | 
| 1484: | $organizer = [ | 
| 1485: | 'DisplayName' =>  $displayName, | 
| 1486: | 'Email' => $organizerEmail | 
| 1487: | ]; | 
| 1488: | } | 
| 1489: |  | 
| 1490: | $ateendeeList = []; | 
| 1491: | if (isset($newBaseVEvent->ATTENDEE)) { | 
| 1492: | foreach ($newBaseVEvent->ATTENDEE as $oAttendee) { | 
| 1493: | $ateendee = str_ireplace('mailto:', '', (string) $oAttendee); | 
| 1494: | if (strtolower($ateendee) !== strtolower($organizerEmail)) { | 
| 1495: | $ateendeeList[] = [ | 
| 1496: | 'DisplayName' => (isset($oAttendee['CN'])) ? $oAttendee['CN']->getValue() : '', | 
| 1497: | 'Email' => $ateendee | 
| 1498: | ]; | 
| 1499: | } | 
| 1500: | } | 
| 1501: | } | 
| 1502: |  | 
| 1503: | if ($sMethod === 'CANCEL' && $bUpdateAttendeeStatus) { | 
| 1504: | $aArgs = [ | 
| 1505: | 'sUserPublicId'			=> $oUser->PublicId, | 
| 1506: | 'sCalendarId'			=> $sCalendarId, | 
| 1507: | 'sEventId'				=> $sEventId | 
| 1508: | ]; | 
| 1509: | $this->GetModule()->broadcastEvent( | 
| 1510: | 'processICS::Cancel', | 
| 1511: | $aArgs, | 
| 1512: | $mResult | 
| 1513: | ); | 
| 1514: | } | 
| 1515: |  | 
| 1516: | $mResult = [ | 
| 1517: | 'Calendars' => $this->oStorage->GetCalendarNames($sUserPublicId), | 
| 1518: | 'CalendarId' => $sCalendarId, | 
| 1519: | 'UID' => $sEventId, | 
| 1520: | 'Body' => $newVCal->serialize(), | 
| 1521: | 'Action' => $sMethod, | 
| 1522: | 'Location' => isset($newBaseVEvent->LOCATION) ? (string)$newBaseVEvent->LOCATION : '', | 
| 1523: | 'Description' => isset($newBaseVEvent->DESCRIPTION) ? (string)$newBaseVEvent->DESCRIPTION : '', | 
| 1524: | 'Summary' => isset($newBaseVEvent->SUMMARY) ? (string)$newBaseVEvent->SUMMARY : '', | 
| 1525: | 'When' => $sWhen, | 
| 1526: | 'Sequence' => $newSequence, | 
| 1527: | 'Organizer' => $organizer, | 
| 1528: | 'AttendeeList' => $ateendeeList, | 
| 1529: | ]; | 
| 1530: |  | 
| 1531: | if ($oldSequence && $oldSequence >= $newSequence) { | 
| 1532: | $aArgs = [ | 
| 1533: | 'oVEventResult'		=> $sMethod === 'REPLY' ? $newBaseVEvent : $oldBaseVEvent, | 
| 1534: | 'sMethod'			=> $sMethod, | 
| 1535: | 'aAccountEmails'	=> $aAccountEmails | 
| 1536: | ]; | 
| 1537: | $this->GetModule()->broadcastEvent( | 
| 1538: | 'processICS::AddAttendeesToResult', | 
| 1539: | $aArgs, | 
| 1540: | $mResult | 
| 1541: | ); | 
| 1542: | } | 
| 1543: | } | 
| 1544: | } | 
| 1545: | } | 
| 1546: |  | 
| 1547: | return $mResult; | 
| 1548: | } | 
| 1549: |  | 
| 1550: |  | 
| 1551: |  | 
| 1552: |  | 
| 1553: |  | 
| 1554: |  | 
| 1555: |  | 
| 1556: |  | 
| 1557: | public function findEventInCalendars($sUserPublicId, $uid) | 
| 1558: | { | 
| 1559: | return $this->oStorage->findEventInCalendars($sUserPublicId, $uid); | 
| 1560: | } | 
| 1561: |  | 
| 1562: |  | 
| 1563: |  | 
| 1564: |  | 
| 1565: |  | 
| 1566: |  | 
| 1567: | public function clearAllCalendars($sUserPublicId) | 
| 1568: | { | 
| 1569: | $bResult = false; | 
| 1570: |  | 
| 1571: | $oUser = Api::getUserByPublicId($sUserPublicId); | 
| 1572: |  | 
| 1573: | if ($oUser instanceof \Aurora\Modules\Core\Models\User) { | 
| 1574: | $bResult = $this->oStorage->clearAllCalendars($sUserPublicId); | 
| 1575: | } | 
| 1576: |  | 
| 1577: | return $bResult; | 
| 1578: | } | 
| 1579: |  | 
| 1580: | public function getChangesForCalendar($userPublicId, $calendarId, $syncToken, $limit = null) | 
| 1581: | { | 
| 1582: | return $this->oStorage->getChangesForCalendar($userPublicId, $calendarId, $syncToken, $limit); | 
| 1583: | } | 
| 1584: |  | 
| 1585: | } | 
| 1586: |  |