# Raport sursa-saga: balanta.xls SAGA, tabela conturi_roa si exporturile folosite Cercetare read-only. Nu s-a modificat niciun fisier din `saga2roa`, `saga2roa_danube`, `saga2roa_rompetrol`. Fisierele temporare sunt in `C:\Users\mmari\AppData\Local\Temp\opencode\sursa_saga`. ## 0. Cum am citit .xls-ul (ce a mers) Ordinea ceruta, cu rezultatul exact: 1. `pandas` + `xlrd`: **pandas NU e instalat** (`ModuleNotFoundError: No module named 'pandas'`), `xlrd` la fel. Am instalat doar `xlrd` (`py -m pip install xlrd` -> 2.0.2). Cu `xlrd.open_workbook` fisierul se citeste corect. 2. `openpyxl` pe `.xls` **esueaza** (confirmat): `openpyxl.utils.exceptions.InvalidFileException: openpyxl does not support the old .xls file format`. 3. LibreOffice exista (`C:\Program Files\LibreOffice\program\soffice.exe`) si conversia a mers: `soffice --headless --convert-to xlsx --outdir balanta.xls` -> exit 0. Fidelitate verificata: xlsx-ul convertit are tot 342 randuri x 35 coloane, sheet `balanta`, acelasi antet. 4. Excel COM din PowerShell: **nu a fost nevoie** (xlrd si LibreOffice au acoperit). Concluzie: se poate citi fie direct cu `xlrd`, fie prin conversie LibreOffice. ## 1. Structura balantei SAGA exportate in Excel (`saga2roa_danube\balanta.xls`) - O singura foaie: `balanta`. 342 randuri x 35 coloane. - **Randul 1 (index 0) = antetul**, direct pe prima linie; nu exista randuri de titlu deasupra. Datele incep la randul 2 (index 1). Ultimul rand de date = randul 342 (index 341). - **NU exista rand de totaluri.** Toate cele 341 de randuri de date au `cont` si `denumire` completate; ultimul rand este contul `7651`. Randul "Totaluri:" exista doar in raportul PDF "Balanta de verificare", nu in acest xls. ### 1.1 Coloanele, in ordine (litera + nume) | Lit. | Nume | Lit. | Nume | Lit. | Nume | |---|---|---|---|---|---| | A | cont | M | rulajt_d | Y | rulaj_d_1 | | B | denumire | N | rulajt_c | Z | rulaj_c_1 | | C | categorie | O | total_deb | AA | rulajt_d_1 | | D | tip | P | total_cred | AB | rulajt_c_1 | | E | deb_init | Q | fin_d | AC | total_deb_1 | | F | cred_init | R | fin_c | AD | total_cred_1 | | G | deb_prec | S | deb_init_1 | AE | fin_d_1 | | H | cred_prec | T | cred_init_1 | AF | fin_c_1 | | I | sold_in_d | U | deb_prec_1 | AG | analitic | | J | sold_in_c | V | cred_prec_1 | AH | validat | | K | rulaj_d | W | sold_in_d_1 | AI | linie | | L | rulaj_c | X | sold_in_c_1 | | | Aceasta lista coincide **exact** cu structura `conturi.dbf` documentata in cod la `saga2roa_danube\saga2roa_danube.prg:25` (comentariul cu capul tabelei SAGA). Deci `balanta.xls` este **exportul in Excel al tabelei SAGA `conturi` (plan de conturi cu solduri)**, NU raportul "Balanta de verificare". Confirmare suplimentara: `saga2roa_danube.prg:30` citeste direct `conturi.dbf` din directorul SAGA (`K:\MARIUS\SAGA C.3.0\0001\`). ### 1.2 Primele 10 randuri de date (Excel rand 2..11) | cont | denumire | tip | deb_init | cred_init | deb_prec | cred_prec | rulaj_d | rulaj_c | total_deb | total_cred | fin_d | fin_c | |---|---|---|---|---|---|---|---|---|---|---|---|---| | 1012 | CAPITAL SUBSCRIS VARSAT | P | 0 | 2000.00 | 0 | 2000.00 | 0 | 0 | 0 | 2000.00 | 0 | 2000.00 | | 105 | REZERVE DIN REEVALUARE | P | 0 | 3009833.83 | 0 | 3009833.83 | 0 | 0 | 0 | 3009833.83 | 0 | 3009833.83 | | 105.10 | REZERVE DIN REEVALUARE CELULA INSILOZARE | P | 0 | 167629.29 | 0 | 167629.29 | 0 | 0 | 0 | 167629.29 | 0 | 167629.29 | | 105.102 | REZERVA DIN REEVAL.TRANSPORTOR TORNADO ORIZONTAL | P | 0 | 4669.56 | 0 | 4669.56 | 0 | 0 | 0 | 4669.56 | 0 | 4669.56 | | 105.103 | REZERVA DIN REEVAL.TRANSPOROTR TORNADO ORIZONTAL | P | 0 | 2263.31 | 0 | 2263.31 | 0 | 0 | 0 | 2263.31 | 0 | 2263.31 | | 105.104 | REZERVA DIN REEVAL.TRANSPORTOR TORNADO ORIZONTAL | P | 0 | 4669.56 | 0 | 4669.56 | 0 | 0 | 0 | 4669.56 | 0 | 4669.56 | | 105.105 | REZERVA DIN REEVAL TRANSPORTOR ELEVATOR TEE100 | P | 0 | 3788.75 | 0 | 3788.75 | 0 | 0 | 0 | 3788.75 | 0 | 3788.75 | | 105.106 | REZERVA DIN REEVAL TRNASPORTOR ELEVATOR TEE100 | P | 0 | 3940.44 | 0 | 3940.44 | 0 | 0 | 0 | 3940.44 | 0 | 3940.44 | | 105.11 | REZERVA DIN REEV.CELULA INSILOZARE | P | 0 | 167628.38 | 0 | 167628.38 | 0 | 0 | 0 | 167628.38 | 0 | 167628.38 | | 105.17 | REZERVA DIN REEVAL.RETEA ELECTRICA | P | 0 | 12143.52 | 0 | 12143.52 | 0 | 0 | 0 | 12143.52 | 0 | 12143.52 | ### 1.3 Ultimele 5 randuri (Excel rand 338..342) | cont | denumire | tip | deb_init | cred_init | deb_prec | cred_prec | rulaj_d | rulaj_c | total_deb | total_cred | fin_d | fin_c | |---|---|---|---|---|---|---|---|---|---|---|---|---| | 6811 | CHELT. DE EXPLOATARE CU AMORTIZAREA IMOBILIZARILOR | A | 0 | 0 | 119978.76 | 119978.76 | 39992.94 | 39992.94 | 159971.70 | 159971.70 | 0 | 0 | | 698 | CHELT. CU IMPOZITUL PE VENIT SI CU ALTE IMPOZITE | A | 0 | 0 | 1722.00 | 1722.00 | 0 | 0 | 1722.00 | 1722.00 | 0 | 0 | | 704 | VEN. DIN SERVICII PRESTATE | P | 0 | 0 | 172156.50 | 172156.50 | 25185.81 | 25185.81 | 197342.31 | 197342.31 | 0 | 0 | | 7584 | VEN. DIN SUBVENTII PT. INVESTITII | P | 0 | 0 | 6956.34 | 6956.34 | 2318.78 | 2318.78 | 9275.12 | 9275.12 | 0 | 0 | | 7651 | VEN. DIN DIFERENTE FAVORABILE DE CURS VALUTAR | P | 0 | 0 | 14081.25 | 14081.25 | 7523.61 | 7523.61 | 21604.86 | 21604.86 | 0 | 0 | Nu exista rand de totaluri dupa acestea; randul 342 este ultimul. ### 1.4 Sintetic vs analitic - **Nu exista indentare si nu exista o coloana separata** care sa spuna sintetic/analitic. Coloana `analitic` (AG) este **1 pe toate cele 341 de randuri**, deci nu distinge nimic. - Singurul criteriu real este **punctul in codul de cont**: - 78 randuri fara punct (`0` puncte) = **conturi sintetice** (ex. `1012`, `105`, `1171`, `401`); - 263 randuri cu exact 1 punct = **conturi analitice** (ex. `105.10`, `105.102`, `1171.100`, `208.500`, `2813.114`, `401.00032`); - nu exista coduri cu 2 sau mai multe puncte in acest fisier. - Partea de analitic are lungime variabila 1..5 caractere si poate fi si alfanumerica: in fisier apar si `105.RAI`, `4428.TP` (litere), pe langa `00001..00134` (5 cifre). - Atentie: un cont sintetic fara punct poate fi si frunza (ex. `1012` nu are analitice), deci "are punct" = analitic, dar "nu are punct" NU inseamna automat parinte. - Codul de analitic arata exact ca in exemplu (`401.00027`), adica `sintetic.`. ### 1.5 Coloanele de sume: ce sunt totaluri si ce sunt solduri Relatii verificate pe **toate cele 341 de randuri** (toleranta 0.005): | Verificare | Rezultat | |---|---| | `total_deb = deb_prec + rulaj_d` si `total_cred = cred_prec + rulaj_c` | 341/341 OK | | `fin_d - fin_c = total_deb - total_cred` | 341/341 OK | | `sold_in_d - sold_in_c = deb_prec - cred_prec` | 341/341 OK | Interpretare (sprijinita si de cod, `saga2roa\balanta.sql:11`: `deb_init+deb_prec as debit, cred_init+cred_prec as credit`): - `deb_prec` / `cred_prec` = **sume precedente** (rulaj cumulat pana la inceputul perioadei) — corespund coloanelor "Sume precedente" din raportul PDF; - `rulaj_d` / `rulaj_c` = **rulaj perioada**; - `total_deb` / `total_cred` = **sume totale** = precedente + rulaj (NU sold); - `fin_d` / `fin_c` = **sold final**; - `deb_init` / `cred_init` = solduri de preluare (initial), separat de precedent; - `sold_in_d` / `sold_in_c` = sold la inceput, pe netul precedentelor; - `rulajt_d` / `rulajt_c` = rulaj total cumulat; in acest fisier **nu este egal cu `total_deb/cred`** decat pe 95/341 randuri (deci nu e o simpla copie a lui `total_deb`). Setul `_1` (coloanele S..AF): pe 265/341 randuri este **complet zero**, iar pe 78/341 randuri este **identic cu setul principal**. Cele 78 sunt exact randurile sintetice (fara punct), cele 265 sunt analiticele + 2 randuri sintetice complet zero. Nu am putut stabili din fisierele disponibile ce reprezinta setul `_1` (pare o a doua balanta / a doua perioada); **nu il folosesc ca fapt dovedit**. ### 1.6 Comparatie cu CSV-ul produs de `extract_balanta.py` din PDF CSV-ul din PDF (`balanta_FUNDATIA.csv`) are coloanele: `pagina, cont, denumire, prec_d, prec_c, rulaj_d, rulaj_c, total_d, total_c, sold_d, sold_c, este_total`. Corespondenta de semantica (raportul PDF "Balanta de verificare" = 8 coloane numerice, vezi si `saga2roa\Balanta de verificare 16052018 1317.xls` rand 7-9: Sume precedente / Rulaje perioada / Sume totale / Solduri finale): | CSV (PDF) | xls | |---|---| | prec_d / prec_c | deb_prec / cred_prec | | rulaj_d / rulaj_c | rulaj_d / rulaj_c | | total_d / total_c | total_deb / total_cred | | sold_d / sold_c | fin_d / fin_c | Coloane in CSV care **lipsesc** din xls: `pagina` (numarul paginii PDF), `este_total` (markerul randului de totaluri). Coloane in xls care **nu exista** in CSV: `categorie`, `tip`, `deb_init`, `cred_init`, `sold_in_d`, `sold_in_c`, `rulajt_d`, `rulajt_c`, cele 16 coloane `_1`, `analitic`, `validat`, `linie`. **Se poate produce EXACT acelasi CSV din xls?** Nu exact, dar foarte aproape: - Coloanele de cont si de sume se pot mapa 1:1 si valorile sunt coerente (aceleasi relatii `total = prec + rulaj`, `sold = total` pe net); - `pagina` nu se poate reface din xls (e proprie PDF-ului, depinde de paginare si de ruperile de denumire); - `este_total`: xls-ul **nu are rand de totaluri**; s-ar putea doar calcula/adapta, nu citi; - denumirea poate diferi: in PDF denumirea e recompusa din fragmente pe pagini (`extract_balanta.py:124-126` lipeste randurile de continuare), in xls e o singura celula; - setul de conturi poate diferi daca PDF-ul si xls-ul sunt din perioade/firme diferite (in cazul de fata xls este DANUBE, CSV-urile existente sunt FUNDATIA/MASTERJOB). Deci: **da pentru conturi + cele 8 sume, nu pentru `pagina` si `este_total`.** ## 2. Tabela de corespondenta conturi SAGA -> conturi ROA ### 2.1 Cele doua fisiere, structura DBF **`saga2roa\CONTURI_ROA.DBF`** (varianta DANUBE, 56 inregistrari, 4 campuri): | Camp | Tip | Lungime | |---|---|---| | CONT | C | 20 | | ACONT | C | 20 | | CONT2 | C | 4 | | ACONT2 | C | 4 | Primele 15 randuri (CONT | ACONT | CONT2 | ACONT2): ``` 2131 | TOATE | 2131 | (gol) 2133 | TOATE | 2133 | (gol) 214 | TOATE | 214 | (gol) 2813 | TOATE | 2813 | (gol) 2814 | TOATE | 2814 | (gol) 3024 | ATM | 3024 | 1 3024 | ATUO | 3024 | 2 3024 | (gol) | 3024 | 3 303 | TOATE | 303 | (gol) 371 | TOATE | 371 | 5 371 | MARFA | 371 | 6 371 | MCKM4-5 | 371 | 7 378 | MCKM4-5 | 378 | 7 378 | MFEN | 378 | 1 378 | (gol) | 378 | 1 ``` Observatii: `ACONT2` poate fi gol, o cifra, sau alfanumeric (`X`, `PG`, `PO`, `TXV`, `ANAF`, `C4-5`). `CONT2` poate diferi de `CONT` (ex. `409 -> 4091`, `431 -> 4311`, `4314 -> 4313`, `4374 -> 4371`, `4381 -> 4371`). Exista un export identic ca structura in `saga2roa\conturi.csv` (antet `cont;acont;cont2;acont2`, 56 randuri) si `saga2roa\conturi.xls` (foaie `Sheet1`, 57 randuri cu antet) — dar acestea doua NU sunt identice bit-cu-bit cu `CONTURI_ROA.DBF`: in csv/xls codul analitic e lipit in `cont` (`707.ATM`) si `acont` e gol, iar unele valori difera (`MCKM4-5` vs `MCK4-5`). Sunt variante, nu acelasi fisier. **`saga2roa_rompetrol\conturi_roa.dbf`** (varianta ROMPETROL, 135 inregistrari, 6 campuri): | Camp | Tip | Lungime | |---|---|---| | CONT2 | C | 4 | | ACONT2 | C | 4 | | DENUMIRE | C | 100 | | CONT_ALT | C | 20 | | COD | C | 20 | | CONT | C | 20 | Primele 15 randuri (CONT2 | ACONT2 | DENUMIRE | CONT_ALT | COD | CONT): ``` 121 | 3001 | PROFIT SI PIERDERE | (gol) | B1203010_NG_011 | 121 167 | 5501 | GARANTIE DE BUNA EXECUTIE _NG | (gol) | B1203080_NG_081 | 167.01 201 | 1101 | CHELTUIELI DE CONSTITUIRE_SOLD INITIAL | (gol) | B1301010_NG_011 | 201 303 | 2201 | MAT. DE NATURA OB. DE INVENTAR | (gol) | B1301010_NG_022 | 303.TOATE 401 | 6301 | FURNIZORI NG | (gol) | B1301010_NG_032 | 401.RESTUL 401 | 6302 | FURNIZORI G | (gol) | B1307010_NG_011 | 401.00032 401 | 6302 | FURNIZORI G | (gol) | B1307010_KMGR_022 | 401.00005 401 | 6302 | FURNIZORI G | (gol) | B1307010_RSC_022 | 401.00018 401 | 6302 | FURNIZORI G | (gol) | B1307080_NG_081 | 401.00002 401 | 6302 | FURNIZORI G | (gol) | B1307080_NG_085 | 401.00001 404 | 6301 | FURNIZORI DE IMOBILIZARI NG | (gol) | B1311010_NG_011 | 404.RESTUL 404 | 6302 | FURNIZORI DE IMOBILIZARI G | (gol) | B1311010_NG_022 | 404.0002 404 | 6302 | FURNIZORI DE IMOBILIZARI G | (gol) | B1311010_RIV_022 | 404.00005 404 | 6302 | FURNIZORI DE IMOBILIZARI G | (gol) | B1311010_NG_032 | 404.00012 408 | 6305 | FURNIZORI - FACTURI NESOSITE IMOBILIZARI NG | (gol) | B1311090_NG_011 | PLANCONT ``` Aici `CONT` este codul SAGA complet (inclusiv analitic: `401.00032`, `611.1`) sau un marcaj special (`303.TOATE`, `401.RESTUL`, `PLANCONT`); `CONT2`/`ACONT2` sunt contul sintetic/analitic ROA; `CONT_ALT` = cont alternativ ROA; `COD` = codul suplimentar ROMPETROL (structura `B.../I..._NG_...`). ### 2.2 Unde se foloseste tabela in cele doua .prg Toate locurile (grep `conturi_roa` in `*.prg`): **`saga2roa_danube\saga2roa_danube.prg`** - `:30-34` defineste caile; `:40-44` daca `conturi_roa.dbf` lipseste o creeaza **goala** (`CREATE TABLE (cont C(20), acont C(20), cont2 C(4), acont2 C(4))`); - `:79` `Select Cast(Alltrim(Cont) + '.' + Alltrim(acont) As C(20)) As Cont, cont2, acont2 From conturi_roa` -> cheia de cautare este `cont + '.' + acont`; - `:173-203` ("Corectare conturi analitice") este locul de fond: ``` lcContSintetic = Left(m.lcCont, m.lnPos - 1) lcContAnalitic = Substr(m.lcCont, m.lnPos + 1) lcContToate = m.lcContSintetic + '.TOATE' ... Locate For Alltrim(Cont) = m.lcCont If !Found() Locate For Alltrim(Cont) = m.lcContToate ... Replace cont2 With m.lcCont2, acont2 With m.lcAcont2 ``` **`saga2roa_rompetrol\saga2roa_rompetrol3.prg`** - `:59-73` caile + crearea goala (6 campuri); - `:120-124` citeste tabela si comenteaza rolul coloanelor (`cont = cont saga`, `cont2/acont2 = conturi ROA`, `cont_alt = cont alternativ ROA`, `cod = cod suplimentar ROMPETROL`); - `:126-169` construieste planul ROA (`cPlanROA`): face `Full Join` intre `conturi_roa` si planul SAGA pe `cont`, plus un `Join` special pentru randurile cu `cont = 'PLANCONT'` (`:134-138`), si sterge din plan conturile acoperite de un `X.TOATE` (`:152-157`); - `:244-306` foloseste tabela la corectarea **registrului jurnal**, atat pe debit cat si pe credit (`:262-273` si `:292-303`), cu `X.TOATE` **si** `X.RESTUL` (`:265`, `:295`); - `:572-575` foloseste `cPlanROA` (deci indirect tabela) pentru planul de conturi analitic. In `saga2roa\balanta.prg` (versiune mai veche, firma COFFEE) tabela se foloseste identic ca in danube (`:34`, `:40-44`, `:79`, `:188`); in `saga2roa\balanta.BAK:28` apare chiar o cale fixa `E:\vali\COFFEE\conturi_roa.dbf`. ### 2.3 Ce decide exact tabela Tabela **doar re-codeaza contul**: pentru un cod SAGA dat (`cont`, optional cu analitic) stabileste `cont2` (sinteticul ROA, max 4 car.) si `acont2` (analiticul ROA, max 4 car.). Deci: - **redenumirea sinteticului** (ex. SAGA `409` -> ROA `4091`, `431` -> `4311`); - **analiticul** (`acont2`), care poate fi gol (cont fara analitic in ROA), o cifra, sau alfanumeric; - suporta **marcaje speciale** in coloana `cont`: `X.TOATE` (toate analiticele sinteticului X), `X.RESTUL` (restul, doar in rompetrol), `PLANCONT` (fallback de plan pe `cont2`); - in rompetrol mai decide **denumirea ROA** (`denumire`), **contul alternativ** (`cont_alt`) si **codul suplimentar** (`cod`). Ce **NU** decide tabela: - **nu decide `tip` (D/P)**: tipul vine din planul SAGA (`cPlan`, danube `:81`) si e transportat prin join-uri (`:154`, rompetrol `:572`); tabela nu are coloana de tip. - **nu decide conturile cu parteneri**: listele sunt **hardcodate in .prg** (`lcListaConturiBalP` / `lcListaConturiIregP`, danube `:308-309`, rompetrol `:114-115`). Partenerii vin din `clienti.dbf`/`furnizori.dbf`, nu din tabela. - nu decide sume, doar maparea de coduri. ### 2.4 Completata manual sau generata automat? Dovada: **niciunul dintre .prg nu scrie in tabela**. Singurele operatii pe `conturi_roa` sunt `Use`, `Select`, `Locate` si `CREATE TABLE` (doar daca fisierul lipseste) — vezi danube `:36-44`, `:79`, `:188-199` si rompetrol `:65-73`, `:120`, `:132-138`, `:262-303`. Nu exista `INSERT`/`REPLACE`/`APPEND` catre `conturi_roa` in niciun .prg. Concluzie: tabela este **completata manual** (un nomenclator de corespondenta intretinut de om), posibil pornita dintr-un export (in rompetrol coloana `COD` are coduri structurate de tip `B1203010_NG_011`, care par generate din planul ROMPETROL) si apoi corectata/curatata manual (valori de mana: `acont2` = `X`, `PG`, `PO`, `TXV`, `ANAF`; randuri `PLANCONT`, `TOATE`, `RESTUL`). ## 3. Alte exporturi SAGA folosite in .prg (in afara de balanta) Ambele .prg citesc din directorul SAGA urmatoarele tabele (danube `:30-34`, rompetrol `:59-63`): | Fisier SAGA | Rol | Campuri folosite (din cod) | Exemplu in directoare | |---|---|---|---| | `conturi.dbf` | plan de conturi + solduri | `Cont, tip, denumire, deb_init, deb_prec, cred_init, cred_prec` (danube `:81`, `:103`; balanta.sql:11) | `saga2roa\conturi.dbf` (864 inreg.) | | `registru.dbf` | registru jurnal / note contabile | danube: `cont_d, cont_c, explicatie, cod, suma, Data` (`:94-99`); rompetrol: + `id_nota, id_cont_d, id_cont_c, Curs, suma_val, cod_valuta, ndp, fel_d` (`:232`) | `saga2roa\REGISTRU.DBF` (2619 inreg.) | | `clienti.dbf` | nomenclator clienti (parteneri) | `cod, denumire, cod_fiscal, reg_com, analitic, judet, adresa, tara, is_tva` (+ `banca, cont_banca, tel, email` in rompetrol) | `saga2roa\clienti.dbf` (11 inreg.) | | `furnizori.dbf` | nomenclator furnizori (parteneri) | aceleasi campuri | `saga2roa\furnizori.dbf` (76 inreg.) | Structurile reale ale fisierelor-exemplu (format SAGA mai vechi): - `conturi.dbf` (15 campuri): `CONT C(20), DENUMIRE C(60), TIP C(1), DEB_INIT N(15,2), CRED_INIT N(15,2), DEB_PREC N(15,2), CRED_PREC N(15,2), CONT_INCH C(20), DEB_INIT_V N(14,2), CRED_INIT_ N(14,2), DEB_PREC_V N(14,2), CRED_PREC_ N(14,2), COD_VALUTA C(3), BLOCAT N(1)`. Atentie: aceasta difera de structura documentata in cod (`saga2roa_danube.prg:25`, 35 campuri), care este formatul SAGA C.3.0 folosit de danube — si care coincide cu `balanta.xls`. - `REGISTRU.DBF` (23 campuri): `ID_NOTA N(10), VALIDAT C(1), CONT_D C(20), CONT_C C(20), SUMA N(15,2), COD_VALUTA C(3), CURS N(15,4), SUMA_VAL N(14,2), TVA N(15,2), EXPLICATIE C(70), DATA D(8), ID_CONT_D C(20), ID_CONT_C C(20), CATEGORIE C(16), NDP C(16), FEL_D C(20), TIP C(1), COD C(8), PLAN C(1), SECTOR C(1), SURSA C(1), CAPITOL C(1), ARTICOL C(1)`. - `clienti.dbf` / `furnizori.dbf`: incep cu `COD C(8), DENUMIRE C(64), COD_FISCAL C(20), REG_COM C(16), ANALITIC C(20)` (clienti are 31 campuri, furnizori 27). **Nu exista** exporturi separate de tip "solduri furnizori" sau "solduri clienti" sau "facturi" folosite de aceste .prg. Soldurile per partener se calculeaza in .prg din `registru.dbf` + nomenclatoarele `clienti/furnizori` (danube `:85-92`, `:311-343`), nu se citesc dintr-un fisier dedicat. In directoare exista si fisiere `saga2roa\facturi_jurnal_tva_COFFEE*.xlsx` (coloane `an, luna, cont, tip, numar, data, nume, cod_fiscal, sold, soldtvaneex, baza24, tva24, ...`), dar **niciun .prg nu le refera** (grep pe `facturi_jurnal`, `balanta.xls`, `Balanta de verificare` in toate .prg-urile: zero rezultate). Sunt exporturi folosite de alt flux, nu de `saga2roa*`. ## 4. Raport de lucru 1. **Facut**: cercetare read-only; citit `balanta.xls` (xlrd + conversie LibreOffice), structurile DBF `saga2roa\CONTURI_ROA.DBF` si `saga2roa_rompetrol\conturi_roa.dbf`, toate locurile `conturi_roa` din cele trei .prg, plus structurile `conturi/registru/clienti/furnizori.dbf`. Scris acest fisier. 2. **Verificari**: `openpyxl` pe `.xls` -> `InvalidFileException` (confirmat); `xlrd 2.0.2` OK; `soffice --headless --convert-to xlsx` -> exit 0, fidelitate 342x35. Relatii de sume pe 341/341 randuri (tabel 1.5). Niciun fisier din `saga2roa*` modificat (doar citire); grep `conturi_roa` = 19 potriviri, toate citite; grep exporturi nefolosite = 0. 3. **Nefacut / deschis**: semnificatia setului `_1` din `balanta.xls` (265 randuri zero, 78 identice cu setul principal) nu e dovedibila din fisierele disponibile; perioada la care se refera `balanta.xls` (nu exista in fisier un camp de an/luna); `este_total` nu are echivalent in xls (nu exista rand de totaluri). 4. **Stare periculoasa**: niciuna. Fisierele de proiect nu au fost atinse; temporarele sunt in `Temp\opencode\sursa_saga`; nu s-a facut write-back, nu au ramas procese, nu s-au consumat date.