Teste headless: verificare ANAF la alegerea clientului cu contract activ

Harness ROAACNPRO-specific (gcAppPath propriu, spre deosebire de test_init_env_auto.prg
care e fixat pe ROACONT), shadow pentru cauta_alfa() si testul care reproduce/confirma
label-ul ANAF pe caut_client_contract_activ(), plus repro pentru scoping-ul gresit al
lui poDate in do_cauta_partener (Thisform.poDate vs poDate PRIVATE).
This commit is contained in:
2026-08-03 08:13:16 +03:00
parent 71f661092d
commit 6aebd474fc
4 changed files with 537 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
* mock_cauta_alfa_anaf_label.prg - inlocuieste DOAR PROCEDURE cauta_alfa (COMUN\programe\cauta_alfa.prg,
* linia 16), la fel ca mock_cauta_alfa_dialog.prg (vezi acolo motivatia completa: CursorFill() cere
* conexiune reala, Show() modal blocheaza headless). Aici NU se simuleaza alegerea unui rand -
* scopul e sa verifice DOAR daca label-ul ANAF (lb_anaf, anaf_verif_cautare din ocautare.prg) e
* activat de apelantul real (caut_partener / caut_client_contract_activ), replicand liniile 211-220
* din cauta_alfa.prg (poVerifAlegere.Activeaza/Dezactiveaza), fara sa mai deschida formularul.
*
* Trebuie incarcat PRIMUL (inaintea "SET PROCEDURE TO cauta_alfa ADDITIVE" din test_init_env_auto.prg) -
* la nume duplicat de procedura VFP foloseste fisierul incarcat PRIMUL.
*
* Control test: goDlgTest - formularul REAL cauta_alfa_form, PRE-CONSTRUIT in scriptul principal
* (capcana l, docs/testare-ui-vfp.md: CREATEOBJECT dintr-o procedura intoarce obiect stricat headless).
* Rezultat expus: gcTestAnafActivat, gcTestAnafLabelType, gcTestAnafLabelVisible, gcTestAnafLabelCaption
Procedure cauta_alfa
Parameters tcselect,tcfiltru,tcschema,tcorder,tccoloana,tcTitlu,tcTitluColoane, ;
tcNume_Proc,tl_AllInList,tcFiltruOriginal,tcPrimaColoana, tnPornire, tnTipReturn, ;
tcIdColumn, tlDesktop, tcGroup, tcGridDynamicBackColor, tcGridToolTip, tlModParam, tcStringCriterii, ;
tcProceduraVerifica, tcProceduraCopiaza,tcLocate
LOCAL oForm_cautare, oReturnScattObj
oForm_cautare = goDlgTest
gcTestDiag = 'Type(tlVerificaANAF)=' + TYPE('tlVerificaANAF') + ' val=' + TRANSFORM(IIF(TYPE('tlVerificaANAF')='L', tlVerificaANAF, '?')) + ;
' Type(tdDataDoc)=' + TYPE('tdDataDoc') + ' Type(poVerifAlegere)=' + TYPE('poVerifAlegere') + ;
' Type(lnNivelANAF)=' + TYPE('lnNivelANAF')
gcTestAnafActivat = .F.
gcTestAnafLabelType = 'N/A (poVerifAlegere neinstantiat)'
gcTestAnafLabelVisible = .F.
gcTestAnafLabelCaption = ''
IF TYPE('poVerifAlegere') = 'O' AND !ISNULL(poVerifAlegere)
gcTestAnafActivat = .T.
ADDPROPERTY(oForm_cautare, 'oVerifAlegere', poVerifAlegere)
poVerifAlegere.Activeaza(oForm_cautare)
poVerifAlegere.VerificaRand(.T.)
gcTestAnafLabelType = TYPE('oForm_cautare.lb_anaf')
IF gcTestAnafLabelType == 'O'
gcTestAnafLabelVisible = oForm_cautare.lb_anaf.Visible
gcTestAnafLabelCaption = oForm_cautare.lb_anaf.Caption
ENDIF
poVerifAlegere.Dezactiveaza()
ENDIF
*-- raspuns minimal: butonul Renunta (testul verifica doar label-ul, nu alegerea unui rand)
gnButon = 0
SELECT (oForm_cautare.crs_cursor)
SCATTER NAME oReturnScattObj BLANK
RETURN oReturnScattObj
Endproc && cauta_alfa (shadow test - label ANAF)

