12 KiB
12 KiB
🧭 Piano Operativo Import Unità Immobiliari (Gescon → NetGescon)
Versione: 0.1 – 03 Agosto 2025
Ambito: Modulo Admin → Gescon Import → Tab Unità (Laravel)
🎯 Obiettivi
- Acquisire le unità da
singolo_anno.mdb(tabellacondomin) preservando i riferimentiSCALA/INTERNO/SUBe le informazioni d'uso. - Popolare almeno tre archivi NetGescon con dati coerenti e deduplicati:
unita_immobiliarisoggetti/rubrica_universaleproprieta+rubrica_ruoli
- Classificare pertinenze e locali tecnici per gestire cumuli, manutentori e futuri contratti/chiavi.
- Preparare l'aggancio a rate/pagamenti garantendo codici stabili, millesimi e diritti aggiornati.
🗂️ Fonti Legacy & Metadati
| Fonte | Percorso | Note operative |
|---|---|---|
singolo_anno.mdb → condomin |
/mnt/gescon-archives/gescon/<codice>/singolo_anno.mdb |
Accesso via mdb-tables/mdb-export. Il servizio LegacyArchiveService::unita() estrae headers dinamici, preview righe e summary scale/occupanti. |
Staging SQL (gescon_import.condomin) |
Connessione configurabile (gescon_import, fallback gescon_import_<anno>) |
Replica della tabella per lavorare senza MDB. Le colonne vengono lette tramite Schema::connection(...)->getColumnListing. |
Dataset JSON (migration_datasets / migration_records) |
chiave unita |
Utilizzato come fallback per test oppure quando MDB/staging non è disponibile. |
| Summary calcolati | LegacyArchiveService → summary.scale, summary.people |
Liste di scale, interni presenti, proprietari e inquilini dedotti dalle colonne nominative. Utili per UI mapping e per generare ruoli. |
Headers principali di condomin da considerare (case insensitive):
cod_stabile, cod_cond, scala, piano, interno, sub, cognome, nome, codice_fiscale, telefono, email, indirizzo_corrispondenza, millesimi_*, inquilino, proprietario, note, cognome_inquilino, nome_inquilino, cf_inquilino.
🧱 Tabelle Target & Responsabilità
| Tabella | Scopo | Campi chiave | Dipendenze |
|---|---|---|---|
unita_immobiliari |
Master unità (abitazioni, pertinenze, locali tecnici) | stabile_id, codice_unita, scala, interno, piano, tipo_unita, millesimi_*, stato_occupazione, meta |
richiede stabili.id |
soggetti |
Albero proprietari/occupanti “legacy-friendly” usato da contabilità | codice_fiscale, email, codice_univoco, tipo |
Deducibile direttamente da condomin |
rubrica_universale |
Anagrafica unica NetGescon (contatti, manutentori, banche) | codice_univoco, categoria, tipo_contatto, pec, telefono |
Sincronizzata con soggetti (1:1 logico) |
proprieta |
Relazione giuridica unità ↔ soggetto | unita_immobiliare_id, soggetto_id, tipo_diritto, percentuale_possesso, data_inizio/fine |
richiede unità + soggetti |
rubrica_ruoli |
Ruoli dinamici (proprietario, inquilino, manutentore, tecnico locale) con periodo e preferenze | rubrica_id, ruolo_standard, unita_immobiliare_id, stabile_id, data_inizio/fine, meta |
richiede rubrica |
unita_pertinenze (opzionale ma supportato) |
legame unità principale ↔ pertinenza (cantina, box, locale tecnico) | unita_principale_id, unita_accessoria_id, tipo, cumulo |
richiede unità distinte |
🔁 Matrici di Mapping
1. Identità & Posizionamento
Target (unita_immobiliari) |
Source condomin |
Regole/Note |
|---|---|---|
stabile_id |
input utente / lookup stabili (codice_stabile, denominazione) |
obbligatorio dal tab principale; fallback mapping.stabile_id. |
codice_unita |
cod_stabile, scala, interno |
formato STAB-SCALA-INT. Zero padding opzionale. Per pertinenze usa il codice normalizzato (es. LT03). |
palazzina, scala |
scala |
normalizzare: uppercase, fallback A. UI deve mostrare lista scale da summary.scale. |
piano |
piano |
convertire T/PT/R→0, S/PS/-1→-1, numeri interi altrove. |
interno |
interno |
trim, uppercase, gestire multi valori (es. 1/A). |
subalterno |
sub oppure interno |
se vuoto, mantenere interno. |
denominazione |
cognome + nome |
fallback "Scala {scala} Interno {interno}". |
posizione_dettagliata |
composizione palazzina / scala / piano / interno |
utile per UI senza query aggiuntive. |
2. Dati catastali & superfici
| Target | Source | Regole |
|---|---|---|
foglio, particella, subalterno |
foglio, particella, sub |
normalizzare numeri, rimuovere leading zeros superflui ma conservarli in meta_legacy. |
categoria_catastale, classe, consistenza, rendita_catastale |
categoria, classe, cons, rendita (se presenti) |
tipicamente presenti nei dataset condomin. |
superficie_commerciale, superficie_calpestabile |
sup_com, sup_calp |
unità m². Validare range 0-10.000. |
millesimi_generali, millesimi_riscaldamento, millesimi_acqua, millesimi_ascensore, millesimi_scale |
millesimi_generali, mill_risc, mill_acqua, mill_asc, mill_scale |
usare decimal(8,3); se >1000 loggare warning. |
3. Caratteristiche, impianti, autorizzazioni
| Target | Legacy | Note |
|---|---|---|
tipo_unita |
derived | abitazione default. Pattern CAN, BOX/GAR, PA, SOF, LT ⇒ cantina, box, posto_auto, soffitta, locale_tecnico. |
utilizzo_attuale |
uso, destinazione |
mapping statico (es. AB→residenziale, U→ufficio). |
stato_conservazione |
stato, cons, flag qualitativo |
mappare O/B/D/C → ottimo/buono/discreto/scarso. |
stato_occupazione |
flag proprietario, inquilino, libero |
proprietario=1 ⇒ occupata_proprietario; inquilino=1 ⇒ occupata_inquilino; altrimenti libera. |
riscaldamento, ha_climatizzazione, ha_impianto_gas |
tipo_risc, clima, gas |
booleane/in enum. |
ha_cambio_destinazione_uso, data_scadenza_autorizzazioni, note_autorizzazioni |
cambio_uso, scad_aut, note |
Fieldset per future audit. |
valore_commerciale_stimato, canone_locazione_mensile |
valore, canone |
Numeric, usati per analisi rate. |
4. Metadati & Audit
meta_legacy(JSON) con:cod_cond,id_record,path_archivio,raw_columnsper tracciabilità.created_by/updated_by: impostare all'utente che effettua il mapping/import.attiva,unita_demo: flag gestiti dall'import (+ eventuale override UI).
👥 Anagrafica Unica & Ruoli Occupanti
Soggetti (soggetti)
| Target campo | Source | Regole |
|---|---|---|
nome, cognome, codice_fiscale, email, telefono, indirizzo |
cognome, nome, codice_fiscale, email, telefono, indirizzo_corrispondenza |
Normalizzare CF (uppercase, 16 char). Vuoti ⇒ null. |
tipo |
flag proprietario / inquilino |
proprietario=1 ⇒ proprietario, inquilino=1 ⇒ inquilino, fallback proprietario. |
codice_univoco |
generato | generateStableCondKey('S', cod_stabile, nome_norm) con retry. |
Rubrica Universale (rubrica_universale)
- Sincronizzare 1:1 con
soggettiusandocodice_univococome ponte. categoria:condominoper proprietari,occupanteper inquilini,locale_tecnicoper manutentori (vedi sezione dedicata).tipo_contatto:persona_fisicase valorizzatinome/cognome, altrimentipersona_giuridica.- Dati aggiuntivi:
pec,cellulare,note(danoteonote_inquilino).
Ruoli (rubrica_ruoli)
| Campo | Valore | Fonte |
|---|---|---|
ruolo_standard |
proprietario, occupante, referente_locale_tecnico, manutentore_locale_tecnico |
Dalla casistica: proprietario/inquilino, più voci speciali per locali tecnici. |
unita_immobiliare_id |
lookup da codice_unita |
Necessario per ruoli legati alla singola unità. |
stabile_id |
stabile.id usato nel mapping |
Permette vista aggregata condominio. |
data_inizio / data_fine |
se disponibili in condomin (data_inizio_locazione, data_fine_locazione) |
Altrimenti null e gestito successivamente. |
meta |
JSON con legacy_cod_cond, scala, interno, fonte |
per audit e dedup futuro. |
🗝️ Pertinenze & Locali Tecnici
- Classificazione automatica sul campo
interno(case insensitive, spazi normalizzati):CAN\d+→cantinaBOX,GAR,GARAGE→boxPA,POSTO AUTO→posto_autoSOF,SOFFITTA,SOLAIO→soffittaLT,LOCALE TECNICO→locale_tecnico
- Codice unità mantiene il prefisso (
BOX01,LT03) per distinguere dai civici. unita_pertinenze: dopo l'inserimento, collegare la prima unità principale della stessa scala comeunita_principale_id, marcandocumulo=true. In futuro l'UI dovrà consentire la scelta manuale.- Manutentori: per
locale_tecnicovalorizzare ancherubrica_ruoliconruolo_standard = manutentore_locale_tecnicoquando nel dataset sono presenti riferimenti (es. colonnetecnico,manutentore). Nell'immediato, salvare il nominativo raw inmeta_legacyper completamenti successivi.
✅ Validazioni & Normalizzazioni
- SCALA / INTERNO obbligatori: se mancanti, bloccare salvataggio UI e richiedere input manuale.
- Codici fiscali: validare lunghezza (16/11/partita IVA). Se non validi, flaggare in
meta.warnings. - Millesimi: totale per scala deve avvicinarsi a 1000 (±5). In caso contrario, riportare nel riepilogo import.
- Duplicati unità:
codice_unitadeve essere unico; UI deve suggerire un merge se già presente. - Dedup soggetti: ordine preferenza
codice_fiscale→email→nome+cognome. Le funzionifindExistingSoggettoededupSoggettiBygià disponibili vanno riutilizzate nel controller. - Ruoli sovrapposti: prima di inserire in
rubrica_ruolicontrollare se esiste un record attivo con stessorubrica_id+unita_immobiliare_id+ruolo_standard. Aggiornare date invece di duplicare. - Locali tecnici senza manutentore: marcare
stato_occupazione = 'locale_tecnico'e impostarenote"Manutentore da assegnare" per facilitarne l'individuazione post-import.
🚀 Prossimi Passi Implementativi
-
UI Mapping:
- Riutilizzare il pattern "schede stabili" per mostrare preview condomin con badge Scala/Interno, includendo summary persone.
- Esporre selettori per ognuna delle categorie sopra (identità, catastale, superfici, ruoli) con default suggeriti.
-
Controller/Service:
- Estendere
GesconImportController@mappingSavecon sezioneunità, salvando ingescon_import_mappings.meta['unita']il pairingtarget_field→legacy_key. - Aggiungere action
executeUnitImport()che orchestriLegacyArchiveService,ImportGesconFullPipeline::stepUnita/stepSoggetti/stepDirittifiltrati per stabile/scala.
- Estendere
-
Test & Verifica:
- Dataset di prova:
condominpercod_stabile = 000123. Verificare totale righe importate = righe legate allo stabile. - Validare che ogni proprietario compaia in
rubrica_ruoliconruolo_standard = proprietarioe che eventualiinquiliniaggiungano ruoli e diritti di tipolocazione.
- Dataset di prova:
-
Estensioni future:
- Collegare
locale_tecnicoachiavi_stabili(tipologialocali_tecnici). - Integrare
dett_tabper popolaredettaglio_millesimicon scala-specific translations. - Pre-calcolare
responsabile_pagamentiper pipeline rate/bollette.
- Collegare
Con questo blueprint il team può implementare la nuova esperienza di mapping/import delle unità immobiliari mantenendo coerenza con l'anagrafica unica e preparando i dati per occupanti, locali tecnici e rate/pagamenti.