Files
solduri2roa/docs/raport_lane_integrare.md
Marius Mutu 82511c8adb Lane integrare: extrage.py si genereaza.py cu parametri, maparea legata
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
2026-09-21 16:23:45 +03:00

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-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_<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; 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_<FIRMA>.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 <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 -> 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_<FIRMA>.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_<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_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.