#13: formular de facturare unificat - etapa curenta

Squash al branch-ului de lucru plan13-s2.

Cod: clasa noua ofacturare_util (geometrie si utilitare de formular), inrolata in
roafacturare.prg; meniul "Facturare (nou)" plat, cu reparatia literalului peste
limita VFP de 255 de caractere care impiedica compilarea metodei.

Livrare: changelog 2.11.19, marcajul de versiune DB pentru scripturile finale din
SCRIPTURI_CLAR\2026\09, inventarul livrarii in docs/livrare_13.md si registrul de
erori deschise. Documentatia de lucru a etapei (cercetare, rapoarte, handoff-uri,
snapshot-uri de scripturi si backup-uri de rollback) a fost scoasa din arbore.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
This commit is contained in:
2026-09-09 21:30:51 +03:00
parent 87063b06a8
commit 104c24ec20
80 changed files with 5585 additions and 27852 deletions

View File

@@ -1,85 +0,0 @@
# S4 runda 1 (PAGE3, doar afisare) — raport de inchidere, 08.08.2026
Runda 1 din S4 (`plan_06_s4_proiectare.md`) e **inchisa**. Diff-ul de review:
diff aplicat (sters). Istoricul complet al sesiunii de implementare/depanare:
`docs\cercetare\handoff_s4_runda1.md`, handoff intermediar (sters),
handoff intermediar (sters).
## Ce s-a implementat
- **`COMUN\programe\ofacturare_editare.prg`**, doua functii noi la coada fisierului:
- `IncarcaVanzareNota(tnCod, tnNract, tcSerieAct, tdDataAct)` — gaseste randul din `VANZARI`
corespunzator notei curente (filtru compus `cod+nract+serie_act+data_act`, necesar pentru ca
`VANZARI.COD` nu e unic — vezi `progres.md`), cursor `tvanz`.
- `IncarcaArticoleFactura(tnIdVanzare)` — liniile active (`sters=0`) din `VANZARI_DETALII`, cu
denumire articol/gestiune/valuta pentru afisare, cursor `tvd`.
- **`COMUN\clase\omodificari.vc2`** (`frm_modific2024`):
- `pgfArticole.PageCount = 3`, `PAGE3.Caption = "Articole factura"`.
- Grid nou `pgfArticole.PAGE3.grdArticoleFactura` — 13 coloane, `RecordSource="tvd"`, strict
**readonly** (grid + fiecare `Text1`).
- Proprietati noi pe clasa: `lAreArticoleVanzari`, `nIdVanzare`, `nTipVanzare`.
- `Load()`: placeholder `CREATE CURSOR tvd (...)` — evita dialogul nativ "Open" pe `RecordSource`
inexistent la constructia grid-ului.
- `Show()`: bloc nou care cheama `IncarcaVanzareNota`/`IncarcaArticoleFactura` si comuta
`pgfArticole.PageCount` intre 2 si 3 dupa `lAreArticoleVanzari`.
Write-back facut, text si binar sincronizate, fidelity-check OK.
## Ce s-a testat, si cu ce rezultat
Suita `COMUN\utile\Teste\editare_factura\test_page3_articole.prg`, headless sub
`COMUN\utile\Teste\watchdog_vfp.ps1 -AutoDismiss`, conexiune reala `MARIUSM_AUTO`. Rulare finala
(dupa curatarea instrumentatiei de depanare): **exit code 0, 0 dialoguri, toate cazurile PASS**
(`test_page3_articole_log.txt`):
| Caz | Verifica | Rezultat |
|---|---|---|
| `cod=1140888` (factura, tip=1) | `IncarcaVanzareNota`/`IncarcaArticoleFactura` direct: `id_vanzare=1050`, `tip=1`, 4 linii | PASS |
| `cod=1140885` (tip=-12, cu rand VANZARI) | idem: `id_vanzare=1047`, `tip=-12` (detectia merge pe orice tip, nu doar facturi) | PASS |
| `cod=1125486` (nota fara rand VANZARI) | 0 randuri gasite (caz negativ) | PASS |
| `cod=1139934` (4 randuri VANZARI cu acelasi cod) | filtrul compus gaseste exact `id_vanzare=882` pe `nract=375/SSS`, 0 randuri pe `nract=13` (fara corespondent) | PASS |
| `cod=1140888`, `frm_modific2024` instantiat (`Createobject`+`Show`, ca in `do_editare_factura`) | `PageCount=3`, `lAreArticoleVanzari=.T.`, `nIdVanzare=1050` | PASS |
| `cod=1125486`, idem | `PageCount=2`, `lAreArticoleVanzari=.F.` | PASS |
Testul nu atinge Oracle in scriere — doar `SELECT`-uri prin `goExecutor`.
## Ce NU e acoperit (ramane pentru runde ulterioare)
- **Editarea in memorie a liniilor din grid** — runda 2 din S4; grid-ul e strict readonly in
aceasta runda, prin design (B.2 din plan, marcaje `_modificat`/`sters`/`id_vanzare_det=0`, nu e
inceput).
- **Inchiderea prin `do_renunt()`** — netestata, la fel ca in rundele S1-S3 (mediul minimal de
test are `ControlCount=0` pe formularul principal `frm_facturi`, deci butoanele native nu sunt
disponibile pentru a conduce fluxul complet prin UI).
- **Fluxul UI complet prin "Terminat"** — netestat; `verifica_pagecount_form` instantiaza
`frm_modific2024` direct (`Createobject`+`Show`), la fel ca `do_editare_factura`, dar nu conduce
formularul pana la inchidere. Validarea din `inainte_de_do_termin` nu e exercitata de aceasta
suita.
- Garda **referinte** pe `do_editare_factura` ramane netestata izolat (fara candidat pozitiv in
datele de test) — mostenit din rundele anterioare, nu specific rundei 1 din S4.
## Blocaje rezolvate in aceasta sesiune (istoric, nu de reluat)
Trei blocaje separate au impiedicat verificarea live inainte de aceasta runda de inchidere, toate
documentate pe larg in handoff intermediar (sters) si `COMUN\docs\testare-ui-vfp.md`:
1. `DO ... WITH gnAn, gnLuna` pasa prin referinta si umbrea variabilele in procedurile apelate,
provocand dialogul nativ "View Parameter" pe un `?gnAn` din SQL passthrough — remediat cu
pasare prin valoare (`DO ... WITH (gnAn), (gnLuna)`).
2. Harnessul de test (`test_init_env_auto.prg`) incarca implicit clasa `omodificari` din copia de
lucru **ROACONT**, nu din fisierul editat — remediat cu `RELEASE CLASSLIB` + `SET CLASSLIB TO`
pe calea completa a fisierului sub test.
3. Proprietatile custom noi (`lAreArticoleVanzari`, `nIdVanzare`, `nTipVanzare`) lipseau din
`*<DefinedPropArrayMethod>` (intrarile `*p:`) — regula era documentata doar pentru metode
(`*m:`); aplicata acum si aici, in `COMUN\docs\flux-editare-vfp-text.md`.
## Curatare facuta la inchidere
- Scoase liniile de log `[BISECT]` si `[DIAG]` (`ClassLibrary`/`PEMSTATUS`) din
`test_page3_articole.prg` — erau instrumentatie de depanare, fara rol in suita finala. Corectiile
de fond (parantezele pe `(gnAn)`/`(gnLuna)`, blocul `RELEASE CLASSLIB`/`SET CLASSLIB TO`) au
ramas, cu comentariile lor.
- Sters `test_baseline_isolation.prg` (+ `.FXP` + log) — era temporar prin design; concluzia lui
("binarul original nu are blocajul") s-a dovedit nula, testa copia ROACONT a clasei, nu fisierul
editat (vezi capcana #2 de mai sus).
- Suita rulata din nou dupa curatare — PASS pe toate cazurile (tabelul de mai sus).