Files
solduri2roa/docs/raport_lane_regresie.md
Marius Mutu 0d0b3e26fe Lane regresie: poarta finala trece, etapa 2 e gata
tests/test_regresie_capat_la_capat.py ruleaza extrage.py si genereaza.py ca
subprocese, pornind de la PDF-urile originale, si compara rezultatul anonimizat cu
tests/golden/ pe valori de celula: 0 diferente pe ambele firme. Fluxul nou
reproduce exact xlsx-urile deja importate in ROACONT.

33 de teste trec, fara niciun skip.

CLAUDE.md: dependintele noi (xlrd, firebird-driver) si punctele de intrare.
Handoff-ul rescris pe starea de final, cu ce NU e dovedit: cititorul FDB e
verificat doar pe cazul sintetic al firmei de joaca si nu se duce la un client
fara rerularea portii pe datele lui.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
2026-09-21 16:29:29 +03:00

4.7 KiB

Raport lane regresie - solduri2roa etapa 2, poarta finala

Data: 21.09.2026. Director: D:\ROA\IMPORT2ROA\solduri2roa. Singurul lane activ.

Intrebarea portii: fluxul nou, pornit de la PDF-urile originale, reproduce exact cele doua xlsx-uri deja importate in ROACONT si trecute? Da.

1. Facut

  • tests/test_regresie_capat_la_capat.py (nou, 210 linii, ASCII, LF):
    • :44-56 _ruleaza - punctele de intrare rulate ca subprocese (sys.executable extrage.py ... / genereaza.py ...), deci parsarea argumentelor e sub test; orice cod de iesire != 0 e esec.
    • :29-36 FIRME - PDF -> firma -> balanta de referinta -> etalon.
    • :70-82 _diferente_referinta - compara balanta extrasa din PDF cu balanta de referinta din radacina, ca sa confirme asocierea PDF->firma.
    • :105-128 setUpClass - extrage fiecare PDF in temp, verifica, ruleaza genereaza.py, anonimizeaza cu tests/anonimizeaza_etalon.py (functie importabila, tabela comisa) in temp.
    • :148-194 _verifica_etalon - comparatie pe valori de celula cu tests/golden/; mesajul de esec da fisierul, randul, coloana (numar si litera), asteptat, gasit. skipTest la PDF/tabela lipsa.
    • 4 teste: test_pdf_fundatia_corespunde_referintei, test_pdf_master_corespunde_referintei, test_etalon_fundatia, test_etalon_master.

Niciun fisier de productie, niciun etalon, niciun config nu a fost modificat. Cod de productie schimbat: niciunul (diferente zero, nu a fost nevoie).

2. Verificari

2.1 Asocierea PDF -> firma (dedusa, nu ghicita)

Ambele PDF-uri extrase in temp, comparate cu balantele de referinta din radacina pe coloanele comune (cont, denumire, prec_*, rulaj_*, total_*, sold_*, este_total):

  • IBB 31.12.2025.pdf vs balanta_FUNDATIA.csv -> 0 diferente; vs balanta_MASTERJOB.csv -> 570.
  • MJC 31.12.2025.pdf vs balanta_MASTERJOB.csv -> 0 diferente; vs balanta_FUNDATIA.csv -> 570.

Concluzie: IBB = FUNDATIA, MJC = MASTER. Afirmatia e verificata si in test (test_pdf_*_corespunde_referintei), nu doar in raport.

2.2 Comenzile rulate

py extrage.py --sursa pdf --fisier "IBB 31.12.2025.pdf" --firma FUNDATIA --an 2025 --luna 12 --dir <temp>
py extrage.py --sursa pdf --fisier "MJC 31.12.2025.pdf" --firma MASTER  --an 2025 --luna 12 --dir <temp>
py genereaza.py --firma FUNDATIA --an 2025 --luna 12 --dir <temp>
py genereaza.py --firma MASTER   --an 2025 --luna 12 --dir <temp>
py tests/anonimizeaza_etalon.py   (functie importabila: anonimizeaza_fisier)
py -m unittest discover -s tests -v

extrage.py: 88 randuri pentru fiecare PDF. genereaza.py: FUNDATIA rows: 75 totdeb=totcred=7068369.5, toate 4 verificarile OK, exit 0; MASTER rows: 80 totdeb=totcred=2318572.11, toate 4 OK, exit 0 (un analitic negativ cunoscut: 5121.01 -20.8 D, raportat, nu normalizat).

2.3 Iesirea testului

test_etalon_fundatia (test_regresie_capat_la_capat.TestRegresieCapatLaCapat.test_etalon_fundatia) ... ok
test_etalon_master (test_regresie_capat_la_capat.TestRegresieCapatLaCapat.test_etalon_master) ... ok
test_pdf_fundatia_corespunde_referintei (...) ... ok
test_pdf_master_corespunde_referintei (...) ... ok
...
Ran 33 tests in 6.676s

OK
EXIT=0

33 = 29 existente + 4 ale acestui lane. tests/test_regresie.py trece neschimbat.

2.4 Rezultatul portii

Anonimizat vs tests/golden/, pe valori de celula:

  • golden_FUNDATIA_2025_12.xlsx: dimensiuni 76 x 39, 0 celule diferite.
  • golden_MASTER_2025_12.xlsx: dimensiuni 81 x 39, 0 celule diferite.

Nu exista diferente de raportat (nici macar denumiri cu spatii in plus: zero celule).

2.5 Cens octeti / linii

tests/test_regresie_capat_la_capat.py: 0 octeti > 0x7F, CRLF=0 / LF=210 (identic cu tests/test_regresie.py, tests/test_integrare.py). Toate iesirile testului au fost scrise doar in directoare temporare.

3. Nefacut / blocat / intrebari deschise

  • Niciun blocaj. Poarta a trecut din prima, fara ajustari de cifre.
  • Observatie (nu blocant): genereaza.py nu are un flag care sa impuna absenta corectiilor pre-existente; testul ruleaza in temp gol, deci corectii_<FIRMA>.xlsx se creeaza gol si nu influenteaza rezultatul. Daca cineva pune corectii reale in radacina, testul nu le foloseste (si nici nu trebuie).

4. Stare periculoasa

Niciuna. Fara binar VFP editat/write-back, fara procese lasate pornite, fara date de test consumate. Fisierele din radacina (balanta_*, init_*) au timestamp neschimbat. Fara commit, fara git add. git status --short arata un singur fisier nou: tests/test_regresie_capat_la_capat.py.

5. Verdict

Etapa 2 este gata. Fluxul nou, pornit de la PDF-urile originale prin linia de comanda, reproduce identic (0 diferente pe valori de celula) ambele xlsx-uri de initializare deja importate in ROACONT.