* test_storno_e2e.prg * Test E2E HEADLESS pentru "Generare XML storno si trimitere la ANAF" din borderoul eFactura: * exerseaza codul REAL din anaf_efactura.vcx (metoda do_storno_efactura + clasa * frm_storno_efactura), nu copii ale lui. Vezi docs\handoff_storno_efactura.md. * * Ruleaza direct pe binarul real din proiect (COMUN\CLASE\anaf_efactura.vcx, cu write-back): * vfp9.exe -A -T "...\test_storno_e2e.prg" * * ZERO trimiteri ANAF: Thisform.oAnaf.AnafeFacturaServer e inlocuit cu MockAnafServerStorno * (mock_anaf_server_storno.prg) imediat dupa ce forma reala citeste cCodFiscal/lTest de la * serverul real. cmdValideaza (ValidareEFacturaANAF, apel HTTP real, hardcodat /prod/ - * xmlefactura.prg:1275,1278) NU e apelat; se ocoleste cu SetStare(1) direct. 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, gcTestDir, gcTesteDir PUBLIC gnPass, gnFail, gnMockRaspuns, gnAmsgCalls, gnMockApeluri PUBLIC loAnaf, loForm, loMockSrv, loStornoForm, lnLastErrorNo, lcLastErrorMsg DECLARE gaAmsgCalls[1,2] DECLARE gaMockApeluri[1,3] gnPass = 0 gnFail = 0 gnAmsgCalls = 0 gnMockApeluri = 0 gnMockRaspuns = 6 lnLastErrorNo = 0 lcLastErrorMsg = '' gcTestDir = ADDBS(JUSTPATH(SYS(16))) gcTesteDir = ADDBS(JUSTPATH(JUSTPATH(SYS(16)))) gcUILog = gcTestDir + 'test_storno_e2e_log_real.txt' STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT * mock-urile INAINTEA test_init_env_auto: la nume duplicat de procedura castiga fisierul * cautat PRIMUL (vezi mock_amessagebox.prg / capcana testare-ui-vfp.md) SET PROCEDURE TO (gcTestDir + 'mock_amessagebox_storno.prg') ADDITIVE SET PROCEDURE TO (gcTestDir + 'mock_anaf_server_storno.prg') ADDITIVE TRY DO (gcTesteDir + 'test_init_env_auto.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) + ' gcS=' + gcS * gnId_Prg_Owner: setat de roacont.prg la pornirea reala a aplicatiei (=0). test_init_env_auto.prg * NU il seteaza pentru ROACONT - do_storno_efactura il foloseste direct (is_luna_blocata), * fara TYPE()-check => "variable not found" daca lipseste (capcana de mediu, nu bug de aplicatie). PUBLIC gnId_Prg_Owner gnId_Prg_Owner = 0 * gnEFACTURA_*/gcEFACTURA_*: memvari globale create dinamic de optiuni_firma() (oinit_optiuni.prg, * apelata din ocomenzi.vc2:6675 la login real) din tabela de optiuni (v_optiuni, macro-substitutie * PUBLIC gn&lcvarname.). test_init_env_auto.prg:290 apeleaza ACELASI loader - nu setez manual, * doar diagnostichez ce a produs, pentru cele 11 legate de controale in pgfeFactura.Page4 * (vc2:4952-5201). LOCAL i, laEFVars[11], lcEFDiag laEFVars[1] = 'gnEFACTURA_ZIP_DATABASE' laEFVars[2] = 'gnEFACTURA_SAVE' laEFVars[3] = 'gnEFACTURA_SAVE_ANAF_PDF' laEFVars[4] = 'gnEFACTURA_VALIDARE_ONLINE' laEFVars[5] = 'gcEFACTURA_NETWORK_PATH' laEFVars[6] = 'gcEFACTURA_RESPONSESPATH' laEFVars[7] = 'gcEFACTURA_SAVE_CLIENTI_FILE' laEFVars[8] = 'gcEFACTURA_SAVE_CLIENTI_PATH' laEFVars[9] = 'gcEFACTURA_SAVE_FURNIZORI_FILE' laEFVars[10] = 'gcEFACTURA_SAVE_FURNIZORI_PATH' laEFVars[11] = 'gcEFACTURA_SERVER_PATH' FOR i = 1 TO 11 lcEFDiag = laEFVars[i] + '=TYPE[' + TYPE(laEFVars[i]) + ']' IF TYPE(laEFVars[i]) != 'U' lcEFDiag = lcEFDiag + ' val=[' + TRANSFORM(EVALUATE(laEFVars[i])) + ']' ENDIF DO PrLogLocal WITH lcEFDiag ENDFOR *========================================================================= DO PrLogLocal WITH '=== PAS 0: sursa reala MARIUSM_AUTO.anaf_vefactura_trimis id=1127 (FACTURA TRIMISA) ===' LOCAL lnIdSursa, lnTestSursa, ldDataSursa, llLunaBlocataDiag lnIdSursa = 0 * numar_act/data_act nu exista pe tabela anaf_efactura (are xnumar_act/xdata_act) - doar pe * view-ul anaf_vefactura_trimis (verificat cu DESC pe MARIUSM_AUTO@ROA_CENTRAL). IF !goExecutor.oExecuta("select id, numar_act, data_act, test, tip_mesaj_raspuns from anaf_vefactura_trimis where id = 1127", "cSursa") DO PrLogLocal WITH 'FAIL: select sursa id=1127: ' + ALLTRIM(NVL(goExecutor.cEroare,'')) QUIT ENDIF IF RECCOUNT('cSursa') = 0 DO PrLogLocal WITH 'FAIL: id=1127 nu exista in MARIUSM_AUTO.anaf_vefactura_trimis' QUIT ENDIF SELECT cSursa lnIdSursa = id lnTestSursa = NVL(test, 0) ldDataSursa = data_act DO PrLogLocal WITH 'sursa: id=' + TRANSFORM(lnIdSursa) + ' numar=[' + ALLTRIM(NVL(numar_act, '')) + '] data=' + DTOC(ldDataSursa) + ' test=' + TRANSFORM(lnTestSursa) + ' tip_mesaj=' + ALLTRIM(NVL(tip_mesaj_raspuns, '')) USE IN (SELECT('cSursa')) llLunaBlocataDiag = IS_LUNA_BLOCATA(gcS, gnId_Prg_Owner, YEAR(ldDataSursa), MONTH(ldDataSursa)) DO PrLogLocal WITH 'diagnostic is_luna_blocata(' + TRANSFORM(YEAR(ldDataSursa)) + '/' + TRANSFORM(MONTH(ldDataSursa)) + ')=' + TRANSFORM(llLunaBlocataDiag) + ' (informativ - daca e .T., formularul de storno nu va aparea deloc)' *========================================================================= DO PrLogLocal WITH '=== PAS 1: cursoarele borderoului (copie fluxul real ANAFeFactura.vizeFactura, anaf_efactura.prg:2867+) ===' PUBLIC poFacturiEmise, poFacturiPrimite, poFacturiTrimise, poFacturiDetalii LOCAL lcData1, lcSchema, lcSelect, lcFiltru, lcFiltruOriginal, lcOrder, lcgroup, llModParam, llAfiseaza lcData1 = '01' + PADL(INT(gnLuna), 2, '0') + ALLTRIM(STR(gnAn)) * FACTURI PRIMITE (goale - nu sunt necesare pentru storno, dar cursorul trebuie sa existe: * lipsa lui a lasat formularul cu controale incomplete intr-o sesiune anterioara - vezi * testare-ui-vfp.md, capcana j) TEXT TO lcSchema NOSHOW ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), id_incarcare C(36), id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4), descriere M null, detalii_plata M null, diferenta N(16,4), procesat N(1), tip_persoana N(1) null, descarcat N(1) null, filepath c(250) null, procesat_server N(1) null, creditnote N(1) ENDTEXT TEXT TO lcSelect NOSHOW SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, decode(creditnote,0,1,-1) * NVL(total_cu_tva, 0.00)-NVL(jtotctva, 0.00) as diferenta, procesat, tip_persoana, descarcat, filepath, procesat_server, creditnote FROM anaf_vefactura_primit ENDTEXT lcOrder = [data_act,numar_act,data_raspuns] lcgroup = [] lcFiltru = [1=2] lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. gencursor('poFacturiPrimite', 'crsFacturiPrimite', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal) poFacturiPrimite.ca_baza1.afisare() SELECT crsFacturiPrimite GO TOP * FACTURI TRIMISE - filtru tintit pe sursa reala (id=1127), nu pe luna curenta TEXT TO lcSchema NOSHOW ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xfurnizor C(200), xclient C(200), id_incarcare C(36), id_descarcare c(36) null, mesaj_trimis C(250) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, trimis N(1) null, data_trimis T null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, total_fara_tva N(16,4), total_tva N(16,4), total_tva_ron N(16,4), total_cu_tva N(16,4), discount_fara_tva N(16,4), taxe_fara_tva N(16,4), valoare_fara_tva N(16,4), total_de_plata N(16,4), nume_valuta C(5), test N(1) null, jtotctva N(16,4), descriere M null, detalii_plata M null, diferenta N(16,4), procesat N(1), tip_persoana N(1) null, descarcat N(1) null, filepath c(250) null, procesat_server N(1) null, creditnote N(1) ENDTEXT TEXT TO lcSelect NOSHOW SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, id_incarcare, id_descarcare, mesaj_trimis, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, decode(creditnote,0,1,-1) * NVL(total_cu_tva, 0.00)-NVL(jtotctva, 0.00) as diferenta, procesat, tip_persoana, descarcat, filepath, procesat_server, creditnote FROM anaf_vefactura_trimis ENDTEXT lcOrder = [data_act,numar_act,data_trimis,data_raspuns] lcgroup = [] lcFiltru = [id = 1127] lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. gencursor('poFacturiTrimise', 'crsFacturiTrimise', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal) poFacturiTrimise.ca_baza1.afisare() SELECT crsFacturiTrimise GO TOP DO TVerdict WITH RECCOUNT('crsFacturiTrimise') = 1 AND NVL(crsFacturiTrimise.Id, 0) = lnIdSursa, 'PRECONDITIE crsFacturiTrimise populat cu id=1127 (flux real gencursor)', 'reccount=' + TRANSFORM(RECCOUNT('crsFacturiTrimise')) + ' id curent=' + TRANSFORM(NVL(crsFacturiTrimise.Id, 0)) * FACTURI EMISE (goale) TEXT TO lcSchema NOSHOW ales N(1), id N(20), id_fact N(20), id_vanzare N(10), data_act D, numar_act N(14), in_valuta N(1) null, curs N(10,4) null, valval N(16,2), tvaval N(16,2),totval N(16,2), total_fara_tva N(16,2), total_tva N(16,2), total_cu_tva N(16,2), nume_valuta C(5) null, client C(100), id_client N(10), cod_fiscal C(30), tip_persoana N(1) null, trimis N(1) null, data_trimis T null, stare C(100) null, id_incarcare C(36) null, mesaj_trimis C(250) null, id_descarcare c(36) null, tip_mesaj_raspuns C(50) null,mesaj_raspuns C(250) null, data_raspuns D null, cod_fiscal_emitent C(30) null, cod_fiscal_beneficiar C(30) null, detalii M null, xfurnizor C(200), xclient C(200), xdata_act D, xnumar_act C(30), xtotal_fara_tva N(16,4), xtotal_tva N(16,4), xtotal_tva_ron N(16,4), xtotal_cu_tva N(16,4), xdiscount_fara_tva N(16,4), xtaxe_fara_tva N(16,4), xvaloare_fara_tva N(16,4), xtotal_de_plata N(16,4), xnume_valuta C(5), test N(1) null, id_util N(10), utilizator C(100), jtotctva N(16,4), diferenta N(16,4), procesat N(1), procesat_server N(1), creditnote N(1) ENDTEXT TEXT TO lcSelect NOSHOW SELECT 0 as ales, id, id_fact, id_vanzare, data_act, numar_act, in_valuta, curs, valval, tvaval, totval, total_fara_tva, total_tva,total_cu_tva, nume_valuta, client, id_client, cod_fiscal, NVL(tip_persoana,1) as tip_persoana, NVL(trimis,0) as trimis, data_trimis, stare, id_incarcare, mesaj_trimis, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, xfurnizor, xclient, xdata_act, xnumar_act, xtotal_fara_tva, xtotal_tva, xtotal_tva_ron, xtotal_cu_tva, xdiscount_fara_tva, xtaxe_fara_tva, xvaloare_fara_tva, xtotal_de_plata, xnume_valuta, test, id_util, utilizator, jtotctva, decode(creditnote,0,1,-1) * ROUND(NVL(xtotal_cu_tva , 0.00) * decode(in_valuta,1,curs,1), 2)-NVL(jtotctva, 0.00) as diferenta, procesat, procesat_server,creditnote FROM anaf_vefactura_emis ENDTEXT lcOrder = [data_act,numar_act] lcgroup = [] lcFiltru = [1=2] lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. gencursor('poFacturiEmise', 'crsFacturiEmise', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal) poFacturiEmise.ca_baza1.afisare() * DETALII (goale) TEXT TO lcSchema NOSHOW id N(20), id_efactura N(20), nr N(5), articol V(250), descriere V(250), detalii M, cantitate N(18,6), um V(20), pret N(20,6), proctva N(7,2), valoarefaratva N(20,6), discountfaratva N(20,6) ENDTEXT TEXT TO lcSelect NOSHOW select id, id_efactura, nr, articol, descriere, detalii, cantitate, um, pret, proctva, valoarefaratva, discountfaratva from anaf_vefactura_detalii ENDTEXT lcOrder = [nr] lcgroup = [] lcFiltru = [1=2] lcFiltruOriginal = [] llModParam = .T. llAfiseaza = .F. gencursor('poFacturiDetalii', 'crsDetaliiFacturi', lcSelect, lcFiltru, lcSchema, lcOrder, llAfiseaza, lcgroup, llModParam, lcFiltruOriginal) poFacturiDetalii.ca_baza1.afisare() *========================================================================= DO PrLogLocal WITH '=== PAS 2: forma REALA anaf_efactura (modeless) + mock pe AnafeFacturaServer ===' LOCAL lcCifReal loAnaf = CREATEOBJECT('ANAFeFactura') lcCifReal = ALLTRIM(loAnaf.AnafeFacturaServer.cCodFiscal) DO PrLogLocal WITH 'AnafeFacturaServer real (INAINTE de inlocuire): cCodFiscal=[' + lcCifReal + '] lTest=' + TRANSFORM(loAnaf.AnafeFacturaServer.lTest) loMockSrv = NEWOBJECT('MockAnafServerStorno', gcTestDir + 'mock_anaf_server_storno.prg') loMockSrv.cCodFiscal = lcCifReal loMockSrv.lTest = (lnTestSursa = 1) loAnaf.AnafeFacturaServer = loMockSrv DO PrLogLocal WITH 'AnafeFacturaServer INLOCUIT cu MockAnafServerStorno (ZERO retea): cCodFiscal=[' + loAnaf.AnafeFacturaServer.cCodFiscal + '] lTest=' + TRANSFORM(loAnaf.AnafeFacturaServer.lTest) + ' Class=' + loAnaf.AnafeFacturaServer.Class CATCH TO loExOuter DO PrLogLocal WITH 'EXCEPTIE NEPRINSA: ' + loExOuter.Message + ' (' + TRANSFORM(loExOuter.LineNo) + ') ' + loExOuter.Procedure gnFail = gnFail + 1 DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) QUIT ENDTRY * ABATERE: instantiat prin frmtest_anaf.scx (subclasa goala peste anaf_efactura.vcx, stub de test, * vezi frmtest_anaf.sc2 in acest folder) in loc de CREATEOBJECT direct pe clasa din .vcx - sfatul * lui Marius: instantierea prin forma .scx arata calea COMPLETA a controlului in mesajul de eroare, * nu doar numele de baza "_checkbox1". Afara din orice TRY, ca eroarea sa treaca prin ON ERROR * (logata cu AERROR, executia continua) in loc sa opreasca testul. * CREATEOBJECT('form1', ) a dat "Class definition FORM1 is not found" - .scx foloseste alt * mecanism de incarcare decat .vcx; DO FORM e calea nativa pentru clase de forma. DO FORM (gcTestDir + 'frmtest_anaf.scx') NAME loForm NOSHOW WITH loAnaf IF VARTYPE(loForm) != 'O' DO PrLogLocal WITH 'FAIL: DO FORM frmtest_anaf nu a returnat obiect, VARTYPE=' + VARTYPE(loForm) QUIT ENDIF DO PrLogLocal WITH 'loForm creat dupa eroarea 177 (abatere de mediu, consemnata): VARTYPE=O, Class=' + loForm.Class TRY DO PrLogLocal WITH 'ClassLibrary anaf_efactura = implicit, via SET CLASSLIB (COMUN\CLASE\anaf_efactura.vcx, binar real cu write-back)' * ABATERE: loForm.Show() NU se apeleaza (nu e necesar - do_storno_efactura foloseste doar * Thisform.oAnaf si crsFacturiTrimise). loForm.WindowType = 0 DO PrLogLocal WITH 'BORDEROU creat (nu afisat - vezi abaterea de mai sus): Class=' + loForm.Class *========================================================================= DO PrLogLocal WITH '=== PAS 3: driver Timer pe _SCREEN (Show(1) in do_storno_efactura e modal si pompeaza mesaje Windows) ===' IF TYPE('_SCREEN.tmrDrvStorno') = 'U' _SCREEN.ADDOBJECT('tmrDrvStorno', 'Timer') ENDIF _SCREEN.tmrDrvStorno.Interval = 200 PUBLIC loDriverStorno loDriverStorno = CREATEOBJECT('DriverStorno') BINDEVENT(_SCREEN.tmrDrvStorno, 'Timer', loDriverStorno, 'Executa') _SCREEN.tmrDrvStorno.Enabled = .T. DO PrLogLocal WITH '=== PAS 4: This.do_storno_efactura() - exact ce apeleaza optiunea de meniu 10 (anaf_efactura.vc2:5829) ===' DO PrLogLocal WITH 'ON(ERROR) inainte de do_storno_efactura: [' + ON('ERROR') + ']' loForm.do_storno_efactura() _SCREEN.tmrDrvStorno.Enabled = .F. TRY UNBINDEVENTS(_SCREEN.tmrDrvStorno) CATCH ENDTRY DO TVerdict WITH loDriverStorno.lDone, 'driverul a ajuns la final (a tratat forma de storno pana la capat)', 'nState final=' + TRANSFORM(loDriverStorno.nState) + ' tick-uri=' + TRANSFORM(loDriverStorno.nTicks) LOCAL i IF !loDriverStorno.lDone OR loDriverStorno.nState < 4 FOR i = 1 TO gnAmsgCalls DO PrLogLocal WITH 'AMESSAGEBOX vazut: [' + gaAmsgCalls[i, 1] + '] -> ' + TRANSFORM(gaAmsgCalls[i, 2]) ENDFOR ENDIF DO PrLogLocal WITH 'TOTAL apeluri mock server: ' + TRANSFORM(gnMockApeluri) FOR i = 1 TO gnMockApeluri DO PrLogLocal WITH ' mock[' + TRANSFORM(i) + '] ' + gaMockApeluri[i, 1] + ' | ' + gaMockApeluri[i, 2] + ' | ' + gaMockApeluri[i, 3] ENDFOR TRY loForm.Release() CATCH ENDTRY DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) CATCH TO loExOuter DO PrLogLocal WITH 'EXCEPTIE NEPRINSA: ' + loExOuter.Message + ' (' + TRANSFORM(loExOuter.LineNo) + ') ' + loExOuter.Procedure gnFail = gnFail + 1 DO PrLogLocal WITH 'REZULTAT FINAL: PASS=' + TRANSFORM(gnPass) + ' FAIL=' + TRANSFORM(gnFail) ENDTRY QUIT ********************************************************** PROCEDURE TVerdict LPARAMETERS tlCond, tcLabel, tcDetaliu IF tlCond gnPass = gnPass + 1 DO PrLogLocal WITH 'PASS ' + tcLabel + ' | ' + TRANSFORM(tcDetaliu) ELSE gnFail = gnFail + 1 DO PrLogLocal WITH 'FAIL ' + tcLabel + ' | ' + TRANSFORM(tcDetaliu) ENDIF ENDPROC ********************************************************** PROCEDURE PrLogLocal LPARAMETERS tcMsg LOCAL lcL SET SAFETY OFF lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '') STRTOFILE(lcL + TTOC(DATETIME()) + ' ' + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog) ENDPROC ********************************************************** PROCEDURE PrErrLocal LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo LOCAL laErrDetail[1], i, lcDetail lnLastErrorNo = tnError lcLastErrorMsg = TRANSFORM(tcMessage) DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo) AERROR(laErrDetail) lcDetail = '' FOR i = 1 TO ALEN(laErrDetail, 1) lcDetail = lcDetail + TRANSFORM(i) + '=[' + TRANSFORM(NVL(laErrDetail[i], '')) + '] ' ENDFOR DO PrLogLocal WITH 'AERROR: ' + lcDetail ENDPROC ********************************************************** FUNCTION ExistaApelMock LPARAMETERS tcMetoda LOCAL i FOR i = 1 TO gnMockApeluri IF gaMockApeluri[i, 1] == tcMetoda RETURN .T. ENDIF ENDFOR RETURN .F. ENDFUNC ********************************************************** * Driver pentru dialogul modal Show(1) al frm_storno_efactura (deschis din interiorul * do_storno_efactura). Vezi COMUN\docs\testare-ui-vfp.md, sectiunea "Dialoguri modale (Show(1))", * varianta B: Timer pe _SCREEN, detectie prin _SCREEN.Forms (nu _SCREEN.ActiveForm - nu merge * headless). DEFINE CLASS DriverStorno AS Custom nState = 0 nTicks = 0 lDone = .F. PROCEDURE Executa LOCAL loStorno, i, llRet LOCAL loExD This.nTicks = This.nTicks + 1 IF This.nTicks = 1 DO PrLogLocal WITH 'ON(ERROR) in interiorul DriverStorno.Executa (primul tick): [' + ON('ERROR') + ']' ENDIF TRY DO CASE CASE This.nState = 0 loStorno = .NULL. FOR i = 1 TO _SCREEN.FormCount IF UPPER(_SCREEN.Forms(i).Class) == 'FRM_STORNO_EFACTURA' loStorno = _SCREEN.Forms(i) EXIT ENDIF ENDFOR IF ISNULL(loStorno) IF This.nTicks > 150 DO PrLogLocal WITH 'DRIVER FAIL: frm_storno_efactura nu a aparut in ~30s (nState=0)' gnFail = gnFail + 1 This.lDone = .T. _SCREEN.tmrDrvStorno.Enabled = .F. ENDIF RETURN ENDIF loStornoForm = loStorno DO PrLogLocal WITH 'DRIVER: frm_storno_efactura gasita dupa ' + TRANSFORM(This.nTicks) + ' tick-uri, Class=' + loStorno.Class DO TVerdict WITH lnLastErrorNo = 0, 'fara eroare pana la afisarea formei stornului', 'lnLastErrorNo=' + TRANSFORM(lnLastErrorNo) + ' [' + lcLastErrorMsg + ']' DO TVerdict WITH RECCOUNT('crsStornoDetalii') > 0, 'grid crsStornoDetalii populat', 'reccount=' + TRANSFORM(RECCOUNT('crsStornoDetalii')) DO TVerdict WITH 'TEST' $ UPPER(loStorno.Caption), 'Caption contine TEST', 'caption=[' + loStorno.Caption + ']' DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'NEVALIDAT', 'stare initiala Nevalidat', 'stare=[' + loStorno.lblStare.Caption + ']' DO TVerdict WITH FILE(loStorno.pcFisierStorno), 'fisier storno exista pe disc', 'fisier=[' + loStorno.pcFisierStorno + ']' This.nState = 1 CASE This.nState = 1 loStorno = loStornoForm loStorno.pcNumarNou = ALLTRIM(loStorno.pcNumarNou) + 'X' loStorno.pcMotiv = 'Motiv test E2E' llRet = loStorno.RegenereazaXml() DO TVerdict WITH llRet, 'RegenereazaXml dupa schimbare numar/motiv', 'numarnou=[' + loStorno.pcNumarNou + '] return=' + TRANSFORM(llRet) DO TVerdict WITH RECCOUNT('crsStornoDetalii') > 0, 'grid populat dupa regenerare', 'reccount=' + TRANSFORM(RECCOUNT('crsStornoDetalii')) This.nState = 2 CASE This.nState = 2 loStorno = loStornoForm loStorno.SetStare(1) DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'VALID', 'SetStare(1) -> Valid (ocolire ValidareEFacturaANAF, retea reala, cf. instructiuni)', 'stare=[' + loStorno.lblStare.Caption + ']' loStorno.cmdTrimite.Click() DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'TRIMIS', 'dupa cmdTrimite.Click -> Trimis', 'stare=[' + loStorno.lblStare.Caption + ']' DO TVerdict WITH ExistaApelMock('TrimiteFacturaXML'), 'mock a primit TrimiteFacturaXML', '' This.nState = 3 CASE This.nState = 3 loStorno = loStornoForm TRY loStorno.Release() CATCH TO loExD DO PrLogLocal WITH 'DRIVER: eroare la Release: ' + loExD.Message ENDTRY This.lDone = .T. This.nState = 4 _SCREEN.tmrDrvStorno.Enabled = .F. ENDCASE CATCH TO loExD DO PrLogLocal WITH 'DRIVER EXCEPTIE nState=' + TRANSFORM(This.nState) + ': ' + loExD.Message + ' linia ' + TRANSFORM(loExD.LineNo) gnFail = gnFail + 1 This.lDone = .T. _SCREEN.tmrDrvStorno.Enabled = .F. TRY loStornoForm.Release() CATCH ENDTRY ENDTRY ENDPROC ENDDEFINE