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
120 lines
6.7 KiB
Markdown
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`.
|