View File

@@ -0,0 +1,271 @@
* test_init_env_auto_acnpro.prg
* Varianta ROAACNPRO a test_init_env_auto.prg (COMUN\utile\Teste): acela seteaza gcAppPath fix pe
* D:\ROA\ROACONT\ (harness scris pentru ROACONT), deci nu poate testa cod din COMUN\ asa cum e
* editat in checkout-ul ROAACNPRO (fiecare aplicatie are propriul working copy SVN al COMUN\).
* Identic altfel, minus class libs/proceduri specifice ROACONT (contabilitate) care nu exista sub
* ROAACNPRO\COMUN sau ROAACNPRO\Clase.
*
* Utilizare: DO test_init_env_auto_acnpro WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola'
* ATENTIE: mentine sincronizat cu test_init_env_auto.prg pentru partea comuna.
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 ''
PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, glEMama, gnIdFirma, gcCondSucursala, ;
gnIdSucursala, gcS, gcFirma, gcUserName, gcNumeProgram, gcAppName, glLunaInchisa, ;
buton, gnButon, pnButon, gl406, gcAcces
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
gcCondSucursala = []
gnIdSucursala = m.gnIdFirma
gcS = UPPER(ALLTRIM(tcSchema))
gcFirma = m.gcS
gcUserName = m.gcS
gcNumeProgram = [ROAACNPRO]
gcAppName = [ROAACNPRO]
glLunaInchisa = .F.
glEMama = .F.
gl406 = .F.
PUBLIC nror(65000)
buton = 1
gnButon = 1
pnButon = 1
LOCAL lcPath
PUBLIC gcAppPath, DIRGEN, gcBasePath, gcTempPath, gcGeneralIniFile, gcSettingsFile
gcAppPath = [D:\ROA\ROAACNPRO\]
Set Default To (gcAppPath)
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\CALENDAR;' + ;
gcAppPath + 'COMUN\UTILE\CTL32;' + ;
gcAppPath + 'COMUN\UTILE\HPDF;' + ;
gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
gcAppPath + 'COMUN\UTILE\WEB;' + ;
gcAppPath + 'COMUN\UTILE\NFJSON;' + ;
gcAppPath + 'COMUN\UTILE\NFXML;' + ;
gcAppPath + 'COMUN\UTILE\EXCEL;' + ;
gcAppPath + 'COMUN\UTILE\GRIDEXTRAS;' + ;
Addbs(Substr(gcAppPath,1,Rat([\],gcAppPath,2)))+[COMUNROA\]
SET PATH TO &lcPath ADDITIVE
Set Classlib To appwiz Additive
Set Classlib To CAUT Additive
Set Classlib To BAZA Additive
Set Classlib To comun Additive
Set Classlib To registry Additive
Set Classlib To cauta_alfa_forms.vcx Additive
Set Classlib To obalanta Additive
Set Classlib To ocriterii.vcx Additive
Set Classlib To ctl32_statusbar.vcx Additive
Set Classlib To ctl32_common.vcx Additive
Set Classlib To ctl32_structs.vcx Additive
Set Classlib To ctl32_progressbar.vcx Additive
Set Procedure To PROCEDURI Additive
Set Procedure To pmenu Additive
Set Procedure To proceduri_comune Additive
Set Procedure To mesaje Additive
Set Procedure To acces_meniu Additive
Set Procedure To quitapp Additive
Set Procedure To init_program Additive
Set Procedure To oproceduri_maintenance.PRG Additive
Set Procedure To gridproc Additive
Set Procedure To proceduri_excel Additive
Set Procedure To oserii_numere.PRG Additive
Set Procedure To cauta_alfa Additive
Set Procedure To oproceduri_parteneri Additive
Set Procedure To wwconfig Additive
Set Procedure To oexport Additive
SET PROCEDURE TO ocasabanca ADDITIVE
SET PROCEDURE TO importfromxlsx ADDITIVE
SET PROCEDURE TO appendfromxlsx.prg ADDITIVE
SET PROCEDURE TO overificari.prg ADDITIVE
SET PROCEDURE TO onomenclatoare.prg ADDITIVE
SET PROCEDURE TO excelxml.prg ADDITIVE
Set Classlib To DECABAZA Additive
Set Classlib To onomenclatoare Additive
Set Classlib To oparteneri Additive
Set Classlib To OCASABANCA Additive
Set Classlib To oCompensari Additive
Set Classlib To oRapoarte_cont Additive
Set Classlib To overificari Additive
Set Classlib To omodificari Additive
Set Classlib To ooptiuni Additive
Set Classlib To onote_contabile Additive
Set Classlib To odebcred Additive
Set Classlib To ferestre_oracle Additive
Set Classlib To caut_ora Additive
Set Classlib To otoolbar Additive
Set Classlib To serii_numere Additive
Set Classlib To anaf_efactura Additive
Set Classlib To Messagebox Additive
SET CLASSLIB TO wwdialogs ADDITIVE
SET CLASSLIB TO orapoarte.vcx additive
SET CLASSLIB TO accessibility.vcx ADDITIVE
SET CLASSLIB TO _calendar.vcx ADDITIVE
SET CLASSLIB TO orapoarte_comun.vcx ADDITIVE
Set Procedure To GENCURSOR.PRG Additive
Set Procedure To OPROCEDURI_COMUNE.PRG Additive
Set Procedure To OINIT_OPTIUNI.PRG Additive
Set Procedure To updateserver.PRG Additive
Set Procedure To oCompensari.PRG Additive
Set Procedure To oOperatii_comune.PRG Additive
Set Procedure To OPROCEDURI_aMS.PRG Additive
Set Procedure To oparteneri.PRG Additive
Set Procedure To orapoarte.PRG Additive
Set Procedure To ocautare Additive
Set Procedure To omeniu_initializari Additive
Set Procedure To osecurity Additive
Set Procedure To oheader Additive
Set Procedure To orefaceri Additive
Set Procedure To oproceduri_casademarcat Additive
Set Procedure To controllerecr Additive
Set Procedure To oproceduri_comune_imob.PRG Additive
Set Procedure To odocumente.PRG Additive
SET PROCEDURE TO orapoarte_dinamice.prg additive
SET PROCEDURE TO update_imob.prg ADDITIVE
Set Procedure To wwutils.PRG Additive
Set Procedure To wwxmlhttp.PRG Additive
Set Procedure To ini.PRG Additive
Set Procedure To regex.PRG Additive
Set Procedure To validare.PRG Additive
Set Procedure To oproceduri_evolutie Additive
Set Procedure To proceduri_rapoarte.PRG Additive
SET PROCEDURE TO anaf_efactura.prg ADDITIVE
SET PROCEDURE TO iniacces.prg ADDITIVE
SET PROCEDURE TO oupdate.prg additive
SET PROCEDURE TO procese.prg additive
SET PROCEDURE TO version.prg additive
SET PROCEDURE TO xmlaccess.prg additive
SET PROCEDURE TO xmlparser.prg additive
SET PROCEDURE TO filebringer.prg additive
SET PROCEDURE TO wwcodeupdate.prg additive
SET PROCEDURE TO wwhttp.prg ADDITIVE
SET PROCEDURE TO wwapi.prg ADDITIVE
Declare Integer GetPrivateProfileString In WIN32API ;
string, String, String, String @, Integer, String
Declare Integer WritePrivateProfileString In Win32Api ;
string, String, String, String
Declare Integer CopyFile In WIN32API ;
STRING lpExistingFileName, STRING lpNewFileName, INTEGER bFailIfExists
Declare Integer PathFileExists In shlwapi STRING pszPath
If Type('goApi') = 'U'
Public goApi
goApi = Newobject("wwAPI", "wwAPI.prg")
ENDIF
set procedure to oinit_optiuni.prg additive
set procedure to oproceduri_comune.prg additive
PUBLIC gnHandle, goExecutor, goConn, goFirma, goCalendar, poLog, goLog, goApp
DIRGEN = [D:\ROA\]
gcBasePath = dirgen
gcGeneralIniFile = DIRGEN + "settings.ini"
gcSettingsFile = m.gcGeneralIniFile
gcTempPath = Addbs(shortpath(goApi.GetTempPath())) + gcS + [\]
If !Directory(gcTempPath)
Md (gcTempPath)
Endif
gcAcces = [1;2;3;4;5;6;7;8;]
poLog = Newobject("Log_Mesaje","Log_Mesaje.prg")
goLog = poLog
goApp = Createobject("wzApplication")
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
gnIdSucursala = null
gcFirma = ALLTRIM(firma)
SCATTER NAME goFirma
IF TYPE('goFirma.codfiscalfro') = 'U'
ADDPROPERTY(goFirma, 'codfiscalfro', ALLTRIM(STRTRAN(ALLTRIM(NVL(goFirma.cod_fiscal, '')), 'RO', '')))
ENDIF
ELSE
goFirma = CREATEOBJECT('custom')
goFirma.addproperty('cod_fiscal', '')
goFirma.addproperty('schema', m.gcS)
goFirma.addproperty('firma', m.gcS)
goFirma.addproperty('codfiscalfro', '')
ENDIF
USE IN (SELECT('cFirma'))
goCalendar = null
llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = (select MAX(an*12+luna) FROM calendar)', 'cCalendar')
IF m.llSucces
SELECT cCalendar
GO TOP
IF EMPTY(m.tnAn)
gnAn = anul
gnLuna = luna
ENDIF
SCATTER NAME goCalendar
ENDIF
USE IN (SELECT('cCalendar'))
CREATE CURSOR dual (dummy c(10))
INSERT INTO dual (dummy) VALUES ("")
actualizeaza_optiuni()
Do optiuni_firma IN oinit_optiuni.prg
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)
lcSql = [begin pack_sesiune.setlunabal(?gnLuna); pack_sesiune.setanbal(?gnAn); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.SET_DATA_RON(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_sesiune.set_data_ron(?gcS); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]
llSucces = goExecutor.oExecuta(lcSql)
lcSql = [begin pack_contafin.set_id_firma(?gnIdFirma); end;]
llSucces = goExecutor.oExecuta(lcSql)
RETURN .T.

View File

@@ -0,0 +1,130 @@
* test_repro_anaf_label_client_contract.prg
* Reproduce raportul utilizatorului (Marius, 03.08.2026): la alegerea clientului pe factura
* (ROAACNPRO, frm_factura.do_cauta_partener), nu apare label-ul de verificare ANAF a codului
* fiscal, desi acesta a fost adaugat in COMUN (ocautare.prg: clasa anaf_verif_cautare, activata
* de caut_partener() prin parametrul tlVerificaANAF). Cauza: frm_factura foloseste in schimb
* caut_client_contract_activ() (ocautare.prg), care nu are deloc acest parametru.
*
* Testeaza DOAR mecanismul comun (caut_client_contract_activ + anaf_verif_cautare.Activeaza),
* nu UI-ul ROAACNPRO: inlocuieste cauta_alfa() cu un shadow (mock_cauta_alfa_anaf_label.prg) care
* replica liniile 211-220 din cauta_alfa.prg (poVerifAlegere.Activeaza/Dezactiveaza) pe un formular
* REAL cauta_alfa_form, PRE-CONSTRUIT in acest script (capcana l), fara sa mai deschida fereastra
* (Show() modal ar bloca headless). Foloseste un partener REAL din nom_parteneri, ca verificarea
* ANAF (goExecutor + serviciul ANAF/cache) sa ruleze pe fluxul real.
*
* Rulare: vfp9.exe -A -T "test_repro_anaf_label_client_contract.prg"
* Verdict in gcUILog. Ruleaza INAINTE de fix (astept gcTestAnafActivat=.F.) si DUPA fix (astept .T.
* + label populat), cu semnatura caut_client_contract_activ() ajustata mai jos (tlVerificaANAF).
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcUILog
gcUILog = "D:\ROA\ROAACNPRO\COMUN\utile\Teste\test_repro_anaf_label_client_contract_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
TRY
*-- shadow-ul TREBUIE incarcat PRIMUL, inainte ca test_init_env_auto sa incarce cauta_alfa real
SET PROCEDURE TO "D:\ROA\ROAACNPRO\COMUN\utile\Teste\mock_cauta_alfa_anaf_label.prg" ADDITIVE
DO PrLogLocal WITH 'shadow cauta_alfa incarcat'
PUBLIC gnButon
gnButon = 0
DO "D:\ROA\ROAACNPRO\COMUN\utile\Teste\test_init_env_auto_acnpro.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO PrLogLocal WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
QUIT
ENDIF
DO PrLogLocal WITH 'mediu initializat, gnHandle=' + TRANSFORM(gnHandle)
*-- un partener real, cu cod fiscal completat, pentru fluxul ANAF real
LOCAL lcSelPart, lnSuccesPart
IF USED('crsPartTest')
USE IN ('crsPartTest')
ENDIF
lcSelPart = "SELECT * FROM (SELECT id_part, denumire, cod_fiscal, tip_persoana FROM nom_parteneri " + ;
"WHERE sters = 0 AND inactiv = 0 AND cod_fiscal IS NOT NULL AND LENGTH(TRIM(cod_fiscal)) > 0 " + ;
"ORDER BY id_part) WHERE ROWNUM = 1"
lnSuccesPart = goExecutor.oExecute(lcSelPart, "crsPartTest")
IF lnSuccesPart < 0 OR RECCOUNT('crsPartTest') = 0
DO PrLogLocal WITH 'FAIL: nu am gasit niciun partener cu cod fiscal pentru test'
QUIT
ENDIF
SELECT crsPartTest
LOCAL lnIdPartTest, lcCodFiscalTest, lcDenumireTest
lnIdPartTest = id_part
lcCodFiscalTest = ALLTRIM(cod_fiscal)
lcDenumireTest = ALLTRIM(denumire)
USE IN ('crsPartTest')
DO PrLogLocal WITH 'partener test: id_part=' + TRANSFORM(lnIdPartTest) + ' cod_fiscal=' + lcCodFiscalTest + ' denumire=' + lcDenumireTest
*-- cursorul cu FORMA EXACTA produsa de caut_client_contract_activ (ocautare.prg ~4054-4060):
*-- id_ctr, id_part, denumire, cod_fiscal, data, numar, data_inceput, data_sfarsit, nr_zile_scadenta, tip_curs
LOCAL lcCurTest
lcCurTest = SYS(2015)
IF USED(lcCurTest)
USE IN (lcCurTest)
ENDIF
CREATE CURSOR (lcCurTest) (id_ctr N(10), id_part N(10), denumire C(100), cod_fiscal C(50), ;
data D, numar C(100), data_inceput D, data_sfarsit D, nr_zile_scadenta N(10), tip_curs N(10))
INSERT INTO (lcCurTest) (id_part, denumire, cod_fiscal) VALUES (lnIdPartTest, lcDenumireTest, lcCodFiscalTest)
GO TOP IN (lcCurTest)
*-- goDlgTest: formularul REAL cauta_alfa_form, PRE-CONSTRUIT aici (capcana l: CREATEOBJECT
*-- dintr-o procedura intoarce obiect stricat in acest runtime headless)
PUBLIC goDlgTest
goDlgTest = CREATEOBJECT('cauta_alfa_form', lcCurTest, '', ;
'Denumire,Cod fiscal,Contract,Data', 'denumire,cod_fiscal,numar,data', .F., 'denumire', 1)
goDlgTest.crs_cursor = lcCurTest
goDlgTest.WindowType = 0
DO PrLogLocal WITH 'goDlgTest construit (cauta_alfa_form real, cursor=' + lcCurTest + ')'
PUBLIC gcTestAnafActivat, gcTestAnafLabelType, gcTestAnafLabelVisible, gcTestAnafLabelCaption, gcTestDiag
*-- ================= apelul real testat =================
LOCAL loCauta
loCauta = caut_client_contract_activ('', 0, 0, .T., DATE())
DO PrLogLocal WITH 'caut_client_contract_activ() finalizat'
DO PrLogLocal WITH 'DIAG: ' + gcTestDiag
DO PrLogLocal WITH 'gcTestAnafActivat=' + TRANSFORM(gcTestAnafActivat) + ;
' gcTestAnafLabelType=' + gcTestAnafLabelType + ;
' gcTestAnafLabelVisible=' + TRANSFORM(gcTestAnafLabelVisible) + ;
' gcTestAnafLabelCaption=[' + gcTestAnafLabelCaption + ']'
IF gcTestAnafActivat AND gcTestAnafLabelType == 'O'
DO PrLogLocal WITH 'PASS: label-ul ANAF (lb_anaf) e creat si activat de caut_client_contract_activ'
ELSE
DO PrLogLocal WITH 'FAIL (asteptat inainte de fix): label-ul ANAF NU e creat - caut_client_contract_activ nu instantiaza poVerifAlegere'
ENDIF
DO PrLogLocal WITH 'GATA'
CATCH TO loExcMain
DO PrLogLocal WITH 'CATCH ErrorNo=' + TRANSFORM(loExcMain.ErrorNo) + ' Message=' + loExcMain.Message + ;
' Proc=' + loExcMain.Procedure + ' Line=' + TRANSFORM(loExcMain.LineNo) + ' [' + loExcMain.LineContents + ']'
ENDTRY
QUIT
PROCEDURE PrErrLocal
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO PrLogLocal WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
SET SAFETY OFF
LOCAL lcL
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog)
ENDPROC

