netgescon-day0/docs/000-FILAMENT/02-ARCHIVI-E-IMPORT.md

344 lines
16 KiB
Markdown
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Archivi legacy e import (GESCON)
## Archivi da prendere
### 1) Stabili.mdb
Percorso tipico:
- /mnt/gescon-archives/gescon/dbc/Stabili.mdb
Contiene:
- Anagrafica stabili
- Dati bancari/postali
- Dati catasto
- Scadenze rate ordinarie/riscaldamento
- Parametri FE e PEC
### 2) Fornitori.mdb
Percorso tipico:
- /mnt/gescon-archives/gescon/dbc/Fornitori.mdb
Contiene:
- Anagrafica fornitori
### 3) singolo_anno.mdb
Percorso tipico:
- /mnt/gescon-archives/gescon/<cod_stabile>/<anno>/singolo_anno.mdb
Contiene:
- Unità immobiliari + nominativi (condomin)
- Comproprietari
- Tabelle millesimali (legacy: `tabelle`)
- Voci spesa
- Dett_tab
- Incassi
- Operazioni
- Straordinarie
- Preventivi straordinari (tabella `prevent_straordinari`)
- dett_pers (addebiti personalizzati, I05)
- Frazionamenti (fraz_gen / fraz_dett, Z01/Z02)
- tabella `Anagr_casse` con i codici legacy da preservare per incassi e operazioni
### 4) generale_stabile.mdb
Percorso tipico:
- /mnt/gescon-archives/gescon/<cod_stabile>/generale_stabile.mdb
Contiene:
- anni
- emes_gen / emes_det
- Fatture legacy
- Dati trasversali
## Regola fondamentale anni
Nel legacy i dati sono **replicati per ogni anno**. Per ricostruire correttamente:
- Importare tutte le annualità per ogni stabile.
- Consolidare in staging con campi legacy_year/legacy_period/legacy_file.
## Staging DB (anti-duplicazione)
- DB: gescon_import
- È la sorgente primaria per evitare doppie importazioni.
- Tabelle aggiunte: `tabelle_millesimali`, `dett_pers`, `fraz_gen`, `fraz_dett`, `mdb_fornitori`
- Tabelle straordinarie: `straordinarie`, `prevent_straordinari`
- Per `gescon:import-full --solo=millesimi|voci` il filtro operativo corretto deve essere sempre su `cod_stabile` + `legacy_year`; in caso di righe staging duplicate dello stesso snapshot, l'import deve deduplicare prima di scrivere nel dominio.
## Componenti di import (codice)
### UI Filament
- app/Filament/Pages/Gescon/ImportazioneArchivi.php
- Modalità Linux: path diretto
- Modalità Windows: upload file/zip + estrazione
- stessa blade per creare o aggiornare lo stabile selezionato, senza modal
- sezione inline per banca principale e prima gestione contabile
- al salvataggio/import normalizza la parte finanziaria usando i codici reali di `Anagr_casse`
- la cassa locale resta solo `CON`; i conti bancari vengono salvati in `dati_bancari` con `legacy_cod_cassa` reale (es. `CCB`)
### Comandi staging
- gescon:load-mdb
- import:gescon-mdb
- import:gescon-fornitori
- import:gescon-fatture-legacy
### Import movimenti banca (Intesa XLSX)
- Parser XLSX con descrizione estesa (colonna F)
- Salva `descrizione_estesa` + `match_data` + flag `da_confermare`
- Duplicati gestiti con `row_hash`
## Import banca per istituto (regole)
### Intesa (XLSX)
- Layout rilevato: A Data, B Valuta, C Descrizione, D Avere, E Dare, F Descrizione estesa
- Import in Casse/Banche → Movimenti
### Intesa (CSV)
- Supporto CSV con parser dedicato
### Unicredit (WRI)
- Import con parser WRI
## Spese bancarie (parole chiave iniziali)
- commissione / commissioni
- spese tenuta conto / canone
- imposta di bollo
- competenze
- spese invio / notifiche
- interessi debitori
- costo bonifico
Nota: lelenco va aggiornato per ogni banca con termini specifici presenti negli estratti.
### Pipeline dominio
- gescon:import-full
- gescon:import-gestioni
## Flusso operativo raccomandato dalla stessa blade
Per i nuovi stabili importati da GESCON il flusso raccomandato e:
1. caricare l elenco stabili da `Stabili.mdb`;
2. selezionare lo stabile e usare `Carica setup inline` per leggere anagrafica, banca e mesi rate;
3. correggere direttamente nella stessa schermata i campi dello stabile e il setup della prima gestione;
4. usare `Salva stabile inline` per creare o aggiornare lo stabile locale senza duplicarlo;
5. eseguire `Importa dati selezionati` oppure `Import + allineamento`;
6. se serve, rifinire la prima gestione con `Salva gestione inline`.
Risultato atteso:
- una sola cassa locale `CON`;
- conto bancario reale del condominio presente in `dati_bancari` con `is_nostro_conto=true`;
- `legacy_cod_cassa` del conto bancario allineato a `Anagr_casse` del `singolo_anno.mdb`;
- prima gestione ordinaria creata o aggiornata dalla stessa blade;
- mesi emissione rate letti da `Stabili.mdb` (`ORD_RATA_x`, `RIS_RATA_x`) e memorizzati gestione per gestione;
- nessuna creazione ripetuta dello stesso stabile a ogni passaggio.
## Regole sorgente senza fallback
Per il ramo import stabile/gestioni usare queste sorgenti come riferimento:
- codici cassa e banca: `Anagr_casse` dentro ogni `singolo_anno.mdb`;
- dati descrittivi e IBAN banca principale: `Stabili.mdb` / `stabili` dominio gia sincronizzato;
- mesi rate ordinaria e riscaldamento: `Stabili.mdb` tramite campi `ORD_RATA_x` e `RIS_RATA_x`;
- anni gestione: tabella `anni` di `generale_stabile.mdb`; se l archivio non la espone correttamente, usare il dato anno ricavabile dall archivio reale dello stesso stabile, ma non inventare anni sintetici.
Da evitare:
- seeding automatico di `CDL`;
- codici banca sintetici tipo `BANCA-PRINCIPALE`;
- mesi rate dedotti da fallback quando il master `Stabili.mdb` e disponibile.
## Verifica base confermata su stabile 0026
Validazione eseguita sulla base legacy:
- `condomin = 23`;
- `Comproprietari = 0` nel file `0026/0001/singolo_anno.mdb`;
- `tabelle = 8`;
- `dett_tab = 171`;
- `voc_spe = 46`;
- `Fraz_gen = 4`;
- `fraz_dett = 11`.
Esito dominio importato:
- `unita_immobiliari = 23`;
- `proprieta = 23`;
- `locazioni = 4`;
- `soggetti distinti collegati = 21`.
Nota importante sui soggetti:
- i `23` proprietari attesi sono `23` rapporti di proprieta, non `23` persone uniche;
- nel legacy di `0026` i proprietari distinti sono `18`, gli inquilini distinti sono `4`, con almeno una anagrafica coincidente tra i due insiemi;
- il risultato `21` soggetti distinti in dominio e quindi coerente con deduplica reale e non con una perdita di record.
Esito millesimi e voci:
- `tabelle_millesimali = 8`;
- `dettaglio_millesimi = 92`;
- `dettaglio_importi_tabella = 171`;
- `voci_spesa = 46`;
- `SUM(importo_default) = 15108.00`.
Riallineamento confermato dopo fix import `millesimi/voci`:
- il pipeline non deve piu accumulare righe da anni/stabili diversi quando si usa `--stabile=0026 --anno=0001`;
- lo snapshot staging `0026/0001` puo contenere righe replicate `x2`, quindi l'import deve deduplicare prima di scrivere;
- per tabelle legacy header-only come `ACQUA`, le righe `dett_tab` a millesimi `0` non devono gonfiare `dettaglio_millesimi`;
- per `ACQUA`, in `dettaglio_importi_tabella` va mantenuta una sola riga operativa per unita scegliendo il ruolo legacy con importo reale: esempio verificato `id_cond=1 -> C 204.76`, `id_cond=2 -> I 154.76`.
QA dedicato:
- comando: `php artisan netgescon:qa-millesimi-spese --stabile=0026 --anno=0001`;
- esito: conteggi base riallineati (`8 / 92 / 171 / 46 / 15108.00`), ma restano warning da chiudere prima del via libera contabile definitivo;
- `ACQUA`, `INDIV.`, `REND.`, `RI.ASS` e `RIPART` sono tabelle legacy senza righe `dett_tab` attive nello snapshot `0026/0001`, quindi non vanno trattate come tabelle ordinarie con righe millesimali positive finche il sorgente non le valorizza;
- restano aperti i codici tabella presenti in staging ma non ancora portati a dominio (`CONG.R`, `RISC.L`, `RISC.`, `RISC.O`, `CONG.O`, `TABADL`, `L01.ST`, `L02.ST`, `L03.ST`, `P01.ST`, `TABASL`, `MED01`, `L04.ST`);
- resta da verificare il comportamento contabile di `Z01`/`Z02` prima del via libera finale alla partita doppia, perche i frazionamenti legacy sono presenti in staging.
## Situazione iniziale patrimoniale
Regole operative fissate per `Contabilita > Situazione iniziale`:
- `cre_deb_preced` resta la sorgente dei valori pregressi da riportare avanti, separati in modo esplicito per `C`rediti e `D`ebiti;
- `CONG.O` va letto da `dett_tab` del `singolo_anno.mdb` come tabella dei conguagli ordinari iniziali;
- nella tab `conguagli` vanno mantenute tutte le righe `C` / `I`, anche quando `cons_euro = 0`, per evitare fallback e permettere lo spostamento puntuale del valore sulla singola unita;
- `FONDI` non vanno piu confusi con i debiti: nella situazione iniziale esiste ora un bucket separato dedicato agli accantonamenti;
- `Perc_proprietario` e `perc_inquilino` di `voc_spe` rappresentano la quota legacy della singola voce per l unita, ma non devono essere usati per ricalcolare importi storici gia emessi nelle `rate`.
## Base contabile condominiale
Impostazione da mantenere nel dominio Day0:
- il piano dei conti universale va tenuto minimale e condominiale, non esteso come una contabilita aziendale completa;
- i gruppi base restano quelli della partita doppia standard: `Attivita`, `Passivita`, `Patrimonio Netto`, `Ricavi`, `Costi`;
- i `crediti` principali sono le quote/rate emesse verso unita e soggetti responsabili (`condomino` / `inquilino`), non crediti commerciali generici;
- i `debiti` principali sono i fornitori e gli altri soggetti che erogano beni o servizi allo stabile;
- la chiusura di gestione non deve cercare `utile` o `perdita` ma il `conguaglio` necessario a coprire i costi sostenuti e chiudere le partite della gestione;
- i `fondi` restano conti patrimoniali standard di partita doppia (`fondo rischi`, `fondo oneri`, `fondo ammortamento`, `fondo riserva`, `accantonamenti`), senza introdurre bucket inventati fuori schema.
Sorgenti legacy da considerare autorevoli nel flusso contabile:
- `condomin` per unita e occupanti responsabili;
- `tabelle` + `voc_spe` per struttura di riparto e voci del piano dei conti operativo;
- `rate` del `singolo_anno.mdb` come credito verso l unita/soggetto;
- `emes_gen` e `emes_det` del `generale_stabile.mdb` come intestazioni e dettagli delle emissioni fisiche inviate;
- `incassi` del `singolo_anno.mdb` come realizzo del credito emesso, da riconciliare con `cod_cassa` e poi con i movimenti banca/cassa di dominio;
- `s_cassa` del `singolo_anno.mdb` come saldo iniziale delle gestioni (`s_ordin_euro`, `s_riscald_euro`, `s_straord_euro`, `n_stra`).
Stato reale osservato oggi su `0026/0001`:
- il raw `singolo_anno.mdb` contiene davvero intestazione `CONG.O` e righe `dett_tab` per `0026/0001`;
- il problema osservato era uno slice staging stantio: il preflight si fermava appena trovava righe gia presenti per `stabile + legacy_year`;
- dopo il fix `refresh-slice` sul loader e il reload scoped, `gescon_import.dett_tab` per `0026/0001` risulta riallineato a `244` righe totali, di cui `27` `CONG.O`.
Controllo sorgente unita immobiliari su `0026/0001`:
- `gescon_import.condomin` contiene `23` righe e `23` `cod_cond` distinti;
- non risultano duplicati sulla sorgente unita (`condomin`) per questo snapshot;
- la duplicazione osservata in questo passaggio riguarda `dett_tab` e `voc_spe`, non la sorgente canonica delle unita.
## Fornitori legacy sul tenant corretto
Verifica operativa eseguita su `0026`:
- lo stabile `0026` appartiene a `amministratore_id = 3`;
- prima del riallineamento fornitori, il tenant `3` aveva solo `2` fornitori con `cod_forn`, mentre il catalogo storico principale era stato importato sotto un altro tenant;
- eseguito `php artisan gescon:import-fornitori-legacy 3 --mdb=/mnt/gescon-archives/gescon/dbc/Fornitori.mdb`;
- esito finale sul tenant `3`: `363` fornitori con `cod_forn` valorizzato e `363` codici distinti.
Conseguenza pratica:
- prima di usare contabilita e scritture legacy su uno stabile reale, verificare sempre che `fornitori.cod_forn` sia presente nello stesso `amministratore_id` dello stabile, non solo in qualche altro tenant del dominio.
## Semantica operativa delle tabelle speciali legacy
### `ACQUA`
- `ACQUA` non va letta come tabella millesimale ordinaria da scrivere in `dettaglio_millesimi`;
- il totale resta in `voc_spe`, mentre il riparto operativo per unita vive in `dett_tab` ed e collegato all unita tramite `id_cond` e al soggetto addebitato tramite `cond_inquil` (`C` o `I`);
- nello staging corrente di `0026/0001` le righe `ACQUA` sono replicate `x2`, quindi l import deve deduplicare e poi collassare a una sola riga operativa per unita scegliendo il ruolo con importo effettivo.
### `RIPART`
- `RIPART` divide una singola voce legacy in piu voci reali di riparto, mantenendo sempre il `100%` dell importo originario;
- la sorgente autorevole e la coppia `fraz_gen` + `fraz_dett` del `singolo_anno.mdb`;
- esempio verificato su `0026`: `Z01` (`ACEA: Energia elettrica`) viene suddivisa in `825 = 20%`, `A02 = 40%`, `B02 = 40%`;
- lo stesso criterio vale anche per pesi non percentuali normalizzati come `1-2-2`, che rappresentano comunque una divisione integrale dell importo.
### `INDIV.`
- `INDIV.` non usa una tabella millesimale classica ma una ripartizione individuale su occupanti `C` / `I` dell unita immobiliare;
- il primo livello resta la percentuale della voce (`Perc_proprietario` / `Perc_Inquilino` in `voc_spe`);
- il secondo livello dipende dai valori individuali collegati alle unita e alle spese personali (`dett_pers`, `n_spe`, occupanti della UI);
- per questo motivo la presenza della sola intestazione `INDIV.` non implica righe `dett_tab` valorizzate.
### `REND.`
- `REND.` gestisce le rendite condominiali da ripartire secondo regolamento, su millesimi o altro criterio definito per lo stabile;
- nello stabile `0026` il riferimento operativo e l unita condominiale `cod_cond = 18` (`APP. CONDOMINIALE`), da usare come ponte verso la gestione affitti gia prevista nel dominio;
- le voci `RD*` possono essere marcate come `Fondo` nel legacy e non vanno trattate come semplici ricavi ordinari.
### `RI.ASS`
- `RI.ASS` rappresenta i rimborsi assicurativi gestiti dall amministratore (`RB1..RB5`);
- nello snapshot `0026/0001` le intestazioni e le voci sono presenti ma senza dettagli `dett_tab`, quindi oggi sono considerate non bloccanti per l import base;
- se compaiono importi anomali in uno stabile nuovo, assumere prima una contaminazione del legacy e verificare archivio/storico prima di costruire automatismi di quadratura.
## Conservazione della semantica legacy senza fallback
- `voci_spesa.meta_legacy` conserva almeno `legacy_tabella`, `legacy_is_fondo`, `legacy_fondo_raw`, percentuali legacy e tipo gestione della voce importata;
- questo vale anche per voci come `RD1` e `RB5`, dove il flag `Fondo = Si` deve restare disponibile al dominio prima del collegamento a partita doppia, FE e banca/posta;
- non inventare dettagli di riparto o fondi nel dominio quando il legacy espone solo intestazioni: importare il dato reale e lasciare tracciata la provenienza.
## Cumuli legacy e anagrafica unica
Verifica eseguita su `0021/0001/singolo_anno.mdb`:
- gruppi `cumulo_cond` trovati: `77`, di cui `75` con piu unita collegate;
- gruppi `cumulo_inq` trovati: `191`, di cui `21` con piu unita collegate;
- esempi reali confermati: `ATER C/O UFFICIO CONDOMINI PASSIVI`, `MINERVA FRANCESCO`, `ROSSI ENRICO`, `MASTRANGELI ALFREDO - GIUFFRIDA STEFANIA`.
Conclusione operativa:
- `cumulo_cond` e `cumulo_inq` non sono un artefatto di stampa ma una semantica reale di raggruppamento comunicazioni e recapiti;
- la deduplica per solo nominativo non basta, perche nello stesso gruppo esistono casi con email e cellulari parzialmente diversi tra una unita e l altra;
- la chiave di raggruppamento va quindi conservata vicino al legame unita <-> nominativo, non solo ricostruita a valle.
Stato del dominio dopo la patch corrente:
- `unita_immobiliare_nominativi.legacy_payload` conserva ora anche `cumulo_*`, recapiti raw, `PEC`, `E_lostesso_Di`, indirizzo legacy e altri campi utili del record `condomin`;
- questo permette di materializzare in modo deterministico i futuri gruppi di comunicazione senza dover riaprire ogni volta il file MDB;
- la rubrica universale continua a essere il contenitore anagrafico principale, ma il legame canonico per la comunicazione multipla deve passare dal rapporto con l unita e non dal solo contatto principale.
Nota sui recapiti multipli:
- `rubrica_universale` ha ancora campi primari singoli (`email`, `telefono_cellulare`);
- i recapiti multipli esistono gia nel progetto tramite `rubrica_contatti_canali` e, sul ramo persona, tramite `PersonaEmailMultipla`;
- la normalizzazione finale dei recapiti deve quindi usare questi contenitori strutturati partendo dal payload legacy appena preservato.
### Servizi
- app/Services/GesconImport/LegacyArchiveService.php
- app/Services/GesconImport/EssentialImportService.php
- app/Services/GesconImport/StabileEnrichmentService.php