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
216 lines
16 KiB
Markdown
216 lines
16 KiB
Markdown
# Suprafata de regresie — `PACK_FACTURARE`, functia `contabilizeaza_articol`
|
|
|
|
Cercetare pentru modificarea propusa: parametri noi `DEFAULT NULL` la finalul listei lui
|
|
`contabilizeaza_articol`, plus o ramura activata doar cand parametrul e nenul. Ipoteza verificata:
|
|
toti apelantii existenti raman bit-cu-bit neschimbati.
|
|
|
|
Sursa PL/SQL folosita: `D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08\ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql`
|
|
(17217 linii). Marcajul `D:\ROA\ROAFACTURARE\versiune_db.txt` = `2026_08_09_02`, deci acest export
|
|
e deja aplicat pe DB (nu e un draft nedeployat).
|
|
|
|
## 0. Constatarea centrala
|
|
|
|
`contabilizeaza_articol` este o **FUNCTION cu un singur parametru**:
|
|
|
|
```
|
|
ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql:746
|
|
FUNCTION contabilizeaza_articol(detalii_articol VANZARI_DETALII_TEMP%ROWTYPE)
|
|
```
|
|
|
|
Cautare in tot `D:\ROA\DATABASE` (in afara de duplicatele istorice ale pachetului insusi in
|
|
`SCRIPTURI/`, `SCRIPTURI_CLAR/` si `.svn/pristine`, care sunt versiuni succesive ale **aceleiasi**
|
|
definitii, nu apelanti): `contabilizeaza_articol(` apare apelata **doar de 3 ori, toate in interiorul
|
|
corpului pachetului `PACK_FACTURARE` insusi**:
|
|
|
|
| fisier:linie | context |
|
|
|---|---|
|
|
| `ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql:6141` | `pack_facturare.contabilizeaza_articol(tab_detalii(i));` |
|
|
| `ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql:6858` | `pack_facturare.contabilizeaza_articol(tab_detalii(i));` |
|
|
| `ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql:7140` | `pack_facturare.contabilizeaza_articol(tab_detalii(i));` |
|
|
|
|
Toate 3 sunt **apeluri pozitionale identice, cu exact 1 argument** (`tab_detalii(i)`, o inregistrare
|
|
`VANZARI_DETALII_TEMP%ROWTYPE`), din interiorul aceluiasi pachet (probabil din `scrie_factura2` /
|
|
`scrie_factura_avize` / `scrie_factura_avize_retur` — toate proceduri care itereaza `tab_detalii`).
|
|
|
|
**Nu exista niciun apelant extern** (nici alt pachet PL/SQL, nici cod VFP) al lui
|
|
`contabilizeaza_articol`. Cautare directa `pack_facturare\.scrie_nota\b` si
|
|
`pack_facturare\.descarca_gestiune` in tot codul VFP (`.prg`/`.vc2`/`.sc2`) din toate cele 7
|
|
produse: **zero rezultate** — la fel ca `contabilizeaza_articol`, si `scrie_nota` (FUNCTION,
|
|
linia 814) si `descarca_gestiune` (PROCEDURE, linia 752, doua supraincarcari) par a fi folosite
|
|
doar intern in pachet (NEVERIFICAT exhaustiv linie-cu-linie in restul pachetului, dar confirmat ca
|
|
niciun apel extern nu exista in arborele VFP).
|
|
|
|
**Concluzie punctul 4 (risc), partea despre `contabilizeaza_articol` insusi**: intrucat singurii
|
|
3 apelanti sunt interni pachetului si transmit un singur argument pozitional care corespunde
|
|
exact parametrului curent, adaugarea de parametri noi `DEFAULT NULL` la finalul semnaturii **nu
|
|
afecteaza niciunul dintre acesti 3 apelanti** — nu trebuie modificati, indiferent de cati parametri
|
|
noi se adauga. Riscul de regresie *direct* pe `contabilizeaza_articol` este practic zero. Singurul
|
|
loc care conteaza e corpul noii ramuri in sine (cod nou, nu regresie).
|
|
|
|
Ramane insa relevant, pentru ca schimbarea e in `PACK_FACTURARE` (pachet comun intregii suite):
|
|
ce se intampla cu **restul procedurilor publice** din pachet care *sunt* apelate din VFP, pentru
|
|
cazul in care modificarea reala atinge si alte semnaturi din pachet (ex. `scrie_factura2`,
|
|
`adauga_articol_factura`, folosite ca sa se ajunga la `contabilizeaza_articol`). Inventarul de mai
|
|
jos acopera exact aceste cai.
|
|
|
|
## 1. Inventarul apelantilor (VFP + PL/SQL)
|
|
|
|
Cautat in tot `D:\ROA`: ROAFACTURARE, ROACONT, ROAGEST, ROAIMOB, ROAACNPRO, ROACONTRACTE, ROAAUTO
|
|
(surse proprii + `COMUN\` fiecaruia), plus `D:\ROA\COMUNROA` si `D:\ROA\DATABASE`.
|
|
|
|
`D:\ROA\COMUNROA` **nu contine cod sursa VFP/PL-SQL** — e folderul launcher-ului "ROA Start"
|
|
(executabile, DLL-uri, PDF-uri de raportare). Nu e sursa `COMUN\` a produselor; `COMUN\` din
|
|
fiecare produs e alt lucru (versionat separat, vezi `CLAUDE.md`). Zero rezultate acolo, cum era de
|
|
asteptat.
|
|
|
|
### 1.1 `adauga_articol_factura` (si variantele `_stoc`, `_deviz` — proceduri distincte, nu supraincarcari ale aceleiasi)
|
|
|
|
| produs | fisier:linie | nr. parametri trimisi | mod |
|
|
|---|---|---|---|
|
|
| ROAFACTURARE (COMUN) | `COMUN\clase\ofacturare.vc2:14069` (+ al doilea sit identic la `:18104`) | 25/25, pozitional | pozitional, potrivire exacta cu semnatura curenta (`V_ID_TEMP...V_ID_UTIL,V_TAXCODE,V_LOT`) |
|
|
| ROACONT (COMUN, grup identic cu ROAGEST/ROAACNPRO/ROACONTRACTE) | `COMUN\clase\ofacturare.vc2:13853` (+ `:17885`) | 25/25, pozitional | idem |
|
|
| ROAGEST (COMUN) | `COMUN\clase\ofacturare.vc2` (offset ~13853, vezi 2.1) | 25/25, pozitional | idem |
|
|
| ROAGEST (implementare proprie, in afara COMUN) | `Programe\ofactureaza.prg:264` | **24 din 25** (se opreste la `V_ID_UTIL`, omite `V_TAXCODE` si `V_LOT` — ambii au deja `DEFAULT NULL`) | pozitional, se bazeaza deja pe omiterea parametrilor finali cu default |
|
|
| ROAIMOB (COMUN) | `COMUN\clase\ofacturare.vc2` (offset ~13847) | 25/25, pozitional | idem grup |
|
|
| ROAACNPRO (COMUN) | `COMUN\clase\ofacturare.vc2` (offset ~13853, grup identic) | 25/25, pozitional | idem |
|
|
| ROACONTRACTE (COMUN) | `COMUN\clase\ofacturare.vc2` (offset ~13853, grup identic) | 25/25, pozitional | idem |
|
|
| ROAAUTO (COMUN) | `COMUN\clase\ofacturare.vc2:13853` (+ `:17884`) | 25/25, pozitional | idem |
|
|
| ROAACNPRO (implementare proprie) | `Programe\proceduri_acnpro.prg:3382` | apeleaza **`adauga_articol_factura_deviz`**, nu `adauga_articol_factura` — 17+ parametri pozitionali, verificat pana la `V_PRET_CU_TVA` (linia 3399), coada netaiata explicit dar tiparul e identic cu ROAAUTO de mai jos | pozitional |
|
|
| ROAAUTO (implementare proprie) | `Programe\oproceduri_devize.prg:1240` | apeleaza `adauga_articol_factura_deviz`, **19 din 20** parametri (se opreste la `V_TAXCODE`, omite `V_LOT` final, care are `DEFAULT NULL`) | pozitional |
|
|
| ROAFACTURARE (COMUN) | `COMUN\programe\ofacturare_stoc.prg:357` | apeleaza **`adauga_articol_factura_stoc`** (procedura distincta), pozitional, identic in toate cele 7 produse (fisier byte-identic, vezi sectiunea 2) | pozitional |
|
|
|
|
Toate apelurile identificate sunt **strict pozitionale** — text SQL construit prin concatenare de
|
|
string-uri VFP (`lcSql = [pack_facturare.functie(] + Alltrim(Str(...)) + [,] + ...`), nu apel VFP
|
|
cu parametri numiti si nu `=>` (named notation) in PL/SQL. Niciun apelant nu foloseste named
|
|
notation. **Singurul tip de apel care s-ar putea strica la adaugarea de parametri noi la coada ar
|
|
fi un apel pozitional care specifica deja *mai multi* parametri decat lista curenta** (nu e cazul
|
|
gasit) sau un apel care se opreste inainte de un parametru fara `DEFAULT` (nu e cazul: ambele
|
|
proceduri `adauga_articol_factura` si `adauga_articol_factura_deviz` au deja tiparul "coada de
|
|
parametri opsionali cu `DEFAULT NULL`" folosit activ de ROAGEST si ROAAUTO astazi — precedent direct
|
|
ca acest tipar de extensie e deja tolerat de codul existent).
|
|
|
|
### 1.2 `scrie_factura2` / `scrie_factura`
|
|
|
|
Semnatura curenta (linia 640): 17 parametri, **fara niciun `DEFAULT`** — `V_TOTFTVA`...
|
|
`V_PARAMETRU_ADITIONAL` (15 IN), `V_ID_VANZARE` (OUT), `V_CURSOR_VERIFICARE` (OUT, ultimul).
|
|
|
|
| produs | fisier:linie | nr. parametri trimisi | mod |
|
|
|---|---|---|---|
|
|
| ROAFACTURARE (COMUN) | `COMUN\clase\ofacturare.vc2:14345` (+ al doilea sit `:18343`) | **16 din 17** — se opreste la `V_ID_VANZARE` (`?@poDate.nid_vanzare`), omite `V_CURSOR_VERIFICARE` | pozitional |
|
|
| ROACONT/ROAGEST/ROAACNPRO/ROACONTRACTE (COMUN, grup identic) | `COMUN\clase\ofacturare.vc2:14130` (+ `:18124`) | 16 din 17, idem | pozitional |
|
|
| ROAIMOB (COMUN) | `COMUN\clase\ofacturare.vc2:14124` (+ `:18118`) | 16 din 17, idem | pozitional |
|
|
| ROAAUTO (COMUN) | `COMUN\clase\ofacturare.vc2:14129` (+ `:18151`) | 16 din 17, idem | pozitional |
|
|
| ROAGEST (implementare proprie) | `Programe\ofactureaza.prg:307` | 16 din 17, idem (`?poDate.nid_vanzare` e ultimul bind) | pozitional |
|
|
|
|
**Anomalie semnalata, in afara scopului cerut dar relevanta pentru risc general pe pachet**:
|
|
toate sitele active de apel pentru `scrie_factura2` — in toate cele 7 produse, in ambele
|
|
implementari (COMUN si ROAGEST proprie) — transmit **16 din cele 17 parametri declarati**,
|
|
omitand complet ultimul parametru `V_CURSOR_VERIFICARE OUT pack_facturare.cursor_facturare`, care
|
|
**nu are `DEFAULT`** (parametrii `OUT` nu pot avea `DEFAULT` in PL/SQL). Verificat identic in
|
|
ambele exporturi disponibile (`ff_2026_08_06_10` si `ff_2026_08_09_01`), deci nu e o modificare de
|
|
ultima ora. **NEVERIFICAT** cum functioneaza efectiv acest apel in productie (nu am acces la DB
|
|
live) — posibile explicatii: (a) `goExecutor.oExecute(lcSql, lcCursorVerificare)` are o logica
|
|
proprie de completare/legare a cursorului de iesire care nu se vede din text, (b) parametrul are
|
|
de fapt un comportament tolerat de driver-ul Oracle folosit, sau (c) e un bug preexistent,
|
|
netestat de multa vreme pe acest cod-cale. Nu are legatura cu schimbarea propusa la
|
|
`contabilizeaza_articol` (nu se ating parametrii lui `scrie_factura2`), dar merita un test manual
|
|
separat inainte de a presupune ca "toate caile prin pachet functioneaza azi fara eroare".
|
|
|
|
### 1.3 `scrie_nota` / `scrie_nota_import` — fals pozitiv de cautare
|
|
|
|
`scrie_nota_import` gasit in ROACONT (`Clase\oactualizari.vc2:920`, `Programe\ocont2003.prg:785`,
|
|
`Programe\oproceduri_actualizari.prg:189`, `Programe\oproceduri_inchidere.prg:167,335,524`) si in
|
|
ROAGEST (`Programe\inchidere_k.prg:192,257,373,381`) **NU este** functia `pack_facturare.scrie_nota`
|
|
din pachet — e o **procedura VFP locala**, definita in
|
|
`ROAFACTURARE\COMUN\programe\ooperatii_comune.prg:1081` (`PROCEDURE scrie_nota_import(...)`),
|
|
folosita pentru import de note contabile, fara nicio legatura cu `PACK_FACTURARE`. Cautarea directa
|
|
`pack_facturare\.scrie_nota\b` in tot arborele VFP a dat **zero rezultate** (sectiunea 0).
|
|
|
|
### 1.4 `descarca_gestiune`
|
|
|
|
Zero apeluri externe gasite in cod VFP (cautare directa `pack_facturare\.descarca_gestiune`,
|
|
0 rezultate in toate cele 7 produse). Pachetul are doua supraincarcari (liniile 752 si 773),
|
|
probabil folosite doar intern (apelate din `contabilizeaza_articol` conform comentariului de la
|
|
linia 1466: `-- facturare_articole2, contabilizeaza_articol > descarca_gestiune`) —
|
|
**NEVERIFICAT** linie-cu-linie in restul corpului pachetului (17217 linii; nu am parcurs tot
|
|
corpul, doar semnaturile si comentariile relevante), dar nimic din cautarea externa VFP le atinge.
|
|
|
|
## 2. Duplicarea fisierelor `COMUN\`
|
|
|
|
Comparatie pe continut (MD5), nu pe nume, pentru cele 3 fisiere unde s-au gasit apeluri, in cele
|
|
7 copii `COMUN\` (ROAFACTURARE, ROACONT, ROAGEST, ROAIMOB, ROAACNPRO, ROACONTRACTE, ROAAUTO):
|
|
|
|
| fisier | rezultat |
|
|
|---|---|
|
|
| `clase\ofacturare.vc2` | **4 variante distincte**: ROAFACTURARE unic; {ROACONT, ROAGEST, ROAACNPRO, ROACONTRACTE} identice intre ele; ROAIMOB unic; ROAAUTO unic |
|
|
| `programe\ofacturare_stoc.prg` | **identic byte-cu-byte in toate cele 7** (un singur MD5) |
|
|
| `programe\ooperatii_comune.prg` | identic in 6 din 7; **ROAIMOB are o varianta diferita** |
|
|
|
|
Pentru `ofacturare.vc2`, desi hash-urile difera intre cele 4 grupuri (fisierul are ~19000 de linii
|
|
si diferente in alte zone), **structura si continutul exact al apelurilor catre
|
|
`adauga_articol_factura` / `scrie_factura2` sunt identice cuvant-cu-cuvant** intre toate cele 4
|
|
variante — doar offset-ul de linie difera (ex. apelul `adauga_articol_factura` e la linia 14069 in
|
|
ROAFACTURARE, 13853 in grupul ROACONT/ROAGEST/ROAACNPRO/ROACONTRACTE, 13847 in ROAIMOB, 13853 in
|
|
ROAAUTO — text identic, verificat prin grep pe fiecare variant separat). Deci pentru scopul acestei
|
|
schimbari: **e acelasi sit de apel duplicat de 7 ori** (nu 7 implementari independente care ar
|
|
putea diverge in reactia la parametri noi), plus doua implementari suplimentare, independente si
|
|
reale, in ROAGEST (`Programe\ofactureaza.prg`) si ROAACNPRO/ROAAUTO
|
|
(`Programe\proceduri_acnpro.prg` / `Programe\oproceduri_devize.prg`, pentru varianta `_deviz`).
|
|
|
|
`ofacturare_stoc.prg` (contine apelul catre `adauga_articol_factura_stoc`) e literalmente **acelasi
|
|
fisier**, deci 1 singur loc de verificat, nu 7.
|
|
|
|
## 3. Cine emite efectiv facturi prin acest pachet
|
|
|
|
Pe baza apelurilor gasite (nu doar a prezentei fisierului `COMUN\` — care exista in toate 7, dar
|
|
nu inseamna ca produsul chiar il foloseste activ pentru facturare):
|
|
|
|
| produs | ajunge la `pack_facturare` pentru facturare? | dovada |
|
|
|---|---|---|
|
|
| ROAFACTURARE | **Da** | `adauga_articol_factura` + `scrie_factura2` in `COMUN\clase\ofacturare.vc2` |
|
|
| ROACONT | **Da** | acelasi cod COMUN (grup identic) |
|
|
| ROAGEST | **Da**, cu 2 cai | codul COMUN identic + implementare proprie in `Programe\ofactureaza.prg` (posibil cod mai vechi/alternativ, coexista) |
|
|
| ROAIMOB | **Da** | varianta proprie de `ofacturare.vc2`, dar acelasi tipar de apel |
|
|
| ROAACNPRO | **Da**, cu 2 cai | codul COMUN (grup identic) + `adauga_articol_factura_deviz` in `Programe\proceduri_acnpro.prg` |
|
|
| ROACONTRACTE | **Da** | codul COMUN (grup identic) — nu are cale proprie suplimentara gasita |
|
|
| ROAAUTO | **Da**, cu 2 cai | varianta proprie de `ofacturare.vc2` + `adauga_articol_factura_deviz` in `Programe\oproceduri_devize.prg` |
|
|
|
|
Niciun produs din cele 7 nu pare sa aiba `COMUN\clase\ofacturare.vc2` ca fisier mort — toate cele
|
|
7 au si `Programe\` propriu (in afara de COMUN) care instantiaza clasa relevanta (NEVERIFICAT
|
|
exhaustiv ca fiecare produs chiar *instantiaza si ruleaza* clasa din `ofacturare.vc2` la runtime —
|
|
verificarea s-a facut pe prezenta apelului in sursa, nu pe flux de executie live). **Toate cele 7
|
|
produse sunt in aria de regresie** pentru orice modificare de pachet care afecteaza
|
|
`adauga_articol_factura*` sau `scrie_factura2` — nu doar ROAFACTURARE.
|
|
|
|
## 4. Verdict de risc
|
|
|
|
**Pentru `contabilizeaza_articol` insusi** (obiectul cerut al schimbarii): risc **practic zero**.
|
|
Cei 3 apelanti sunt toti interni pachetului, toti pozitionali cu un singur argument identic cu
|
|
semnatura actuala (`detalii_articol VANZARI_DETALII_TEMP%ROWTYPE`). Adaugarea de parametri noi
|
|
`DEFAULT NULL` la coada nu schimba niciunul dintre aceste 3 apeluri — nu necesita nicio modificare
|
|
in cele 3 sit-uri, indiferent de produs. Nu exista niciun apel extern (nici alt pachet PL/SQL, nici
|
|
VFP din niciun produs) care sa poata fi afectat, pentru ca nu exista niciun apel extern, punct.
|
|
|
|
**Pentru pachetul `PACK_FACTURARE` in ansamblu**, daca schimbarea reala atinge si alte proceduri
|
|
publice (nu doar `contabilizeaza_articol`):
|
|
- Tiparul "adauga parametri `DEFAULT NULL` la coada, apelantii pozitionali raman neschimbati"
|
|
**are deja precedent activ** in codul curent: `adauga_articol_factura` (V_TAXCODE, V_LOT) si
|
|
`adauga_articol_factura_deviz` (4 parametri finali cu DEFAULT) sunt deja apelate de unii
|
|
producatori omitand parametrii finali optionali (ROAGEST, ROAAUTO). Deci genul de schimbare
|
|
propus e sigur *daca* regula "toti parametrii noi sunt strict la coada si toti au DEFAULT" se
|
|
respecta — ceea ce e exact ipoteza declarata pentru `contabilizeaza_articol`.
|
|
- **Singurul risc real identificat in tot pachetul** nu vine din schimbarea propusa, ci e o
|
|
anomalie preexistenta, independenta: apelurile la `scrie_factura2` (in toate cele 7 produse) omit
|
|
deja parametrul final `V_CURSOR_VERIFICARE` (OUT, fara DEFAULT posibil). Daca cineva "repara" acea
|
|
nepotrivire ca parte a aceleiasi lucrari de mentenanta pe pachet, *acolo* ar trebui atinsi toti
|
|
apelantii din sectiunea 1.2 — dar asta e o schimbare diferita de cea descrisa (parametri noi la
|
|
`contabilizeaza_articol`), nesolicitata explicit aici. O semnalez ca sa nu fie confundata cu
|
|
"toti apelantii raman neschimbati" pentru intregul pachet, daca scopul lucrarii se extinde.
|
|
- Nu s-a gasit niciun apel cu named notation (`=>`) nicaieri in cele 7 produse pentru functiile
|
|
cerute — deci nu exista risc de reordonare-parametri-pe-nume la adaugarea de parametri noi.
|
|
|
|
**Lista de produse pe care trebuie rulata regresia** (din sectiunea 3): toate cele 7 —
|
|
ROAFACTURARE, ROACONT, ROAGEST, ROAIMOB, ROAACNPRO, ROACONTRACTE, ROAAUTO — pentru ca toate emit
|
|
efectiv facturi prin acest pachet, chiar daca modificarea la `contabilizeaza_articol` insusi nu
|
|
impune, teoretic, nicio schimbare de cod la niciunul dintre ele.
|