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
This commit is contained in:
128
docs/cercetare/cont_venit_articol_fara_politica.md
Normal file
128
docs/cercetare/cont_venit_articol_fara_politica.md
Normal file
@@ -0,0 +1,128 @@
|
||||
# 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).
|
||||
Reference in New Issue
Block a user