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
352 lines
20 KiB
Markdown
352 lines
20 KiB
Markdown
# 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 <temp> 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.<cod analitic SAGA>`.
|
|
|
|
### 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.
|