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
154 KiB
Progres implementare — ROAFACTURARE, punctele 6, 7, 8 (10, 11, 12 amanate)
Fisierul curent de stare. Orice sesiune il citeste primul si il actualizeaza inainte sa se
incheie. Planurile (plan_0*.md) spun ce e de facut; acesta spune unde s-a ajuns. Istoricul
sesiunilor nu se pastreaza aici — doar starea la zi, deciziile, faptele stabilite si datoriile.
Ultima actualizare: 10.08.2026, dupa-amiaza. S5 e TERMINAT, LIVRAT SI COMIS in git. Decizia 42 (inclusiv discountul de antet) e IMPLEMENTATA si VERIFICATA, necomisa. S8 are acum toate cele patru tipuri de sursa — mai ramane matricea de editare.
PREDAREA CURENTA, pentru sesiunea noua: docs\handoff_punct6_10082026_pm.md — se citeste
prima. Primul lucru de facut de acolo: stergerea celor sase documente parazite (1051, 1056,
1057, 1058, 1059, 1060) prin aplicatie.
Predarea anterioara, tot valabila pe reguli si comenzi: docs\handoff_punct6_dupa_s5.md. Dosarul de
livrare al lui S5: docs\livrare_s5.md. Jurnalul blocului (decizii 38-41, incidente):
docs\handoff_s5.md.
Comis in git, pe ramura punct6-s4-runda3: COMUN 1c42ae0 (13 fisiere), ROAFACTURARE
316b6f7 (changelog 2.11.15 + versiune_db.txt pe 2026_08_09_02). Nefacute deliberat:
git push si svn commit — publicare pe server, decizia lui Marius. Cele doua scripturi Oracle sunt
mutate in D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08 cu svn add (status A, necomis).
Starea la incheierea sesiunii — nimic periculos, verificat nu presupus: zero procese vfp9.exe,
zero tranzactii Oracle deschise, write-back dovedit prin reconversie si diff pe toate cele trei
.vc2 (nu pe mtime — txt2vcx.ps1:300 il rescrie), docs\verificare_s5_writeback.md. Toti agentii
inchisi.
Ce ramane din planul #6: S8 (matricea pe tipuri de sursa — se creeaza in dev documentele
lipsa) si implementarea deciziei 42 (articolele raman vizibile, dar needitabile, cand documentul e
in eFactura). S4b, S7 si S9 sunt GATA (10.08.2026 — S4b inchis prin decizia 43, fara enumerarea
vechi -> nou). Plus verificarea pe ecran de Marius.
Detaliu si ordinea recomandata: docs\handoff_punct6_dupa_s5.md.
S8 — VERIFICAT PE VENDING PRODUCTIE, 10.08.2026: nu deblocheaza avizul
Conectare read-only la baza de productie VENDING (tunel SSH Bitvise cu profilul
D:\GoogleDrive\vending.tlp -> 79.119.86.134:22122, forward 127.0.0.1:1521; schema VENDING).
Toate interogarile sub SET TRANSACTION READ ONLY, incheiate cu ROLLBACK. Tunelul a fost inchis
la final, portul 1521 eliberat. Zero scrieri.
Distinctia care conteaza: tip = 4 inseamna factura emisa din aviz, nu aviz. Avizele
propriu-zise sunt tip = 22. Productia are avize (22), dar nu emite facturi din ele de ani.
tip |
Ce e | Total nesters | Cel mai recent | In luna curenta |
|---|---|---|---|---|
| 3 | comanda | 5751 | 10.08.2026 | 390 |
| 1 | lista de preturi | 112091 | 10.08.2026 | 84 |
| 43 | (in afara celor 4 tipuri) | 13694 | 07.08.2026 | 13 |
| 8 | (in afara celor 4 tipuri) | 1191 | 07.08.2026 | 10 |
| 22 | aviz propriu-zis | 185 | 06.08.2026 | 3 |
| 4 | factura din aviz | 7 | 19.10.2021 | 0 |
| 2, 6 | contract | absent complet | — | 0 |
Concluzii:
- Avizul ca sursa de factura e practic mort — 7 documente in tot istoricul productiei, ultimul in octombrie 2021. Nu e o lipsa a schemei de dev: nu se mai emite asa nicaieri.
- Contractul nu exista deloc in vending (zero documente
tip in (2,6)). - Matricea pe 4 tipuri din plan nu corespunde utilizarii reale. Tipurile vii sunt lista de preturi si comanda; in schimb apar masiv doua tipuri din afara matricei (43 si 8).
- Productia nu se poate folosi pentru executie oricum: e read-only prin decizie, iar obiectele
migrarii #6 (
VVANZARI_ARTICOLE,RECALCULEAZA_TOTALURI_VANZARI) nu exista acolo — #6 nu e deployat in productie.
CORECTIE, dupa verificarea pe ROMFAST si explicatia lui Marius (10.08.2026): concluzia „factura
din aviz e practic moarta" era prea larga — dedusa dintr-o singura firma. La vending se emit avize,
se sterg, si abia apoi se factureaza direct; de aceea tip=4 nu apare acolo. Nu e o functie
abandonata.
Verificat read-only pe ROMFAST@ROA_ROMFAST (10.0.20.36, retea locala, fara tunel):
tip |
Ce e | Total nesters | Cel mai recent | In luna curenta |
|---|---|---|---|---|
| 2 | contract | 6976 | 03.08.2026 | 21 |
| 1 | lista de preturi | 318 | 21.05.2026 | 0 |
| 3 | comanda | 6 | 08.11.2022 | 0 |
| 4 | factura din aviz | 0 | — | 0 |
Deci factura din contract e vie si masiva pe ROMFAST — se emite curent. tip=4 lipseste si acolo,
consistent cu explicatia de mai sus.
Decizia lui Marius: toate variantele trebuie sa existe si sa functioneze, inclusiv factura din
contract si factura din aviz. Se creeaza in dev, prin fluxul real de emitere (aviz -> factura din
aviz; contract -> factura din contract). Regula ferma pe aceasta lucrare: documentele se emit prin
fluxul aplicatiei, niciodata cu INSERT direct — un document cusut de mana n-are note, rulaje si
legaturi, deci un test S8 pe el nu dovedeste nimic.
Planul de creare LIVRAT (10.08.2026, 11:17): docs\cercetare\rec_s8_creare_variante_plan.md — intrarea
reala (Procedure factureaza, COMUN\programe\ofacturare.prg:81-560), tehnica de ocolire a dialogurilor
de antet prin setare directa poDate (scrierea ramane 100% in PACK_FACTURARE), driverul pentru modalul
frm_alte_date, datele de referinta din MARIUSM_AUTO (delegat 256, id_fdoc 5, client 463, contract
id_ctr=235 — 222 se evita, are un rand cu id_pol_art NULL) si ordinea 22 -> 4 -> 2. Planul
declara explicit ce nu a verificat: garda proprie a lui frm_date_aviz, semnatura oDateFactura si
generatorul de serii, restul proprietatilor cerute de do_scrie_factura.
S8 — DOCUMENTELE EXISTA, emise manual de Marius, 10.08.2026
Automatizarea emiterii s-a abandonat dupa un blocaj reproductibil (vezi mai jos). Marius a emis cele
trei documente din aplicatie, prin fluxul real — ceea ce satisface regula „niciodata INSERT direct"
mai bine decat orice harness. Verificate de orchestrator prin sqlplus:
| Tip sursa | id_vanzare |
cod |
id_fact |
serie/numar | partener | totaluri | linii / ACT / RUL |
|---|---|---|---|---|---|---|---|
| aviz (tip 22) | 1052 | 1140908 | 8009677 | SSS/100037 | 108 | 271.17 / 56.94 / 328.11 | 2 / 12 / 4 |
| factura din aviz (tip 4) | 1054 | 1140910 | 8009679 | SSS/100037 | 108 | 252.07 / 52.93 / 305.00 | 1 / 2 / 0 |
| factura din contract (tip 2) | 1055 | 1140911 | 8009680 | SSS/549 | 614 | 200.00 / 42.00 / 242.00 | 2 / 7 / 1 |
Toate trei: data_act = 10.08.2026 (luna curenta, deci trec garda de editare), sters = 0.
id_vanzare = 1053 lipseste din secventa — numar ars, normal la un document abandonat.
Impreuna cu 1048 (lista de preturi), matricea S8 are acum toate cele patru tipuri de sursa.
SASE DOCUMENTE PARAZITE —
1051,1056,1057,1058,1059,1060Harness-ul
creeaza_documente_s8.prga fost rulat repetat de un agent din alta sesiune (s8-creare-variante, care depana blocajul fara sa stie ca scopul fusese deja atins). Fiecare rulare a lasat un document malformat:total_cu_tva = 0, o singura linie,RULgol. Toate pe clientii de test463/598, cu numereleSSS/13…SSS/17— din careSSS/14e duplicat pe1056si1057(harness-ul aloca acelasi numar la toti pasii unei rulari).
id_vanzaretip numar partener 1051 22 SSS/13 463 1056 22 SSS/14 463 1057 2 SSS/14 598 1058 22 SSS/15 463 1059 22 SSS/16 463 1060 22 SSS/17 463 De sters prin aplicatie (nu prin SQL), decizia lui Marius. Matricea foloseste exclusiv
1048 / 1052 / 1054 / 1055. Banner de oprire pus in capul raportuluidocs\cercetare\rec_s8_creare_variante.md, de unde isi ia sarcina agentul celeilalte sesiuni.
Blocajul care a oprit automatizarea (consemnat, nu se reia): procesul VFP moare fara eroare prinsa
de TRY/CATCH imediat dupa ce driverul apeleaza .do_termin() pe frm_alte_date. Reproductibil.
Harness-ul si investigatia completa de cod (cu fisier:linie) raman pe disc in
docs\cercetare\rec_s8_creare_variante.md — utile daca se reia candva, dar scopul e atins altfel.
Ce ramane din S8: matricea propriu-zisa — fiecare din cele patru documente editat de doua ori,
o data din ROAFACTURARE si o data din registrul jurnal ROACONT, cu verificarile din
plan_06_editare_factura.md:282-291.
Firele rundei (10.08.2026, dupa-amiaza)
s8-creare-exec— executia planului: creeaza avizul, factura din aviz si factura din contract inMARIUSM_AUTO, prin fluxul real, si le verifica in Oracle dupa terminarea procesului VFP. Harness nou inCOMUN\utile\Teste\editare_factura\; zero cod de productie atins. Raport:docs\cercetare\rec_s8_creare_variante.md. Matricea de editare propriu-zisa NU intra in acest bloc.dec42-proiectare— proiectarea deciziei 42, strict read-only (fara editari, fara rulari). Raport:docs\cercetare\rec_dec42_proiectare.md.
DECIZIA 42 (Marius, 10.08.2026) — ce se blocheaza dupa trimiterea in eFactura
Textual: „notele contabile si rulajul se pot modifica in continuare, doar articolele din factura nu se mai pot modifica daca este trimisa eFactura."
Deci garda eFactura nu opreste editarea notei — suprima pagina de articole. Forma de
implementare care rezulta: garda intra in PregatesteArticoleFacturaEditare
(COMUN\programe\ofacturare_editare.prg), adica exact acolo unde se decide daca PAGE3 se pregateste
si se arata. Notele obisnuite din registrul jurnal raman complet neatinse (helperul nici nu se
apeleaza pentru ele), iar comun.vc2 nu se modifica — suprafata de regresie cross-project minima.
Neimplementat inca.
Sub-intrebarea a primit raspuns (Marius, 10.08.2026): pe calea din ROAFACTURARE ramane blocaj
total pentru documentul trimis in eFactura — frm_facturi.do_editare_factura (ofacturare_comun.vc2:3764)
ramane exact cum e azi, nu se atinge. Notele si rulajul se modifica doar din ROACONT.
CORECTIE (Marius, 10.08.2026), obligatorie — prima varianta de implementare era gresita:
articolele din vanzari trebuie sa ramana VIZIBILE pe pagina de articole; doar editarea lor se
opreste cand documentul a fost trimis in eFactura. Deci NU se suprima PAGE3 si NU se blocheaza
PregatesteArticoleFacturaEditare — pagina se pregateste si se afiseaza normal, iar gridul devine
doar-citire. Butoanele de adaugare/stergere linie se dezactiveaza in aceeasi conditie.
Mecanismul de editabilitate per rand exista deja din S5 in omodificari.vc2 — se adauga peste el o
conditie la nivel de formular.
IMPLEMENTATA SI VERIFICATA, 10.08.2026 (agent d42-efactura, din alta sesiune; verificata pe disc de
orchestratorul acestei sesiuni). Necomisa. Diff: docs\diff_d42_efactura_readonly.patch. Raport:
docs\cercetare\rec_d42_efactura.md. Forma implementata: flag lArticoleReadOnly pus in
frm_modific2024.Show (:14789-14813), impins peste .When-urile existente din S5
(:16550, :16557, :16571, :16588), cmdAdaugaArticol/cmdStergeArticol.Enabled plus garda
duplicata in Click (:16494, :16533), si eticheta lblArticoleReadOnly.
Fisiere atinse: COMUN\clase\omodificari.vc2 (write-back facut) si
COMUN\programe\ofacturare_editare.prg. In afara arborelui: D:\ROA\ROAGEST\Programe\roagest.prg
(SET PROCEDURE TO ofacturare_editare.prg la :260, necomis) — fara el garda n-ar exista pe ROAGEST.
Verificat de orchestrator pe disc, nu din raport:
- Write-back dovedit prin reconversie + comparatie octet cu octet, nu pe mtime: binarul reconvertit
intr-un cache temporar da un text identic octet cu octet cu
.vc2din arbore (540636 octeti). - Cens de octeti pe
omodificari.vc2:2 aa . 2 e3 . 2 fe, zeroEF BF BD— identic cu reperul. Fara corupere de diacritice. - Cifrele numarate din loguri: regresie la baseline exact —
test_page3_articole14/2 (cele 2 = artefactul headless cunoscut, coloanele de grid nu se materializeaza sub-A -T),test_adauga_linie_articol20/0,test_adauga_linie_valuta16/0,test_ui_sterge_linie8/0,test_verdict_act_rul26/0,test_incarca_vanzare_din_nota5/0,test_s5_validari_articole35/0. Suite noi:test_efactura_readonly21/0 (headless, pe document real trimis in eFactura —id_vanzare=1013,id_fact=8008013) sitest_ui_efactura_readonly14/0 (formular vizibil, citeste direct cele 4.When). - Toate rularile (11:45-11:51) sunt DUPA write-back (binar 11:37:22) — golul de acoperire care a aparut de doua ori in sesiunile trecute nu s-a repetat.
- Zero procese
vfp9.exe, zero commituri.
Capcana de numarare, de retinut: un regex ^\s*PASS da cifre false pe aceste loguri — suitele scriu si
... = PASS la capat de rand, iar test_s5_validari_articole are o linie „FAIL asteptat" care e o nota
documentara despre ramura moarta Isnull(pret), nu o asertie picata. Doua suite vechi
(test_page3_articole, test_incarca_vanzare_din_nota) se termina cu done, nu cu REZULTAT.
DEFECTUL CRITIC PRINS SI CORECTAT INAINTE DE LIVRARE (gasit de dec42-proiectare pe review, confirmat
independent de orchestrator):
omodificari.vc2:14798 cheama EsteInEFactura(This.nIdVanzare), dar functia
(COMUN\programe\ofacturare_editare.prg:16-25) primeste id_fact si interogheaza
anaf_efactura where id_fact = <param>. This.nIdVanzare primeste tvanz.id_vanzare la :14796 —
coloane distincte pe VANZARI, cu valori diferite pe orice document real. Consecinta: garda nu se
declanseaza niciodata pe date reale, adica exact esecul pe care decizia 42 il previne, si tacit.
Apelul corect exista ca precedent: ofacturare_comun.vc2:3764 trimite lnIdFact.
Corectia e APLICATA (varianta B din docs\cercetare\rec_dec42_proiectare.md §8): id_fact intra pe
tvanz — v.id_fact in SELECT-ul din IncarcaVanzareNota (ofacturare_editare.prg:179) si in
CreeazaCursorTvanzGol (:155, altfel calea de fallback ar da eroare) — apoi
EsteInEFactura(Nvl(tvanz.id_fact,0)) (omodificari.vc2:14798). Toate trei confirmate pe disc.
De ce conteaza tiparul: un test scris tot pe id_vanzare ar fi trecut si ar fi ascuns defectul.
Regula care l-a prins e cea din memorie — deschide RETURN-ul functiei inainte sa accepti semantica
sugerata de nume; aici, contractul scria id_fact chiar in antet (ofacturare_editare.prg:15).
Confirmat, nu mai e intrebare deschisa: EsteInEFactura e apelabila din toate cele trei aplicatii —
ofacturare_editare.prg e in SET PROCEDURE la roafacturare.prg:214, roacont.prg:212 si
roagest.prg:260. Suprafata de regresie pe notele obisnuite din ROACONT/ROAGEST e zero prin
constructie: totul e sub gatingul lAreArticoleVanzari, existent din S4/S5 si neschimbat.
DISCOUNTUL DE ANTET INTRA SUB GARDA — decis de Marius 10.08.2026, IMPLEMENTAT SI VERIFICAT.
Textual: „Da, se blocheaza si el." Motivul: schimba totalurile unui document deja depus la ANAF, chiar
daca nu atinge nicio linie. Cod: omodificari.vc2:14813 —
txtDiscountArt.ReadOnly = This.lArticoleReadOnly, prin acelasi flag, fara mecanism nou.
A doua cale de scriere cautata si exclusa: txtDiscountArt.Valid (:16592) doar recalculeaza
afisajul (ActualizeazaBaraTotaluri), nu scrie discountul nicaieri — deci garda dubla necesara la
butoanele de articole nu isi are rostul aici.
Agentul
d42-efacturaa cazut pe limita de sesiune imediat dupa write-back, INAINTE de verificare. Orchestratorul a preluat si a dus-o la capat: write-back dovedit prin reconversie + diff octet cu octet (540712 octeti, identic), cens2 aa . 2 e3 . 2 fezeroEF BF BD, regresia rerulata integral pe starea de pe disc (fara nicio regresie), si suitatest_efactura_readonlyextinsa cu doua asertii — 23 PASS / 0 FAIL, garda verificata in ambele sensuri (blocat pe documentul din eFactura, editabil pe cel netrimis). Gol declarat: suita UI vizibila (test_ui_efactura_readonly, 14/0) nu a fost rerulata dupa aceasta completare — verifica.When-urile de celula, neatinse de ea.
DECIZIA 43 (Marius, 10.08.2026) — S4b se INCHIDE fara enumerarea „vechi -> nou"
Textual: „la S4b nu ma intereseaza sa ii arat utilizatorului ce s-a modificat, este de ajuns totalurile de control."
Deci partea ramasa din S4b — actiunea explicita de sincronizare cu enumerarea liniilor vechi -> nou —
se abandoneaza deliberat, nu se amana. Totalurile de control pe cele trei surse si verdictul
ACT/RUL, deja livrate si comise, sunt suficiente. S4b devine GATA.
Propunerea de proiectare ramane pe disc doar ca istoric —
docs\propunere_s4b_sincronizare.md (cursor de instantaneu tvd_init, dialog modal de confirmare).
Nu se implementeaza. Daca cineva o redeschide candva, sa stie ca a fost respinsa pe scop, nu pe
calitate: proiectarea era verificata pe disc (ancorele :14788 in Show, :14329-14386 in
inainte_de_do_termin, ambele confirmate cu vfp_symbols.ps1).
Intrebarea care a generat decizia 42 (istoric, inchisa)
Ridicata de S9: garzile de la editare sunt asimetrice intre
cele doua puncte de intrare. frm_facturi.do_editare_factura refuza documentul trimis in eFactura
(EsteInEFactura) si pe cel cu referinte de incasari/plati (ReferinteDocumenteNota); calea din
Registrul Jurnal, afisjurcom.do_modifica (comun.vc2:2222-2572), nu are niciuna din ele — doar
restrictia de luna curenta, preexistenta pentru orice nota. Deci o factura deja trimisa la ANAF se
poate edita din ROACONT, dar nu din ROAFACTURARE. Verificat de orchestrator cu vfp_symbols.ps1, nu
din raport: hitul ReferinteDocumenteNota de la comun.vc2:2620 e in afisjurcom.do_sterge
(2574-2733), alta metoda — deci nu infirma constatarea. Variante: (1) se lasa si se documenteaza
(deja documentat); (2) garda eFactura se muta in PregatesteArticoleFacturaEditare, deci se aplica
doar cand documentul chiar e factura de vanzare, fara sa atinga notele obisnuite; (3) se dubleaza
explicit in do_modifica. Nefacut — comun.vc2 e livrare inchisa, iar calea din jurnal serveste
orice tip de nota. Atinge si S8, care cere fiecare caz rulat din ambele puncte de intrare.
#6 / S7 — rotunjirea la reeditare, GATA 10.08.2026: NU E DEFECT
Verdict: corectiile de rotunjire NU se acumuleaza la editari repetate. Nu se repara nimic.
Raport: docs\cercetare\rec_s7_rotunjire.md.
Argumentul care sustine verdictul e structural, nu statistic:
ACT_TEMPe global temporary table cuDURATION = SYS$TRANSACTION— se goleste singura la finalul fiecarei tranzactii. Verificat independent de orchestrator inALL_TABLES(ACT_TEMP=Y/SYS$TRANSACTION,ACT=N), nu preluat din raport. Fiecare editare ruleaza intr-o singura tranzactie incheiata cu COMMIT (decizia 38), deciACT_TEMPporneste mereu goala si nu poate purta randuri dintr-o editare anterioara.verifica_total_documentse apeleaza o singura data pe generatie (cumuleaza_note_act:14095).- Insereaza cel mult 2 randuri pe generatie — un
INSERTperIF(ftva, tva); al treileaIFe doar pentruntip in (48,49), deci nu pe factura (tip=1). - Blocul vechi se retrage integral (
STERS=1) la fiecare editare, nu doar linia de corectie — confirmat pe 8 generatii reale ale documentului, cu numar de randuri active constant (10).
Limita, declarata explicit de raport si acceptata: pe compozitia documentului de test mecanismul
nu se declanseaza niciodata (ntotftva = V_TOTFTVA_VER exact la toate cele 8 generatii), deci
cifra 0 / 0 / 0 pe cele trei treceri arata doar ca randurile nu cresc — nu dovedeste prin ea
insasi ce s-ar intampla daca s-ar declansa. Criteriul din plan e indeplinit, dar vacuu pe partea
empirica; greutatea o duc punctele 1-4. Consecventa cu regula „zero cazuri in date nu e dovada".
Confirmare ca mecanismul chiar functioneaza in productie: cod=1140709 (an 2026, luna 3) are o
corectie reala de 0.02 lei, cu semnatura exacta a INSERT-ului (id_act = max+1, restul coloanelor
copiate de pe randul-ancora). Documentul nu a fost reeditat, deci nu arata direct acumularea — dar
arata ca se insereaza exact un rand cand se declanseaza.
Ce nu s-a acoperit: niciun document din productie care sa declanseze corectia si sa fie editat
de mai multe ori; neconcordanta n-a fost fortata artificial (ar fi cerut modificarea scrie_nota);
ramura ntip in (48,49) neexercitata.
Capcana prinsa in propria masuratoare, de retinut: prima interogare de numarare a dat fals-pozitiv
„3 corectii" — semnatura prea larga prindea perechi (scd,scc) duplicate legitim de doua linii de
detaliu diferite. Filtrul corect cere si diferenta mica intre sume
(abs(max-min) < 5 AND max <> min). Agentul l-a corectat inainte de rularea raportata.
Verificat de orchestrator pe disc: log 6 PASS / 0 FAIL cu linia REZULTAT prezenta (numarat din
log, nu din raport), zero tranzactii Oracle deschise, zero procese vfp9.exe.
Date de test consumate: cod pe id_vanzare = 1049 a mers 1140900 -> ... -> 1140906
(cel curent) — sapte generatii, din care prima serie de trei cu interogarea de numarare gresita.
Niciun det schimbat sau sters suplimentar fata de S5; totaluri neschimbate
(747.96 / 157.06 / 905.02). id_vanzare 1050 si 1037 neatinse.
Fisier nou, necomis: COMUN\utile\Teste\editare_factura\test_s7_rotunjire.prg + log.
#6 / S9 — documentatia fluxului, GATA 10.08.2026, NECOMISA
Ultima parte ramasa din S9 (changelog-ul si commit-urile git erau deja facute). In
D:\ROA\ROAGEST\COMUN\docs\flux-modificare-stergere-nota-jurnal.md: sectiune noua „Ramura noua:
editare factura de vanzare" + 2 puncte in „Implicatii practice". Acopera conditia de activare
(ofacturare_editare.prg in SET PROCEDURE, inregistrat de toate cele trei aplicatii), cele doua
puncte de intrare cu garzile lor, secventa de scriere in tranzactia manuala unica, cei 4 pasi din
ScrieArticoleFacturaEditate, recalculeaza_totaluri_vanzari, view-ul VVANZARI_ARTICOLE si
comportamentul gridului. Regula deciziei 38 e scrisa ca regula, fara numarul deciziei, conform
conventiei de comentarii. Diff: docs\diff_s9_flux_nota_jurnal.patch. Raport:
docs\cercetare\rec_s9_documentatie.md.
Verificat de orchestrator pe disc, nu din raport: modificat doar fisierul de documentatie
(svn status pe ROAGEST\COMUN\docs — restul, PACK_DIAG_SPATIU.pck modificat, bash.exe.stackdump
neversionat si conflictul de arbore pe email-thunderbird.md, sunt preexistente, straine de noi);
zero fisiere de cod atinse in ambele arbori git; zero procese vfp9.exe; zero commituri.
O afirmatie din raportul agentului e gresita ca formulare (concluzia rezista): a raportat „grep
zero rezultate pentru EsteInEFactura/ReferinteDocumenteNota in comun.vc2", dar comun.vc2:2620
chiar apeleaza ReferinteDocumenteNota — doar ca in do_sterge, nu in do_modifica. Textul scris in
documentatie e corect. Tipar de retinut: constatarea „nu exista X in metoda Y" se verifica cu
vfp_symbols.ps1 -Where, nu cu un grep pe fisier.
Ramane netestat pe ecran: nimic — e documentatie. Ramane de decis: asimetria de garzi de mai sus.
#6 / S5 — scrierea sumelor editate in Oracle, TERMINAT SI COMIS 10.08.2026
Starea completa a blocului e in docs\handoff_s5.md — se citeste inaintea acestei sectiuni.
Aici doar ce trebuie sa stie o sesiune noua din prima:
- Codul e scris integral si write-back-ul e facut pe toate cele patru fisiere atinse:
ofacturare_editare.prg(helperulScrieArticoleFacturaEditate),omodificari.vc2(coloanapret_achizitie, editabilitate per rand, validari),ofacturare_comun.vc2sicomun.vc2(agatarea). Necomis. - Doua scripturi Oracle APLICATE in
MARIUSM_AUTO:ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql(procedurarecalculeaza_totaluri_vanzari) siff_2026_08_09_02_COMUN_VVANZARI_ARTICOLE.sql(view-ul, cuID_VANZARE_SETsiPRET_ACHIZITIE). Pachetul eVALID, zero erori.versiune_db.txt=2026_08_09_02. Scripturile sunt indocs\, nu inSCRIPTURI_CLAR. - Deciziile 38-41 (ordonarea scrierii, liniile de set,
PRET_ACHIZITIE, discountul ca parametru) sunt inhandoff_s5.md. Decizia 38 corecteaza planul S5: recalculul se apeleaza din VFP, nu dinfinalizeaza_modificare_nota, altfel ar calcula totalurile pe liniile dinainte de editare. - Runda 2 pe grid, INCHISA (
s5-grid, 09.08.2026 tarziu): cele trei corectii de code-review sunt in binar. Write-back verificat prin reconversie si diff, nu pe mtime — textul regenerat din binar e identic octet cu octet cu.vc2(txt2vcx.ps1:300rescrie mtime-ul textului, deci mtime nu dovedeste nimic). O a patra constatare s-a dovedit nerealizabila pe codul de acum si nu se repara — detalii si conditia care ar activa-o, inhandoff_s5.md. - Regresia e la baseline pe toate cele sase suite, cifre numarate din loguri de orchestrator,
toate rulate dupa write-back (binar 23:15:50):
test_page3_articole14/2 (23:19:52),test_adauga_linie_articol20/0,test_adauga_linie_valuta16/0,test_ui_sterge_linie8/0,test_verdict_act_rul26/0,test_incarca_vanzare_din_nota5/0 (23:27:52). - Acoperirea cu teste, LIVRATA (
s5-teste,docs\cercetare\rec_s5_teste.md,docs\diff_s5_teste.patch): suita noua headlesstest_s5_validari_articole.prg35 PASS / 0 FAIL (validarile dininainte_de_do_termin, garda de no-op, SQL-ul dinScrieArticoleFacturaEditatecu mock pegoExecutor, fara Oracle) si suita noua pe formular vizibiltest_ui_s5_grid_pret_achizitie.prg14 PASS / 0 FAIL (15 coloane, linie de set needitabila cu marcaj,pret_achizitieprimeste focus doar pe linie noua). Cifre numarate din loguri de orchestrator; suita UI se termina inGATA, deci a trecut de handshake. - Ramura moarta consemnata, NU se repara: validarea
Isnull(pret)(omodificari.vc2:14340) e neatingibila pe fluxul real —tvd.pretvineNOT NULLdin view, oriceREPLACEcu.NULL.da eroare VFP 1581. Guard redundant, inofensiv;omodificari.vc2e livrare inchisa si verificata si nu se redeschide pentru asta. - TESTUL CU SCRIERE REALA IN ORACLE, GATA — 25 PASS / 0 FAIL (
test_s5_scriere_reala.prg, raportdocs\cercetare\rec_s5_scriere_reala.md). Premisa deciziei 38 e dovedita direct, in tranzactie, peid_vanzare = 1049: dupafinalizeaza_modificare_notalinia marcata stearsa (det=1582) revine cuSTERS = 0— resetul dinactualizeaza_vanzarichiar o invie — iar dupaScrieArticoleFacturaEditatee din nouSTERS = 1. Trecerea 2 (reeditare fara nicio modificare) reproduce exact acelasi tipar, deci stergerea e definitiva la reeditare — consecinta 2 din decizia 38, dovedita. In plus: linia noua inserata cuID_VANZARE_DETalocat de trigger (det=1588) siPRET_ACHIZITIE = 77.77exact cat s-a tastat;PRET_ACHIZITIEpe linia existenta editata neatins (10 -> 10); totalurile recalculate coerente (747.96 + 157.06 = 905.02, egal cu suma liniilor active). Verificat independent prinsqlplusdupa terminarea procesului VFP, cu rezultatele in raport — nu doar din logul testului. - Date de test consumate ireversibil:
cod1140887->1140896->1140897peid_vanzare = 1049;det=1582ramane sters definitiv;det=1588e linie noua creata de test. Documentul nu e cel folosit de suitele de regresie (1050). - Ce NU acopera testul (din raport, de stiut inainte de livrare): validarile din
inainte_de_do_termin(buton = 1fortat direct — dar sunt acoperite separat de suita headless 35/0),frm_modific2024neinstantiat, liniile din seturi neatinse (documentul n-areid_vanzare_setnenul), al doilea punct de intrare (comun.vc2:2491) nerulat, documentele in valuta si cu discount nenul netestate (parametrul de discount doar cu0, niciodataNULLsau nenul), si calea de esec partial / ROLLBACK neprovocata. - DISCOUNT + VALUTA, GATA — 46 PASS / 0 FAIL (
test_s5_discount_valuta.prg, raportdocs\cercetare\rec_s5_discount_valuta.md). Inchide doua din golurile declarate mai sus. Verdictul pe decizia 41:NULLPASTREAZA discountul curent, nu-l zeroeaza — dovedit pe date prin apeluri succesive in aceeasi tranzactie (0 -> recalc(12.5) -> 12.50 -> recalc(NULL) -> inca 12.50, totaluri identice pana la a 4-a zecimala -> recalc(0) -> 0), deci0explicit siNULLnu se confunda. Codul concorda:SELECT NVL(V_DISCOUNT, discount) ... FROM vanzari(ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql:16043, verificat de orchestrator). Niciun defect in procedura. Valoarea nenula scade totalurile exact (747.96-12.50=735.46,discount_tva=Round(12.5*0.21,2)=2.63). Verificat separat pe lantul real:finalizeaza_modificare_notanu atingeDISCOUNT, deci riscul „orice salvare ulterioara sterge discountul" nu se produce. - PREMISA VECHE INFIRMATA, nu o mai repeta: afirmatia ca „nu exista in schema un document
descoperibil simultan cu articole si in valuta reala" e gresita. Verificat de orchestrator prin
sqlplus: 28 randuriVANZARIcuIN_VALUTA = 1, dintre care 25 cu linii active, si 8 complet formate (curs + rand inVANZARI_CURSURI). Recalculul Oracle a fost acoperit peid_vanzare = 1037(curs 5.2688), cu ROLLBACK la final — documentul e arhiva si ramane neatins. Limita reala, alta decat cea presupusa: niciun document in valuta nu e din luna curenta (cel mai recent 05.2026), deci lantul complet de editare nu poate fi rulat pe valuta — doar recalculul. - Consumat aici: un singur
cod,1140897 -> 1140898. Verificat de orchestrator dupa rulare:id_vanzare = 1049arediscount = 0si totalurile restaurate exact (747.96 / 157.06 / 905.02), liniile neschimbate (1581cant=2,1582sters,1583,1588cupret_achizitie = 77.77). - Ce NU e facut: verificarea pe ecran de Marius, diff-urile consolidate, changelog
:nou:, si decizia de commit / push / SVN. Din golurile de acoperire raman: liniile din seturi, al doilea punct de intrare (comun.vc2:2491) si calea de ROLLBACK la esec partial. - Capcana platita, sa nu se repete: exportul
all_sourceculinesizeprea mic rupe linii lungi prin mijlocul identificatorilor si corupe tacut orice script construit din el. Un script de pachet se face de la ultimul script aplicat dinSCRIPTURI_CLAR, nu de la un export. Detalii inhandoff_s5.md;COMUN\docs\oracle_export.mda fost corectat.
COMIS PE BRANCH punct6-s4-runda3 — 09.08.2026, NEIMPINS, NEINTRAT IN SVN
| Repo | Commit | Ce contine |
|---|---|---|
COMUN (comun.git) |
b9eba29 |
tot #6 / S4 runda 3: omodificari.vc2, ofacturare_editare.prg, ofacturare_comun.vc2, comun.vc2, anaf_efactura.vc2, cele doua .sc2 de import, docs, 13 suite de test noi |
ROAFACTURARE |
97d1613 |
roafacturare.pj2 — omodificari.vcx intra in proiect |
git_sync.ps1 rulat inainte de commit: 0 convertite, 463 la zi, 0 esuate — textul comis
corespunde binarelor. push nefacut si SVN neatins (ramane la r18006/r18007) — amandoua sunt
decizia lui Marius, dupa review. Lasate deliberat necomise: backup-ul
ofacturare_comun.pre_s4butoane.bak.vc2 si test_nume_coloana_modificat.log. docs\ din
ROAFACTURARE ramane neversionat. Commit-ul din COMUN include si docs\todos.txt cu editarile lui
Marius la punctele 13 si 20.
#6 / S4, decizia 35 — intrare directa in valuta la adaugarea de linii, GATA 09.08.2026
Cand documentul e in valuta (tvanz.in_valuta = 1), dialogul frm_articol_factura deschis din
cmdAdaugaArticol primeste acum poArticol.tip_valuta = 1 + Curs / multiplicator / nume_val /
id_valuta luate de pe tvanz (fara interogare Oracle noua), deci utilizatorul introduce pretul
direct in valuta documentului, nu in RON. AdaugaLinieTvdDinArticol ramifica: pe
tip_valuta = 1 citeste direct campurile _val (pretftva_val/pretctva_val/discount_unitar_val/
discount_unitar_ctva_val), pe tip_valuta = 0 pastreaza conversia existenta
(* multiplicator / curs). Ramura RON e neatinsa.
COMUN\clase\ofacturare.vc2 NU a fost atins — verificat pe mtime (.vc2/.vcx/.vct toate la
07.08.2026 22:18, nemodificate). Asta era conditia care conta: frm_facturare_articole si
frm_facturare_articole2 folosesc activ, in productie, aceeasi ramura tip_valuta = 1, deci
orice atingere a codului dialogului ar fi fost o regresie potentiala pe formularul de compunere.
Premisa initiala a deciziei 35 (ca ar fi nevoie de poDate.in_valuta/zi_curs/id_valuta) era
gresita — vezi corectia de la decizia 35 si docs\handoff_decizia35_valuta_dialog.md.
Verificat de orchestrator pe disc (cifre numarate din loguri): test_adauga_linie_valuta.prg
extins la 16 PASS / 0 FAIL — acopera ambele ramuri, scenariul A (intrare in RON, conversie la
stocare, comportamentul vechi neregresat) si scenariul B (intrare directa in valuta). Asertia care
conteaza: 200 EUR introdus pe un document cu curs 5.2688 ramane 200.00 in tvd.pret — nu
1053.76 (dubla conversie inversa) si nici 37.96 (200/5.2688) — iar bara de totaluri recompune
corect 1053.76 RON. Regresie neschimbata: test_page3_articole 14/2 (cele 2 = artefactul
headless de la datoria 7), test_incarca_vanzare_din_nota 5/0, test_adauga_linie_articol
20/0, test_ui_sterge_linie 8/0, test_verdict_act_rul 26/0. Rulari 18:57-18:59, toate
dupa ultima editare de cod (omodificari.vc2 18:53:21, ofacturare_editare.prg 18:52:59).
Cens de octeti 2 aa / 2 e3 / 2 fe, zero EF BF BD. Text si binar sincrone, necomis.
Diff: docs\diff_s4_valuta_dialog.patch + docs\diff_s4_valuta_dialog_prg.patch +
docs\diff_s4_valuta_dialog_test.patch. Raport: docs\cercetare\rec_s4_valuta_dialog.md.
Ramas de verificat pe ecran de Marius (netestabil headless, dialogul e modal Show(1)): tastarea
reala in caseta de pret pe un document in valuta, eticheta de valuta afisata, si interactiunea cu
bifa „pret cu TVA" in timp ce se editeaza pretul in valuta.
Datorie mica de stil, preexistenta: comentariul de metoda de la AdaugaLinieTvdDinArticol
(omodificari.vc2:13081-13085) are 5 randuri si contine o justificare de proiectare („separata de
Click ca sa fie testabila..."), peste regula „o linie, strict functional" din decizia 29. Nu a
fost introdusa de aceasta livrare — venea din sub-blocul B partea 2, iar runda de acum doar i-a
actualizat continutul, la aceeasi lungime. De curatat cand se mai atinge metoda.
#6 / S4 sub-blocul C, partea 2 — verdictul de corelatie ACT/RUL, GATA 09.08.2026
Pe pgfArticole.PAGE3 (COMUN\clase\omodificari.vc2): doua randuri noi (Total ACT, Total RUL)
plus un indicator informativ cu 3 stari (sincronizat/divergent/nu se aplica), calculate in metoda
noua ActualizeazaVerdictActRul (apelata din ActualizeazaBaraTotaluri). Formulele erau deja
verificate in cercetare\rec_suma_act.md — s-au aplicat direct. tvd capata coloana in_stoc
(ofacturare_editare.prg, extinde interogarea existenta, nu deschide una noua) pentru corectia
liniilor nestocate din RUL. Randul 2 a cerut spatiu vertical nou: pgfArticole.Height/
frm_modific2024.Height +22px, 4 butoane din dreapta mutate cu acelasi delta; grid-ul de articole
nu s-a atins (0 linii pierdute). Detalii, cens de octeti, teste: cercetare\rec_s4_runda3c2.md.
Descoperire pe parcurs: pe documentul de test folosit pentru suita noua, randurile RUL
"duplicat" (ID_TIP_RULAJ=0 care dubleaza exact un rand din perechea ID_TIP_RULAJ=3, semnalate ca
intrebare deschisa in rec_suma_act.md F.3) fac ca formula aplicata exact cum a fost specificata
sa dea "divergent" desi documentul e corect emis (ACT=1924.59, RUL literal=3728.18). Nu s-a
adaugat o regula de excludere nedecisa — ramane intrebare pentru Marius (vezi raportul).
Testat: regresie neschimbata (test_page3_articole.prg 14/2, test_incarca_vanzare_din_nota.prg
5/0, test_adauga_linie_articol.prg 20/0, test_adauga_linie_valuta.prg 6/0,
test_ui_sterge_linie.prg 8/0), suita noua test_verdict_act_rul.prg 18 PASS / 0 FAIL (calcul
verificat prin recalcul independent SCAN, marcaj "(ajustat)", text informativ, tip=51 fortat "nu se
aplica", ascundere pe transfer/custodie, alegere cont pe grupa de tip, corectie sintetica pe linie
nestocata). Cens de octeti: stricat si reparat (acelasi tipar cunoscut), identic cu baseline la
final. Scris in binar (write-back OK dupa un fidelity-check picat pe formatarea liniilor goale,
rezolvat prin adoptarea textului regenerat), necomis. Diff:
docs\diff_s4_runda3c2_verdict.patch + docs\diff_s4_runda3c2_ofacturare_editare.patch.
Reverificat de orchestrator pe starea de pe disc (nu din raportul agentului): cifrele numarate
din loguri, nu citite din raport — toate se confirma, inclusiv cele 18/0 ale suitei noi. Rularile
(18:03-18:08) sunt dupa ultima editare de cod (omodificari.vc2 17:59:38,
ofacturare_editare.prg 17:50:48), deci nu se repeta golul de acoperire de ieri. Text si binar
sincrone; ActualizeazaVerdictActRul, lblTotalAct, lblTotalRul, lblVerdict, lRulAjustat
confirmate prezente in .VCT. Cens de octeti pe omodificari.vc2: 2 aa / 2 e3 / 2 fe, zero
EF BF BD — identic cu baseline. Testul de garda (ofacturare_editare.prg scos din
SET PROCEDURE -> PageCount = 2) trece, deci ROACONT/ROAGEST raman intacte. Zero procese ramase,
zero scrieri in Oracle, zero commituri.
CELE DOUA INTREBARI AU PRIMIT RASPUNS (Marius, 09.08.2026) — deciziile 36 si 37, si amandoua cer o runda de corectie pe cod:
- Suma
RULse face doar peID_TIP_RULAJ = 0(decizia 36) — perechile3sunt miscari virtuale, tin locul procesului verbal de schimbare de pret. Asta inlocuieste formula aplicata, inchide fals-pozitivul de pecod=1140895(suma pe0da exact 1924.59) si elimina complet nevoia de euristica pe potrivire de valoare. - Contul pe rate/contract: se accepta
4111,411si461(decizia 37), nu doar4111.
Corectia deciziilor 36 si 37, GATA 09.08.2026 (cercetare\rec_s4_runda3c3.md): formula RUL
schimbata la SUM((cant+cante)*pretvtva) FOR id_tip_rulaj=0; contul de referinta pe tip 2/6/52
extins la o lista (4111,411,461) prin $ pe string delimitat, in loc de == pe o singura
valoare. Pe cod=1140895: Total ACT = Total RUL = 1924.59, verdict sincronizat
(asertia veche care astepta "divergent" a fost inversata, cu verificare explicita a cifrei).
Regresie neschimbata + suita dedicata 26 PASS / 0 FAIL (18 vechi + 8 noi: excludere
id_tip_rulaj=3, includere id_tip_rulaj=0, cele trei conturi rate/contract). Scris in binar,
necomis. Diff: docs\diff_s4_runda3c3_decizii_36_37.patch + docs\diff_s4_runda3c3_test.patch.
Reverificat de orchestrator pe disc: cifre numarate din loguri (26/0 pe suita dedicata, regresie
14/2 · 5/0 · 20/0 · 6/0 · 8/0), rulari 18:40-18:42 dupa ultima editare (18:34:03); filtrul din
cod e SUM (Nvl(cant,0)+Nvl(cante,0))*Nvl(pretvtva,0) FOR Nvl(sters,0)=0 AND Nvl(id_tip_rulaj,0)=0
(omodificari.vc2:13035-13036); cens de octeti 2 aa / 2 e3 / 2 fe, zero EF BF BD; text si binar
sincrone. Trei lucruri bine facute, de pastrat ca tipar: (1) toate cele trei sume
(tact/trul/tvd) salveaza si restaureaza Recno() cu garda Between(...) si GO ... IN alias,
plus work-area restaurata la final — exact defectul din partea 1, care nu s-a repetat; (2) lista de
conturi se testeaza cu (','+Alltrim(scc)+',') $ lcCont, deci delimitata prin virgule, ceea ce
inchide capcana prefixului 411/4111 mai bine decat un == repetat; (3) exista asertie ca pe
tip=1 contul ramane strict 4111 — largirea la 411/461 nu scapa pe facturile obisnuite.
Ce urmeaza (stabilit de Marius, 09.08.2026): intrarea directa in valuta in
frm_articol_factura — decizia 35. Premisa deciziei a fost corectata intre timp: nu cere
atins ofacturare.vc2 (vezi decizia 35 mai jos si docs\handoff_decizia35_valuta_dialog.md).
Ultima actualizare anterioara: 09.08.2026, dupa cele doua defecte de pe pagina de articole (culoare + valuta), REZOLVATE.
PREDARE — sesiunea din 09.08.2026 s-a incheiat la prag de context
Cele patru blocuri cerute de Marius ("toate") plus doua fire nascute din ele sunt terminate, scrise
in binar, necomise. Nimic nu e intr-o stare periculoasa: toate perechile text/binar sunt
sincrone (verificat pe mtime), zero procese vfp9.exe ramase, zero scrieri in Oracle in toata
sesiunea, zero commituri pe niciun arbore.
Inchise azi, fiecare cu agent proaspat si fiecare verificat pe disc de orchestrator (nu din
raportul agentului): datoria 6 (baza de regresie) · cei 5 apelanti frm_modific2024 + linia din
roagest.prg · sub-blocul B partea 1 (stergere logica) · sub-blocul C partea 1 (bara de totaluri +
discount de antet) · sub-blocul B partea 2 (adaugare de linii + selector) · fixul de culoare si valuta.
Ce urmeaza dupa aceasta predare — verdictul ACT/RUL s-a inchis intre timp (vezi sectiunea de
mai sus); ramane doar intrarea directa in valuta in frm_articol_factura (decizia 35).
Cifrele de regresie de plecare (masurate pe starea de pe disc la inchiderea sesiunii):
test_page3_articole.prg 14 PASS / 2 FAIL (cele 2 = artefactul headless de la datoria 7, nu se
repara), test_incarca_vanzare_din_nota.prg 5/0, test_adauga_linie_articol.prg 20/0,
test_adauga_linie_valuta.prg 6/0, test_ui_sterge_linie.prg 8/0.
Avertisment pentru sesiunea urmatoare: verificarea pe disc a prins azi patru erori de
raportare care altfel intrau tacit in stare — doua cifre umflate (7/7 cand logul avea 6, 10/10
cand avea 9), o cauza atribuita gresit (esecurile de captura — era -SyncDir, nu masina ocupata), si
o premisa gresita propagata chiar de orchestrator (tip_valuta = 0). Cifra se ia numarand liniile
din log, nu din raport, si dovada ca rularea a ajuns la capat e linia de REZULTAT.
#6, doua defecte noi pe pagina de articole (culoare linie stearsa + valuta linie noua) — REZOLVATE 09.08.2026
Raportate dupa livrarea sub-blocului B partea 2 (mai jos). Ambele in COMUN\clase\omodificari.vc2
(+ ofacturare_editare.prg pentru al doilea). Write-back facut (fidelity check OK), text si binar
sincrone, necomise. Backup dinaintea fixului: omodificari.vc2.pre_fix_culoare.bak,
ofacturare_editare.prg.pre_fix_culoare.bak. Diff: docs\diff_s4_fix_culoare_valuta.patch +
docs\diff_s4_fix_culoare_valuta_ofacturare_editare.patch.
Reverificat de orchestrator pe starea finala de pe disc: ofacturare_editare.prg fusese modificat
la 17:08:48, adica la 40 de secunde dupa ultima rulare de test (17:08:08), deci starea livrata nu
era acoperita de nicio suita. Rerulat test_page3_articole.prg pe starea de pe disc: 14 PASS /
2 FAIL, exit 0, zero dialoguri — identic cu baseline-ul, cele 2 FAIL fiind artefactul headless de la
datoria 7. Editarea era antetul fisierului. Golul e inchis.
- Defectul 1 — marcajul vizual al liniei sterse nu se vedea, cauza reala gasita:
grdArticoleFacturaeADD OBJECT ... AS _grdrow(_grd_base.vc2:445), iar_grdrow.Init(_grd_base.vc2:474-487) face necondiționatThis.SetAll("DynamicForeColor", "iif(RECNO()= This.nRecno,...)", "Column")candnrgbrow=1(implicit) — asta suprascrie la instantiereDynamicForeColor-ul pestersscris in clasa, pe toate cele 14 coloane, cu o expresie de evidentiere-linie-curenta care ignoratvd.sterscu totul (de-asta pixelii ieseau negri puri, nu gri).grdRulaje/grdRulajeObinv(paginile 1/2) ocolesc problema cuInitGOL, care taie intreg lantulDoDefault()(deci si editabilitatea din_grid.Init) — solutie prea larga pentrugrdArticoleFactura, care are nevoie sa ramana editabil. Fix cu o singura proprietate:nrgbrow = 0peADD OBJECT-ul gridului (omodificari.vc2:12317) — tipar deja folosit in alte 20+ griduri din suita (configurare.vc2,onomenclatoare.vc2), opreste doar blocul de evidentiere din_grdrow.Init/AfterRowColChange, fara sa atingaDoDefault()->_grid.Init()(editabilitateacantitate/pret/pret_cu_tvaramane intacta, verificat). Dovedit cu esantionare de pixeli, nu vizual:screenshots_after_fix_culoare\ step_0_contrast_gri_vs_negru.png(document cu 4 linii, linia 2 marcata stearsa, linia curenta a gridului mutata pe linia 3 ca sa nu acopere culoarea de testat) — pixelul cel mai inchis pe linia stearsa eRGB(150,150,150)(exact culoarea dinDynamicForeColor), pe liniile normale eRGB(0,0,0). A doua captura,step_0_linia_grizata.png(document cu 2 linii), confirma acelasi lucru. Capturile "before" (pixeli negri puri pe linia stearsa, din sesiunea anterioara) mutate inscreenshots_before_fix_culoare\. - Defectul 2 — liniile adaugate intrau fortat in RON, chiar pe documente in valuta:
AdaugaLinieTvdDinArticolnu avea niciun camptip_valutade reparat (tvdnu are asa ceva — view-ulVVANZARI_ARTICOLEnu-l expune); cauza reala era in alta parte:pret/discount_unitarale liniei noi veneau direct din dialogulfrm_articol_factura, care lucreaza in RON (poDate.in_valutahardcodat 0), si se scriau NECONVERTITE intvd— dar bara de totaluri (ActualizeazaBaraTotaluri, decizia 33) insumeazatvd.valoarebrut si inmulteste o singura data cutvanz.curs/multiplicator, presupunand ca toate liniile sunt deja in valuta documentului (verificat pe date:id_vanzare=1037, document EURO curs 5.2688, linia arepret=200brut = 200 EUR, nu 200 RON). O linie noua in RON nefiltrata prin acest cursor umfla totalul convertit. Fix, fara sa ating dialogul (frm_articol_factura/ofacturare.vc2nu sunt in proprietatea acestei livrari, iarpoDate.in_valuta=1ar cere validare suplimentarazi_curs/id_valutanetestabila headless):AdaugaLinieTvdDinArticolconverteste acum pretul/discountul RON calculate de dialog in valuta documentului (* tvanz.multiplicator / tvanz.curs, no-op cand documentul e RON —curs=multiplicator=1), si preiaid_valuta/nume_valde petvanzin loc de.Null./gol.tvanzextins cuin_valuta/id_valuta/nume_val(join nou penom_valuteinIncarcaVanzareNota,ofacturare_editare.prg:150-176) — coloane confirmate pe schema (VANZARI.IN_VALUTA/ID_VALUTAexista,nom_valute: 0=LEI, 1=USD, 2=EURO, 3=RON). Limitare ramasa, documentata: dialogul tot lucreaza in RON (utilizatorul introduce pretul in RON chiar si pe un document in valuta) — doar STOCAREA e acum corecta valutar; a face dialogul sa accepte pret direct in valuta ar cerepoDate.id_valuta/zi_curssi atingereaofacturare.vc2, in afara scope-ului primit. - Testat: regresie neschimbata —
test_page3_articole.prg14 PASS / 2 FAIL (identic, cele 2 = artefactul headless de la datoria 7),test_incarca_vanzare_din_nota.prg5/0,test_adauga_linie_articol.prg20/0 (cazul RON, curs=1 — conversia e no-op, neregresat). Suita nouatest_adauga_linie_valuta.prg(document real +tvanzsuprascris manual cu curs=5.2688/EURO, ca sa simuleze un document in valuta — motivarea de atunci, „nu exista in schema un caz descoperibil simultan cu articole si in valuta reala", s-a dovedit GRESITA: exista 25 de documenteIN_VALUTA=1cu linii active, vezi sectiunea S5; simularea ramane valida ca test, dar nu era singura optiune): 6 PASS / 0 FAIL, verifica pretul convertit (200 EUR),id_valuta/nume_valpreluate, si bara de totaluri recompunand exact 1053.76 RON. Suita UI nouatest_ui_culoare_contrast.prg(captura + esantionare pixeli, de mai sus): log complet pana laREZULTAT, exit 0, zero dialoguri. Toate rulate subwatchdog_vfp.ps1/vfp_ui_harness.ps1 -SyncDirexplicit. - Cens de octeti: stricat o data (Edit-ul pe
omodificari.vc2a reencodat cele douaCaptioncu diacriticeRenunțare/Adăugare/Ștergere, capcana deja cunoscuta), reparat byte-cu-byte cu Perl inainte de write-back; cens final identic cu baseline,2 aa/2 e3/2 fe, zeroEF BF BD, verificat inainte si dupa.
Ultima actualizare anterioara: 09.08.2026, dupa sub-blocul B, PARTEA 2 — adaugarea de linii, GATA.
Pe pgfArticole.PAGE3: buton nou cmdAdaugaArticol (langa cmdStergeArticol), care alege un
articol prin caut_articol() (selector existent pe nomenclator, fara stoc, fara politica de
pret — decizia 34), deschide dialogul real frm_articol_factura (gnScadereStoc=0 — decizia
15, fara verificare de stoc), si la OK adauga in tvd o linie noua cu id_vanzare_det=0 prin
metoda noua Thisform.AdaugaLinieTvdDinArticol (separata de Click ca sa fie testabila fara
dialogul modal). poArticol se construieste cu functia noua CreeazaPoArticolNouTvd
(ofacturare_editare.prg), pe modelul PROVEN din suita #7 (test_pret_cu_tva_dialog.prg, 49+11
proprietati). Limitare cunoscuta: doar linii in RON (tip_valuta=0 fix); editarea unei linii
existente prin acelasi dialog (dublu-clic) nu e in scope, ramane nefacuta. Testat: regresie
neschimbata (test_page3_articole.prg 14/2, test_incarca_vanzare_din_nota.prg 5/5), suita noua
test_adauga_linie_articol.prg 20/20 PASS (headless, direct pe functii — Show(1) modal
netestabil headless). Cele doua goluri lasate de partea 1, inchise: (1) comutarea inapoi a
stergerii (al doilea click, sters 1->0) — asertia mutata inainte de HarnessStep, acum 8/8
PASS dovedit pe ambele sensuri; (2) captura vizuala a grizarii DynamicForeColor — obtinuta
(cauza reala a esecurilor anterioare: gcSyncDir din test nu se potrivea cu -SyncDir implicit
al vfp_ui_harness.ps1, nu masina ocupata), si reveleaza un defect real, nou descoperit:
culoarea gri nu se aplica vizual (verificat prin esantionare de pixeli, nu doar vizual — linia cu
sters=1 are pixeli negri puri, imposibil daca RGB(150,150,150) s-ar aplica), desi codul
DynamicForeColor e corect scris pe toate cele 14 coloane. Defectul apartine livrarii
anterioare (stergerea logica, sub-blocul B partea 1) — nereparat, predat mai departe. Cens de
octeti stricat si reparat de 2 ori in sesiune (acelasi tipar cunoscut), identic cu baseline la
final: 2 aa/2 e3/2 fe, zero EF BF BD. Scris in binar (write-back OK dupa 2 fidelity-check-uri
picate pe ordine, rezolvate prin adoptarea textului regenerat), necomis. Diff:
docs\diff_s4_runda3b2_adaugare.patch (+ docs\diff_s4_runda3b2_ofacturare_editare.patch).
Raport: docs\cercetare\rec_s4_runda3b2.md.
Inaintea acesteia, in aceeasi zi: sub-blocul C, PARTIAL — bara de totaluri + discount de
antet (partea 1). Pe pgfArticole.PAGE3, sub grdArticoleFactura: bara noua cu totalul liniilor
active convertit RON la cursul documentului (decizia 33, tvanz.curs/multiplicator adaugate),
discountul de antet editabil (tvanz.discount, decizia 17), total net (linii - discount) si totalul
salvat vechi ca referinta; ascunsa pe transfer/custodie (decizia 22), grid-ul ramane vizibil.
Nu s-a reutilizat clasa _grdfooter1 (mecanism strict de sumare pe coloane de grid, nu poate
converti valutar/edita/afisa text liber) — bara noua respecta doar pozitia si stilul ei (imediat sub
grid, 35px, spatiu deja neutilizat, 0 linii pierdute din grid). Doua defecte reale gasite si reparate
in aceeasi sesiune (nu preexistau): tvanz nu avea placeholder in Load() (controlul editabil legat
pe tvanz.discount pica la instantiere, eroare 1736), si SUM...FOR din metoda noua muta pointerul
in tvd fara sa-l restaureze (rand citit gresit dupa editare) — ambele descoperite prin regresia
headless, nu prin inspectie. Testat: test_page3_articole.prg 14 PASS / 2 FAIL (cele 2, artefact
headless cunoscut de la datoria 7), test_incarca_vanzare_din_nota.prg 5/5, exit 0, zero
dialoguri. Test UI nou test_ui_bara_totaluri.prg: 9 PASS / 0 FAIL in log (nu 10/10 cum s-a
raportat initial — renumarat de orchestrator), rularea se opreste la READY 0 fara linia de
REZULTAT, pe
cod=1139934/id_vanzare=882 — bara vizibila, tipuri de camp corecte, total calculat exact, discount
propagat, total net recalculat, ascundere/reafisare pe schimbarea de tip verificate direct pe
proprietatea nTipVanzare. Captura de ecran n-a putut fi obtinuta (vfp_ui_harness.ps1 in mod
-A a esuat sa detecteze pornirea in 8 incercari, desi testul a rulat complet pana la READY 0 —
acelasi tipar de infrastructura documentat mai jos, nu problema de cod). Cens de octeti: 2 aa/2 e3/ 2 fe, zero EF BF BD, identic inainte/dupa (stricat si reparat de mai multe ori in timpul editarii,
capcana deja cunoscuta). Scris in binar (write-back OK dupa 3 rulari, fidelity-check picat pe
ordine de fiecare data, rezolvat prin adoptarea textului regenerat), necomis. Diff:
docs\diff_s4_runda3c_totaluri.patch (+ docs\diff_s4_runda3c_ofacturare_editare.patch, izolat).
Raport: docs\cercetare\rec_s4_runda3c.md. Verdictul de corelatie cu ACT/RUL NU e facut —
formulele sunt deja stabilite si verificate pe date in rec_suma_act.md, predat ca partea 2 a
sub-blocului C (contul pe tip, filtrul cod+an+luna, indicatorul cu 3 stari, threading an/luna
in clasa).
Inaintea acesteia, in aceeasi zi: sub-blocul B, PARTIAL — doar stergerea de linii
(butonul cmdStergeArticol pe PAGE3, comuta tvd.sters/lmodificat, marcaj vizual
DynamicForeColor gri pe randul marcat). Adaugarea de linii (dialog frm_articol_factura) NU
e facuta — sub-blocul s-a dovedit prea mare pentru un context si a fost impartit, cu aprobarea
briefingului. Cercetarea de contract pentru adaugare (proprietati poArticol/poDate citite de
dialog, cum se ocoleste gnScadereStoc, ce lipseste inca — picker de articol) e completa si
predata in docs\handoff_s4_runda3b_adaugare.md. Testat: regresie neschimbata (14/2, 5/5),
plus test UI nou dedicat (test_ui_sterge_linie.prg). Atentie la cifra: logul are 6 PASS /
0 FAIL, nu 7/7 cum s-a raportat initial — rularea s-a taiat la READY, adica exact la
handshake-ul de captura, si n-a ajuns la linia de REZULTAT. Dovedit: butonul exista si e vizibil,
click-ul pune sters=1 + lmodificat=.T. pe linia curenta, linia vecina ramane neatinsa.
NEdovedit: comutarea inapoi (al doilea click, care readuce sters=0) — asertia era programata
dupa handshake si n-a mai rulat. Captura de ecran n-a putut fi obtinuta (vfp_ui_harness.ps1 in mod -A a esuat sistematic de 16 ori sa detecteze pornirea,
desi procesul chiar a rulat testul complet pana la capat de fiecare data — problema de
infrastructura/masina ocupata, nu de cod; detalii in raport). Scris in binar (write-back
FACUT dupa un fidelity-check picat pe ordine, rezolvat prin adoptarea textului regenerat),
necomis. Diff: docs\diff_s4_runda3b_linii.patch. Raport: docs\cercetare\rec_s4_runda3b.md.
Inaintea acesteia, in aceeasi zi: extinderea la cei 5 apelanti frm_modific2024 + linia din
roagest.prg — helper nou PregatesteArticoleFacturaEditare in ofacturare_editare.prg, apelat
gardat inainte de Createobject la afisjurcom.do_modifica (registrul jurnal, viu in ROACONT),
anaf_efactura.importmodifica si cele doua .sc2 de import; linia SET PROCEDURE TO ofacturare_editare.prg adaugata in roagest.prg. Detalii: docs\cercetare\rec_s4_apelanti.md,
diff docs\diff_s4_apelanti_frm_modific2024.patch. Mai devreme: rezolvarea datoriei 6 — baza
de regresie #6/S4 e din nou solida, iar suitele nu mai hardcodeaza documente: si-l descopera
singure, deci nu mai mor la urmatoarea realocare de cod. Mai devreme inca: doua defecte de
editare pe pagina de articole (coloanele cantitate/pret needitabile, valoare defazata la bifa
"pret cu TVA"), dovedite pe ecran; doua defecte de afisare (grid gol, pageframe colapsat), trei
defecte pe editarea facturii si regresia de encoding din ofacturare_comun.vc2. S4 runda 3A
are write-back-ul FACUT. Tot ce e mai sus e scris in binar si necomis.
In lucru acum (decizia lui Marius, 09.08.2026 — "toate"), strict secvential, cate un agent proaspat
per bloc, pentru ca se ating aceleasi fisiere: 1. datoria 6 GATA; 2. extinderea la cei 5 apelanti +
linia din roagest.prg GATA; 3. sub-blocul B — stergerea si adaugarea GATA (integral,
docs\cercetare\rec_s4_runda3b2.md); 4. sub-blocul C — partea 1 (totaluri + discount) GATA,
verdictul de corelatie ACT/RUL preda mai departe (docs\cercetare\rec_s4_runda3c.md).
Stare la zi
| Punct | Stare |
|---|---|
#8 — denormalizare VANZARI |
COMIS (SVN r17990-r17993, r17995). Ramane build-ul ROAAUTO la Marius si cateva datorii mici, mai jos |
| #7 — pret cu TVA pe linie | COMIS si LIVRAT (SVN r17998/r17999/r18001, git 8df728c/46df824+). Build + deploy 2.11.14 facut de Marius pe 08.08.2026 |
| #6 — editare factura emisa | IN LUCRU, pornit 08.08.2026. 10 stories, plan_06_editare_factura.md. S1-S3 si S4 rundele 1-2 sunt COMISE in SVN (r18003-r18006, aprobate de Marius 08.08.2026): view-ul VVANZARI_ARTICOLE, helperele comune, pagina de articole doar-afisare, butonul de editare, inregistrarile din roafacturare.prg si roacont.prg. S4 runda 3A (grid editabil, sub-blocul A) e scrisa in binar. Separat, trei defecte de editare (crsJtvaTemp neinitializat, doua butoane de modificare, 12 diacritice distruse) si doua defecte de afisare (grid gol, pageframe colapsat) REZOLVATE, scrise in binar, necomise. Extinderea la cei 5 apelanti + linia din roagest.prg GATA (09.08.2026, docs\cercetare\rec_s4_apelanti.md) |
| #10 / #11 / #12 | amanate, motivele in plan_index.md |
versiune_db.txt = 2026_08_08_01 (bumpat 08.08.2026 pentru view-ul VVANZARI_ARTICOLE; #7 n-a avut DDL).
Ce a livrat #7 (pentru context, nu de refacut)
Lucrare VFP-only, doar in COMUN\clase\ofacturare.vcx. Bifa "Pret cu TVA inclus" editabila in
dialogul per-articol; buton de modificare + dublu-clic pe linie in frm_facturare_articole, ambele
prin do_modifica; plafonul de cantitate recalculat din stocul disponibil; articolele gestionabile
redeschid tabelul cu gestiuni (do_alege_stoc cu tnIdTempExclus). Infrastructura de calcul
exista deja si ramifica pe VANZARI_DETALII.PRET_CU_TVA — lipsea doar posibilitatea de a schimba
flagul.
Suita de regresie e in comun.git (c5b0ce3), COMUN\utile\Teste\facturare_pret_cu_tva\:
4 niveluri, 38 de asertii, toate PASS. Nu e in SVN (utile\Teste e ignorat acolo).
Ce preda #7 catre #6: sectiunea "Ce preda #7 catre S6" din plan_06_editare_factura.md.
Punctul care conteaza: plafonul de cantitate din #7 se sprijina pe cursorul de stoc deschis in
formularul de compunere; la o factura deja salvata acel cursor poate sa nu existe, deci #6 va avea
nevoie de alta sursa pentru plafon.
#6, runda 1 (S1-S3) — implementat 08.08.2026, corectii 08.08.2026
Diff: docs\diff_consolidat_runda1_3.patch + docs\diff_runda4_scoate_garda.patch (netrimise inca
la commit, asteapta review). Patch-urile per runda raman pe disc pentru istoric.
COMUN\clase\ofacturare_comun.vc2, clasafrm_facturi: metodado_editare_factura(clonata dupado_sterge: garzi luna inchisa / document sters / proforma / luna curenta / referinte / eFactura, apoiIncarcaCursoareModificareNota+Createobject([frm_modific2024])- write-back prin
OSCRIE_IN_FISIERE+pack_contafin.finalizeaza_modificare_nota, dupa tiparul dinafisjurcom.do_modifica). ButonBut_editare1, incbuton3alaturi debut_modifica1/But_modifica2(decizia lui Marius din 08.08.2026 — fara token nou).
- write-back prin
COMUN\programe\ofacturare_editare.prg(fisier nou, inregistrat inPrograme\roafacturare.prgcuSet Procedure To ofacturare_editare.prg Additive):EsteInEFactura(tnIdFact)(garda extrasa dindo_modifica) siIncarcaCursoareModificareNota(tnCod, tnAn, tnLuna, tlAratasterse)(incarcarea cursoarelor notei/rulajelor, copiata dinafisjurcom.do_modifica). Ambele reutilizabile din runda 2 (inlocuirea codului inline dinafisjurcom).- Gasit si reparat in runda 1 (lipsea din
Programe\roafacturare.prg, altfelCreateobject('frm_modific2024')pica cu "Class definition not found" chiar si in productie):SET CLASSLIB TO omodificari.vcx additive. ROAFACTURARE nu incarcase niciodata aceasta clasa — se foloseste azi doar din ROACONT/ROAGEST (registrul jurnal). - Corectii de review aplicate 08.08.2026 (
docs\diff_runda2_corectii.patch):IncarcaCursoareModificareNotapropaga acum esecul: pe eroare Oracle la interogareavrul_totsauvrul_obinv_totfaceRETURN .F.(curatand cursoarele deschise pana atunci), nu mai continua pana laRETURN .T.final ca si cum ar fi reusit. Corectie de premisa fata de constatarea initiala:goExecutor.oExecuteintoarce strict succes/insucces (CT_SUCCES/CT_INSUCCES, pesteSQLExec), NU numarul de randuri — decitrul/trul_obinvse creeaza (goale) chiar si la 0 randuri invrul_tot/vrul_obinv_tot; verificat live pecod=1140885(0 randurirul). Scenariul "Alias TRUL is not found" pe o factura de servicii nu se reproduce — bug-ul real e ingust, doar pe eroare Oracle efectiva la interogarea de rulaje (path netestabil fara sa stric conexiunea deliberat). Apelantul (do_editare_factura) ramane neschimbat pe partea detrul/trul_obinv(acces neconditionat, ca si inafisjurcom.do_modificalabuton=1) — corect prin constructie, pentru ca acum ajunge acolo doar daca incarcarea a reusit integral.- Garda pe
id_set: adaugata in runda 2, rafinata in runda 3, SCOASA DE TOT in runda 4 (docs\diff_runda4_scoate_garda.patch, decizia 24). Istoric, ca sa nu se reia: premisa ei era caPACK_FACTURARE.scrie_discountscrie randurileDISCOUNT/TVA DISCOUNTcuid_set + 5, deci o nota poate avea 2id_set. Fals la destinatie:cumuleaza_note_act_tempnormalizeaza inainte deACT, offsetul e tranzitoriu. Pe date: 558 de note legate deVANZARIcu un singurid_set, 1 cu doua — si aceea e randul-gunoicod=0, an=0, luna=0. NiciID_FACT = -1dinscrie_discountnu ajunge inACT(zero randuri cuid_fact <= 0din 2020 incoace,id_factdniciodata NULL). Rapoartele istorice:docs\cercetare\rec_garda_idset.md(runda 3, premisa infirmata ulterior). - Pozitionarea in
actactan, corectata in runda 4 — problema reala, alta decat cea presupusa: primul rand al notei dupaid_actpoate fiINCASARE/INCASARE NUMERAR, cuid_fact= al facturii minus 1. 39 de facturi in schema de dev pe care unGo Toporb preluaid_fact-ul chitantei — bug preexistent din runda 1/2. Acum:Locate For Nvl(id_fact,0) = lnIdFactculnIdFactluat dincrsfacturi(=VANZARI.ID_FACT), si abia pe esecGo Top+ preluare de acolo.lnIdSet/lnIdFactDse citesc de pe randul astfel pozitionat. Efect colateral util:lnIdFactnu mai poate ajunge NULL inStr()-ul din apelulfinalizeaza_modificare_nota. Dovezi:docs\cercetare\rec_pozitionare_actactan.md. Testat headless: 4 cazuri sintetice (nota normala / prim randINCASARE/ fara randul cautat /lnIdFact = 0) + regresie pecod=1140888/cod=1140885— 6/6 PASS. - Repozitionarea finala
Go lnRecno(dupaThisform.do_cauta(), care rechestioneazacrsfacturi) a fost inlocuita cuLocate For id_vanzare = lnIdVanzare+ fallbackGo Top, conformconventie_go_recno.md(id_vanzarenu se schimba niciodata la editare, spre deosebire decod).
- Testat headless, pe date reale (
MARIUSM_AUTO/ROA_CENTRAL):- runda 1: flux real
vizualizare_facturi->frm_facturi.Show(1)condus prin Timer (testare-ui-vfp.md); butonul apare si e gatat corect decbuton3; garzile luna inchisa, luna curenta, document deja sters, eFactura resping corect (mesaje verificate 1:1 prin mockamessagebox); pecod=1140888,frm_modific2024se deschide fara eroare. - corectii:
COMUN\utile\Teste\editare_factura\test_incarca_cursoare.prg(fara UI, pe conexiune reala) apeleaza directIncarcaCursoareModificareNotapecod=1140888(regresie: 24 randuri nota,trul10 randuri) si pecod=1140885(0 randurirul,trul/trul_obinvcreate dar goale) — fara eroare in niciun caz; plus un cursor sintetic cu 2id_setdistincte, confirmand ca garda noua ar detecta corect situatia (Reccount=2). Netestat: calea de eroare Oracle propriu-zisa dinIncarcaCursoareModificareNota(ar cere ruperea deliberata a conexiunii) — verificata doar static, pe simetrie cu primul punct de control din aceeasi functie (deja existent, acelasi tipar). - write-back in
.vcx/.vct:txt2vcx.ps1 -AllowComun— fidelity check OK, cod compileaza curat.
- runda 1: flux real
- Calea de salvare (
buton=1) — TESTATA REAL si TRECUTA, 08.08.2026. Marius a aprobat explicit un test care chiar scrie inMARIUSM_AUTO.COMUN\utile\Teste\editare_factura\test_writeback_buton1.prg, doua treceri cu COMMIT real peid_vanzare = 1048:cod1140886 -> 1140893 (salvare fara modificari) -> 1140894 (cu explicatia unui randACTschimbata). Toate cele 5 verificari PASS, confirmate independent prinsqlplusdupa rulare, nu doar din log: randurile vechiACT/RULmarcateSTERS=1, randuri noi active pecod-ul nou cu aceleasi sume /id_set(25010) /id_fact(8009658),VANZARIrealiniat pecod-ul nou cu totaluri neschimbate,VANZARI_DETALIIneatins (corect — scrierea acolo e S5), iar explicatia modificata a ajuns inACT. Raport:docs\cercetare\rec_test_writeback.md. Cod-ul de test ramas in baza: 1140894 (documentul a fost realocat de doua ori, ireversibil). Ce NU acopera: validarea dininainte_de_do_termin(omodificari.vc2:13357-13549) — sarita,buton=1fortat direct — si comportamentul real al luifrm_modific2024la "Terminat", formularul nefiind instantiat deloc. Deci lantul de scriere merge; nu s-a dovedit ca utilizatorul ajunge la el prin fluxul UI complet. Doua lucruri distincte, a nu se confunda. - Netestat, la fel ca in runda 1: garda referinte izolat (fara candidat "pozitiv" in datele de
test); inchiderea gratioasa a
frm_modific2024prindo_renunt()— blocata in mediul minimal de test (ControlCount=0), la fel ca in runda 1, deci nici repozitionarea finala (Locate For id_vanzare) n-a fost exercitata prin fluxul UI complet — doar prin analiza de cod si reconstructia verificata byte-cu-byte a.vc2.
#6, S4 runda 1 (PAGE3, doar afisare) — in lucru, 08.08.2026
Sursa completa: docs\cercetare\handoff_s4_runda1.md. Modificarile sunt pe disc, text si binar
sincronizate, dar fara diff livrat si fara raport — runda nu e inchisa.
COMUN\programe\ofacturare_editare.prg: doua functii noi la coada fisierului —IncarcaVanzareNota(tnCod, tnNract, tcSerieAct, tdDataAct)(randul dinVANZARIcorespunzator notei, in cursorultvanz) siIncarcaArticoleFactura(tnIdVanzare)(liniile active dinVANZARI_DETALII+ denumiri articol/gestiune/valuta, in cursorultvd).COMUN\clase\omodificari.vc2(frm_modific2024):pgfArticole.PageCount = 3cuPAGE3.Caption = "Articole factura"; grid nougrdArticoleFactura(13 coloane,RecordSource="tvd",ReadOnlyla nivel de grid si pe fiecareText1); proprietati noilAreArticoleVanzari,nIdVanzare,nTipVanzare; placeholderCREATE CURSOR tvdinLoad(); bloc nou inShow()care cheama cele doua functii si comutaPageCountintre 2 si 3.- Schela de diagnostic SCOASA 08.08.2026 (cele 5 linii
STRTOFILE(... diag_class.txt ...)dinInit/Load): restaurare din backup, text si binar, verificat prin diff ca acelea erau singura diferenta. Backup-uri pastrate inCOMUN\clase\:omodificari.vc2.pre_s4runda1.bak(originalul dinainte de S4),omodificari.vc2.pre_diag.bak=omodificari.vc2.mine_s4_full.bak(hash identic, versiunea curata),omodificari.vcx/.vct.mine_s4.bak(binarul curat). - Testat, PASS, direct pe functii (fara formular), pe date reale — suita
COMUN\utile\Teste\editare_factura\test_page3_articole.prg:cod=1140888->id_vanzare=1050,tip=1, 4 linii (coincide cu baza de regresie);cod=1140885->id_vanzare=1047,tip=-12(confirma decizia 19 — detectia merge pe orice tip, nu doar facturi);cod=1125486-> 0 randuri (cazul negativ); coliziunea pecod=1139934rezolvata corect de filtrul compus. - TESTAT LIVE, PASS (08.08.2026, dupa trei blocaje separate, toate rezolvate — vezi capcanele):
suita ruleaza sub watchdog cu exit 0 si zero dialoguri;
loForm.ClassLibraryconfirma ca se incarca fisierul editat.cod=1140888->PageCount = 3,lAreArticoleVanzari = .T.,nIdVanzare = 1050;cod=1125486->PageCount = 2,lAreArticoleVanzari = .F.Restul asertiilor din suita, neschimbate, tot PASS. Cele trei blocaje au fost:DO ... WITHprin referinta, harness-ul care incarca clasa din ROACONT, si proprietatile custom fara intrare*p:. - Exclus cu dovezi (nu relua): nu e cursorul
tvdlipsa (probat cu placeholder si cu pre-creare); nu e un gol preexistent de mediu (binarul original ruleaza curat in acelasi harness —test_baseline_isolation.prg,PageCount=2, fara dialog);tradu()din_pageframe.Init()e inofensiv; zeroCREATE SQL VIEW/USE ... VIAin toata ierarhia de clase. - B.2 (marcaje stare linii) nu e in scope runda 1 — grid-ul e strict readonly; marcajele sunt runda 2.
- Runda 1 e INCHISA pe cod si testata, asteapta doar review-ul lui Marius. Diff:
docs\diff_s4_runda1_page3.patch(2 fisiere, fata de backup-urile de dinainte de S4). Raport:docs\cercetare\rec_s4_runda1.md. Instrumentarea de depanare a fost scoasa din suita si suita rerulata dupa curatare — 7 PASS, zero erori.test_baseline_isolation.prgsters (temporar prin design, si cu concluzie nula: testa copia ROACONT). Fara commit — se asteapta aprobarea. - BLOCANT 1 —
Go Top In tactorb: CONFIRMAT PE DATE (docs\cercetare\rec_gotop_tact_s4.md).Show()(omodificari.vc2:14171) citeanract/serie_act/dataactde pe primul rand dupaid_act, care poate fiINCASARE. Pe 62 de note din schema de dev unde primul rand e o incasare si nota chiar are rand inVANZARI, filtrul compus intoarce 0 randuri pe 52 (84%) — PAGE3 lipsea silentios. Pe cele 10 ramase nimerea corect (aceleasi valori pe ambele randuri); niciodata alt document, deci bugul e "pagina lipsa", nu "date gresite". Suita veche nu-l acoperea (repeta acelasiGo Top). Cazuri reproductibile:cod=1137874/2009/8->id_vanzare=506,cod=1139934/2021/12->id_vanzare=882. - BLOCANT 2 —
Show()rupe ROACONT si ROAGEST (gasit 08.08.2026, verificat pe puncte de intrare).frm_modific2024e inCOMUN, deci ajunge in toate produsele.ROACONT\Programe\roacont.prg:233siROAGEST\Programe\roagest.prg:175incarcaomodificari.vcxdar nu inregistreazaofacturare_editare.prg— o face doarPrograme\roafacturare.prg:214. Apelurile negardateIncarcaVanzareNota/IncarcaArticoleFacturadinShow()ar fi rupt "registru jurnal > modificare" in doua produse care azi merg. Nu ascunde o pagina, rupe o functie existenta. Runda 2 pune garda peSet("Procedure")(degradare laPageCount = 2, fara eroare). DECIS SI PARTIAL APLICAT (Marius, 08.08.2026 — aprobat pentru ambele produse):roacont.prg:212are dejaSET PROCEDURE TO ofacturare_editare.prg ADDITIVE(a intrat in r18006).roagest.prginca nu o are — de adaugat, langa grupul de facturare (:259ofacturare_comun.PRG,:305-307ofacturare.prg/oproceduri_facturare.prg). Capcana platita: fisierul a intrat in SVN la r18004, dar copiile deCOMUNdin ROACONT si ROAGEST erau la r17987/r17977, deci nu-l aveau pe disc — ROACONT pornea pe unSET PROCEDUREcatre un fisier inexistent. Rezolvat prinsvn updatepe ambele (08.08.2026, acum la r18010). Linia dinroagest.prgare sens doar dupa update; altfel rupe si ROAGEST identic. - RUNDA 2 — IMPLEMENTATA SI TESTATA, 08.08.2026 (ambele blocante de mai sus + ancorarea view-ului).
IncarcaArticoleFacturatrece peselect * from vvanzari_articole;Go Top In tactorb inlocuit cuIncarcaVanzareDinNota(tcAliasAct)(incearca toate tripletele distincte(nract,serie_act,dataact)dintactpana gaseste un rand inVANZARI); garda"OFACTURARE_EDITARE" $ Upper(Set("Procedure"))pusa inShow()siLoad()(placeholder-ultvdare un fallback inline separat pentru cand garda nu trece, ca la ROACONTCreeazaCursorTvdGolnu exista);AMESSAGEBOXadaugat pe erorile Oracle dinIncarcaVanzareNota/IncarcaArticoleFactura; cursoarele goaletvd/tvanzunificate inCreeazaCursorTvdGol()/CreeazaCursorTvanzGol(). Testat headless sub watchdog, exit 0/0 dialoguri, 10/10 PASS la data validarii (cifra nu mai e valabila azi — baza de regresie s-a degradat, vezi datoria 6) (test_page3_articole.prg, extinsa cu cazurilecod=1137874->id_vanzare=506,cod=1139934->id_vanzare=882si un test de garda care scoateofacturare_editare.prgdinSET PROCEDUREsi verificaPageCount=2). Verificat separat (test dedicat) caSCAN...ENDSCANdinIncarcaVanzareDinNotacontinua corect chiar daca IncarcaVanzareNota schimba workarea in interiorul buclei. Write-back.vc2->binar OK (fidelity check trecut). Diff:docs\diff_s4_runda2_view_pozitionare.patch. Raport:docs\cercetare\rec_s4_runda2.md. Fara commit — asteapta review. - ANCORAREA COLOANELOR — REZOLVATA prin view Oracle dedicat (decizia 26, 08.08.2026).
VVANZARI_ARTICOLEe creat si validat peMARIUSM_AUTO(VALID, 21 de coloane, verificat independent prinsqlplusdupa aplicare):id_vanzare+ cele 20 consumate azi, valori RAW, fara conversie valutara, fara filtrusters(apelantul filtreaza, ca lavact_tot/vrul_tot). Script:D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08\ff_2026_08_08_01_COMUN_VVANZARI_ARTICOLE.sql(CRLF pur, idempotent, necomis in SVN). Proiectarea:docs\cercetare\rec_view_articole_vanzare.md.id_vanzareera omis dinSELECT-ul vechi desi e cheia de filtrare — omisiune reala, corectata.FACT_VFACTURI_DETALIIexista si a fost respins motivat: recalculeazapret/discount_unitarla cursul curent, pentru tiparire. Editarea are nevoie de valorile stocate, ca S5 sa scrie inapoi exact ce a citit — refolosirea lui ar fi mutat tacut preturile.- VFP consuma view-ul cu
select *, nu cu lista de coloane. Recomandarea agentului (doarFROMschimbat, lista pastrata) rata cerinta: cu lista in cod, tot se intretine si codul la schimbarea structurii. UpdateVersiuneinsereaza, nu face merge: scriptul apare de doua ori inVERSIUNEdupa proba de idempotenta. E datoria 4 deja cunoscuta, fara impact functional. Dupa redenumire,VERSIUNEcontine si 2 randuri cu numele de lucru vechi — acelasi zgomot, aceeasi datorie.- REDENUMIT
VVD_TOT->VVANZARI_ARTICOLE(decizia 28, 08.08.2026). Reaplicat si reverificat peMARIUSM_AUTO:VALID, 21 de coloane, 4 linii peid_vanzare = 1050, idempotent la a doua rulare.VVD_TOTnu mai exista ca obiect. Scriptul contine doarCREATE OR REPLACE VIEW, faraDROP(Marius, 08.08.2026).
- Raspunsul initial la cerinta de ancorare (istoric, inainte de decizia 26 —
rec_review_ancorare_s4.md): o coloana adaugata inVANZARI_DETALIInu rupe nimic azi; una stearsa sau redenumita pica silentios —SELECT-ul explicit esueaza pe Oracle, iarIncarcaVanzareNota/IncarcaArticoleFacturainghit eroarea si intorc cursor gol fara mesaj (spre deosebire deIncarcaCursoareModificareNota, care afiseazaAMESSAGEBOX). Recomandarea: pastreaza gridul declarativ (tiparul deja folosit degrdRulaje/grdRulajeObinvpe acelasi formular) si adauga doarAMESSAGEBOXpe cele doua functii noi — cateva linii, transforma golul tacut in semnal vizibil. Respinse: gridul dinamic dinAFIELDS()(ar fi unicat pe formular — mai multa intretinere, nu mai putina) siSELECT *pe join brut (muta eroarea din SQL in binding-ul gridului, deci mai rau). Varianta curata pentruSELECT *ar fi un view Oracle dedicat, ca latrul/tact— migrare de schema, de pastrat pentru cand structura chiar incepe sa se miste des. - Cod duplicat, minor:
CREATE CURSOR tvanzs-a unificat in runda 2 inCreeazaCursorTvanzGol(ofacturare_editare.prg:148, apare o singura data). Ramane doarCREATE CURSOR tvdidentic in doua fisiere (ofacturare_editare.prg:260,omodificari.vc2:14082) — duplicarea e obligatorie: in ROACONT/ROAGEST functia comuna nu e incarcata.
#6, S4 runda 2 — COMISA in SVN 08.08.2026 (r18003-r18006)
Comisul, pe revizii — oglinda git e in urma, se sincronizeaza separat cu git_sync.ps1:
| Revizie | Ce contine |
|---|---|
| r18003 | DATABASE\SCRIPTURI_CLAR\2026\08\ff_2026_08_08_01_COMUN_VVANZARI_ARTICOLE.sql (nou) |
| r18004 | COMUN: ofacturare_editare.prg (nou), omodificari.vcx/.vct, ofacturare_comun.vcx/.vct, reguli_lucru.md, scripturi-migrare-db.md |
| r18005 | ROAFACTURARE: roafacturare.prg, versiune_db.txt, CLAUDE.md |
| r18006 | ROACONT: roacont.prg |
docs\ ramane local (neversionat). Fara changelog inca: lucrarea n-a ajuns la utilizatori.
#6, S4 runda 3 — PORNITA 08.08.2026, impartita pe sub-blocuri
Editare in memorie, fara nicio scriere in Oracle (asta ramane S5, runda 4). Se lucreaza pe sub-blocuri mici, cu cate un agent proaspat, ca review-ul sa ramana mic.
Sub-blocul A e SCRIS IN BINAR (08.08.2026). Contrar a ce scria aici, write-back-ul s-a facut:
omodificari.vct contine cSubtotalArt, lmodificat, cPretCuTvaArt, iar textul are
ColumnCount = 14. Fidelity-check-ul picat descris in docs\handoff_s4_runda3a.md a fost depasit
(remediul era ordinea Header1 dupa _checkbox1 la cPretCuTvaArt). Ramane necomis, ca tot restul.
Doua rezultate stabilite in runda 3A, de nu mai reluat:
-
VANZARI_DETALII.PRET_CU_TVAe flag logic 0/1, nu pret numeric, desi coloana e numerica in cursor — verificat pe date, toate cele 1113 randuri active. De aceea coloana din grid e checkbox, dupa modelulCOMUN\clase\ofacturare.vc2:5817. -
Numele coloanei de marcaj: ales
lmodificat, dupa test —_modificatsilmodificatmerg amandoua ca nume de camp de cursor VFP (verificat headless), s-a preferatlmodificatpentru stil. -
A: coloanele
cantitate,pret,pret_cu_tvaeditabile inline ingrdArticoleFactura; marcajlmodificatpe linie intvd, setat dinValid/InteractiveChangedupa tiparul luigrdRulaje.cCant.Text1.Valid(omodificari.vc2:~14906); subtotal live pe linie. -
B: dialogul per linie (reutilizarea
frm_articol_factura), adaugarea si stergerea de linii (id_vanzare_det = 0pentru randuri noi, flagsterspentru stergere — B.2 din plan). -
C: discountul de antet editabil in
tvanz(decizia 17) si bara de totaluri de control (decizia 20; fara bara pe transfer/custodie — decizia 22).
Structura cursorului tvd se schimba mereu in DOUA locuri, tinute identice:
ofacturare_editare.prg:266 (CreeazaCursorArticoleGol) si omodificari.vc2:14139 (ramura ELSE).
Ultimul camp se numeste valoare (fost subtotal), vezi sectiunea de defecte de editare.
#6, doua defecte de AFISARE pe pagina de articole — REZOLVATE 08.08.2026, dovedite pe ecran
Raportate de Marius dupa testarea pe ecran. Ambele in frm_modific2024. Write-back facut, text si
binar sincrone, necomise. Diff: docs\diff_fix_grid_tvd_blank.patch. Raport:
docs\cercetare\rec_fix_grid_tvd_blank.md.
- Grid-ul de articole aparea COMPLET GOL (nici macar coloane), desi
tvdavea randuri. Cauza:Show()inchidea si recrea cursorul legat la grid (IncarcaArticoleFacturafaceaUse In tvd+Select ... Into Cursor tvd), iar grid-ul isi pierde coloanele (ColumnCountajunge 0) — capcana dinCOMUN\docs\depanare_testare_vfp.mdsectiunea 6, doar ca declansata dinShow(), nu dinInit().RecordSourceramane"tvd"— deci proprietatea nu e indicator de diagnostic. - Pageframe-ul disparea cu totul cand documentul avea articole dar zero rulaje (tipic factura de
servicii):
Show():14254colapsapgfArticoleprinafiseaza_rulaje()(:12715) pe conditiatrul+trul_obinvgoale, fara sa se uite la articole. Conditia tine acum cont si detvd.
Solutia (Marius, 08.08.2026): cursorul se pregateste inainte de Createobject, ca tact si
trul — nu dupa ce formularul exista. Load() ramane singurul proprietar al structurii: creeaza
mereu tvd canonic si, daca apelantul a pregatit crsArticoleFactura, il populeaza cu
APPEND FROM (potrivire pe nume, deci o divergenta de structura goleste campuri, nu rupe legarea).
do_editare_factura pregateste cursorul langa crsJtvaTemp si il curata la iesire. Apelul din
Show() ramane ca fallback pazit (IF Reccount('tvd') = 0), pentru cei 4 apelanti care nu
pre-incarca — altfel registrul jurnal, viu in ROACONT, ar afisa grid gol.
Doua constatari colaterale, ambele reale:
- campurile din
CreeazaCursorArticoleGoltrebuie marcateNULLexplicit, altfelAPPEND FROMpica cu eroarea 1581 pe primul NULL venit din view; - Corectie 09.08.2026: afirmatia ca
IncarcaArticoleFacturareumpletvdpe loc (ZAP+APPEND FROM DBF) nu corespunde codului de pe disc — functia face totUse In (alias)+SELECT ... INTO CURSOR (alias) READWRITE(ofacturare_editare.prg:303-309). Caleado_editare_facturanu e afectata (cursorul vine pre-incarcat princrsArticoleFactura+APPEND FROMinLoad()), dar fallback-ul dinShow()reinchide cursorul legat la grid — aceeasi capcana ca defectul "grid gol", ramasa deschisa pentru cei 4 apelanti care nu pre-incarca.
Testat pe ecran, PASS (harness UI nou: formular vizibil, PrintWindow, ActivePage = 3 din cod,
fara input real): cod=1140885 (articole, zero rulaje) -> pageframe vizibil, grid populat,
ColumnCount = 14; cod=1139934 (cu rulaje) -> grid populat, regresie curata. Regresia
test_page3_articole.prg identica cu inainte (FAIL-urile de atunci, pe cod=1140888, s-au dovedit
ancorare gresita — datoria 6, rezolvata 09.08.2026).
Capturi: COMUN\utile\Teste\editare_factura\screenshots_before\ si screenshots_after\.
Atentie: vfp_ui_harness.ps1 goleste -ShotsDir la fiecare lansare — capturile de pastrat se
muta din el, altfel se pierd la urmatoarea rulare.
FACUT 09.08.2026: extinderea la toti cei 5 apelanti care fac Createobject([frm_modific2024]).
ofacturare_comun.vc2:3792 (do_editare_factura) era singurul facut anterior; acum si
comun.vc2:2435 (registru jurnal, afisjurcom.do_modifica), anaf_efactura.vc2:13084
(importmodifica), frm_initializare_facturi_balanta.sc2:1803, frm_import_note_facturi_clienti.sc2:895
(ambele form1.modificanote) — prin helper-ul unic PregatesteArticoleFacturaEditare(tcAliasAct) in
ofacturare_editare.prg:319-340 (descoperire din tact via IncarcaVanzareDinNota + precarcare
crsArticoleFactura via IncarcaArticoleFactura), cu garda "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) la fiecare apel. Plus linia din roagest.prg:260. Detalii, cifrele
suitelor si care din cei 4 sunt no-op azi (achizitie/note noi fara cod legat de VANZARI):
docs\cercetare\rec_s4_apelanti.md. Scris in binar, necomis.
Prima intrebare deschisa s-a inchis (decizia 30, 09.08.2026): coloana scade acum
discount_unitar si se numeste valoare. Ramane a doua: valorile amesteca valutele
(view-ul intoarce cifre RAW, fara conversie), deci coloana nu e insumabila — conteaza la bara de
totaluri (deciziile 20 si 25).
#6, doua defecte de EDITARE pe pagina de articole — REZOLVATE 09.08.2026, dovedite pe ecran
Raportate de Marius dupa testarea pe ecran a rundei 3A, in COMUN\clase\omodificari.vc2
(frm_modific2024) si COMUN\programe\ofacturare_editare.prg. Write-back facut (fidelity check
trecut), text si binar sincrone, necomise. Diff: docs\diff_fix_grid_editabil_subtotal.patch.
Backup-uri dinaintea fixului: COMUN\clase\omodificari.vc2.pre_fix3a.bak,
COMUN\programe\ofacturare_editare.prg.pre_valoare.bak.
cantitatesipretnu se puteau modifica, desiColumn5/Column6.ReadOnly = .F.in clasa. Cauza:_grid.Init(COMUN\clase\_baza.vc2:240-259) forteazaReadOnly = .T.pe fiecare coloana al careiCurrentControleText1, cat timplcamptextneeditabil(implicit.T.) nu e coborat pe instanta. Valorile din designer sunt suprascrise la Init. De asta bifapret_cu_tvamergea — coloana ei areCurrentControl = _checkbox1, deci scapa buclei. Fix:lcamptextneeditabil = .F.pegrdArticoleFactura.grdRulaje/grdRulajeObinvrezolva acelasi lucru altfel — cuInitgol (*Nu sterge,:15659/:15926), care taie si_grdrow.Init, deci si evidentierea liniei curente; varianta pe proprietate o pastreaza.- Valoarea pe linie era defazata cu un pas la bifa "pret cu TVA".
InteractiveChangese declanseaza cand se schimbaValuein control, iarControlSourcenu e inca actualizat — decicalculeaza_valori_articolcitea flagul vechi dintvd. Fix dupa tiparul casei (anaf_efactura.vc2:8089-8113, care tot dinThis.Valueciteste): flagul se scrie intai in cursor dinThis.Value, apoi se recalculeaza si se faceRefresh()pe grid. - Coloana
subtotals-a redenumitvaloaresi scade acumdiscount_unitar(Marius, 09.08.2026). Formula:cantitate * (pret - discount_unitar), inmultit cuproc_tvavcand flagul e 0 — aceeasi ca inofacturare.prg:2222(cantitate*(pretctva-discountctva)). Redenumirea e completa, nu doar antetul: campultvd.valoare, coloanacValoareArt,Caption = "Valoare". Atins in ambele locuri unde se defineste structuratvd(ofacturare_editare.prg:269siomodificari.vc2:14139) plusSELECT-ul dinIncarcaArticoleFactura.
Testat pe ecran, 11/11 PASS — COMUN\utile\Teste\editare_factura\test_ui_fix_editabil_subtotal.prg
sub vfp_ui_harness.ps1 (formular vizibil off-screen, PrintWindow, fara input real), pe
cod=1139934 / id_vanzare=882: ColumnCount=14, cantitate si pret editabile, denumire /
discount_unitar / valoare raman readonly, antetul e "Valoare", discountul e scazut deja la
incarcare, iar bifa duce flagul in cursor si valoarea la cifra corecta din prima (linia 1:
cant=1, pret=150, discount_unitar=15, proc_tvav=1.19, flag 1 -> 0, valoare
135 -> 160.65), cu lmodificat = .T. Captura:
COMUN\utile\Teste\editare_factura\screenshots_fix3a\step_0_pagina3_dupa_bifa.png.
Regresia headless test_page3_articole.prg (actualizata pe noul nume de camp) ruleaza cu exit 0 si
zero dialoguri; fata de rularea de dinainte de fix, nicio regresie noua. Esecurile de atunci erau
toate pe cod=1140888 — ancorare gresita, rezolvata la datoria 6 pe 09.08.2026; azi suita da
13 PASS / 2 FAIL, cele 2 fiind strict artefactul headless de la datoria 7.
Bara de totaluri nu lipseste din greseala — nu e implementata inca: e sub-blocul C al rundei
3 (decizia 20, footer ca pe paginile de rulaje). PAGE1/PAGE2 au _grdfooter1, PAGE3 nu are
niciun obiect in afara gridului. Amanata explicit (Marius, 09.08.2026) — se porneste separat, cu
agent proaspat. Coloana Valoare exista si se vede pe ecran (ultima din cele 14).
Dovada colaterala pentru corectia de mai sus despre IncarcaArticoleFactura: in log-ul suitei,
workarea tvd dupa Load = 5, dupa Show = 20 — deci fallback-ul din Show() chiar reinchide si
recreeaza cursorul.
#6, S4 runda 3 sub-blocul B — stergerea de linii GATA, adaugarea predata mai departe, 09.08.2026
Detalii complete: docs\cercetare\rec_s4_runda3b.md (implementare + testare) si
docs\handoff_s4_runda3b_adaugare.md (cercetarea de contract pentru partea neinceputa).
- Stergere logica — buton nou
cmdStergeArticolpepgfArticole.PAGE3(omodificari.vc2:12260-12274),Clickcomutatvd.stersintre 0/1 si seteazalmodificat=.T.(omodificari.vc2:15962-15970). Fara stergere fizica din cursor — randul ramane, marcat, ca S5 sa scrieSTERS=1pe linie. Marcaj vizual:DynamicForeColorpe toate cele 14 coloane (IIF(tvd.sters=1,RGB(150,150,150),RGB(0,0,0))), tipar deja folosit in clasa. Campultvd.stersexista deja din runda 1/B.1 (vine dinVVANZARI_ARTICOLE), nu a fost nevoie sa se atinga structura cursorului. - Adaugarea de linii (dialog
frm_articol_factura) NU e facuta. Cercetare completa de contract predata (nu se reia):poDateare nevoie doar de 3 proprietati citite in tot dialogul (tip,in_valuta,dataact) — nu clasa completaoDateFactura;gnScadereStoctrebuie setat manual=0inainte deCreateobject(nu exista global la editare post-emitere, altfelInit-ul dialogului da eroare "Variable not found");calculeaza_totaluri()+do_initializeaza_articol()(functii/metode deja existente) deriva majoritatea proprietatilorpoArticoldinpret/preturi_cu_tva/proc_tvav— nu se reinventeaza formulele. Ramane necunoscut: de unde se alege articolul la adaugare (dialogul nu are picker;crsarticole-ul de la compunere e legat de stoc, exclus de decizia 15) — de investigat la implementare, posibil inonom_articole.vc2sau in tiparul din modulul de achizitie. - Capcana de encoding lovita si reparata in aceeasi sesiune: primul
Editpe fisier a re-encodat tot fisierul si a stricat din nou cele doua liniiCaptioncu diacritice (Renunțare/Adăugare/Ștergere) reparate anterior — cens2 aa/2 e3/2 fe->6 ef/6 bf/6 bd. Reparat byte-cu-byte cu Perl inainte de write-back; cens final identic cu cel de plecare, zeroEF BF BD, verificat de doua ori. - Fidelity-check picat prima data (ordine
ADD OBJECT/metoda, capcana cunoscuta) — rezolvat prin adoptarea textului regenerat din<staging>\verify\ca sursa. A doua rularetxt2vcx.ps1 -AllowComun: OK. - Testat: regresie headless neschimbata (
test_page3_articole.prg14/2,test_incarca_vanzare_din_nota.prg5/5, exit 0, zero dialoguri). Test UI nou (test_ui_sterge_linie.prg, pecod=1139934/id_vanzare=882): 6 PASS / 0 FAIL in log — nu 7/7 cum s-a raportat initial. Logul are 8 linii, se opreste laREADY(handshake-ul de captura) si n-are linia deREZULTAT, deci rularea a fost taiata: asertia de comutare inapoi (sters1 -> 0 la al doilea click) era programata dupa handshake si n-a rulat. Verificat de orchestrator prin numararea asertiilor din log. Captura de ecran nu s-a putut obtine —vfp_ui_harness.ps1in mod-A(formular vizibil) a esuat sistematic de 16 ori (2 rulari x 8 incercari) sa detecteze pornirea VFP in 30s, desi procesul a rulat testul COMPLET pana la capat de ambele ori (dovedit prin logul propriu al testului, ajuns pana laHarnessStep/READY); modul headless (-A -T) a raspuns instant in acelasi interval — problema pare de mediu/masina ocupata (enumerare read-only de ferestre a aratat desktopul activ al lui Marius: RustDesk, VS Code, PL/SQL Developer, Explorer), nu de cod. Recomandare: o trecere de confirmare vizuala cand masina e libera, inainte de commit — nu blocheaza livrarea. - Diff:
docs\diff_s4_runda3b_linii.patch(162 linii, scopat strict pe aceasta lucrare — reconstruit dintr-un backup.pre_runda3b.bakobtinut prin reversul exact al editarilor, pentru ca nu s-a luat backup INAINTE de prima editare).
#6, defecte rezolvate in ofacturare_comun.vc2 (frm_facturi / frm_modific2024) — 08.08.2026
Trei defecte raportate, toate in COMUN\clase\ofacturare_comun.vc2. Write-back facut, confirmat
in binar (svn status din interiorul COMUN\: M clase\ofacturare_comun.vcx + .vct).
Necomis.
crsJtvaTempneinitializat.frm_facturi.do_editare_facturanu crea cursorul inainte deCreateobject(frm_modific2024), iarfrm_modific2024evalueaza la construirea griduluiColumn63.ControlSource = "Iif(Seek(...,'crsJtvaTemp','id_jtva'),...)"(COMUN\clase\omodificari.vc2:9202) si unRowSourcepe acelasi cursor (:9604). Fix:update_jtva_coloane("", "crsJtvaTemp", 0)laofacturare_comun.vc2:3789, inainte deCreateobject, plus cleanup la:3851-3853. TiparulN=0e cel dinCOMUN\programe\ooperatii_comune.prg:113, adica exact calea ROACONT care functiona. Test nou de reproducere:COMUN\utile\Teste\editare_factura\test_defect1_crsjtvatemp.prg— fara fix reproduce eroarea si dialogul nativ, cu fix PASS (PageCount=3,nIdVanzare=882pecod=1139934, 0 dialoguri, exit 0).- Doua butoane de modificare.
But_editare1sters (ADD OBJECT+OBJECTDATA+ referinta dincbuton3),but_modifica1pastrat neschimbat. Dispecer nouPROCEDURE inainte_de_do_modificacuxmenu()+DO CASE->do_modifica()/do_editare_factura(), dupa sablonulCOMUN\clase\comun.vc2:2625si:2749. Garzile raman in metode, nu in dispecer. Verificat doar structural (fidelity-check):xmenucere input real, iarfrm_facturinu se instantiaza headless (cade peVariable TEXT_ADITIONAL is not found— cerecrsfacturipopulat printr-o cautare reala). Clickul ramane de verificat manual dupa rebuild. - 12 diacritice distruse — regresie de encoding; cauza si corectarea, in sectiunea urmatoare.
Encoding: regresie gasita si corectata in ofacturare_comun.vc2, conventia documentata corectata — 08.08.2026
Commit-ul 13b4f65 (SVN r18004/r18007) a inlocuit 12 diacritice din ofacturare_comun.vc2 cu
U+FFFD (EF BF BD), vizibile pe ecran ca ďż˝: Marchează, Modifică explicaţie articol,
Explicaţie, Data şi ora expedierii, Maşina, Şterse, Neşterse, În RON, În valuta,
Total în valuta (ultimul de doua ori). Restaurate byte-exact din 8df728c; censul de octeti >0x7F
e acum identic cu referinta (1 aa / 3 ba / 2 ce / 2 e3 / 2 ee / 2 fe), zero ef/bf/bd,
confirmat si in binarul .VCT.
Cauza: fisierele .vc2/.sc2 au diacriticele in octeti cp1250, desi antetul FoxBin2Prg declara
CPID="1252" si controalele au FontCharSet=238. Regula scrisa in documentatie cerea cp1252 si,
urmata literal, pierde tacit diacriticele — fara eroare si fara sa cada fidelity-check-ul. Doua
capcane de detectie de consemnat, ambele contraintuitive:
- censul de octeti >0x7F creste la stricare, nu scade (un octet cp1250 devine trei octeti de U+FFFD);
- semnatura e
EF BF BD; un scan care testeaza doar mojibakeC3/C4/C5/C8o rateaza complet.
Corectate trei documente in COMUN\docs\ (cross-project, necomise): reguli_lucru.md
(punctele 5 si 7), flux-editare-vfp-text.md (pasul 2), conventie_encoding_cp1252.md (cadrul
explicativ, tabelul de octeti, detectia, repararea) — fisierul nu e redenumit, e lincat din 4 locuri.
Verificarea documentata acolo era neoperationala: un codepage single-byte mapeaza fiecare octet
la un caracter, deci nu produce niciodata U+FFFD (Select-String ([char]0xFFFD) nu gasea nimic nici
pe fisierul stricat); inlocuita cu scanare pe octeti a secventei EF BF BD.
Sweep complet de encoding peste toate fisierele urmarite de git din ambele arbori (75 in
ROAFACTURARE, 631 in COMUN): in afara de ofacturare_comun.vc2, nicio alta regresie. Raport:
docs\raport_sweep_encoding.md. Patru semnale false pozitive, toate prezente din primul commit:
ferestre_seturi_indicatori.vc2 (UTF-8 legitim, tag XML ANAF), oproceduri_comune.prg (literal
"Ă" intentionat, functie de normalizare), utile\Menu\menutool.vc2 (comentarii chineza GBK, cod
tert), utile\excel\ExcelXML.prg (52x U+FFFD in comentarii portugheze, biblioteca terta, dinaintea
ferestrei git — lasat neatins intentionat). Zero BOM.
CONCLUZIA SWEEP-ULUI NU SE SUSTINE — infirmata pe date 08.08.2026. Versiunea comisa a lui
COMUN\clase\omodificari.vc2 (git HEAD) are BOM UTF-8 pe prima linie si 6 diacritice
distruse (EF BF BD), pe doua linii identice: "CTRL+F = Terminare; ESC = Renunţare; CTRL+N = Adăugare; CTRL+D = Ştergere" (:4104 si :8641). Deci nici "nicio alta regresie", nici "Zero BOM"
nu sunt adevarate pentru acest fisier. Copia de lucru le are corecte (cens: 6 octeti >0x7F,
aa/e3/fe cate 2, zero EF BF BD) — reparate local, necomis. Explicatia probabila a ratarii:
sweep-ul a scanat arborele de lucru, deja reparat, nu HEAD. De reluat sweep-ul pe HEAD, nu pe
disc, inainte sa se mai foloseasca cifra lui ca garantie.
Scaderea censului 26 -> 12 pe COMUN\clase\ointroduceri.vc2 la commit-ul 75d8ded nu e o
stricare: e stergerea clasei legacy import_nir, verificat pe obiect — niciunul din cele 10
string-uri nu mai are container in HEAD, nimic de restaurat acolo. Separat: echivalentele vii din
import_nota (Adauga repere, Recalculeaza, Valuta, TVA valuta) sunt ASCII din primul
commit, deci inconsecventa veche, nu regresie — o eventuala punere de diacritice acolo e o
corectie de continut, neaprobata.
Starea versionarii — comis pana la r18004/r18007, cu modificari NECOMISE peste (vezi subsectiunea)
| Arbore | SVN | git (gitea.romfast.ro, remote origin) |
|---|---|---|
DATABASE\SCRIPTURI_CLAR |
r18003 | — (nu are oglinda git) |
COMUN |
r18004, r18007 | romfast/comun.git 13b4f65 |
ROAFACTURARE |
r18005 | romfast/roafacturare.git 0f98127 |
ROACONT |
r18006 | romfast/roacont.git 3af0089 |
git_sync.ps1 a fost rulat inainte de commit-urile git (462 fisiere la zi, zero esecuri).
Nota: pentru repo-urile ROA, origin este remote-ul romfast — interdictia de a impinge pe
origin priveste doar repo-ul foxbin2prg, unde origin e upstream-ul public de pe GitHub.
docs\ ramane neversionat, ca pana acum (patch-uri, handoff-uri, planuri de runda — scaffolding
local). Singurul fisier de stare durabil e chiar acesta, progres.md. Curatenia dinainte de commit
s-a facut cu COMUN\utile\curatenie.ps1 (47 de intrari: patch-uri, handoff-uri, *.pre_runda*.bak,
.FXP, loguri de test). .gitignore din COMUN ignora acum si watchdog_out/ si capturile
*_dialog*.png ramase din rulari.
Dupa acest commit: defectele si encoding-ul de mai sus, NECOMISE
COMUN are azi, in plus fata de tabelul de sus, modificari inca necomise: git status arata M pe
clase/ofacturare_comun.vc2, clase/omodificari.vc2, programe/ofacturare_editare.prg,
utile/Teste/editare_factura/test_page3_articole.prg, plus cele 3 fisiere .md din docs\
(encoding). svn status arata in plus binarele clase\ofacturare_comun.vcx/.vct si
clase\omodificari.vcx/.VCT ca M. Arborele ROAFACTURARE principal e curat. Diff-urile de review:
docs\diff_s4_fix_butoane_crsjtva.patch, docs\diff_reguli_encoding.patch,
docs\raport_sweep_encoding.md, docs\diff_fix_grid_tvd_blank.patch,
docs\diff_fix_grid_editabil_subtotal.patch.
Copiile de COMUN din ROACONT si ROAGEST: aduse la r18010 (08.08.2026)
Erau la r17987 si r17977, deci fara ofacturare_editare.prg (intrat la r18004), desi
roacont.prg:212 il referea deja — ROACONT pornit din copia de lucru cadea pe SET PROCEDURE catre
un fisier inexistent. svn update rulat pe ambele, cu aprobarea lui Marius. ROACONT: curat.
ROAGEST: 2 conflicte de arbore RAMASE NEREZOLVATE, ambele „local file unversioned, incoming file
add" — utile\citeste_email.ps1 si docs\email-thunderbird.md. Fisierele sunt pe disc, nimic
pierdut; cer svn resolve, decizia e a lui Marius. Au ramas modificate local doar
docs\PACK_DIAG_SPATIU.pck si utile\context_watch.ps1.
Rebuild ROACONT ramane la Marius — abia dupa el PAGE3 apare efectiv in registrul jurnal acolo.
#6, S4 runda 2 — ce contine, pe scurt
Starea completa, inventarul si ce ramane: docs\handoff_sesiune_08082026_e.md. Pe scurt: view-ul
VVANZARI_ARTICOLE consumat cu select *, pozitionarea pe triplete (decizia 27), garda pentru ROACONT/ROAGEST,
AMESSAGEBOX pe erorile Oracle, structura unica pentru cursorul tvd. Validata pe starea curenta,
dupa redenumirea view-ului si taierea comentariilor: fidelity check trecut, suita 10/10 si
5/5 la data validarii (cifrele nu mai sunt valabile azi — vezi datoria 6), exit 0, zero
dialoguri. Diff: docs\diff_s4_runda2_view_pozitionare.patch.
vvanzari_detalii / vvanzari_detalii_tot nu se extind — motivele pe date, in handoff: 11 coloane
lipsa, cost de 3.7x fata de VVANZARI_ARTICOLE, si select * from vvanzari_detalii_tot in oproceduri_listari.prg
din ~10 produse.
Datorii deschise, in ordinea importantei
- Parolele Oracle sunt expuse in istoricul SVN.
COMUN\docs\locala iesit de sub versionare la r17995, dar stergerea afecteaza doar HEAD — orice revizie anterioara le contine in clar (svn cat -r 17967). Singura remediere reala e schimbarea parolelor:MARIUSM_AUTO,contafin_oracle(aceeasi parola pe toate serverele de client),SYS(parola generica pe toate instantele). Curatarea istoricului ar ceresvnadmin dump/loadfiltrat — decizie de administrator. Acelasi tipar de verificat inD:\GoogleDrive\vending.tlpsi in oricesettings.inidetasks.exereferit dinCOMUN\utile\publicare_scripturi.ps1. - Build ROAAUTO, la Marius: rebuild din IDE + test UI pe un deviz real — fara el corectia S7 din
#8 n-are efect. Partea ROAFACTURARE e inchisa (build + deploy 2.11.14, 08.08.2026).
Agentul nu atinge
.PJX/.PJT/.exe. - Changelog ROAAUTO — textul propus e in
docs\cercetare\rec_s10_s12.md, neaplicat inchangelog_roaauto.txt. - Curatarea tabelei
VERSIUNEde numele vechi de scripturi (_02.._06), cu inregistrari multiple din aplicarile succesive.docs\cercetare\s10_curata_versiune.sql, de extins cu numele vechi. Fara impact functional, doar istoric zgomotos. - Puncte nedecise de la #8, niciunul blocant:
tip=1cuid_comanda— 16 facturi pe productie care n-ar trebui sa aiba;ALTELEare aceeasi concatenare nepazita caCONTRACTinainte de garda, decitip=46ar afisa un/singur. Zero documente azi in ambele scheme;- cele 620 de randuri cu
ID_VALUTANULL — normalizarea la0/1; - propagarea corectiei
xmlefactura.prgin cele ~16 cai ramase din alte produse ROA. Inventarul:docs\cercetare\rec_consumatori_vanzari.md. Grup A (byte-identice, acelasi patch): ROAACNPRO, ROAAUTO, ROACONT, ROACONTRACTE, ROADEF, ROAGEST, ROAIMOB, ROAREGISTRATURA, ROARES, ROASTART. Grup B (fisier divergent, acelasi tipar la alta linie): OUTPUT/ROACONT:350, ROACONIMPORT / ROAEFACTURA / ROAPRINT / ROASITFIN:356, ROAPRODUCTIE:326. Grup C (fara bloc, fara risc): ROADECL, ROAMANAGER, ROAPRETURI, ROASAL.
- REZOLVATA 09.08.2026 — nu se pierduse nimic, ancorarea era gresita.
ID_VANZARE = 1050exista si azi, activ, cu totaluri neschimbate: i s-a realocatCOD-ul, 1140888 -> 1140895, pe 08.08.2026 la 14:05 (semnaturafinalizeaza_modificare_nota+actualizeaza_vanzari— 24 randuriACTvechiSTERS=1, 24 noi active, acelasinract/serie_act/dataact/id_fact, aceeasi suma). Nu testul de write-back aprobat: acela a lucrat peid_vanzare=1048la 09:16. Suitele cadeau pentru caIncarcaCursoareModificareNotafiltreazaSTERS = 0, decitactvenea gol. Remediu structural: suitele nu mai hardcodeaza documente, si-l descopera singure dupa proprietatea ceruta de asertie —COMUN\utile\Teste\editare_factura\descopera_caz_test.prg, 6 cazuri (FACTURA_ARTICOLE,NEFACTURA_ARTICOLE,FARA_RULAJE,PRIM_RAND_ORB,COLIZIUNE_COD,NOTA_FARA_VANZARI). Descoperirea merge pe alt drum decat codul testat (join direct peVACT_TOT/VRUL_TOT/VANZARI), deci asertia nu devine tautologica; ordonare determinista; niciun caz gasit = FAIL explicit, nu test sarit. Cifre:test_page3_articole.prg13 PASS / 2 FAIL,test_incarca_vanzare_din_nota.prg5/5, exit 0, zero dialoguri. Cele 2 FAIL sunt artefactul headless de la datoria 7 (eroare 1925Unknown member COLUMN5), acoperite pe ecran detest_ui_fix_editabil_subtotal.prg(11/11). O asertie s-a intarit (cazul B verifica acum numarul real de linii, nu-1), niciuna nu s-a slabit. Cifra veche7 PASS / 3 FAILdin acest fisier era stale — numara doar cele 10 asertii de la runda 2. Raport:docs\cercetare\rec_datoria6_baza_regresie.md. Diff:docs\diff_datoria6_suite_regresie.patch. Necomis. Neprobat pe alta schema decatMARIUSM_AUTO. - REZOLVATA 08.08.2026 — se verifica pe ecran, cu formular vizibil. Harness nou:
COMUN\utile\Teste\editare_factura\vfp_ui_harness.ps1(formular vizibil off-screen,PrintWindow,ActivePagesetat din cod, fara input real). Sub el,ColumnCountse citeste corect (14), iar captura arata randarea reala. Consecinta pentru diagnostic: sub-A -T,ColumnCount = 0siRecordSource = "tvd"sunt amandoua artefacte, nu dovezi — un grid nematerializat nu s-a legat niciodata, deci proprietatile lui nu spun nimic despre legatura. O ipoteza despre bind nu se falsifica headless. Textul vechi al datoriei, pastrat mai jos ca istoric. Subvfp9.exe -A -T(watchdog_vfp.ps1), un grid instantiat raporteazaColumnCount = 0,Columns is not an objectsiUnknown member ColumnN, chiar cand clasa are coloanele definite complet — coloanele par sa se construiasca la randarea reala, pe care harnessul nu o declanseaza;ActivePageforțat nu ajuta. Stabilit pefrm_modific2024.pgfArticole.PAGE3.grdArticoleFactura: valoarea0apare identic pe binarul comis (r18004) si pe cel dupa write-back-ul rundei 3A, deci nu e regresie si nu e defect de aplicatie.Objcode = 0pe grid e o pista falsa — era gol si in starea comisa, iar_grdfooter1are tot0si functioneaza. Din acest motiv cad doua din cele patru asertii de runda 3A (ColumnCount=14,ReadOnly/checkbox); celelalte doua, pe cursor si pe calcul, trec. De rescris ca verificare statica pe memo-ulPropertiesdin.vcx(conțineColumnCount,ColumnN.Name,ColumnN.ControlSource,ColumnN.ReadOnly,ColumnN.Sparse), care se poate parsa direct, fara VFP si fara IDE:.vcxe DBF cuOBJNAME/PARENT/PROPERTIES/OBJCODEca cimpuri memo (4 octeti = numar de bloc in.vct; blocul are 8 octeti de antet, lungimea pe octetii 4-7 big-endian). Structura rundei 3A a fost deja validata asa:ColumnCount = 14,Column7.Name = "cPretCuTvaArt"cuSparse = .F.,Column14.ControlSource = "tvd.subtotal",Column14.Name = "cSubtotalArt". Randarea si interactiunea rămân de verificat pe ecran.
Decizii luate de Marius
-
Ordine: strict pe risc, cu #12/#11/#10 amanate.
-
DDL: sursa de referinta e schema de dezvoltare
MARIUSM_AUTOpeROA_CENTRAL, niciodata o schema de client — si numai dupa ce se verifica prin tabelaVERSIUNEca are toate scripturile aplicate. Notata inCOMUN\docs\scripturi-migrare-db.md. -
frm_facturare_articole2NU se atinge — e cod mort (apelat doar subgnFacturareNou = 1, variabila fara nicio atribuire in proiect) si face obiectul punctului 13 dintodos.txt(formular unificat). Orice modificare VFP din #7 si #8 se face doar infrm_facturare_articole. -
#8, scop extins: intra si denormalizarea comenzii si a contractului; ambele view-uri raman in paralel (
fact_vfacturinu se retrage). -
#6: NU regenerare prin re-emitere. Editare directa in
frm_modific2024, extins cuvanzari/vanzari_detaliipe o pagina noua, similara paginilor de rulaje. Editarea trebuie sa fie posibila si din ROACONT > registru jurnal > modificare. Sincronizarea preturilor rulaje <-> articole se face cu verificare si propunere explicita, niciodata silentios. -
Acces baza: tunel spre
VENDINGpermis, strict citiri. Dezvoltarea si testele peMARIUSM_AUTO. Tunelul e azi inchis. -
#8 / S8,
CLIENTpe retur-transfer (tip=41,tip=-6, 23 facturi): se aliniazafact_vfacturipefact_vfacturi2, adica peVANZARI.ID_GESTIUNE. Se accepta ca numele clientului afisat se schimba pe cele 23 de documente. -
#8 / S8,
EXPLICATIE(75 facturi): se aliniaza pe varianta dinfact_vfacturi2, cea confirmata de constantele VFP curente. -
#8 / S9, cele 41 de facturi cu totaluri denormalizate si zero linii active in
VANZARI_DETALII: ramane instantaneul de la emitere. Backfill-ul nu le atinge; divergenta e prin design. -
#8, cursul valutar pe facturi in lei: rezolvat in #8, in acelasi script de migrare cu S4, ca pachetul sa se recompileze o singura data.
-
#8 / S6,
ALTELE: lista devinetip in (3, 21, 27, 28, 42, 46, 47)—47adaugat,46pastrat explicit, desi nota de plata restaurant n-are comanda. -
#7, editarea pe factura in curs de compunere: prin buton deasupra gridului + dublu-clic, ambele redeschizand dialogul. Respinsa bifa editabila direct in grid (ar fi cerut o a doua cale de calcul). Motivatia butonului: "altfel utilizatorul nu stie ca se poate modifica".
-
#7, editarea pe factura deja salvata trece in #6 — schimbarea flagului reimparte baza si TVA-ul, deci muta totalurile denormalizate din
VANZARIsi notele contabile. -
#7, articole gestionabile: la modificare se redeschide dialogul cu gestiuni. Respinse varianta mica (dialog simplu, cantitatea doar in jos) si cea cu plafonul total pastrat.
-
#6, scopul editarii pe linii — COMPLET (08.08.2026): stergere, adaugare si modificare de linii (articol, cantitate, pret,
pret_cu_tva). Fara plafon de cantitate si fara verificare de stoc — raspunderea e a utilizatorului care corecteaza. In schimb, formularul ii ofera helpere: calcule de totaluri, propuneri de sincronizare acolo unde se poate, si verificari de corelatie cu notele contabile (ACT) si rulajele (RUL). Asta inchide intrebarea lasata de #7 despre sursa plafonului la factura salvata: nu mai e nevoie de plafon. -
#6, drepturi: editarea sumelor intra sub tokenul "3" existent (modificare). Fara token nou, fara rand nou in tabelele de drepturi.
-
#6, discountul de document (
VANZARI.DISCOUNT): editabil, intra in S4 si in recalculul din S5. -
#6, liniile din seturi: se trateaza ca orice alta linie, fara ramura speciala si fara blocarea facturilor care le contin. De urmarit la S5: agregarea din
scrie_in_vanzariare o ramura proprie peVANZARI_SETURI_TEMP, deci recalculul trebuie sa acopere si liniile de set, altfel totalurile diverg tacut pe facturile cu seturi. -
#6, domeniul paginii noi (PAGE3): apare pe orice rand din
VANZARI, nu doar pe facturi — deci si pe avize. Respinsa varianta "strict facturi". -
#6, UX-ul totalurilor de control: bara de totaluri sub grid, in acelasi loc si stil cu footerul de sume de pe paginile de rulaje. Informatia de control se vede permanent, nu dupa click. Respinse varianta cu indicator pe titlul paginii si cea cu fundal colorat.
-
#6, directia sincronizarii: o singura alegere globala pe document, nu per linie.
-
#6, transfer si custodie: pagina de articole apare, dar fara bara de totaluri — pe transfer intre subunitati (23, 25, 30, 41), transfer pe lucrare (27) si custodie (42, 47) nu exista suma comparabila, deci nu se afiseaza nici bara, nici vreun verdict. Respinsa varianta cu bara goala si mesaj "nu se aplica".
-
#6, tipul 51 (ROAACNPRO): contul e
4111, spus de Marius pe 08.08.2026. Deci411gasit de cercetare si divergenta de pecod=1138989au alta cauza — prima suspiciune e chiar filtrarea pecodfaraan+luna, capcana demonstrata pecod=1140632. -
#6, garda pe
id_set: se scoate de tot. Premisa ei (randuri de discount cuid_set + 5inACT) s-a dovedit falsa — offsetul e tranzitoriu. Nota unei facturi are un singurid_set. Atentie la implementare: randurile de discount raman cuID_FACT = -1siID_FACTDNULL, deci pozitionarea din care se citescid_fact/id_factdnu are voie sa cada pe ele. -
#6, documente mixte (linii stocate + servicii): suma din
RULse corecteaza cu valoarea liniilor nestocate luata dinVANZARI_DETALII, ca cifra afisata sa fie comparabila; se marcheaza in bara ca e ajustata. Liniile nestocate nu au deloc randRUL. -
#6 / S4, ancorarea coloanelor: view Oracle dedicat (Marius, 08.08.2026 — "poti sa faci un View in baza de date"). Deblocheaza varianta B din
rec_review_ancorare_s4.md, respinsa atunci doar pentru ca insemna migrare de schema. VFP consuma view-ul cuselect *, ca lavact_tot/vrul_tot— codul nu mai enumera coloane. Respinse: gridul dinamic dinAFIELDS()(unicat pe formular) siSELECT *pe join brut (mutase eroarea din SQL in binding-ul gridului). -
#6 / S4, pozitionarea in
tactpentru PAGE3: fara euristica pe text. Nu se alege niciun rand — se incearca toate tripletele distincte(cod, nract, serie_act, dataact)dintactpana la prima potrivire inVANZARI; randul de incasare se elimina singur pentru ca nu se potriveste. Masurat pe toate cele 419 note legate deVANZARI: 400 potriviri exacte, 0 gresite, 0 ambigue, maxim 2 triplete per nota (medie 1.17). Respinsa varianta!("INCASARE" $ Upper(explicatia))desi iesea si ea 62/62 pe multimea de risc: se sprijina pe text liber in romana, iarACTn-are marcaj de origine a randului si utilizatorul poate adauga randuri manual cu ce explicatie vrea. Respinsa si ancorarea peFDOC— e camp la nivel de nota, lipseste pe 40 din 62 (ABONAMENT/BON FISCAL). -
Numele view-urilor noi pastreaza prefixul familiei (Marius, 08.08.2026): view-ul de articole s-a redenumit
VVD_TOT->VVANZARI_ARTICOLE, ca sa stea langaVVANZARI_TOT/VVANZARI_DETALII/VVANZARI_DETALII_TOTla o listare alfabetica — asa se uita Marius la ele si asa vede din prefix ca tine de vanzari. Conventia surorilor de pe formular (vact_tot/vrul_tot) cedeaza in fata prefixului de familie. -
Comentarii strict necesare, si in scripturi, si in cod (Marius, 08.08.2026): fara referinte la planuri, stories, propuneri, decizii sau erori, fara trimiteri la rapoartele din
docs/, fara justificarea alegerilor. Notat inCOMUN\docs\reguli_lucru.mdpunctul 2 (extins explicit la.sql) si inCOMUN\docs\scripturi-migrare-db.md, sectiunea "Continutul unui script". Conflictul cuCLAUDE.mde inchis (Marius, 08.08.2026): marcajul*!* DD.MM.YYYY+ autor sta in antetul fisierului, niciodata inline; in cod raman doar comentarii scurte, functionale, si numai unde chiar explica o ramura sau un filtru, ca sa se inteleaga codul.CLAUDE.mda fost aliniat (sectiunea noua "Comments", care trimite lareguli_lucru.md). -
#6 / S4, coloana de valoare pe linie (Marius, 09.08.2026): scade
discount_unitarsi se numestevaloare, nusubtotal— atat antetul, cat si campul dintvdsi coloana din grid. Formula ramane ramificata pepret_cu_tva, ca inofacturare.prg:2222. -
#6 / S4, bara de totaluri (sub-blocul C) se amana (Marius, 09.08.2026): nu intra in continuarea fixurilor de editare, se porneste ca runda separata, cu agent proaspat.
-
Regenerarea din
todos.txtpunctul 13 NU schimba #6 (Marius, 09.08.2026). Pe 09.08.2026 a aparut inCOMUN\docs\todos.txt, la punctul 13, cererea de "editare factura/aviz in toate variantele prin regenerare" — formularul repopulat ca inainte de salvare, cu documentul initial marcatsters = 1si salvarea unuia nou. Formularea seamana cu varianta respinsa de decizia 5, dar tine de punctul 13 (formularul unificatfrm_facturare_articole2), adica alt proiect si alta perioada. Decizia 5 ramane in picioare: #6 face editare directa infrm_modific2024. De reluat cand se ajunge la punctul 13; a nu se confunda cu ipoteza exclusa. -
#6 / S4 sub-blocul C, valutele in bara de totaluri (Marius, 09.08.2026): liniile se convertesc in RON la cursul documentului (
VANZARI.CURS+ multiplicator) si se aduna intr-o singura cifra, ca verdictul de corelatie cuACT/RULsa ramana o comparatie simpla. Asta inchide a doua intrebare deschisa lasata de runda 3A (view-ulVVANZARI_ARTICOLEintoarce cifre RAW, neconvertite — conversia se face deci in VFP, la afisare, nu in view). Respinse: total doar pe valuta documentului cu semnalarea liniilor straine, si cate un total per valuta. -
#6 / S4 sub-blocul B, alegerea articolului la adaugare (Marius, 09.08.2026): selector nou, simplu, direct pe nomenclatorul de articole (cautare dupa cod/denumire), fara nicio legatura cu stocul sau cu politicile de preturi — coerent cu decizia 15 (fara plafon, fara verificare de stoc). Respinse: reutilizarea selectorului din formularul de compunere (prea legat de cursorul de stoc) si linia goala completata manual (n-ar lega linia de nomenclator). Implementat altfel decat "nou", si acceptat: agentul a gasit
caut_articol()(COMUN\programe\ocautare.prg:1636), functie globala deja existenta si inregistrata app-wide, care cauta pevnom_articoledupa cod/denumire, fara stoc si fara politici de pret — adica exact descrierea deciziei, fara cod nou. Nu s-a scris niciun selector nou. -
#6 / S4, intrarea directa in valuta in
frm_articol_factura: SE FACE (Marius, 09.08.2026). Azi dialogul lucreaza in RON chiar si pe un document in valuta — utilizatorul introduce pretul in RON, iarAdaugaLinieTvdDinArticolil converteste la stocare (* multiplicator / curs). Corect matematic si suficient pentru bara de totaluri, dar contraintuitiv pentru utilizator. Se trece pe intrare directa in valuta, ceea ce cere atinsCOMUN\clase\ofacturare.vc2(frm_articol_factura) — fisier care n-a apartinut niciunui agent pana acum, de unde si amanarea. De stiut la implementare:poDate.in_valuta = 1cere in pluszi_curssiid_valuta, validate intern de dialog, iar calea nu e testabila headless (dialogul e modal,Show(1)) — verificarea trece prinvfp_ui_harness.ps1, cu-SyncDirexplicit. CORECTIE DE PREMISA, 09.08.2026 (docs\handoff_decizia35_valuta_dialog.md, verificat si de orchestrator pe cod):frm_articol_facturanu citeste delocpoDate.in_valuta/zi_curs/id_valuta— singurele aparitii din intervalul clasei sunt comentate (ofacturare.vc2:2088,:2136, ramura scoasa la v2.0.56). Ramura de valuta a dialogului e condusa integral depoArticol.tip_valuta/Curs/multiplicator/nume_val(cod viu::1857,:1887,:1917,:1932,:1961,:2378,:2586), adica proprietati de articol, populate de apelant prinScatter Name poArticolinainte deCreateobject— asa fac deja cei 3 apelanti vechi (ofacturare.vc2:12873,:13805,:17180). Consecinta care schimba scopul: decizia 35 se poate implementa FARA sa se atingaofacturare.vc2— se populeazapoArticol.tip_valuta=1+Curs/multiplicator/nume_val/id_valutadintvanz(coloane deja incarcate deIncarcaVanzareNota, fara interogare Oracle noua) incmdAdaugaArticol.Click/CreeazaPoArticolNouTvd, ambele proprii acestei livrari. Risc de regresie pe apelantii vechi: zero, cat timp codul dialogului nu se atinge. Dialogul intoarce atunci ambele valori —pretftva_val(valuta, introdusa de user) sipretftva(RON, derivat cu acelasi curs,ofacturare.vc2:1989/:2017/:1892/:1937) — deciAdaugaLinieTvdDinArticoltrebuie sa citeasca direct_val, nu sa mai converteasca RON->valuta (altfel face cerc RON->valuta->RON->valuta, aproape neutru dar cu rotunjiri in plus). Cutip_valuta=0cum e azi, conversia existenta e corecta, nu dubla. -
#6 / S4, suma
RULse face DOAR peID_TIP_RULAJ = 0(Marius, 09.08.2026). Alea sunt intrarile/iesirile reale. RandurileID_TIP_RULAJ = 3sunt intrari/iesiri virtuale: apar cand marfa la pret de vanzare se vinde la alt pret decat cel din stoc, iar perechea de diferenta de pret tine locul procesului verbal de schimbare de pret care ar fi trebuit intocmit inainte ca sa alinieze pretul de vanzare. Nu sunt miscare de marfa, deci nu intra in suma comparabila. Inlocuieste formula veche (SUM(CANT*PRETVTVA) + SUM(CANTE*PRETVTVA WHERE ID_TIP_RULAJ <> 3)), al carei prim termen insuma si randurile virtuale. Respinsa varianta discutata inainte de acest raspuns: excluderea randurilor "duplicat" prin potrivire de valoare (acelasi articol/cantitate/pret ca partenerul din perechea3) — dadea aceeasi cifra pecod=1140895, dar ca euristica fragila, nu ca regula. Corectia cu liniile nestocate (decizia 25) ramane neschimbata si in continuare marcata "ajustat". -
#6 / S4, contul de referinta pe rate/contract nu e unic (Marius, 09.08.2026): pe tip 2, 6, 52 cu
id_rata <> 0poate fi4111,411sau461, nu doar4111cum s-a implementat empiric. Toate trei se accepta. Atentie la comparatie: cuSET EXACT OFFun=simplu potriveste'411'ca prefix al lui'4111'— se compara cu==peAlltrim(), pe o multime de conturi, nu pe o valoare unica.
Fapte stabilite (nu le relua)
#6 — arhitectura
frm_modific2024e clasa.vcxinCOMUN\clase\omodificari.vc2(clasa la:6375, metode:12200-15319), deja disponibila din ROAFACTURARE. Nu trebuie portata.- Pageframe-ul existent
pgfArticolearePAGE1= rulaje 303 (grdRulaje) siPAGE2= rulaje obiecte de inventar 8039 (grdRulajeObinv),:8598-8601. Pagina de articole factura se adauga dupa acest model. frm_modific2024nu atinge azi delocVANZARI/VANZARI_DETALII.- Zero
UPDATE/DELETEdirect peACT/RULin tot codul VFP. Singura cale: cursoare ->ACT_TEMP/RUL_TEMP->PACK_CONTAFIN. Editarea marcheaza randul vechiSTERS=1si scrie document nou cucodnou. ID_FACTnu se schimba la modificarea notelor — se genereaza la introducere dinnract+dataact; se schimba doarcod-ul setului. DeciVANZARI.ID_FACTramane neatins.pack_contafin.finalizeaza_modificare_nota(COMUN\docs\PACK_CONTAFIN.pck:8601-8651) cheama dejapack_facturare.actualizeaza_vanzari(cod_vechi, cod_nou). Daractualizeaza_vanzariface doar realiniereacod+STERS=0: nu recalculeaza sume, nu atinge totalurile denormalizate. Aici e lucrarea server-side, si de acolo o primesc ambele puncte de intrare.- Sablon de urmat pentru actiunea din ROAFACTURARE:
frm_facturi.do_sterge(COMUN\clase\ofacturare_comun.vc2:4503-4719), nudo_modifica.do_stergeare 3 garzi pe caredo_modificanu le are (luna inchisa:4518-4520, luna curenta:4543-4546, referinte:4565-4569) — devin obligatorii cand se ating sumele. Garda eFactura, de refolosit:ofacturare_comun.vc2:4428-4432. - Drepturi pe
frm_facturi: nunid_cw, cilactiv3/lactiv4+ tokeni ingcAcces.lactivNgateaza executia,cbutonNvizibilitatea butoanelor; ambele populate generic de_frm_base.actualizeaza_drepturidingcAcces. - Garda eFactura e in
frm_facturi.do_modifica(ofacturare_comun.vc2:4426-4430), nu indo_stergecum spunea planul, si e un simpluIf, nu unReturncu mesaj.afisjurcom(registrul jurnal) nu o are deloc — de extras inCOMUN\programe\. frm_modifica_articol_factura(explicatie + taxcode) e deschis dedo_modifica_explicatie(But_modifica2), nu dedo_modifica, care deschidefrm_modifica_factura(antet). Niciuna nu atinge sume.frm_modific2024nu primeste cursoare ca parametru — se leaga pe aliasuriletact/trul/trul_obinv, deschise READWRITE de apelant inainte deCreateobject;InitprimestetnIdSet, tlNotaNoua, toBackupXML, toSet, tlVizualizare. Validarea grea sta ininainte_de_do_termin(omodificari.vc2:13357-13549) — acolo intra si validarile noi de sume.- Calea de scriere in
VANZARI_DETALII: la emitere trece prin GTTVANZARI_DETALII_TEMP(ON COMMIT DELETE ROWS), umpluta depack_facturare.adauga_articol_factura(apel Oracle per linie din VFP) si golita in tabela reala descrie_in_vanzari.adauga_articol_facturanu e reutilizabila la editare — re-deriva pret/TVA/valuta din documentul-sursa, care la o factura emisa nu mai exista. #6 scrie direct inVANZARI_DETALII(UPDATE /STERS=1/ INSERT), dupa modelulmodifica_explicatie_articol; PK-ul vine din trigger peSEQ_VANZARI_DETALII. Stergerea unei singure linii nu exista azi. - Pe Oracle, calculul per linie e deja extras in
calculeaza_total_fara_tva_fact/calculeaza_total_tva_factsi ramifica pePRET_CU_TVA; de extras ramane doar agregarea pe document.SERIE_INCASAT/NR_INCASAT/SUMA_INCASAT/TIP_INCASATnu se recalculeaza (n-au sursa persistenta; o copiere naiva aUPDATE-ului le-ar pune NULL si ar rupe legatura cu incasarea).VALVAL/TVAVAL/TOTVALintra in recalcul. - S6 inchis pe cod: toate legaturile trec prin
ID_FACTsauID_VANZARE, niciuna princod;actualizeaza_vanzarirescrie doarCODpe acelasi rand,ID_VANZAREnu se schimba niciodata. id_set + 5de la discount NU ajunge niciodata inACT— ipoteza lui Marius, confirmata pe cod si pe date.PACK_FACTURARE.cumuleaza_note_act_temp(:14198) rescrieID_SETcupack_facturare.nid_set(valoarea de baza, deja restaurata descrie_discount), iarPACK_CONTAFIN.SCRIE_IN_ACT(:956-958) copiazaACT_TEMP->ACTfara alta transformare. Pe date: 170 de randuri de discount (64MARIUSM_AUTO2008-2026, 6ROMFAST2002-2007, 100VENDING2017-2018) — toate cu acelasiid_setca restul notei. Offsetul e marcaj tranzitoriu. Ramura "2 id_set la distanta 5" din garda scrisa in runda 3 e cod mort.RUL— formula comparabila, gasita: liniile de diferenta de pret apar dinPACK_FACTURARE.descarca_gestiune(:9361-9540marfa,:9641-9818produse), declansate deV_PRETV_ORIG <> V_PRETVpe gestiuni cuV_TIP_GESTIUNE IN (6,7)(marfa/produse la pret de vanzare). Suma comparabila, forma veche (SUPERSEDATA de decizia 36):SUM(CANT*PRETVTVA) + SUM(CANTE*PRETVTVA WHERE ID_TIP_RULAJ <> 3). Inchide divergenta de pecod=1140888(4476.28 -> 1924.59) si pe productie (cod=1397098) — dar pe ruta gresita, si numai pentru ca pe documentele fara perechi3cele doua forme coincid. Forma corecta e cea din decizia 36: suma doar peID_TIP_RULAJ = 0.- Liniile NESTOCATE nu au deloc rand
RUL(servicii,IN_STOC=0) — confirmat pe productie (cod=1397106, lipseste exact linia de servicii transport). Deci pe documente mixte sumaRULtrebuie corectata cu liniile nestocate dinVANZARI_DETALII. - Randurile
ID_TIP_RULAJ = 3sunt miscari VIRTUALE, nu reale (Marius, 09.08.2026 — vezi decizia 36). Apar cand marfa la pret de vanzare se vinde la alt pret decat cel din stoc: in mod normal ar fi trebuit intocmit intai un proces verbal de schimbare de pret, iar perechea de diferenta de pret tine locul acelui proces verbal. Deci nu intra in suma comparabila. Consecinta pe date: ce numea cercetarea "randuri duplicat" (ID_TIP_RULAJ = 0cu aceeasi cantitate/pret ca un rand din perechea3) sunt de fapt miscarile reale, iar perechea3e suprapunerea virtuala. Pecod=1140895, suma doar peID_TIP_RULAJ = 0da121.00 + 2*121.01 + 1259.07 + 302.50 = 1924.59= exactACT/TOTAL_CU_TVA. Euristica de excludere pe potrivire de valoare nu mai e necesara — regula e semantica, nu de potrivire. Formula veche parea sa mearga pe cele 360 de documente doar pentru ca pe documentele fara perechi3cele doua forme coincid (rec_suma_act.mdE.5: in esantionulVENDINGnu s-a gasit niciuntip=1cuID_TIP_RULAJ = 3). cod=1138989(tip 51) SE INCHIDE: nota e dublata. Cele 12 randuriACTsunt doua blocuri de cate 6, al doilea exact 2x primul rand cu rand; blocul A insumeaza exactTOTAL_CU_TVA(13895.45, cu 0.01 de rotunjire), totalul 41686.35 = 3x. Deci regula pentru suma dinACTtine si aici — documentul are o nota postata de doua ori, anomalie de date, nu exceptie de la regula. Ramane neexplicata doar linia unica dinVANZARI_DETALII(2468.21), care nu reconciliaza cu niciuna din cifre. Detalii:docs\cercetare\rec_cele_41_facturi.md.- Cele 41 de facturi de la decizia 9 sunt toate documente STERSE (
VANZARI.STERS = 1). Definitia care da exact 41: fara filtru pesters,total_cu_tva <> 0, zero linii active inVANZARI_DETALII(custers = 0pe antet rezultatul e 0).cod=1138989nu e printre ele — aresters = 0si o linie activa. Presupunerea dinrec_suma_act.mdca ar fi "aceeasi familie" a picat. an/lunanu se deriva dinVANZARI.DATA_ACT: pe 703 documente, 542 au nota in luna dinDATA_ACT, 78 intr-o alta luna, 83 n-au deloc randuriACT. In datele de test cazurile sunt concentrate petip = 51(DATA_ACTsablon01-JAN-19), deci nu e dovedit tipar de productie — daran/lunase iau din contextul notei deja incarcate, niciodata recalculate din antet. Pentru cele 78,do_editare_facturaraspunde azi "Nu exista nota contabila" si refuza editarea.- Randul periculos la pozitionarea in
actactannu e cel de discount, ci INCASAREA. InACTnu exista niciun rand cuid_fact <= 0din 2020 incoace (siid_factdnu e niciodata NULL), deciID_FACT = -1scris descrie_discountnu ajunge acolo. In schimb, primul rand al notei dupaid_actpoate fiINCASARE/INCASARE NUMERAR, cuid_fact= al facturii minus 1: 39 de facturi in schema de dev pe care unGo Toporb ar preluaid_fact-ul chitantei. Sursa corecta pentruid_factecrsfacturi(=VANZARI.ID_FACT). Dovezi:docs\cercetare\rec_pozitionare_actactan.md. VANZARI.CODNU e unic — dovedit pe date. IndexulIDX_VANZARI_04e pe(STERS, COD)si e NONUNIQUE;cod=1139934are 4 randuri active cuTIP/NUMAR_ACTdiferite,cod=1139555are 2. Deci forma simpla din A.3 (SELECT ... FROM vanzari WHERE cod = tact.cod) poate intoarce documentul gresit. Dezambiguizarea aplicata inIncarcaVanzareNota: filtru compuscod+nract+serie_act+data_act(toate disponibile petact, dinvact_tot) —(COD, NUMAR_ACT, SERIE_ACT, DATA_ACT)verificat fara nicio dublura pe toata tabela.ID_FACTnu e utilizabil ca discriminator: e NULL pe o fractie mare de randuri chiar si pe facturi normale (tip=1: 58 din 183 NULL;tip=51: 58 din 74) — ar rata avizele, deci ar incalca decizia 19.id_setunic pe nota, confirmat pe date: 558 de note legate deVANZARIcu un singurid_set, 1 cu doua — si aceea e randul-gunoicod=0, an=0, luna=0. Decizia 24 se sustine.VANZARI.DATA_ACTnu se potriveste cuACTpe 19 note din 419 (4.5%): data difera fizic de oricedataactdin nota — majoritatea din 2019, cu01.01.2019ca placeholder, restul decalate / NULL / stornate. Nicio alegere de rand dintactnu le rezolva;Go Top-ul de azi le rateaza identic, deci nu e regresie introdusa de decizia 27. Pe ele PAGE3 nu apare.ofacturare_editare.prge inregistrat DOAR in ROAFACTURARE (roafacturare.prg:214).roacont.prg:233siroagest.prg:175incarcaomodificari.vcxfara ea. Orice apel nou si negardat dinfrm_modific2024catre functiile din acel fisier rupe registrul jurnal in ROACONT/ROAGEST. De verificat la fiecare extindere a clasei —COMUNajunge in toate produsele, punctele de intrare nu.finalizeaza_modificare_notafolosestetnIdFactDdoar in cod comentat (ramurile 90011/90013) — azi e complet nefolosit.tnIdFactconteaza doar pe ramuratnIdSet IN (31003, 31004, 31005, 31011)(UPDATE NOM_LUCRARI), care e vie si pentru documente dinVANZARI: 35 de note cuid_set = 31011, 5 cu31003, 1 cu31005.- Regula pentru suma din
ACTe verificata pe 360 de documente, 12 tipuri, 3 scheme (MARIUSM_AUTO,ROMFAST,VENDINGproductie): ~97.5% potrivire exacta, restul explicate (transfer, custodie) sau izolate.ROMFASTse conecteaza direct, fara tunel (alias intnsnames.ora, nu era inoracle.md). - "Suma din
ACT" nu are filtru fix de cont (spus de Marius, 08.08.2026): facturile merg pe4111, avizele pe418; nota mai contine randuri de discount si poate contine note adaugate manual de utilizator. Regula corecta, pe tip de document:docs\cercetare\rec_suma_act.md. - Nota se genereaza in
PACK_FACTURARE, nu inPACK_CONTAFIN(care doar copiazaACT_TEMP->ACT):scrie_factura2/scrie_factura_avize->contabilizeaza_articol/contabilizeaza_rata->scrie_nota. Discountul de document:scrie_discount, pe cont opus. - Comparatia stricta
ACTvsVANZARI_DETALIIe imposibila prin constructie:ACTnu are nicio coloana care sa marcheze originea randului (omodificari.vc2:12653,do_adauga), deci dupa salvare un rand adaugat manual e indistinctibil de unul generat automat. Indicatorul din S4b ramane informativ pe subset definit, fara verdict automat de eroare. Agraveaza faptul ca #6 activeaza tocmaido_adaugasi pe facturi. codsingur NU e filtru sigur peACT— se cerecod+an+luna. Dovada:cod=1140632are randuri dintr-o factura de achizitie straina (OCR furnizor) in luna 1 si nota de vanzare reala in luna 2, cu acelasicod.IncarcaCursoareModificareNotafiltreaza deja corect.- Contul de client difera pe mai mult de doua valori: facturi
4111; factura din aviz4111(discountul direct pe4111cu semn negativ, nu pe667); avize catre clienti debitori (tip 28, 29) — cont461; restul avizelor418. Discountul pe facturi normale e667/4111pe credit, deci suma corecta e soldul net (debit - credit), nuSUM(SCD=...). - Tipuri fara suma comparabila: transfer intre subunitati (23, 25, 30, 41) si transfer pe
lucrare (27) merg pe cont de stoc, nu de client; custodia (42, 47) nu genereaza niciun rand
ACTper articol. Pe ele nu exista ce compara — de tratat explicit, nu de raportat ca eroare.
#8 — cauza si inventarul, confirmate
PACK_FACTURARE.scrie_corespondente_vanzariincheia cuUPDATE VANZARI SET AVIZE = (...)fara WHERE la nivel de instructiune — subinterogarea era filtrata corect, rezultatul se scria pe tot tabelul. SingurulUPDATE/DELETEfara WHERE peVANZARIdin tot pachetul (verificate toate cele 17). Reparat in #8.- Cele doua view-uri sunt aliniate structural (
FACT_VFACTURI100 coloane,FACT_VFACTURI2101, in plus doarTIP_PERSOANA); divergenta era de valori, pe 16 coloane din 99. - Harnessul de regresie:
docs\verificare_vfacturi.sql— ruleaza pe orice schema si afiseaza doar coloanele diferite. Nu e artefact consumat: cele doua view-uri raman in paralel prin decizia 4, iar #7 a schimbat preturile pe linie, adica exact totalurile pe care le compara. - Linia de baza acceptata dupa #8, pe 846 perechi:
CURS 19,MULTIPLICATOR 3,ID_VALUTA 19,TOTAL_FARA_TVA 54,TOTAL_TVA 46,TOTAL_CU_TVA 59,VALOAREA 39,SERIE_CHIT 15,NR_INCASARE 64,INCASAT 76,TIP_INCASARE 29,NUME_VAL 19,VALUTA 19;ALTELE,CONTRACT,EXPLICATIE,CLIENT,DISC_FARA_TVA= 0. Orice cifra care se misca fata de tabelul asta e regresie. - Semnificatia completa a tipurilor de document (perechile
(ID_SET, TIP), etichetele dinEXPLICATIE, seturile folosite in cod, capcanele46/47si coliziunea25051):COMUN\docs\tipuri_documente_facturare.md.
#10 / #11 / #12 — valabile, amanate
Planurile si faptele raman valabile; sunt amanate pentru ca mai au nevoie de analiza (varianta
neatestata la #12, precoditia de inrolare text la #11, go/no-go nedecis la #10). Motivele:
plan_index.md. Materialul de reluare: docs\cercetare\.
Ipoteze EXCLUSE (cu dovada)
- #8, avizul nu se scrie deloc — fals.
scrie_corespondente_vanzari(1)e apelata neconditionat pentrutip=4. Problema era ca scria peste tot. - #8,
scrie_in_vanzarinu are WHERE — fals, are. - #8, cele doua view-uri au divergat structural — fals, divergenta era de valori.
- #8, handler-ul
when NO_DATA_FOUND then nullascunde UPDATE-ul — exclusa arhitectural: toateSELECT INTO-urile dinscrie_in_vanzarisunt agregari pure faraGROUP BY, care in Oracle intorc mereu exact un rand.NO_DATA_FOUNDnu poate porni de acolo; handler-ul e cod mort. - #8, chitantele lipsa ar veni din facturi emise din aviz (
tip=4) — fals; 21 din 26 sunttip=-12. - #8, chitanta stearsa dupa emitere — exclusa: niciun rand
ACTsters pe perechile verificate. - #7, e nevoie de coloana noua in
VANZARI_DETALII— fals, flagul exista deja per linie. - #6,
id_facts-ar schimba la editare — fals, e by design stabil. - #6, se poate face regenerare prin re-emitere — respinsa de Marius.
- #12, varianta B (politica implicita unica) — exclusa pe date.
- #12,
ACONTar fi contul de venit — fals, e nefolosita si contine gunoi.
AVERTISMENT: MARIUSM_AUTO are date de TEST
Datele sunt facute manual pentru test, nu de productie. Deci concluziile bazate pe distributie,
volume sau frecvente sunt slabe — datele calendaristice pot fi artificiale, iar combinatiile pot sa
nu apara niciodata in realitate. Ramane solid tot ce e demonstrat pe cod si tot ce vine din
istoria produsului spusa de Marius. Autoritatea pentru orice intrebare de distributie e VENDING
(productie), in citire, prin tunel.
Precoditii de mediu
- Dezvoltare si test:
MARIUSM_AUTO/...@ROA_CENTRAL, clientD:\ROA\instantclient_19_18\sqlplus.exe. Credentiale:COMUN\docs\local\oracle.md(scos din SVN la r17995, exista doar pe disc). SQL-ul se da prin fisier.sqlASCII cu@fisier, nu prin pipe din PowerShell (BOM-ul UTF-16 sparge parserul). VENDING(productie): al doilea set de date, strict citiri. Tunelul se porneste headless custnlc.exe(nuBvSsh.exe, care e GUI). Tabelele sunt in schemaVENDING, decialter session set current_schema = VENDING;la inceputul fiecarui script. Are avize si facturi din comanda — tipuri care lipsesc dinMARIUSM_AUTO.ROMFAST@ROA_ROMFAST: are facturi pe baza de contract, tot strict citiri. Impreuna cuVENDING, acopera tipurile de document pe care schema de dezvoltare nu le contine. Credentiale pentru ambele:COMUN\docs\local\oracle.md.- #11 / #10:
ROAPRETURIsiROACONTRACTEnu au cache text (.vc2/.sc2). Procedura:COMUN\docs\inrolare-proiect-git-text.md. - Scripturile Oracle: nivel 10.2 (ROMCONSTRUCT), CRLF, idempotente, cu
UpdateVersiunesicommit;la final —COMUN\docs\scripturi-migrare-db.md.
Comenzi utile
# text VFP la zi (la inceputul sesiunii si inainte de orice git commit)
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\git_sync.ps1 -ProjectRoot D:\ROA\ROAFACTURARE
# cautare pe simboluri (da fisier:linie si clasa.metoda proprietara)
$s = 'D:\ROA\UTIL\foxbin2prg\vfp_symbols.ps1'
$c = @('-CacheRoot','D:\ROA\ROAFACTURARE','-ProjectRoot','D:\ROA\ROAFACTURARE','-IndexFile','D:\ROA\_vfp_textcache\roafacturare\_symbols.tsv')
powershell -ExecutionPolicy Bypass -File $s @c -Grep '<expresie>' -CodeOnly
# harnessul de regresie pentru #8
& 'D:\ROA\instantclient_19_18\sqlplus.exe' -L -S 'MARIUSM_AUTO/<parola>@ROA_CENTRAL' '@D:\ROA\ROAFACTURARE\docs\verificare_vfacturi.sql'
# test VFP headless sub watchdog: captura PNG + textul dialogului nativ care blocheaza, apoi kill
powershell -ExecutionPolicy Bypass -File D:\ROA\ROAFACTURARE\COMUN\utile\Teste\watchdog_vfp.ps1 -Script '<test.prg>' -AutoDismiss
# suita de regresie #7 (VFP headless)
powershell -ExecutionPolicy Bypass -File D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_pret_cu_tva\test_pret_cu_tva_nivel3_gestiuni.ps1
Sursa PACK_FACTURARE se exporta din MARIUSM_AUTO (all_source), conform
COMUN\docs\oracle_export.md. Copia pe disc, cu alta numerotare de linii:
D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\03\ff_2026_03_23_04_COMUN_PACK_FACTURARE.sql.
Ce a ramas in docs\
| Fisier | Continut |
|---|---|
plan_index.md |
ordinea de executie, dependentele intre planuri, precoditii |
plan_06_editare_factura.md |
10 stories + sectiunea "Ce preda #7 catre S6" |
plan_07_pret_cu_tva_pe_linie.md |
consumat de #7, pastrat ca referinta a variantei respinse |
plan_10 / plan_11 / plan_12 |
amanate |
verificare_vfacturi.sql |
harnessul de regresie pentru cele doua view-uri |
plan_06_s4_proiectare.md |
proiectarea S4/S4b; C.1 rescrisa 08.08.2026, A.3 aliniata la decizia 19 |
diff_s4_runda1_page3.patch |
diff-ul S4 runda 1, de revizuit (omodificari.vc2 + ofacturare_editare.prg) |
cercetare\rec_s4_runda1.md |
raportul rundei 1: ce s-a implementat, ce s-a testat, ce NU e acoperit |
cercetare\rec_review_ancorare_s4.md |
review-ul de ancorare a coloanelor (sursa deciziei 26) |
cercetare\rec_gotop_tact_s4.md |
blocantul Go Top In tact, confirmat pe date (sursa deciziei 27) |
cercetare\rec_view_articole_vanzare.md |
proiectarea VVANZARI_ARTICOLE + ce s-a respins |
cercetare\ff_view_articole_vanzare.sql |
copia de lucru a scriptului (originalul e in SCRIPTURI_CLAR) |
cercetare\handoff_s4_runda1.md |
predarea agentului s4-runda1; detaliile blocajului „View Parameter" |
cercetare\rec_watchdog_vfp.md, handoff_propr_custom.md |
watchdog-ul VFP si regula *p: pentru proprietati noi |
cercetare\rec_editare_factura.md, rec_modific2024.md |
#6 |
cercetare\rec_suma_act.md |
regula sumei din ACT pe tip de document (sursa lui C.1) |
cercetare\rec_pozitionare_actactan.md |
de unde se citesc id_set/id_fact/id_factd (runda 4) |
cercetare\rec_datoria6_baza_regresie.md |
realocarea de cod 1140888->1140895 si re-ancorarea suitelor pe descoperire |
diff_datoria6_suite_regresie.patch |
diff-ul celor doua suite + descopera_caz_test.prg |
cercetare\rec_cele_41_facturi.md |
cine sunt cele 41 de la decizia 9; cod=1138989 = nota dublata |
cercetare\rec_tva_vanzari.md, rec_pret_lazy.md |
#7 (fond) si #12 |
cercetare\rec_integrari.md |
#10, #11, #12 |
cercetare\rec_consumatori_vanzari.md |
inventarul celor ~16 cai xmlefactura (datoria 5) |
cercetare\rec_s10_s12.md |
textul propus pentru changelog_roaauto.txt (datoria 3) |
cercetare\rec_todos_done.md |
starea punctelor din todos.txt |
cercetare\rec_s4_runda3b.md |
sub-blocul B: stergerea de linii (implementare + testare) |
handoff_s4_runda3b_adaugare.md |
contractul frm_articol_factura/poArticol/poDate/gnScadereStoc pentru adaugarea de linii (neinceputa) |
diff_s4_runda3b_linii.patch |
diff-ul stergerii de linii |
cercetare\s10_curata_versiune.sql |
curatarea tabelei VERSIUNE (datoria 4) |
docs\ nu e urmarit nici de git, nici de SVN, si COMUN\utile\curatenie.ps1 l-ar sterge la
curatenia dinainte de commit. Ce trebuie pastrat, se muta sau se comite.
Mod de lucru
Conform CLAUDE.md: sesiunea principala orchestreaza, subagenti proaspeti per sarcina
(~200-250k tokeni, apoi predare pe disc + agent nou — COMUN\docs\orchestrare-subagenti.md).
Fara commit fara review: diff-ul se livreaza intai ca fisier in docs\.
Doua lectii platite scump, amandoua din aceeasi cauza — un subagent tinut peste prag
(s5-nivel2 533k, s2d-modifica-gestiuni 434k): cand un agent a terminat un bloc, se scrie
starea pe disc si blocul urmator il ia un agent nou. Nu conteaza ca "mai are putin"; predarea e
aproape gratuita, pentru ca raportul e deja scris.
UN SINGUR SCRIITOR PE FISIER, oricat de disjuncte par sarcinile. Platit pe 08.08.2026: doi
agenti au primit sarcini diferite care atingeau amandoua Show() din omodificari.vc2; al doilea a
scris pe baza unei citiri mai vechi si a sters tacit modificarea primului (lost update). Nu a
sarit in ochi: fidelity-check-ul trece, testele treceau pe alt caz, iar agentul a raportat drept
"revertite" si lucruri care de fapt erau intacte. Verificarea starii se face pe disc de catre
orchestrator, nu din raportul agentului. Al doilea simptom, tot de acolo: textul .vc2 poate
ramane inaintea binarului daca agentul e oprit intre editare si write-back — se compara mtime-urile
si markerii din .vct, nu se presupune.
Criteriul de falsificare dat unui agent trebuie sa fie el insusi verificat. Tot 08.08.2026: am
cerut "ipoteza cade daca RecordSource nu ajunge gol". Predictia era gresita (VFP nu goleste
proprietatea), si headless grid-ul nici nu se materializeaza — deci masuratoarea nu putea decide
nimic. Agentul a raportat corect cifra si a tras concluzia gresita pe criteriul meu. Cand un
agent raporteaza "ipoteza infirmata", verifica intai daca proba chiar putea sa o infirme.
Si: pentru executie delegarea merge; pentru concluzii verifica intotdeauna numitorul, datele de intrare ale testului si sensul corectiei propuse. S-a confirmat de mai multe ori — rezultate care pareau sa infirme o corectie s-au dovedit, la verificare, altceva decat pareau.
Capcane de mediu, de aplicat imediat
- Grep de la radacina proiectului NU vede nimic din
COMUN\—COMUN/e in.gitignore-ul acestui repo si ripgrep il respecta, deci intoarce tacut "No matches found" pentru simboluri care exista. Se dapathexplicit peCOMUN\.... Probat:gridextra-> 0 fisiere de la radacina, 25 cupath=COMUN\clase. git stashe INTERZIS inCOMUN(si in orice director dublu-versionat SVN+git):git stash push -uda jos de pe disc modificari necomise in SVN si fisiere netrackuite, iarsvn statusle arata ca!, nu caM— pierderea nu sare in ochi. Dupa orice operatie git acolo, ruleazasvn statussi cauta!.svn updatese blocheaza daca il rulezi casvn update <dir> 2>&1 | Select-Object ...din PowerShell 5.1 (proces cu 0% CPU — pare retea sau credentiale, nu e). Forma corecta:svn update <dir> --non-interactive > fisier, fara2>&1si fara pipe.COMUNprimeste commituri si din alte produse, si Marius lucreaza uneori din alta copie de lucru. "Aici nu lucreaza nimeni altcineva" e valabil pentru copia de lucru, nu pentru repo. Verificasvn log -l 3inainte sa comiti sau sa tragi concluzii despre ce e in HEAD.- Zgomot de la compilarea VFP: dupa un build din IDE,
svn statusarataMpe binare atinse doar de recompilare. Se comite tintit pe modificarile reale, apoi se reverteste restul — dupa ce se verifica pe versiunile text ca au zero diferente de continut. txt2vcx.ps1 ... -AllowComunse ruleaza direct, fara aprobare prealabila; verificarea ramane pe binar. Regula "fara commit fara review" e neschimbata.- Testarea UI headless (inclusiv dialogurile modale
Show(1)deschise din codul aplicatiei):COMUN\docs\testare-ui-vfp.md— mecanismul si toate capcanele platite sunt acolo, citeste-o inainte sa scrii o suita noua. vfp_ui_harness.ps1: nepotrivirea de director de sincronizare blocheaza captura, si TAIE testul. Cauza reala a celor 24 de esecuri de captura din 09.08.2026 (16 intr-o sesiune, 8 in alta): testul isi setagcSyncDirpeuisync4\, iar harness-ul astepta implicit inuisync\. Se da-SyncDirexplicit si merge din prima. Nu era masina ocupata — asa s-a crezut doua sesiuni la rand, si concluzia gresita a fost scrisa si aici; corectata 09.08.2026. Consecinta care ramane valabila indiferent de cauza: testul se opreste la fiecare pasREADYsi asteapta handshake-ul; daca acesta nu vine, procesul e omorat acolo si tot ce urma dupa acel pas nu se executa, fara nicio eroare in log. Asa au iesit doua cifre umflate:7/7raportat cand logul avea 6, si10/10cand avea 9. Regula: cifra se ia numarand liniilePASS/FAILdin log, iar dovada ca rularea a ajuns la capat e linia deREZULTAT— fara ea, rularea e taiata, indiferent ce spune raportul. Asertiile importante se pun inainte de primulREADY. (Atentie la numaratoare: linia deREZULTATcontine ea insasi cuvintelePASSsiFAIL, deci unSelect-Stringnaiv raporteaza cu unu mai mult din fiecare.)- Uneltele de test n-au voie sa foloseasca input real (
keybd_event,SendInput,mouse_event,SetForegroundWindow) — input-ul real nu are tinta, ajunge in fereastra care are focusul atunci, oricare ar fi ea, iar masina e partajata. Pe 08.08.2026 watchdog-ul a trimis ESC dupaSetForegroundWindow; a rezultat eroarea VFP 1 „Execution was canceled by the user", raportata ca posibil bug de aplicatie — s-a dovedit ca era procesul nostru de test, deci n-a stricat munca nimanui, dar a costat un ciclu de alarma falsa. Permis: doar mesaje tintite pe handle (PostMessage/SendMessage), care nu ating focusul. Daca asa nu se inchide dialogul, dismiss-ul esueaza cinstit — captura ramane oricum partea de incredere. La omorarea proceselorvfp9.exe: doar cele pornite de tine (verificaStartTimesiMainWindowTitle). DO ... WITHpaseaza PRIN REFERINTA, iar variabila devine invizibila sub numele ei propriu in procedura apelata. Dovedit pe date 08.08.2026:gnAnvalid in programul principal la fiecare checkpoint,'U'la intrarea in cele 3 proceduri apelate cuDO ... WITH gnAn, gnLuna, valid in cele 2 apelate fara — corelatie 5/5 cu sintaxa apelului, nu cu ce face procedura. Consecinta urata: orice?variabiladin SQL passthrough de pe lantul respectiv nu se mai poate lega si VFP deschide dialogul nativ „View Parameter", care blocheaza testul headless la infinit. Remediu: paranteze —DO proc WITH (gnAn), (gnLuna)forteaza pasarea prin valoare. In productie tiparul exista, dar e INOFENSIV — verificat 08.08.2026, deci nu e nimic de reparat:oproceduri_stocuri.prg:35, 130, 207cheamaINAINTE_DE_STOC(oinainte_de.prg:356-411), unde singurul SQL (:389-390) construieste totul prin concatenare (Alltrim(Str(tnAn))), zero?. Cautarea pe ambele conditii simultan (DO ... WITH <global>+?<aceeasi>pe lant) in totCOMUN\programe/COMUN\claseda doar un al doilea caz, la fel de inofensiv (rulaje.vc2:8243->fisa_magazie_fifo). Corroborare: laoinainte_de.prg:311sta comentata o versiune veche a luiINAINTE_DE_STOCcare folosea?gnAn,?gnLuna— capcana a mai fost lovita si s-a trecut pe concatenare. De urmarit, fragil dar corect azi:test_casa(oinainte_de.prg:258) chiar foloseste?gnAn/?gnLuna; apelantul (ocasabanca.prg:66) nu le paseaza ca argumente, deci nu sunt mascate — dar ar deveni bug daca cineva le adauga la apel. Detalii:docs\cercetare\rec_inainte_de_stoc.md.- O suita care testeaza o clasa din
COMUNincarca implicit copia ALTUI PRODUS.COMUN\utile\Teste\test_init_env_auto.prgfaceSet Default To D:\ROA\ROACONT\, puneSET PATHpeROACONT\COMUN\CLASEsi la:139Set Classlib To omodificari Additive— deciCreateobjectiaD:\ROA\ROACONT\COMUN\clase\omodificari.vcx, nu fisierul editat. Toate verificarile „live" de dinainte de 08.08.2026 pefrm_modific2024au validat alt fisier. Remediu, in test, dupa initializarea mediului:RELEASE CLASSLIB omodificari+SET CLASSLIB TO <cale completa> ADDITIVE(SET CLASSLIB ... ADDITIVEsingur da eroarea 24 „Alias name is already in use" si pastreaza tacut copia veche). Verificare:loForm.ClassLibrarytrebuie sa arate calea asteptata. - Sterge
.fxp-ul vechi inainte de FIECARE rulare de test. Altfel VFP ruleaza tacut codul VECHI compilat; simptomul e un log care nu corespunde sursei curente, cu rulari „identice" care dau rezultate diferite. - Dialogurile native VFP blocheaza testul headless la infinit, fara log, fara eroare, fara
TRY/CATCH, si nu-i prinde mock-ul deamessagebox(nu suntAMESSAGEBOX). Doua vazute pana acum: „View Parameter — Enter the value for<var>" si „Open" (fisier lipsa). Nu se depaneaza orbeste: se ruleaza sub watchdog (mai jos), care face captura si citeste textul dialogului cuWM_GETTEXT. - Grid nou cu
RecordSourcepe un cursor inexistent la constructia formularului -> VFP incearcaUSE <recordsource>ca fisier fizic si deschide dialogul nativ „Open". Solutia din clasa: placeholder gol creat inLoad(), inainte ca framework-ul sa construiasca grid-urile (tiparul existent pentrusaft_taxtable/saft_mecanisme_plati). - O proprietate custom noua are nevoie de intrare
*p:in*<DefinedPropArrayMethod>, nu doar de valoarea din*<PropValue>. Fara*p:, valoarea se scrie in text, trece fidelity-check-ul, ajunge in binar ca text — dar VFP nu o materializeaza pe obiect:PEMSTATUS(o,'nume',5)da.F.si orice acces cade cu eroarea 1734 „Property ... is not found". Regula era documentata doar pentru metode (*m:,flux-editare-vfp-text.md:76-78); se aplica identic proprietatilor. Dovedita in ambele sensuri pe o clasa de proba izolata (cu*p:->.T., fara ->.F.), deci fluxul text->binar poate crea proprietati noi, contrar ipotezei initiale. - FoxBin2Prg sorteaza alfabetic cu
_DUPA literele obisnuite, nu in ordine ASCII. O ordine „ASCII corecta" scrisa de mana pica fidelity-check-ul; ordinea canonica se citeste din<staging>\verify\. - FoxBin2Prg NU pastreaza ordinea textuala la roundtrip pentru
ADD OBJECTmultiple si proprietati custom — le regenereaza in ordine proprie (nici macar alfabetica peste tot). Deci orice ordine „naturala" scrisa de mana poate pica fidelity-check-ul. Procedura: dupa primul FAIL, adopta ca sursa textul regenerat din<staging>\verify\*.vc2, nu incerca sa ghicesti ordinea. InputMaskcu literal se ghilimeleaza ("9.99", nu9.99) — altfel VFP il ia numeric. Fidelity-check-ul nu semnaleaza asta separat.