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
This commit is contained in:
2026-07-23 18:53:12 +03:00
parent 7cf1499a24
commit 6769eb61d1
12 changed files with 1184 additions and 363 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -285,6 +285,12 @@ DEFINE CLASS pg_meniu_princ AS pg_meniu OF "..\comun\clase\ofundal.vcx"
PROCEDURE Page3.Deactivate
Local lnRaspuns
*!* 23.07.2026 MM - partener NULL: nu se salveaza, se renunta explicit (P1/P2)
If !This.ct_part_nr_data1.llock And (Isnull(goRegistratura.id_part) Or Empty(goRegistratura.id_part))
This.ct_part_nr_data1.llock = .T.
AMESSAGEBOX('Alegeti partenerul! Modificarile nu au fost salvate.',0+48,'Atentie')
This.ct_part_nr_data1.Refresh()
Endif
If !This.ct_part_nr_data1.llock
This.ct_part_nr_data1.llock = .T.
lnRaspuns = AMESSAGEBOX('Dori<72>i s<> salva<76>i modific<69>rile f<>cute?',4+32,'Confirmare')

View File

@@ -449,7 +449,6 @@ DEFINE CLASS frm_agenti AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Anchor = 15, ;
ColumnCount = 5, ;
DeleteMark = .F., ;
FontName = "Arial Narrow", ;
Height = 336, ;
Left = 15, ;
Name = "grd_agenti", ;
@@ -461,27 +460,22 @@ DEFINE CLASS frm_agenti AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ZOrderSet = 6, ;
Column1.ColumnOrder = 3, ;
Column1.ControlSource = "zona", ;
Column1.FontName = "Arial Narrow", ;
Column1.Name = "cZona", ;
Column1.Width = 172, ;
Column2.ColumnOrder = 1, ;
Column2.ControlSource = "nume_agent", ;
Column2.FontName = "Arial Narrow", ;
Column2.Name = "cNume", ;
Column2.Width = 205, ;
Column3.ColumnOrder = 4, ;
Column3.ControlSource = "telefon1", ;
Column3.FontName = "Arial Narrow", ;
Column3.Name = "cTelefon1", ;
Column3.Width = 116, ;
Column4.ColumnOrder = 2, ;
Column4.ControlSource = "functie", ;
Column4.FontName = "Arial Narrow", ;
Column4.Name = "cFunctia", ;
Column4.Width = 127, ;
Column5.ColumnOrder = 5, ;
Column5.ControlSource = "telefon2", ;
Column5.FontName = "Arial Narrow", ;
Column5.Name = "cTelefon2", ;
Column5.Width = 116
*< END OBJECT: ClassLib="..\..\comun\clase\_grd_base.vcx" BaseClass="grid" />
@@ -489,81 +483,72 @@ DEFINE CLASS frm_agenti AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ADD OBJECT 'grd_agenti.cFunctia.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Functie", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_agenti.cFunctia.Text1' AS textbox WITH ;
ADD OBJECT 'grd_agenti.cFunctia.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_agenti.cNume.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Nume", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_agenti.cNume.Text1' AS textbox WITH ;
ADD OBJECT 'grd_agenti.cNume.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_agenti.cTelefon1.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Telefon 1", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_agenti.cTelefon1.Text1' AS textbox WITH ;
ADD OBJECT 'grd_agenti.cTelefon1.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_agenti.cTelefon2.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Telefon 2", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_agenti.cTelefon2.Text1' AS textbox WITH ;
ADD OBJECT 'grd_agenti.cTelefon2.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_agenti.cZona.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Zona", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_agenti.cZona.Text1' AS textbox WITH ;
ADD OBJECT 'grd_agenti.cZona.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
PROCEDURE actualizeaza_grid1
Lparameters lcFiltru
@@ -667,6 +652,15 @@ DEFINE CLASS frm_agenti AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
PROCEDURE do_sterge2
ENDPROC
PROCEDURE grd_agenti.Init
DODEFAULT()
*!* 23.07.2026 MM - propaga fontul gridului la coloane si headere (P5)
This.SetAll('FontName', This.FontName, 'Column')
This.SetAll('FontSize', This.FontSize, 'Column')
This.SetAll('FontName', This.FontName, 'Header')
This.SetAll('FontSize', This.FontSize, 'Header')
ENDPROC
ENDDEFINE
DEFINE CLASS frm_agenti_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
@@ -1006,7 +1000,6 @@ DEFINE CLASS frm_clienti AS _frmbase OF "..\comun\clase\_frm_base.vcx"
ADD OBJECT 'grd_clienti' AS _grdrow WITH ;
ColumnCount = 9, ;
DeleteMark = .F., ;
FontName = "Arial Narrow", ;
Height = 366, ;
Left = 15, ;
Name = "grd_clienti", ;
@@ -1017,41 +1010,32 @@ DEFINE CLASS frm_clienti AS _frmbase OF "..\comun\clase\_frm_base.vcx"
Width = 636, ;
ZOrderSet = 6, ;
Column1.ControlSource = "nume", ;
Column1.FontName = "Arial Narrow", ;
Column1.Name = "cNume", ;
Column1.Width = 172, ;
Column2.ControlSource = "cod_fiscal", ;
Column2.FontName = "Arial Narrow", ;
Column2.Name = "cCod_fiscal", ;
Column2.Width = 91, ;
Column3.ControlSource = "telefon", ;
Column3.FontName = "Arial Narrow", ;
Column3.Name = "cTelefon", ;
Column4.ControlSource = "adresa", ;
Column4.FontName = "Arial Narrow", ;
Column4.Name = "cAdresa", ;
Column4.Width = 270, ;
Column5.ControlSource = "banca", ;
Column5.FontName = "Arial Narrow", ;
Column5.Name = "cBanca", ;
Column5.Width = 114, ;
Column6.ControlSource = "cont_banca", ;
Column6.FontName = "Arial Narrow", ;
Column6.Name = "cCont_banca", ;
Column6.Width = 52, ;
Column7.ControlSource = "reg_comert", ;
Column7.FontName = "Arial Narrow", ;
Column7.Name = "cReg_comert", ;
Column7.Width = 133, ;
Column8.ColumnOrder = 9, ;
Column8.ControlSource = "judet", ;
Column8.FontName = "Arial Narrow", ;
Column8.Name = "cJudet", ;
Column8.Visible = .T., ;
Column8.Width = 68, ;
Column9.ColumnOrder = 8, ;
Column9.ControlSource = "localitate", ;
Column9.FontName = "Arial Narrow", ;
Column9.Name = "cLocalitate", ;
Column9.Width = 127
*< END OBJECT: ClassLib="..\comun\clase\_grd_base.vcx" BaseClass="grid" />
@@ -1059,147 +1043,129 @@ DEFINE CLASS frm_clienti AS _frmbase OF "..\comun\clase\_frm_base.vcx"
ADD OBJECT 'grd_clienti.cAdresa.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Adresa", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cAdresa.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cAdresa.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cBanca.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Banca", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cBanca.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cBanca.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cCod_fiscal.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Cod fiscal", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cCod_fiscal.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cCod_fiscal.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cCont_banca.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Cont", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cCont_banca.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cCont_banca.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cJudet.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Judet", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cJudet.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cJudet.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
Visible = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cLocalitate.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Localitate", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cLocalitate.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cLocalitate.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cNume.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Nume client", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cNume.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cNume.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cReg_comert.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Nr.Reg.Com.", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cReg_comert.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cReg_comert.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grd_clienti.cTelefon.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Telefon", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grd_clienti.cTelefon.Text1' AS textbox WITH ;
ADD OBJECT 'grd_clienti.cTelefon.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
PROCEDURE actualizeaza_grid1
Lparameters lcFiltru
@@ -1292,6 +1258,15 @@ DEFINE CLASS frm_clienti AS _frmbase OF "..\comun\clase\_frm_base.vcx"
PROCEDURE do_sterge2
ENDPROC
PROCEDURE grd_clienti.Init
DODEFAULT()
*!* 23.07.2026 MM - propaga fontul gridului la coloane si headere (P5)
This.SetAll('FontName', This.FontName, 'Column')
This.SetAll('FontSize', This.FontSize, 'Column')
This.SetAll('FontName', This.FontName, 'Header')
This.SetAll('FontSize', This.FontSize, 'Header')
ENDPROC
ENDDEFINE
DEFINE CLASS frm_clienti_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
@@ -1709,7 +1684,6 @@ DEFINE CLASS frm_curs AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
AutoSize = .T., ;
camp_nume = data, ;
Caption = "Data", ;
FontName = "Arial Narrow", ;
Left = 54, ;
Name = "Ck_data", ;
TabIndex = 1, ;
@@ -1723,7 +1697,6 @@ DEFINE CLASS frm_curs AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
AutoSize = .T., ;
camp_nume = data2, ;
Caption = "Data2", ;
FontName = "Arial Narrow", ;
Left = 99, ;
Name = "Ck_data2", ;
TabIndex = 1, ;
@@ -1738,7 +1711,6 @@ DEFINE CLASS frm_curs AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
camp_nume = nume_val, ;
Caption = "Valuta", ;
Comment = "*:OnResize=LT", ;
FontName = "Arial Narrow", ;
Left = 6, ;
Name = "Ck_numeval", ;
TabIndex = 19, ;
@@ -1774,7 +1746,6 @@ DEFINE CLASS frm_curs AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Anchor = 15, ;
ColumnCount = 4, ;
DeleteMark = .F., ;
FontName = "Arial Narrow", ;
Height = 341, ;
Left = 8, ;
Name = "grid_curs", ;
@@ -1784,21 +1755,17 @@ DEFINE CLASS frm_curs AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Top = 68, ;
Width = 258, ;
Column1.ControlSource = "nume_val", ;
Column1.FontName = "Arial Narrow", ;
Column1.Name = "Column1", ;
Column1.Width = 74, ;
Column2.ControlSource = "curs", ;
Column2.FontName = "Arial Narrow", ;
Column2.Format = "rk", ;
Column2.InputMask = (get_mask(10,gnPCurs)), ;
Column2.Name = "Column2", ;
Column2.Width = 58, ;
Column3.ControlSource = "data", ;
Column3.FontName = "Arial Narrow", ;
Column3.Name = "Column3", ;
Column3.Width = 49, ;
Column4.ControlSource = "data2", ;
Column4.FontName = "Arial Narrow", ;
Column4.Name = "Column4", ;
Column4.Width = 51
*< END OBJECT: ClassLib="..\..\comun\clase\_grd_base.vcx" BaseClass="grid" />
@@ -1806,66 +1773,58 @@ DEFINE CLASS frm_curs AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ADD OBJECT 'grid_curs.Column1.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Nume valuta", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grid_curs.Column1.Text1' AS textbox WITH ;
ADD OBJECT 'grid_curs.Column1.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grid_curs.Column2.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Curs", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grid_curs.Column2.Text1' AS textbox WITH ;
ADD OBJECT 'grid_curs.Column2.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grid_curs.Column3.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Data", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grid_curs.Column3.Text1' AS textbox WITH ;
ADD OBJECT 'grid_curs.Column3.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'grid_curs.Column4.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Data2", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'grid_curs.Column4.Text1' AS textbox WITH ;
ADD OBJECT 'grid_curs.Column4.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
PROCEDURE actualizeaza_grid1
LPARAMETERS pcFiltru
@@ -1950,6 +1909,15 @@ DEFINE CLASS frm_curs AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ENDPROC
PROCEDURE grid_curs.Init
DODEFAULT()
*!* 23.07.2026 MM - propaga fontul gridului la coloane si headere (P5)
This.SetAll('FontName', This.FontName, 'Column')
This.SetAll('FontSize', This.FontSize, 'Column')
This.SetAll('FontName', This.FontName, 'Header')
This.SetAll('FontSize', This.FontSize, 'Header')
ENDPROC
ENDDEFINE
DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
@@ -2007,9 +1975,8 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Top = 1
*< END OBJECT: ClassLib="..\..\comun\clase\cmd_butoane.vcx" BaseClass="commandbutton" />
ADD OBJECT 'Command2' AS commandbutton WITH ;
ADD OBJECT 'Command2' AS _commandbutton WITH ;
Caption = "", ;
FontName = "Arial Narrow", ;
Height = 25, ;
Left = 168, ;
Name = "Command2", ;
@@ -2017,7 +1984,7 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 1, ;
Top = 36, ;
Width = 28
*< END OBJECT: BaseClass="commandbutton" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="commandbutton" />
ADD OBJECT 'CUS_ODATA_CURS1' AS cus_odata_curs WITH ;
Left = 102, ;
@@ -2025,7 +1992,7 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Top = 8
*< END OBJECT: ClassLib="onom_clienti.vcx" BaseClass="custom" />
ADD OBJECT 'Label1' AS label WITH ;
ADD OBJECT 'Label1' AS _label WITH ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "Nume valuta", ;
@@ -2035,9 +2002,9 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 8, ;
Top = 41, ;
Width = 71
*< END OBJECT: BaseClass="label" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="label" />
ADD OBJECT 'Label2' AS label WITH ;
ADD OBJECT 'Label2' AS _label WITH ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "Curs", ;
@@ -2047,9 +2014,9 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 9, ;
Top = 66, ;
Width = 29
*< END OBJECT: BaseClass="label" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="label" />
ADD OBJECT 'Label3' AS label WITH ;
ADD OBJECT 'Label3' AS _label WITH ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "Data 1", ;
@@ -2059,9 +2026,9 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 10, ;
Top = 91, ;
Width = 38
*< END OBJECT: BaseClass="label" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="label" />
ADD OBJECT 'Label4' AS label WITH ;
ADD OBJECT 'Label4' AS _label WITH ;
AutoSize = .T., ;
BackStyle = 0, ;
Caption = "Data 2", ;
@@ -2071,9 +2038,9 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 11, ;
Top = 117, ;
Width = 38
*< END OBJECT: BaseClass="label" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="label" />
ADD OBJECT 'txtCurs' AS textbox WITH ;
ADD OBJECT 'txtCurs' AS _textbox WITH ;
ControlSource = "porec.curs", ;
Height = 23, ;
Left = 91, ;
@@ -2081,9 +2048,9 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 2, ;
Top = 63, ;
Width = 100
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'txtData1' AS textbox WITH ;
ADD OBJECT 'txtData1' AS _textbox WITH ;
ControlSource = "porec.data", ;
Height = 23, ;
Left = 91, ;
@@ -2091,9 +2058,9 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 3, ;
Top = 88, ;
Width = 100
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'txtData2' AS textbox WITH ;
ADD OBJECT 'txtData2' AS _textbox WITH ;
ControlSource = "porec.data2", ;
Height = 23, ;
Left = 91, ;
@@ -2101,9 +2068,9 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 4, ;
Top = 114, ;
Width = 100
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'txtValuta' AS textbox WITH ;
ADD OBJECT 'txtValuta' AS _textbox WITH ;
ControlSource = "porec.nume_val", ;
Height = 23, ;
Left = 91, ;
@@ -2111,7 +2078,7 @@ DEFINE CLASS frm_curs_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
TabIndex = 12, ;
Top = 36, ;
Width = 75
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
PROCEDURE inainte_de_do_termin
Private pnIdCursNou
@@ -2294,7 +2261,6 @@ DEFINE CLASS frm_delegati AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ADD OBJECT 'gdelegati' AS _grdrow WITH ;
ColumnCount = 6, ;
DeleteMark = .F., ;
FontName = "Arial Narrow", ;
Height = 300, ;
Left = 12, ;
Name = "gdelegati", ;
@@ -2305,36 +2271,30 @@ DEFINE CLASS frm_delegati AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Top = 72, ;
Width = 565, ;
Column1.ControlSource = "nume_part", ;
Column1.FontName = "Arial Narrow", ;
Column1.Name = "Column1", ;
Column1.ReadOnly = .T., ;
Column1.Width = 168, ;
Column2.ControlSource = "nume", ;
Column2.FontName = "Arial Narrow", ;
Column2.Name = "Column2", ;
Column2.ReadOnly = .T., ;
Column2.Width = 169, ;
Column3.ControlSource = "bi_seria", ;
Column3.FontName = "Arial Narrow", ;
Column3.Name = "Column3", ;
Column3.ReadOnly = .T., ;
Column3.Width = 49, ;
Column4.ColumnOrder = 5, ;
Column4.ControlSource = "eliberatde", ;
Column4.FontName = "Arial Narrow", ;
Column4.Name = "Column4", ;
Column4.ReadOnly = .T., ;
Column4.Width = 77, ;
Column5.ColumnOrder = 6, ;
Column5.ControlSource = "inactiv", ;
Column5.FontName = "Arial Narrow", ;
Column5.Name = "Column5", ;
Column5.ReadOnly = .T., ;
Column5.Sparse = .F., ;
Column5.Width = 48, ;
Column6.ColumnOrder = 4, ;
Column6.ControlSource = "bi_numar", ;
Column6.FontName = "Arial Narrow", ;
Column6.Name = "Column6", ;
Column6.ReadOnly = .T., ;
Column6.Width = 66
@@ -2343,106 +2303,94 @@ DEFINE CLASS frm_delegati AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ADD OBJECT 'gdelegati.Column1.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Client", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'gdelegati.Column1.Text1' AS textbox WITH ;
ADD OBJECT 'gdelegati.Column1.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'gdelegati.Column2.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Delegat", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'gdelegati.Column2.Text1' AS textbox WITH ;
ADD OBJECT 'gdelegati.Column2.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'gdelegati.Column3.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "BI_seria", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'gdelegati.Column3.Text1' AS textbox WITH ;
ADD OBJECT 'gdelegati.Column3.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'gdelegati.Column4.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Eliberat de..", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'gdelegati.Column4.Text1' AS textbox WITH ;
ADD OBJECT 'gdelegati.Column4.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'gdelegati.Column5.Check1' AS checkbox WITH ;
ADD OBJECT 'gdelegati.Column5.Check1' AS _checkbox WITH ;
Alignment = 0, ;
Caption = "", ;
Centered = .T., ;
FontName = "Arial Narrow", ;
Height = 17, ;
Left = 16, ;
Name = "Check1", ;
ReadOnly = .T., ;
Top = 71, ;
Width = 60
*< END OBJECT: BaseClass="checkbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="checkbox" />
ADD OBJECT 'gdelegati.Column5.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "Inactiv", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'gdelegati.Column6.Header1' AS header WITH ;
Alignment = 2, ;
Caption = "BI_numar", ;
FontName = "Arial Narrow", ;
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT 'gdelegati.Column6.Text1' AS textbox WITH ;
ADD OBJECT 'gdelegati.Column6.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
FontName = "Arial Narrow", ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1"
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
PROCEDURE actualizeaza_grid1
LPARAMETERS pcFiltru
@@ -2544,6 +2492,15 @@ DEFINE CLASS frm_delegati AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Endif
ENDPROC
PROCEDURE gdelegati.Init
DODEFAULT()
*!* 23.07.2026 MM - propaga fontul gridului la coloane si headere (P5)
This.SetAll('FontName', This.FontName, 'Column')
This.SetAll('FontSize', This.FontSize, 'Column')
This.SetAll('FontName', This.FontName, 'Header')
This.SetAll('FontSize', This.FontSize, 'Header')
ENDPROC
ENDDEFINE
DEFINE CLASS frm_delegati_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
@@ -2874,14 +2831,14 @@ DEFINE CLASS frm_responsabili AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Name = "Responsabill"
*< END OBJECT: BaseClass="header" />
ADD OBJECT '_gnom_responsabili.Column1.Text1' AS textbox WITH ;
ADD OBJECT '_gnom_responsabili.Column1.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT '_gnom_responsabili.Column2.Header1' AS header WITH ;
Alignment = 2, ;
@@ -2889,16 +2846,16 @@ DEFINE CLASS frm_responsabili AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT '_gnom_responsabili.Column2.Text1' AS textbox WITH ;
ADD OBJECT '_gnom_responsabili.Column2.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT '_gnom_responsabili.Column3.Check1' AS checkbox WITH ;
ADD OBJECT '_gnom_responsabili.Column3.Check1' AS _checkbox WITH ;
Alignment = 0, ;
Caption = "", ;
Centered = .T., ;
@@ -2908,7 +2865,7 @@ DEFINE CLASS frm_responsabili AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ReadOnly = .T., ;
Top = 30, ;
Width = 60
*< END OBJECT: BaseClass="checkbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="checkbox" />
ADD OBJECT '_gnom_responsabili.Column3.Header1' AS header WITH ;
Alignment = 2, ;
@@ -2916,7 +2873,7 @@ DEFINE CLASS frm_responsabili AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT '_gnom_responsabili.Column4.Check1' AS checkbox WITH ;
ADD OBJECT '_gnom_responsabili.Column4.Check1' AS _checkbox WITH ;
Alignment = 0, ;
Caption = "", ;
Centered = .T., ;
@@ -2926,7 +2883,7 @@ DEFINE CLASS frm_responsabili AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
ReadOnly = .T., ;
Top = 30, ;
Width = 60
*< END OBJECT: BaseClass="checkbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="checkbox" />
ADD OBJECT '_gnom_responsabili.Column4.Header1' AS header WITH ;
Alignment = 2, ;
@@ -2940,14 +2897,14 @@ DEFINE CLASS frm_responsabili AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT '_gnom_responsabili.Column5.Text1' AS textbox WITH ;
ADD OBJECT '_gnom_responsabili.Column5.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT 'But_modifica1' AS but_modifica WITH ;
Left = 415, ;
@@ -3097,6 +3054,15 @@ DEFINE CLASS frm_responsabili AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
thisform.log("NOM_RESPONSABILI",v_responsabili.id_responsabil)
ENDPROC
PROCEDURE _gnom_responsabili.Init
DODEFAULT()
*!* 23.07.2026 MM - propaga fontul gridului la coloane si headere (P5)
This.SetAll('FontName', This.FontName, 'Column')
This.SetAll('FontSize', This.FontSize, 'Column')
This.SetAll('FontName', This.FontName, 'Header')
This.SetAll('FontSize', This.FontSize, 'Header')
ENDPROC
ENDDEFINE
DEFINE CLASS frm_responsabili_nou AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
@@ -3305,14 +3271,14 @@ DEFINE CLASS frm_tipc AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT '_grdrow1.Column1.Text1' AS textbox WITH ;
ADD OBJECT '_grdrow1.Column1.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT '_grdrow1.Column2.Header1' AS header WITH ;
Alignment = 2, ;
@@ -3320,14 +3286,14 @@ DEFINE CLASS frm_tipc AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT '_grdrow1.Column2.Text1' AS textbox WITH ;
ADD OBJECT '_grdrow1.Column2.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
ADD OBJECT '_grdrow1.Column3.Header1' AS header WITH ;
Alignment = 2, ;
@@ -3335,13 +3301,22 @@ DEFINE CLASS frm_tipc AS _frmbase OF "..\..\comun\clase\_frm_base.vcx"
Name = "Header1"
*< END OBJECT: BaseClass="header" />
ADD OBJECT '_grdrow1.Column3.Text1' AS textbox WITH ;
ADD OBJECT '_grdrow1.Column3.Text1' AS _textbox WITH ;
BackColor = 255,255,255, ;
BorderStyle = 0, ;
ForeColor = 0,0,0, ;
Margin = 0, ;
Name = "Text1", ;
ReadOnly = .T.
*< END OBJECT: BaseClass="textbox" />
*< END OBJECT: ClassLib="..\..\comun\clase\_baza.vcx" BaseClass="textbox" />
PROCEDURE _grdrow1.Init
DODEFAULT()
*!* 23.07.2026 MM - propaga fontul gridului la coloane si headere (P5)
This.SetAll('FontName', This.FontName, 'Column')
This.SetAll('FontSize', This.FontSize, 'Column')
This.SetAll('FontName', This.FontName, 'Header')
This.SetAll('FontSize', This.FontSize, 'Header')
ENDPROC
ENDDEFINE

