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
327 lines
18 KiB
Markdown
327 lines
18 KiB
Markdown
# Raport exporturi SAGA noua (Firebird) - cercetare read-only
|
|
|
|
Lane: `exporturi-saga-noua`. Sarcina de cercetare, fara modificari de cod.
|
|
Fisiere analizate in `D:\ROA\IMPORT2ROA\solduri2roa\exemple\`:
|
|
`saga-sqlite-balanta-09-2026.xlsx`, `saga-sqlite-balanta-09-2026.xls`,
|
|
`saga-sqlite-furnizori-09-2026.xlsx`, `saga-sqlite-furnizori-facturi-un-furnizor-09-2026.xlsx`.
|
|
Baza explorata: `D:\SAGA250909\0001\CONT_BAZA.FDB` (Firebird, NU SQLite).
|
|
Temporarele de lucru: `C:\Users\mmari\AppData\Local\Temp\opencode`. Nu s-a modificat nimic in
|
|
`D:\SAGA250909` (doar SELECT, tranzactie read-only). Fisierele nu sunt SQLite; numele contin
|
|
"sqlite" dar continutul sunt foi de calcul obisnuite (vezi mai jos).
|
|
|
|
---
|
|
|
|
## PARTEA A - structura celor 4 exporturi
|
|
|
|
### A.1 `saga-sqlite-balanta-09-2026.xlsx`
|
|
|
|
- O singura foaie: `Sheet1`. Dimensiune `A1:AI11` = **11 randuri x 35 coloane**
|
|
(1 antet + 10 randuri de date). Fara foi ascunse, fara celule fuzionate.
|
|
- Antetul este pe **randul 1**. Datele incep la randul 2 si se termina la randul 11.
|
|
- **NU exista rand de totaluri** (ultimul rand este o data: contul `6461`).
|
|
|
|
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 | | |
|
|
|
|
Primele 8 randuri de date (rand Excel 2..9; sumele relevante, D/C separate):
|
|
|
|
| Rand | A cont | B denumire | D tip | E/F init | G/H prec | K/L rulaj | O/P total | Q/R fin | AG | AH | AI |
|
|
|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
| 2 | 371 | MARFURI | A | 0 / 0 | 2615 / 0 | 0 / 0 | 2615 / 0 | 2615 / 0 | 0 | 1 | 1 |
|
|
| 3 | 401 | FURNIZORI | P | 0 / 0 | 0 / 3164.15 | 0 / 0 | 0 / 3164.15 | 0 / 3164.15 | 0 | 1 | 2 |
|
|
| 4 | 421 | PERSONAL - SALARII DATORATE | P | 0 / 2574 | 0 / 2574 | 0 / 0 | 0 / 2574 | 0 / 2574 | 0 | 0 | 3 |
|
|
| 5 | 4315 | CONTR. DE ASIGURARI SOCIALE | P | 0 / 938 | 0 / 938 | 0 / 0 | 0 / 938 | 0 / 938 | 0 | 0 | 4 |
|
|
| 6 | 4316 | CONTR. DE ASIGURARI SOCIALE DE SANATATE | P | 0 / 375 | 0 / 375 | 0 / 0 | 0 / 375 | 0 / 375 | 0 | 0 | 5 |
|
|
| 7 | 436 | CONTR. ASIGURATORIE DE MUNCA | P | 0 / 84 | 0 / 84 | 0 / 0 | 0 / 84 | 0 / 84 | 0 | 0 | 6 |
|
|
| 8 | 4426 | TVA DEDUCTIBILA | A | 0 / 0 | 549.15 / 0 | 0 / 0 | 549.15 / 0 | 549.15 / 0 | 0 | 1 | 7 |
|
|
| 9 | 444 | IMPOZITUL PE VENITURI DE NATURA SALARIILOR | P | 0 / 163 | 0 / 163 | 0 / 0 | 0 / 163 | 0 / 163 | 0 | 0 | 8 |
|
|
|
|
Ultimele 3 randuri (rand Excel 9..11):
|
|
|
|
| Rand | A cont | B denumire | D tip | E/F init | G/H prec | O/P total | Q/R fin | AG | AH | AI |
|
|
|---|---|---|---|---|---|---|---|---|---|---|
|
|
| 9 | 444 | IMPOZIT... SALARIILOR | P | 0 / 163 | 0 / 163 | 0 / 163 | 0 / 163 | 0 | 0 | 8 |
|
|
| 10 | 641 | CHELT. CU SALARIILE PERSONALULUI | A | 4050 / 0 | 4050 / 0 | 4050 / 0 | 4050 / 0 | 0 | 0 | 9 |
|
|
| 11 | 6461 | CHELT. CU CONTRIB. ASIGURATORIE PT. MUNCA A SALARIATILOR | A | 84 / 0 | 84 / 0 | 84 / 0 | 84 / 0 | 0 | 0 | 10 |
|
|
|
|
**Tipuri reale de valori** (openpyxl):
|
|
- `CONT` (A) = **text** (str), ex. `Sheet1!A2` = `'371'`. Nu e numar. `DENUMIRE` (B) = text.
|
|
- `TIP` (D) = text (`'A'` sau `'P'`); `CATEGORIE` (C) = gol pe toate randurile.
|
|
- Sumele (E..R si `_1`) = **numerice** (float la citire, dar stocate ca numar).
|
|
- `ANALITIC` (AG) = boolean (`False` pe toate randurile); `VALIDAT` (AH), `LINIE` (AI) = intregi.
|
|
|
|
**Cont sintetic vs analitic**: in acest fisier **nu exista niciun cont analitic** - toate cele 10
|
|
coduri sunt fara punct (371, 401, 421, 4315, 4316, 436, 4426, 444, 641, 6461), iar `ANALITIC`
|
|
(AG) este 0/False pe toate randurile. Deci din acest fisier singur nu se poate arata cum arata un
|
|
rand analitic. Formatul analitic se vede in schimb in exportul de furnizori:
|
|
`saga-sqlite-furnizori-09-2026.xlsx!H2` = `401.00002` (text). Rezulta: sintetic = cod fara punct
|
|
(`401`), analitic = `sintetic.cod` (`401.00002`). Daca si coloana `ANALITIC` distinge ceva ramane
|
|
neclar (aici e 0 pe toate randurile, inclusiv pe cele care in vechiul export VFP aveau 1 - vezi B).
|
|
|
|
**Coloane de sume** (maparea ceruta):
|
|
|
|
| Rol | Coloane |
|
|
|---|---|
|
|
| precedent D / C | `DEB_PREC` (G) / `CRED_PREC` (H) |
|
|
| rulaj D / C | `RULAJ_D` (K) / `RULAJ_C` (L) |
|
|
| total D / C | `TOTAL_DEB` (O) / `TOTAL_CRED` (P) |
|
|
| sold D / C | `FIN_D` (Q) / `FIN_C` (R) |
|
|
|
|
`TOTAL_*` sunt **sume cumulative** (precedent + rulaj), NU solduri; soldul final este `FIN_*`.
|
|
Exista in plus: `DEB_INIT/CRED_INIT` (E/F) = sold la inceputul anului, `SOLD_IN_D/SOLD_IN_C`
|
|
(I/J) = sold la inceput de perioada, `RULAJT_D/RULAJT_C` (M/N) = rulaj total cumulat.
|
|
|
|
Relatiile cerute, verificate pe toate cele 10 randuri (toleranta 0.005):
|
|
|
|
| Verificare | Rezultat |
|
|
|---|---|
|
|
| `TOTAL_DEB = DEB_PREC + RULAJ_D` | **10/10 OK** |
|
|
| `TOTAL_CRED = CRED_PREC + RULAJ_C` | **10/10 OK** |
|
|
| `FIN_D - FIN_C = TOTAL_DEB - TOTAL_CRED` | **10/10 OK** |
|
|
| (suplimentar) `SOLD_IN_D - SOLD_IN_C = DEB_PREC - CRED_PREC` | 10/10 OK |
|
|
| (suplimentar) acelasi set `_1` (S..AF) identic cu setul principal | 10/10 OK |
|
|
|
|
Nu exista rand care sa pice. Setul `_1` (S..AF) este **identic** cu setul principal pe toate
|
|
randurile - consecvent cu observatia din `raport_sursa_saga_xlsx.md` (pe conturile sintetice `_1`
|
|
este copia setului principal).
|
|
|
|
### A.2 `saga-sqlite-balanta-09-2026.xls` vs `.xlsx`
|
|
|
|
Fisierele au **acelasi continut** (aceleasi 35 coloane in aceeasi ordine si aceleasi 10 randuri de
|
|
date, cu aceleasi valori). Semnaturi: `.xls` = OLE2/BIFF8 (`d0cf11e0a1b11ae1...`), `.xlsx` =
|
|
OOXML/ZIP (`PK..`). Diferente constatate:
|
|
|
|
| Aspect | `.xls` | `.xlsx` |
|
|
|---|---|---|
|
|
| Nume foaie | `xl` | `Sheet1` |
|
|
| Antet | litere mici (`cont`, `denumire`, ...) | litere mari (`CONT`, `DENUMIRE`, ...) |
|
|
| `CATEGORIE` goala | sir vid `''` | celula `None` |
|
|
| Restul valorilor | identice | identice |
|
|
|
|
Comparatia programatica (valori numerice + text case-insensitive) a dat **0 diferente** in afara
|
|
celor de mai sus. Deci: acelasi export, doar alt format si alta conventie de nume/case.
|
|
|
|
### A.3 `saga-sqlite-furnizori-09-2026.xlsx`
|
|
|
|
- O foaie `Sheet1`, `A1:J2` = **2 randuri x 10 coloane** (1 antet + **1 rand de date**).
|
|
- Antet pe randul 1; datele pe randul 2. **Nu exista rand de totaluri.**
|
|
- Coloane: A `COD`, B `DENUMIRE`, C `NE_INIT`, D `TOTAL`, E `INCASARI`, F `NE_FIN`,
|
|
G `NEACHITAT`, H `ANALITIC`, I `SOLD`, J `GRUPA`.
|
|
|
|
Randul de date (rand 2): `A2='00002'`, `B2='TRANSPORT'`, `C2=3164.15`, `D2=0`, `E2=0`,
|
|
`F2=3164.15`, `G2=3164.15`, `H2='401.00002'`, `I2=3164.15`, `J2` gol.
|
|
|
|
Tipuri: `COD` (A) si `ANALITIC` (H) = **text**; `DENUMIRE` (B) = text; sumele C..G, I numerice;
|
|
`GRUPA` (J) gol.
|
|
|
|
**Ce identifica partenerul**: in acest export partenerul este identificat prin:
|
|
- `COD` = codul SAGA al tertului (`00002`), text;
|
|
- `ANALITIC` = contul analitic `401.00002` (text) - **da, apare codul contului analitic**;
|
|
- `DENUMIRE` = `TRANSPORT`.
|
|
Exportul **NU contine codul fiscal** (desi tabelul `FURNIZORI` din baza il are - vezi Partea C).
|
|
Deci legatura cu partenerul se face pe `COD` si/sau pe `ANALITIC`, nu pe cod fiscal.
|
|
|
|
### A.4 `saga-sqlite-furnizori-facturi-un-furnizor-09-2026.xlsx`
|
|
|
|
- O foaie `Sheet1`, `A1:J2` = **2 randuri x 10 coloane** (1 antet + **1 rand de date**).
|
|
- Antet pe randul 1; datele pe randul 2. **Nu exista rand de totaluri.**
|
|
- Coloane: A `DATA`, B `NR`, C `CONT_FUR`, D `NE_INIT`, E `TOTAL`, F `PLATI`, G `NE_FIN`,
|
|
H `NEACHITAT`, I `INF_SUPLM`, J `DATA_DOC`.
|
|
|
|
Randul de date (rand 2): `A2=2026-07-02` (datetime), `B2='123'` (text), `C2='401.00002'` (text),
|
|
`D2=3164.15`, `E2=0`, `F2=0`, `G2=3164.15`, `H2=3164.15`, `I2` gol, `J2` gol.
|
|
|
|
**Campuri de factura prezente**: numar (`NR`), data operare (`DATA`), cont furnizor (`CONT_FUR`),
|
|
sold initial neachitat (`NE_INIT`), total factura (`TOTAL`), plati (`PLATI`), neachitat final
|
|
(`NE_FIN`), neachitat (`NEACHITAT`), informatii suplimentare (`INF_SUPLM`), data document
|
|
(`DATA_DOC`).
|
|
**Lipsesc**: **data scadenta** si **valuta** (desi in baza, tabelul de intrari, are `SCADENT` si
|
|
`COD_VALUTA` - exportul nu le include). Nu exista nici o coloana de serie.
|
|
**Legatura de furnizor**: prin `CONT_FUR = 401.00002` (acelasi analitic ca in A.3) - nu exista
|
|
`COD` de tert in acest export.
|
|
|
|
---
|
|
|
|
## PARTEA B - comparatie cu ce stim deja
|
|
|
|
### B.1 Cu CSV-ul din PDF (`extract_balanta.py`)
|
|
|
|
CSV-ul din PDF are coloanele:
|
|
`pagina, cont, denumire, prec_d, prec_c, rulaj_d, rulaj_c, total_d, total_c, sold_d, sold_c, este_total`.
|
|
|
|
Corespondenta cu exportul nou:
|
|
|
|
| CSV (PDF) | Export nou (balanta) |
|
|
|---|---|
|
|
| `cont` | `CONT` (A) |
|
|
| `denumire` | `DENUMIRE` (B) |
|
|
| `prec_d` / `prec_c` | `DEB_PREC` (G) / `CRED_PREC` (H) |
|
|
| `rulaj_d` / `rulaj_c` | `RULAJ_D` (K) / `RULAJ_C` (L) |
|
|
| `total_d` / `total_c` | `TOTAL_DEB` (O) / `TOTAL_CRED` (P) |
|
|
| `sold_d` / `sold_c` | `FIN_D` (Q) / `FIN_C` (R) |
|
|
| `pagina` | **lipseste** |
|
|
| `este_total` | **lipseste** |
|
|
|
|
**Se poate produce acelasi CSV din exportul SAGA nou?** Pentru partea de conturi + cele 8 sume:
|
|
**da**, maparea e 1:1 si relatiile sunt aceleasi (verificate 10/10 la A.1). Ce **lipseste**:
|
|
- `pagina` - proprie PDF-ului, depinde de paginare, nu are echivalent in export;
|
|
- `este_total` - exportul **nu are deloc randuri de totaluri**; in CSV-ul din PDF acest marker
|
|
distinge randurile "Total sume clasa N" si randul "Totaluri:", care in export nu exista
|
|
(ar trebui calculate, nu citite);
|
|
- setul de conturi poate diferi: in exemplul nou apar doar conturile cu miscare, la nivel sintetic.
|
|
|
|
### B.2 Cu vechiul export SAGA-pe-VFP (`raport_sursa_saga_xlsx.md`, sectiunea 1)
|
|
|
|
Structura este **identica** cu cea documentata acolo pentru `balanta.xls` (VFP): aceleasi **35 de
|
|
coloane, in aceeasi ordine, cu aceleasi nume** (`cont..fin_c`, `_1`, `analitic`, `validat`,
|
|
`linie`). Singurele diferente observate:
|
|
- numele foii: `xl`/`Sheet1` (nou) vs `balanta` (VFP);
|
|
- case-ul antetului (mic in `.xls`, mare in `.xlsx`) - in raportul VFP antetul era cu litere mici;
|
|
- valoarea coloanei `analitic`: in fisierul VFP vechi era **1 pe toate randurile**, in exportul nou
|
|
este **0/False pe toate randurile** (dar aici toate randurile sunt sintetice - nu se poate
|
|
decide daca diferenta e de semantica sau doar de firma/perioada).
|
|
|
|
Concluzie: un convertor care stie deja sa citeasca exportul VFP (`conturi.dbf` / `balanta.xls`)
|
|
poate citi **neschimbat** si exportul SAGA nou Firebird - layout-ul de coloane este acelasi.
|
|
|
|
Observatie importanta (dovada in Partea C): desi layout-ul e identic cu tabelul `CONTURI`,
|
|
valorile din export **nu sunt un dump brut** al tabelului - soldurile stocate in `CONTURI` sunt 0,
|
|
iar cifrele din export corespund agregarii registrului de note (`REGISTRU`). Deci exportul e un
|
|
raport calculat, nu o citire directa de tabel.
|
|
|
|
---
|
|
|
|
## PARTEA C - baza Firebird `CONT_BAZA.FDB` (explorare, NUMAI CITIRE)
|
|
|
|
### C.1 Ce client/server exista pe masina
|
|
|
|
- Server Firebird **instalat si pornit**: serviciul `FirebirdServerFirebird30_Saga`
|
|
(`"C:\Program Files\Firebird\Firebird30_Saga\firebird.exe" -s Firebird30_Saga`, LocalSystem).
|
|
- `C:\Program Files\Firebird\Firebird30_Saga\` contine: `isql.exe`, `fbclient.dll`,
|
|
`firebird.exe`, `gsec.exe`, `gbak.exe`, `gfix.exe`, `fbsvcmgr.exe`, plus `plugins\engine12.dll`
|
|
(Firebird 3.0). In plus SAGA are clientul in `D:\SAGA250909\FbClient\` (`fbclient.dll`,
|
|
`plugins\engine12.dll`, `legacy_auth.dll`, etc.).
|
|
- Versiunea raportata de baza: **3.0.7** (via `rdb$get_context('SYSTEM','ENGINE_VERSION')`).
|
|
- Port de ascultare: doar **3060** (`RemoteServicePort = 3060` in `firebird.conf`; pe 3050 nu
|
|
asculta nimic). O conexiune TCP la `localhost/3060` ajunge la baza dar raspunde cu eroare de
|
|
autentificare (`Your user name and password are not defined`) - deci parola SYSDBA nu e
|
|
`masterkey`/`masterke` la server.
|
|
|
|
### C.2 Cum s-a reusit conectarea (read-only)
|
|
|
|
- S-a instalat `firebird-driver` (`py -m pip install firebird-driver` -> 2.0.3) si s-a indicat
|
|
explicit clientul: `fdb.load_api(r"C:\Program Files\Firebird\Firebird30_Saga\fbclient.dll")`.
|
|
- Conexiunea **embedded** la fisier a functionat:
|
|
`fdb.connect(database=r"D:\SAGA250909\0001\CONT_BAZA.FDB", user="SYSDBA", password="masterkey",
|
|
charset="WIN1250", no_gc=True)` -> **OK, versiune 3.0.7**. Embedded accepta `masterkey`/`masterke`
|
|
(autentificare locala/trusted); TCP la 3060 nu.
|
|
- Respectarea "NUMAI CITIRE": s-a folosit o **tranzactie read-only**
|
|
(`fdb.tpb(Isolation.READ_COMMITTED, access_mode=TraAccessMode.READ)`) si `no_gc=True`; s-au rulat
|
|
**doar SELECT**-uri, apoi `rollback`. Nu s-a scris, nu s-a facut ALTER, nu s-a copiat baza.
|
|
|
|
### C.3 Ce contine baza
|
|
|
|
**191 de tabele**, **0 view-uri**. Cele relevante pentru conversie:
|
|
|
|
| Tabel | Randuri | Ce este |
|
|
|---|---|---|
|
|
| `CONTURI` | 586 | planul de conturi + solduri stocate |
|
|
| `FURNIZORI` | 2 | furnizori |
|
|
| `CLIENTI` | 0 | clienti |
|
|
| `INTRARI` / `INTRD` | 0 / 1 | intrari = facturi furnizori (antet / detaliat) |
|
|
| `IESIRI` / `IES_DET` | 0 / - | iesiri = facturi clienti |
|
|
| `REGISTRU` | 8 | registru de note contabile (miscarile pe conturi) |
|
|
| `FFACT` | 5 | **NU** e tabel de facturi - e tabela de formulare/layout de tiparire |
|
|
|
|
Structuri (campurile cheie; tipurile sunt cele din `rdb$relation_fields`/`rdb$fields`):
|
|
|
|
**`CONTURI`** (586 randuri) - plan de conturi:
|
|
`CONT` VARCHAR(20) NOT NULL, `DENUMIRE` VARCHAR(64), `TIP` CHAR(1),
|
|
`DEB_INIT`/`CRED_INIT`/`DEB_PREC`/`CRED_PREC` NUMERIC(15,2),
|
|
`CONT_INCH` VARCHAR(20), `DEB_INIT_V`/`CRED_INIT_V`/`DEB_PREC_V`/`CRED_PREC_V` NUMERIC(14,2),
|
|
`COD_VALUTA` VARCHAR(3), `BLOCAT` SMALLINT.
|
|
Exemplu de rand: `('1012', 'CAPITAL SUBSCRIS VARSAT', 'P', 0.00, 0.00, 0.00, 0.00, ...)`.
|
|
Atentie: `CONT` e **text** (se citeste ca sir, deci `401.00002` nu se strica);
|
|
in acest exemplu **toate soldurile stocate sunt 0** - vezi C.4.
|
|
|
|
**`FURNIZORI`** (2 randuri):
|
|
`COD` VARCHAR(8) NOT NULL, `DENUMIRE` VARCHAR(64), `COD_FISCAL` VARCHAR(20), `REG_COM` VARCHAR(16),
|
|
`ANALITIC` VARCHAR(20), `GRUPA` VARCHAR(16), plus adresa/IBAN/agent/etc.
|
|
Randuri: `('00001','ROMFAST','','401.00001')`, `('00002','TRANSPORT','1879855','401.00002')`.
|
|
|
|
**`CLIENTI`** (0 randuri): aceeasi structura de tert ca `FURNIZORI`
|
|
(`COD`, `DENUMIRE`, `COD_FISCAL`, `ANALITIC`, `GRUPA`, adresa, agent, limita credit, e-Factura...).
|
|
|
|
**`INTRARI`** (0) / **`INTRD`** (1 rand) - facturi furnizori:
|
|
`ID_INTRARE`, `NR_NIR`, `NR_INTRARE`, `COD`, `DENUMIRE`, `CONT_FUR`, `DATA`, `SCADENT`,
|
|
`NEACHITAT` NUMERIC(15,2), `NEACHITAT_VAL`, `COD_VALUTA`, `CURS`, `VAL_VAL`, `VAL_LEI`,
|
|
`BAZA_TVA`, `TOTAL`, `TVA`, `TRANSP_VAL/LEI`, `VALIDAT`, `DATA_DOC`, `INF_SUPLM`, ...
|
|
Randul existent: `ID_INTRARE=24, NR_INTRARE='123', COD='00001', CONT_FUR='401.00001',
|
|
DATA=2026-07-02, SCADENT=NULL, TOTAL=0, NEACHITAT=0, COD_VALUTA='EUR'`.
|
|
|
|
**`IESIRI`** (0) - facturi clienti:
|
|
`NR_IESIRE`, `ID_IESIRE`, `COD`, `DENUMIRE`, `CONT_CLI`, `DATA`, `SCADENT`, `TOTAL`,
|
|
`NEACHITAT`, `BAZA_TVA`, `TVA`, `COMANDA`, `DATA_DOC`, `INF_SUPLM`, `IS_EF`, ...
|
|
|
|
**`REGISTRU`** (8 randuri) - notele contabile (sursa miscarilor):
|
|
`ID_NOTA`, `CONT_D` VARCHAR(20), `CONT_C` VARCHAR(20), `SUMA` NUMERIC(15,2), `DATA`,
|
|
`EXPLICATIE`, `VALIDAT`, `COD`, `TIP_O`, `PK`. Aici se vede cheia: contul analitic apare in
|
|
`CONT_D`/`CONT_C` ca text (`401.00002`), iar `%` este un cont colector.
|
|
|
|
Deci: planul de conturi cu solduri = `CONTURI`; furnizorii = `FURNIZORI`; clientii = `CLIENTI`;
|
|
facturile furnizorilor = `INTRARI`/`INTRD`; facturile clientilor = `IESIRI`/`IES_DET`.
|
|
|
|
### C.4 Dovada ca exporturile sunt rapoarte calculate, nu dump de tabel
|
|
|
|
- `CONTURI` are 585 randuri utile (fara randul `%`) si **0 randuri cu sold stocat nenul**
|
|
(`deb_prec/cred_prec/deb_init/cred_init` = 0 pentru toti), si totusi exportul de balanta are
|
|
cifre. Deci cifrele vin din agregarea `REGISTRU` la data raportului.
|
|
- Potriviri exacte: `REGISTRU` are pe `371` debit `2615.00` -> exportul are `371` `DEB_PREC=2615`;
|
|
pe `401.00002` credit `2615.00 + 549.15 = 3164.15` -> exportul are `401` `CRED_PREC=3164.15`
|
|
si exportul de furnizori `SOLD=3164.15`. In plus, miscarea veche pe `641` este din 2025-11-30 ->
|
|
exportul are `DEB_INIT=4050` (sold la inceput de an), ceea ce confirma semantica
|
|
`DEB_INIT/CRED_INIT` = inceput de an si `DEB_PREC/CRED_PREC` = inceput de perioada.
|
|
- In exportul de balanta contul apare ca `401` (sintetic), iar `401.00002` (analitic) nu apare ca
|
|
rand separat -> exportul ruleaza analiticele in sinteticul lor (sau a fost cerut la nivel
|
|
sintetic). Regula exacta de includere sintetic/analitic **nu se poate stabili** din acest singur
|
|
exemplu.
|
|
|
|
### C.5 Ce NU se poate stabili
|
|
|
|
- Nu se poate confirma exact din ce tabel/se selecteaza randul de factura din exportul
|
|
`saga-sqlite-furnizori-facturi-un-furnizor`: exportul are `CONT_FUR='401.00002'` si `NR='123'`,
|
|
dar singurul rand din `INTRD` are `CONT_FUR='401.00001'` (ROMFAST), tot cu `NR_INTRARE='123'`.
|
|
Coloanele `DATA/NR/CONT_FUR/TOTAL/NEACHITAT/INF_SUPLM/DATA_DOC` exista in `INTRD`, dar
|
|
`NE_INIT`, `PLATI`, `NE_FIN` **nu exista ca si coloane** in baza - sunt calculate (sold initial,
|
|
plati, sold final). Potrivirea exacta a randului nu se poate face cu datele disponibile.
|
|
- Semnificatia coloanei `ANALITIC` din balanta (0/False la toate randurile) nu se poate stabili.
|
|
|
|
---
|
|
|
|
## Stare si verificari
|
|
|
|
- Nu s-a modificat niciun fisier din proiect sau din `D:\SAGA250909`; nu s-a facut write-back;
|
|
nu s-a comis nimic (git/svn). Baza Firebird a fost accesata doar cu SELECT, in tranzactie
|
|
read-only, `no_gc=True`, fara copiere.
|
|
- Verificari rulate: relatiile de sume pe balanta (10/10 OK pentru toate cele trei relatii cerute);
|
|
comparatia `.xls` vs `.xlsx` (0 diferente reale); listarea tabelelor (191 tabele, 0 view-uri) si
|
|
a structurilor cheie; potrivirea soldurilor export vs `REGISTRU`.
|
|
- Temporare: `C:\Users\mmari\AppData\Local\Temp\opencode\` (`analiza.py`, `verif.py`, `fbtest*.py`,
|
|
`fblist.py`, `fbcols.py`, `fbdata.py`, `fbsearch.py` + dump-uri txt). Nu sunt in proiect.
|
|
- Fara stare periculoasa: niciun `.vc2` editat fara write-back, niciun proces lasat pornit, fara
|
|
date de test consumate.
|