Files
roafacturare/docs/cercetare/rec_s4_apelanti.md
Marius Mutu b5a7108f34 docs: cercetarile comune trec in COMUN, reziduul #6 dispare, progres.md la zi
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
2026-08-11 22:31:42 +03:00

160 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Extinderea la cei 5 apelanti `frm_modific2024` + linia din `roagest.prg`
09.08.2026. Extinde solutia "cursorul se pregateste inainte de `Createobject`" (aplicata deja doar
la `do_editare_factura`, `ofacturare_comun.vc2:3792`) la ceilalti 4 apelanti care fac
`Createobject([frm_modific2024])` fara sa pre-incarce nimic, plus linia lipsa din `roagest.prg`.
## Helper-ul nou: `PregatesteArticoleFacturaEditare(tcAliasAct)`
`COMUN\programe\ofacturare_editare.prg:319-340`. O singura functie, un singur apel per apelant,
inainte de `Createobject`:
```
IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure"))
PregatesteArticoleFacturaEditare('tact')
ENDIF
```
Reutilizeaza integral ce exista deja, fara sa rescrie nimic:
- **descoperirea**: `IncarcaVanzareDinNota(tcAliasAct)` — incearca toate tripletele distincte
`(cod, nract, serie_act, dataact)` din alias pana gaseste un rand in `VANZARI` (decizia 27);
populeaza `tvanz` si salveaza/restaureaza singura workarea si pozitia curenta pe alias.
- **pre-incarcarea**: daca a gasit (`Reccount('tvanz') = 1`), `IncarcaArticoleFactura(tvanz.id_vanzare,
'crsArticoleFactura')` — exact acelasi apel ca in `do_editare_factura`.
Helper-ul insusi mai adauga doar restaurarea workarei de la intrare (`Select()`/`SELECT (...)`,
acelasi tipar ca in `IncarcaVanzareDinNota`), pentru ca `IncarcaArticoleFactura` isi lasa
workarea curenta pe cursorul nou creat, nu pe cea a apelantului.
**Decizie**: cand nu gaseste randul (`tact` lipsa/gol, sau nota fara `VANZARI`), **nu creeaza
`crsArticoleFactura` deloc** — nu-l creeaza gol. Motivul: `Load()` din `frm_modific2024`
(`omodificari.vc2:14144`, fisier interzis, neatins) testeaza `IF Used('crsArticoleFactura')`
inainte de `APPEND FROM`; daca helper-ul nu-l deschide, comportamentul e identic cu azi — cursorul
canonic gol creat de `Load()`, plus fallback-ul din `Show()` (`IF Reccount('tvd') = 0`) ramane
calea activa exact ca inainte de aceasta lucrare. Fara mesaj de eroare pe calea "nu gaseste" —
mesajele Oracle raman doar in `IncarcaVanzareNota`/`IncarcaArticoleFactura`, pe erori Oracle
propriu-zise (neschimbate).
Nu strica workarea/pozitia apelantului in niciun caz (gasit, negasit, sau eroare Oracle).
## Cei 4 apelanti tratati
| Fisier:linie apel | Clasa.metoda | Context |
|---|---|---|
| `COMUN\clase\comun.vc2:2435-2437` | `afisjurcom.do_modifica` | **registrul jurnal, viu in ROACONT** |
| `COMUN\clase\anaf_efactura.vc2:13084-13086` | `frm_import_efactura.importmodifica` | import eFactura achizitie |
| `COMUN\ferestre\frm_initializare_facturi_balanta.sc2:1803-1806` | `form1.modificanote` | initializare solduri |
| `COMUN\ferestre\frm_import_note_facturi_clienti.sc2:895-898` | `form1.modificanote` | import note facturi clienti |
Fiecare: apel gardat cu `"OFACTURARE_EDITARE" $ Upper(Set("Procedure"))` inainte de
`Createobject([frm_modific2024]...)`, plus curatenie `If Used('crsArticoleFactura') / Use In
crsArticoleFactura / Endif` alaturi de restul cursoarelor eliberate la iesirea din metoda (acolo
unde apelantul le elibereaza deja — toti 4 o fac).
**Doi din cei patru sunt no-op-uri sigure, nu utile azi**, dar consistente cu cerinta ("fiecare
apelant primeste apelul"):
- `anaf_efactura.importmodifica` importa o **factura de achizitie** (comentariul de la linia 13104
o confirma), nu are legatura cu `VANZARI` — `tact` la momentul apelului e construit din
`cnote_contabile` (achizitie), fara `cod` corespunzator unei vanzari. Discovery nu gaseste nimic,
helper-ul e no-op curat.
- Cele doua `.sc2` (`frm_initializare_facturi_balanta`, `frm_import_note_facturi_clienti`) creeaza
note **noi** (`llNotaNoua = .T.`) — `cod`-ul se genereaza abia **dupa** ce formularul se inchide
(`SELECT seq_cod.nextval`, dupa `Show(1, ...)`). La momentul apelului `tact` n-are inca `cod`
legat de o vanzare existenta, deci discovery nu gaseste nimic, la fel no-op.
Doar `afisjurcom.do_modifica` (registrul jurnal) atinge azi documente cu rand real in `VANZARI` pe
aceasta cale — acolo helper-ul chiar precarca articolele, la fel ca la `do_editare_factura`.
## `Show()` ramane fallback — cod (probabil) mort pentru calea tratata
Nu s-a atins `omodificari.vc2` (fisier interzis). Fallback-ul din `Show()`
(`IF Reccount('tvd') = 0 THEN IncarcaArticoleFactura(...)`) ramane pe loc, neschimbat. Pentru cei
5 apelanti tratati acum (`do_editare_factura` + cei 4 de mai sus), `tvd` va fi deja plin dupa
`Load()` cand precarcarea a gasit ceva, deci fallback-ul nu se mai declanseaza — la fel cum se
intampla deja pentru `do_editare_factura`. Ramane cod activ doar pentru apelantii care nu pre-incarca
deloc (niciunul azi, dupa aceasta lucrare) si pentru orice viitor apelant care nu adopta tiparul.
**Recomandare**: nu se scoate — e in fisierul interzis si decizia e a lui Marius, dar merita
observat ca azi n-a mai ramas niciun apelant cunoscut care sa-l exercite.
## Linia din `roagest.prg`
`D:\ROA\ROAGEST\Programe\roagest.prg:260`: `SET PROCEDURE TO ofacturare_editare.prg ADDITIVE`,
adaugata imediat dupa `ofacturare_comun.PRG` (acelasi loc relativ ca in `roacont.prg:212`, deja
comis in SVN r18006). Precoditie verificata inainte de editare: `Test-Path
D:\ROA\ROAGEST\COMUN\programe\ofacturare_editare.prg` — fisierul exista pe disc (copia de `COMUN`
din ROAGEST fusese adusa la r18010, per `progres.md`).
## Testare
Suita `test_page3_articole.prg` extinsa cu o asertie noua (`verifica_precarcare_articole`,
`:544-614`): reproduce exact secventa din `afisjurcom.do_modifica` (`IncarcaCursoareModificareNota`
+ rebuild `tact` cu `cu_Tva` + `PregatesteArticoleFacturaEditare('tact')` + `Createobject` +
`Show()`), si verifica **workarea lui `tvd` identica intre `Load` si `Show`** — indicatorul deja
folosit in suita pentru "fallback-ul din `Show()` nu a reinchis cursorul". Inainte de aceasta
lucrare, pe calea negardata (`verifica_recordsource_grid`, cazul F), workarea diferea: **5 dupa
Load, 26 dupa Show**. Pe calea noua (cazul A, cu precarcare): **5 dupa Load, 5 dupa Show** — identic,
deci fallback-ul n-a mai reinchis cursorul.
Rulat sub `watchdog_vfp.ps1 -AutoDismiss`, `.fxp`-uri vechi sterse inainte de fiecare rulare,
`loForm.ClassLibrary` confirmat pe copia editata (nu ROACONT):
| Suita | Inainte | Dupa | Exit / dialoguri |
|---|---|---|---|
| `test_page3_articole.prg` | 13 PASS / 2 FAIL | **14 PASS / 2 FAIL** | 0 / 0 |
| `test_incarca_vanzare_din_nota.prg` | 5/5 | **5/5** | 0 / 0 |
Cele 2 FAIL raman identice cu inainte — artefactul headless deja documentat (datoria 7, eroare 1925
`Unknown member COLUMN5`), neatins de aceasta lucrare. Cifra noua (+1 PASS) e exact asertia adaugata;
nicio alta cifra nu s-a miscat — fara regresie.
**Netestat**: fluxul complet prin `afisjurcom.do_modifica`/`importmodifica`/cele doua `.sc2`
(formularele lor nu se instantiaza headless — cer `crsfacturi`/`crsDetaliiFacturiTemp` populate
printr-un flux real, aceeasi limitare documentata deja pentru `frm_facturi`). Testul nou reproduce
secventa de cod linie cu linie, nu formularul intreg — verifica helper-ul si interactiunea cu
`Load()`/`Show()`, nu drumul UI complet pana la el.
## Encoding si write-back
Toate editarile facute **pe octeti** (script Perl, `binmode :raw`, fara nicio decodare/reencodare),
cu match exact pe ancore unice (verificat cate o singura potrivire per inlocuire inainte de scriere).
Cens de octeti >0x7F identic inainte/dupa pe toate fisierele atinse, zero secventa `EF BF BD` dupa:
| Fisier | Cens >0x7F (inainte = dupa) |
|---|---|
| `comun.vc2` | 1× `ee` |
| `anaf_efactura.vc2` | 1× `e3` |
| `frm_initializare_facturi_balanta.sc2` | 0 |
| `frm_import_note_facturi_clienti.sc2` | 0 |
| `ofacturare_editare.prg` | 0 |
| `roagest.prg` | 1× `a9` |
Write-back text->binar cu `txt2vcx.ps1 -AllowComun`, toate 4 (`comun.vc2`, `anaf_efactura.vc2`,
cele doua `.sc2`) — fidelity check **OK** pe toate, cens neschimbat dupa refresh-ul cache-ului text.
`ofacturare_editare.prg`, `roagest.prg` si `test_page3_articole.prg` sunt surse directe (`.prg`),
fara pas de write-back binar.
## Fisiere atinse, stare write-back
| Fisier | Modificare | Write-back |
|---|---|---|
| `COMUN\programe\ofacturare_editare.prg` | helper nou + antet rescris | N/A (sursa directa) |
| `COMUN\clase\comun.vc2` + `.vcx`/`.VCT` | apel gardat + cleanup | **FACUT**, fidelity OK |
| `COMUN\clase\anaf_efactura.vc2` + `.vcx`/`.vct` | apel gardat + cleanup | **FACUT**, fidelity OK |
| `COMUN\ferestre\frm_initializare_facturi_balanta.sc2` + `.scx`/`.SCT` | apel gardat + cleanup | **FACUT**, fidelity OK |
| `COMUN\ferestre\frm_import_note_facturi_clienti.sc2` + `.scx`/`.sct` | apel gardat + cleanup | **FACUT**, fidelity OK |
| `D:\ROA\ROAGEST\Programe\roagest.prg` | linie `SET PROCEDURE` noua | N/A (sursa directa) |
| `COMUN\utile\Teste\editare_factura\test_page3_articole.prg` | asertie noua | N/A (nu are binar, doar git) |
Neatinse (interzise): `COMUN\clase\omodificari.vc2`, `COMUN\clase\ofacturare_comun.vc2`.
**Fara commit** — diff-ul: diff aplicat (sters) (2 sectiuni: `COMUN` din
`comun.git`, `ROAGEST\Programe\roagest.prg` din `roagest.git`).
## Ce ramane pentru decizia lui Marius
- Aproba diff-ul si cele doua write-back-uri (COMUN, ROAGEST) inainte de commit.
- Rebuild ROACONT ramane la Marius (deja notat in `progres.md`) — abia dupa el PAGE3 apare efectiv
in registrul jurnal acolo. Rebuild ROAGEST, similar, dupa linia noua din `roagest.prg`.
- Observatia despre fallback-ul din `Show()` (probabil cod mort pentru toti apelantii cunoscuti
azi) — informativa, nu se actioneaza fara aprobare (fisier interzis).