View File

@@ -1009,7 +1009,8 @@ DEFINE CLASS panelbutton AS container
PROCEDURE do_arata_formular
LOCAL loPagina
loPagina = goFundal._pgfrmbase1.page3
IF !loPagina.ct_part_nr_data1.llock
*!* 23.07.2026 MM - partener NULL: fara prompt/salvare, raman in editare (P1/P2)
IF !loPagina.ct_part_nr_data1.llock AND !(ISNULL(goRegistratura.id_part) OR EMPTY(goRegistratura.id_part))
LOCAL lnRaspuns
loPagina.ct_part_nr_data1.llock = .T.
@@ -1134,7 +1135,7 @@ DEFINE CLASS splitter2 AS shape && Up-Down Splitter class. Support ActiveX con
*</DefinedPropArrayMethod>
HIDDEN hiddencontrols
PROTECTED Init,MouseDown
PROTECTED Init,mousedown
*<PropValue>
Height = 4
MousePointer = 7

View File

@@ -16,7 +16,7 @@ lcSelect = [select id_reg, id_part, denumire, id_pers, pers_contact, data, numar
lcOrder = []
lcgroup = []
lcFiltru = [sters=0]
lcFiltru = [sters=0 and id_reg=(select max(id_reg) from vregistratura where sters=0)] && *!* 23.07.2026 MM - initial doar ultimul document (P4)
lcFiltruOriginal = []
llModParam = .T.
llAfiseaza = .F.
@@ -103,12 +103,18 @@ Parameters toRegistratura
Local loRegistratura
loRegistratura = toRegistratura
*!* 23.07.2026 MM - garda partener NULL/empty (P2), functia intoarce .T./.F.
If Isnull(loRegistratura.id_part) Or Empty(loRegistratura.id_part)
AMESSAGEBOX("Alegeti partenerul inainte de salvare!",0+48,"Atentie")
Return .F.
Endif
Local lcId_reg, lcId_part, lcId_pers, lcData, lcNumar, lcData_intern, lcNumar_intern, lcDescriere, lcObservatii, lcIdUtil
Local lnSucces
lnSucces = -1
lcId_reg = Alltrim(Str(loRegistratura.id_reg))
lcId_part = Alltrim(Str(loRegistratura.id_part))
lcId_part = Nvl(Alltrim(Str(loRegistratura.id_part)),'NULL')
lcId_pers = Nvl(Alltrim(Str(loRegistratura.id_pers)),'NULL')
lcId_responsabil = Nvl(Alltrim(Str(loRegistratura.id_responsabil)),'NULL')
lcData = Dtos(loRegistratura.Data)
@@ -120,7 +126,7 @@ lcDescriere = Nvl(Alltrim(loRegistratura.descriere),"")
lcObservatii = Nvl(Alltrim(loRegistratura.observatii)," ")
lcId_fdoc = Nvl(Alltrim(Str(loRegistratura.id_fdoc)),'NULL')
lcId_mediu = Nvl(Alltrim(Str(loRegistratura.id_mediu)),'NULL')
lcNr_pag = Alltrim(Str(loRegistratura.nr_pag))
lcNr_pag = Nvl(Alltrim(Str(loRegistratura.nr_pag)),'NULL')
lcIdUtil = Alltrim(Str(gnIdUtil))
lcSql = [begin pack_registratura.modifica_registratura(] + lcId_reg + [,] + lcId_part + [,] + lcId_pers + [,] + lcId_responsabil + ;
@@ -134,6 +140,7 @@ If lnSucces < 0
AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare")
Endif
Return (lnSucces >= 0)
Endproc && modifica_reg_dg
***-----------------------------------------------------------------------------------------------------------------------------

View File

@@ -0,0 +1,29 @@
* build_registratura.prg - M6: recompilare completa a proiectului (headless).
* Rulare: vfp9.exe -A -T "D:\ROA\ROAREGISTRATURA\Teste\build_registratura.prg"
* Log: D:\ROA\ROAREGISTRATURA\Teste\log_build.txt (+ erori de compilare in .err daca apar)
SET SAFETY OFF
SET TALK OFF
PUBLIC gcBuildLog
gcBuildLog = 'D:\ROA\ROAREGISTRATURA\Teste\log_build.txt'
STRTOFILE('=== build_registratura ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcBuildLog)
ON ERROR DO blog WITH '*** EROARE ' + TRANSFORM(ERROR()) + ': ' + MESSAGE() + ;
' | ' + MESSAGE(1) + ' | prg=' + PROGRAM() + ' lin=' + TRANSFORM(LINENO())
SET DEFAULT TO D:\ROA\ROAREGISTRATURA
DO blog WITH 'BUILD EXE roaregistratura.exe FROM roaRegistratura RECOMPILE ...'
BUILD EXE roaregistratura.exe FROM roaRegistratura RECOMPILE
DO blog WITH 'Build incheiat. Verificati roaregistratura.err daca exista.'
IF FILE('D:\ROA\ROAREGISTRATURA\roaregistratura.err')
DO blog WITH '--- roaregistratura.err ---'
DO blog WITH FILETOSTR('D:\ROA\ROAREGISTRATURA\roaregistratura.err')
ELSE
DO blog WITH 'FARA erori de compilare (.err inexistent).'
ENDIF
ON ERROR
QUIT
PROCEDURE blog
LPARAMETERS tcMsg
STRTOFILE(TRANSFORM(tcMsg) + CHR(13)+CHR(10), gcBuildLog, 1)
ENDPROC

View File

@@ -0,0 +1,189 @@
* test_init_env_registratura.prg
* Init mediu NEINTERACTIV pentru teste headless ROAREGISTRATURA
* (echivalentul COMUN\utile\Teste\test_init_env_auto.prg, dar pentru acest proiect).
* SET PATH / CLASSLIB / PROCEDURE preluate din Programe\roaregistratura.prg (a se mentine sincron).
*
* Utilizare (dintr-un script apelant):
* DO Teste\test_init_env_registratura WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola'
* IF gnHandle <= 0 ... eroare conectare
* ATENTIE: NU se ruleaza pe baza de productie (JCSSERVER / CONTAFIN_ORACLE).
LPARAMETERS tcHost, tcSchema, tcPassword, tnAn, tnLuna
tcHost = IIF(EMPTY(tcHost), 'CENTRAL', tcHost)
tcSchema = IIF(EMPTY(tcSchema), 'MARIUSM_AUTO', tcSchema)
tcPassword = IIF(EMPTY(tcPassword), 'ROMFASTSOFT', tcPassword)
SET DELETED ON
SET ANSI ON
SET EXACT ON
SET SAFETY OFF
CLOSE DATABASES
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
SET SQLBUFFERING ON
PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, gnIdFirma, gcS, gcFirma, ;
gcNumeProgram, gcAppName, buton, gnButon, pnButon, gcAcces, glParametri, glQuit
CT_SUCCES = 1
CT_INSUCCES = -1
crlf = CHR(13) + CHR(10)
gnAn = IIF(EMPTY(tnAn), YEAR(DATE()), tnAn)
gnLuna = IIF(EMPTY(tnLuna), MONTH(DATE()), tnLuna)
gnIdUtil = -3
gnIdFirma = 110
gcS = UPPER(ALLTRIM(tcSchema))
gcFirma = m.gcS
gcNumeProgram = [ROAREGISTRATURA]
gcAppName = [ROAREGISTRATURA]
glParametri = .T.
glQuit = .F.
buton = 1
gnButon = 1
pnButon = 1
gcAcces = [1;2;3;4;5;6;7;8;]
* globale cerute de oserii_numere/oinit_optiuni (sincron cu test_init_env_auto.prg)
PUBLIC gnIdSucursala, gnIdMama, glEMama, gcCondSucursala, glLunaInchisa, gcUserName
gnIdSucursala = NULL
gnIdMama = 0
glEMama = .F.
gcCondSucursala = []
glLunaInchisa = .F.
gcUserName = [MARIUS M]
* vezi comentariul din test_init_env_auto.prg: PUBLIC, nu Declare
PUBLIC nror(65000)
PUBLIC gcAppPath, DIRGEN, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile
gcAppPath = [D:\ROA\ROAREGISTRATURA\]
SET DEFAULT TO (gcAppPath)
LOCAL lcPath
lcPath = gcAppPath + 'Date;' + ;
gcAppPath + 'Include;' + ;
gcAppPath + 'FERESTRE;' + ;
gcAppPath + 'GRAFICE;' + ;
gcAppPath + 'CLASE;' + ;
gcAppPath + 'MENIURI;' + ;
gcAppPath + 'PROGRAME;' + ;
gcAppPath + 'RAPOARTE;' + ;
gcAppPath + 'COMUN\CLASE;' + ;
gcAppPath + 'COMUN\FERESTRE;' + ;
gcAppPath + 'COMUN\PROGRAME;' + ;
gcAppPath + 'COMUN\GRAFICE;' + ;
gcAppPath + 'COMUN\RAPOARTE;' + ;
gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + ;
gcAppPath + 'COMUN\UTILE\TESTE;' + ;
ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\]
SET PATH TO &lcPath ADDITIVE
*CLASE - sincron cu Programe\roaregistratura.prg
SET CLASSLIB TO clase\roaregistratura ADDITIVE
SET CLASSLIB TO CAUT ADDITIVE
SET CLASSLIB TO ooptiuni ADDITIVE
SET CLASSLIB TO registry ADDITIVE
SET CLASSLIB TO decabaza ADDITIVE
SET CLASSLIB TO cauta_alfa_forms ADDITIVE
SET CLASSLIB TO ferestre_oracle ADDITIVE
SET CLASSLIB TO caut_ora ADDITIVE
SET CLASSLIB TO ferestre_registratura ADDITIVE
SET CLASSLIB TO onomenclatoare ADDITIVE
SET CLASSLIB TO Messagebox ADDITIVE
SET CLASSLIB TO otoolbar ADDITIVE
SET CLASSLIB TO ferestre_cere_date ADDITIVE
SET CLASSLIB TO orapoarte_comun ADDITIVE
SET CLASSLIB TO onom_articole ADDITIVE
SET CLASSLIB TO serii_numere.vcx ADDITIVE
SET CLASSLIB TO ferestre_atasamente.vcx ADDITIVE
SET CLASSLIB TO wwdialogs.vcx ADDITIVE
SET CLASSLIB TO appwiz.vcx ADDITIVE
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET CLASSLIB TO ofundal_registratura.vcx ADDITIVE
*PROCEDURI - sincron cu Programe\roaregistratura.prg
SET PROCEDURE TO quitapp ADDITIVE
SET PROCEDURE TO init_program ADDITIVE
SET PROCEDURE TO oproceduri_comune ADDITIVE
SET PROCEDURE TO gencursor.prg ADDITIVE
SET PROCEDURE TO update_nomenclator.prg ADDITIVE
SET PROCEDURE TO onomenclatoare ADDITIVE
SET PROCEDURE TO oproceduri_ams ADDITIVE
SET PROCEDURE TO ocautare ADDITIVE
SET PROCEDURE TO oinit_optiuni ADDITIVE
SET PROCEDURE TO osecurity ADDITIVE
SET PROCEDURE TO oproceduri_roaregistratura ADDITIVE
SET PROCEDURE TO acces_meniu ADDITIVE
SET PROCEDURE TO oheader ADDITIVE
SET PROCEDURE TO oparteneri_contracte ADDITIVE
SET PROCEDURE TO oproceduri_maintenance.prg ADDITIVE
SET PROCEDURE TO cauta_alfa ADDITIVE
SET PROCEDURE TO ini.prg ADDITIVE
SET PROCEDURE TO oserii_numere ADDITIVE
SET PROCEDURE TO oproceduri_atasamente ADDITIVE
SET PROCEDURE TO oexport.prg ADDITIVE
SET PROCEDURE TO iniacces.prg ADDITIVE
SET PROCEDURE TO filebringer.prg ADDITIVE
SET PROCEDURE TO log_mesaje.prg ADDITIVE
SET PROCEDURE TO wwutils.prg ADDITIVE && ShortPath() folosit de Log_Mesaje.Init
DECLARE INTEGER GetPrivateProfileString IN WIN32API ;
STRING, STRING, STRING, STRING @, INTEGER, STRING
DECLARE INTEGER WritePrivateProfileString IN Win32Api ;
STRING, STRING, STRING, STRING
DECLARE INTEGER PathFileExists IN shlwapi STRING pszPath
PUBLIC poLog, goLog, goApp
poLog = NEWOBJECT("Log_Mesaje","Log_Mesaje.prg")
goLog = poLog
goApp = CREATEOBJECT("wzApplication")
DIRGEN = [D:\ROA\]
gcBasePath = DIRGEN
gcGeneralIniFile = DIRGEN + "settings.ini"
gcSettingsFile = m.gcGeneralIniFile
gcTempPath = ADDBS(SYS(2023)) + gcS + [\]
IF !DIRECTORY(gcTempPath)
MD (gcTempPath)
ENDIF
PUBLIC gnHandle, goExecutor, goConn, goFirma, goCalendar
gnHandle = 0
goExecutor = CREATEOBJECT("oExecutor")
goConn = CREATEOBJECT("oConn")
goConn.Connect(m.tcHost, m.tcSchema, m.tcPassword)
IF m.gnHandle <= 0
RETURN .F.
ENDIF
LOCAL llSucces, lcSql
goFirma = NULL
llSucces = goExecutor.oExecuta("select * from syn_v_nom_firme where schema = ?gcS", "cFirma")
IF m.llSucces
SELECT cFirma
gnIdFirma = id_firma
gcFirma = ALLTRIM(firma)
SCATTER NAME goFirma
ELSE
goFirma = CREATEOBJECT('custom')
goFirma.AddProperty('cod_fiscal', '')
goFirma.AddProperty('schema', m.gcS)
goFirma.AddProperty('firma', m.gcS)
ENDIF
USE IN (SELECT('cFirma'))
CREATE CURSOR dual (dummy c(10))
INSERT INTO dual (dummy) VALUES ("")
* sesiune Oracle (pachetele pot lipsi din unele scheme - nu oprim initul)
lcSql = [begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.setluna(?gnLuna); pack_sesiune.setan(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
* variabilele globale ale aplicatiei folosite de fluxul registratura
PUBLIC poReg, goRegistratura, podg_dg, podg_referinte, podg_obs, podg_link, goFundal
STORE '' TO poReg, goRegistratura
RETURN .T.

View File

@@ -0,0 +1,168 @@
* test_registratura_adaugare.prg
* Test headless: fluxul de ADAUGARE document in registratura + salvarea datelor generale.
* Reproduce si bugul cunoscut: modifica_reg_dg cu partener NULL (P2 din
* docs\analiza_registratura_adaugare_editare.md). Dupa implementarea gardei (M1),
* pasul 3 trebuie sa devina un refuz elegant (mesaj + return), nu eroare de executie.
* Rulare: vfp9.exe -A -T "D:\ROA\ROAREGISTRATURA\Teste\test_registratura_adaugare.prg"
* Log: D:\ROA\ROAREGISTRATURA\Teste\log_test_adaugare.txt
* ATENTIE: ruleaza DOAR pe schema de test (CENTRAL/MARIUSM_AUTO). Documentul de test
* este sters (soft-delete) la final prin pack_registratura.sterge_registratura.
SET SAFETY OFF
SET TALK OFF
* mock amessagebox PRIMUL in lista de proceduri (la nume duplicat castiga PRIMUL - testare-ui-vfp.md cap. j)
SET PROCEDURE TO D:\ROA\ROAREGISTRATURA\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
PUBLIC gnMockRaspuns
gnMockRaspuns = 6
PUBLIC gcTestLog
gcTestLog = 'D:\ROA\ROAREGISTRATURA\Teste\log_test_adaugare.txt'
STRTOFILE('=== test_registratura_adaugare ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO tlog WITH '*** EROARE ' + TRANSFORM(ERROR()) + ': ' + MESSAGE() + ;
' | ' + MESSAGE(1) + ' | prg=' + PROGRAM() + ' lin=' + TRANSFORM(LINENO())
DO tlog WITH 'Init mediu...'
DO D:\ROA\ROAREGISTRATURA\Teste\test_init_env_registratura.prg
IF TYPE('gnHandle') # 'N' OR gnHandle <= 0
DO tlog WITH 'ESEC conectare - STOP'
DO tfinal
ENDIF
DO tlog WITH 'Conectat, schema=' + gcS
* 0) cursorul listei + goRegistratura
DO viz_registratura IN oproceduri_roaregistratura.prg
IF !USED('cRegistratura')
DO tlog WITH 'ESEC: nu exista cursorul cRegistratura - STOP'
DO tfinal
ENDIF
SELECT cRegistratura
LOCAL lnInregInitial
lnInregInitial = RECCOUNT()
SCATTER NAME goRegistratura MEMO BLANK
DO tlog WITH 'Inregistrari initiale: ' + TRANSFORM(lnInregInitial)
* 1) alocare numar intern (seria 10, ca in ct_registratura.do_adauga)
DO tlog WITH '--- Pas 1: alocare numar intern (seria 10)'
LOCAL loGeneratorNumere, lcNumarIntern
loGeneratorNumere = CREATEOBJECT('oGeneratorNumere')
loGeneratorNumere.creeaza_cursor_serii(10)
lcNumarIntern = ALLTRIM(STR(loGeneratorNumere.aloca_numar(10)))
DO tlog WITH 'Numar intern alocat: ' + lcNumarIntern
* 2) adaugare document gol (pack_registratura.adauga_registratura)
DO tlog WITH '--- Pas 2: adauga_registratura'
LOCAL lnId_reg
lnId_reg = 0
lnId_reg = adauga_registratura('cRegistratura', lcNumarIntern)
IF EMPTY(lnId_reg)
DO tlog WITH 'ESEC: adauga_registratura a intors ' + TRANSFORM(lnId_reg) + ;
' (pack_registratura lipseste din schema de test?) - STOP curat, nimic de sters'
DO tfinal
ENDIF
DO tlog WITH 'OK document adaugat, id_reg=' + TRANSFORM(lnId_reg)
* pozitionare pe documentul nou + goRegistratura
DO viz_registratura IN oproceduri_roaregistratura.prg
SELECT cRegistratura
LOCATE FOR id_reg = lnId_reg
IF !FOUND()
DO tlog WITH 'ESEC: documentul nou nu apare in vregistratura'
ELSE
SCATTER NAME goRegistratura MEMO
DO tlog WITH 'Document nou gasit: nr_intern=' + TRANSFORM(NVL(numar_intern,'')) + ;
' id_part=' + TRANSFORM(goRegistratura.id_part)
ENDIF
* 3) salvare cu partener NULL - reproduce bugul P2
* (astazi: eroare "Invalid use of NULL"/sql NULL; dupa fix M1: mesaj + refuz)
DO tlog WITH '--- Pas 3: modifica_reg_dg cu id_part NULL (se asteapta refuz/eroare)'
goRegistratura.descriere = 'TEST AUTOMAT - nu folositi'
DO modifica_reg_dg WITH goRegistratura IN oproceduri_roaregistratura.prg
DO tlog WITH 'Pas 3 incheiat (vezi mai sus daca a fost eroare de executie = bug P2 nereparat)'
* 4) salvare cu partener valid (refolosesc un partener din alt document existent)
DO tlog WITH '--- Pas 4: modifica_reg_dg cu partener valid'
LOCAL llSucces
llSucces = goExecutor.oExecuta( ;
"select id_part, denumire from vregistratura where id_part is not null and rownum = 1", 'cPartTest')
IF llSucces AND USED('cPartTest') AND RECCOUNT('cPartTest') > 0
SELECT cPartTest
goRegistratura.id_part = id_part
goRegistratura.denumire = denumire
USE IN cPartTest
goRegistratura.data = DATE()
goRegistratura.numar = 'TST-' + lcNumarIntern
goRegistratura.ie = 1
goRegistratura.nr_pag = 1
DO modifica_reg_dg WITH goRegistratura IN oproceduri_roaregistratura.prg
* verificare: datele au ajuns in baza
DO viz_registratura IN oproceduri_roaregistratura.prg
SELECT cRegistratura
LOCATE FOR id_reg = lnId_reg
IF FOUND() AND !ISNULL(id_part) AND ALLTRIM(NVL(numar,'')) == 'TST-' + lcNumarIntern
DO tlog WITH 'OK salvare reusita: partener=' + TRANSFORM(NVL(denumire,'')) + ;
' numar=' + TRANSFORM(NVL(numar,''))
ELSE
DO tlog WITH 'ESEC verificare: documentul nu are datele asteptate dupa salvare'
ENDIF
ELSE
DO tlog WITH 'SKIP Pas 4: nu exista niciun partener in vregistratura pe schema de test'
ENDIF
* 5) EDITAREA documentului (fluxul Modifica -> Salveaza): modific campuri si re-salvez
DO tlog WITH '--- Pas 5: editare document (modificare descriere/nr_pag/data + re-salvare)'
SELECT cRegistratura
LOCATE FOR id_reg = lnId_reg
IF FOUND() AND !ISNULL(id_part)
SCATTER NAME goRegistratura MEMO
goRegistratura.descriere = 'TEST AUTOMAT - EDITAT'
goRegistratura.nr_pag = 5
goRegistratura.data = DATE() - 1
goRegistratura.ie = 2
DO modifica_reg_dg WITH goRegistratura IN oproceduri_roaregistratura.prg
* verificare: modificarile au ajuns in baza
DO viz_registratura IN oproceduri_roaregistratura.prg
SELECT cRegistratura
LOCATE FOR id_reg = lnId_reg
IF FOUND() AND ALLTRIM(NVL(descriere,'')) == 'TEST AUTOMAT - EDITAT' ;
AND NVL(nr_pag,0) = 5 AND ie = 2
DO tlog WITH 'OK editare reusita: descriere=' + TRANSFORM(NVL(descriere,'')) + ;
' nr_pag=' + TRANSFORM(NVL(nr_pag,0)) + ' ie=' + TRANSFORM(ie) + ;
' data=' + TRANSFORM(data)
ELSE
DO tlog WITH 'ESEC verificare editare: documentul nu are valorile modificate'
ENDIF
ELSE
DO tlog WITH 'SKIP Pas 5: documentul de test nu are partener (Pas 4 esuat/sarit)'
ENDIF
* 6) curatenie: soft-delete documentul de test
DO tlog WITH '--- Pas 6: stergere document de test'
LOCAL lcSql, lnSucces
lcSql = [begin pack_registratura.sterge_registratura(] + ALLTRIM(STR(lnId_reg)) + ;
[,] + ALLTRIM(STR(gnIdUtil)) + [); end;]
lnSucces = goExecutor.oExecute(lcSql)
IF lnSucces < 0
DO tlog WITH 'ATENTIE: stergerea a esuat: ' + TRANSFORM(goExecutor.cEroare) + ;
' - stergeti manual id_reg=' + TRANSFORM(lnId_reg)
ELSE
DO tlog WITH 'OK document de test sters (soft-delete), id_reg=' + TRANSFORM(lnId_reg)
ENDIF
DO tlog WITH '=== FINAL test_registratura_adaugare'
DO tfinal
PROCEDURE tlog
LPARAMETERS tcMsg
STRTOFILE(TRANSFORM(tcMsg) + CHR(13)+CHR(10), gcTestLog, 1)
ENDPROC
PROCEDURE tfinal
ON ERROR
CLOSE ALL
QUIT
ENDPROC

