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
9.9 KiB
S5 — testul cu scriere reala in Oracle. Rezultat
Aprobat de Marius (09.08.2026, consemnat in docs\handoff_s5.md). Suita:
COMUN\utile\Teste\editare_factura\test_s5_scriere_reala.prg. Log:
COMUN\utile\Teste\editare_factura\test_s5_scriere_reala_log.txt (rulare 09.08.2026 23:41:32-23:41:35).
Diff: docs\diff_s5_test_scriere_reala.patch.
Rezultat
25 PASS / 0 FAIL, numarate din log (12 la trecerea 1, 13 la trecerea 2). Ultima linie a logului
este done, deci rularea a ajuns la capat. Ambele treceri s-au inchis cu COMMIT real, iar starea
finala a fost verificata independent prin sqlplus, nu din logul testului.
Baseline inainte de pornire: test_incarca_vanzare_din_nota rerulata la 23:27:52 — 5 PASS /
0 FAIL, identic cu asteptarea. Golul de baseline din briefing e inchis.
Ce dovedeste, si nu putea fi dovedit headless
Proba centrala nu vine dintr-o asertie pe starea finala, ci din citirea starii necomise in interiorul tranzactiei, pe aceeasi conexiune, intre pasi. In ambele treceri:
| Moment | VANZARI_DETALII.STERS pe linia stearsa (det=1582) |
|---|---|
| inainte de tranzactie | 1 (trecerea 2) / 0 (trecerea 1, inca nestearsa) |
dupa finalizeaza_modificare_nota, inainte de scrierea liniilor |
0 — resetul a rulat si a inviat linia |
dupa ScrieArticoleFacturaEditate |
1 — idiomul a corectat resetul |
| dupa COMMIT | 1 |
Log: liniile 19-28 (trecerea 1) si 57-67 (trecerea 2). Asta stabileste direct cele doua afirmatii ale
deciziei 38: pack_facturare.actualizeaza_vanzari face UPDATE VANZARI_DETALII SET STERS = 0 pe tot
documentul inainte ca liniile sa fie scrise, si idiomul „marcheaza tot sters, invie ce ramane",
apelat dupa finalizeaza_modificare_nota in aceeasi tranzactie, il repara.
Trecerea 2 e cea care conteaza pentru consecinta 2: documentul a fost reeditat fara nicio
modificare, resetul a inviat din nou det=1582, si linia a ramas totusi stearsa dupa commit.
Fara aceasta trecere, testul nu ar fi atins scopul.
Ordinea testata
Copiata literal din ofacturare_comun.vc2:3799-3837, inclusiv blocul nou de la :3828-3830:
MyDeschideTranzactie() -- _frm_base.vc2:252-265, reprodus inline
OSCRIE_IN_FISIERE(2, .T., .T.) => 1
OSCRIE_IN_FISIERE(0, .T., .T.) => 1
pack_contafin.finalizeaza_modificare_nota => 1
ScrieArticoleFacturaEditate(tvanz.id_vanzare) => 1
MyInchideTranzactie(1) -- COMMIT
OSCRIE_IN_FISIERE, finalizeaza_modificare_nota si ScrieArticoleFacturaEditate au rulat reale,
pe conexiune Oracle reala. Garda blocului nou ("OFACTURARE_EDITARE" $ Upper(Set("Procedure")),
Used('tvanz'), Reccount('tvanz') = 1) a fost satisfacuta in ambele treceri — logul ar fi scris
ATENTIE: blocul ScrieArticoleFacturaEditate NU s-a executat altfel.
Documentul de test si ce s-a facut cu el
id_vanzare = 1049, factura tip 1 din 07.08.2026, id_fact = 8009659, discount = 0, fara linii de
set (id_vanzare_set NULL pe toate), 3 linii active. Nu id_vanzare = 1050, care e documentul pe
care descopera_caz_test.prg il alege pentru cazul FACTURA_ARTICOLE (order by id_vanzare desc).
Garzile ReferinteDocumenteNota si EsteInEFactura intorc 0 pe el, verificat inainte de rulare.
Trecerea 1 — o linie stearsa, o cantitate schimbata, o linie noua:
| Linie | Actiune in tvd |
Stare in Oracle dupa commit |
|---|---|---|
det=1581 |
cantitate 1 -> 2, lmodificat = .T. |
sters=0, cant=2, pret_achizitie=10 (neatins) |
det=1582 |
marcata stearsa (tvd.sters = 1) |
sters=1 |
det=1583 |
neatinsa | sters=0, cant=1 |
| linie noua | id_vanzare_det = 0, cantitate=3, pret=50, pret_achizitie=77.77 |
det=1588 alocat de TRG_VANZARI_DET_BEFOINS, sters=0, pret_achizitie=77.77 |
Trecerea 2 — reeditare fara nicio modificare: nicio linie noua, det=1582 inca sters=1,
det=1588 inca activa cu pret_achizitie = 77.77, totaluri neschimbate.
PRET_ACHIZITIE e verificat pe valori nenule si distincte (10 pe linia existenta careia i s-a
schimbat cantitatea, 77.77 pe linia noua) — nu pe zerouri, care n-ar fi dovedit nimic. La trecerea 2
linia 1588 e deja linie existenta, deci trece prin UPDATE-ul care omite pret_achizitie din
SET: faptul ca a ramas 77.77 e proba directa a omisiunii.
Verificarea independenta prin sqlplus (dupa ambele treceri)
MARIUSM_AUTO/…@ROA_CENTRAL, dupa terminarea procesului VFP:
select cod, sters, id_fact, discount, total_fara_tva, total_tva, total_cu_tva
from vanzari where id_vanzare = 1049;
cod=1140897 sters=0 id_fact=8009659 discount=0 ftva=747.96 tva=157.06 ctva=905.02
select id_vanzare_det, id_articol, cantitate, pret, pret_cu_tva, proc_tvav, id_gestiune,
sters, pret_achizitie, id_utils, validat, custodie, descarcat, diferenta
from vanzari_detalii where id_vanzare = 1049 order by id_vanzare_det;
det=1581 art=315554536 cant=2 pret=302.51 pret_cu_tva=1 proc_tvav=1.21 id_gest=1 sters=0 pret_ach=10 id_utils=-3 validat=0 custodie=0 descarcat=0 diferenta=0
det=1582 art=4294507492 cant=1 pret=121.3 pret_cu_tva=1 proc_tvav=1.21 id_gest=0 sters=1 pret_ach=0 id_utils=-3 validat=0 custodie=0 descarcat=0 diferenta=0
det=1583 art=315554536 cant=1 pret=150 pret_cu_tva=1 proc_tvav=1.21 id_gest=2 sters=0 pret_ach=10 id_utils=-3 validat=0 custodie=0 descarcat=0 diferenta=0
det=1588 art=315554536 cant=3 pret=50 pret_cu_tva=1 proc_tvav=1.21 id_gest=-1000 sters=0 pret_ach=77.77 id_utils=-3 validat=0 custodie=0 descarcat=0 diferenta=0
select sum(cantitate*pret) from vanzari_detalii where id_vanzare = 1049 and sters = 0;
905.02 -- identic cu VANZARI.total_cu_tva dupa recalculeaza_totaluri_vanzari
select cod, count(*), sum(sters) from vact_tot
where an=2026 and luna=8 and cod in (1140887,1140896,1140897) group by cod;
cod=1140887 randuri=10 sterse=10 -- nota de la prima editare, integral stearsa
cod=1140896 randuri=10 sterse=10 -- nota intermediara, integral stearsa
cod=1140897 randuri=10 sterse=0 -- nota curenta, activa
select s.sid from v$transaction t join v$session s on s.saddr = t.ses_addr
where s.username = 'MARIUSM_AUTO';
(0 randuri) -- nicio tranzactie deschisa
Totalurile: 747.96 + 157.06 = 905.02 (identitate verificata), iar 905.02 e chiar suma
cantitate * pret pe liniile active — relatie care se verifica si pe starea de dinaintea editarii
(302.51 + 121.30 + 150.00 = 573.81), pentru ca toate liniile documentului au pret_cu_tva = 1.
Date de test consumate ireversibil
cod-uri realocate:1140887->1140896->1140897.1140897e valoarea curenta; cine reia testul peid_vanzare = 1049trebuie sa citeascacod-ul dinVANZARI, nu sa-l presupuna.det=1582ramanesters=1definitiv — documentul are acum 3 linii active in loc de 3 initiale, dar alta compozitie (1581,1583,1588).det=1588e o linie noua, creata de test, cuid_gestiune = -1000sipret_achizitie = 77.77.- Totalurile documentului:
573.81->905.02. 1049nu e documentul ales dedescopera_caz_test.prgpentruFACTURA_ARTICOLE(acela e1050), si nu apare in listele de excludere ale suitelor existente (1140888/1140885pentrutest_incarca_cursoare,1139934pentrutest_ui_sterge_linie).
Rerularea suitei pe acelasi document e idempotenta ca structura: trecerea 1 ar sterge iar a doua linie activa si ar adauga inca una.
Ce NU acopera testul
inainte_de_do_termin—buton = 1e fortat direct, deci cele cinci validari noi dinomodificari.vc2(cantitate <= 0,id_articolnul,pretnul, zero linii active, avertismentul depret_achizitie = 0) nu au fost executate pe aceasta cale.frm_modific2024nu a fost instantiat: gridul de pe PAGE3, coloana noua de pret de achizitie, editabilitatea per rand si marcajul liniilor de set raman neverificate aici (cad in verificarea pe ecran).- Liniile din seturi — documentul ales nu are
id_vanzare_setnenul pe nicio linie, deci comportamentul agregarii pe seturi (totalurile luate din capul de set, nu din componente) nu e atins. Cifrele de totaluri de mai sus nu spun nimic despre acel caz. - Al doilea punct de intrare (
comun.vc2:2491) nu a fost rulat; agatarea acolo e identica textual, dar testul a trecut doar prin ramura dinofacturare_comun.vc2. - Documentele in valuta si cele cu
discountnenul —1049arediscount = 0siin_valuta = 0, deci parametrul de discount al luirecalculeaza_totaluri_vanzaria fost testat doar cu valoarea0, niciodata cuNULLsi niciodata cu o valoare nenula. - Esecul partial — nicio cale de eroare nu a fost provocata, deci ROLLBACK-ul lantului
(
lnSucces < 0) ramane netestat pe date reale.
Observatii pe cod, fara defecte de raportat
INSERT-ul dinScrieArticoleFacturaEditateomite cinci coloaneNOT NULLdinVANZARI_DETALII(VALIDAT,STERS,DIFERENTA,CUSTODIE,DESCARCAT). Verificat pe dictionar inainte de rulare: toate cinci auDEFAULT 0, deciINSERT-ul e valid, iar linia noua intra activa (STERS = 0) — confirmat pedet=1588. Nu e defect, dar dependenta deDEFAULTnu se vede din cod.id_gestiune = -1000(valoarea folosita deCreeazaPoArticolNouTvd) nu are corespondent inNOM_GESTIUNIsi nu exista constrangere de cheie straina pe coloana —INSERT-ul trece. Inaintea acestui test nu exista nicio linie inVANZARI_DETALIIcu aceasta valoare; acum exista una.- Nu am gasit niciun defect in codul de productie in urma acestui test.
Igiena la iesire
Zero tranzactii deschise (interogare pe v$transaction, 0 randuri), zero procese vfp9.exe ramase
(tasklist), zero commituri git sau SVN. Singurul fisier adaugat de aceasta lucrare in arborele de
lucru este suita de test; COMUN\clase\ofacturare.vc2, omodificari.vc2, actualizeaza_vanzari si
PACK_CONTAFIN nu au fost atinse.