# Contul inregistrat pe o linie de vanzare, cu/fara politica de pret **Raspuns scurt**: nu exista, nicaieri in codul cercetat (VFP `ofacturare*` + Oracle `pack_facturare`), un "cont de venit" (707/704/706/708) legat de linia de factura. Singurul cont propagat pe linie e coloana `CONT` din `VANZARI_DETALII`/`VANZARI_DETALII_TEMP` (varchar 4 caractere) — si aceasta e contul de **gestiune/stoc** (371 marfuri, 301-303 materii prime, 357 custodie etc.), folosit pentru descarcarea de gestiune, nu un cont de venit. El **nu vine din politica de pret** (`CRM_POLITICI_PRET_ART` nu are coloana `CONT` — verificat, nicio `CREATE`/`ALTER TABLE CRM_POLITICI_PRET_ART ADD CONT` in `D:\ROA\DATABASE\SCRIPTURI_CLAR`), ci din nomenclatorul de articole si din lotul de stoc ales. Asta inseamna ca "adaugarea directa din nomenclator, fara politica de pret" **nu schimba mecanismul de completare a acestui camp** — el oricum nu depinde de politica azi. Ramane neverificat unde/daca se decide efectiv un cont de venit 707/704/706/708 pentru nota contabila (nu e in `pack_facturare`). ## 1. Unde e stocat / de unde se ia campul `CONT` - **Tabel/coloana tinta**: `VANZARI_DETALII_TEMP.CONT` si `VANZARI_DETALII.CONT`, populate prin `pack_facturare.adauga_articol_factura` / `_deviz` / `_stoc` (`ff_2026_08_06_10_COMUN_PACK_FACTURARE.sql:4690,4711,4735` / `:4761,4792,4814` / `:5013,5247,5277`). - **Sursa 1 — `NOM_ARTICOLE.CONT`** (prin view `vnom_articole`/`vnom_articole_crm`): coloana `a.cont` e adusa in grila de cautare a articolelor, `COMUN\programe\ocautare.prg:1671,1683,1687` (`caut_articol`, folosit de formularul unificat de facturare la alegerea articolului). Confirmata ca fiind pe `NOM_ARTICOLE` prin `alter table NOM_ARTICOLE add ... A.CONT ...` (`D:\ROA\DATABASE\SCRIPTURI_CLAR\2019\12\ff_2019_12_20_02_COMUN.sql:12`, coloana veche, prezenta din 2009-2010). - **Sursa 2 — `STOC.CONT`** (contul de pe lotul de stoc): `pack_facturare.cursor_gestiuni_articol` (`ff_...:4358-4452`) — `SELECT ... A.CONT ... FROM STOC A2 ...` — folosit cand articolul e **gestionabil** si se alege un lot din stoc (`frm_facturare_articole.do_alege_stoc`, `COMUN\clase\ofacturare.vc2:13239-13345`, care seteaza `poArticol.Cont = Alltrim(Cont)` la `:13345` din cursorul intors de Oracle). - **Sursa 3 — `NOM_GESTIUNI.CONT`**: fallback cand nu exista lot de stoc, vezi punctul 2 (`cursor_gestiuni_articol_stoc0`). - **Politica de pret** (`CRM_POLITICI_PRET_ART`): are `PRET`, `PROC_TVAV`, `ID_VALUTA`, `PRETFTVA` (vazute in `adauga_articol_factura`, declaratiile `V_PRET`, `V_PROC_TVAV` etc. la `ff_...:5033-5036`) — **nicio coloana de cont**. Cautarea in `SCRIPTURI_CLAR` pentru `ALTER TABLE CRM_POLITICI_PRET_ART ADD ... CONT` nu a gasit nimic. - Nu exista `CONT_VENIT`/`ID_CONT_VENIT`/`COD_CONT` nicaieri in `ff_2026_08_06_10_COMUN_PACK_FACTURARE.sql` (grep pe fisierul intreg, 17020 linii — zero potriviri) si nici in `NOM_ARTICOLE`/`CRM_POLITICI_PRET_ART` (cautat in `SCRIPTURI_CLAR`). ## 2. Cum se decide efectiv la scriere — `cursor_gestiuni_articol` / `_stoc0` Cand articolul e gestionabil si exista stoc, `cursor_gestiuni_articol` (`ff_...:4358-4452`) ia contul direct de pe lotul de stoc: ``` SELECT 0 AS ALES, A.ID_GESTIUNE, A.CANTITATE, A.CONT, ... FROM (SELECT ... A2.CONT, ... FROM STOC A2 ...) A LEFT JOIN NOM_GESTIUNI B ON A.ID_GESTIUNE = B.ID_GESTIUNE ``` — `A.CONT` = `STOC.CONT`, fara nicio alta sursa, fara fallback (daca lotul de stoc are `CONT` `NULL`, ramane `NULL`). Cand articolul e gestionabil dar **nu exista stoc** (optiunea `RF_FACTURARE_FARA_STOC = 1`), `cursor_gestiuni_articol_stoc0` (`ff_...:4459-4558`) foloseste un lant `NVL2` explicit (`ff_...:4472-4473`): ```sql CAST(NVL2(B.CONT, B.CONT, NVL2(A.CONT, A.CONT, '371')) AS VARCHAR2(4)) AS CONT, ``` unde `B` = `NOM_GESTIUNI` (contul implicit al gestiunii) si `A.CONT` = ultimul cont vazut in `STOC` pentru articol (an curent/precedent). Ordinea reala: **cont gestiune -> ultimul cont din stoc -> `'371'` hardcodat**. Acesta e singurul loc din pachet cu un `COALESCE`/`NVL2` in cascada pe `CONT`, si singurul cu un default hardcodat. `adauga_articol_factura` (varianta apelata din `frm_facturare_articole.do_scrie_articole`, params la `ff_...:4998-5024`) **nu recalculeaza** contul — il primeste ca parametru `V_CONT` si il scrie ca atare (`V_CONT2 := V_CONT` daca `V_CONT <> 'XXXX'`, altfel ramane `NULL` — `ff_...:5044-5046`, `V_CONT2` la INSERT `ff_...:5277`). `'XXXX'` e sentinela VFP pentru "fara valoare" — vezi `COMUN\clase\ofacturare.vc2:6963,7123,7992` (`poDateGestiuneDest.Cont = Nvl(loCauta.Cont,[XXXX])`). Aceeasi logica de trecere directa, fara recalcul, e in `adauga_articol_factura_deviz` (`ff_...:4675-4745`, `V_CONT` scris direct in `CONT`, fara sentinela `'XXXX'`, fara `NVL`). ## 3. Precedent ROAAUTO — "Alte servicii" (articol din nomenclator brut, fara politica de pret) Cursorul `lcCursorDeviz` (`ROAAUTO\Programe\oproceduri_devize.prg:880-887`) **nu are coloana `Cont`**. `crsvanztemp` are `Cont c(4)` (`:1190-1192`) dar `INSERT INTO crsvanztemp(...)` de la `:1201-1206` **nu o include** in lista de coloane si nici in `SELECT`-ul sursa — ramane la valoarea implicita de camp caracter needatat, adica blank. La apel: ``` ['] + Alltrim(Nvl(poArticol.Cont,'')) + [',] + ... -- oproceduri_devize.prg:1256 ``` trimite un literal `''` (gol) catre `adauga_articol_factura_deviz(..., V_CONT IN NUMBER, ...)` (`ff_...:4690`). Un literal `''` convertit implicit la `NUMBER` devine `NULL` in Oracle; `V_CONT` ajunge `NULL` si e scris direct in `VANZARI_DETALII_TEMP.CONT` (`ff_...:4735`), fara `NVL`, fara fallback. **Concluzie**: liniile "Alte servicii" din ROAAUTO (articol real, fara politica de pret, pret tastat manual — vezi `roaauto_articole_lista_preturi.md`) ajung cu `CONT = NULL` in Oracle. Nu exista in cod niciun raspuns explicit "cont pentru articol fara politica" — rezultatul e pur si simplu absenta valorii, nu o valoare calculata. ## 4. Gestionabile vs. negestionabile Difera **calea**, nu neaparat sursa initiala: - **Gestionabil** (`poArticol.gestionabil <> 0`): `frm_facturare_articole.do_adauga_articol` (`COMUN\clase\ofacturare.vc2:12871-12896`) cere alegerea unui lot/gestiune prin `do_alege_stoc`, care suprascrie `poArticol.Cont` cu valoarea din `cursor_gestiuni_articol[_stoc0]` (punctul 2) — deci `STOC.CONT`/`NOM_GESTIUNI.CONT`, nu `NOM_ARTICOLE.CONT`. - **Negestionabil** (`poArticol.gestionabil = 0`) sau `gnScadereStoc = 0`: se instantiaza `frm_articol_factura` direct (`:12871-12880`), fara trecere prin `do_alege_stoc` — `poArticol.Cont` ramane cel citit initial la cautarea articolului, adica `NOM_ARTICOLE.CONT` (punctul 1, sursa 1), neschimbat. ## 5. Ce se intampla daca nu se gaseste niciun cont - Nicio exceptie/`RAISE_APPLICATION_ERROR` legata de `CONT` in tot pachetul (spre deosebire de cota de TVA, unde lipsa produce explicit `FACT-012`/`FACT-013`/`FACT-018`, `ff_...:5151-5153,5184-5187,5203-5206`). - **Gestionabil, cu stoc**: `CONT` = `STOC.CONT`; daca acesta e `NULL` in stoc, ramane `NULL` — fara fallback (punctul 2, `cursor_gestiuni_articol`). - **Gestionabil, fara stoc** (`RF_FACTURARE_FARA_STOC=1`): fallback pana la `'371'` hardcodat (punctul 2, `cursor_gestiuni_articol_stoc0`). - **Negestionabil / articol adaugat fara trecere prin gestiune** (inclusiv "Alte servicii" ROAAUTO): `CONT` ramane ce a venit din `NOM_ARTICOLE.CONT`; daca e gol, `Nvl(poArt.Cont,'')` -> `''` -> `NULL` in Oracle (`adauga_articol_factura`, sentinela `'XXXX'` la `ff_...:5044-5046`) — linie scrisa **fara cont**, fara eroare. ## Neverificat - Unde (daca undeva) se determina un **cont de venit propriu-zis** (707/704/706/708) pentru nota contabila a vanzarii — nu e in `pack_facturare`; grep pentru `707`/`704`/`706`/`708` in `ff_2026_08_06_10_COMUN_PACK_FACTURARE.sql` si in `ROAFACTURARE\Programe`/`COMUN\programe\ofacturare_comun.prg` nu a gasit nimic. Probabil intr-un pachet de contabilitate/note contabile separat, neinclus in scriptul analizat — ar necesita identificarea acelui pachet (posibil in ROACONT sau un `pack_contabilitate`/`pack_note_ct`) si urmarirea generarii notei contabile din `VANZARI`/`VANZARI_DETALII`. - Continutul exact al coloanei `NOM_ARTICOLE.CONT` pentru articole de tip "serviciu" (daca e populata cu conturi de cheltuiala/productie 6xx/3xx sau lasata goala) — ar necesita o interogare pe schema Oracle live, in afara bugetului acestei cercetari (doar cod static disponibil). - Rolul exact al `ID_VENCHELT`/`NOM_VENIT_CHELTUIELI` (parametru la nivel de `ACT`/factura, vazut la `ff_...:191,1885` si in `initializeaza_date_factura`) — pare o clasificare venituri/cheltuieli la nivel de document, nu un cont de venit per linie; nu am urmarit consumatorul lui pana la capat (posibil in raportare, nu in inregistrarea contabila).