Firmele si lunile nu mai sunt hardcodate. extrage.py dispecerizeaza catre cele trei cititoare (pdf / xlsx / fdb, dedus din extensie, extensie necunoscuta = eroare) si scrie contractul intern; genereaza.py aplica maparea si scrie init_<FIRMA>_<an>_<luna>.xlsx plus mapare_<FIRMA>.xlsx. genereaza_xlsx.py devine biblioteca: an/luna parametri, data si scadenta calculate din ele, sablonul cautat langa script. Cand exista parteneri_ si facturi_ (drumul FDB) se emite cate un FACTURA per document, cu cod fiscal real, si numai daca suma documentelor da netul contului; altfel ramane comportamentul de azi, un FACTURA agregat. Corectat in orchestrare: la redenumirea unui cont cu parteneri, generatorul lua primul analitic ca sa afle contul sintetic. Daca analiticele erau mapate pe conturi diferite, BALANTA agregat si randurile FACTURA cadeau pe conturi diferite, tacut. Acum se opreste cu eroare; colapsarea pe acelasi cont ramane legala. Doua teste acopera ambele cazuri. 29 de teste trec, inclusiv regresia pe etalon cu generatorul modificat. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
6.7 KiB
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-30SURSE_DUPA_EXTENSIE(.pdf,.xls,.xlsx,.fdb).extrage.py:33-40deduce_sursa- deducere din extensie; extensie necunoscuta =SystemExit.extrage.py:43-52extrage_pdf/extrage_xlsx- importaextract_balanta.parse_pdfsicitire_xlsx.citeste_balanta; scrie CSV-ul cu writer-ul existentcitire_xlsx.scrie_csv(adauga coloanatipgoala pe drumul PDF, conform contractului).extrage.py:55-59extrage_fdb- cheamacitire_fdb.produce(ca si--an/--luna).extrage.py:62-85CLI--sursa/--fisier/--firma/--an/--luna/--dir.
genereaza.py(nou) - punct de intrare contractul intern -> xlsx:genereaza.py:30-34citire parteneri/facturi CSV (daca exista).genereaza.py:37-46_mapare_si_exclusi- din rezultatulmapare.genereaza_mapareieseoverride(doarsursa == CORECTAT, cucont/acontexplicit) siexclusi.genereaza.py:49-59_fara_exclusi- un cont exclus iese cu tot cu subarbore (un parinte fara copii ar rupearbore()).genereaza.py:62-112fluxul: mapare -> generare -> scriereinit_<FIRMA>_<an>_<luna>.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;TEMPLATEdevine cale absoluta langa script (iesirile pot merge in orice--dir, inclusiv temp). Am scos constantaFIRME(hardcodarea ceruta) simain()-ul vechi; modulul e acum biblioteca.genereaza_xlsx.py:169-185-_data/_datascadcalculeazadata/datascaddinan/luna(prima/ultima zi);rand(header, an, luna, ...)primeste perioada ca parametru. Pentru2025/12iese exact01.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 unacontlipsa (None) lasa forma generatorului. Asta e garda anti-dublare dindecizii_import.mdpct. 16: maparea nu pre-completaacontgeneric pe401.genereaza_xlsx.py:210-219-_text/_iso(data ISO ->DD.MM.YYYYpentru facturile FDB).genereaza_xlsx.py:222-410-genereaza(rows, header, an, luna, mapare, parteneri, facturi):- conturile obisnuite iau
cont/acontprin_mapare_cont(:303-304); - partenerii BANCA pastreaza
acont-ul analiticului, identic pe BALANTA si FACTURA (:329,:340-346,:388-389) - corectia explicita deacontse aplica pe ambele; - randurile de diferenta raman calculate in cod, fara mapare (
:309-318,:347-353); factura()(:264-297) folosesteparteneri/facturicand 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.
- conturile obisnuite iau
genereaza_xlsx.py:427-428,:575-576-verifica(..., dir_verificare)scrieverificare_<FIRMA>.mdin 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 <temp>->balanta_JOACA.csv(10 randuri);py genereaza.py --firma JOACA --an 2026 --luna 9 --dir <temp>->rows: 11 totdeb=7298.15 totcred=7298.15 net=0.0, toate cele 4 verificari OK (exit 0).py extrage.py --sursa fdb --fisier <copie CONT_BAZA.FDB> --firma JOACA --an 2026 --luna 9 --dir <temp>->balanta_JOACA.csv(10) +parteneri_JOACA.csv(2) +facturi_JOACA.csv(1);genereaza.py-> aceleasirows: 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
exclusdincorectii_<FIRMA>.xlsx: onorat la nivel de rand + subarbore ingenereaza.py(nu era cerut explicit de sarcina). Nu exista test dedicat - mapare nu are coloanaexclusinmapare_<FIRMA>.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_fdbruleaza analiticele in sintetic (decizia lane-uluicitire-fdb, raport sectiunea 3.1), deci balanta nu are401.00001si 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
contper analitic la un partener SINTETIC (nu BANCA) ar pune FACTURA pe alt cont decat BALANTA agregat;mapare._verifica_coliziunisare peste parteneri. Nu e cazul periculos din sarcina (acela eacont, acoperit), dar merita stiut. - Nu am actualizat
CLAUDE.md(tabelul de fisiere) cuextrage.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.