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

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