, riscaldamento: array, straordinaria: array} */ public array $periodiEmissione = [ 'ordinaria' => [], 'riscaldamento' => [], 'straordinaria' => [], ]; public ?int $gestioneOrdinariaId = null; public ?int $gestioneSelezionataId = null; public ?string $gestioneSelezionataTipo = null; public ?string $gestioneDataInizio = null; public ?string $gestioneDataFine = null; /** @var array */ public array $gestioneMesi = []; public ?int $gestioneNumeroRate = null; public ?string $gestioneCadenza = null; /** @var array */ public array $checklistFineAnnoState = []; public static function canAccess(): bool { $user = Auth::user(); return $user instanceof User && $user->hasAnyRole(['super-admin', 'admin', 'amministratore', 'collaboratore']); } public function mount(): void { $user = Auth::user(); if (! $user instanceof User) { abort(403); } $requestedStabileId = request()->integer('stabile_id'); if ($requestedStabileId > 0) { StabileContext::setActiveStabileId($user, (int) $requestedStabileId); } $activeId = StabileContext::resolveActiveStabileId($user); if (! $activeId) { $this->stabile = null; return; } $this->stabile = StabileContext::accessibleStabili($user)->firstWhere('id', $activeId); if (! $this->stabile) { $this->stabile = null; return; } $this->stabile->load([ 'amministratore', 'datiBancari', 'palazzine', 'documentiCollegati', ]); $config = (array) ($this->stabile->configurazione_avanzata ?? []); $this->mostraRiscaldamento = (bool) ($config['mostra_riscaldamento'] ?? false); $this->gestioneOrdinariaId = isset($config['gestione_ordinaria_id']) ? (int) $config['gestione_ordinaria_id'] : null; $this->checklistFineAnnoState = is_array($config['checklist_fine_anno_state'] ?? null) ? $config['checklist_fine_anno_state'] : []; $periodi = (array) ($config['periodi_emissione'] ?? []); $this->periodiEmissione = [ 'ordinaria' => $this->normalizeMesi((array) ($periodi['ordinaria'] ?? [])), 'riscaldamento' => $this->normalizeMesi((array) ($periodi['riscaldamento'] ?? [])), 'straordinaria' => $this->normalizeMesi((array) ($periodi['straordinaria'] ?? [])), ]; $gestioneSelezionataId = request()->integer('gestione_id'); if ($gestioneSelezionataId > 0) { $this->gestioneSelezionataId = $gestioneSelezionataId; if (! $this->gestioneOrdinariaId) { $this->gestioneOrdinariaId = $gestioneSelezionataId; } } $this->loadGestioneSelezionata(); $tab = request()->query('tab'); if (is_string($tab) && $tab !== '') { $this->tab = $tab; } if (! array_key_exists($this->tab, $this->tabs())) { $this->tab = 'dati-generali'; } } /** * @return array */ public function tabs(): array { return [ 'dati-generali' => 'Dati generali', 'unita-immobiliari' => 'Unità / Locali tecnici', 'palazzine' => 'Palazzine', 'tabelle-millesimali' => 'Tabelle millesimali', 'rate-emesse' => 'Rate emesse', 'gestioni' => 'Gestioni', 'gestione-documentale' => 'Gestione documentale', 'documenti-collegati' => 'Documenti collegati', 'dati-bancari' => 'Banche e casse', ]; } public function tabView(): string { return match ($this->tab) { 'rate-emesse' => 'admin.stabili.tabs.rate-emesse', 'palazzine' => 'admin.stabili.tabs.palazzine', 'dati-bancari' => 'filament.pages.condomini.tabs.dati-bancari', 'tabelle-millesimali' => 'filament.pages.condomini.tabelle-millesimali-tab', 'gestioni' => 'admin.stabili.tabs.gestioni', 'unita-immobiliari' => 'admin.stabili.tabs.unita-immobiliari', 'gestione-documentale' => 'admin.stabili.tabs.gestione-documentale', 'documenti-collegati' => 'admin.stabili.tabs.documenti-collegati', default => 'admin.stabili.tabs.dati-generali', }; } public function toggleMostraRiscaldamento(): void { if (! $this->stabile) { return; } $config = (array) ($this->stabile->configurazione_avanzata ?? []); $value = ! (bool) ($config['mostra_riscaldamento'] ?? false); $config['mostra_riscaldamento'] = $value; $this->stabile->configurazione_avanzata = $config; $this->stabile->save(); $this->mostraRiscaldamento = $value; $this->dispatch('refresh-gestioni-stabile'); } public function savePeriodiEmissione(): void { if (! $this->stabile) { return; } $config = (array) ($this->stabile->configurazione_avanzata ?? []); $config['periodi_emissione'] = [ 'ordinaria' => $this->normalizeMesi((array) ($this->periodiEmissione['ordinaria'] ?? [])), 'riscaldamento' => $this->normalizeMesi((array) ($this->periodiEmissione['riscaldamento'] ?? [])), 'straordinaria' => $this->normalizeMesi((array) ($this->periodiEmissione['straordinaria'] ?? [])), ]; $this->stabile->configurazione_avanzata = $config; $this->stabile->save(); $this->periodiEmissione = $config['periodi_emissione']; Notification::make() ->title('Periodi emissione rate salvati') ->success() ->send(); } public function saveGestioneSelezionata(): void { if (! $this->stabile || ! $this->gestioneSelezionataId) { return; } $gestione = \App\Models\GestioneContabile::query()->find($this->gestioneSelezionataId); if (! $gestione) { return; } $gestione->data_inizio = $this->gestioneDataInizio ?: null; $gestione->data_fine = $this->gestioneDataFine ?: null; $mesi = $this->normalizeMesi($this->gestioneMesi); $field = match ($gestione->tipo_gestione) { 'ordinaria' => 'mesi_rate_ordinaria', 'riscaldamento' => 'mesi_rate_riscaldamento', 'straordinaria' => 'mesi_rate_straordinaria', default => 'mesi_rate_ordinaria', }; $gestione->{$field} = $mesi; if ($gestione->tipo_gestione === 'straordinaria') { $piano = (array) ($gestione->piano_straordinario ?? []); $piano['numero_rate'] = $this->gestioneNumeroRate; $piano['cadenza'] = $this->gestioneCadenza; $gestione->piano_straordinario = $piano; } $gestione->save(); Notification::make() ->title('Gestione aggiornata') ->success() ->send(); } public function saveChecklistFineAnno(): void { if (! $this->stabile) { return; } $config = (array) ($this->stabile->configurazione_avanzata ?? []); $config['gestione_ordinaria_id'] = $this->gestioneOrdinariaId; $config['checklist_fine_anno_state'] = $this->checklistFineAnnoState; $this->stabile->configurazione_avanzata = $config; $this->stabile->save(); Notification::make() ->title('Checklist salvata') ->success() ->send(); } /** * Carica la gestione selezionata (o quella ordinaria di riferimento) * e popola i campi di editing della tab periodi. */ private function loadGestioneSelezionata(): void { $gestioneId = $this->gestioneSelezionataId ?? $this->gestioneOrdinariaId; if (! $gestioneId) { return; } $gestione = \App\Models\GestioneContabile::query()->find($gestioneId); if (! $gestione) { return; } $this->gestioneSelezionataId = $gestione->id; $this->gestioneSelezionataTipo = $gestione->tipo_gestione; $this->gestioneDataInizio = $gestione->data_inizio?->format('Y-m-d'); $this->gestioneDataFine = $gestione->data_fine?->format('Y-m-d'); $mesi = match ($gestione->tipo_gestione) { 'ordinaria' => (array) ($gestione->mesi_rate_ordinaria ?? []), 'riscaldamento' => (array) ($gestione->mesi_rate_riscaldamento ?? []), 'straordinaria' => (array) ($gestione->mesi_rate_straordinaria ?? []), default => [], }; $this->gestioneMesi = $this->normalizeMesi($mesi); $piano = (array) ($gestione->piano_straordinario ?? []); $this->gestioneNumeroRate = isset($piano['numero_rate']) ? (int) $piano['numero_rate'] : null; $this->gestioneCadenza = $piano['cadenza'] ?? null; } /** @param array $mesi */ private function normalizeMesi(array $mesi): array { $mesi = array_values(array_unique(array_map('intval', $mesi))); sort($mesi); return $mesi; } }