Files
comun/utile/Teste/storno/test_storno_e2e.prg

473 lines
27 KiB
Plaintext

* 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. Valideaza() (ValidareEFacturaANAF, apel HTTP real, hardcodat /prod/ -
* xmlefactura.prg:1275,1278) NU e apelat; se ocoleste cu SetStare(1) direct. cmdTrimite.Click
* deschide XMENU, mockuit din coada gaXmenuQueue (mock_xmenu_storno.prg).
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, gnXmenuCalls, gnXmenuQueuePos, gnMockTrimiteMod
PUBLIC loAnaf, loForm, loMockSrv, loStornoForm, lnLastErrorNo, lcLastErrorMsg
DECLARE gaAmsgCalls[1,2]
DECLARE gaMockApeluri[1,3]
DECLARE gaXmenuCalls[1,2]
DECLARE gaXmenuQueue[1]
gnPass = 0
gnFail = 0
gnAmsgCalls = 0
gnMockApeluri = 0
gnMockRaspuns = 6
gnXmenuCalls = 0
gnXmenuQueuePos = 1
gaXmenuQueue[1] = 0
gnMockTrimiteMod = 0
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_xmenu_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', <scx>) 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 loStorno.lblStare.ForeColor == RGB(96,96,96), 'lblStare gri la Nevalidat', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
DO TVerdict WITH FILE(loStorno.pcFisierStorno), 'fisier storno exista pe disc', 'fisier=[' + loStorno.pcFisierStorno + ']'
DO PrLogLocal WITH 'grid coloane: ' + TRANSFORM(loStorno.grdModificari.cElement.Width) + '/' + TRANSFORM(loStorno.grdModificari.cOriginal.Width) + '/' + TRANSFORM(loStorno.grdModificari.cNou.Width) + ;
' controlsource: ' + loStorno.grdModificari.cElement.ControlSource + '|' + loStorno.grdModificari.cOriginal.ControlSource + '|' + loStorno.grdModificari.cNou.ControlSource
DO TVerdict WITH loStorno.grdModificari.cElement.Width = 330 AND loStorno.grdModificari.cOriginal.Width = 180 AND loStorno.grdModificari.cNou.Width = 180, 'latimi coloane grid (330/180/180)', ''
DO TVerdict WITH LOWER(loStorno.grdModificari.cElement.ControlSource) == 'crsstornodetalii.element' AND LOWER(loStorno.grdModificari.cOriginal.ControlSource) == 'crsstornodetalii.original' AND LOWER(loStorno.grdModificari.cNou.ControlSource) == 'crsstornodetalii.nou', 'controlsource coloane grid calificat', ''
* V(250) in loc de C(250) (fix Marius, cf. docs/storno_forma_ux_diff.md pct.12b) -
* sumele nu mai vin cu padding la dreapta, care le scotea vizual din coloana.
LOCAL lnPadFail, lcPadDetail
lnPadFail = 0
lcPadDetail = ''
SELECT crsStornoDetalii
SCAN
IF LEN(crsStornoDetalii.original) != LEN(ALLTRIM(crsStornoDetalii.original)) OR LEN(crsStornoDetalii.nou) != LEN(ALLTRIM(crsStornoDetalii.nou))
lnPadFail = lnPadFail + 1
lcPadDetail = lcPadDetail + 'rand=' + TRANSFORM(RECNO()) + ' original=[' + crsStornoDetalii.original + '] nou=[' + crsStornoDetalii.nou + '] '
ENDIF
ENDSCAN
DO TVerdict WITH lnPadFail = 0, 'fara padding pe original/nou (V(250), sumele nu mai ies din coloana)', 'randuri cu padding=' + TRANSFORM(lnPadFail) + ' ' + lcPadDetail
DO TVerdict WITH EMPTY(loStorno.txtMotiv.Value), 'txtMotiv fara apostrofuri la init', 'value=[' + TRANSFORM(loStorno.txtMotiv.Value) + ']'
* lblAvertisment gol -> ascuns si gridul muta in sus; nu gol -> vizibil pe pozitia initiala (invariant, indiferent de fixtura)
DO TVerdict WITH (EMPTY(loStorno.lblAvertisment.Caption) AND !loStorno.lblAvertisment.Visible AND loStorno.grdModificari.Top < 134) OR (!EMPTY(loStorno.lblAvertisment.Caption) AND loStorno.lblAvertisment.Visible AND loStorno.grdModificari.Top = 134), ;
'lblAvertisment gol -> ascuns si gridul mutat in sus', 'avertisment=[' + loStorno.lblAvertisment.Caption + '] vizibil=' + TRANSFORM(loStorno.lblAvertisment.Visible) + ' grid_top=' + TRANSFORM(loStorno.grdModificari.Top)
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 + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(0,128,0), 'lblStare verde la Valid', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
* renuntare la xmenu (0) -> cmdTrimite.Click nu schimba nimic, fara retea
gaXmenuQueue[1] = 0
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click()
DO TVerdict WITH UPPER(ALLTRIM(loStorno.lblStare.Caption)) == 'VALID', 'renuntare xmenu -> starea nu se schimba', 'stare=[' + loStorno.lblStare.Caption + ']'
* eroare ANAF clara (HTTP 200, Cod 1814) - fara "TEST TEST" dublat, fara "Verificati in Trimise" (raspuns primit)
gnMockTrimiteMod = 1
gaXmenuQueue[1] = 2
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click()
DO TVerdict WITH loStorno.pnStare = 0, 'eroare ANAF clara -> starea ramane Nevalidat/eroare, nu Trimis', 'pnStare=' + TRANSFORM(loStorno.pnStare)
DO TVerdict WITH !('TEST TEST' $ loStorno.lblStare.Caption), 'fara TEST TEST dublat in mesaj', 'caption=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH 'Cod: 1814' $ loStorno.lblStare.Caption AND 'TEST ANAF a respins incarcarea' $ loStorno.lblStare.Caption AND !('in Trimise' $ loStorno.lblStare.Caption), 'eroare ANAF clara (200) -> fara indemn Verificati in Trimise', 'caption=[' + loStorno.lblStare.Caption + ']'
* eroare de retea (HTTP 0, raspuns neclar) - Verificati in Trimise ramane
gnMockTrimiteMod = 2
gaXmenuQueue[1] = 2
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click()
DO TVerdict WITH 'in Trimise' $ loStorno.lblStare.Caption, 'eroare de retea (status<>200) -> pastreaza indemnul Verificati in Trimise', 'caption=[' + loStorno.lblStare.Caption + ']'
* optiunea 2 (trimite fara validare, cf. instructiuni: fara Valideaza/retea reala)
gnMockTrimiteMod = 0
gaXmenuQueue[1] = 2
gnXmenuQueuePos = 1
loStorno.cmdTrimite.Click()
DO TVerdict WITH loStorno.pnStare = 2, 'dupa cmdTrimite.Click (xmenu=2) -> Trimis', 'pnStare=' + TRANSFORM(loStorno.pnStare) + ' caption=[' + loStorno.lblStare.Caption + ']'
DO TVerdict WITH loStorno.lblStare.ForeColor == RGB(0,64,160), 'lblStare albastru la Trimis', 'forecolor=' + TRANSFORM(loStorno.lblStare.ForeColor)
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