108 lines
3.6 KiB
PHP
108 lines
3.6 KiB
PHP
<?php
|
|
|
|
namespace OCA\Gestion\Helpers;
|
|
|
|
use DateTime;
|
|
use DateTimeZone;
|
|
use Exception;
|
|
|
|
class VCalendarHelpers
|
|
{
|
|
|
|
public static function GetValueFromKeyInVCalendarString(string $key, string $vCalendarString , ): string
|
|
{
|
|
$value = "";
|
|
preg_match("/$key:(.*)\r\n/", $vCalendarString, $matches);
|
|
if (isset($matches[1])) {
|
|
$value = trim($matches[1]);
|
|
}
|
|
return $value;
|
|
}
|
|
|
|
public static function GetDateStartOrDateEndFromVCalendarString(string $key, string $vCalendarString)
|
|
{
|
|
preg_match("/$key;TZID=([^:]+):(\d+T\d+)/", $vCalendarString, $matches);
|
|
if (!$matches) {
|
|
return null;
|
|
}
|
|
try {
|
|
$dateTz = $matches[1];
|
|
$datetimeString = $matches[2];
|
|
$datetimeValue = new DateTime($datetimeString, new DateTimeZone($dateTz));
|
|
return $datetimeValue;
|
|
} catch (Exception $e) {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public static function GetStartAndEndTimeFromVCalendarString(string $vCalendarString){
|
|
$startTimeValue = "";
|
|
$endTimeValue = "";
|
|
$totalHours = 0;
|
|
$totalWorkedHours = 0;
|
|
$dateStart = null;
|
|
$dateEnd = null;
|
|
if($vCalendarString != ""){
|
|
$dateStart = self::GetDateStartOrDateEndFromVCalendarString("DTSTART", $vCalendarString);
|
|
if($dateStart != null){
|
|
$startTimeValue = $dateStart->format("H") . "h";
|
|
}
|
|
$dateEnd = self::GetDateStartOrDateEndFromVCalendarString("DTEND", $vCalendarString);
|
|
if($dateEnd != null){
|
|
$endTimeValue = $dateEnd->format("H") . "h";
|
|
}
|
|
$totalHours = DateHelpers::getHoursBetweenTwoDatetime($dateEnd,$dateStart);
|
|
$totalWorkedHours = DateHelpers::GetWorkingHoursBetweenDatetimeEndAndDatetimeStart($dateEnd,$dateStart);
|
|
}
|
|
return [
|
|
"datetimeStart" => $dateStart,
|
|
"datetimeEnd" => $dateEnd,
|
|
"startTime" => $startTimeValue,
|
|
"endTime" => $endTimeValue,
|
|
"totalHours" => $totalHours,
|
|
"totalWorkedHours" => $totalWorkedHours
|
|
];
|
|
}
|
|
|
|
public static function ReadVCalendarDataBlob($vCalendarData)
|
|
{
|
|
if (is_resource($vCalendarData)) {
|
|
return stream_get_contents($vCalendarData);
|
|
}
|
|
return $vCalendarData;
|
|
}
|
|
|
|
public static function hasAttachment(string $vCalendarString): bool
|
|
{
|
|
return str_contains($vCalendarString, 'ATTACH;FMTTYPE');
|
|
}
|
|
|
|
public static function hasEmailIdInVCalendar(string $vCalendarString): bool
|
|
{
|
|
return self::getEmailIdInVCalendar("EMAILID", $vCalendarString) ? true : false;
|
|
}
|
|
|
|
public static function getEmailIdInVCalendar(string $vCalendarString): string|int|null
|
|
{
|
|
return self::GetValueFromKeyInVCalendarString("EMAILID", $vCalendarString) ?? null;
|
|
}
|
|
|
|
public static function extractAttachments(string $vCalendarString): array
|
|
{
|
|
$attachments = [];
|
|
$vCalendarString = preg_replace("/\r\n|\n|\r/", "\n", $vCalendarString);
|
|
$vCalendarString = preg_replace("/\n[ \t]/", "", $vCalendarString);
|
|
preg_match_all('/ATTACH;FMTTYPE=([^;]+);FILENAME=([^;]+);X-NC-FILE-ID=(\d+)/', $vCalendarString, $matches, PREG_SET_ORDER);
|
|
foreach ($matches as $match) {
|
|
$attachments[] = [
|
|
'type' => explode("/", $match[1])[0],
|
|
'mime_type' => $match[1],
|
|
'name' => trim($match[2], '/'),
|
|
'file_id' => (int) $match[3],
|
|
];
|
|
}
|
|
return $attachments;
|
|
}
|
|
|
|
}
|