Files
glastree/app/Models/Evento.php
T

297 lines
8.0 KiB
PHP
Raw Normal View History

2026-05-26 08:14:29 +02:00
<?php
namespace App\Models;
2026-06-09 11:02:01 +02:00
use App\Traits\HasTagsLight;
2026-05-26 08:14:29 +02:00
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
class Evento extends Model
{
2026-06-09 11:02:01 +02:00
use HasTagsLight;
2026-05-26 08:14:29 +02:00
protected $table = 'eventi';
protected $fillable = [
'tenant_id',
'nome_evento',
'descrizione_evento',
'tipo_evento',
'tipo_recorrenza',
'giorno_settimana',
'giorno_mese',
'occorrenza_mese',
'mesi_recorrenza',
'mese_annuale',
'ora_inizio',
'data_specifica',
'durata_minuti',
'descrizione',
'note',
'is_incontro_gruppo',
'luogo_indirizzo',
'luogo_url_maps',
2026-06-07 17:27:00 +02:00
'uid_esterno',
2026-05-26 08:14:29 +02:00
];
protected $casts = [
'data_specifica' => 'date',
'ora_inizio' => 'datetime:H:i',
'is_incontro_gruppo' => 'boolean',
];
2026-05-26 12:28:39 +02:00
public function tipologiaEvento(): BelongsTo
{
return $this->belongsTo(TipologiaEvento::class, 'tipo_evento', 'nome');
}
2026-05-26 08:14:29 +02:00
public function tenant(): BelongsTo
{
return $this->belongsTo(Tenant::class);
}
public function gruppi(): BelongsToMany
{
return $this->belongsToMany(Gruppo::class, 'eventi_gruppi')->withTimestamps();
}
public function responsabili(): BelongsToMany
{
return $this->belongsToMany(Individuo::class, 'eventi_responsabili')->withTimestamps();
}
public function documenti(): BelongsToMany
{
return $this->belongsToMany(Documento::class, 'eventi_documenti')->withTimestamps();
}
public function isRicorrente(): bool
{
return $this->tipo_recorrenza !== null && $this->tipo_recorrenza !== 'singolo';
}
public function isSingolo(): bool
{
return $this->tipo_recorrenza === 'singolo' || $this->tipo_recorrenza === null;
}
public function isGlobale(): bool
{
return $this->gruppi()->count() === 0;
}
public function isEventoRicorrenteSettimanale(): bool
{
return $this->tipo_recorrenza === 'settimanale';
}
public function isEventoRicorrenteMensile(): bool
{
return $this->tipo_recorrenza === 'mensile';
}
public function isEventoRicorrenteAnnuale(): bool
{
return $this->tipo_recorrenza === 'annuale';
}
public function isEventoAltro(): bool
{
return $this->tipo_recorrenza === 'altro';
}
public function isIncroGruppo(): bool
{
return $this->is_incontro_gruppo === true;
}
public function getGiornoSettimanaLabelAttribute(): string
{
$giorni = [
0 => 'Domenica',
1 => 'Lunedì',
2 => 'Martedì',
3 => 'Mercoledì',
4 => 'Giovedì',
5 => 'Venerdì',
6 => 'Sabato',
];
return $giorni[$this->giorno_settimana] ?? '-';
}
public function getGiornoSettimanaList(): array
{
return [
0 => ['value' => 0, 'label' => 'Domenica'],
1 => ['value' => 1, 'label' => 'Lunedì'],
2 => ['value' => 2, 'label' => 'Martedì'],
3 => ['value' => 3, 'label' => 'Mercoledì'],
4 => ['value' => 4, 'label' => 'Giovedì'],
5 => ['value' => 5, 'label' => 'Venerdì'],
6 => ['value' => 6, 'label' => 'Sabato'],
];
}
public function getOccorrenzeMensiliList(): array
{
$giorni = [
0 => 'Domenica',
1 => 'Lunedì',
2 => 'Martedì',
3 => 'Mercoledì',
4 => 'Giovedì',
5 => 'Venerdì',
6 => 'Sabato',
];
2026-05-26 08:14:29 +02:00
$list = [];
for ($occ = 1; $occ <= 4; $occ++) {
foreach ($giorni as $idx => $giorno) {
$value = $occ . ',' . $idx;
$label = $occ . '° ' . $giorno;
$list[] = ['value' => $value, 'label' => $label];
}
}
return $list;
}
public function getOccorrenzaMensileLabelAttribute(): string
{
if (!$this->occorrenza_mese) {
return '-';
}
$parts = explode(',', $this->occorrenza_mese);
if (count($parts) !== 2) {
return '-';
}
$occorrenza = (int) $parts[0];
$giorno = (int) $parts[1];
$giorni = [
0 => 'Domenica',
1 => 'Lunedì',
2 => 'Martedì',
3 => 'Mercoledì',
4 => 'Giovedì',
5 => 'Venerdì',
6 => 'Sabato',
];
2026-05-26 08:14:29 +02:00
return $occorrenza . '° ' . ($giorni[$giorno] ?? '-');
}
public function getMesiList(): array
{
return [
1 => ['value' => 1, 'label' => 'Gennaio'],
2 => ['value' => 2, 'label' => 'Febbraio'],
3 => ['value' => 3, 'label' => 'Marzo'],
4 => ['value' => 4, 'label' => 'Aprile'],
5 => ['value' => 5, 'label' => 'Maggio'],
6 => ['value' => 6, 'label' => 'Giugno'],
7 => ['value' => 7, 'label' => 'Luglio'],
8 => ['value' => 8, 'label' => 'Agosto'],
9 => ['value' => 9, 'label' => 'Settembre'],
10 => ['value' => 10, 'label' => 'Ottobre'],
11 => ['value' => 11, 'label' => 'Novembre'],
12 => ['value' => 12, 'label' => 'Dicembre'],
];
}
public function getMesiRecorrenzaLabelAttribute(): string
{
if (!$this->mesi_recorrenza) {
return '-';
}
$mesiSelezionati = explode(',', $this->mesi_recorrenza);
$mesiLabels = $this->getMesiList();
$labels = array_map(function ($mese) use ($mesiLabels) {
return $mesiLabels[$mese]['label'] ?? $mese;
}, $mesiSelezionati);
return implode(', ', $labels);
}
public function getMeseAnnualeLabelAttribute(): string
{
if (!$this->mese_annuale) {
return '-';
}
$mesiLabels = $this->getMesiList();
$label = $mesiLabels[$this->mese_annuale]['label'] ?? '-';
if ($this->giorno_mese) {
$label .= ' (giorno ' . $this->giorno_mese . ')';
}
return $label;
2026-05-26 08:14:29 +02:00
}
public function getPeriodicitaLabelAttribute(): string
{
$labels = [
'settimanale' => 'Settimanale',
'mensile' => 'Mensile',
'annuale' => 'Annuale',
'altro' => 'Altro',
'singolo' => 'Singolo',
];
return $labels[$this->tipo_recorrenza] ?? '-';
}
public function getInfoRicorrenzaAttribute(): string
{
if ($this->tipo_recorrenza === 'settimanale') {
return 'Ogni ' . $this->giorno_settimana_label;
}
if ($this->tipo_recorrenza === 'mensile') {
$info = [];
if ($this->occorrenza_mese) {
$info[] = $this->occorrenza_mensile_label;
}
if ($this->mesi_recorrenza) {
$info[] = '(' . $this->mesi_recorrenza_label . ')';
}
return implode(' ', $info) ?: '-';
}
if ($this->tipo_recorrenza === 'annuale') {
if ($this->mese_annuale) {
return $this->mese_annuale_label;
}
}
if ($this->tipo_recorrenza === 'altro') {
return $this->giorno_settimana_label ?? '-';
}
return '-';
}
public function getInfoIncroAttribute(): ?string
{
if (!$this->is_incontro_gruppo) {
return null;
}
$info = [];
if ($this->isRicorrente()) {
$info[] = $this->info_ricorrenza;
} else {
$info[] = $this->data_specifica?->format('d/m/Y') ?? '-';
}
if ($this->ora_inizio) {
$info[] = 'ore ' . $this->ora_inizio->format('H:i');
}
return implode(' ', $info);
}
}