View File

@@ -0,0 +1,111 @@
* test_registratura_form.prg
* Test headless: incarcarea listei documentelor (viz_registratura) + instantierea
* containerului ct_registratura pe un form ascuns (verifica clase/cursoare/grid).
* Rulare: vfp9.exe -A -T "D:\ROA\ROAREGISTRATURA\Teste\test_registratura_form.prg"
* Log: D:\ROA\ROAREGISTRATURA\Teste\log_test_form.txt
SET SAFETY OFF
SET TALK OFF
* mock amessagebox PRIMUL in lista de proceduri (la nume duplicat castiga PRIMUL - testare-ui-vfp.md cap. j)
SET PROCEDURE TO D:\ROA\ROAREGISTRATURA\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
PUBLIC gnMockRaspuns
gnMockRaspuns = 6
PUBLIC gcTestLog
gcTestLog = 'D:\ROA\ROAREGISTRATURA\Teste\log_test_form.txt'
STRTOFILE('=== test_registratura_form ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO tlog WITH '*** EROARE ' + TRANSFORM(ERROR()) + ': ' + MESSAGE() + ;
' | ' + MESSAGE(1) + ' | prg=' + PROGRAM() + ' lin=' + TRANSFORM(LINENO())
DO tlog WITH 'Init mediu...'
DO D:\ROA\ROAREGISTRATURA\Teste\test_init_env_registratura.prg
IF TYPE('gnHandle') # 'N' OR gnHandle <= 0
DO tlog WITH 'ESEC conectare (gnHandle=' + TRANSFORM(IIF(TYPE('gnHandle')='N',gnHandle,-999)) + ') - STOP'
DO tfinal
ENDIF
DO tlog WITH 'Conectat, gnHandle=' + TRANSFORM(gnHandle) + ' schema=' + gcS
* 1) incarcarea cursorului listei
DO tlog WITH '--- Test 1: viz_registratura'
DO viz_registratura IN oproceduri_roaregistratura.prg
IF USED('cRegistratura')
SELECT cRegistratura
DO tlog WITH 'OK cursor cRegistratura, inregistrari=' + TRANSFORM(RECCOUNT())
IF RECCOUNT() > 0
GO BOTTOM
DO tlog WITH 'Ultimul document: id_reg=' + TRANSFORM(NVL(id_reg,0)) + ;
' nr_intern=' + TRANSFORM(NVL(numar_intern,'')) + ;
' data_intern=' + TRANSFORM(data_intern) + ;
' partener=' + TRANSFORM(NVL(denumire,''))
GO TOP
SCATTER NAME goRegistratura MEMO
ELSE
SCATTER NAME goRegistratura MEMO BLANK
ENDIF
ELSE
DO tlog WITH 'ESEC: cursorul cRegistratura NU exista'
ENDIF
* 2) instantierea containerului listei pe un form ascuns
DO tlog WITH '--- Test 2: instantiere ct_registratura pe form ascuns'
LOCAL loForm
loForm = CREATEOBJECT('Form')
loForm.Visible = .F.
loForm.Width = 810
loForm.Height = 420
loForm.AddObject('ct1', 'ct_registratura')
IF VARTYPE(loForm.ct1) = 'O'
DO tlog WITH 'OK ct_registratura instantiat; grid RecordSource=' + ;
loForm.ct1.grid_registratura.RecordSource + ;
' coloane=' + TRANSFORM(loForm.ct1.grid_registratura.ColumnCount) + ;
' font=' + loForm.ct1.grid_registratura.FontName + ;
' size=' + TRANSFORM(loForm.ct1.grid_registratura.FontSize)
DO tlog WITH 'Coloana1: font=' + loForm.ct1.grid_registratura.Columns(1).FontName + ;
' ' + TRANSFORM(loForm.ct1.grid_registratura.Columns(1).FontSize) + ;
' | header=' + loForm.ct1.grid_registratura.Columns(1).Header1.FontName + ;
' ' + TRANSFORM(loForm.ct1.grid_registratura.Columns(1).Header1.FontSize) + ;
' | text1=' + loForm.ct1.grid_registratura.Columns(1).Text1.FontName + ;
' ' + TRANSFORM(loForm.ct1.grid_registratura.Columns(1).Text1.FontSize)
loForm.ct1.Visible = .T.
DO tlog WITH 'nireg (contor afisat)=' + TRANSFORM(loForm.ct1.nireg)
ELSE
DO tlog WITH 'ESEC: ct_registratura NU s-a instantiat'
ENDIF
loForm.Release()
* 3) instantierea zonei partener/nr/data (ct_part_nr_data)
DO tlog WITH '--- Test 3: instantiere ct_part_nr_data'
loForm = CREATEOBJECT('Form')
loForm.Visible = .F.
loForm.AddObject('ct2', 'ct_part_nr_data')
IF VARTYPE(loForm.ct2) = 'O'
DO tlog WITH 'OK ct_part_nr_data; llock=' + TRANSFORM(loForm.ct2.llock) + ;
' buton="' + loForm.ct2.Command2.Caption + '"' + ;
' txtClient.ReadOnly=' + TRANSFORM(loForm.ct2.txtClient.ReadOnly) + ;
' font txtClient=' + loForm.ct2.txtClient.FontName + ;
' ' + TRANSFORM(loForm.ct2.txtClient.FontSize)
* deblocare/blocare campuri - nu ating baza
loForm.ct2.deblocheaza_campuri()
DO tlog WITH 'dupa deblocheaza_campuri: txtNumar.ReadOnly=' + TRANSFORM(loForm.ct2.txtNumar.ReadOnly)
loForm.ct2.blocheaza_campuri()
DO tlog WITH 'dupa blocheaza_campuri: txtNumar.ReadOnly=' + TRANSFORM(loForm.ct2.txtNumar.ReadOnly)
ELSE
DO tlog WITH 'ESEC: ct_part_nr_data NU s-a instantiat'
ENDIF
loForm.Release()
DO tlog WITH '=== FINAL test_registratura_form'
DO tfinal
PROCEDURE tlog
LPARAMETERS tcMsg
STRTOFILE(TRANSFORM(tcMsg) + CHR(13)+CHR(10), gcTestLog, 1)
ENDPROC
PROCEDURE tfinal
ON ERROR
CLOSE ALL
QUIT
ENDPROC

