* * @author Anna Larch * @author Richard Steinmetz * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE * License as published by the Free Software Foundation; either * version 3 of the License, or any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU AFFERO GENERAL PUBLIC LICENSE for more details. * * You should have received a copy of the GNU Affero General Public * License along with this library. If not, see . * */ namespace OCA\Gestion\Service; use OCA\Gestion\Db\Bdd; use Psr\Log\LoggerInterface; use OCA\Gestion\Helpers\VCalendarHelpers; class GestionService { /** @var Bdd */ private $gestionBdd; /** @var LoggerInterface */ private $logger; /** @var TalkService */ private $talkService; public function __construct( Bdd $gestionBdd, LoggerInterface $logger, TalkService $talkService) { $this->logger = $logger; $this->gestionBdd = $gestionBdd; $this->talkService = $talkService; } private function GetCalendarSummaryFromVCalendarString(string $vCalendarString): string { $summaryValue = "Nom du défunt"; $value = VCalendarHelpers::GetValueFromKeyInVCalendarString("SUMMARY", $vCalendarString); if($value !== ""){ $summaryValue = trim($value); } return $summaryValue; } private function GetThanatoIdFromVCalendarString(string $vCalendarString) { $thanatoId = 0; $thanatoNames = $this->GetAttendeesNameFromVCalendarString($vCalendarString); if(count($thanatoNames) > 0){ $thanatoName = $thanatoNames[0]; $thanatoIdFromDb = $this->gestionBdd->getFirstThanatoIdByName($thanatoName); if($thanatoIdFromDb != null){ $thanatoId = $thanatoIdFromDb; } } else{ //get from calendar object $organizerName = $this->getPrincipalUsernameFromVCalendarString($vCalendarString); if($organizerName != null){ $thanatoIdFromDb = $this->gestionBdd->getFirstThanatoIdByName($organizerName); if($thanatoIdFromDb != null){ $thanatoId = $thanatoIdFromDb; } } } return $thanatoId; } private function getPrincipalUsernameFromVCalendarString(string $vCalendarString){ $calendarUuid = VCalendarHelpers::GetValueFromKeyInVCalendarString("UID", $vCalendarString); $principalUsername = $this->gestionBdd->getCalendarOrganizerNameByCalendarObjectUuid($calendarUuid); return $principalUsername; } private function GetAttendeesNameFromVCalendarString(string $vCalendarString): array { $names = []; preg_match_all('/CN=([^;]+)/', $vCalendarString, $matches); if (isset($matches[1])) { $names = $matches[1]; } return $names; } private function IsDevisAlreadyCreated($clientId,$locationId,$thanatoId,$defuntName,$calendarUuid="not-related"){ $defuntId = $this->gestionBdd->getLastDefuntIdByName($defuntName); $devisId = $this->gestionBdd->getLastDevisIdFromVCalendarProperty($thanatoId,$clientId,$locationId,$defuntId,$calendarUuid); return $devisId != null; } private function GetDevisCommentFromVCalendarString(string $vCalendarString){ $commentValue = VCalendarHelpers::GetValueFromKeyInVCalendarString("COMMENT", $vCalendarString); if($commentValue == ""){ $commentValue = "Commentaire"; } return $commentValue; } private function GetCalendarUuidFromVCalendarString(string $vCalendarString): string { $calendarUuid = VCalendarHelpers::GetValueFromKeyInVCalendarString("UID", $vCalendarString); if($calendarUuid == ""){ $calendarUuid = $this->gestionBdd::DEFAULT_CALENDAR_UUID_FOR_DEVIS; } return $calendarUuid; } private function GetCalendarDateFromVCalendarString(string $vCalendarString){ $calendarStartDate = VCalendarHelpers::GetDateStartOrDateEndFromVCalendarString('DTSTART',$vCalendarString); $calendarStartDate = $calendarStartDate->format('Y-m-d'); return $calendarStartDate; } public function HandleCalendarObjectMovedToTrash(string $vCalendarString){ $calendarUuid = $this->GetCalendarUuidFromVCalendarString($vCalendarString); $devis = $this->gestionBdd->getDevisByCalendarUuid($calendarUuid); if($devis != null){ $this->gestionBdd->updateDevisMentionToCanceled($devis['id']); } return true; } private function UpdateDevisDataByVCalendarString($devis,$vCalendarString){ $requestedDefuntName = $this->GetCalendarSummaryFromVCalendarString($vCalendarString); $defuntId = $this->gestionBdd->createOrUpdateDefuntByNameAndReturnDefuntId($devis['defunt_id'],$devis['defunt_nom'],$requestedDefuntName); $this->gestionBdd->updateDevisDefunt($devis['id'],$defuntId,$devis['defunt_id']); $requestedClientId = $this->GetClientIdFromVCalendarString($vCalendarString); $this->gestionBdd->updateDevisClient($devis['id'],$requestedClientId,$devis['client_id']); $requestLocationId = $this->GetLocationIdFromVCalendarString($vCalendarString); $this->gestionBdd->updateDevisLieu($devis['id'],$requestLocationId,$devis['lieu_id']); $requestedDevisComment = $this->GetDevisCommentFromVCalendarString($vCalendarString); $this->gestionBdd->updateDevisComment($devis['id'],$requestedDevisComment,$devis['comment']); $articlesValue = $this->GetArticlesNameFromVCalendarString($vCalendarString); if(!empty($articlesValue)){ $articleIds = $this->gestionBdd->getArticleIdsByArticleReferences($articlesValue); $this->gestionBdd->updateDevisArticles($devis['id'],$articleIds); } } public function HandleUpdatedCalendarObject(string $vCalendarString){ $calendarUuid = $this->GetCalendarUuidFromVCalendarString($vCalendarString); $devis = $this->gestionBdd->getDevisByCalendarUuid($calendarUuid); if($devis != null){ $this->UpdateDevisDataByVCalendarString($devis,$vCalendarString); } return true; } public function HandleCreatedCalendarObject(string $vCalendarString){ $calendarSummary = $this->GetCalendarSummaryFromVCalendarString($vCalendarString); $clientId = $this->GetClientIdFromVCalendarString($vCalendarString); $locationId = $this->GetLocationIdFromVCalendarString($vCalendarString); $thanatoId = $this->GetThanatoIdFromVCalendarString($vCalendarString); $calendarUuid = $this->GetCalendarUuidFromVCalendarString($vCalendarString); $userName = $this->GetThanatoNameFromVCalendarString($vCalendarString); $devisAlreadyCreated = $this->IsDevisAlreadyCreated($clientId,$locationId,$thanatoId,$calendarSummary,$calendarUuid); if($devisAlreadyCreated){ return; } $defuntId = $this->gestionBdd->insertDefuntByNameAndReturnId($calendarSummary); $calendarStartDate = $this->GetCalendarDateFromVCalendarString($vCalendarString); $devisComment = $this->GetDevisCommentFromVCalendarString($vCalendarString); $devisId = $this->gestionBdd->insertDevisFromVCalendarAndReturnId($thanatoId,$clientId,$locationId,$defuntId,$calendarUuid,$calendarStartDate,$devisComment); $articlesValue = $this->GetArticlesNameFromVCalendarString($vCalendarString); if(!empty($articlesValue)){ $articleIds = $this->gestionBdd->getArticleIdsByArticleReferences($articlesValue); $this->gestionBdd->insertDevisArticleFromDevisIdAndArticlesIdArray($devisId, $articleIds); } $this->gestionBdd->createDevisTrajetFromVCalendar($devisId,$userName); $devisTalkMessage = $this->gestionBdd->getDevisTalkRoomMessage($devisId,$userName); $this->talkService->sendDevisTalkNotifications($devisTalkMessage,$userName); } private function GetThanatoNameFromVCalendarString($vCalendarString){ $thanatoName = null; $thanatoNames = $this->GetAttendeesNameFromVCalendarString($vCalendarString); if(count($thanatoNames) > 0){ $thanatoName = $thanatoNames[0]; } else{ //get from calendar object $thanatoName = $this->getPrincipalUsernameFromVCalendarString($vCalendarString); } return $thanatoName; } private function GetClientIdFromVCalendarString(string $vCalendarString){ $this->logger->debug($vCalendarString); $clientValue = VCalendarHelpers::GetValueFromKeyInVCalendarString("CLIENT", $vCalendarString); if($clientValue == null || $clientValue == ""){ $clientValue = 0; } return (int)$clientValue; } private function GetLocationIdFromVCalendarString(string $vCalendarString){ $locationValue = VCalendarHelpers::GetValueFromKeyInVCalendarString("LOCATION", $vCalendarString); if($locationValue == null || $locationValue == ""){ $locationValue = 0; } return (int)$locationValue; } private function GetArticlesNameFromVCalendarString(string $vCalendarString): array { $devisArticleValue = VCalendarHelpers::GetValueFromKeyInVCalendarString("DESCRIPTION", $vCalendarString); $articles = explode('\;', $devisArticleValue); $mapped = array_map('trim', $articles); return $mapped; } }