Squash al branch-ului de lucru plan13-s2. Cod: clasa noua ofacturare_util (geometrie si utilitare de formular), inrolata in roafacturare.prg; meniul "Facturare (nou)" plat, cu reparatia literalului peste limita VFP de 255 de caractere care impiedica compilarea metodei. Livrare: changelog 2.11.19, marcajul de versiune DB pentru scripturile finale din SCRIPTURI_CLAR\2026\09, inventarul livrarii in docs/livrare_13.md si registrul de erori deschise. Documentatia de lucru a etapei (cercetare, rapoarte, handoff-uri, snapshot-uri de scripturi si backup-uri de rollback) a fost scoasa din arbore. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
187 KiB
Progres implementare — ROAFACTURARE, punctele 6, 7, 8, 13 (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: 21.08.2026.
RUNDA 21.08.2026 — #13 S2 implementata si comisa pe branch. Cerere Marius, aprobata azi: fara teste manuale, commit pe branch, continuare in alta sesiune.
Ce s-a schimbat:
COMUN\programe\ofacturare.prg— procedura duplicatafactureaza2(fork mort din 2017, zero utilizatori reali) a fost stearsa; alegerea formularului se face acum infactureaza, dupa flagulPrivate plFacturareNoua.Clase\ofundal_facturare.vc2— butoane noiPage2.Cw10„Facturare (nou)" (4 optiuni: lista de preturi, contract, comanda, aviz) siPage3.Cw5„Avize (nou)" (4 optiuni), ambele seteazaplFacturareNouasi deschidfrm_facturare_articole2.Decizia 67 (Marius, 20.08.2026): intrare separata in meniu, nu comutator/dialog; ambele cai facturare vechi si noua raman accesibile simultan. Perimetru: vanzarile din stoc (
Cw5..Cw9->initializeaza_vanzare_din_stoc) nu trec prinfactureaza— raman in afara #13.NETESTAT MANUAL — decizia explicita a lui Marius, 21.08.2026. Ramane datorie de verificat cel tarziu la S6 (test pe flux real, planificat dupa S5).
Commis pe branch
plan13-s2in ambele repo-uri (ROAFACTURARE + COMUN), fara SVN — SVN ramane neatins pana la aprobarea finala si testele manuale. Detalii si hash-uri:docs\handoff_13_s2.md.Urmatoarea story: S3 — portarea logicii de antet in formularul unificat.
Capcana platita: FoxBin2Prg ordoneaza obiectele si metodele ASCII-lexicografic, nu numeric —
Cw10cade intreCw1siCw2in textul.vc2, nu dupaCw9. De verificat cuvfp_symbols.ps1inainte de orice cautare pe pozitie in fisier.
RUNDA 19.08.2026 — butoanele de linie trec pe butoanele laterale ale grid-ului de articole. Cerere Marius, executata si testata; fara commit.
Eroarea raportata (
gnButon este redefinit ilegalla „Adauga articol") avea cauza in douaPUBLIC gnButondinomodificari.vc2(cmdAdaugaArticol.ClicksiAfiseazaDialogSincronizareArticole):gnButone declarat PRIVATE la nivelul aplicatiei (Programe\roafacturare.prg:400), iar restul codebase-ului doar il atribuie. Ambele declaratii au fost sterse.Ce s-a schimbat: butoanele late „Adauga articol" / „Sterge / Restaureaza linie" au disparut de pe pagina; comenzile stau acum pe coloana de butoane din dreapta grid-ului — but_nouR (nou, clasa
but_nou,caction = do_adauga_rul),but_copiazaR(duplica linia),but_modificaR(nomenclatorul coloanei curente: articol, gestiune, valuta, cod TVA) sibut_stergeR(comutasters). Toate dispecerizeaza dupapgfArticole.ActivePage = 3. „Sincronizeaza cu rulaje..." a ramas pe pagina, mutat la stanga (Anchor = 0) si evidentiat (fundal galben pal, text bold violet).Logica noua sta in
.prg, nu in binar — clasaArticoleNotaEditordinCOMUN\programe\ofacturare_editare.prg(AdaugaLinie,ComutaSters,DuplicaLinie,ModificaNomenclator,AreNomenclator,Editabil); metodele din.vc2sunt apeluri de 3-4 linii. Preferinta lui Marius, scrisa acum si inCOMUN\docs\reguli_lucru.md, punctul 3.Capcana platita:
Createobject('X', p).Metoda()nu e sintaxa valida in VFP — da „Syntax error" la rulare, prins detest_efactura_readonly. Se trece prin variabila.Defect latent reparat in trecere:
AdaugaLinieTvdDinArticolsicalculeaza_valori_articolerau metode de clasa fara intrare*m:in*<DefinedPropArrayMethod>— mergeau, dar prima salvare din IDE le-ar fi aruncat tacit. Intrarile au fost adaugate.Teste:
test_butoane_laterale_articole(suita noua) 33/0,test_efactura_readonly21/0,test_s4b_dialog35/0,test_s4b_sincronizare42/0,test_adauga_linie_articol20/0,test_ui_sterge_linie8/0,test_ui_culoare_contrast1/0,test_ui_efactura_readonly13/0,test_page3_articole14/2 (cele 2 = artefactul cunoscut de grid nematerializat headless, la baseline). Cele patru suite care tinteau butoanele sterse au fost mutate pe butoanele laterale.Stare:
omodificari.vc2are write-back-ul facut (fidelity-check trecut de trei ori); cens de octeti >0x7F identic cu baseline-ul (2xaa, 2xe3, 2xfe), zero LF izolati. Patch de review:docs\diff_runda_butoane_laterale_articole.patch. Backup-uri:COMUN\clase\omodificari.pre_runda_butoane.bak.vc2,COMUN\programe\ofacturare_editare.prg.pre_runda_butoane.bak. Niciun commit, in niciun repo. Changelog neatins deliberat: 2.11.15 n-a ajuns la utilizatori, iar intrarea existenta descrie deja functionalitatea finala.Ramas deschis:
AdaugaLinieTvdDinArticolsicalculeaza_valori_articolsunt inca logica in binar — de mutat inArticoleNotaEditorla o runda viitoare (rup testele care le apeleaza direct, deci nu s-a facut acum). Pe formularul maximizat, bara de totaluri se suprapune peste randurile 3-4 ale grid-ului de articole (grid ancorat 15, totalurile nu) — preexistent, nu s-a atins.
Punctul #6 e terminat pe partea care se poate face fara Marius: S1-S9 sunt gata, inclusiv S8. Ce ramane cere aplicatia pornita, IDE-ul sau o decizie — nu mai e lucru de delegat unui agent.
PREDARE, 13.08.2026. Sesiunea a inchis trei lucruri si a deschis zero. S8 — matricea era deja rulata, „cele doua esecuri" erau o stare pierduta la o curatenie; aserttia prea larga s-a restrans. Asimetria de garda — acceptata, fara atingere de cod. Validarea de cantitate — negativul (retur, storno, discount) nu mai e respins, iar blocul S4b nu mai deschide un modal pe document gol. Regresia: 10/10 suite headless la baseline.
Nimic nu e intr-o stare periculoasa.
omodificari.vc2are write-back-ul facut si verificat pe binar (nu pe mtime); zero procesevfp9.exe; pe Oracle numaiSELECTsubREAD ONLYcuROLLBACK; niciun commit in niciun repo. Documente de test consumate in acest bloc: niciunul — matricea S8 nu a fost rerulata, deliberat.Prima sarcina a sesiunii urmatoare: nu incepe cod nou. Citeste punctele 1-6 din lista de mai jos — toate cer aplicatia, IDE-ul sau o decizie a lui Marius. Nu redeschide asimetria de garda si nu reinvestiga S8: ambele sunt inchise mai jos, cu motivele scrise.
Fire in paralel: alta sesiune lucreaza pe #13 (
docs\handoff_13_formular_unificat.md,mockup_13_formular_unificat.html,plan_13_*.md— apar modificate ingit status). Nu le atinge.
PREDAREA CURENTA e chiar acest fisier. Handoff-urile intermediare intre sesiuni au fost
desfiintate (11.08.2026, decizia lui Marius) impreuna cu diff-urile deja aplicate; ce era durabil in
ele a intrat in antetele fisierelor de test sau in mesajele de commit. Nu mai cauta handoff_*.md.
De facut, in ordine:
- Stergerea celor sase documente parazite (
1051,1056,1057,1058,1059,1060) prin aplicatie — ramasa din blocul de creare documente pentru S8. S8 — doua esecuri reale.INFIRMAT pe 12.08.2026. S8 e gata, n-a fost niciodata un esec — vezi sectiunea „S8 INCHIS" de mai jos. Nu relua investigatia.- Rebuild
roafacturare.exedin IDE si verificarea pe ecran, pe1140895/1140921— ambele continIV93900901(id_articol = 3598545102), adica exact cazul corectat pe 11.08. - Punctul B din
docs\rec_s4b_etapa2.md— CONFIRMAT 12.08.2026, ramane cum e. Punctul A s-a transformat intr-o intrebare mai mare, despre validarea de cantitate — vezi sectiunea de mai jos. Deschis. git pushnefacut in ambele repo-uri (remoteromfast) — decizia lui Marius.- Necomis din 12-13.08.2026, asteapta review. In
COMUN:clase\omodificari.vc2— validarea de cantitate (:14386) si garda pe blocul S4b (:14438), write-back facut si verificat pe binar, diffdocs\diff_cantitate_negativa_garda_s4b.patch; plus aserttia relaxata dinutile\Teste\editare_factura\test_s8_matrice_surse.prg, diffdocs\diff_s8_aserttie_rulaje.patch. InROAFACTURARE:docs\cercetare\rec_s8_matrice.md(recuperat dinfc9c378, fusese sters din greseala),rec_s8_rulaje_tip4.md,rec_cantitate_negativa_date.md,rec_regresie_cantitate.md. Backup-uri de revenire, de sters la curatenie:omodificari.pre_cantitate.bak.vc2siomodificari.pre_garda.bak.vc2. Changelog: nefacut — de decis daca schimbarea de cantitate intra in2.11.15(nu e inca in productie, deci:modificare:, nu:eroare:).
Comis pe ramura punct6-s4-runda3, 11.08.2026: COMUN 40a112a (S4b etapa 2 — butonul,
dialogul frm_sincronizare_articole, id_articol de la I la N(20) in toate cele 6 locuri, si
doua This. -> Thisform. care faceau butonul „Adauga articol" sa dea eroare la orice click real) si
93a2718 (harnessul S8 intra in versionare); ROAFACTURARE 40933df (changelog 2.11.15) si
d9f5ca4 (docs\ intra in git). In SVN: r18011 si r18012.
Cifre de test, citite din log, nu din rapoarte: test_s4b_sincronizare 42/0 (include cazul de
regresie id_articol = 3598545102, dovedit cu control negativ — cu campul I iese perechea
Adaugare+Semnalare in loc de Modificare), test_s4b_dialog 35/0, test_s7_rotunjire 6/0,
test_s8_matrice_surse pe cele patru felii 44/0, 44/0, 26/1, 42/2 (vezi „S8 INCHIS" — cele 3 FAIL
sunt asteptate si explicate, nu defecte).
Doua capcane de mediu platite pe 11.08, valabile pentru orice sesiune viitoare:
.FXPvechi.vfp9.exe -A -T test.prgpoate executa bytecode vechi si „reusi" degeaba — o rulare a reprodus identic logul dinainte de o editare deja scrisa pe disc. Sterge.FXP-ul suitei ca parte din comanda de rulare.SET PROCEDURE TO ...prg ADDITIVErecompileaza corect, deci suspiciunea priveste.FXP-ul suitei, nu al modulelor.GETFONT(). Un formular instantiat headless faragoAppajunge in_frmbase.InitlagoApp.ReadIni; eroarea e doar logata, parametrul cade pe.F.siaccessibilitydeschide un dialog modal care atarna procesul si apare pe ecranul lui Marius. Fixul e in harness (PUBLIC goApp, gcAcces+Createobject("wzApplication")), nu in_frm_base.vc2— clasa e partajata de toata suita, iar in productiegoAppexista mereu. Ruleaza mereu cu garda de timp.
Documentatia, dupa curatenia din 11.08.2026: docs\ e acum versionat in git si SVN — era in
afara oricarui control de versiuni. In docs\cercetare\ au ramas 91 de rapoarte: sunt baza de
dovezi a planului #13 (85 de trimiteri din plan_13), nu le sterge. Alte 14 cercetari
trans-proiect au trecut in COMUN\docs\cercetare\ (valuta si curs, TVA/VANZARI, consumatorii
VANZARI in suita, integrarile #10/#11/#12, watchdog VFP, proiectarea Oracle a lui S5, view-ul
VVANZARI_ARTICOLE), iar 20 de rapoarte de executie ale lui #6 au fost sterse.
Starea la incheierea sesiunii din 13.08.2026 — verificat, nu presupus: zero procese vfp9.exe;
pe Oracle numai SELECT sub SET TRANSACTION READ ONLY incheiat cu ROLLBACK, zero tranzactii
deschise; omodificari.vc2 e singurul fisier de cod de productie atins, si are write-back-ul facut
si dovedit pe binar (condiitile noi apar in omodificari.VCT, cele vechi zero) — deci niciun binar
in urma textului; niciun commit in niciunul din cele doua repo-uri.
De verificat pe ecran de Marius (netestabil headless): mesajul „are cantitatea 0" pe o linie cu cantitate 0, si salvarea reusita a unei facturi reale cu linie de retur (cantitate negativa).
DESCHIS — validarea de cantitate din inainte_de_do_termin respinge returul si storno-ul?
Ridicata de Marius, 12.08.2026, ca observatie la punctul A din rec_s4b_etapa2.md: „pot exista
articole cu cantitate negativa (retur, storno) sau cu pret 0".
Ce spune codul, verificat la sursa (frm_modific2024.inainte_de_do_termin,
COMUN\clase\omodificari.vc2:14331-14599, blocul de validari :14378-14430):
| Ancora | Verifica | Efect |
|---|---|---|
:14386 |
Nvl(cantitate,0) <= 0 |
BLOCHEAZA — „are cantitatea 0 sau negativa" |
:14394 |
Isnull(pret) |
blocheaza doar NULL, nu si 0 |
:14402 |
Nvl(id_articol,0) = 0 |
blocheaza |
:14410 |
linie noua cu pret_achizitie = 0 |
doar confirmare |
Pretul 0 nu e o problema — :14394 testeaza Isnull, deci 0 trece. (E si ramura moarta
cunoscuta: tvd.pret vine NOT NULL din view.) Cantitatea negativa insa cade pe :14386, si nu
doar dupa „Aplica" din dialogul S4b — pe calea normala de salvare, la orice editare a unui
document cu articole de vanzari.
Consecinta asupra punctului A: plasa de siguranta propusa initial (reluarea validarilor blocante
dupa „Aplica") nu se mai face. Din cele trei, Isnull(pret) e ramura moarta si id_articol vine
mereu completat din sursa, deci singura care ar fi putut pica e chiar cea de cantitate — a carei
premisa e sub semnul intrebarii. O plasa din doua verificari care nu pot pica ar fi cod fara efect.
REZOLVAT — decizia lui Marius, 12.08.2026: se permite negativul, 0 ramane blocat. Aplicat pe
omodificari.vc2:14386-14387: conditia Nvl(cantitate,0) <= 0 a devenit = 0, mesajul „are
cantitatea 0 sau negativa" a devenit „are cantitatea 0". O singura linie de logica, plus mesajul.
Datele care au sustinut decizia (docs\cercetare\rec_cantitate_negativa_date.md, Oracle
read-only): 65 de linii active cu cantitate < 0 pe 52 de documente — grosul pe tipurile -6
(25 linii / 24 doc) si 41 (4/4), adica retur-transfer, dar si pe tip 3 (comanda) 10 linii pe 4
documente, care sunt linii DISCOUNT cu cantitate negativa, cea mai recenta din 26.03.2026. Deci
negativul e si mecanismul de discount pe linie, nu doar retur/storno. pret = 0: 19 linii pe 17
documente, toate cu articol — trec deja, :14394 testeaza Isnull(pret), nu = 0; iar
pret IS NULL da 0 linii, ceea ce reconfirma ramura moarta.
Write-back FACUT si verificat pe binar, nu pe mtime: txt2vcx.ps1 a dat P1,E0,S1,X0 cu fidelity
check OK; in omodificari.VCT conditia noua si mesajul nou apar o data, iar cele vechi zero.
Editarea s-a facut pe octeti (perl, binmode), nu cu tool-ul Edit — cens >0x7F identic
inainte si dupa (2 aa / 2 e3 / 2 fe), zero EF BF BD, diff exact 2 linii. Backup:
COMUN\clase\omodificari.pre_cantitate.bak.vc2.
DESCOPERIT LA REGRESIE — S4B FACE
test_s5_validari_articoleSA ATARNE HEADLESSNu e cauzat de schimbarea de mai sus — dovedit din cod, nu presupus. Suita se opreste la cazul A5 (
test_s5_validari_articole.prg:186-194), care faceREPLACE ALL sters WITH 1 IN tvd: cu toate liniile sterse,SCAN FOR Nvl(sters,0) <> 1are zero iteratii, deci verificarea de cantitate nici nu e atinsa. Lantul real:lnLiniiActive = 0-> confirmarea „toate liniile au fost sterse" -> mock-ul raspunde Da ->llRetramane.T.-> intra in blocul S4b (omodificari.vc2:14438) -> cu toate liniile sterse fiecare articol-sursa ieseAdaugare, decilnDivergente > 0->AfiseazaDialogSincronizareArticole(), formular modal -> headless, atarna. Cazurile A2/A3/A4 trec pentru ca dauRETURN .F.inainte de:14438; cazul de control A1 ajunge acolo dar n-are divergente.De ce abia acum: suita a rulat ultima oara 10.08 22:13, iar S4b etapa 2 a intrat 11.08 09:34, si
rec_s4b_etapa2.mddeclara explicit „Netestat: nimic nu a fost rulat".Cifre partiale ale rularii intrerupte (12.08 21:36): 8 aserttii, toate PASS, inclusiv
cantitate<=0 -> blocheaza— testul folosesteREPLACE cantitate WITH 0(:130), deci schimbarea de azi ii pastreaza comportamentul. Plus linia documentara „FAIL asteptat" despreIsnull(pret), care nu e o aserttie picata. Procesul a fost oprit de garda de timp; zero procesevfp9.exedupa.REZOLVAT — decizia lui Marius, 12.08.2026: varianta (a), garda in cod. Conditia de la
omodificari.vc2:14438a primitAND Used('tvd') AND m.lnLiniiActive > 0, plus o linie de comentariu care explica ramura.Used('tvd')sta inaintea luilnLiniiActiveintentionat: VFP scurtcircuiteazaAND, deci variabila (declarata in bloculIF ... Used('tvd')de la:14378) nu se evalueaza cand blocul acela n-a rulat.Write-back facut si verificat pe binar:
P1,E0,S1,X0, fidelityOK; garda apare o data inomodificari.VCT, conditia veche fara garda zero. Editare pe octeti, cens>0x7Fneschimbat (2 aa / 2 e3 / 2 fe), zeroEF BF BD. Backup:omodificari.pre_garda.bak.vc2.Efectul, masurat:
test_s5_validari_articoletrece iar integral — 35 PASS / 0 FAIL, exit 0 (log proaspat, 13.08 02:43). Inainte de garda atarna la cazul A5 dupa 8 aserttii.
DOUA CAPCANE DE MEDIU NOI, platite pe 12-13.08 — de stiut inainte de orice rulare de regresie
1. Lansarile consecutive de
vfp9.exeatarna. Doua suite rulate una dupa alta in aceeasi buclafor/ aceeasi comanda: a doua atarna la pornire, inainte sa scrie orice in log. Aceleasi suite, rulate cate una per comanda, merg. Se ruleaza o suita per apel, cu omorarea proceselor ramase intre ele.2. Logul stat da cifre plauzibile si false. Fiecare suita isi rescrie logul la pornire (ex.
test_page3_articole.prg:24, inaintea conectarii Oracle de la:30). Daca rularea atarna inainte, logul ramane cel vechi. Combinat cu capcana 1, doua suite au raportat20 PASS / 0 FAILsi16 PASS / 0 FAILdin 10.08, la trei zile distanta, cuexit=124. Verifica mereu mtime-ul logului fata de ceasul curent inainte sa citesti o cifra.3. Numararea (reconfirmare a capcanei vechi):
grep -c "^PASS"subnumara — unele linii auPASSla mijloc. Petest_page3_articolea dat10/0in loc de14/2. Se numara cugrep -o "PASS" <log> | wc -l, iar unde exista liniaREZULTATaia e autoritara.
REGRESIA E LA BASELINE PE TOATE CELE 10 SUITE HEADLESS, 13.08.2026 02:43-03:07. Cifrele au fost recitite de orchestrator direct din loguri, dupa ce a verificat mtime-ul fiecaruia fata de ceasul curent — nu preluate din raportul agentului:
| suita | obtinut | baseline |
|---|---|---|
test_s5_validari_articole |
35 / 0 | 35 / 0 |
test_page3_articole |
14 / 2 | 14 / 2 |
test_adauga_linie_articol |
20 / 0 | 20 / 0 |
test_adauga_linie_valuta |
16 / 0 | 16 / 0 |
test_verdict_act_rul |
26 / 0 | 26 / 0 |
test_incarca_vanzare_din_nota |
5 / 0 | 5 / 0 |
test_efactura_readonly |
23 / 0 | 23 / 0 |
test_s4b_sincronizare |
42 / 0 | 42 / 0 |
test_s4b_dialog |
35 / 0 | 35 / 0 |
test_s7_rotunjire |
6 / 0 | 6 / 0 |
Singurul log cu linie EROARE e test_page3_articole: EROARE 1925 [VERIFICA_EDITARE_GRID:366] Unknown member COLUMN5 — artefactul headless cunoscut (sub -A -T coloanele de grid nu se
materializeaza), care produce chiar cele 2 FAIL din baseline. Nu e regresie.
Nerulate deliberat: suitele test_ui_* (cer formular vizibil pe un ecran partajat, iar schimbarile
nu ating ce verifica ele) si test_s8_matrice_surse (ar consuma documente de test ireversibil).
Diff consolidat pentru review: docs\diff_cantitate_negativa_garda_s4b.patch — 4 randuri schimbate
in omodificari.vc2 (2 de logica, 2 de comentariu).
S8 INCHIS — 12.08.2026. Matricea era rulata integral; „cele doua esecuri" erau o stare pierduta
Matricea S8 a fost rulata pe toate cele patru documente, fiecare de doua ori, din ambele puncte de
intrare, inca din 10.08.2026. Cifrele, din log, felie cu felie: 1048 (lista de preturi) 44/0,
1055 (factura din contract) 44/0, 1052 (aviz) 26/1, 1054 (factura din aviz) 42/2.
Cele 8 verificari cerute de plan_06_editare_factura.md:286-288 au verdict explicit in raport.
Cele 3 FAIL sunt asteptate, niciunul nu e defect:
1052— gardaReferinteDocumenteNotaa blocat corect intrarea ROAFACTURARE: avizul are deja o factura emisa din el (ACT.id_factc = 8009677pe nota lui1054). Testul presupusese, mostenit din modelul S5, ca orice document e editabil.1054, de doua ori —Reccount(trul)=0. Documentul n-avea rulaje nici inainte de editare, deci aserttia cerea ca editarea sa creeze rulaje care n-au existat.
De ce RUL=0 e corect pe tip 4 — stabilit din cod, nu din tipar de date (rec_s8_rulaje_tip4.md):
RUL retine exclusiv miscari pe cont de stoc. Avizul (tip 22) scoate marfa din gestiune si scrie
rulajele — pe 1052, 4 randuri, toate pe contul 371. Factura emisa din aviz nu mai atinge 371:
transforma doar creanta provizorie in creanta ferma si TVA neexigibila in TVA colectata (ACT pe
1054: 4111/418 si 4428/4428, niciun 371). N-are, structural, ce rand de stoc sa scrie.
Editarea doar conserva ce exista — trul se incarca din vrul_tot (ofacturare_editare.prg:76)
si se scrie inapoi neconditionat (ofacturare_comun.vc2:3821, OSCRIE_IN_FISIERE(0,.T.,.T.)).
Verdictul ACT/RUL are trei stari, toate informative (omodificari.vc2:13129-13139); „nu se aplica"
e rezervat lui tip=51, deci tip 4 cade legitim in „divergent (informativ, nu e eroare)".
Cele trei ancore sunt verificate la sursa de sesiunea principala, nu preluate din raport.
Aserttia a fost restransa la ce voia de fapt sa apere — ca editarea nu pierde rulaje:
test_s8_matrice_surse.prg:313-314, Reccount(trul) pe nota noua >= cat era inainte, cu linia de
baza dusa prin tnNrRulBaseline de la ambele puncte de intrare. Rulare de compilare cu lista de cazuri
goala: 0 PASS / 0 FAIL, exit 0, fara EROARE, zero documente consumate.
Rularea completa pe date NU se face — decizia lui Marius, 12.08.2026. Ar consuma inca 8 generatii
de cod pe cele patru documente, pentru un rezultat previzibil: relaxarea e stricta (>= linia de baza in loc de > 0), deci muta 1054 de la 42/2 la 44/0 si lasa 1048/1052/1055 neschimbate.
Deci logul de pe disc ramane cel al rularii de compilare, nu al matricei — cifrele matricei se
citesc din rec_s8_matrice.md, iar felia 1054 asa cum a rulat inainte de relaxare e pastrata in
COMUN\utile\Teste\editare_factura\test_s8_matrice_surse_log.1054.txt.
Cum s-a pierdut starea, ca sa nu se repete. Commit-ul
b5a7108(curatenia din 11.08) a stersdocs\cercetare\rec_s8_matrice.md— incadrat drept „raport de executie al lui #6, nereferit de nimic viu", desi e referit dintest_s8_matrice_surse.prg— si in acelasi commit a scris inprogres.mdstarea dedusa dintest_s8_matrice_surse_log.txt. Dar logul se rescrie la fiecare rulare, deci pastra doar ultima felie (1054): de acolo au aparut „cele doua esecuri reale" si „trei tipuri de sursa sarite". Raportul e recuperat pe disc dinfc9c378. Aceeasi curatenie a sters simockup_v7/v8_modificari.md, care erau ale lui #13, nu ale lui #6.Regula: un log care se rescrie nu e sursa de stare. Starea sta in raport; daca raportul dispare, starea dispare cu el. Inainte de a sterge un raport, cauta-i numele in
COMUN\utile\Teste\si indocs\, nu doar inplan_*.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.
Matricea propriu-zisa e RULATA — 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. Cifre si verdict: sectiunea „S8 INCHIS" de mai sus; detaliile pe
document, in docs\cercetare\rec_s8_matrice.md. Documentele sunt consumate (coduri realocate,
note vechi sterse ireversibil): 1048 -> 1140918, 1052 -> 1140921, 1054 -> 1140923,
1055 -> 1140920.
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: diff aplicat (sters). 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. Reconfirmat pe 12.08.2026 cu
vfp_symbols.ps1 -Where: in tot comun.vc2 functia apare o singura data, la :2620, deci
do_modifica (2222-2572) n-o are deloc.
INCHISA — decizia lui Marius, 12.08.2026: asimetria se accepta, nu se repara. Nu se atinge nici
comun.vc2, nici omodificari.vc2. Motivele care sustin decizia:
- jumatatea eFactura nu se putea dubla oricum — decizia 42 spune explicit ca notele si rulajul se modifica doar din ROACONT, deci o garda eFactura pe calea din jurnal ar fi anulat chiar decizia 42;
- absenta lui
ReferinteDocumenteNotadindo_modificae voita, nu o scapare: garda protejeaza incasarile legate deid_factla stergerea notei, unde legatura chiar se rupe; la modificare, legatura structurala trece prinid_fact/id_vanzare, niciodata princod(S6, inchis), deci realocareacod-ului nu o strica; comun.vc2serveste orice tip de nota din toate cele trei aplicatii — o garda acolo ar fi blocat editarea oricarei note cu referinte de incasari, mult peste cazul semnalat.
Ce ramane adevarat si de stiut: pe calea din registrul jurnal nimic nu opreste editarea unui
document-sursa care are deja o factura emisa din el (dovedit pe 1052 in S8, unde intrarea
ROAFACTURARE a blocat si cea din ROACONT a scris pana la COMMIT). Pe reeditare fara modificari de
continut e inofensiv; o modificare reala de continut pe un asemenea document nu e oprita de nimic.
Acceptat ca atare.
#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: diff aplicat (sters). 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 handoff intermediar (sters) — 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 in handoff intermediar (sters). 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, in handoff intermediar (sters). - 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, diff aplicat (sters)): 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 in handoff intermediar (sters);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 handoff intermediar (sters).
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: diff aplicat (sters) + diff aplicat (sters) +
diff aplicat (sters). 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:
diff aplicat (sters) + diff aplicat (sters).
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: diff aplicat (sters) + diff aplicat (sters).
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 handoff intermediar (sters)).
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: diff aplicat (sters) +
diff aplicat (sters).
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:
diff aplicat (sters) (+ diff aplicat (sters)).
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:
diff aplicat (sters) (+ diff aplicat (sters), 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 handoff intermediar (sters). 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: diff aplicat (sters). 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 diff aplicat (sters). 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: diff aplicat (sters) + diff aplicat (sters) (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 (diff aplicat (sters)):
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 (diff aplicat (sters), 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:
diff aplicat (sters) (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: diff aplicat (sters). 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:COMUN\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 handoff intermediar (sters) 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: diff aplicat (sters). 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: diff aplicat (sters).
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
handoff intermediar (sters) (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: diff aplicat (sters) (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:
diff aplicat (sters), diff aplicat (sters),
docs\raport_sweep_encoding.md, diff aplicat (sters),
diff aplicat (sters).
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: handoff intermediar (sters). 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: diff aplicat (sters).
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
COMUN\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.COMUN\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:COMUN\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: diff aplicat (sters). 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 (handoff intermediar (sters), 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 aplicat (sters) | 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) |
COMUN\docs\cercetare\rec_view_articole_vanzare.md |
proiectarea VVANZARI_ARTICOLE + ce s-a respins |
COMUN\docs\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" |
COMUN\docs\cercetare\rec_watchdog_vfp.md, handoff intermediar (sters) |
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 aplicat (sters) | 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 |
COMUN\docs\cercetare\rec_tva_vanzari.md, rec_pret_lazy.md |
#7 (fond) si #12 |
COMUN\docs\cercetare\rec_integrari.md |
#10, #11, #12 |
COMUN\docs\cercetare\rec_consumatori_vanzari.md |
inventarul celor ~16 cai xmlefactura (datoria 5) |
COMUN\docs\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 intermediar (sters) | contractul frm_articol_factura/poArticol/poDate/gnScadereStoc pentru adaugarea de linii (neinceputa) |
| diff aplicat (sters) | diff-ul stergerii de linii |
COMUN\docs\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.
Runda 6 - 20.08.2026: grid Articole (nomenclatoare, zecimale, aspect), meniu, punctul 6
Livrat si aplicat, cu write-back facut si verificat prin reconversie independenta (0 linii diferenta pe ambele fisiere):
COMUN\clase\omodificari.vc2— cinci metodeDblClicknoi pe coloanele cu nomenclator (:16706,:16729,:16747,:16829,:16846);cPretArt(:12391) sicPretCuTvaArt(:12408) trec peget_mask(12,gnPPretV),cPretAchizitieArt(:12400) ramane pegnPPRET; cele cinci coloane cu nomenclator trec pe verde160,255,205(Text1.ReadOnlyramane.T.);cSerieArt/cLotArt/cExplicatieArttrec pe alb255,255,255+Text1.ReadOnly = .F.COMUN\clase\ofacturare_comun.vc2:4930— optiunea dinxmenudevineEditare \<factura (note, rulaje, articole)
Ce s-a stabilit, ca sa nu se rediscute:
cExplicatieTvaArtareControlSourceexpresie (omodificari.vc2:12467), nu camp. Intr-un grid VFP tastarea intr-o celula read-only declanseaza cautarea incrementala pe campul legat; fara camp nu are pe ce face seek, deciInteractiveChangenu porneste niciodata acolo.DblClickse sprijina peThisform.pccontrol(pus explicit inGotFocus,:16722-16726) si de aceea acopera uniform toate cele cinci coloane.gnPPret= precizie pret achizitie,gnPPretV= precizie pret vanzare (oinit_optiuni.prg:515). Model:ofacturare.vc2:3490vs:3497. Scrierea in Oracle a luiVANZARI_DETALII.PRETfolosestegnPPretV(ofacturare_stoc.prg:367).- Conventia de culoare (de pe pagina Rulaje a aceluiasi formular): alb = se tasteaza direct,
verde
160,255,205= se editeaza prin dialog, gri225,225,225= nu se editeaza. - Inainte de runda 6, serie/lot/explicatie nu erau editabile pe nicio cale: garda
.Whenfusese relaxata in runda 5, darText1.ReadOnlyramasese.T., iarbut_modificaRse activeaza doar pe coloanele cuGotFocus(:16678-16682). - NU schimba
Text1.ReadOnlype cele cinci coloane cu nomenclator: calea de tastare merge tocmai fiindca sunt.T..
Punctul 6 - explicatie TVA in butonul de modificare din frm_facturi
Decizia finala a lui Marius: fara recalcul, lista filtrata pe cota salvata a liniei, iar
taxcode se sincronizeaza dupa explicatia aleasa. Varianta cu recalcul a fost propusa, aleasa
initial, apoi respinsa — nu se reintroduce.
- Script scris, NERULAT pe schema
MARIUSM_AUTO(ROA_CENTRAL):D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08\ff_2026_08_20_02_COMUN_PACK_FACTURARE.sql - Proiectarea completa:
docs\propunere_runda6_punct6_plsql.md UPDATE-ul scrie exact trei coloane:EXPLICATIE,TAXCODE,ID_JTVA_COLOANA.PROC_TVAVnu se atinge, totalurile nu se recalculeaza.- Garda de neutralitate e in PL/SQL:
FACT-029daca cota explicatiei difera de a liniei, plusFACT-026(linie inexistenta),FACT-027(explicatie inexistenta/fara cota),FACT-028(cota liniei NULL, verificata separat, inainte de comparatie). - Semantica verificata pe date:
PROC_TVAVe multiplicator (1.19, 1.09...),COTA_TVAe procent (19, 9...), deci comparatia e(COTA_TVA+100)/100. Cele 8 cote folosite azi pe linii active au toate explicatie corespunzatoare — cazul "lista goala" e teoretic. - Partea VFP nu a pornit. Ce trebuie scris: sectiunea "Ce ramane de facut in VFP" din propunere.
taxcodese deriva in VFP prinGetTaxCodeIdPartsi se trimite prin parametrul existentV_TAXCODE— verificat ca lantul ei e inregistrat neconditionat in toate trei produsele (roafacturare.prg:187,189,roacont.prg:277,279,roagest.prg:239,241), spre deosebire deofacturare_editare.prg, pe care doar ROAFACTURARE il inregistreaza. ff_2026_08_20_01(gardaFACT-025, runda 5) e deja aplicat peMARIUSM_AUTO; scriptul 02 il contine. Nu se re-aplica 01 — ar sterge punctul 6.
Ramase: partea VFP a punctului 6 si intrarea de changelog pentru runda 6 (nu exista inca).
Corectie 20.08.2026, seara — doua puncte din lista de mai sus erau deja facute:
- Proba pe ecran a punctelor 1-5: facuta de Marius.
- Scriptul
ff_2026_08_20_02_COMUN_PACK_FACTURARE.sqlera deja aplicat pe schemaMARIUSM_AUTOde peROA_CENTRAL, contrar notei de mai sus ("NERULAT"). Dovezi, nu mtime:VERSIUNEare randul20.08.2026 / seq 2 / COMUN_PACK_FACTURARE;ALL_OBJECTSda PACKAGE si PACKAGE BODY VALID,last_ddl_time20.08.2026 13:56:38; iar sursa vie dinALL_SOURCE(spec + body, normalizata: faraCREATE OR REPLACE, fara/, fara antetul de comentariu si faraexec/commit) e identica cu fisierul de pe disc — 0 linii diferenta pe 16 407. Deci in Oracle sta varianta finala (fara recalcul), nu varianta respinsa, desi fisierul are mtime 15:45, ulterior compilarii de la 13:56. Concluzie de metoda: mtime-ul fisierului si nota "scriptul nu a fost rulat" din raportul de livrare nu sunt surse de stare pentru ce e in Oracle. Starea se citeste dinVERSIUNE+ALL_SOURCE, prin diff, inainte de a re-aplica ceva. - Ramane valabila interdictia: nu se re-aplica
ff_2026_08_20_01— ar sterge punctul 6.
Runda 6 punctul 6 + runda 7 (sincronizare) - 20.08.2026, seara
Starea completa, cu inventar pe fisier:linie, ce s-a stabilit si ce e in lucru:
docs\handoff_r6_r7_sincronizare.md. Pe scurt:
- Punctul 6 (explicatie TVA in
frm_facturi): TERMINAT, write-back verificat prin reconversie (0 linii diferenta, md5 identic), probat pe ecran de Marius de doua ori. Filtrul final al listei:id_jtva_coloana > 0 AND afisat > 0 AND jv = 1 AND cota_tva = <cota liniei>. Pe date (vjtva_coloane,MARIUSM_AUTO):afisat = 0sunt liniile de TVA,afisat = 1bazele,afisat = 2neimpozabilele;jv = 1tine afara explicatiile de achizitie, care altfel treceau de gardaFACT-029fiindca au aceeasi cota. - Runda 7, in lucru: sincronizarea articole-rulaje porneste doar din buton (se scoate
declansarea de la salvare,
omodificari.vc2:14484-14494), siAplicaModificareTrul(ofacturare_editare.prg:924) scrie sipretv/tvav, nu doarpretvtva. Perimetru fixat de Marius: doar preturi, nu sivaloarev/valtvav/valoarevcTVA- sincronizarea e intre cantitate si preturi. Ramane de raspuns, ca fapt, cine recalculeaza acele valori dupa sincronizare. - Nimic nu e comis - decizia lui Marius e un singur commit, dupa ce sunt gata toate trei.
roafacturare.PJT/.PJX/.exeapar modificate: zgomot din sesiunea lui de VFP, se lasa asa.
Runda 7 - terminata, 20.08.2026, 22:40
Raport complet: docs\raport_r7_sincronizare.md. Diff-ul commit-ului unic (runda 6 + runda 7):
docs\diff_r6_r7_pentru_commit.md.
- M1 gata: blocul de declansare de la salvare a disparut din
frm_modific2024.inainte_de_do_termin;AfiseazaDialogSincronizareArticoleare un singur apelant, butonul (omodificari.vc2:16665).SemnaturaDivergenteSincronizare+cSemnaturaSincronizareau ramas fara consumator - semnalate, nesterse. Write-back facut, dovedit prin reconversie: 0 linii diferenta, md5 identic. - M2 gata, in perimetrul corectat:
AplicaModificareTrulscriepretv,pretvtva,tvav. Cele trei campuri de valoare pe care le adaugase subagentul au fost scoase. - Teste:
test_s4b_sincronizare44/0,test_s4b_dialog35/0. Prima rulare a dat 40/2, din fixture, nu din cod: harness-ul nu defineagnPPretV, iar cursorultruldin test nu avea coloanelepretv/tvav(tabela realaRULle are). Adaugat si un caz cu TVA 19% real (C1 1600), fiindca toate cazurile existente aveauproc_tvav = 1sitvavieseau 0 orice s-ar fi scris. - Raspunsul la intrebarea de fapt: nu le recalculeaza nimeni. Lantul e verbatim de la cursor
pana in Oracle -
trul->RUL_TEMP(ofacturare_comun.vc2:3814, doarid_util/stersse suprascriu) ->sql_temp_insert->INSERT INTO RUL (<lista coloane>) SELECT ... FROM RUL_TEMP(PACK_CONTAFIN.pck:2013). NiciActualizeazaBaraTotaluri(insumeaza doartvd.valoare), nicifinalizeaza_modificare_notanu ating valorile. Interogat peMARIUSM_AUTO:VALOAREVsiVALTVAVsunt coloane inRULsi ajung invechite in baza;VALOAREVCTVAnu e coloana - exista doar in cursorul Fox, calculat la incarcare, deci ramane invechit doar pe ecran. Back-fill-ul de la reincarcare nu repara: are gardaWHERE EMPTY(NVL(...,0)), deci prinde doar zerourile. Raportat ca defect, nereparat - decide Marius. - Nimic nu e comis. Se asteapta aprobarea pe
docs\diff_r6_r7_pentru_commit.md.
Curatenie dupa inchiderea planului #6 - 20.08.2026
Planul #6 e inchis (SVN r18026, changelog 2.11.15). S-au sters 64 de fisiere de lucru care nu
mai au consumator: planul si proiectarea (plan_06_*), brief-urile, diff-urile, rapoartele,
propunerile de runda 4/5/6, rec_s4b_etapa2, review_s5_grid_articole, verificare_s5_writeback,
livrare_s5, diagnostic_pagina_articole_ux, raport_sweep_encoding, plus 40 de rec_* din
docs\cercetare\. A plecat si verificare_vfacturi.sql, testul de regresie al planului #8, terminat
demult. Totul e recuperabil din git (5b52cb3 si mai vechi).
Ce s-a pastrat, si de ce:
- planurile deschise sau amanate: #13 (proiectat integral, urmeaza la rand), #12, #11, #10, #7,
plan_index.md; - materialul lui #13:
handoff_13_formular_unificat.md,mockup_13_formular_unificat.html,S1_inventar_campuri_formular_unificat.md; conventii_mediu_oracle.md;- din
docs\cercetare\: toate cele 56 de fisiere non-rec_*si 7rec_*care sunt inca citate de cercetarile vii (rec_cale_vanzari_detalii,rec_d42_efactura,rec_datoria6_baza_regresie,rec_dec42_proiectare,rec_editare_factura,rec_s4_runda1,rec_s5_oracle_vanzari). Criteriul n-a fost numele, ci referintele: #13 se sprijina pedocs\cercetare\cu 86 de trimiteri, deci folderul nu se putea sterge in bloc.
Trimiterile catre fisierele sterse care raman in acest jurnal (39) si cele 5 mentiuni in proza din
plan_07, plan_13, handoff_s4_runda1, rec_s4_runda1 si rec_cale_vanzari_detalii sunt
istorice - se rezolva din git, ca la curatenia planului #8.
Completare: si planurile #7 si #8 - 20.08.2026
- #7 (pret cu TVA pe linie, terminat 08.08.2026, changelog 2.11.14): sters
plan_07_pret_cu_tva_pe_linie.md, singurul lui artefact ramas. - #8 (denormalizare VANZARI, terminat si comis 07.08.2026, r17990-r17993): nu mai era nimic
de sters. Planul plecase la curatenia anterioara, testul lui de regresie
(
verificare_vfacturi.sql) sirec_s8_*au plecat mai sus, in acelasi val.
Atentie la o capcana de nume: cercetare\s8_incarcare_document.md, s8b_rutarea_scrierii.md si
audit_vanzari_creare_modificare_stergere.md nu tin de planul #8 - sunt story-uri ale lui
#13 si sunt citate de plan_13 si de handoff-ul lui. Raman. Restul mentiunilor de
"denormalizare" din cercetare\ sunt trimiteri de context catre #8, in cercetari inca vii.
Total sters in aceasta curatenie: 65 de fisiere. In docs\ raman 10 fisiere plus
docs\cercetare\ cu 63.
Conventia mediului Oracle trece in COMUN - 20.08.2026
docs\conventii_mediu_oracle.md ajunsese in docs\ din inertia rundei 6, desi continutul e
transversal (instanta ROA_CENTRAL, schema comuna CONTAFIN_ORACLE, interdictia pe ACN, sirul de
conectare, SCRIPTURI_CLAR\). Mutat in COMUN\docs\conventie_mediu_oracle.md, aliniat la seria
conventie_*, si indexat la punctul 7 din reguli_lucru.md. Sectiunea 6 (starea constatata pe
PACK_FACTURARE) e marcata reper istoric ROAFACTURARE; conventia propriu-zisa sunt punctele 1-5.
In docs\ raman 9 fisiere.