View File

@@ -0,0 +1,193 @@
* test_registratura_ui.prg
* Test UI VIZUAL (harness + screenshots): fluxul REAL al utilizatorului in fereastra
* principala (Ferestre\fundal.scx) - lista documentelor, adaugare cu intrare directa
* in editare (M3), fara prompt de salvare la bara laterala (M2), refuz elegant la
* partener NULL (M1/M2), salvare + editare reala, filtrul "ultimul document" (M4),
* fonturi Arial 10 (M5).
* Rulare cu capturi:
* powershell -File COMUN\utile\Teste\vfp_ui_harness.ps1 -TestPrg Teste\test_registratura_ui.prg ^
* -Steps @('lista','adaugare_editare_directa','bara_fara_prompt','salvare_fara_partener','salvare_cu_partener','editare','lista_ultimul')
* Log: Teste\test_registratura_ui_log.txt ; PNG: Teste\screenshots\
* ATENTIE: doar pe schema de test (CENTRAL/MARIUSM_AUTO); documentul de test se sterge la final.
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog, gcSyncDir, gnMockRaspuns, gnPass, gnFail
gcUILog = 'D:\ROA\ROAREGISTRATURA\Teste\test_registratura_ui_log.txt'
gcSyncDir = 'D:\ROA\ROAREGISTRATURA\Teste\uisync\'
IF !DIRECTORY(gcSyncDir)
MD (gcSyncDir)
ENDIF
STORE 0 TO gnPass, gnFail
gnMockRaspuns = 6
* mock amessagebox PRIMUL in lista de proceduri (la nume duplicat castiga PRIMUL)
SET PROCEDURE TO D:\ROA\ROAREGISTRATURA\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE
SET PROCEDURE TO D:\ROA\ROAREGISTRATURA\COMUN\utile\Teste\ui_harness.prg ADDITIVE
STRTOFILE('=== test_registratura_ui ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
ON ERROR DO HarnessLog WITH '*** EROARE ' + TRANSFORM(ERROR()) + ': ' + MESSAGE() + ;
' | ' + MESSAGE(1) + ' | prg=' + PROGRAM() + ' lin=' + TRANSFORM(LINENO())
DO HarnessLog WITH 'Init mediu...'
DO D:\ROA\ROAREGISTRATURA\Teste\test_init_env_registratura.prg
IF TYPE('gnHandle') # 'N' OR gnHandle <= 0
DO HarnessLog WITH 'ESEC conectare - STOP'
DO HarnessDone WITH 'esec_conectare'
QUIT
ENDIF
DO HarnessLog WITH 'Conectat, schema=' + gcS
* globale suplimentare cerute de fundal.scx / Show
PUBLIC gcUserNameApp, primadata, goCw, goHelp, oTool
gcUserNameApp = 'MARIUS M'
primadata = .T.
STORE '' TO goCw, goHelp, oTool
* ------------- Pas 0: fereastra principala + lista (M4: doar ultimul document)
DO viz_registratura IN oproceduri_roaregistratura.prg
* NOSHOW: ocolesc Form.Show -> arata_meniu_fluna -> start_firma (init de aplicatie, nu de test);
* Visible=.T. afiseaza formularul FARA sa ruleze metoda Show suprascrisa.
DO FORM D:\ROA\ROAREGISTRATURA\Ferestre\fundal.scx NAME goFundal LINKED NOSHOW
goFundal._pgfrmbase1.Page2.Ct_registratura1.do_initializeaza_cursor()
goFundal.Visible = .T.
goFundal.WindowState = 2
goFundal._pgfrmbase1.ActivePage = 2
DO verif WITH USED('cRegistratura') AND RECCOUNT('cRegistratura') = 1, ;
'M4: lista initiala contine DOAR ultimul document (reccount=' + TRANSFORM(RECCOUNT('cRegistratura')) + ')'
SELECT cRegistratura
GO TOP
SCATTER NAME goRegistratura MEMO
DO HarnessLog WITH 'Ultimul document afisat: id_reg=' + TRANSFORM(NVL(id_reg,0))
LOCAL loGrid
loGrid = goFundal._pgfrmbase1.Page2.Ct_registratura1.grid_registratura
DO verif WITH loGrid.FontName == 'Arial' AND loGrid.FontSize = 10, ;
'M5: grid font=' + loGrid.FontName + ' ' + TRANSFORM(loGrid.FontSize)
DO verif WITH loGrid.Columns(1).FontName == 'Arial' AND loGrid.Columns(1).FontSize = 10, ;
'M5: coloana1 font=' + loGrid.Columns(1).FontName + ' ' + TRANSFORM(loGrid.Columns(1).FontSize)
DO verif WITH loGrid.Columns(1).Header1.FontName == 'Arial' AND loGrid.Columns(1).Header1.FontSize = 10, ;
'M5: header1 font=' + loGrid.Columns(1).Header1.FontName + ' ' + TRANSFORM(loGrid.Columns(1).Header1.FontSize)
DO HarnessStep WITH 0, 'lista: doar ultimul document, fonturi Arial 10'
* ------------- Pas 1: adaugare -> intra DIRECT in editare (M3)
LOCAL lnId_reg, loPnd
goFundal._pgfrmbase1.Page2.Ct_registratura1.But_nou1.Click()
lnId_reg = goRegistratura.id_reg
loPnd = goFundal._pgfrmbase1.Page3.ct_part_nr_data1
DO verif WITH goFundal._pgfrmbase1.ActivePage = 3, ;
'M3: dupa adaugare s-a comutat pe Page3 (ActivePage=' + TRANSFORM(goFundal._pgfrmbase1.ActivePage) + ')'
DO verif WITH !loPnd.llock, 'M3: documentul nou este DIRECT in editare (llock=' + TRANSFORM(loPnd.llock) + ')'
DO verif WITH loPnd.Command2.Caption == 'Salveaza', ;
'M3: butonul arata "Salveaza" (caption=' + loPnd.Command2.Caption + ')'
DO verif WITH !EMPTY(lnId_reg), 'Adaugare: id_reg nou=' + TRANSFORM(NVL(lnId_reg,0))
DO verif WITH loPnd.txtClient.FontName == 'Arial' AND loPnd.txtClient.FontSize = 10, ;
'M5: txtClient font=' + loPnd.txtClient.FontName + ' ' + TRANSFORM(loPnd.txtClient.FontSize)
DO HarnessStep WITH 1, 'adaugare: direct in editare, buton Salveaza'
* ------------- Pas 2: click pe bara laterala cu partener NULL -> FARA prompt de salvare (M2)
LOCAL lcLogInainte
lcLogInainte = FILETOSTR(gcUILog)
goFundal._pgfrmbase1.Page3.ct_date_generale1.outlook2003bar1.Panel.button3.Click()
LOCAL lcLogNou
lcLogNou = SUBSTR(FILETOSTR(gcUILog), LEN(lcLogInainte) + 1)
DO verif WITH !('Doriti sa salvati' $ lcLogNou), ;
'M2: barei laterale NU i-a aparut promptul "Doriti sa salvati..." cu partener NULL'
DO verif WITH !loPnd.llock, 'M2: raman in editare dupa click pe bara (llock=' + TRANSFORM(loPnd.llock) + ')'
DO HarnessStep WITH 2, 'bara laterala: fara prompt, raman in editare'
* ------------- Pas 3: Salveaza cu partener NULL -> refuz elegant (M1/M2)
lcLogInainte = FILETOSTR(gcUILog)
loPnd.Command2.Click()
lcLogNou = SUBSTR(FILETOSTR(gcUILog), LEN(lcLogInainte) + 1)
DO verif WITH ('Alegeti partenerul' $ lcLogNou), 'M2: mesaj "Alegeti partenerul!" la salvare fara partener'
DO verif WITH !loPnd.llock AND loPnd.Command2.Caption == 'Salveaza', ;
'M2: campurile raman DEBLOCATE dupa refuz (llock=' + TRANSFORM(loPnd.llock) + ', caption=' + loPnd.Command2.Caption + ')'
DO HarnessStep WITH 3, 'salvare fara partener: refuz, raman in editare'
* ------------- Pas 4: aleg partener + Salveaza -> salvare reusita (M1/M2)
LOCAL llSucces
llSucces = goExecutor.oExecuta( ;
"select id_part, denumire from vregistratura where id_part is not null and rownum = 1", 'cPartTest')
IF llSucces AND USED('cPartTest') AND RECCOUNT('cPartTest') > 0
SELECT cPartTest
goRegistratura.id_part = id_part
goRegistratura.denumire = denumire
USE IN cPartTest
goRegistratura.data = DATE()
goRegistratura.numar = 'TSTUI'
goRegistratura.descriere = 'TEST UI AUTOMAT'
goRegistratura.nr_pag = 1
loPnd.Refresh()
loPnd.Command2.Click()
DO verif WITH loPnd.llock AND loPnd.Command2.Caption == 'Modifica', ;
'M2: dupa salvare campurile sunt blocate (llock=' + TRANSFORM(loPnd.llock) + ', caption=' + loPnd.Command2.Caption + ')'
* verificare in baza
llSucces = goExecutor.oExecuta("select numar, descriere from vregistratura where id_reg = " + ;
ALLTRIM(STR(lnId_reg)), 'cVerif')
IF llSucces AND USED('cVerif') AND RECCOUNT('cVerif') > 0
SELECT cVerif
DO verif WITH ALLTRIM(NVL(numar,'')) == 'TSTUI', ;
'M1: salvarea a ajuns in baza (numar=' + TRANSFORM(NVL(numar,'')) + ')'
USE IN cVerif
ELSE
DO verif WITH .F., 'verificare in baza dupa salvare'
ENDIF
ELSE
DO HarnessLog WITH 'SKIP Pas 4: niciun partener disponibil pe schema de test'
ENDIF
DO HarnessStep WITH 4, 'salvare cu partener: reusita, campuri blocate'
* ------------- Pas 5: editare (Modifica -> schimb descriere -> Salveaza)
loPnd.Command2.Click() && Modifica -> deblocare
DO verif WITH !loPnd.llock, 'Editare: campuri deblocate (llock=' + TRANSFORM(loPnd.llock) + ')'
goRegistratura.descriere = 'TEST UI AUTOMAT - EDITAT'
goRegistratura.nr_pag = 3
loPnd.Command2.Click() && Salveaza
llSucces = goExecutor.oExecuta("select descriere, nr_pag from vregistratura where id_reg = " + ;
ALLTRIM(STR(lnId_reg)), 'cVerif2')
IF llSucces AND USED('cVerif2') AND RECCOUNT('cVerif2') > 0
SELECT cVerif2
DO verif WITH ALLTRIM(NVL(descriere,'')) == 'TEST UI AUTOMAT - EDITAT' AND NVL(nr_pag,0) = 3, ;
'Editare: modificarile au ajuns in baza (descriere=' + ALLTRIM(NVL(descriere,'')) + ', nr_pag=' + TRANSFORM(NVL(nr_pag,0)) + ')'
USE IN cVerif2
ELSE
DO verif WITH .F., 'verificare in baza dupa editare'
ENDIF
DO HarnessStep WITH 5, 'editare document: re-salvare verificata in baza'
* ------------- Pas 6: inapoi pe lista -> tot ultimul document (M4 pe do_cauta/Page2.Activate)
goFundal._pgfrmbase1.ActivePage = 2
DO verif WITH RECCOUNT('cRegistratura') = 1, ;
'M4: revenirea pe lista pastreaza filtrul ultimului document (reccount=' + TRANSFORM(RECCOUNT('cRegistratura')) + ')'
SELECT cRegistratura
GO TOP
DO verif WITH id_reg = lnId_reg, 'M4: ultimul document afisat este cel de test (id_reg=' + TRANSFORM(id_reg) + ')'
DO HarnessStep WITH 6, 'lista dupa: doar documentul de test'
* ------------- curatenie
LOCAL lcSql, lnSucces
lcSql = [begin pack_registratura.sterge_registratura(] + ALLTRIM(STR(lnId_reg)) + ;
[,] + ALLTRIM(STR(gnIdUtil)) + [); end;]
lnSucces = goExecutor.oExecute(lcSql)
DO HarnessLog WITH IIF(lnSucces < 0, ;
'ATENTIE: stergerea documentului de test a esuat - stergeti manual id_reg=' + TRANSFORM(lnId_reg), ;
'Curatenie OK: document de test sters (soft-delete), id_reg=' + TRANSFORM(lnId_reg))
DO HarnessLog WITH '=== REZULTAT: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail)
DO HarnessDone WITH IIF(gnFail = 0, 'done', 'fail')
ON ERROR
CLOSE ALL
QUIT
PROCEDURE verif
LPARAMETERS tlOk, tcMsg
IF tlOk
gnPass = gnPass + 1
DO HarnessLog WITH 'PASS: ' + tcMsg
ELSE
gnFail = gnFail + 1
DO HarnessLog WITH 'FAIL: ' + tcMsg
ENDIF
ENDPROC

View File

@@ -1,4 +1,27 @@
<!--
23/07/2026
ROAREGISTRATURA - 2.0.5
:modificare:
Registratura - adaugare/editare documente:
- Dupa "Adauga", documentul nou intra DIRECT in editare (butonul arata "Salveaza"),
fara pasul suplimentar "Modifica"; s-a eliminat mesajul eronat "Toate modificarile au efect imediat!".
- Salvarea unui document fara partener ales nu mai produce eroare: apare mesajul
"Alegeti partenerul!" iar campurile raman deblocate pentru completare.
- Navigarea in bara laterala (Date generale / Referinte / Observatii / Documente atasate)
nu mai declanseaza promptul "Doriti sa salvati modificarile facute?" cand documentul nou
nu are inca partener; se ramane in editare.
- Butonul "Salveaza" valideaza partenerul si salveaza INAINTE de blocarea campurilor.
:modificare:
Lista documentelor se deschide pozitionata pe ULTIMUL document inregistrat (nu se mai
incarca toata baza la deschidere); incarcarea completa se face doar la cautare explicita.
:modificare:
Fonturile din lista documentelor, datele documentului si nomenclatorul de parteneri au fost
uniformizate la Arial 10 (rebazare pe clasele comune; eliminat "Arial Narrow").
-->
<!--
27/02/2014
ROAREGISTRATURA - 2.0.4

View File

@@ -0,0 +1,165 @@
# 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.