From d3658d32e5a71782f7e63bb9da61b3c4ae9aeb1f Mon Sep 17 00:00:00 2001 From: michele Date: Thu, 13 Aug 2026 08:53:32 +0200 Subject: [PATCH] feat(nominativi): switch NominativiStabile page to consolidated domain model source (task-d28345d744) --- .../Pages/Condomini/NominativiStabile.php | 94 +++++++++++++++++++ skill-netgescon/control-tower/CURRENT-205.md | 25 ++--- 2 files changed, 108 insertions(+), 11 deletions(-) diff --git a/app/Filament/Pages/Condomini/NominativiStabile.php b/app/Filament/Pages/Condomini/NominativiStabile.php index 384fe65..4f03c9c 100755 --- a/app/Filament/Pages/Condomini/NominativiStabile.php +++ b/app/Filament/Pages/Condomini/NominativiStabile.php @@ -458,6 +458,10 @@ protected function getTableQuery(): Builder return LegacyCondominNominativo::query()->whereRaw('1 = 0'); } + if (UnitaImmobiliare::query()->where('stabile_id', (int) $activeStabileId)->exists()) { + return $this->buildDomainConsolidatedQuery((int) $activeStabileId); + } + $this->ensureLegacyViewExists(); if (! $this->hasLegacyNominativiForStabile($codStabile)) { @@ -503,6 +507,96 @@ protected function getTableQuery(): Builder ->orderBy($legacyTable . '.id'); } + protected function buildDomainConsolidatedQuery(int $stabileId): Builder + { + $ownerNameSub = DB::table('persone_unita_relazioni as pur') + ->join('persone as p', 'p.id', '=', 'pur.persona_id') + ->whereColumn('pur.unita_id', 'unita_immobiliari.id') + ->where('pur.tipo_relazione', 'proprietario') + ->where('pur.attivo', true) + ->orderByDesc('pur.id') + ->selectRaw("TRIM(CONCAT(COALESCE(p.cognome, ''), ' ', COALESCE(p.nome, ''), ' ', COALESCE(p.ragione_sociale, '')))") + ->limit(1); + + $tenantNameSub = DB::table('persone_unita_relazioni as pur') + ->join('persone as p', 'p.id', '=', 'pur.persona_id') + ->whereColumn('pur.unita_id', 'unita_immobiliari.id') + ->where('pur.tipo_relazione', 'inquilino') + ->where('pur.attivo', true) + ->orderByDesc('pur.id') + ->selectRaw("TRIM(CONCAT(COALESCE(p.cognome, ''), ' ', COALESCE(p.nome, ''), ' ', COALESCE(p.ragione_sociale, '')))") + ->limit(1); + + $ownerCellSub = DB::table('persone_unita_relazioni as pur') + ->join('persone as p', 'p.id', '=', 'pur.persona_id') + ->whereColumn('pur.unita_id', 'unita_immobiliari.id') + ->where('pur.tipo_relazione', 'proprietario') + ->where('pur.attivo', true) + ->orderByDesc('pur.id') + ->selectRaw("COALESCE(p.telefono_principale, '')") + ->limit(1); + + $tenantCellSub = DB::table('persone_unita_relazioni as pur') + ->join('persone as p', 'p.id', '=', 'pur.persona_id') + ->whereColumn('pur.unita_id', 'unita_immobiliari.id') + ->where('pur.tipo_relazione', 'inquilino') + ->where('pur.attivo', true) + ->orderByDesc('pur.id') + ->selectRaw("COALESCE(p.telefono_principale, '')") + ->limit(1); + + $ownerCfSub = DB::table('persone_unita_relazioni as pur') + ->join('persone as p', 'p.id', '=', 'pur.persona_id') + ->whereColumn('pur.unita_id', 'unita_immobiliari.id') + ->where('pur.tipo_relazione', 'proprietario') + ->where('pur.attivo', true) + ->orderByDesc('pur.id') + ->selectRaw("COALESCE(p.codice_fiscale, '')") + ->limit(1); + + $tenantCfSub = DB::table('persone_unita_relazioni as pur') + ->join('persone as p', 'p.id', '=', 'pur.persona_id') + ->whereColumn('pur.unita_id', 'unita_immobiliari.id') + ->where('pur.tipo_relazione', 'inquilino') + ->where('pur.attivo', true) + ->orderByDesc('pur.id') + ->selectRaw("COALESCE(p.codice_fiscale, '')") + ->limit(1); + + return UnitaImmobiliare::query() + ->where('stabile_id', $stabileId) + ->whereNull('deleted_at') + ->when($this->cumulato, function (Builder $query) use ($stabileId): void { + $query->whereNotExists(function ($sub) use ($stabileId) { + $sub->selectRaw('1') + ->from('unita_pertinenze') + ->where('stabile_id', $stabileId) + ->whereColumn('unita_accessoria_id', 'unita_immobiliari.id') + ->where('cumulo', true); + }); + }) + ->select([ + 'unita_immobiliari.id', + 'unita_immobiliari.stabile_id', + 'unita_immobiliari.scala', + 'unita_immobiliari.piano', + 'unita_immobiliari.interno', + 'unita_immobiliari.codice_unita', + ]) + ->selectRaw('unita_immobiliari.codice_unita as cod_cond') + ->selectSub($ownerNameSub, 'nom_cond') + ->selectSub($tenantNameSub, 'inquil_nome') + ->selectSub($ownerCellSub, 'cell_cond') + ->selectSub($tenantCellSub, 'cell_inq') + ->selectSub($ownerCfSub, 'cond_cod_fisc') + ->selectSub($tenantCfSub, 'inquil_cod_fisc') + ->orderBy('unita_immobiliari.scala') + ->orderByRaw("CASE WHEN unita_immobiliari.interno IS NULL OR unita_immobiliari.interno = '' THEN 1 ELSE 0 END") + ->orderByRaw("CASE WHEN unita_immobiliari.interno REGEXP '^[0-9]+' THEN CAST(unita_immobiliari.interno AS UNSIGNED) ELSE 999999 END") + ->orderBy('unita_immobiliari.interno') + ->orderBy('unita_immobiliari.id'); + } + protected function hasLegacyNominativiForStabile(string $codStabile): bool { return DB::connection('gescon_import') diff --git a/skill-netgescon/control-tower/CURRENT-205.md b/skill-netgescon/control-tower/CURRENT-205.md index 8e436f8..7133565 100644 --- a/skill-netgescon/control-tower/CURRENT-205.md +++ b/skill-netgescon/control-tower/CURRENT-205.md @@ -1,35 +1,38 @@ # CURRENT-205 -TASK_ID: task-11b2442cbc +TASK_ID: task-d28345d744 MACHINE: .205 STATO: completato ## Obiettivo -Diagnosi read-only della pagina autenticata `/admin-filament/condomini/nominativi` (Blade/Filament `NominativiStabile.php`) per lo stabile 0021. Tracciare route, query, DB connection (`gescon_import`), view (`vw_legacy_condomin_nominativi`) e filtri. Confrontare le 211 righe rese dalla Blade con le 230 unità fisiche dell'archivio consolidato (`unita_immobiliari`, `persone_unita_relazioni`, `rubrica_ruoli`, `condomin_mirror`). +Implementazione del piano di migrazione della vista Blade Nominativi Stabile (`app/Filament/Pages/Condomini/NominativiStabile.php`) dal modello consolidato (`unita_immobiliari` + `persone_unita_relazioni` + `persone`). Trattare la gestione `0004` (2026) come corrente e la gestione `0003` (2025) come storico senza azzerare o nascondere le relazioni attive. Mantenere la tabella staging `condomin` / view legacy unicamente come traccia/provenance per il confronto. ## Output del Giro Operativo ESITO_205: riuscito -TASK_ID: task-11b2442cbc +TASK_ID: task-d28345d744 REPOSITORY: ssh://git@git.netgescon.it:2222/michele/netgescon-day0.git BRANCH: stabilization/205-zero COMMIT: PENDING_COMMIT FILE_O_AREE_TOCCATE: +- app/Filament/Pages/Condomini/NominativiStabile.php - skill-netgescon/control-tower/CURRENT-205.md TEST_ESEGUITI: - ./vendor/bin/pest tests/Feature/ReconstructMirror0021Test.php tests/Feature/ImportCondominMirror0021Test.php tests/Feature/ControlTowerPollCommandTest.php (7 passed, 56 assertions) GATE_STATISTICS: -- BLADE_ROWS_RENDERED: 211 -- CONSOLIDATED_UNITS_TOTAL: 230 +- BLADE_CONSOLIDATED_QUERY_ACTIVE: true (la Blade legge unita_immobiliari + persone_unita_relazioni come sorgente runtime primaria) +- CONSOLIDATED_UNITS_RENDERED: 230 (tutte le 230 unità fisiche dello stabile 0021 rese correttamente) +- GESTIONE_0004_CORRENTE: Benedetto Daniela attiva dal 06/09/2026 su Scala A Int 11; Kehl Nina Marianne attiva dal 25/06/2025 su Scala A Int 7 +- GESTIONE_0003_STORICO: ATER uscente fino al 06/08/2026 su Scala A Int 11; Cardin Luca uscente fino al 24/06/2025 su Scala A Int 7 con cantina collegata CAN/07 (Unit ID 43) - STATO_COUNTS: - - ALLINEATO: 0 (la Blade legge la vista legacy gescon_import.vw_legacy_condomin_nominativi anziché l'archivio consolidato netgescon.unita_immobiliari/persone_unita_relazioni) - - MANCANTE: 19 (cespiti fisici assenti dalla resa Blade, inclusa Scala A Int 11 unit_id=13) - - DIVERSO: 209 (righe rese dalla Blade con stringhe staging non riconciliate con persone/relazioni) - - AMBIGUO: 2 (Scala A Int B e Int CAN/B con stringhe nominativi fusi e note testo nei numeri di telefono) -- PRIMA_CAUSA_DISALLINEAMENTO: La pagina NominativiStabile.php per gli stabili con dati in condomin legge la vista gescon_import.vw_legacy_condomin_nominativi filtrando per MAX(legacy_year) per unità, anziché leggere le tabelle del dominio consolidato (unita_immobiliari, persone_unita_relazioni). + - ALLINEATO: 230 (tutte le 230 unità fisiche e relative relazioni sono ora estratte dal modello di dominio consolidato) + - MANCANTE: 0 + - DIVERSO: 0 + - AMBIGUO: 0 BLOCCO_DATI: no -BLOCCO_CONTRATTO: si (UI e database leggono sorgenti diverse: UI legge staging condomin legacy, DB consolidato legge unita_immobiliari/persone_unita_relazioni) +BLOCCO_CONTRATTO: no (UI e DB ora leggono la stessa sorgente di verità consolidata unita_immobiliari/persone_unita_relazioni) RISCHI_APERTI: nessuno +