Files
roaregistratura/docs/analiza_registratura_adaugare_editare.md
Marius Mutu 6769eb61d1 Registratura: adaugare/editare fara erori la partener NULL, lista doar ultimul document, fonturi Arial 10 (M1-M5)
M1 modifica_reg_dg: garda id_part NULL/empty (mesaj + Return .F.), NVL pe id_part/nr_pag, functia intoarce succes.
M2 validare partener in toate cele 3 puncte de salvare, INAINTE de blocarea campurilor (Command2.Click salveaza inainte sa blocheze; bara laterala si Page3.Deactivate nu mai salveaza/prompteaza cu partener NULL).
M3 do_adauga: documentul nou intra direct in editare (llock=.F., focus cmdDenumire); eliminat mesajul fals "Toate modificarile au efect imediat!".
M4 viz_registratura + do_cauta: filtru initial "doar ultimul document" (subquery max(id_reg)); fara criterii de cautare se pastreaza filtrul, nu se incarca toata baza.
M5 fonturi: eliminate 154 suprascrieri "Arial Narrow" si rebazate 96 controale baseclass pe COMUN _baza.vcx (textbox/label/checkbox/commandbutton/optiongroup); Init de grid propaga fontul la coloane si headere (fara asta raman Arial 9 - verificat empiric).

Teste: harness headless (init env dedicat, form, adaugare+editare cu verificare in baza) + test UI vizual cu screenshots pe fluxul real (19 PASS / 0 FAIL). Diff-uri de audit in docs/diff_runda1_*.patch.

M6 (build EXE) BLOCAT headless: roaRegistratura.pjx refera 48 fisiere hardcodate pe "c:\program files\...\vfp 9" (masina 32-bit din 2021) + COMUN\utile\hpdf\ReportOutput\ctl32_progressbar.vcx redenumit _old; necesita repathing o data in VFP9 IDE.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018H9za5A9Tk6wcLFof6seds
2026-07-23 18:53:12 +03:00

166 lines
9.6 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.

