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

120 lines
6.7 KiB
Markdown

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