docs: planurile, proiectarile si rapoartele de lucru intra in versionare

Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git,
nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de
cercetare pe care se sprijina modificarile din cod. O stergere acolo era
definitiva.

Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au
fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele
fisierelor de test la care se refereau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
This commit is contained in:
2026-08-11 22:17:17 +03:00
parent 40933df3c8
commit d9f5ca4226
145 changed files with 43431 additions and 0 deletions

199
docs/livrare_s5.md Normal file
View File

@@ -0,0 +1,199 @@
# 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), `docs\handoff_s5.md` (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` | `docs\diff_s5_grid_articole.patch` |
| `clase\ofacturare_comun.vc2` | COMUN | Agatarea apelului `ScrieArticoleFacturaEditate` dupa `finalizeaza_modificare_nota` (primul punct de intrare, `do_editare_factura`) | `docs\diff_s5_agatare.patch` |
| `clase\comun.vc2` | COMUN | Aceeasi agatare, al doilea punct de intrare (`:2491`) | `docs\diff_s5_agatare.patch` |
| `programe\ofacturare_editare.prg` | COMUN | Helper nou `ScrieArticoleFacturaEditate` (marcheaza tot sters / invie ce ramane / insereaza linii noi / apeleaza recalculul Oracle) | `docs\diff_s5_helper_scriere.patch` |
| `utile\Teste\editare_factura\test_page3_articole.prg` | COMUN | Asteptari actualizate: `ColumnCount=15`, tip si editabilitate pe coloanele noi | `docs\diff_s5_teste.patch` |
| `utile\Teste\editare_factura\test_s5_validari_articole.prg` (nou) | COMUN | Suita headless: validari + SQL generat de helper, cu mock pe `goExecutor` | `docs\diff_s5_teste.patch` |
| `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 | `docs\diff_s5_teste.patch` |
| `utile\Teste\editare_factura\test_s5_scriere_reala.prg` (nou) | COMUN | Test cu scriere reala in Oracle, doua treceri, COMMIT real | `docs\diff_s5_test_scriere_reala.patch` |
| `utile\Teste\editare_factura\test_s5_discount_valuta.prg` (nou) | COMUN | Test parametru discount (NULL vs 0 vs valoare) + documente reale in valuta | `docs\diff_s5_discount_valuta.patch` |
| `utile\Teste\editare_factura\test_s5_rollback_real.prg` (nou) | COMUN | Calea de ROLLBACK la esec partial, cu eroare Oracle provocata deliberat | `docs\diff_s5_goluri_test.patch` |
| `utile\Teste\editare_factura\test_s5_al_doilea_intrare.prg` (nou) | COMUN | Al doilea punct de intrare (`comun.vc2:2491`) parcurs real | `docs\diff_s5_goluri_test.patch` |
| `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.