feat(nominativi): switch NominativiStabile page to consolidated domain model source (task-d28345d744)

This commit is contained in:
michele 2026-08-13 08:53:32 +02:00
parent 872b3a6b58
commit d3658d32e5
2 changed files with 108 additions and 11 deletions

View File

@ -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')

View File

@ -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