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

109 lines
4.7 KiB
Markdown

# 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.