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:
199
docs/livrare_s5.md
Normal file
199
docs/livrare_s5.md
Normal 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.
|
||||
Reference in New Issue
Block a user