Files
roafacturare/docs/livrare_s5.md
Marius Mutu b5a7108f34 docs: cercetarile comune trec in COMUN, reziduul #6 dispare, progres.md la zi
Curatenie ceruta dupa inchiderea lui #6. Folderul cercetare\ NU se putea sterge
in bloc: plan_13 se sprijina pe el cu 85 de trimiteri, deci e baza de dovezi a
planului aflat in lucru. Impartirea:

- 14 cercetari trans-proiect trec in COMUN\docs\cercetare\ - valuta si curs,
  TVA/VANZARI, consumatorii VANZARI din toata suita, integrarile #10/#11/#12,
  watchdog VFP, proiectarea Oracle a lui S5, view-ul VVANZARI_ARTICOLE. Nu sunt
  ale ROAFACTURARE, iar #10/#11/#12 se reiau chiar din ele.
- 20 de rapoarte de executie ale lui #6, nereferite de nimic viu, sterse.
- 91 raman, neatinse.

Trimiterile catre handoff-urile si diff-urile intermediare deja desfiintate au
fost curatate peste tot (39 de fisiere): 50 catre handoff-uri, 37 catre diff-uri
aplicate, plus caile celor mutate in COMUN. Zero trimiteri rupte ramase.

progres.md preia rolul de predare: ce ramane din #6 (cele sase documente
parazite, cele doua esecuri reale din S8 pe factura din aviz), cifrele de test
citite din log, si cele doua capcane de mediu platite - .FXP vechi executat in
locul .prg-ului, si GETFONT() care atarna un formular instantiat fara goApp.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:31:42 +03:00

15 KiB

Dosar de livrare — S5 (scrierea sumelor editate in Oracle)

Bloc #6 / S5, parte din "editare factura emisa". Stare la 10.08.2026. Scop: Marius decide commit / push / SVN pe baza acestui fisier, fara sa recititeasca cele zece rapoarte de mai jos.

