Pe drumul FDB sinteticul e suma bruta a notelor, deci diferenta fata de
analitice se scrie cu D si C separat, nu pe net: rulajul 401 LACERTA iese ca
in SAGA (8.991,55 / 57.253,22). PDF/xls raman pe net (etalonul trece).
Conturile nepartener fara sold si fara rulaj (891) nu mai intra in xlsx.
LACERTA: 51/53 frunze identice cu REF; restul sunt asezari alese (5121,
4428), cu totaluri egale pe cont.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
Cand analiticele unui cont cu parteneri primesc acont prin corectii
(461.SGR -> 461/SGR, 461.RESTUL -> 461/1), generatorul scrie cate un
BALANTA per (cont, acont) si FACTURA cu acelasi acont (pct. 16); postarile
direct pe sintetic merg pe acontul de diferenta, ca la banca. Inainte, acontul
ajungea doar pe FACTURA, nu si pe BALANTA agregat - dezacord tacut.
Fara astfel de corectii, iesirea e neschimbata (etalonul trece).
LACERTA: 4092.1 -> 4092/1, identic cu REF; 50/53 frunze identice.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
- genereaza_xlsx: coloana data = ultima zi a lunii; etalonul de regresie
actualizat doar pe aceasta coloana (verificat celula cu celula).
- config: 542 cont cu parteneri (acum identic cu REF); descrierea lui 4092
corectata.
- extrage/citire_fdb: .fbk se restaureaza cu gbak -c in temporar; test ca
da aceleasi fisiere ca FDB-ul.
- test_lacerta: 49/53 frunze identice cu REF, 4428.TOATE -> 4428/01.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
Proba pe LACERTA (06/2026, firma reala) a gasit doua defecte in citire_fdb:
- precedentul netea si rulajele din an, deci conturile de cheltuieli/venituri
pierdeau rulajul (CPP gresit). Acum: preluare netata + rulaj an brut;
potriveste 44/44 sintetice din importul facut din exportul SAGA (inainte 19/44).
- analiticele se rulau in sintetic, deci facturile per document nu se foloseau
si analiticele nepartener disparea. Acum balanta are toate nivelurile.
Baza primita se copiaza in temporar si copia se repune online (clientul o
trimite si in full shutdown). tests/test_lacerta.py: 48/53 frunze identice cu
REF, restul explicate; se sare fara fisierele clientului, care sunt ignorate
de git. README nou; analiza in docs/analiza_lacerta_fdb.md.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
Verificat pe firma de joaca: ROMFAST (401.00001) nu are COD_FISCAL, deci
citire_fdb.citeste_parteneri cade pe contul analitic - exact codul provizoriu
pe care etapa 5b il repara. TRANSPORT (401.00002) are CUI real, 1879855.
Pasul ANAF nu se scoate pentru sursa Firebird, doar se micsoreaza la
partenerii cu cod_fiscal == cont_analitic. Asertiune in test_citire_fdb.py
care pica daca setul lor se schimba.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
date/balanta_MASTERJOB.csv -> date/balanta_MASTER.csv: numele intermediarului
urmeaza intotdeauna --firma, deci `py genereaza.py --firma MASTER` merge acum fara
--balanta explicit. Firma se cheama in acte MASTERJOB, dar in unealta si in ROA e
MASTER; documentele care vorbesc despre firma pastreaza numele real.
Handoff: sectiune noua "Ce urmeaza", cu proba pe un client real ca prim pas, si
sectiunea de riscuri asumate in locul listei de lucruri ramase.
plan_solduri2roa.md: pasul 2 marcat terminat, cu trimitere la handoff.
33 de teste trec, zero skip-uri.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
date/ - intrari de la client (PDF-urile, exportul SAGA) si balanta intermediara
iesiri/ - xlsx-urile generate si verificare_<FIRMA>.md (ignorat de git)
sablon/ - sablonul ROA
Punctele de intrare scriu acolo implicit: extrage.py --dir=date, genereaza.py
citeste din date/ si scrie in iesiri/ (--dir-iesire), ca radacina sa nu se
murdareasca la fiecare rulare. Sablonul e cautat langa script, in sablon/.
Actualizate: TEMPLATE, cele trei teste care tin caile, .gitignore, CLAUDE.md si
handoff-ul. Poarta capat-la-capat incepuse sa sara tacut dupa mutarea PDF-urilor
(skipTest pe "lipsesc PDF-urile"); acum arata din nou catre date/ si ruleaza.
33 de teste trec, zero skip-uri.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
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
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
citire_fdb.py produce balanta, parteneri si facturi din CONT_BAZA.FDB. Soldurile
stocate in CONTURI sunt 0, deci balanta se obtine agregand REGISTRU pe cele trei
intervale de data; analiticul se ruleaza in sintetic si se emit ambele randuri;
contul colector % se exclude. Conexiune embedded, READ, doar SELECT, rollback.
Garzi pe NULL: scadenta lipsa cade pe ultima zi a lunii, codul fiscal lipsa pe
codul provizoriu, partenerul intrand in lista pentru cautarea ANAF.
Poarta: CSV-ul din FDB e identic la octet cu cel produs de citire_xlsx.py din
exportul firmei de joaca (09/2026), iar SUM(REGISTRU) pe fiecare latura da netul
balantei. Verificat independent: 10 conturi, 7298.15 pe ambele laturi.
Limita, scrisa si in cod si in raport: firma de joaca nu are niciun analitic,
deci cititorul e verificat DOAR pe cazul sintetic si nu se foloseste la un client
fara rerularea portii pe datele lui.
docs/procedura_copie_fdb_client.md: cum isi face clientul copia bazei.
23 de teste trec, fara skip.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
citire_xlsx.py citeste .xlsx (openpyxl) si .xls (xlrd) in acelasi contract intern
ca extract_balanta.py. Prima foaie, nu dupa nume; potrivire exacta a coloanelor,
niciodata pe substring (TOTAL_DEB vs TOTAL_DEB_1); CONT ramane text.
mapare.py: propunere automata, corectii_<FIRMA>.xlsx detinut de utilizator si
mapare_<FIRMA>.xlsx regenerat de unealta, .TOATE/.RESTUL in ordinea exact ->
RESTUL -> TOATE, redenumirea sinteticului. Se opreste cu eroare la cont/acont
peste 4 caractere, coliziune accidentala si cont_saga inexistent in corectii.
Corectat in orchestrare: .xls-ul SAGA nu are inregistrare CODEPAGE, deci xlrd
cadea pe iso-8859-1 si strica denumirile ("FURNIZORI \x97 DEBITORI"). Citirea se
face cu encoding_override="cp1250", cu o verificare in test care pica daca revine.
18 teste trec, inclusiv poarta de regresie pe etalon.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
Setul de conturi cu parteneri iese din literali si trece in
config/conturi_parteneri.csv, cu categorie si motiv. Comportamentul e neschimbat;
lipsa fisierului opreste cu eroare, nu cade pe set gol.
CONFIG_CONT_IREG ramane consultativ: tools/divergenta_parteneri.py raporteaza
divergenta, nu o aplica. Constatarea (27 conturi in Oracle si nu la noi, 3 la noi
si nu in Oracle - 5121, 5124, 5311) e scrisa in docs/decizii_import.md.
tests/test_regresie.py compara iesirea codului de azi cu tests/golden/ pe valori
de celula, prin anonimizatorul refolosit ca functie. Trece pe FUNDATIA si MASTER;
verificat ca pica la o schimbare reala de set de conturi.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
Cercetare: ambele formate SAGA (VFP xls/xlsx si Firebird .FDB), cu dovezi
fisier:linie in docs/raport_sursa_saga_xlsx.md si raport_exporturi_saga_noua.md.
Plan v3 dupa review de strategie si arhitectura: contract intern + trei
cititoare, mapare in doua fisiere cu proprietari diferiti, lane-uri.
Etalon de regresie anonimizat in tests/golden/ (sume si structura neatinse,
zero IBAN si zero cod fiscal real). Tabela de corespondenta ramane ignorata.
Iesirile de productie ies din git (raman pe disc); .gitignore acopera si
copiile de baze de client si iesirile intermediare ale convertorului.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EYeAtVxeS8m4oXekjX8Am2
17 din 30 parteneri identificati, scripturi SQL de corectie per schema.
Comparatia balantei ROA exportate cu balanta SAGA: sumele totale coincid
pe toate conturile; difera doar soldurile pe 1171, 409 si 446.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BdA5a3ECKFD6Citf1ptPZu
Analiticul unui cont cu parteneri al carui sold e pe latura opusa laturii
fixate in cod primeste rand FACTURA, cu suma negativa pe latura
formularului (BALANTA si sold). Nu mai ramane nimic pe NEREPARTIZAT.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BdA5a3ECKFD6Citf1ptPZu