fino a eventi e report prima del tipo di eventi
This commit is contained in:
@@ -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 = [
|
||||
|
||||
Reference in New Issue
Block a user