344 lines
16 KiB
Markdown
Executable File
344 lines
16 KiB
Markdown
Executable File
# 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: l’elenco 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
|