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
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 procedurarecalculeaza_totaluri_vanzari(V_ID_VANZARE, V_DISCOUNT DEFAULT NULL)in pachetulPACK_FACTURARE.NULLpastreaza discountul curent al documentului, o valoare explicita (inclusiv0) il inlocuieste. PachetVALID, 0 erori dupa aplicare.- Incident, rezolvat: prima aplicare a picat cu
ORA-00920, cauzat de un exportall_sourcefacut culinesizeprea mic, care a rupt o linie prin mijlocul identificatoruluiPRET_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.mdcorectat ca sa nu se repete.
- Incident, rezolvat: prima aplicare a picat cu
ff_2026_08_09_02_COMUN_VVANZARI_ARTICOLE.sql— adauga coloaneleID_VANZARE_SETsiPRET_ACHIZITIEin view-ulVVANZARI_ARTICOLE. Aplicat inaintea celuilalt script, altfel gridul nu era testabil. ViewVALID, 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_setnenul) — neacoperibil pe datele actuale, nu din omisiune: interogare peMARIUSM_AUTO, zero documente cuid_vanzare_setnenul 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=1din 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.pretvineNOT NULLdin 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):
codrealocat succesiv:1140887->1140896->1140897->1140898->1140900(cel curent, verificat prinsqlplusla 10.08.2026).det=1582a ramas sters definitiv in urma testului de scriere reala. Incident, reparat si verificat: o prima varianta a suiteitest_s5_al_doilea_intrare.prga reinviat tacut linia1582, pentru ca apela helperul fara sa incarcetvdin prealabil — garda no-op pe cursor gol (ofacturare_editare.prg:476) a mascat greseala. Corectat pe loc cuUPDATE+COMMIT, iar varianta finala a suitei incarcatvdcaLoad()-ul formularului si dovedeste explicit ca1582ramane sters dupa salvare. Verificat independent de orchestrator prinsqlplus:1582areSTERS = 1.det=1588e o linie noua, creata de test, cuid_gestiune=-1000sipret_achizitie=77.77.- Discountul documentului a trecut prin
12.5, apoi a fost restaurat la0— verificat prinsqlplusdupa 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 inDATABASE(cele doua scripturi, statusA), 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\dinROAFACTURARE— 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.