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
200 lines
15 KiB
Markdown
200 lines
15 KiB
Markdown
# 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.
|