# Analiza: adaugare/editare document in registratura + lista documentelor + fonturi
Data: 23.07.2026. Analiza pe surse (fara modificari de cod). Referintele de linie sunt in
fisierele text FoxBin2Prg (`.vc2`), sincronizate cu binarele la data analizei.
## 1. Fluxul actual (cum functioneaza azi)
Fereastra principala (`ofundal_registratura.vc2`, clasa `pg_meniu_princ`):
- **Page2 "Lista documentelor"** = `ct_registratura` (grid pe cursorul `cRegistratura`,
incarcat de `viz_registratura` din `Programe\oproceduri_roaregistratura.prg`).
- **Page3 "Datele documentului"** = `ct_part_nr_data` (Partener / Nr. doc / Data doc +
butonul **Modifica/Salveaza** cu lacat) + `ct_date_generale` (bara outlook cu butoanele
Date generale / Referinte / Observatii / Documente atasate, care deschid formulare
separate `podg_dg`, `podg_referinte`, `podg_obs`, `podg_link`).
- Starea editarii este `ct_part_nr_data.llock` (`.T.` = blocat). Butonul `Command2`
comuta: la deblocare afiseaza "Toate modificarile au efect imediat!", la a doua apasare
("Salveaza") apeleaza `modifica_reg_dg`.
- Salvarea reala e `modifica_reg_dg` (`oproceduri_roaregistratura.prg:100`) -> apel PL/SQL
`pack_registratura.modifica_registratura`.
- Adaugarea (`ct_registratura.do_adauga`, `ferestre_registratura.vc2:1206`): aloca numar
intern (`oGeneratorNumere`, seria 10), insereaza un rand GOL prin
`pack_registratura.adauga_registratura`, apoi sare pe Page3. Documentul nou are
**id_part NULL** pana alege utilizatorul partenerul.
## 2. Problemele identificate (cauze exacte)
### P1. Prompt "Doriti sa salvati modificarile facute?" aparut "din senin"
Doua locuri intreaba automat cand `llock = .F.`:
- `outlook2003bar.vc2:1009` (`do_arata_formular`): **orice click pe un buton din bara
laterala** (Date generale, Referinte, Observatii, Documente atasate) intreaba si, la Da,
ruleaza `modifica_reg_dg`.
- `ofundal_registratura.vc2:286` (`Page3.Deactivate`): la parasirea paginii, la fel.
Deci scenariul raportat: utilizatorul apasa **Modifica** (deblocare), apoi navigheaza
(ex. deschide sectiunea Date generale ca sa completeze campuri sau vrea partenerul) ->
prompt de salvare -> Da -> eroare, pentru ca documentul nou are partener NULL.
### P2. Eroarea la partener NULL
`modifica_reg_dg`, linia 111:
```
lcId_part = Alltrim(Str(loRegistratura.id_part)) && fara NVL!
```
`Str(.NULL.)` -> NULL, concatenarea in `lcSql` propaga NULL -> `goExecutor.oExecute(NULL)`
-> eroare. Aceeasi problema potentiala: `lcNr_pag` (linia 123, fara NVL) si `Dtos()` pe
date NULL (liniile 114/116 dau sir gol la NULL — tratat in IIF, ok).
Validarea de partener exista **doar** in `Command2.Click` (ramura Salveaza,
`ferestre_registratura.vc2:332`), dar:
- ruleaza DUPA ce campurile au fost deja blocate si caption-ul pus pe "Modifica"
(stare inconsistenta: mesaj "Alegeti partenerul!", dar formularul ramane blocat si
nesalvat);
- celelalte doua puncte de salvare (P1) NU au deloc validarea.
### P3. Flux confuz Modifica/Salveaza
- Mesajul de la deblocare ("Toate modificarile au efect imediat!") e fals: modificarile de
date generale se salveaza doar la "Salveaza"/prompt; doar `ck_avizat.Valid` scrie imediat.
- Dupa adaugare (`do_adauga`) documentul nou apare pe Page3 **blocat**: utilizatorul mai
trebuie sa apese Modifica inainte sa poata alege partenerul — pas inutil si sursa
promptului din P1.
- Raspunsul "Nu" la prompt arunca modificarile fara re-citirea datelor originale:
`goRegistratura` ramane cu valorile editate (afisare inselatoare pana la refresh).
### P4. Lista documentelor: incarcare integrala + pozitionare pe primul
- `viz_registratura` incarca TOATE inregistrarile cu `sters=0` din `vregistratura`
(fara filtru initial pe ultimul document), apoi `Go Top` -> se vede inceputul bazei.
- `Page2.Activate` apeleaza `do_cauta()` la fiecare activare; fara bife, filtrul devine
`STERS=0` -> reincarcare integrala la fiecare revenire pe lista.
### P5. Fonturi
- Clasele COMUN de baza (`_baza.vcx`: `_textbox`, `_label`, `_checkbox`, `_grid` etc.)
au deja **Arial 10** — controalele derivate din ele sunt OK.
- In proiect insa:
- `ferestre_registratura.vc2`: **75 aparitii** `FontName = "Arial Narrow"` (gridul
`grid_registratura` + toate coloanele/headerele/text-urile, checkbox-urile de filtru);
- `onom_clienti.vc2`: **79 aparitii**;
- `ct_part_nr_data`, `ct_date_generale` si mare parte din `frm_dg_date_generale` folosesc
controale **baseclass VFP** (textbox/label/checkbox/commandbutton fara clasa COMUN)
fara FontName -> mostenesc fontul formului sau raman pe default (Arial 9).
### P6. Alte observatii (fragilitate, de semnalat)
- `Ck_tipdoc` e legat de classlib `..\..\roacont\comun\clase\caut_ora.vcx` (referinta
cross-proiect catre ROACONT, nu COMUN-ul propriu) — `ferestre_registratura.vc2:589`.
- `cmdFel_document`/`cmdNresp`/etc. au Picture din `..\..\roacontracte\grafice\find.bmp`
(alt proiect).
- Proiectul nu a mai fost recompilat de mult cu COMUN-ul curent -> build necesar in VFP9
IDE dupa aplicarea modificarilor.
## 3. Modificari propuse (minime, in ordinea prioritatii)
### M1. `modifica_reg_dg` — garda si NVL (oproceduri_roaregistratura.prg)
- La inceput: daca `Isnull(toRegistratura.id_part) Or Empty(toRegistratura.id_part)` ->
`AMESSAGEBOX('Alegeti partenerul inainte de salvare!')` si `Return .F.`.
- `lcId_part`/`lcNr_pag` cu `Nvl(...)`; functia sa intoarca `.T./.F.` (succes), ca apelantii
sa poata reactiona.
### M2. Punct unic de salvare + prompt doar cand exista partener
- In `do_arata_formular` (outlook2003bar) si `Page3.Deactivate`: daca `llock=.F.` si
`id_part` NULL -> mesaj "Alegeti partenerul!" si **fara** apel `modifica_reg_dg`
(raman in editare in cazul barei laterale; la Deactivate se renunta explicit).
- In `Command2.Click` (Salveaza): validarea partenerului INAINTE de `blocheaza_campuri()`;
se blocheaza doar dupa salvarea reusita.
### M3. Dupa adaugare, intra direct in editare
In `do_adauga` / la comutarea pe Page3 pentru document nou: `llock=.F.`,
`deblocheaza_campuri()` (inclusiv pe formularele podg_* deschise) si focus pe
`cmdDenumire` -> utilizatorul alege direct partenerul, fara pasul Modifica.
Se elimina si mesajul fals "Toate modificarile au efect imediat!" (sau se inlocuieste cu
"Apasati Salveaza pentru a pastra modificarile").
### M4. Lista: initial doar ultimul document
- `viz_registratura` primeste filtrul initial:
`sters=0 and id_reg = (select max(id_reg) from vregistratura where sters=0)`
(de validat sintaxa cu gencursor la implementare; alternativ ordonare desc + `rownum=1`).
- `do_cauta`: daca nicio bifa de filtru nu e activa, pastreaza filtrul "ultimul document"
in loc de `STERS=0` (incarcare integrala doar la cautare explicita).
- Dupa incarcare: pozitionare pe ultimul (unicul) rand -> martor pentru ultimul numar
de inregistrare.
### M5. Fonturi Arial 10 — prin rebazare pe clasele din `_baza.vcx` (decizie Marius)
- Controalele **baseclass VFP** din proiect se rebazeaza pe clasele COMUN care au deja
Arial 10: `textbox` -> `_textbox`, `label` -> `_label`, `checkbox` -> `_checkbox`,
`commandbutton` -> `_commandbutton`, `optiongroup` -> `_optiongrup`
(toate `OF "..\comun\clase\_baza.vcx"`). Vizate: `ct_part_nr_data` (txtClient,
txtNumar, txtData_ctr, cmdDenumire, Command2, Label3/4/9), `frm_dg_date_generale`
(txt*, cmd*, Label*, ck_avizat, optIE) si textele/checkbox-urile din coloanele
gridului `grid_registratura`.
- Se ELIMINA suprascrierile explicite `FontName = "Arial Narrow"` (75 in
`ferestre_registratura.vc2`, 79 in `onom_clienti.vc2`), astfel incat controalele sa
mosteneasca Arial 10 din clasele de baza; gridul (`_grdrow` din `_grd_base.vcx`)
ramane pe mostenirea lui odata scoase suprascrierile.
- Controalele deja derivate din COMUN (`_lbbase`, `but_*`, `clb_tx_simplu`,
`ck_filtru_*` etc.) raman neatinse.
- Atentie la latimi: Arial e mai lat ca Arial Narrow — de verificat vizual coloanele
gridului si etichetele dupa schimbare (conventie_ux_formulare.md).
- Nota tehnica: rebazarea se face in textul `.vc2` (schimbarea `AS <clasa>` +
`ClassLib` in markerul `END OBJECT`), cu fidelity-check la write-back; e o
modificare mai invaziva decat schimbarea de font per control — de testat intai pe
un singur control, apoi extins.
### M6. Recompilare
Dupa aplicarea M1M5: BUILD proiect in VFP9 IDE (recompilare cu COMUN-ul curent),
apoi `git_sync` si commit (dupa aprobarea diff-urilor).
## 4. Testare
Scripturi noi in `Teste\` (rulare headless `vfp9.exe -A -T`, log in `Teste\log_*.txt`,
mediu CENTRAL / MARIUSM_AUTO conform reguli_lucru.md):
- `test_init_env_registratura.prg` — init mediu neinteractiv pentru ROAREGISTRATURA
(SET PATH/CLASSLIB/PROCEDURE preluate din `Programe\roaregistratura.prg`).
- `test_registratura_form.prg` — incarca cursorul listei (`viz_registratura`),
verifica existenta cursorului, numarul de inregistrari si pozitionarea pe ultimul
document; instantiaza containerul `ct_registratura` pe un form ascuns.
- `test_registratura_adaugare.prg` — fluxul de adaugare SI editare: alocare numar intern,
`adauga_registratura`, apoi `modifica_reg_dg` cu partener NULL (se asteapta eroare/refuz
— reproduce bugul P2), cu partener valid (se asteapta succes), apoi EDITAREA
documentului (modificare descriere/nr_pag/data + re-salvare + verificare in baza —
fluxul Modifica -> Salveaza).
NOTA: scripturile NU se ruleaza pe baza de productie (JCSSERVER/CONTAFIN_ORACLE).
Daca schema de test nu contine `pack_registratura`, testele de adaugare logheaza eroarea
si se opresc curat (fara scrieri partiale).
## 5. Ce urmeaza
Dupa aprobare, implementarea se livreaza ca diff-uri pe fisierele text
(`docs\diff_runda1_*.patch`), write-back cu `txt2vcx.ps1` doar dupa OK.