Files
roafacturare/docs/cercetare/pack_auto_actualizeaza_deviz.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

211 lines
13 KiB
Markdown

# Cercetare: `pack_auto.actualizeaza_deviz` si riscul asupra devizului ROAAUTO la #13
Scop: `plan_13_unificare_formular_facturare.md` vrea sa permita adaugarea unei linii noi pe o
factura deja emisa, inclusiv pe facturile ROAAUTO (`tip = -12`). Intrebarea: ce se intampla cu
**devizul** din ROAAUTO cand factura primeste o linie pe care devizul nu o stie. Punctul de
plecare a fost `pack_auto.actualizeaza_deviz`, apelat din
`D:\ROA\ROAAUTO\Programe\oproceduri_devize.prg:1310`, al carei corp nu fusese citit inainte de
aceasta cercetare.
Continua `roaauto_facturi.md` si `roaauto_articole_lista_preturi.md` (deja citite, nu reiau
constatarile lor: acelasi `PACK_FACTURARE`, `VANZARI_DETALII_TEMP` -> `VANZARI_DETALII`,
`tip=-12`, liniile sintetice `-100000..-100008` plus liniile reale "Alte servicii", editorul
`frm_modific2024` read-only, `oviz_devize.vc2:4536` blocheaza modificarea dupa `nrfact`).
## 1. Unde e definit `PACK_AUTO`
`D:\ROA\DATABASE\SCRIPTURI_CLAR\<an>\<luna>\ff_..._AUTO_PACK_AUTO.sql` — 14 versiuni istorice
gasite (2013-2026). Sursa de adevar folosita (cea mai recenta, dupa conventia deja aplicata in
`roaauto_facturi.md` pentru `PACK_FACTURARE`):
**`D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\03\ff_2026_03_31_02_AUTO_PACK_AUTO.sql`** (1804 linii,
antet "17.03.2026 / robert / creare procedura setOptiuneInchidere").
Semnatura in spec: `:74-76`. Corp: `:692-733`.
## 2. Ce face `actualizeaza_deviz`, pas cu pas
Corpul complet (`ff_2026_03_31_02_AUTO_PACK_AUTO.sql:692-733`):
```sql
procedure actualizeaza_deviz(tnProcTvav IN NUMBER,
tcSirIdOrdl IN VARCHAR2,
tnIdSet IN NUMBER) is
lcSeparator VARCHAR2(1) := ',';
lnIdFact DOCUMENTE.ID_DOC%TYPE;
begin
-- nu iau pack_contafin.get_idfact pentru ca s-ar putea sa am id_fact de la incasare, nu de la factura
SELECT MAX(ID_FACT)
INTO lnIdFact
FROM ACT
WHERE COD = pack_contafin.get_cod()
AND SCD NOT LIKE '5%';
UPDATE DEV_ORDL
SET PROC_TVAV = tnProcTvav
WHERE ID_ORDL IN (SELECT X FROM table(charn2collection(tcSirIdOrdl, lcSeparator)));
UPDATE /*+ INDEX(RUL IDX_RUL_001) */ RUL
SET ID_FACT = lnIdFact
WHERE ID_SET <> 229
AND ID_LUCRARE IN (SELECT ID_LUCRARE FROM DEV_ORDL
WHERE ID_ORDL IN (SELECT X FROM table(charn2collection(tcSirIdOrdl, lcSeparator))));
IF tnIdSet IN (31003, 31004, 31005, 31006, 31007, 31011) THEN
UPDATE NOM_LUCRARI
SET ID_FACT = lnIdFact
WHERE ID_LUCRARE IN (SELECT ID_LUCRARE FROM DEV_ORDL
WHERE ID_ORDL IN (SELECT X FROM table(charn2collection(tcSirIdOrdl, lcSeparator))));
END IF;
end actualizeaza_deviz;
```
Trei pasi, toti indexati pe `ID_ORDL`/`ID_LUCRARE` (comanda/lucrarea din ROAAUTO), **niciunul pe
`VANZARI`/`VANZARI_DETALII`**:
1. Citeste `lnIdFact` = cel mai mare `ID_FACT` din `ACT` pentru "codul" curent de sesiune
(`pack_contafin.get_cod()`), excluzand notele de incasare (`SCD NOT LIKE '5%'`) — comentariul
din cod explica de ce: la momentul apelului pot exista in `ACT` atat o nota de incasare cat si
nota/factura propriu-zisa, si vrea explicit factura.
2. `UPDATE DEV_ORDL SET PROC_TVAV = tnProcTvav` — scrie cota de TVA pe comenzile din
`tcSirIdOrdl` (lista CSV de `ID_ORDL`, despartita cu `charn2collection`).
3. `UPDATE RUL SET ID_FACT = lnIdFact WHERE ID_SET <> 229 AND ID_LUCRARE IN (...)` — leaga
inapoi randurile din `RUL` (jurnalul de manopera/materiale al lucrarii, folosit si la
`frm_inchidere_productie.do_executa` pentru totalul pe sectii, vezi §4) de documentul creat.
4. Doar daca `tnIdSet` e unul din `{31003,31004,31005,31006,31007,31011}`, acelasi `ID_FACT` se
scrie si pe `NOM_LUCRARI` (nomenclatorul de lucrari).
**Nu exista niciun `SELECT`/`UPDATE` pe `VANZARI` sau `VANZARI_DETALII` in `actualizeaza_deviz`**
si, verificat suplimentar, **in tot pachetul `PACK_AUTO`** (grep pe `VANZARI` in cele 1804 linii
ale fisierului: 0 potriviri). Deci raspunsul direct la intrebarea din brief: procedura **nu
recalculeaza niciun total al devizului din liniile facturii** — nu citeste liniile facturii deloc.
Ce face e sa "stampileze" `ID_FACT` (documentul de vanzare/nota abia creat) pe randurile din `RUL`
si `NOM_LUCRARI` legate de comenzile din `tcSirIdOrdl`, plus sa actualizeze cota TVA pe
`DEV_ORDL`. E o legatura *deviz -> document*, nu un recalcul *document -> total deviz*.
## 3. Ce se intampla cu o linie de factura pe care devizul nu o are
Raspunsul e neted, pentru ca premisa intrebarii (un `SUM` peste `VANZARI_DETALII`) nu exista in
cod: **procedura nu vede deloc liniile facturii**, nici cele cunoscute (sintetice
`-100000..-100008`), nici cele reale (nomenclator, cazul "Alte servicii" din raportul anterior),
nici una noua adaugata din afara. Ea opereaza exclusiv pe `ID_ORDL`/`ID_LUCRARE` (identitatea
comenzii ROAAUTO), primite ca parametru `tcSirIdOrdl` — nu deriva niciodata acest identificator
din continutul `VANZARI_DETALII`.
Precedentul "Alte servicii" (articole reale, `id_articol` pozitiv, cf.
`roaauto_articole_lista_preturi.md` §2) confirma exact acest comportament pe date deja live: acele
linii coexista cu liniile sintetice in `VANZARI_DETALII` de multa vreme, fara ca
`actualizeaza_deviz` sa faca vreo distinctie — pentru ca nu se uita la `VANZARI_DETALII` deloc.
**Consecinta pentru #13**: adaugarea unei linii noi pe `VANZARI_DETALII` pentru o vanzare
`tip=-12` nu poate "dezechilibra" ce scrie `actualizeaza_deviz`, pentru simplul motiv ca aceasta
procedura nu depinde de continutul `VANZARI_DETALII`. Nu exista *eroare*, nu exista *ignorare
explicita* — e o absenta totala de citire.
Important insa (nuanta pe care intrebarea din brief o presupune implicit gresit): asta **nu**
inseamna ca "devizul" (asa cum e prezentat operatorului in ROAAUTO) ar reflecta automat noua
linie. Totalul devizului afisat in `oviz_devize.vc2` e calculat client-side din `RUL` (vezi
`crsTotaluri`, construit cu un `SELECT SUM(...) FROM RUL ... GROUP BY ID_SECTIE` in
`oviz_devize.vc2:7816-7823`, in `frm_inchidere_productie.do_executa`) si din cursoarele
`crsdeviz`/`crsalteserv` calculate in `oproceduri_devize.prg` la momentul facturarii — niciodata
din `VANZARI_DETALII`. Deci o linie adaugata ulterior pe factura **nu va aparea niciodata** in
totalul devizului asa cum il calculeaza ROAAUTO, indiferent daca `actualizeaza_deviz` mai ruleaza
sau nu — pur si simplu acel total nu are o sursa care sa citeasca `VANZARI_DETALII`.
## 4. Cand e apelata
Cautare in ROAAUTO (`Grep` pe `actualizeaza_deviz`, cele trei aparitii de cod, plus istoric
`.??2`) si in tot `D:\ROA\DATABASE\SCRIPTURI_CLAR` (niciun alt pachet Oracle nu o apeleaza — grep
pe `actualizeaza_deviz` in tot arborele SCRIPTURI_CLAR gaseste doar fisierele care *definesc*
`PACK_AUTO`/vechiul `PACK_DEVIZE`, nu vreun apel extern):
Trei puncte de apel, toate in VFP, niciunul intr-un trigger/job Oracle:
1. **La emiterea facturii** — `oproceduri_devize.prg:1310`, in acelasi bloc `lcSql` cu
`pack_facturare.scrie_in_vanzari` (linia 1302), cu `tnIdSet` dinamic (`lnIdSet`, calculat mai
sus in `factureaza_deviz`). Comentariu la linia 1311: *"am scos apelul catre
`pack_devize.dev_completeaza_rul`; e inclus in `actualizeaza_deviz`"* — confirma ca functia a
inlocuit o procedura mai veche cu acelasi scop (legare RUL -> document).
2. **`frm_inchidere_productie.do_executa`** (`oviz_devize.vc2:7896`, clasa la `:7143`) — cu
`tnIdSet` **fix, 31007** — apelata dupa ce formularul de **inchidere productie** scrie o
*nota contabila* (`oscrie_in_fisiere()` peste cursorul `actactan`, `:7889`), **nu** o factura;
nu apeleaza `pack_facturare.scrie_in_vanzari`, deci nu atinge `VANZARI` deloc pe acest drum.
3. **`frm_inchidere_regie.do_executa`** (`oviz_devize.vc2:8907`, clasa la `:8093`) — identic,
`tnIdSet` fix **31006**, pentru inchiderea de **regie** (overhead), tot printr-o nota
contabila, nu o factura.
Deci `actualizeaza_deviz` nu e specifica facturarii — e o operatie generica *"leaga
comenzile/lucrarile astea de ultimul document contabil creat pentru codul curent"*, refolosita si
la doua fluxuri de inchidere interna care nu produc facturi de vanzare. In niciunul din cele trei
cazuri nu e re-declansata mai tarziu (nu exista un al patrulea apel, nici din UI, nici din
schedule/trigger Oracle) — deci editarea ulterioara a unei facturi deja emise (obiectivul #13) nu
ar re-invoca automat aceasta procedura, pentru ca nimic din codul citit o cheama in afara celor 3
puncte de mai sus.
## 5. Alte proceduri din `PACK_AUTO` care citesc `VANZARI`/`VANZARI_DETALII` pentru un deviz
**Niciuna.** Grep pe `VANZARI` in intregul fisier `ff_2026_03_31_02_AUTO_PACK_AUTO.sql` (1804 de
linii, tot pachetul, nu doar `actualizeaza_deviz`) — 0 potriviri. `PACK_AUTO` nu are nicio
dependenta de tabelele de vanzari/facturare; toata legatura cu partea financiara trece prin `ACT`
(note contabile) si `DEV_ORDL`/`RUL`/`NOM_LUCRARI` (structura proprie ROAAUTO).
Singurul loc care **citeste** liniile facturii pentru re-listarea unui deviz e in afara
`PACK_AUTO`, pe partea VFP: `relisteaza_factura_deviz`
(`D:\ROA\ROAAUTO\Programe\oproceduri_devize.prg:1516-1576`, mentionata in raportul anterior).
Verificat acum sursa: interogheaza direct view-urile COMUN `fact_vfacturi`
(`:1531`, filtrat `WHERE cod = ...`) si **`fact_vfacturi_detalii`** (`:1564`,
`select * from fact_vfacturi_detalii where id_vanzare = <poDate.nid_vanzare>` — fara alt filtru).
View-ul e definit in
`D:\ROA\DATABASE\SCRIPTURI_CLAR\2024\06\ff_2024_06_04_01_COMUN_FACTURARE.sql:8-94`:
`create or replace view fact_vfacturi_detalii as select ... from vanzari_detalii a left join
nom_articole b ... ` — un simplu wrapper peste `VANZARI_DETALII` cu join-uri de denumire, **fara
nicio clauza `WHERE`** care sa restranga la id-uri de articol cunoscute sau la liniile
"originale" ale devizului.
**Consecinta**: o linie noua inserata in `VANZARI_DETALII` pentru acel `id_vanzare` **va aparea
automat** la o re-listare/re-tiparire ulterioara prin `relisteaza_factura_deviz` — comportament
asteptat de la un view neconditionat, nu o stricare. Nu exista risc de eroare sau de excludere pe
acest drum; riscul (daca exista) e doar de **asteptare a utilizatorului**: factura retiparita va
arata linia noua, dar ecranul de deviz din ROAAUTO (total calculat din `RUL`, §3) nu o va arata
niciodata, pentru ca nu deriva din `VANZARI_DETALII`.
## 6. Concluzie operationala pentru #13
**Da, se poate adauga o linie pe o vanzare `tip=-12` fara sa "strice" `pack_auto.actualizeaza_deviz`
sau vreo alta procedura din `PACK_AUTO`** — pentru ca niciuna din ele nu citeste `VANZARI`/
`VANZARI_DETALII`; nu exista mecanism Oracle-side care sa recalculeze/verifice totalul devizului
din liniile facturii, deci nu exista nimic de dezechilibrat la acel nivel. Nu e nevoie de niciun
apel Oracle suplimentar din partea ROAFACTURARE ca sa "anunte" ROAAUTO despre linia noua —
`actualizeaza_deviz` n-ar face nimic util cu acea informatie oricum (opereaza pe `ID_ORDL`, nu pe
linii de factura).
Ce **nu** rezolva aceasta concluzie, si ramane responsabilitatea planului #13, nu a acestei
proceduri:
- **Desincronizare de afisare, nu de date**: totalul devizului aratat in ROAAUTO
(`oviz_devize.vc2`, calculat din `RUL`/cursoarele de facturare) nu va reflecta niciodata o
linie adaugata ulterior direct pe `VANZARI_DETALII` — nici azi (cu liniile "Alte servicii"),
nici cu o linie noua din editorul unificat. Daca produsul vrea ca devizul sa "stie" de linia
noua vizual, ar trebui cod nou in ROAAUTO (nu exista azi), nu un apel catre `actualizeaza_deviz`.
- **Reprintarea** (`relisteaza_factura_deviz`) va include automat linia noua (§5) — de verificat
daca asta e comportamentul dorit de produs sau o suprindere pentru operatorul ROAAUTO.
- Confirmat si direct in cod ROAFACTURARE: `Grep` pe `pack_auto` in
`D:\ROA\ROAFACTURARE` (inclusiv `COMUN`) nu gaseste nicio referinta in cod, doar in `docs\`
(planul #13 si aceste rapoarte) — azi ROAFACTURARE nu apeleaza deloc `PACK_AUTO`, confirmand ca
nu exista deja o presupunere ascunsa de sincronizare intre cele doua.
## Neverificat
- Ce reprezinta exact tabelele `ACT`/`RUL`/`NOM_LUCRARI`/`DEV_ORDL` la nivel de schema completa
(DDL/comentarii) — inteles doar din felul in care sunt folosite in cod, nu dintr-un dictionar de
date citit explicit.
- Daca vreun raport fiscal/SAF-T (mentionat generic in `ff_2022_03_24_01_COMUN_SAFT.sql`, nedeschis)
agrega `VANZARI_DETALII` intr-un mod care ar fi afectat de o linie noua pe `tip=-12` — in afara
ariei `PACK_AUTO` cerute, nu a fost investigat.
- Daca `frm_incasare_finala.do_recalculeaza_total`/`calculeaza_total` (`oviz_devize.vc2:6494,6700`)
ar putea fi reconciliate manual de un operator ca sa "vada" o linie adaugata ulterior — nu am
citit corpul acestor metode, doar semnalul ca exista.
- Istoricul complet al celorlalte 13 versiuni `AUTO_PACK_AUTO.sql` nu a fost comparat linie cu
linie cu cea din 2026-03 — presupun (conform conventiei deja aplicate pentru `PACK_FACTURARE`)
ca cea mai recenta e sursa de adevar pentru comportamentul curent din productie.