Files
solduri2roa/docs/review_ceo_etapa2.md
Marius Mutu 15bb26ac15 Etapa 2: plan v3, rapoarte de cercetare si etalonul de regresie
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
2026-09-21 15:44:57 +03:00

425 lines
28 KiB
Markdown

# Review CEO - planul etapei 2 (`plan_etapa2_convertor.md`, PROPUNERE v2)
Review de strategie, aplicat ca analiza (fara intrebari interactive). Nu s-a modificat planul.
Nu s-a scris cod. Scorurile si modurile de mai jos sunt o adaptare a skill-ului `plan-ceo-review`
la un plan intern, cu un singur utilizator (Marius).
Documente citite integral: `plan_etapa2_convertor.md`, `plan_solduri2roa.md`, `decizii_import.md`,
`raport_sursa_saga_xlsx.md`, `raport_exporturi_saga_noua.md`, `raport_form_init_balanta.md`,
`config_cont_ireg.md`, `conturi_cu_analitice.md`, `verificare_FUNDATIA.md`, `CLAUDE.md`,
`extract_balanta.py`, `genereaza_xlsx.py`, `.gitignore`.
## 0. Modul de review propus (Step 0F adaptat)
Skill-ul cere alegerea unui mod. Nu pot intreba, deci il propun si il justific:
**SELECTIVE EXPANSION cu felie de HOLD** - planul e pe directia corecta, dar are 2-3 bucati care
nu-si justifica existenta acum (cititorul FDB fara date reale, complexitatea merge-ului de mapare)
si 1-2 bucati lipsa (contractul intermediar, sursa setului de parteneri). Nu e "go big": produsul
e intern, utilizatorul e unul singur, migrarile sunt rare. Nu e nici "reduction": cateva lucruri
din plan sunt chiar indispensabile (contractul de CSV, maparea per firma, regresia).
Motivul principal de a nu face HOLD pur: planul nu a evaluat nicio alternativa de arhitectura
(vezi C10), deci "scopul e acceptat" nu se poate sustine inca.
---
## 1. Scoruri pe dimensiunile skill-ului
| # | Dimensiune (skill) | Nota | Ce ar duce-o la 10 |
|---|---|---|---|
| 1 | Premisa corecta (0A) | 6/10 | Raspuns explicit la "cat de des migram?" si "PDF e suficient cat timp clientul nu da baza?". Planul presupune ca FDB e drumul viitor fara sa spuna cat de des ajunge acolo. |
| 2 | Refolosire cod existent (0B) | 8/10 | Nume per sub-problema la ce cod exista deja: reader PDF neatins; tot restul vine din `genereaza_xlsx.py`. Lipseste doar explicitarea setului de parteneri hardcodat (C1). |
| 3 | Alternative de implementare (0C-bis) | 3/10 | Planul are o singura arhitectura ("un format intern, trei cititoare"). Lipsesc varianta minima (un script `--sursa`) si varianta "FDB ca sursa primara". |
| 4 | Aliniere cu starea ideal 12 luni (0C) | 7/10 | O comanda `migreaza.py --firma --an --luna --sursa` cu mapare persistenta. Planul merge exact spre ea, dar nu scrie cum arata finalul (interfata, contract). |
| 5 | Arhitectura (S1) | 7/10 | Contractul intermediar este definit complet, negru pe alb (C4). Acum "acelasi CSV + optional doua fisiere" e o intentie, nu o specificatie. |
| 6 | Harta erorilor / rescue (S2) | 4/10 | 3 conditii de stop sunt numite (bun), dar lipsesc clasele de eroare pentru cititoare (fisier lipsa, antet schimbat, FDB blocat) si ce vede utilizatorul (C16). |
| 7 | Securitate / date de client (S3) | 6/10 | `.gitignore` extins pentru `.FDB`, `parteneri_*.csv`, `facturi_*.csv` (C8). Risc mic dar real: datele de partener sunt PII/financiar. |
| 8 | Data flow / edge cases (S4) | 6/10 | Regula de periodizare REGISTRU -> prec/rulaj/fin scrisa si testata pe o luna cu miscari inainte (C3); tratarea `scadent` NULL (C15). |
| 9 | Calitatea codului (S5) | 7/10 | Decizia despre complexitatea merge-ului de mapare (C6); altfel e curat si reutilizeaza ce exista. |
| 10 | Teste / porti de verificare (S6) | 6/10 | Poarta FDB-vs-xlsx declarata ca ceea ce este (nu inchide lane-ul pe date de joaca, C2) + testul de regresie rulat la fiecare lane, nu doar la final (C5). |
| 11 | Performanta (S7) | 8/10 | Nimic de facut; FDB e o copie citita o data, agregare unica. De notat doar ca firma de joaca nu spune nimic despre timp pe o baza reala. |
| 12 | Observabilitate (S8) | 6/10 | Raportul `verificare_<firma>.md` extins cu numar de parteneri/facturi, sursa folosita si invariantul care inlocuieste "Totaluri" pe sursele xlsx/fdb (C9). |
| 13 | Deploy / rulare la client (S9) | 5/10 | Procedura de copiere a bazei (gbak) mutata in Etapa 2 odata cu cititorul FDB, sau cititorul FDB declarat explicit "intern, nefolosibil la client" (C7/C12). |
| 14 | Traiectorie pe termen lung (S10) | 7/10 | E ok. Reversibilitate 5/5 (scripturi interne, git). Singura datorie: `conturi_cu_analitice.md` contrazice `decizii_import.md` pct.15 pe 5125 (C14). |
| 15 | Design / UX intern (S11) | 5/10 | `mapare_<FIRMA>.xlsx` este interfata omului: header congelat, dropdown la `stare`, evidentiere `NOU`/`DISPARUT`. Planul nu spune nimic despre aspectul lui. |
Scor mediu (nesponderat): ~6,1/10. Planul este peste media unui plan intern, dar isi asuma prea
mult pe incredere (FDB) si prea putin pe specificatie (contract, sursa parteneri).
---
## 2. Constatari (fiecare: ce e in plan -> ce e in neregula -> ce propun)
### C1. Conturile cu parteneri: planul spune "sursa de adevar = Oracle", dar codul le are hardcodate, iar cele doua liste nu coincid
**In plan** (sectiunea "Pasul de mapare"): *"Ce NU se configureaza aici: care conturi merg pe
parteneri. Ramana `CONFIG_CONT_IREG` din Oracle ... e sursa de adevar a ROACONT ... Programele
vechi aveau lista hardcodata in `.prg`, exact ce nu repetam."*
**In neregula:** planul nu spune NICIODATA cum ajunge configuratia Oracle in unealta. Iar codul de
azi o are hardcodata: `genereaza_xlsx.py:43-53` (`PARTENER_SINTETIC = {401,4092,4111,461,462,4551}`,
`PARTENER_BANCA = {5121,5124}`, `PARTENER_FARA_ANALITICE = {5311}`). Lista din Oracle
(`config_cont_ireg.md:89-91`) are **33 de conturi cu `CU_INREGISTRARI=1`** (403, 404, 408, 409,
4091, 4093, 4094, 4118, 413, 418, 419, 426, 4511, 456, 457, 471, 472, 4754, 542, 8051, 1621, 167,
232, 234, 261, 2678, 2691 ...). Daca unealta citeste fidel Oracle, comportamentul se schimba fata
de ce s-a validat in productie (unde doar lista mica a fost folosita). Nu e o eroare, dar este o
divergenta nerezolvata intre doua surse pe care planul le trateaza ca sinonime.
**Propun:** alege o singura sursa si scrie-o in plan:
(a) snapshot local versionat `config/cont_ireg.csv` (coloanele `cont`, `fel_cont`, `cu_inregistrari`),
generat de un SQL documentat, citit de unealta - fara dependinta Oracle la rulare;
(b) pastrezi setul hardcodat (dar atunci scoti din plan afirmatia "Oracle e sursa de adevar");
(c) citire live Oracle - de evitat (contra "fara alte dependinte").
Recomand (a): o sursa, zero credentiale la rulare, si se vede in git cand se schimba.
### C2. Cititorul FDB e cel mai valoros si cel mai putin verificat; poarta lui de terminare e aproape vida
**In plan** (sectiunea "Poarta de verificare"): *"cititorul 3 (FDB) si cititorul 2 (xlsx) trebuie
sa produca acelasi CSV ... Acesta este criteriul care inchide lane-ul `citire-fdb`, nu 'ruleaza fara
eroare'."*
**In neregula:** planul recunoaste singur (aceeasi sectiune) ca firma de joaca *"are doar conturi
sintetice, niciun analitic... 2 furnizori, 0 clienti, 1 factura"*. Deci poarta care "inchide"
lane-ul nu atinge exact partile riscante: analitice, parteneri, facturi per partener, cod fiscal,
scadenta. Pe 10 randuri sintetice, orice cititor plauzibil trece. Poarta e utila ca fumegatoare,
nu ca definitie de "gata". In plus, dovada din `raport_exporturi_saga_noua.md` C.3/C.5 arata ca
singurul rand din `INTRD` are `SCADENT=NULL` si `NEACHITAT=0` - deci nici "scadenta reala" nu e
demonstrata.
**Propun:** muta obtinerea unei baze `.FDB` reale + exportul ei din Etapa 3 in Etapa 2, ca
**preconditie** pentru lane-ul `citire-fdb` (nu pentru tot planul). Cat timp nu exista, scrie in
plan ca `citire-fdb` se poate livra doar ca "pregatit, neverificat pe analitice". Nu numi poarta
"criteriu care inchide lane-ul".
### C3. Semantica de periodizare REGISTRU -> prec/rulaj/fin nu este definita (inima corectitudinii FDB)
**In plan** (sectiunea "Cititorul 3 - Firebird"): *"balanta: agregare pe `REGISTRU` la data ceruta.
... nu se citeste `CONTURI.DEB_PREC`, se agrega `REGISTRU`."*
**In neregula:** planul nu defineste ce inseamna "la data ceruta" si cum se separa
`DEB_PREC` (inceput de perioada), `RULAJ_D` (perioada) si `FIN_D` (final). Exportul SAGA are
4 notiuni distincte (`raport_exporturi_saga_noua.md` A.1, C.4): `DEB_INIT` = inceput de an,
`DEB_PREC` = inceput de perioada, `RULAJ` = perioada, `FIN` = final. CSV-ul tinta cere
`prec_d/prec_c, rulaj_d/rulaj_c, total_d/total_c, sold_d/sold_c`. Daca intervalele nu sunt
definite exact, CSV-urile FDB si xlsx **nu vor fi identice pe date reale** - vor coincide doar pe
firma de joaca, unde toate miscarile sunt inainte de perioada (8 note in `REGISTRU`).
**Propun:** scrie in plan formulele exacte, de obicei:
`prec = SUM(suma) unde DATA < prima_zi_a_lunii_cerute`, `rulaj = SUM unde luna_ceruta`,
`total = prec + rulaj`, `sold = total pe net`; si pentru `DEB_INIT` separat, pentru `sold_in`.
Adu ca test o luna cu miscari in 3 locuri: anul precedent, inainte de luna, in luna.
### C4. Contractul intermediar (CSV + parteneri + facturi) nu este specificat
**In plan** (sectiunea "Arhitectura"): *"Toate cele trei cititoare produc acelasi CSV ... plus -
optional - doua fisiere de parteneri."* Si la "Randurile FACTURA": parametrii
`--furnizori <fisier>`, `--clienti <fisier>`, `--facturi <director>`, `--fdb <cale>`.
**In neregula:** nu exista nume de fisiere, coloane si relatia dintre "fisierele de parteneri" ale
pasului de citire si flagurile generatorului. In plus, cititorul 2 propune `TIP` ca "a 13-a
coloana, optionala", in timp ce reader 1 (`extract_balanta.py`) ramane "nemodificat" si scrie
12 coloane (`pagina, cont, denumire, prec_d, prec_c, rulaj_d, rulaj_c, total_d, total_c, sold_d,
sold_c, este_total`). Rezulta doua contracte care trebuie tolerate simultan, fara sa fie scris.
**Propun:** fixeaza in plan:
- `balanta_<FIRMA>.csv` - exact 12 coloane, neschimbat; `TIP` nu se adauga (nu e nevoie in
generator; `genereaza_xlsx.py` nu citeste `tip`);
- `parteneri_<FIRMA>.csv` - `cont_saga, denumire, cod_fiscal, analitic`;
- `facturi_<FIRMA>.csv` - `cont_partener, numar, data, scadent, neachitat`;
- preconditii de potrivire nume de coloana: **exact, case-insensitive** (nu substring -
`TOTAL_DEB` este prefix al `TOTAL_DEB_1`, iar un match partial ar lua coloana gresita).
### C5. Regresia pe FUNDATIA + MASTER trebuie rulata dupa fiecare lane care atinge generatorul, nu doar la final
**In plan** (tabelul "Ordinea de lucru"): lane `regresie` depinde de `integrare`; *"Poarta finala:
lane-ul `regresie`. Daca noul flux nu reproduce randurile celor doua xlsx-uri validate in productie,
nu e gata."*
**In neregula:** planul schimba doua lucruri in zona validata in productie: (1) `cont`/`acont` vin
din mapare in loc sa fie calculate, (2) setul de conturi cu parteneri (C1). Ambele pot muta cifre.
Daca regresia ruleaza doar la final, un bug introdus in lane-ul `mapare` se descopera dupa toate
celelalte lane-uri.
**Propun:** poarta de regresie FUNDATIA + MASTER se ruleaza dupa `mapare` si dupa `integrare`
(de doua ori), nu o singura data la final. Este cel mai ieftin test de siguranta din tot planul:
doua PDF-uri in git, doua xlsx de referinta pe disc.
### C6. Merge-ul de mapare (`MANUAL`/`NOU`/`DISPARUT` + `.TOATE`/`.RESTUL`) este cea mai mare bucata de cod pentru un utilizator unic
**In plan** (sectiunea "Pasul de mapare"): *"Merge la rulare noua, nu suprascriere: randurile
`MANUAL` raman intacte; analiticele disparute din balanta se pastreaza, marcate `DISPARUT` ...;
analiticele noi se adauga cu `NOU`."*
**In neregula:** nu e gresit, dar este cea mai complexa componenta a planului (stare persistenta,
reconciliere pe 3 tranzitii, marcaje) si se justifica doar daca Marius editeaza manual maparea
des. Planul nu spune cat de des se intampla asta. Alternativa: maparea se regenereaza complet la
fiecare rulare, iar corectiile omului traiesc intr-un fisier mic separat
(`mapare_<FIRMA>_manual.csv`, doar randurile atinse), peste care se aplica.
**Propun:** decid: (a) merge complet ca in plan (accepti complexitatea, adaugi testele celor 3
tranzitii - deja in criteriu), sau (b) overlay manual separat (mai simplu de testat, dar doua
fisiere). Nu am o preferinta puternica; depinde de cat de des editeaza Marius maparea.
### C7. Dependinte noi nedeclarate in `CLAUDE.md`
**In plan** (antet): *"Python 3.13, fara dependinte in afara de openpyxl/pdfplumber/xlrd/firebird-driver."*
`CLAUDE.md:6-7`: *"Instalate: pdfplumber, openpyxl. Fara alte dependinte."*
**In neregula:** planul introduce `xlrd` si `firebird-driver` (si `fbclient.dll` dintr-o cale fixa
de masina: `C:\Program Files\Firebird\Firebird30_Saga\fbclient.dll`, `raport_exporturi_saga_noua.md`
C.2). `CLAUDE.md` nu le mentioneaza, iar calea `fbclient` nu e portabila intre masini/clienti.
**Propun:** adauga in `CLAUDE.md` (si intr-un scurt `README`/`--help`) lista de dependinte + pasul
de instalare + faptul ca `fbclient.dll` se descopera la rulare (nu cale fixa). Verificat: pe
masina asta toate cele 4 module se importa.
### C8. `.gitignore` nu acopera copii `.FDB` si fisierele de parteneri/facturi (date de client)
**In plan** (sectiunea "Git"): enumera ignorarea pentru `init_*.xlsx`, `export_*.xlsx`,
`mapare_*.xlsx`, `balanta_*.csv`. `.gitignore` real confirma exact acestea.
**In neregula:** noile artefacte din plan - copii `.FDB`, `parteneri_*.csv`, `facturi_*.csv`,
fisiere `.xls` - nu sunt acoperite. O copie `.FDB` de client contine CUI, denumiri, IBAN, solduri.
**Propun:** adauga in `.gitignore`: `*.FDB`, `*.fdb`, `parteneri_*.csv`, `facturi_*.csv`,
`config/cont_ireg.csv` (daca se decide snapshot-ul, vezi C1 - sau, dimpotriva, comite-l intentionat
daca nu contine date de client). Nu e o urgenta, dar e o scapare concreta.
### C9. Raportul de verificare este orientat pe PDF; pentru xlsx/fdb, verificarea cu "Totaluri" dispare tacit
**In plan** (sectiunea "Cititorul 2"): *"`este_total` = gol (exportul nu are rand de totaluri)"*.
**In neregula:** `genereaza_xlsx.citeste_totaluri` cauta un rand cu "totaluri" in denumire si
intoarce `None` pe sursele xlsx/fdb (`genereaza_xlsx.py:89-94`). Verificarea "NET xlsx vs NET
Totaluri" (una din garzile din `CLAUDE.md`) nu se mai poate rula, fara ca planul sa spuna ce o
inlocuieste. Ramane doar `SUM(totdeb)=SUM(totcred)`, care e necesara dar nu suficienta.
**Propun:** pentru sursele xlsx/fdb, invariantul de inlocuire se scrie in plan si in raport:
pe fiecare rand din CSV `total_d = prec_d + rulaj_d`, `total_c = prec_c + rulaj_c`,
`sold_d - sold_c = total_d - total_c` (exact verificarile deja rulate in cercetare, 10/10 pe
exportul nou; vezi `raport_exporturi_saga_noua.md` A.1).
### C10. Planul nu evalueaza nicio alternativa si nu spune cat de des se migreaza (premisa)
**In plan:** o singura arhitectura ("Arhitectura: un format intern, trei cititoare"), 5 lane-uri.
**In neregula:** pentru un utilizator unic si 2 migrari facute pana acum, "5 lane-uri + 3 cititoare
+ mapare persistanta + parteneri/facturi din FDB" poate fi supradimensionat. Exista o varianta mult
mai mica: un singur script care citeste PDF sau xlsx (`--sursa`), fara FDB, fara mapare
persistanta, cu partenerii si cod fiscal provizoriu ca azi (etapa 5b ANAF exista deja si a
functionat). FDB-ul aduce valoare reala (cod fiscal real, scadenta, facturi per partener, dispare
etapa 5b) - dar numai dupa ce exista o baza reala de validat (C2).
**Propun:** raspunde la doua intrebari in plan: cat de des se face o migrare si cat de des vine
clientul cu baza `.FDB`. Daca migrarile sunt rare sau FDB-ul e rar, varianta minima acopera cazul
real mai repede si mai sigur.
### C11. Ordinea lane-urilor poate fi paralelizata, iar `citire-fdb` depinde de prea putin
**In plan** (tabelul "Ordinea de lucru"): `citire-xlsx` fara dependinte, `mapare` fara dependinte,
`citire-fdb` depinde de `citire-xlsx`, `integrare` depinde de toate.
**In neregula:** `citire-xlsx` si `mapare` nu depind una de alta si pot rula in paralel (planul le
pune amandoua "fara dependinte", deci e ok, dar nu o spune). `citire-fdb` depinde de `citire-xlsx`
pentru ca exportul e oracolul - corect ca tehnica, dar slab ca dovada pe date de joaca (C2).
**Propun:** numeste explicit `citire-xlsx` + `mapare` ca lane-uri paralele si muta `citire-fdb`
dupa ce exista date reale sau dupa decizia D2.
### C12. Etapa 3 contine procedura de client, fara de care cititorul FDB nu se poate folosi la client
**In plan** (sectiunea "Etapa 3"): *"procedura pentru client: cum isi face copia bazei (`gbak` ...
) si ca trebuie sa opreasca SAGA daca trimite fisierul direct"*.
**In neregula:** daca `citire-fdb` se livreaza in Etapa 2, dar procedura de obtinere a bazei ramane
in Etapa 3, unealta nu poate fi folosita la un client. Planul nu spune daca Etapa 2 FDB e "intern,
pe baza proprie" sau "folosibil la client".
**Propun:** fie muti procedura `gbak`/opreste-SAGA in Etapa 2 odata cu cititorul, fie declari
explicit ca Etapa 2 FDB este doar pe baza proprie si procedura ramane in Etapa 3.
### C13. Testul de regresie: "identice" trebuie definit pe date, nu pe octeti
**In plan** (tabelul): *"xlsx-urile noi **identice** cu cele importate deja in productie"*.
**In neregula:** `genereaza_xlsx.scrie_xlsx` re-salveaza sablonul cu `openpyxl`; metadate/formatari
pot diferi, deci "identic bit-cu-bit" e fragil ca test. Ce conteaza sunt valorile celulelor.
**Propun:** defineste poarta ca "identic pe toate celulele de date (rand >= 2), pe toate coloanele",
nu pe hash de fisier. Compara cu `openpyxl.load_workbook` valorile celula cu celula.
### C14. `conturi_cu_analitice.md` contrazice decizia finala pentru 5125
**In plan:** planul nu mentioneaza 5125.
**In neregula:** `conturi_cu_analitice.md:29,105` propune `5125 = PARTENER`; `decizii_import.md`
pct.15 (revizuit 20.09.2026) decide `5125 = doar analitice, fara parteneri`. Codul respecta pct.15
(5125 nu e in `PARTENER`, `genereaza_xlsx.py:53`). Un om care citeste docul de conturi rămâne cu
informatia veche. Planul nu spune care doc castiga.
**Propun:** o linie in plan ("pct.15 din `decizii_import.md` prevaleaza; `conturi_cu_analitice.md`
se actualizeaza") plus corectarea tabelului la urmatoarea atingere a acelui fisier.
### C15. `scadent` din FDB poate fi NULL; planul il trateaza ca "scadenta reala"
**In plan** (tabelul "Randurile FACTURA"): randul "baza `.FDB`" -> *"cu cod fiscal real si scadenta
reala"*.
**In neregula:** dovedit in `raport_exporturi_saga_noua.md` C.3, singurul rand din `INTRD` are
`SCADENT=NULL`; iar `NEACHITAT=0`. Deci "scadenta reala" si "facturi cu sold" nu sunt garantate de
baza.
**Propun:** in plan, regula pentru `SCADENT` NULL (fallback pe ultima zi a lunii, ca la exporturi)
si pentru selectia facturilor (ex. `NEACHITAT <> 0`), plus raportarea cazurilor.
### C16. Harta erorilor nu numeste ce vede utilizatorul la esec de citire
**In plan** (sectiunea "Ce se pastreaza neatins"): 3 conditii de oprire ("analitic fara rand in
mapare", "cont/acont > 4", "doua randuri cu acelasi (cont,acont)"). Bun, dar sunt doar in generator.
**In neregula:** nu exista erori numite pentru cititoare: fisier lipsa, foaie inexistenta/redenumita,
antet fara coloana asteptata, `cont` citit ca numar, FDB blocat/versiune greșita/`fbclient`
negasit. `raport_form_init_balanta.md` arata ca formularul insusi e lax (rand fara `an` = ignorat
tacut), deci un CSV gresit poate produce un xlsx "valid" dar incomplet.
**Propun:** tabel de erori in plan (codepath | ce poate merge prost | clasa/exceptie | ce vede
Marius). Minim: fiecare cititor valideaza antetul prin nume exacte si se opreste cu mesaj care
spune fisierul, foaia si coloana lipsa.
---
## 3. DECIZII DE LUAT DE MARIUS
### D1. Cat de mare e etapa 2: planul complet (5 lane-uri, 3 cititoare) sau o felie minima intai?
- A) **Felia minima intai**: un script cu `--sursa pdf|xlsx`, fara FDB si fara mapare persistanta
(cod fiscal provizoriu + etapa 5b ca azi); FDB cand apare un client cu baza. (uman: ~1 zi / CC: ~1h)
- B) **Planul complet ca acum** (5 lane-uri, inclusiv FDB + parteneri/facturi).
- C) **Planul complet, dar FDB ultimul si conditionat** de o baza reala (hibrid cu D2).
- **Recomandare: C** - pastrezi valoarea FDB, dar nu blochezi livrarea pe cea mai putin verificata
bucata. Rezultatul il simti imediat pe PDF/xlsx, iar FDB se adauga cand ai dovada. (Daca
migrarile sunt rare si clientii nu dau baza, A devine alegerea corecta.)
### D2. Cititorul FDB: il construim acum sau dupa o baza reala?
- A) Mutam obtinerea unei baze `.FDB` reale + exportul ei in Etapa 2, ca preconditie. (recomandat)
- B) Il construim acum pe firma de joaca si acceptam ca "verificat, nu pe analitice".
- C) Il scoatem din etapa 2 complet (revine in etapa 3).
- **Recomandare: A** - poarta FDB-vs-xlsx pe 10 randuri sintetice nu poate inchide un lane care
promite analitice, parteneri, cod fiscal si scadenta reala.
### D3. Sursa setului de conturi cu parteneri (C1)
- A) Snapshot local `config/cont_ireg.csv` generat de SQL, citit de unealta. (recomandat)
- B) Pastram setul hardcodat din `genereaza_xlsx.py` si scoatem afirmatia "Oracle e sursa de adevar".
- C) Citire live Oracle la rulare.
- **Recomandare: A** - o singura sursa, fara credentiale si fara client Oracle la rulare, si se
vede in git cand se schimba. Important: decide daca snapshot-ul include toate cele 33 de conturi
`CU_INREGISTRARI=1` sau doar setul validat - altfel rezultatul pe FUNDATIA/MASTER se poate schimba.
### D4. Contractul intermediar (C4)
- A) Il fixezi in plan acum: 3 fisiere, nume si coloane exacte, fara `TIP`, match exact de antet.
(recomandat)
- B) Lasi cititoarele sa produca ce vor si adaptezi generatorul.
- **Recomandare: A** - e cel mai ieftin lucru de scris din tot planul si elimina cea mai frecventa
sursa de buguri tacite (potrivire de coloane).
### D5. Merge-ul de mapare (C6)
- A) Merge complet (`MANUAL`/`NOU`/`DISPARUT` + `.TOATE`/`.RESTUL`) ca in plan.
- B) Overlay manual separat peste o mapare regenerata complet. (mai simplu de testat)
- **Recomandare: B** daca Marius editeaza maparea rar; A daca o editeaza des. Neutral - decizia
tine de cat de des corecteaza manual.
### D6. Poarta de regresie (C5, C13)
- A) Rulezi regresia FUNDATIA + MASTER dupa `mapare` si dupa `integrare`, comparand valori de
celule (nu hash de fisier). (recomandat)
- B) Ramane o singura rulare la final, pe hash de fisier.
- **Recomandare: A** - cel mai ieftin test de siguranta, si protejeaza exact zona validata in
productie pe care planul o atinge.
### D7. Procedura de client pentru baza FDB (C12)
- A) O muti in Etapa 2 odata cu cititorul FDB. (recomandat daca D2 = A/B)
- B) Ramane in Etapa 3; declari Etapa 2 FDB "intern, nefolosibil la client".
- **Recomandare: A** - altfel livrezi un cititor pe care nu-l poti folosi in teren.
### D8. Cine e "adevarul" pe 5125 si pe docurile contradictorii (C14)
- A) `decizii_import.md` pct.15 prevaleaza; actualizezi `conturi_cu_analitice.md`. (recomandat)
- B) Lasat asa, se rezolva la urmatoarea atingere.
- **Recomandare: A** - o linie in plan si o corectie mica elimina o capcana pentru viitor.
---
## 4. Ce am verificat si ce NU am putut verifica
**Verificat (cu dovada):**
- Structura celor doua exporturi SAGA (VFP si Firebird) identica pe 35 de coloane si maparea
1:1 pe cele 8 sume - `raport_sursa_saga_xlsx.md` 1.5/1.6 si `raport_exporturi_saga_noua.md`
A.1/B.2 (relatii de sume 341/341 si 10/10).
- `CONTURI` cu solduri 0, cifrele din agregarea `REGISTRU` - `raport_exporturi_saga_noua.md` C.4.
- Firma de joaca: FDB exista (`D:\SAGA250909\0001\CONT_BAZA.FDB`, 21 MB), exporturi in `exemple\`,
0 analitice, 2 furnizori, 0 clienti, 1 factura - planul si raportul C.3 confirma.
- Setul hardcodat de parteneri din cod vs lista Oracle `CU_INREGISTRARI=1` (33 conturi) - C1:
`genereaza_xlsx.py:43-53` vs `config_cont_ireg.md:89-91`.
- `5125`: codul respecta `decizii_import.md` pct.15, docul `conturi_cu_analitice.md` nu - C14.
- `.gitignore` real nu acopera `.FDB`/`parteneri_*.csv`/`facturi_*.csv` - C8.
- Dependintele pe masina asta: `pdfplumber`, `openpyxl`, `xlrd`, `firebird.driver` se importa toate.
- `genereaza_xlsx.py` citeste `totaluri` din CSV, deci pe sursele xlsx/fdb verificarea scade - C9.
- `extract_balanta.py` scrie 12 coloane, deci `TIP` ca a 13-a coloana ar rupe contractul - C4.
**NU am putut verifica (afirmatii neacoperite de un fisier citit):**
- Cat de des se face o migrare si cat de des vine clientul cu baza `.FDB` (premisa pentru D1).
Nu exista niciun document cu volumul de migrari.
- Daca `REGISTRU` permite reconstruirea exacta a `DEB_PREC`/`RULAJ`/`FIN` pe analitice pe o baza
reala - nu exista decat firma de joaca (8 note). C3 ramane o cerinta, nu o dovada.
- Daca vreun client are baza `.FDB` pe o versiune Firebird diferita (aici 3.0.7, `fbclient` dintr-o
cale fixa) - nerezolvat, risc de deploy nenumit in plan.
- Ordinea exacta de prioritate dintre `conturi_cu_analitice.md` (PARTENER pe 5125) si
`decizii_import.md` pct.15 (analitic) din partea lui Marius - am presupus ca pct.15, mai nou si
revizuit, este cel corect.
- Outside voice (Codex / subagent) NU a fost rulat: skill-ul il cere implicit, dar acest task este
o analiza fara aprobare interactiva, iar rezultatul ar fi informational. De reluat manual daca
Marius vrea a doua voce.
**Anexa A - diagrama de arhitectura (cum e acum in plan; `[?]` = nespecificat)**
```
SURSE CITITOARE CONTRACT GENERATOR IESIRE
PDF balanta ------> citire-pdf (exista) -> balanta_<F>.csv (12 col) --> genereaza -------> init_<F>_<a>_<l>.xlsx
xlsx/xls SAGA -----> citire-xlsx (NOU) -> balanta_<F>.csv
CONT_BAZA.FDB -----> citire-fdb (NOU) -> parteneri_<F>.csv [nume/coloane ?] + mapare_<F>.xlsx
facturi_<F>.csv [nume/coloane ?] + docs/verificare_<F>.md
```
**Anexa B - registru de erori propus (S2)**
| Codepath | Ce poate merge prost | Tratament propus (acum lipseste) |
|---|---|---|
| citire-pdf | PDF fara text (scanat) | Stop, mesaj "PDF fara strat de text" |
| citire-xlsx | fisier lipsa / foaie redenumita / antet schimbat | Stop cu numele foii si coloanei asteptate |
| citire-xlsx | `cont` citit ca numar (`401.00002`) | citire ca text, verificat deja in cercetare |
| citire-fdb | `fbclient.dll` negasit / versiune Firebird diferita | Stop cu calea cautata si versiunea |
| citire-fdb | `CONTURI` cu solduri 0 (folosire gresita) | agregare `REGISTRU`, cu invariant de sume; de numit explicit |
| generator | analitic fara rand in mapare | deja in plan: Stop |
| generator | `(cont,acont)` duplicat | deja in plan: Stop |
| generator | rand fara `an` (formular il ignora tacit) | validare proprie, nu te baza pe formular |
**Anexa C - registru de failure modes (S4)**
| Codepath | Failure mode | Prins? | Test? | Marius vede? | Logat? |
|---|---|---|---|---|---|
| citire-fdb | CSV "corect" dar fara analitice (agregare sintetic) | N (C2) | N (date de joaca) | **Silent** | raport |
| citire-fdb | `SCADENT` NULL tratat ca data valida | N (C15) | N | partial | nu |
| citire-xlsx | antet cu coloana lipsa -> 0 pe toate | N (C16) | partial | posibil Silent | nu |
| generator | `Totaluri` absent -> verificare sarita | partial (C9) | da | notat in raport | da |
| deploy | `fbclient` lipsa la client | N (C7) | N | Stop (daca mesaj clar) | nu |
Rândurile `RESCUED=N, TEST=N, USER SEES=Silent` sunt golurile critice: primul si al treilea.
**Anexa D - "ce exista deja"**
- `extract_balanta.py` = cititorul PDF (reused, nemodificat; corect).
- `genereaza_xlsx.py` = toti pasii de mapare si constructie a randurilor BALANTA/FACTURA, cu
verificarile din etapa 5 (reused; planul il extinde corect cu maparea si `exclus`).
- `decizii_import.md` pct.11-16 = regulile validate in productie (nu se redeschid; corect).
- Sablonul `init_facturi_balanta_note.xlsx` (rand 1 = cap de tabel, import incepe de la rand 2).
**Anexa E - "NOT in scope" (confirmat de plan, cu o exceptie)**
- importul registrului jurnal, balantele de verificare lunare, nomenclatorul de parteneri lunar
(programele `saga2roa*` vechi) - corect in afara scopului;
- planul de conturi syntetic generat de SAGA (`PLANCONT`) - corect nepreluat;
- conectarea Firebird prin retea - corect amanata.
- **Exceptie de re-verificat:** "procedura de client pentru copia bazei" este scoasa in Etapa 3,
dar daca FDB se livreaza in Etapa 2 (D2/D7), ea este in scop.