calendar non working all-day timzone correction

This commit is contained in:
Yuri Kuznetsov
2024-08-23 11:20:10 +03:00
parent 9e86649b1c
commit 8441fa05d2
3 changed files with 56 additions and 9 deletions
@@ -42,4 +42,9 @@ class Preferences extends \Espo\Core\ORM\Entity
{
return null;
}
public function getTimeZone(): ?string
{
return $this->get('timeZone');
}
}
@@ -29,6 +29,7 @@
namespace Espo\Modules\Crm\Tools\Calendar;
use DateTimeZone;
use Espo\Core\Acl;
use Espo\Core\Acl\Table;
use Espo\Core\Exceptions\BadRequest;
@@ -39,6 +40,7 @@ use Espo\Core\Field\DateTime as DateTimeField;
use Espo\Core\Select\SelectBuilderFactory;
use Espo\Core\Utils\Config;
use Espo\Core\Utils\Metadata;
use Espo\Entities\Preferences;
use Espo\Entities\Team;
use Espo\Entities\User;
use Espo\Modules\Crm\Entities\Call;
@@ -891,18 +893,21 @@ class Service
$from = $fetchParams->getFrom();
$to = $fetchParams->getTo();
$timezone = !$fetchParams->isAgenda() ?
$this->getCurrentUserTimezone() : null;
$extractor = new Extractor();
$itemList = $fetchParams->workingTimeRangesInverted() ?
(
$fetchParams->isAgenda() ?
$extractor->extractInversion($calendar, $from, $to) :
$extractor->extractAllDayInversion($calendar, $from, $to)
$extractor->extractAllDayInversion($calendar, $from, $to, $timezone)
) :
(
$fetchParams->isAgenda() ?
$extractor->extract($calendar, $from, $to) :
$extractor->extractAllDay($calendar, $from, $to)
$extractor->extractAllDay($calendar, $from, $to, $timezone)
);
$list = [];
@@ -1015,4 +1020,29 @@ class Service
return $result;
}
private function getCurrentUserTimezone(): DateTimeZone
{
try {
return new DateTimeZone($this->getCurrentUserTimezoneString());
} catch (Exception $e) {
throw new RuntimeException($e->getMessage(), 0, $e);
}
}
/**
* @todo Move to a separate class.
*/
private function getCurrentUserTimezoneString(): string
{
$preferences = $this->entityManager
->getRepositoryByClass(Preferences::class)
->getById($this->user->getId());
if ($preferences && $preferences->getTimeZone()) {
return $preferences->getTimeZone();
}
return $this->config->get('timeZone') ?? 'UTC';
}
}
@@ -29,6 +29,7 @@
namespace Espo\Tools\WorkingTime;
use DateTimeZone;
use Espo\Tools\WorkingTime\Calendar\WorkingWeekday;
use Espo\Tools\WorkingTime\Calendar\WorkingDate;
use Espo\Tools\WorkingTime\Calendar\HavingRanges;
@@ -137,10 +138,16 @@ class Extractor
/**
* @return array{DateTime,DateTime}[]
*/
public function extractAllDay(Calendar $calendar, DateTime $from, DateTime $to): array
{
public function extractAllDay(Calendar $calendar,
DateTime $from,
DateTime $to,
?DateTimeZone $timezone = null
): array {
$timezone ??= $calendar->getTimezone();
$pointer = $from
->withTimezone($calendar->getTimezone())
->withTimezone($timezone)
->withTime(0, 0, 0);
$fromDate = Date::fromDateTime($from->modify('-1 day')->toDateTime());
@@ -152,7 +159,7 @@ class Extractor
$list = [];
$end = $to->withTimezone($calendar->getTimezone())->withTime(23, 59, 59);
$end = $to->withTimezone($timezone)->withTime(23, 59, 59);
while ($pointer->toTimestamp() < $end->toTimestamp()) {
$isWorkingDay = $this->isWorkingDay(
@@ -225,9 +232,14 @@ class Extractor
/**
* @return array{DateTime,DateTime}[]
*/
public function extractAllDayInversion(Calendar $calendar, DateTime $from, DateTime $to): array
{
$list = $this->extractAllDay($calendar, $from, $to);
public function extractAllDayInversion(
Calendar $calendar,
DateTime $from,
DateTime $to,
?DateTimeZone $timezone = null
): array {
$list = $this->extractAllDay($calendar, $from, $to, $timezone);
if ($list === []) {
return [[$from, $to]];