46 lines
1.1 KiB
PHP
46 lines
1.1 KiB
PHP
<?php
|
|
|
|
namespace App\Domains\Event\Services;
|
|
|
|
use App\Domains\Event\Models\EventDate;
|
|
|
|
class EffectiveEventDateResolver
|
|
{
|
|
public function resolve(EventDate $eventDate): ?EventDate
|
|
{
|
|
$date = $this->resolveLatest($eventDate);
|
|
|
|
return $date !== null && $date->suspended_at === null ? $date : null;
|
|
}
|
|
|
|
/** Sigue las reprogramaciones para presentación, incluso si el destino está suspendido. */
|
|
public function resolveLatest(EventDate $eventDate): ?EventDate
|
|
{
|
|
$current = $eventDate;
|
|
$visited = [];
|
|
|
|
while (true) {
|
|
$identity = $current->getKey() === null
|
|
? 'object:'.spl_object_id($current)
|
|
: 'key:'.$current->getKey();
|
|
|
|
if (isset($visited[$identity])) {
|
|
return null;
|
|
}
|
|
|
|
$visited[$identity] = true;
|
|
|
|
if ($current->rescheduled_to_event_date_id === null) {
|
|
return $current;
|
|
}
|
|
|
|
$current->loadMissing('rescheduledTo');
|
|
$current = $current->rescheduledTo;
|
|
|
|
if ($current === null) {
|
|
return null;
|
|
}
|
|
}
|
|
}
|
|
}
|