feat(event): implement EventDateGroupingService to group historical dates and update related resources and tests
This commit is contained in:
@@ -18,9 +18,7 @@ class EventDateInfoFormatter
|
||||
$messages->push('Esta fecha fue cancelada.');
|
||||
}
|
||||
|
||||
$sourceDates = $changes
|
||||
->where('change_type', EventDateChangeType::Rescheduled)
|
||||
->where('destination_event_date_id', $eventDate->getKey())
|
||||
$sourceDates = $this->reschedulesEndingAt($eventDate, $changes)
|
||||
->pluck('previous_date')
|
||||
->filter()
|
||||
->map(fn ($date): string => $date->format('d/m/Y'))
|
||||
@@ -34,4 +32,45 @@ class EventDateInfoFormatter
|
||||
|
||||
return $messages->isEmpty() ? null : $messages->join(' ');
|
||||
}
|
||||
|
||||
/**
|
||||
* Includes direct and intermediate reschedules that ultimately end at the
|
||||
* displayed event date, while preserving the original change order.
|
||||
*
|
||||
* @param Collection<int, EventDateChange> $changes
|
||||
* @return Collection<int, EventDateChange>
|
||||
*/
|
||||
private function reschedulesEndingAt(EventDate $eventDate, Collection $changes): Collection
|
||||
{
|
||||
$eventDateId = $eventDate->getKey();
|
||||
$reschedules = $changes->where('change_type', EventDateChangeType::Rescheduled);
|
||||
|
||||
if ($eventDateId === null) {
|
||||
return $reschedules->where('destination_event_date_id', null);
|
||||
}
|
||||
|
||||
$destinationIds = [(int) $eventDateId => true];
|
||||
|
||||
do {
|
||||
$foundAncestor = false;
|
||||
|
||||
foreach ($reschedules as $change) {
|
||||
$destinationId = $change->destination_event_date_id;
|
||||
$sourceId = $change->source_event_date_id;
|
||||
|
||||
if ($destinationId === null || $sourceId === null) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (isset($destinationIds[(int) $destinationId]) && ! isset($destinationIds[(int) $sourceId])) {
|
||||
$destinationIds[(int) $sourceId] = true;
|
||||
$foundAncestor = true;
|
||||
}
|
||||
}
|
||||
} while ($foundAncestor);
|
||||
|
||||
return $reschedules
|
||||
->filter(fn (EventDateChange $change): bool => $change->destination_event_date_id !== null
|
||||
&& isset($destinationIds[(int) $change->destination_event_date_id]));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user