Curatenie ceruta dupa inchiderea lui #6. Folderul cercetare\ NU se putea sterge in bloc: plan_13 se sprijina pe el cu 85 de trimiteri, deci e baza de dovezi a planului aflat in lucru. Impartirea: - 14 cercetari trans-proiect trec in COMUN\docs\cercetare\ - valuta si curs, TVA/VANZARI, consumatorii VANZARI din toata suita, integrarile #10/#11/#12, watchdog VFP, proiectarea Oracle a lui S5, view-ul VVANZARI_ARTICOLE. Nu sunt ale ROAFACTURARE, iar #10/#11/#12 se reiau chiar din ele. - 20 de rapoarte de executie ale lui #6, nereferite de nimic viu, sterse. - 91 raman, neatinse. Trimiterile catre handoff-urile si diff-urile intermediare deja desfiintate au fost curatate peste tot (39 de fisiere): 50 catre handoff-uri, 37 catre diff-uri aplicate, plus caile celor mutate in COMUN. Zero trimiteri rupte ramase. progres.md preia rolul de predare: ce ramane din #6 (cele sase documente parazite, cele doua esecuri reale din S8 pe factura din aviz), cifrele de test citite din log, si cele doua capcane de mediu platite - .FXP vechi executat in locul .prg-ului, si GETFONT() care atarna un formular instantiat fara goApp. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
12 KiB
S4 runda 3, sub-blocul B partea 2 — adaugarea de linii + doua goluri, 09.08.2026
Continuarea lui rec_s4_runda3b.md (stergerea logica, GATA) si handoff intermediar (sters)
(cercetarea de contract, predata). Aici: adaugarea de linii prin dialogul frm_articol_factura,
plus inchiderea celor doua goluri lasate de partea 1.
1. Adaugarea de linii — IMPLEMENTATA
Selectorul de articol (decizia 34)
Nu s-a scris niciun selector nou. Cautand un "picker simplu pe nomenclator, fara stoc, fara
politica de preturi", am gasit caut_articol() (COMUN\programe\ocautare.prg:1636) — functie
GLOBALA deja folosita in toata aplicatia, deja inregistrata app-wide
(Programe\roafacturare.prg:191, SET PROCEDURE TO ocautare ADDITIVE). Cauta pe view-ul
vnom_articole (denumire/codmat/codbare), fara nicio legatura cu crsarticole/stocul de la
compunere — satisface exact decizia 34. Returneaza un obiect cu .id_articol, .denumire,
.codmat, .um, .cont etc.
Contractul frm_articol_factura — confirmat pe cod, nu doar reluat din cercetarea veche
poDatefoloseste doar 3 proprietati in tot corpul clasei (ofacturare.vc2:1108-2657):tip,in_valuta,dataact— verificat din nou cu grep pe intervalul exact.gnScadereStoc = 0bypasseaza complet verificarea de stoc (Do Caselaofacturare.vc2:13804-echivalent in clasafrm_articol_factura), conform deciziei 15.do_initializeaza_articol/do_modifica(ofacturare.vc2:13618/13746) NU apartinfrm_articol_factura— sunt metode pefrm_facturare_articole(clasa de compunere), verificat cuvfp_symbols.ps1 -Where. Nu au putut fi reutilizate direct (clasa nu-mi apartine oricum); s-a construit in schimbCreeazaPoArticolNouTvd, dupa modelul PROVEN in productie dinCOMUN\utile\Teste\facturare_pret_cu_tva\test_pret_cu_tva_dialog.prg(49 proprietati numerice + 11 caracter, arraylaPropN/laPropC) — acelasi test trece 38/38 pe #7, deci setul de proprietati e dovedit suficient pentru tot ce cerefrm_articol_factura(Init + toate handlerele +inainte_de_do_termin).
Ce s-a scris
COMUN\programe\ofacturare_editare.prg — functie noua CreeazaPoArticolNouTvd(tnIdArticol, tcCodmat, tcDenumire, tcUm, tcCont): construieste poArticol gol cu toate proprietatile
cerute. Valori implicite: cantitate=1, gestionabil=0 (fara stoc), tip_valuta=0 (RON),
preturi_cu_tva=0, proc_tvav=.NULL. (Init-ul dialogului alege singur cota TVA standard curenta
din jtva_coloane — nu inventez eu o cota), id_gestiune=-1000 (sentinela "fara gestiune", ca la
do_initializeaza_articol), id_ctr=.NULL..
COMUN\clase\omodificari.vc2 (frm_modific2024):
- Buton nou
cmdAdaugaArticolpepgfArticole.PAGE3(Left=175, Width=170, Top=0, langacmdStergeArticol— grid-ul ramaneTop=26, Height=81, neschimbat; inca incape un al treilea buton pe acelasi rand pana la marginea grid-ului, 759px latime). PROCEDURE pgfArticole.PAGE3.cmdAdaugaArticol.Click: alege articolul princaut_articol(), construiestepoArticol/poDate, seteazagnScadereStoc=0, deschideCreateobject('frm_articol_factura', 1, .F.)+.Show(1)(modal — exact tiparul dindo_adauga_articol,ofacturare.vc2:12873), si dacagnButon=1cheamaThisform.AdaugaLinieTvdDinArticol(poArticol).PROCEDURE AdaugaLinieTvdDinArticol(toArticol)(metoda noua, separata deliberat deClick):APPEND BLANKintvd+REPLACEtoate campurile (id_vanzare_det=0,sters=0,lmodificat=.T.,pret/discount_unitaralese dupa flagulpreturi_cu_tva— simetric cu citirea dinIncarcaArticoleFactura), apoiThisform.calculeaza_valori_articol()(recalculeazavaloare, cheamaActualizeazaBaraTotaluri()deja existenta din sub-blocul C — nicio modificare acolo). Separarea deClicka fost necesara ca sa fie testabila:Show(1)e modal, nu poate fi condus headless.
Limitari cunoscute, de raportat explicit
- Doar RON: liniile noi au
tip_valuta=0,Curs=1,multiplicator=1fix — nicio factura in valuta nu poate primi inca o linie noua prin acest buton. Nu era ceruta multi-valuta in briefing; 80/20, notat ca gol. - Editarea unei linii existente prin acelasi dialog (dublu-clic) — NU e in scope-ul primit in aceasta sesiune (briefingul cerea explicit doar "adaugarea"). Ramane nefacuta.
2. Golul "comutare inapoi" (al doilea click pe stergere) — INCHIS
COMUN\utile\Teste\editare_factura\test_ui_sterge_linie.prg: toate asertiile (inclusiv click 2 —
restaurare sters 1->0) mutate inainte de singurul HarnessStep ramas (era programata dupa
HarnessStep WITH 0 in versiunea veche si nu rula niciodata daca harness-ul se bloca la READY).
Adaugat un al treilea click (re-marcheaza linia), strict ca linia sa fie in starea "stearsa" pentru
captura de la final.
Rulat, 8/8 PASS, log complet pana la REZULTAT:
PASS butonul cmdStergeArticol exista
PASS butonul e vizibil
PASS linia 1 incarcata cu sters=0
PASS dupa click 1: sters=1 pe linia curenta
PASS dupa click 1: lmodificat=.T.
PASS linia 2 neatinsa de stergerea liniei 1
PASS dupa click 2: sters=0 (restaurata)
PASS dupa click 3: sters=1 (re-marcata pentru captura)
REZULTAT: 8 PASS / 0 FAIL
Comutarea pe ambele sensuri e acum dovedita, nu doar sensul de stergere ca la runda 3B partea 1.
Codul din cmdStergeArticol.Click era deja corect (REPLACE sters WITH IIF(Nvl(sters,0)=1,0,1)) —
golul era strict in ordinea asertiilor din test, nu in implementare.
3. Golul vizual (captura DynamicForeColor) — OBTINUTA, si REVELEAZA UN DEFECT REAL
Cauza radacina a esecurilor anterioare (16 incercari in 2 sesiuni), gasita: testul seta
gcSyncDir = '...\uisync4\', dar vfp_ui_harness.ps1 foloseste implicit ...\uisync\ (fara "4") —
handshake-ul ready_0.txt/cont_0.txt se scria si se astepta in doua directoare diferite, deci
nu se intalneau niciodata. Nu era masina ocupata — era o nepotrivire de parametru. Fix: apelat
harness-ul cu -SyncDir explicit, potrivit cu uisync4. A functionat din prima incercare dupa
corectie.
Captura obtinuta: COMUN\utile\Teste\editare_factura\screenshots\step_0_linia grizata dupa sters.png (si o versiune decupata+marita 3x, step_0_crop_zoom.png, pentru verificare de
culoare). Cursorul de grid a fost mutat pe linia 2 inainte de captura (SELECT tvd; SKIP), ca
selectia (fundal albastru) sa nu acopere culoarea liniei 1 (cea marcata sters=1).
Rezultat, verificat prin esantionare de pixeli (nu doar vizual): textul liniei 1
(tvd.sters=1, confirmat prin asertie in aceeasi rulare) are pixeli cu luminanta 0 (negru
pur) in zona literelor — RGB(150,150,150) nu poate produce niciodata un pixel cu luminanta 0,
indiferent de anti-aliasing. DynamicForeColor NU se aplica vizual, desi codul e corect scris
pe toate cele 14 coloane (IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0)),
omodificari.vc2:12326-12426, verificat din nou acum). Defect real, nou descoperit, apartine
livrarii anterioare (sub-blocul B partea 1, stergerea logica) — NU l-am reparat, nu era in
scope-ul acestei sesiuni si ar cere investigatie separata (posibil _grdrow/_grid.Init din
_baza.vc2 suprascrie ForeColor static dupa DynamicForeColor, sau grid-ul are nevoie de un
Requery/re-bind pe care Refresh() simplu nu-l declanseaza pentru randuri deja randate).
Recomandare: agent proaspat, sesiune dedicata, cu acest fisier PNG ca dovada de start.
Testare — cifre numarate din log, run-uri complete pana la linia finala
| Suita | Rezultat | Exit / dialoguri |
|---|---|---|
test_page3_articole.prg (regresie) |
14 PASS / 2 FAIL (identic cu baseline — cele 2 FAIL, artefact headless cunoscut, datoria 7) | exit 0, 0 dialoguri |
test_incarca_vanzare_din_nota.prg (regresie) |
5 PASS / 0 FAIL (identic cu baseline) | exit 0, 0 dialoguri |
test_adauga_linie_articol.prg (NOU, headless, fara dialog modal) |
20 PASS / 0 FAIL, log complet pana la REZULTAT |
exit 0, 0 dialoguri |
test_ui_sterge_linie.prg (MODIFICAT — golul #2) |
8 PASS / 0 FAIL, log complet pana la REZULTAT + READY 0 + CONTINUE 0 (semnal primit) + GATA |
UI harness, captura obtinuta |
test_adauga_linie_articol.prg acopera direct CreeazaPoArticolNouTvd (valori implicite) si
Thisform.AdaugaLinieTvdDinArticol pe un document real (cod=1140895, id_vanzare=1050, cazul
FACTURA_ARTICOLE), cu un poArticol construit ca dupa un OK de dialog (cantitate=2, pret fara
TVA=100, TVA 19%) — verifica Reccount(tvd) crescut cu 1, toate campurile liniei noi, si ca bara
de totaluri (nTotalLiniiRon) creste exact cu valoarea liniei. Nu testeaza Show(1)/dialogul
modal insusi (netestabil headless — ar bloca procesul, exact ca in test_pret_cu_tva_dialog.prg
pentru #7) — acoperit doar in productie / la testare manuala pe ecran.
Cens de octeti si write-back
Cens baseline (inceputul sesiunii): 2 aa / 2 e3 / 2 fe, zero EF BF BD. Stricat de doua ori
in aceasta sesiune (o data la prima editare a butonului/Click, o data la refactorul care a extras
AdaugaLinieTvdDinArticol din Click) — de fiecare data acelasi tipar (Renunțare/Adăugare/
Ștergere din Caption-ul de pe alt buton, needitat de mine dar in aceeasi zona de fisier),
reparat byte-cu-byte cu Perl (pozitional, nu inlocuire oarba — cele 3 caractere au octeti diferiti:
0xFE=ț, 0xE3=ă, 0xAA=Ș). Cens final: identic cu baseline-ul, 2 aa / 2 e3 / 2 fe, zero
EF BF BD, verificat de 4 ori (dupa fiecare din cele 2 stricari + reparari, plus verificarea
finala).
Fidelity-check picat de 2 ori (ordine ADD OBJECT/metoda — capcana deja cunoscuta), rezolvat
de fiecare data prin adoptarea textului regenerat din <staging>\verify\omodificari.vc2. Scris
in binar cu succes dupa 3 rulari totale ale txt2vcx.ps1 -AllowComun (2 esecuri de fidelity +
1 succes pentru prima parte, apoi inca 2 rulari pentru refactor — vezi tabelul de mai jos).
.vc2/.vcx/.VCT sincrone, mtime 14:26.
Observatie de mediu: fiecare rulare txt2vcx.ps1 a durat neobisnuit de mult (5-8 minute,
Responding=True tot timpul, CPU crescator constant, deci NU blocat) — masina pare ocupata de
sesiunea reala a lui Marius (ferestre vizibile la enumerare read-only: Brave, VS Code, notepad++,
roastart), tipar deja documentat in sesiunile precedente din aceeasi zi. Nu a fost nevoie de nicio
interventie, doar asteptare.
Fisiere atinse, stare write-back
| Fisier | Stare |
|---|---|
COMUN\clase\omodificari.vc2 |
Editat (buton + Click + AdaugaLinieTvdDinArticol), write-back FACUT, cens OK |
COMUN\clase\omodificari.vcx / .VCT |
Scrise, mtime sincron cu .vc2 (14:26) |
COMUN\clase\omodificari.vc2.pre_runda3b2.bak |
Backup, luat la inceputul sesiunii |
COMUN\programe\ofacturare_editare.prg |
Editat (functie noua CreeazaPoArticolNouTvd + antet), ASCII pur, zero risc de encoding |
COMUN\utile\Teste\editare_factura\test_adauga_linie_articol.prg |
Nou, testat, 20/20 PASS |
COMUN\utile\Teste\editare_factura\test_ui_sterge_linie.prg |
Modificat (golul #2 + pozitionare pentru captura), testat, 8/8 PASS |
| diff aplicat (sters) | Nou — scopat strict pe modificarile mele in omodificari.vc2 |
| diff aplicat (sters) | Nou — atentie: COMUN are git propriu, diff-ul e fata de ultimul commit, deci contine si munca altor agenti din aceeasi zi, inca necomisa (linia CreeazaCursorTvdGol() -> CreeazaCursorArticoleGol in IncarcaArticoleFactura, PregatesteArticoleFacturaEditare intreaga functie). Partea mea: antetul fisierului (rescris) + functia CreeazaPoArticolNouTvd intreaga, adaugata la coada fisierului. |
COMUN\utile\Teste\editare_factura\screenshots\step_0_linia grizata dupa sters.png |
Nou — dovada vizuala (revela defectul DynamicForeColor) |
| handoff intermediar (sters) | Handoff intermediar scris in timpul asteptarii write-back-ului — poate fi sters, sesiunea s-a incheiat normal |
Fara commit — asteapta review, conform regulii.
Ce NU e acoperit (predat mai departe / descoperit dar nerezolvat)
- Editarea unei linii existente prin
frm_articol_factura(dublu-clic) — nu era in scope-ul acestei sesiuni. - Linii noi in valuta — buton functional doar pentru RON (
tip_valutafix 0). - Defectul
DynamicForeColor(sectiunea 3 de mai sus) — dovedit cu captura + esantionare de pixeli, nereparat, apartine livrarii anterioare (stergere logica). Show(1)(fluxul complet cu dialogul modal deschis efectiv) — netestat automat, doar prin analiza de cod si testare manuala recomandata pe ecran, cand masina e libera.