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

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

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

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

169 lines
6.5 KiB
Plaintext

* 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