View File

@@ -0,0 +1,84 @@
* test_repro_podate_unknown_member.prg
* Reproduce eroarea raportata de utilizator (03.08.2026): "Unknown member PODATE" in
* FRM_FACTURA.DO_CAUTA_PARTENER, la clic pe but_cautare_client, in fluxul FACTURA_ACN.
*
* Cauza: fix-ul anterior a scris "Thisform.poDate.dataact", dar poDate NU e proprietate a
* formularului - e variabila PRIVATE declarata in factura_acn() (proceduri_acnpro.prg:3072),
* vizibila fara calificator in toate metodele frm_factura (folosita bar asa in ~30 de locuri:
* oacnpro.vc2 liniile 7542,7719,7747,8059 etc). Thisform.poDate nu exista => "Unknown member".
*
* Testeaza DOAR mecanismul de scoping (fara sa instantieze tot frm_factura/crsCapFactura):
* replica exact contextul - o procedura apelanta declara PRIVATE poDate, apoi o subprocedura
* (analoaga cu metoda do_cauta_partener) foloseste expresia. Verifica intai ca varianta veche
* (Thisform.poDate) DA eroarea raportata, apoi ca varianta noua (poDate bare) NU da eroare.
*
* Rulare: vfp9.exe -A -T "test_repro_podate_unknown_member.prg"
SET SAFETY OFF
SET TALK OFF
PUBLIC gcUILog
gcUILog = "D:\ROA\ROAACNPRO\COMUN\utile\Teste\test_repro_podate_unknown_member_log.txt"
STRTOFILE("START" + CHR(13)+CHR(10), gcUILog)
DO test_apelant_factura_acn
QUIT
PROCEDURE test_apelant_factura_acn
*-- replica factura_acn(): PRIVATE poDate, ramane in scop pentru tot ce se apeleaza mai jos
PRIVATE poDate
poDate = CREATEOBJECT('Empty')
ADDPROPERTY(poDate, 'dataact', DATE())
*-- instantiez un obiect minimal, cu o metoda care replica STRICT do_cauta_partener
PUBLIC goFormTest
goFormTest = CREATEOBJECT('formtest_do_cauta_partener')
*-- varianta VECHE (bug reportat): Thisform.poDate - poDate nu e proprietate a obiectului
LOCAL lcRezVechi
lcRezVechi = goFormTest.do_cauta_partener_vechi()
DO PrLogLocal WITH 'VARIANTA VECHE (Thisform.poDate): ' + lcRezVechi
*-- varianta NOUA (fix aplicat): poDate bare, gasit ca PRIVATE in call stack
LOCAL lcRezNou
lcRezNou = goFormTest.do_cauta_partener_nou()
DO PrLogLocal WITH 'VARIANTA NOUA (poDate bare): ' + lcRezNou
DO PrLogLocal WITH 'GATA'
ENDPROC
DEFINE CLASS formtest_do_cauta_partener AS Form
PROCEDURE do_cauta_partener_vechi
LOCAL lcRes
lcRes = 'NEASTEPTAT: nu a aruncat eroare'
TRY
LOCAL ldDataTest
ldDataTest = Thisform.poDate.dataact
lcRes = 'NEASTEPTAT: Thisform.poDate.dataact a functionat, data=' + TRANSFORM(m.ldDataTest)
CATCH TO loExc
lcRes = 'EROARE REPRODUSA: ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message
ENDTRY
RETURN m.lcRes
ENDPROC
PROCEDURE do_cauta_partener_nou
LOCAL lcRes
lcRes = 'NEASTEPTAT: nu s-a putut evalua'
TRY
LOCAL ldDataTest
ldDataTest = poDate.dataact
lcRes = 'OK: poDate.dataact rezolvat, data=' + TRANSFORM(m.ldDataTest)
CATCH TO loExc
lcRes = 'FAIL: ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message
ENDTRY
RETURN m.lcRes
ENDPROC
ENDDEFINE
PROCEDURE PrLogLocal
LPARAMETERS tcMsg
LOCAL lcL
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcUILog)
ENDPROC