netgescon-day0/app/Filament/Pages/Condomini/StabilePage.php

311 lines
10 KiB
PHP

<?php
namespace App\Filament\Pages\Condomini;
use App\Models\Stabile as StabileModel;
use App\Models\User;
use App\Support\StabileContext;
use BackedEnum;
use Filament\Notifications\Notification;
use Filament\Pages\Page;
use Illuminate\Support\Facades\Auth;
use UnitEnum;
class StabilePage extends Page
{
protected static ?string $navigationLabel = 'Stabile';
protected static ?string $title = 'Stabile';
protected static BackedEnum|string|null $navigationIcon = 'heroicon-o-building-office-2';
protected static UnitEnum|string|null $navigationGroup = 'Stabile';
protected static ?int $navigationSort = 20;
protected static ?string $slug = 'condomini/stabile';
protected string $view = 'filament.pages.condomini.stabile';
public ?StabileModel $stabile = null;
public string $tab = 'dati-generali';
public bool $mostraRiscaldamento = false;
/** @var array{ordinaria: array<int>, riscaldamento: array<int>, straordinaria: array<int>} */
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<int> */
public array $gestioneMesi = [];
public ?int $gestioneNumeroRate = null;
public ?string $gestioneCadenza = null;
/** @var array<int, bool> */
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<string,string>
*/
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<int, int|string> $mesi */
private function normalizeMesi(array $mesi): array
{
$mesi = array_values(array_unique(array_map('intval', $mesi)));
sort($mesi);
return $mesi;
}
}