# Raport lane `integrare` - solduri2roa etapa 2 Data: 21.09.2026. Director: `D:\ROA\IMPORT2ROA\solduri2roa`. Singurul lane activ. ## 1. Facut ### 1.1 Fisiere noi - `extrage.py` (nou) - punct de intrare sursa -> contractul intern: - `extrage.py:25-30` `SURSE_DUPA_EXTENSIE` (`.pdf`, `.xls`, `.xlsx`, `.fdb`). - `extrage.py:33-40` `deduce_sursa` - deducere din extensie; extensie necunoscuta = `SystemExit`. - `extrage.py:43-52` `extrage_pdf` / `extrage_xlsx` - importa `extract_balanta.parse_pdf` si `citire_xlsx.citeste_balanta`; scrie CSV-ul cu writer-ul existent `citire_xlsx.scrie_csv` (adauga coloana `tip` goala pe drumul PDF, conform contractului). - `extrage.py:55-59` `extrage_fdb` - cheama `citire_fdb.produce` (ca si `--an`/`--luna`). - `extrage.py:62-85` CLI `--sursa/--fisier/--firma/--an/--luna/--dir`. - `genereaza.py` (nou) - punct de intrare contractul intern -> xlsx: - `genereaza.py:30-34` citire parteneri/facturi CSV (daca exista). - `genereaza.py:37-46` `_mapare_si_exclusi` - din rezultatul `mapare.genereaza_mapare` iese `override` (doar `sursa == CORECTAT`, cu `cont`/`acont` explicit) si `exclusi`. - `genereaza.py:49-59` `_fara_exclusi` - un cont exclus iese cu tot cu subarbore (un parinte fara copii ar rupe `arbore()`). - `genereaza.py:62-112` fluxul: mapare -> generare -> scriere `init___.xlsx` -> `verifica`; iese cu 1 doar cand verificarile de structura pica. - `tests/test_integrare.py` (nou) - 4 teste (vezi 2). ### 1.2 `genereaza_xlsx.py` (singurul fisier existent modificat) Parametrizare, nu rescriere: logica de constructie BALANTA/FACTURA si verificarile din etapa 5 raman cu aceleasi formule. - `genereaza_xlsx.py:27-40` - `monthrange`; `TEMPLATE` devine cale absoluta langa script (iesirile pot merge in orice `--dir`, inclusiv temp). Am scos constanta `FIRME` (hardcodarea ceruta) si `main()`-ul vechi; modulul e acum biblioteca. - `genereaza_xlsx.py:169-185` - `_data`/`_datascad` calculeaza `data`/`datascad` din `an`/`luna` (prima/ultima zi); `rand(header, an, luna, ...)` primeste perioada ca parametru. Pentru `2025/12` iese exact `01.12.2025` / `31.12.2025`, ca inainte. - `genereaza_xlsx.py:188-203` - `_mapare_cont`: maparea suprascrie doar ce i s-a dat explicit; la **parteneri** un `acont` lipsa (None) lasa forma generatorului. Asta e garda anti-dublare din `decizii_import.md` pct. 16: maparea nu pre-completa `acont` generic pe `401`. - `genereaza_xlsx.py:210-219` - `_text`/`_iso` (data ISO -> `DD.MM.YYYY` pentru facturile FDB). - `genereaza_xlsx.py:222-410` - `genereaza(rows, header, an, luna, mapare, parteneri, facturi)`: - conturile obisnuite iau `cont`/`acont` prin `_mapare_cont` (`:303-304`); - partenerii BANCA pastreaza `acont`-ul analiticului, identic pe BALANTA si FACTURA (`:329`, `:340-346`, `:388-389`) - corectia explicita de `acont` se aplica pe ambele; - randurile de diferenta raman calculate in cod, fara mapare (`:309-318`, `:347-353`); - `factura()` (`:264-297`) foloseste `parteneri`/`facturi` cand exista (cod fiscal real + un rand FACTURA per document, doar cand suma documentelor = netul analiticului si soldul e pe latura formularului), altfel cade pe comportamentul de azi (un FACTURA per partener, sold total). Fara parametri, calea de azi e neatinsa. - `genereaza_xlsx.py:427-428`, `:575-576` - `verifica(..., dir_verificare)` scrie `verificare_.md` in directorul cerut si il creeaza daca lipseste. ## 2. Verificari ### 2.1 Teste Comanda: ``` py -m unittest discover -s tests -v ``` Rezultat (exact, la final): ``` Ran 27 tests in 3.226s OK ``` 27 = cele 23 existente (nemodificate: 2 regresie + 6 citire_xlsx + 5 citire_fdb + 10 mapare) + 2 capat-la-capata (xlsx si fdb) + 2 dispecer. `EXIT=0`. `tests/test_regresie.py` trece **neschimbat**, pe FUNDATIA si MASTER. Fluxurile au fost rulate si separat, cu `--dir` in temp (nu in radacina): - `py extrage.py --sursa xlsx --fisier exemple\saga-sqlite-balanta-09-2026.xlsx --firma JOACA --an 2026 --luna 9 --dir ` -> `balanta_JOACA.csv` (10 randuri); `py genereaza.py --firma JOACA --an 2026 --luna 9 --dir ` -> `rows: 11 totdeb=7298.15 totcred=7298.15 net=0.0`, toate cele 4 verificari OK (exit 0). - `py extrage.py --sursa fdb --fisier --firma JOACA --an 2026 --luna 9 --dir ` -> `balanta_JOACA.csv` (10) + `parteneri_JOACA.csv` (2) + `facturi_JOACA.csv` (1); `genereaza.py` -> aceleasi `rows: 11`, `totdeb=totcred=7298.15`, exit 0. - `py extrage.py --sursa pdf --fisier "IBB 31.12.2025.pdf" ...` -> 88 randuri; `genereaza.py --firma FUNDATIA --an 2025 --luna 12` -> `rows: 75 totdeb=totcred=7068369.5`, OK. - deducere fara `--sursa` (`.xlsx` -> xlsx, `.FDB` -> fdb) si extensie `.csv` -> eroare, exit 1. ### 2.2 Cens octeti si linii Toate fisierele atinse sunt ASCII strict, LF (ca restul `.py` din proiect). Zero octeti > 0x7F inainte si dupa: `genereaza_xlsx.py` 0, `genereaza.py` 0, `extrage.py` 0, `tests/test_integrare.py` 0. `genereaza_xlsx.py` are `CRLF=0`/`LF=588` pe disc, identic cu HEAD (`CRLF=0`, LF), deci nu am schimbat terminatorii de linie. ## 3. Nefacut / blocat / intrebari deschise - **`exclus` din `corectii_.xlsx`**: onorat la nivel de rand + subarbore in `genereaza.py` (nu era cerut explicit de sarcina). Nu exista test dedicat - mapare nu are coloana `exclus` in `mapare_.xlsx`, deci nu se poate verifica automat din fisierul de mapare. - **`parteneri_`/`facturi_` de pe drumul FDB**: calea "factura per document" e implementata, dar pe firma de joaca **nu se poate exercita**: `citire_fdb` ruleaza analiticele in sintetic (decizia lane-ului `citire-fdb`, raport sectiunea 3.1), deci balanta nu are `401.00001` si documentele nu au carui analitic sa se lege; cade corect pe comportamentul de azi. Necesita o baza reala cu analitice, ca si poarta cititorului FDB. - O corectie de `cont` per analitic la un partener SINTETIC (nu BANCA) ar pune FACTURA pe alt cont decat BALANTA agregat; `mapare._verifica_coliziuni` sare peste parteneri. Nu e cazul periculos din sarcina (acela e `acont`, acoperit), dar merita stiut. - Nu am actualizat `CLAUDE.md` (tabelul de fisiere) cu `extrage.py`/`genereaza.py`; nu era in livrabil si nu sunt dependinte noi. ## 4. Stare periculoasa Niciuna. Fara binar VFP editat/write-back, fara procese lasate pornite, fara fisiere in `D:\ROA\ROACONT`, `D:\SAGA250909` sau `saga2roa*` (baza Firebird a fost doar copiata in temp, in test si in verificarea manuala; copiile au fost sterse). In timpul verificarii manuale am scris din greseala `balanta_JOACA.csv`, `parteneri_JOACA.csv`, `facturi_JOACA.csv` in radacina (rule fara `workdir`); le-am sters, iar testele trimit explicit `--dir` in temp. Fara commit, fara `git add`.