Skip to content

Commit

Permalink
fix(ZMS-3253): weekday validation logic
Browse files Browse the repository at this point in the history
  • Loading branch information
Thomas Fink authored and Thomas Fink committed Feb 17, 2025
1 parent fcf3a7d commit 85be2b5
Showing 1 changed file with 38 additions and 35 deletions.
73 changes: 38 additions & 35 deletions zmsadmin/src/Zmsadmin/AvailabilityConflicts.php
Original file line number Diff line number Diff line change
Expand Up @@ -28,17 +28,17 @@ protected static function getAvailabilityData($input)
$availabilityList = (new AvailabilityList())->addData($input['availabilityList']);
$selectedDateTime = (new DateTimeImmutable($input['selectedDate']))
->modify(\App::$now->format('H:i:s'));

[$hasExclusionSplit, $originId] = self::processAvailabilityKinds($availabilityList);

$conflictList = self::getConflictList(
$availabilityList,
$selectedDateTime,
$input,
$hasExclusionSplit,
$availabilityList,
$selectedDateTime,
$input,
$hasExclusionSplit,
$originId
);

return self::filterAndSortConflicts($conflictList, $selectedDateTime);
}

Expand All @@ -63,7 +63,7 @@ private static function processAvailabilityKinds(AvailabilityList $availabilityL
if (!isset($availability->kind)) {
continue;
}

if ($availability->kind === 'origin' && isset($availability->id)) {
$originId = $availability->id;
$hasExclusionSplit = true;
Expand All @@ -82,13 +82,13 @@ private static function getConflictList(
?string $originId
) {
$conflictList = new ProcessList();

$overlapConflicts = $availabilityList->hasNewVsNewConflicts();
$conflictList->addList($overlapConflicts);

$scope = new Scope($input['availabilityList'][0]['scope']);
$futureAvailabilityList = self::getAvailabilityList($scope, $selectedDateTime);

$filteredAvailabilityList = self::getFilteredAvailabilityList(
$availabilityList,
$futureAvailabilityList,
Expand All @@ -99,7 +99,7 @@ private static function getConflictList(
[$earliestStartDateTime, $latestEndDateTime] = $filteredAvailabilityList
->getDateTimeRangeFromList($selectedDateTime);
$filteredAvailabilityList = $filteredAvailabilityList->sortByCustomStringKey('endTime');

$existingConflicts = $filteredAvailabilityList->checkAllVsExistingConflicts(
$earliestStartDateTime,
$latestEndDateTime
Expand All @@ -116,15 +116,14 @@ private static function getFilteredAvailabilityList(
?string $originId
) {
$filteredAvailabilityList = new AvailabilityList();

foreach ($availabilityList as $availability) {
$isSpecialKind = isset($availability->kind) &&
$isSpecialKind = isset($availability->kind) &&
in_array($availability->kind, ['origin', 'exclusion', 'future']);

foreach ($futureAvailabilityList as $futureAvailability) {
if (
!$isSpecialKind || !$hasExclusionSplit ||
!isset($futureAvailability->id) ||
if (!$isSpecialKind || !$hasExclusionSplit ||
!isset($futureAvailability->id) ||
$futureAvailability->id !== $originId
) {
$filteredAvailabilityList->addEntity($futureAvailability);
Expand All @@ -139,24 +138,32 @@ private static function getFilteredAvailabilityList(

private static function filterAndSortConflicts(ProcessList $conflictList, DateTimeImmutable $selectedDateTime)
{
$weekday = (int)$selectedDateTime->format('N');
$weekdayKey = strtolower(date('l', strtotime("Sunday +{$weekday} days")));

$filteredConflictList = new ProcessList();
$conflictedList = [];

foreach ($conflictList as $conflict) {
$availability1 = $conflict->getFirstAppointment()->getAvailability();
$availability2 = self::findMatchingAvailability($conflict, $conflictList);


// Use the availability's start date for weekday calculation
$availabilityDate = (new DateTimeImmutable())->setTimestamp($availability1->startDate);
$weekdayKey = strtolower($availabilityDate->format('l'));

error_log("Availability date: " . $availabilityDate->format('Y-m-d'));
error_log("Weekday key: " . $weekdayKey);
error_log("Availability1 weekdays: " . json_encode($availability1->weekday));
if ($availability2) {
error_log("Availability2 weekdays: " . json_encode($availability2->weekday));
}

if (self::doesConflictAffectWeekday($availability1, $availability2, $weekdayKey)) {
$filteredConflictList->addEntity($conflict);
self::addToConflictedList($conflictedList, $availability1, $availability2);
}
}

usort($conflictedList, [self::class, 'sortConflictedList']);

return [
'conflictList' => $filteredConflictList->toConflictListByDay(),
'conflictIdList' => (count($conflictedList)) ? $conflictedList : []
Expand All @@ -167,8 +174,7 @@ private static function findMatchingAvailability($conflict, $filteredAvailabilit
{
$availability1 = $conflict->getFirstAppointment()->getAvailability();
foreach ($filteredAvailabilityList as $avail) {
if (
$avail->id === $availability1->id ||
if ($avail->id === $availability1->id ||
(isset($avail->tempId) && isset($availability1->tempId) &&
$avail->tempId === $availability1->tempId)
) {
Expand All @@ -180,20 +186,18 @@ private static function findMatchingAvailability($conflict, $filteredAvailabilit

private static function doesConflictAffectWeekday($availability1, $availability2, $weekdayKey)
{
if (
isset($availability1->weekday[$weekdayKey]) &&
if (isset($availability1->weekday[$weekdayKey]) &&
(int)$availability1->weekday[$weekdayKey] > 0
) {
return true;
}

if (
$availability2 && isset($availability2->weekday[$weekdayKey]) &&

if ($availability2 && isset($availability2->weekday[$weekdayKey]) &&
(int)$availability2->weekday[$weekdayKey] > 0
) {
return true;
}

return false;
}

Expand All @@ -203,7 +207,7 @@ private static function addToConflictedList(&$conflictedList, $availability1, $a
if (!in_array($availabilityId, $conflictedList)) {
$conflictedList[] = $availabilityId;
}

if ($availability2) {
$availabilityId2 = $availability2->getId() ?: $availability2->tempId;
if (!in_array($availabilityId2, $conflictedList)) {
Expand All @@ -212,12 +216,11 @@ private static function addToConflictedList(&$conflictedList, $availability1, $a
}
}

/** @SuppressWarnings(PHPMD.UnusedPrivateMethod) */
private static function sortConflictedList($a, $b)
{
$aIsTemp = strpos($a, '__temp__') === 0;
$bIsTemp = strpos($b, '__temp__') === 0;

if ($aIsTemp && !$bIsTemp) {
return 1;
}
Expand Down Expand Up @@ -247,4 +250,4 @@ protected static function getAvailabilityList($scope, $dateTime)
}
return $availabilityList->withScope($scope);
}
}
}

0 comments on commit 85be2b5

Please sign in to comment.