Surse: docs\progres.md (sectiunea #6/S5), handoff intermediar (sters) (deciziile 38-41), docs\cercetare\rec_s5_scriere_reala.md, docs\cercetare\rec_s5_discount_valuta.md, docs\cercetare\rec_s5_teste.md, docs\cercetare\rec_s5_grid_articole.md.

1. Ce livreaza S5

Pana acum, editarea unei facturi deja emise (#6/S4) modifica doar ecranul si nota interna — modificarile facute liniilor de articole (cantitate, pret, discount, articole adaugate sau sterse) nu ajungeau in baza de date. S5 inchide exact acest pas: la salvare, toate modificarile se scriu real in Oracle, intr-o singura tranzactie, si totalurile documentului se recalculeaza din liniile efectiv salvate, nu din liniile vechi.

In plus:

  • gridul de articole primeste o coloana noua, "Pret achizitie", editabila doar pe liniile noi adaugate (pe liniile existente valoarea veche ramane neatinsa);
  • liniile care fac parte dintr-un set de articole devin needitabile individual, cu marcaj vizual distinct — totalul unui set se calculeaza din capul lui, nu din componente, deci editarea unei componente n-ar fi schimbat tacut totalul;
  • cinci validari noi opresc sau avertizeaza la salvare: cantitate invalida, articol lipsa, pret lipsa, factura ramasa fara nicio linie activa, si pret de achizitie necompletat pe linie noua.

Scrierea a fost testata cu date reale in Oracle (nu doar simulat), inclusiv doua editari succesive ale aceleiasi facturi, ca sa se confirme ca o linie stearsa ramane stearsa si la reeditare.

2. Fisiere atinse

Fisier Repo Ce s-a schimbat Patch
clase\omodificari.vc2 COMUN Coloana pret_achizitie in grid, editabilitate per rand (linii de set needitabile, marcaj albastru), 5 validari noi in inainte_de_do_termin diff aplicat (sters)
clase\ofacturare_comun.vc2 COMUN Agatarea apelului ScrieArticoleFacturaEditate dupa finalizeaza_modificare_nota (primul punct de intrare, do_editare_factura) diff aplicat (sters)
clase\comun.vc2 COMUN Aceeasi agatare, al doilea punct de intrare (:2491) diff aplicat (sters)
programe\ofacturare_editare.prg COMUN Helper nou ScrieArticoleFacturaEditate (marcheaza tot sters / invie ce ramane / insereaza linii noi / apeleaza recalculul Oracle) diff aplicat (sters)
utile\Teste\editare_factura\test_page3_articole.prg COMUN Asteptari actualizate: ColumnCount=15, tip si editabilitate pe coloanele noi diff aplicat (sters)
utile\Teste\editare_factura\test_s5_validari_articole.prg (nou) COMUN Suita headless: validari + SQL generat de helper, cu mock pe goExecutor diff aplicat (sters)
utile\Teste\editare_factura\test_ui_s5_grid_pret_achizitie.prg (nou) COMUN Suita UI vizibila: coloana noua, needitabilitate pe linii de set, focus pe linie noua diff aplicat (sters)
utile\Teste\editare_factura\test_s5_scriere_reala.prg (nou) COMUN Test cu scriere reala in Oracle, doua treceri, COMMIT real diff aplicat (sters)
utile\Teste\editare_factura\test_s5_discount_valuta.prg (nou) COMUN Test parametru discount (NULL vs 0 vs valoare) + documente reale in valuta diff aplicat (sters)
utile\Teste\editare_factura\test_s5_rollback_real.prg (nou) COMUN Calea de ROLLBACK la esec partial, cu eroare Oracle provocata deliberat diff aplicat (sters)
utile\Teste\editare_factura\test_s5_al_doilea_intrare.prg (nou) COMUN Al doilea punct de intrare (comun.vc2:2491) parcurs real diff aplicat (sters)
docs\oracle_export.md COMUN Corectie documentatie: linesize 32767 in loc de 400 (cauza incidentului de export, vezi sectiunea 3) fara patch dedicat
docs\scripturi-migrare-db.md COMUN Corectie documentatie: UpdateVersiune nu primeste extensia .sql in argument fara patch dedicat
versiune_db.txt ROAFACTURARE 2026_08_08_01 -> 2026_08_09_02 fara patch (fisier text, un rand)

Curatare facuta 10.08.2026: sterse clase\comun.pre_s5_agatare.bak.vc2, clase\ofacturare_comun.pre_s5_agatare.bak.vc2 (verificate cmp identice cu git HEAD inainte de stergere, deci recuperabile) si utile\Teste\editare_factura\test_nume_coloana_modificat.log (reziduu de test, regenerabil).

Lasat pe disc, decizia lui Marius: clase\ofacturare_comun.pre_s4butoane.bak.vc2 — backup din S4 care difera de git HEAD, deci e o stare intermediara nerecuperabila din istoric. Nu l-am sters tocmai de aceea. Nu e cod de productie si nu e trackuit.

Write-back binar, dovedit prin reconversie (10.08.2026)

Raport: docs\verificare_s5_writeback.md. Fiecare .vcx reconvertit in text intr-un cache temporar si comparat octet cu octet cu .vc2 din arbore — nu pe mtime, care nu e martor (txt2vcx.ps1:300 rescrie mtime-ul textului la „cel mai nou binar + 1s").

Fisier Octeti Linii diferite Cens > 0x7F conform reperului
omodificari.vc2 539470 0 da (2 aa · 2 e3 · 2 fe, 0x EF BF BD)
ofacturare_comun.vc2 242984 0 da (1 aa · 3 ba · 2 ce · 2 e3 · 2 ee · 2 fe, 0)
comun.vc2 330100 0 da (1 ee, 0)

Blocul de agatare confirmat textual, cu -1 (nu 0), la ofacturare_comun.vc2:3828-3830 si comun.vc2:2491-2493.

3. Modificari de baza de date

Doua scripturi, deja aplicate in MARIUSM_AUTO, mutate 10.08.2026 in D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08 si adaugate in SVN (svn add, status A, necomise):

  • ff_2026_08_09_01_COMUN_PACK_FACTURARE.sql — adauga procedura recalculeaza_totaluri_vanzari(V_ID_VANZARE, V_DISCOUNT DEFAULT NULL) in pachetul PACK_FACTURARE. NULL pastreaza discountul curent al documentului, o valoare explicita (inclusiv 0) il inlocuieste. Pachet VALID, 0 erori dupa aplicare.
    • Incident, rezolvat: prima aplicare a picat cu ORA-00920, cauzat de un export all_source facut cu linesize prea mic, care a rupt o linie prin mijlocul identificatorului PRET_ACHIZITIE. Scriptul a fost reasamblat de la ultimul script real aplicat pe disc, nu de la export; a doua aplicare a reusit curat. docs\oracle_export.md corectat ca sa nu se repete.
  • ff_2026_08_09_02_COMUN_VVANZARI_ARTICOLE.sql — adauga coloanele ID_VANZARE_SET si PRET_ACHIZITIE in view-ul VVANZARI_ARTICOLE. Aplicat inaintea celuilalt script, altfel gridul nu era testabil. View VALID, 23 de coloane.

versiune_db.txt = 2026_08_09_02 (deja actualizat pe disc, vezi sectiunea 2).

4. Dovezile de testare

Suita Cifra Ce dovedeste
test_s5_validari_articole.prg (nou, headless) 35 PASS / 0 FAIL Cele 5 validari din inainte_de_do_termin pe instanta reala; SQL-ul generat de ScrieArticoleFacturaEditate (clasificare linii, oprire la primul esec, discount NULL vs valoare) prin mock pe goExecutor, fara Oracle
test_ui_s5_grid_pret_achizitie.prg (nou, formular vizibil) 14 PASS / 0 FAIL Grid cu 15 coloane, coloana "Pret achizitie" legata corect, linie de set needitabila cu marcaj albastru, pret_achizitie primeste focus doar pe linie noua
test_s5_scriere_reala.prg (nou, scriere reala in Oracle) 25 PASS / 0 FAIL Ordinea din decizia 38 dovedita in tranzactie (linia stearsa e reinviata de reset, apoi corectata de helper); a doua trecere dovedeste ca stergerea ramane definitiva la reeditare; linie noua + pret_achizitie scris corect; totaluri recalculate coerente. Verificat independent prin sqlplus
test_s5_discount_valuta.prg (nou, scriere reala + citiri cu ROLLBACK) 46 PASS / 0 FAIL NULL pastreaza discountul curent, 0 explicit il zeroeaza — dovedit pe 4 apeluri succesive in tranzactie; recalculul e corect si pe un document real in valuta (id_vanzare=1037, cu ROLLBACK); lantul complet de salvare cu discount nenul, COMMIT real
test_s5_rollback_real.prg (nou) 13 PASS / 0 FAIL Calea de ROLLBACK la esec partial: contractul helperului prin mock (opreste la prima comanda esuata, .F., zero comenzi in plus) si starea reala in Oracle — ORA-02291 provocat deliberat pe INSERT, executie partiala vazuta necomisa in tranzactie, apoi ROLLBACK → document identic, verificat prin sqlplus. Cele 2 linii EROARE din log sunt exact eroarea provocata intentionat
test_s5_al_doilea_intrare.prg (nou) 17 PASS / 0 FAIL Al doilea punct de intrare (comun.vc2:2491, afisjurcom.do_modifica) parcurs real, nu doar verificat static: tvanz se populeaza pe calea asta, blocul nou se executa, lantul comite
Regresie (6 suite existente, neregresate) test_page3_articole 14/2 (2 = artefact headless cunoscut) · test_incarca_vanzare_din_nota 5/0 · test_adauga_linie_articol 20/0 · test_adauga_linie_valuta 16/0 · test_ui_sterge_linie 8/0 · test_verdict_act_rul 26/0 Nicio functionalitate anterioara (#6/S4) nu s-a stricat

Atentie separata, semnalata in rec_s5_teste.md: pentru test_page3_articole.prg, raport_teste.ps1 (uneltele automate) raporteaza 10/0, nu cifra reala 14/2 — suita scrie o parte din verdicte intr-un format pe care regexul automat nu-l prinde. Cifra corecta (14/2, numarata manual din log) e cea folosita peste tot in acest dosar. Nu e o regresie noua.

Nicio contradictie de cifre intre rapoarte pe restul suitelor.

5. Ce NU e acoperit

Doua dintre golurile de mai jos s-au inchis pe 10.08.2026 — vezi docs\cercetare\rec_s5_goluri_test.md. Ce a ramas:

  • Liniile din seturi de articole (id_vanzare_set nenul) — neacoperibil pe datele actuale, nu din omisiune: interogare pe MARIUSM_AUTO, zero documente cu id_vanzare_set nenul in luna curenta, iar garda de editare cere luna curenta. Nu s-au fabricat date. Tratarea corecta a unei astfel de linii de catre helper e acoperita prin mock (test_s5_validari_articole.prg).
  • Lantul complet de editare pe documente in valuta — niciun document IN_VALUTA=1 din baza nu e din luna curenta (cel mai recent, 05.2026), iar garda de editare cere luna curenta. S-a putut testa doar recalculul Oracle izolat (cu ROLLBACK), nu fluxul complet de salvare pe un document in valuta.
  • Ramura moarta Isnull(pret) (omodificari.vc2:14340) — consemnata, nereparata. Verificat empiric: tvd.pret vine NOT NULL din view, orice incercare de a forta .NULL. da eroare VFP 1581. Garda defensiva imposibil de declansat pe fluxul real; inofensiva, lasata neatinsa.

Wart preexistent, semnalat dar NEATINS de S5 — la o eroare Oracle in acest lant de scriere, oproceduri_comune.prg:421-424 afiseaza Eroare necunoscuta + SQL brut + GETCALLSTACK(). Functional e corect (mesaj, apoi .F., apoi ROLLBACK), dar textul e nepotrivit pentru utilizator. Priveste toata suita ROA, nu doar editarea de factura, deci nu se repara aici. Nota, ca sa nu se reia alarma: acelasi AMESSAGEBOX agata testele headless — e capcana cunoscuta de dialog nativ, nu un defect de productie. Diagnosticul complet in rec_s5_goluri_test.md.

6. Date de test consumate ireversibil

Pe id_vanzare = 1049 (factura tip 1, 07.08.2026):

  • cod realocat succesiv: 1140887 -> 1140896 -> 1140897 -> 1140898 -> 1140900 (cel curent, verificat prin sqlplus la 10.08.2026).
  • det=1582 a ramas sters definitiv in urma testului de scriere reala. Incident, reparat si verificat: o prima varianta a suitei test_s5_al_doilea_intrare.prg a reinviat tacut linia 1582, pentru ca apela helperul fara sa incarce tvd in prealabil — garda no-op pe cursor gol (ofacturare_editare.prg:476) a mascat greseala. Corectat pe loc cu UPDATE + COMMIT, iar varianta finala a suitei incarca tvd ca Load()-ul formularului si dovedeste explicit ca 1582 ramane sters dupa salvare. Verificat independent de orchestrator prin sqlplus: 1582 are STERS = 1.
  • det=1588 e o linie noua, creata de test, cu id_gestiune=-1000 si pret_achizitie=77.77.
  • Discountul documentului a trecut prin 12.5, apoi a fost restaurat la 0 — verificat prin sqlplus dupa test.
  • Totalurile documentului: 573.81 (initial) -> 905.02 (dupa scrierea articolelor).

Pe id_vanzare = 1037 (cod=1140730, document in valuta, arhiva 05.2026): doar citit, testul s-a inchis cu ROLLBACK — neatins, verificat prin sqlplus.

7. Intrarea de changelog — APLICATA 10.08.2026

Adaugata in capul lui changelog_roafacturare.txt ca 2.11.15, tag :nou: (completeaza functionalitatea de editare factura din #6, introdusa in S4). Verificat dupa scriere: CRLF intact (3876 = 3876 = 3876), octeti > 0x7F neschimbati (3, toti preexistenti).

<!--
10/08/2026
ROAFACTURARE - 2.11.15

:nou:
  Factura. La editarea unei facturi deja emise, modificarile facute articolelor (cantitate, pret, discount, adaugare sau stergere de linie) se scriu acum si in baza de date, la salvare - anterior ramaneau doar in ecranul de editare. S-a adaugat coloana "Pret achizitie" in grid, editabila pentru articolele nou adaugate pe factura. Liniile care apartin unui set de articole nu se mai pot edita individual - se marcheaza distinct, iar totalul se calculeaza tot din capul setului.
-->

8. Pasi de livrare — stare la 10.08.2026

# Pas Stare
1 Mutarea scripturilor SQL in SCRIPTURI_CLAR\2026\08 + svn add FACUT, status A, necomis
2 Blocul de changelog 2.11.15 in changelog_roafacturare.txt FACUT
3 Inchiderea golurilor de acoperire din sectiunea 5 FACUT — ROLLBACK 13/0, al doilea punct de intrare 17/0; liniile de set raman neacoperibile (zero date)
4 Verificarea write-back-ului binar prin reconversie pe cele 3 .vc2 FACUT — toate trei identice octet cu octet, vezi sectiunea 2
5 Curatarea fisierelor netrackuite din COMUN FACUT — 2 .bak + 1 log sterse; pre_s4butoane.bak.vc2 lasat (difera de git HEAD)
6 Commit git, dupa aprobarea lui Marius FACUT — COMUN 1c42ae0 (13 fisiere), ROAFACTURARE 316b6f7 (2 fisiere), ambele pe punct6-s4-runda3
7 Verificarea pe ecran de Marius — coloana "Pret achizitie", marcajul liniilor de set, cele 5 validari ramane a lui
8 Push git si commit SVN (inclusiv cele doua scripturi A din DATABASE) NEFACUT — publicare pe server, decizie separata a lui Marius

Ce a ramas necomis, deliberat

  • svn commit — nici in DATABASE (cele doua scripturi, status A), nici in vreun alt repo. SVN e sursa de adevar si commit-ul merge direct pe server, deci e publicare, nu pas local.
  • git push — pe niciunul din cele doua repo-uri.
  • docs\ din ROAFACTURARE — netrackuit dintotdeauna, nu l-am introdus in git acum.
  • COMUN\clase\ofacturare_comun.pre_s4butoane.bak.vc2 — vezi sectiunea 2.

Ce nu s-a rulat inainte de commit

git_sync.ps1 nu a fost rulat in ROAFACTURARE inaintea commit-ului 316b6f7: acesta atinge doar changelog_roafacturare.txt si versiune_db.txt, niciun binar VFP, iar o resincronizare ar fi adus in commit zgomot din .??2-uri nelegate de S5. Daca textele din ROAFACTURARE sunt invechite fata de binare, e stare preexistenta, nu efect al S5.