Files
roafacturare/docs/cercetare/cont_venit_articol_fara_politica.md
Marius Mutu d9f5ca4226 docs: planurile, proiectarile si rapoartele de lucru intra in versionare
Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git,
nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de
cercetare pe care se sprijina modificarile din cod. O stergere acolo era
definitiva.

Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au
fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele
fisierelor de test la care se refereau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:17:17 +03:00

8.7 KiB

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):

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).