fino a eventi e report prima del tipo di eventi

This commit is contained in:
2026-05-26 11:47:36 +02:00
parent 0bed099d05
commit f088dba4bf
47 changed files with 1733 additions and 6899 deletions
+160 -30
View File
@@ -67,14 +67,15 @@ class EventoController extends Controller
'giorno_settimana' => 'nullable|integer|min:0|max:6',
'giorno_mese' => 'nullable|integer|min:1|max:31',
'occorrenza_mese' => 'nullable|string|max:10',
'mesi_recorrenza' => 'nullable|string',
'mesi_recorrenza' => 'nullable|array',
'mesi_recorrenza.*' => 'integer|min:1|max:12',
'mese_annuale' => 'nullable|integer|min:1|max:12',
'ora_inizio' => 'nullable|date_format:H:i',
'data_specifica' => 'nullable|date',
'durata_minuti' => 'nullable|integer|min:1',
'descrizione' => 'nullable|string',
'note' => 'nullable|string',
'is_incontro_gruppo' => 'nullable|boolean',
'is_incontro_gruppo' => 'nullable',
'gruppi' => 'nullable|array',
'gruppi.*' => 'exists:gruppi,id',
'responsabili' => 'nullable|array',
@@ -144,14 +145,15 @@ class EventoController extends Controller
'giorno_settimana' => 'nullable|integer|min:0|max:6',
'giorno_mese' => 'nullable|integer|min:1|max:31',
'occorrenza_mese' => 'nullable|string|max:10',
'mesi_recorrenza' => 'nullable|string',
'mesi_recorrenza' => 'nullable|array',
'mesi_recorrenza.*' => 'integer|min:1|max:12',
'mese_annuale' => 'nullable|integer|min:1|max:12',
'ora_inizio' => 'nullable|date_format:H:i',
'data_specifica' => 'nullable|date',
'durata_minuti' => 'nullable|integer|min:1',
'descrizione' => 'nullable|string',
'note' => 'nullable|string',
'is_incontro_gruppo' => 'nullable|boolean',
'is_incontro_gruppo' => 'nullable',
'gruppi' => 'nullable|array',
'gruppi.*' => 'exists:gruppi,id',
'responsabili' => 'nullable|array',
@@ -237,40 +239,168 @@ class EventoController extends Controller
foreach ($eventi as $evento) {
if ($evento->tipo_recorrenza === 'singolo' || $evento->tipo_recorrenza === null) {
if ($evento->data_specifica) {
$events[] = [
'id' => $evento->id,
'title' => $evento->nome_evento,
'start' => $evento->data_specifica->format('Y-m-d') . ($evento->ora_inizio ? 'T' . $evento->ora_inizio->format('H:i') : ''),
'url' => $baseUrl . '/eventi/' . $evento->id,
'backgroundColor' => $this->getEventoColor($evento),
'borderColor' => $this->getEventoColor($evento),
];
$events[] = $this->buildCalendarEvent($evento, $evento->data_specifica);
}
} elseif ($evento->tipo_recorrenza === 'settimanale' && $evento->giorno_settimana !== null) {
$startDate = \Carbon\Carbon::parse($start);
$endDate = \Carbon\Carbon::parse($end);
$current = $startDate->copy();
while ($current <= $endDate) {
$nextOccurrence = $current->copy()->next($evento->giorno_settimana);
if ($nextOccurrence >= $startDate && $nextOccurrence <= $endDate) {
$events[] = [
'id' => $evento->id . '_' . $nextOccurrence->format('Ymd'),
'title' => $evento->nome_evento,
'start' => $nextOccurrence->format('Y-m-d') . ($evento->ora_inizio ? 'T' . $evento->ora_inizio->format('H:i') : ''),
'url' => $baseUrl . '/eventi/' . $evento->id,
'backgroundColor' => $this->getEventoColor($evento),
'borderColor' => $this->getEventoColor($evento),
];
}
$current->addWeek();
}
$events = array_merge($events, $this->generateSettimanaleEvents($evento, $start, $end, $baseUrl));
} elseif ($evento->tipo_recorrenza === 'mensile' && $evento->occorrenza_mese) {
$events = array_merge($events, $this->generateMensileEvents($evento, $start, $end, $baseUrl));
} elseif ($evento->tipo_recorrenza === 'annuale' && $evento->mese_annuale) {
$events = array_merge($events, $this->generateAnnualeEvents($evento, $start, $end, $baseUrl));
} elseif ($evento->tipo_recorrenza === 'altro' && $evento->giorno_settimana !== null) {
$events = array_merge($events, $this->generateAltroEvents($evento, $start, $end, $baseUrl));
}
}
return response()->json($events);
}
protected function buildCalendarEvent(Evento $evento, $date, ?string $baseUrl = null): array
{
if ($date instanceof \Carbon\Carbon) {
$carbon = $date;
} elseif (is_string($date)) {
$carbon = \Carbon\Carbon::parse($date);
} else {
$carbon = $date;
}
$baseUrl = $baseUrl ?? request()->getSchemeAndHttpHost();
return [
'id' => $evento->id . '_' . $carbon->format('Ymd'),
'title' => $evento->nome_evento,
'start' => $carbon->format('Y-m-d') . ($evento->ora_inizio ? 'T' . $evento->ora_inizio->format('H:i') : ''),
'url' => $baseUrl . '/eventi/' . $evento->id,
'backgroundColor' => $this->getEventoColor($evento),
'borderColor' => $this->getEventoColor($evento),
];
}
protected function generateSettimanaleEvents(Evento $evento, $start, $end, $baseUrl): array
{
$startDate = \Carbon\Carbon::parse($start);
$endDate = \Carbon\Carbon::parse($end);
$events = [];
$current = $startDate->copy()->startOfWeek();
$targetDay = $evento->giorno_settimana;
while ($current <= $endDate) {
$dayOfWeek = (int) $current->format('w');
if ($dayOfWeek === $targetDay && $current >= $startDate && $current <= $endDate) {
$events[] = $this->buildCalendarEvent($evento, $current->copy(), $baseUrl);
}
$current->addDay();
}
return $events;
}
protected function generateMensileEvents(Evento $evento, $start, $end, $baseUrl): array
{
$startDate = \Carbon\Carbon::parse($start);
$endDate = \Carbon\Carbon::parse($end);
$events = [];
$parts = explode(',', $evento->occorrenza_mese);
if (count($parts) !== 2) {
return $events;
}
$occorrenza = (int) $parts[0];
$giornoSettimana = (int) $parts[1];
$mesiSelezionati = [];
if ($evento->mesi_recorrenza) {
$mesiSelezionati = array_map('intval', explode(',', $evento->mesi_recorrenza));
}
$currentMonth = $startDate->copy()->startOfMonth();
$endMonth = $endDate->copy()->startOfMonth();
while ($currentMonth <= $endMonth) {
$monthNumber = (int) $currentMonth->format('n');
if (empty($mesiSelezionati) || in_array($monthNumber, $mesiSelezionati)) {
$occurrenceDate = $this->findNthWeekdayOfMonth($currentMonth, $occorrenza, $giornoSettimana);
if ($occurrenceDate && $occurrenceDate >= $startDate && $occurrenceDate <= $endDate) {
$events[] = $this->buildCalendarEvent($evento, $occurrenceDate, $baseUrl);
}
}
$currentMonth->addMonth();
}
return $events;
}
protected function findNthWeekdayOfMonth(\Carbon\Carbon $month, int $occurrence, int $targetDayOfWeek): ?\Carbon\Carbon
{
$firstOfMonth = $month->copy()->startOfMonth();
$firstDayOfWeek = (int) $firstOfMonth->format('w');
$daysUntilTarget = ($targetDayOfWeek - $firstDayOfWeek + 7) % 7;
$firstOccurrence = $firstOfMonth->copy()->addDays($daysUntilTarget);
$targetDate = $firstOccurrence->copy()->addWeeks($occurrence - 1);
if ((int) $targetDate->format('n') !== (int) $month->format('n')) {
return null;
}
return $targetDate;
}
protected function generateAnnualeEvents(Evento $evento, $start, $end, $baseUrl): array
{
$startDate = \Carbon\Carbon::parse($start);
$endDate = \Carbon\Carbon::parse($end);
$events = [];
$year = $startDate->year;
$endYear = $endDate->year;
while ($year <= $endYear + 1) {
$day = $evento->giorno_mese ?? 1;
$eventDate = \Carbon\Carbon::create($year, $evento->mese_annuale, $day);
$daysInMonth = $eventDate->daysInMonth;
if ($evento->giorno_mese && $evento->giorno_mese > $daysInMonth) {
$eventDate = $eventDate->endOfMonth();
}
if ($eventDate >= $startDate && $eventDate <= $endDate) {
$events[] = $this->buildCalendarEvent($evento, $eventDate, $baseUrl);
}
$year++;
}
return $events;
}
protected function generateAltroEvents(Evento $evento, $start, $end, $baseUrl): array
{
$startDate = \Carbon\Carbon::parse($start);
$endDate = \Carbon\Carbon::parse($end);
$events = [];
$current = $startDate->copy()->startOfWeek();
$targetDay = $evento->giorno_settimana;
while ($current <= $endDate) {
$dayOfWeek = (int) $current->format('w');
if ($dayOfWeek === $targetDay && $current >= $startDate && $current <= $endDate) {
$events[] = $this->buildCalendarEvent($evento, $current->copy(), $baseUrl);
}
$current->addDay();
}
return $events;
}
private function getEventoColor(Evento $evento): string
{
$colors = [