311 lines
10 KiB
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;
|
|
}
|
|
}
|