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
16 KiB
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 NULLla coada, apelantii pozitionali raman neschimbati" are deja precedent activ in codul curent:adauga_articol_factura(V_TAXCODE, V_LOT) siadauga_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 pentrucontabilizeaza_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 finalV_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 lacontabilizeaza_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.