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
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.CONTsiVANZARI_DETALII.CONT, populate prinpack_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 viewvnom_articole/vnom_articole_crm): coloanaa.conte 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 peNOM_ARTICOLEprinalter 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 seteazapoArticol.Cont = Alltrim(Cont)la:13345din 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): arePRET,PROC_TVAV,ID_VALUTA,PRETFTVA(vazute inadauga_articol_factura, declaratiileV_PRET,V_PROC_TVAVetc. laff_...:5033-5036) — nicio coloana de cont. Cautarea inSCRIPTURI_CLARpentruALTER TABLE CRM_POLITICI_PRET_ART ADD ... CONTnu a gasit nimic. - Nu exista
CONT_VENIT/ID_CONT_VENIT/COD_CONTnicaieri inff_2026_08_06_10_COMUN_PACK_FACTURARE.sql(grep pe fisierul intreg, 17020 linii — zero potriviri) si nici inNOM_ARTICOLE/CRM_POLITICI_PRET_ART(cautat inSCRIPTURI_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 prindo_alege_stoc, care suprascriepoArticol.Contcu valoarea dincursor_gestiuni_articol[_stoc0](punctul 2) — deciSTOC.CONT/NOM_GESTIUNI.CONT, nuNOM_ARTICOLE.CONT. - Negestionabil (
poArticol.gestionabil = 0) saugnScadereStoc = 0: se instantiazafrm_articol_facturadirect (:12871-12880), fara trecere prindo_alege_stoc—poArticol.Contramane cel citit initial la cautarea articolului, adicaNOM_ARTICOLE.CONT(punctul 1, sursa 1), neschimbat.
5. Ce se intampla daca nu se gaseste niciun cont
- Nicio exceptie/
RAISE_APPLICATION_ERRORlegata deCONTin tot pachetul (spre deosebire de cota de TVA, unde lipsa produce explicitFACT-012/FACT-013/FACT-018,ff_...:5151-5153,5184-5187,5203-5206). - Gestionabil, cu stoc:
CONT=STOC.CONT; daca acesta eNULLin stoc, ramaneNULL— 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):
CONTramane ce a venit dinNOM_ARTICOLE.CONT; daca e gol,Nvl(poArt.Cont,'')->''->NULLin Oracle (adauga_articol_factura, sentinela'XXXX'laff_...: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 pentru707/704/706/708inff_2026_08_06_10_COMUN_PACK_FACTURARE.sqlsi inROAFACTURARE\Programe/COMUN\programe\ofacturare_comun.prgnu 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 unpack_contabilitate/pack_note_ct) si urmarirea generarii notei contabile dinVANZARI/VANZARI_DETALII. - Continutul exact al coloanei
NOM_ARTICOLE.CONTpentru 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 deACT/factura, vazut laff_...:191,1885si ininitializeaza_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).