# S5 — agatarea scrierii de articole in cele doua puncte de intrare Implementare, 09.08.2026 seara. Atinse: `COMUN\clase\ofacturare_comun.vc2`, `COMUN\clase\comun.vc2` (+ write-back in binare). Niciun alt fisier atins, niciun commit. ## Ce s-a facut In ambele metode, imediat dupa `Endif`-ul care inchide apelul `pack_contafin.finalizeaza_modificare_nota` si inainte de `do_inchide_tranzactie` (tranzactia manuala e inca deschisa acolo): - `frm_facturi.do_editare_factura` — `ofacturare_comun.vc2:3828-3830` (intre vechile `:3827`/`:3828`, deplasate cu +3 linii de insertie). - `afisjurcom.do_modifica` — `comun.vc2:2491-2493` (intre vechile `:2490`/`:2538`; inserat imediat dupa `Endif`, inaintea blocului de cod comentat existent, nedeplasat). Bloc identic in ambele (o singura conditie, fara `Else`, ca sa nu strice `lnSucces` cand garda nu trece): ```foxpro If lnSucces > 0 And "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) And Used('tvanz') And Reccount('tvanz') = 1 lnSucces = Iif(ScrieArticoleFacturaEditate(tvanz.id_vanzare), 1, -1) Endif ``` `ScrieArticoleFacturaEditate` (definita de alt agent in `COMUN\programe\ofacturare_editare.prg:468`, verificata la momentul scrierii apelului) intoarce logic si include deja pasul de recalcul (`pack_facturare.recalculeaza_totaluri_vanzari`) — nu mai e nevoie de un apel separat din VFP, cum sugera o formulare anterioara a planului. ## De ce asa - `-1`, nu `0`, la esec — garda de commit e `Iif(lnSucces<0,2,1)`. - Garda pe `"OFACTURARE_EDITARE" $ Upper(Set("Procedure"))` pusa si in `ofacturare_comun.vc2` (desi acolo `ofacturare_editare.prg` e mereu inregistrat, ROAFACTURARE fiind singurul consumator), pentru simetrie cu `comun.vc2`, unde e obligatorie (fisierul nu exista in `SET PROCEDURE` pe ROACONT/ROAGEST). - `Used('tvanz') And Reccount('tvanz') = 1` inainte de a citi `tvanz.id_vanzare` — formularul e deja `Release`-uit la acest punct, dar cursorul supravietuieste; fara garda, `tvanz.id_vanzare` ar arunca eroare de alias daca pagina de articole n-a fost activa. - Un singur `If` fara `Else`: cand oricare conditie e falsa, blocul se sare complet si `lnSucces` ramane neschimbat (comportamentul de dinainte de modificare). ## Cens de octeti (inainte / dupa, identic pe caracterele >=0x80) | Fisier | octeti >0x7F inainte | octeti >0x7F dupa | `EF BF BD` | LF izolat | |---|---|---|---|---| | `ofacturare_comun.vc2` | 12 | 12 | 0 | 0 | | `comun.vc2` | 1 | 1 | 0 | 0 | Editare facuta byte-safe (PowerShell, round-trip `GetEncoding(1252)`, text nou strict ASCII) — niciun octet existent atins. ## Write-back Ambele `txt2vcx.ps1 -AllowComun` — fidelity-check trecut, binare cu mtime nou: - `ofacturare_comun.vcx`/`.vct` — OK. - `comun.vcx`/`.vct` — OK (fisier mare, ~330 KB text; write-back a durat >120s, rulat in fundal, finalizat cu succes). ## Testare **Testul de garda** (`test_page3_articole.prg`, ultimul caz din suita: scoate `ofacturare_editare.prg` din `SET PROCEDURE`, verifica `PageCount=2`): **PASS**. Confirma ca in ROACONT/ROAGEST, unde fisierul nu e inregistrat, blocul nou e complet inert — nu doar prin gardele proprii, ci si prin faptul ca `ScrieArticoleFacturaEditate` nici nu ar fi rezolvabila acolo. **Regresie**, rulata 09.08.2026 ~22:46-22:48, sub watchdog (`-AutoDismiss`, exit 0, zero dialoguri pe toate): | Suita | Rezultat | Baseline | |---|---|---| | `test_page3_articole` | 14 PASS / 2 FAIL | 14/2 (identic — cele 2 sunt artefactul headless cunoscut pe coloanele de grid) | | `test_incarca_vanzare_din_nota` | 5/0 | 5/0 | | `test_adauga_linie_articol` | 20/0 | 20/0 | | `test_adauga_linie_valuta` | 16/0 | 16/0 | | `test_ui_sterge_linie` | 8/0 | 8/0 | | `test_verdict_act_rul` | 26/0 | 26/0 | Toate cifrele identice cu baseline-ul dat — nicio regresie introdusa, nici de modificarea proprie, nici de lucrarile paralele pe `omodificari.vc2` la ora rularii. Cifrele s-au numarat din liniile `REZULTAT: N PASS / M FAIL` din fiecare log (`grep -c "PASS"/"FAIL"` brut supra-numara cu 1, pentru ca linia `REZULTAT` insasi contine ambele cuvinte). ## Ce nu s-a testat - Scrierea reala in Oracle prin noul apel (tranzactie -> `ScrieArticoleFacturaEditate` -> `SELECT` de verificare -> rollback/commit) — nu face parte din aceasta livrare, ramane la pasul de aplicare in `MARIUSM_AUTO` (nepornit inca, per `docs\handoff_s5.md`). - Fluxul UI complet (click real pe butonul de editare, `frm_modific2024` deschis modal) — testele de regresie folosesc harnessul headless existent, care nu exercita interactiunea reala de grid (limitare documentata, nu introdusa aici).