TODO 21: perioade TVA la verificarea codurilor fiscale + diacritice ANAF
- validare.prg: cele 7 campuri de perioada (inregistrare TVA, TVA la incasare, inactivare/reactivare) duse din raspunsul ANAF pana in cVerificareCod - validare.prg: AnafDecodeResponseText - raspunsul HTTP se citeste din responseBody prin ADODB.Stream cu Charset utf-8, cu cadere inapoi pe comportamentul vechi; repara diacriticele pierdute la marshalling-ul COM al lui responseText - oproceduri_comune.prg: perioadele in mesajul de detalii; fix id_part N(16), data D in crsXMLParteneriVerificare (Insert Into esua tacit, lista ramanea goala) - overificari.vc2: 7 coloane noi in grid, dublu-click pe Denumire/Cod fiscal deschide fisa partenerului, captionuri corectate in "inregistrare TVA" - oparteneri / ofacturare_comun / onomenclatoare: id_part in SELECT-urile care alimenteaza verificarea - teste headless noi: utile/Teste/test_todo21_perioade_anaf.prg, utile/Teste/todo21/ Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GztNyTRxjHqBg5kyNMmcy1
This commit is contained in:
194
utile/Teste/test_todo21_perioade_anaf.prg
Normal file
194
utile/Teste/test_todo21_perioade_anaf.prg
Normal file
@@ -0,0 +1,194 @@
|
||||
* test_todo21_perioade_anaf.prg
|
||||
* TODO #21: perioadele ANAF (scop TVA, TVA la incasare, inactivare) duse pana la utilizator.
|
||||
* Verifica lantul de date din banda B, care ruleaza integral din .prg (nu are nevoie de
|
||||
* write-back-ul binarelor): cursorul crsANAF -> Procedure ANAF -> oEntitate (VERIFICARE_CIF)
|
||||
* -> verifica_partener_show_info. Mesajul modal e capturat cu mock_amessagebox (gcMockUltimMesaj),
|
||||
* nu afisat, ca sa nu blocheze rularea headless.
|
||||
*
|
||||
* Codurile fiscale de test se aleg din istoric_coduri_fiscale (unul cu perioada de TVA la
|
||||
* incasare, unul cu inactivare), ca verificarea sa treaca prin fluxul real ANAF/cache.
|
||||
*
|
||||
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\test_todo21_perioade_anaf.prg"
|
||||
* Verdict in log: cate un rand OK/FAIL per pas si un TOTAL la final.
|
||||
|
||||
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, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns, gnButon
|
||||
gcUILog = "D:\ROA\ROACONT\COMUN\utile\Teste\test_todo21_perioade_anaf_log.txt"
|
||||
gcMockUltimMesaj = ''
|
||||
gnMockUltimTip = 0
|
||||
gnMockRaspuns = 1
|
||||
gnButon = 0
|
||||
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog)
|
||||
|
||||
PUBLIC gnEsecuri
|
||||
gnEsecuri = 0
|
||||
|
||||
ON ERROR DO PrErrLocal WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
||||
ON SHUTDOWN QUIT
|
||||
|
||||
TRY
|
||||
*-- VFP rezolva procedurile in ordinea in care au fost deschise fisierele (castiga PRIMUL),
|
||||
*-- deci mock-ul si umbra trebuie incarcate INAINTE ca test_init_env_auto sa incarce
|
||||
*-- oproceduri_comune.prg real. verifica_partener_show_info sta in ACELASI fisier cu
|
||||
*-- FUNCTION amessagebox, asa ca umbra e o copie a fisierului cu amessagebox redenumit:
|
||||
*-- apelul cade atunci pe mock si mesajul poate fi verificat fara dialog modal.
|
||||
LOCAL lcSrc, lcUmbra
|
||||
lcUmbra = ADDBS(SYS(2023)) + 'oproceduri_comune_umbra.prg'
|
||||
lcSrc = FILETOSTR("D:\ROA\ROACONT\COMUN\programe\oproceduri_comune.prg")
|
||||
lcSrc = STRTRAN(lcSrc, CHR(13) + CHR(10) + 'Function amessagebox' + CHR(13) + CHR(10), ;
|
||||
CHR(13) + CHR(10) + 'Function amessagebox_umbrit' + CHR(13) + CHR(10))
|
||||
STRTOFILE(lcSrc, lcUmbra)
|
||||
ERASE (FORCEEXT(lcUmbra, 'fxp'))
|
||||
|
||||
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\ui_harness.prg" ADDITIVE
|
||||
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
|
||||
SET PROCEDURE TO (lcUmbra) ADDITIVE
|
||||
|
||||
DO "D:\ROA\ROACONT\COMUN\utile\Teste\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)
|
||||
|
||||
DO PrLogLocal WITH 'umbra + mock amessagebox incarcate (' + lcUmbra + ')'
|
||||
|
||||
*-- proba: mock-ul chiar castiga la un apel direct?
|
||||
LOCAL lnProba
|
||||
lnProba = amessagebox('PING', 0 + 64, 'T')
|
||||
DO PrLogLocal WITH 'proba amessagebox a intors ' + TRANSFORM(lnProba)
|
||||
|
||||
*-- coduri fiscale reale: unul cu perioada de TVA la incasare, unul cu inactivare
|
||||
LOCAL lcSql, lcCodTvaInc, lcCodInactiv
|
||||
TEXT TO lcSql NOSHOW
|
||||
select cod_fiscal_n from (
|
||||
select cod_fiscal_n from istoric_coduri_fiscale
|
||||
where data_inceput_tvainc is not null and cod_fiscal_n is not null
|
||||
order by dataorav_anaf desc) where rownum <= 1
|
||||
ENDTEXT
|
||||
lcCodTvaInc = ''
|
||||
IF goExecutor.oExecuta(lcSql, 'crsT21a') AND USED('crsT21a') AND RECCOUNT('crsT21a') > 0
|
||||
lcCodTvaInc = ALLTRIM(TRANSFORM(NVL(crsT21a.cod_fiscal_n, 0)))
|
||||
ENDIF
|
||||
USE IN (SELECT('crsT21a'))
|
||||
|
||||
TEXT TO lcSql NOSHOW
|
||||
select cod_fiscal_n from (
|
||||
select cod_fiscal_n from istoric_coduri_fiscale
|
||||
where data_inactivare is not null and cod_fiscal_n is not null
|
||||
order by dataorav_anaf desc) where rownum <= 1
|
||||
ENDTEXT
|
||||
lcCodInactiv = ''
|
||||
IF goExecutor.oExecuta(lcSql, 'crsT21b') AND USED('crsT21b') AND RECCOUNT('crsT21b') > 0
|
||||
lcCodInactiv = ALLTRIM(TRANSFORM(NVL(crsT21b.cod_fiscal_n, 0)))
|
||||
ENDIF
|
||||
USE IN (SELECT('crsT21b'))
|
||||
|
||||
DO PrLogLocal WITH 'coduri de test: TVA incasare=[' + lcCodTvaInc + '] inactiv=[' + lcCodInactiv + ']'
|
||||
IF EMPTY(lcCodTvaInc) AND EMPTY(lcCodInactiv)
|
||||
DO PrLogLocal WITH 'FAIL: nu s-a gasit niciun cod fiscal de test in istoric_coduri_fiscale'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
DO PrVerificaCod WITH lcCodTvaInc, 'TVA la incasare'
|
||||
DO PrVerificaCod WITH lcCodInactiv, 'inactivare'
|
||||
|
||||
DO PrLogLocal WITH IIF(gnEsecuri = 0, 'TOTAL OK', 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)')
|
||||
CATCH TO loEx
|
||||
DO PrLogLocal WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ')'
|
||||
ENDTRY
|
||||
|
||||
QUIT
|
||||
|
||||
**********************************************************
|
||||
PROCEDURE PrVerificaCod
|
||||
LPARAMETERS tcCodFiscal, tcEticheta
|
||||
|
||||
LOCAL loVerificare, loEnt, ldData, lcXml, lnRaspuns, llArePerioada
|
||||
IF EMPTY(tcCodFiscal)
|
||||
DO PrLogLocal WITH 'SKIP ' + tcEticheta + ': cod fiscal negasit'
|
||||
RETURN
|
||||
ENDIF
|
||||
|
||||
ldData = DATE(gnAn, gnLuna, 1)
|
||||
loVerificare = CREATEOBJECT('verificarecod') && validare.prg
|
||||
lcXml = loVerificare.Verificare('CIF', tcCodFiscal, 'ANAF', ldData)
|
||||
|
||||
IF TYPE('loVerificare.oEntitate') <> 'O'
|
||||
DO PrLogLocal WITH 'FAIL ' + tcEticheta + ': oEntitate lipseste pentru ' + tcCodFiscal
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
RETURN
|
||||
ENDIF
|
||||
loEnt = loVerificare.oEntitate
|
||||
|
||||
*-- 1. cele 7 campuri noi exista pe obiectul intors de VERIFICARE_CIF
|
||||
LOCAL lnLipsa, lcCamp, laCampuri[7], lnI
|
||||
laCampuri[1] = 'data_inceput_scptva'
|
||||
laCampuri[2] = 'data_sfarsit_scptva'
|
||||
laCampuri[3] = 'data_anul_imp_scptva'
|
||||
laCampuri[4] = 'data_inceput_tvainc'
|
||||
laCampuri[5] = 'data_sfarsit_tvainc'
|
||||
laCampuri[6] = 'data_inactivare'
|
||||
laCampuri[7] = 'data_reactivare'
|
||||
lnLipsa = 0
|
||||
FOR lnI = 1 TO 7
|
||||
lcCamp = laCampuri[lnI]
|
||||
IF !PEMSTATUS(loEnt, lcCamp, 5)
|
||||
lnLipsa = lnLipsa + 1
|
||||
DO PrLogLocal WITH 'FAIL ' + tcEticheta + ': lipseste ' + lcCamp + ' din oEntitate'
|
||||
ENDIF
|
||||
ENDFOR
|
||||
IF lnLipsa = 0
|
||||
DO PrLogLocal WITH 'OK ' + tcEticheta + ': cele 7 campuri de perioada exista in oEntitate'
|
||||
ELSE
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
DO PrLogLocal WITH ' ' + tcCodFiscal + ' firma=[' + ALLTRIM(TRANSFORM(loEnt.firma)) + '] sursa=[' + ALLTRIM(TRANSFORM(loEnt.sursa)) + ']'
|
||||
DO PrLogLocal WITH ' scpTVA ' + DTOC(loEnt.data_inceput_scptva) + ' - ' + DTOC(loEnt.data_sfarsit_scptva) + ' anul.imp ' + DTOC(loEnt.data_anul_imp_scptva)
|
||||
DO PrLogLocal WITH ' tvaInc ' + DTOC(loEnt.data_inceput_tvainc) + ' - ' + DTOC(loEnt.data_sfarsit_tvainc)
|
||||
DO PrLogLocal WITH ' inactiv ' + DTOC(loEnt.data_inactivare) + ' reactivat ' + DTOC(loEnt.data_reactivare)
|
||||
|
||||
*-- 2. cel putin o perioada e completata (altfel testul nu dovedeste nimic despre transport)
|
||||
llArePerioada = !EMPTY(loEnt.data_inceput_scptva) OR !EMPTY(loEnt.data_inceput_tvainc) OR !EMPTY(loEnt.data_inactivare)
|
||||
IF llArePerioada
|
||||
DO PrLogLocal WITH 'OK ' + tcEticheta + ': cel putin o perioada e completata'
|
||||
ELSE
|
||||
DO PrLogLocal WITH 'FAIL ' + tcEticheta + ': toate perioadele sunt goale (transportul nu e dovedit)'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*-- 3. mesajul de verificare individuala contine perioadele
|
||||
gcMockUltimMesaj = ''
|
||||
lnRaspuns = verifica_partener_show_info(loEnt, tcCodFiscal, 'TEST ' + tcEticheta, '')
|
||||
IF 'Perioada TVA' $ gcMockUltimMesaj OR 'Inactivare:' $ gcMockUltimMesaj
|
||||
DO PrLogLocal WITH 'OK ' + tcEticheta + ': mesajul contine perioadele'
|
||||
ELSE
|
||||
DO PrLogLocal WITH 'FAIL ' + tcEticheta + ': mesajul NU contine perioadele'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
DO PrLogLocal WITH '--- mesaj ---' + CHR(13) + CHR(10) + gcMockUltimMesaj + '--- sfarsit mesaj ---'
|
||||
ENDPROC
|
||||
|
||||
**********************************************************
|
||||
PROCEDURE PrLogLocal
|
||||
LPARAMETERS tcMsg
|
||||
LOCAL lcL
|
||||
SET SAFETY OFF
|
||||
lcL = IIF(FILE(gcUILog), FILETOSTR(gcUILog), '')
|
||||
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcUILog)
|
||||
ENDPROC
|
||||
|
||||
**********************************************************
|
||||
PROCEDURE PrErrLocal
|
||||
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
|
||||
DO PrLogLocal WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
|
||||
ENDPROC
|
||||
27
utile/Teste/todo21/mock_meniu_dblclick_deps.prg
Normal file
27
utile/Teste/todo21/mock_meniu_dblclick_deps.prg
Normal file
@@ -0,0 +1,27 @@
|
||||
* mock_meniu_dblclick_deps.prg - inlocuieste nom_parteneri_modifica (COMUN\programe\onomenclatoare.prg)
|
||||
* si VerificaCodFiscal (COMUN\programe\oproceduri_comune.prg) in testele banda C (dublu-click in
|
||||
* grid-ul de verificare coduri fiscale), ca sa nu deschida formulare modale reale. Ambele proceduri
|
||||
* sunt definite in fisiere DIFERITE de overificari.vc2 (apelantul), deci mock-ul castiga normal
|
||||
* daca e incarcat cu SET PROCEDURE ... ADDITIVE INAINTE de test_init_env_auto.
|
||||
* Apelurile se numara in variabile PUBLIC (declarate si initializate de test inainte de fiecare pas):
|
||||
* gnMockNomModCount / gnMockNomModId (nom_parteneri_modifica) si gnMockVerifCodCount (VerificaCodFiscal).
|
||||
|
||||
PROCEDURE nom_parteneri_modifica
|
||||
LPARAMETERS tnId_Part, tnIdTipPart, tcTipPart, tnSpecial, tcMesaj
|
||||
IF TYPE('gnMockNomModCount') = 'N'
|
||||
gnMockNomModCount = gnMockNomModCount + 1
|
||||
ENDIF
|
||||
IF TYPE('gnMockNomModId') = 'N'
|
||||
gnMockNomModId = tnId_Part
|
||||
ENDIF
|
||||
RETURN NULL
|
||||
ENDPROC
|
||||
|
||||
PROCEDURE VerificaCodFiscal
|
||||
LPARAMETERS toDate, lnOptiune, loPartener
|
||||
IF TYPE('gnMockVerifCodCount') = 'N'
|
||||
gnMockVerifCodCount = gnMockVerifCodCount + 1
|
||||
ENDIF
|
||||
loPartener = NULL
|
||||
RETURN 7
|
||||
ENDPROC
|
||||
280
utile/Teste/todo21/test_todo21_grid_dblclick.prg
Normal file
280
utile/Teste/todo21/test_todo21_grid_dblclick.prg
Normal file
@@ -0,0 +1,280 @@
|
||||
* test_todo21_grid_dblclick.prg
|
||||
* TODO #21, benzile A (coloanele de perioada in grid-ul de verificare coduri fiscale) si C
|
||||
* (dublu-click pe denumire/cod fiscal ROA -> editare partener, coloanele ANAF raman pe verificare).
|
||||
* Instantiaza DIRECT frm_verificare_parteneri (COMUN\clase\overificari.vc2), fara Show(1) modal -
|
||||
* cursorul crsVerificareParteneri e construit ca in oproceduri_comune.prg (verificare_parteneri),
|
||||
* fara sa treaca prin acea procedura (care ar deschide formularul modal).
|
||||
*
|
||||
* Mock-uri (fisiere DIFERITE de overificari.vc2 - rezolutia "primul incarcat" e sigura):
|
||||
* mock_amessagebox.prg - dialogul "partener neidentificat"
|
||||
* mock_meniu_dblclick_deps.prg - nom_parteneri_modifica si VerificaCodFiscal (numara apelurile)
|
||||
*
|
||||
* Coduri de test: un cod fiscal REAL cu perioada ANAF (ales dinamic din istoric_coduri_fiscale,
|
||||
* ca in test_todo21_perioade_anaf.prg) si un partener REAL din NOM_PARTENERI (ales dinamic, cel
|
||||
* mai nou activ), plus un rand cu id_part = 0 pentru cazul "partener neidentificat".
|
||||
*
|
||||
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_grid_dblclick.prg"
|
||||
* Verdict in log: TOTAL OK / TOTAL FAIL: n pas(i).
|
||||
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
SET DELETED ON
|
||||
SET EXACT ON
|
||||
SET CENTURY ON
|
||||
SET DATE DMY
|
||||
SET NULLDISPLAY TO ''
|
||||
CLOSE DATABASES
|
||||
|
||||
PUBLIC gcLog
|
||||
gcLog = "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_grid_dblclick_log.txt"
|
||||
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
|
||||
|
||||
PUBLIC gnEsecuri
|
||||
gnEsecuri = 0
|
||||
|
||||
ON ERROR DO PrErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
||||
ON SHUTDOWN QUIT
|
||||
|
||||
PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns
|
||||
gcMockUltimMesaj = ''
|
||||
gnMockUltimTip = 0
|
||||
gnMockRaspuns = 6
|
||||
|
||||
PUBLIC gnMockNomModCount, gnMockNomModId, gnMockVerifCodCount
|
||||
gnMockNomModCount = 0
|
||||
gnMockNomModId = 0
|
||||
gnMockVerifCodCount = 0
|
||||
|
||||
TRY
|
||||
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE
|
||||
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\mock_meniu_dblclick_deps.prg" ADDITIVE
|
||||
DO PrLog WITH 'mock-uri incarcate'
|
||||
|
||||
DO "D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
|
||||
IF gnHandle <= 0
|
||||
DO PrLog WITH 'FAIL: conectare Oracle esuata (gnHandle=' + TRANSFORM(gnHandle) + ')'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
DO PrLog WITH 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)'
|
||||
QUIT
|
||||
ENDIF
|
||||
DO PrLog WITH 'mediu OK, schema=' + gcS
|
||||
|
||||
*-- cod fiscal real cu perioada ANAF, pentru banda A2 (do_verifica)
|
||||
LOCAL lcSql, lcCodAnaf
|
||||
TEXT TO lcSql NOSHOW
|
||||
select cod_fiscal_n from (
|
||||
select cod_fiscal_n from istoric_coduri_fiscale
|
||||
where (data_inceput_tvainc is not null or data_inactivare is not null) and cod_fiscal_n is not null
|
||||
order by dataorav_anaf desc) where rownum <= 1
|
||||
ENDTEXT
|
||||
lcCodAnaf = ''
|
||||
IF goExecutor.oExecuta(lcSql, 'crsGD1') AND USED('crsGD1') AND RECCOUNT('crsGD1') > 0
|
||||
lcCodAnaf = ALLTRIM(TRANSFORM(NVL(crsGD1.cod_fiscal_n, 0)))
|
||||
ENDIF
|
||||
USE IN (SELECT('crsGD1'))
|
||||
DO PrLog WITH 'cod fiscal ANAF de test: [' + lcCodAnaf + ']'
|
||||
|
||||
*-- partener real activ, pentru banda C (dublu-click -> editare partener)
|
||||
LOCAL lnIdPartTest, lcCodFiscalPart, lcDenumirePart
|
||||
TEXT TO lcSql NOSHOW
|
||||
select id_part, cod_fiscal, denumire from (
|
||||
select id_part, cod_fiscal, denumire from nom_parteneri
|
||||
where nvl(inactiv,0) = 0 and nvl(sters,0) = 0 and not cod_fiscal is null
|
||||
order by id_part desc) where rownum <= 1
|
||||
ENDTEXT
|
||||
lnIdPartTest = 0
|
||||
lcCodFiscalPart = ''
|
||||
lcDenumirePart = ''
|
||||
IF goExecutor.oExecuta(lcSql, 'crsGD2') AND USED('crsGD2') AND RECCOUNT('crsGD2') > 0
|
||||
lnIdPartTest = NVL(crsGD2.id_part, 0)
|
||||
lcCodFiscalPart = ALLTRIM(NVL(crsGD2.cod_fiscal, ''))
|
||||
lcDenumirePart = ALLTRIM(NVL(crsGD2.denumire, ''))
|
||||
ENDIF
|
||||
USE IN (SELECT('crsGD2'))
|
||||
DO PrLog WITH 'partener de test: id_part=' + TRANSFORM(lnIdPartTest) + ' cod=[' + lcCodFiscalPart + '] denumire=[' + lcDenumirePart + ']'
|
||||
|
||||
IF EMPTY(lcCodAnaf) OR lnIdPartTest = 0
|
||||
DO PrLog WITH 'FAIL: nu s-au gasit date de test (cod fiscal ANAF sau partener activ)'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*-- cursorul EXACT ca in oproceduri_comune.prg:4584 (verificare_parteneri), fara sa apelam
|
||||
*-- acea procedura (Show(1) modal) - Load-ul formularului adauga singur cele 7 campuri noi
|
||||
CREATE CURSOR crsVerificareParteneri (ales L, denumire C(100) NULL, cod_fiscal C(30) NULL, Valid L NULL, ;
|
||||
firma C(100) NULL, cod C(100) NULL, adresa_roa C(250) NULL, adresa C(250) NULL, ;
|
||||
judet C(100) NULL, regcom C(30) NULL, codpostal C(20) NULL, telefon C(30) NULL, fax C(30) NULL, ;
|
||||
datatvamfin C(30) NULL, platitortvamfin L NULL, VIES L NULL, PlatitorTVA L NULL, eroare C(250) NULL, ;
|
||||
IsCIF L NULL, duplicat L, atribut_fiscal C(2), stare C(100), atentie C(100), cod_fiscalfro C(30) NULL, ;
|
||||
id_part N(16), tvaincasare L, splittva L, inactiv L, Data D)
|
||||
|
||||
INSERT INTO crsVerificareParteneri (denumire, cod_fiscal, id_part) VALUES ('TEST ANAF PERIOADA', lcCodAnaf, 0)
|
||||
INSERT INTO crsVerificareParteneri (denumire, cod_fiscal, id_part) VALUES (lcDenumirePart, lcCodFiscalPart, lnIdPartTest)
|
||||
INSERT INTO crsVerificareParteneri (denumire, cod_fiscal, id_part) VALUES ('TEST FARA ID_PART', 'RO9999999', 0)
|
||||
UPDATE crsVerificareParteneri SET IsCIF = .T.
|
||||
GO TOP
|
||||
|
||||
PUBLIC goFormGD
|
||||
goFormGD = CREATEOBJECT('frm_verificare_parteneri', .F., .T., .F., .F., .F., .T.)
|
||||
goFormGD.WindowType = 0
|
||||
goFormGD.Show()
|
||||
DOEVENTS FORCE
|
||||
DO PrLog WITH 'formular instantiat, chkANAF=' + TRANSFORM(goFormGD.chkANAF.Value)
|
||||
|
||||
*=====================================================================
|
||||
* Banda A: grid cu 34 coloane (era 27), cele 7 noi legate pe cursorul real
|
||||
*=====================================================================
|
||||
IF goFormGD._grdbase1.ColumnCount = 34
|
||||
DO PrLog WITH 'OK A1: _grdbase1.ColumnCount = 34'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL A1: ColumnCount = ' + TRANSFORM(goFormGD._grdbase1.ColumnCount) + ' (asteptat 34)'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*-- coloanele redenumite sunt membri ai grid-ului dupa Name (cDataInceputScpTva...), nu dupa
|
||||
*-- pozitia Column28..Column34 - VFP adreseaza obiectul din container dupa Name, nu dupa pozitie
|
||||
LOCAL laCol[7,2], lnI, lcNume, lcSrc, llColOk
|
||||
laCol[1,1] = 'cDataInceputScpTva'
|
||||
laCol[1,2] = 'data_inceput_scptva'
|
||||
laCol[2,1] = 'cDataSfarsitScpTva'
|
||||
laCol[2,2] = 'data_sfarsit_scptva'
|
||||
laCol[3,1] = 'cDataAnulImpScpTva'
|
||||
laCol[3,2] = 'data_anul_imp_scptva'
|
||||
laCol[4,1] = 'cDataInceputTvaInc'
|
||||
laCol[4,2] = 'data_inceput_tvainc'
|
||||
laCol[5,1] = 'cDataSfarsitTvaInc'
|
||||
laCol[5,2] = 'data_sfarsit_tvainc'
|
||||
laCol[6,1] = 'cDataInactivare'
|
||||
laCol[6,2] = 'data_inactivare'
|
||||
laCol[7,1] = 'cDataReactivare'
|
||||
laCol[7,2] = 'data_reactivare'
|
||||
llColOk = .T.
|
||||
FOR lnI = 1 TO 7
|
||||
lcNume = laCol[lnI, 1]
|
||||
IF !PEMSTATUS(goFormGD._grdbase1, lcNume, 5)
|
||||
llColOk = .F.
|
||||
DO PrLog WITH 'FAIL A3: coloana ' + lcNume + ' nu exista ca membru al _grdbase1'
|
||||
LOOP
|
||||
ENDIF
|
||||
lcSrc = LOWER(EVALUATE('goFormGD._grdbase1.' + lcNume + '.ControlSource'))
|
||||
IF !('crsverificareparteneri.' + laCol[lnI, 2] $ lcSrc)
|
||||
llColOk = .F.
|
||||
DO PrLog WITH 'FAIL A3: ' + lcNume + ' ControlSource=[' + lcSrc + '] asteptat crsverificareparteneri.' + laCol[lnI, 2]
|
||||
ENDIF
|
||||
ENDFOR
|
||||
IF llColOk
|
||||
DO PrLog WITH 'OK A3: cele 7 coloane noi exista pe binarul curent, cu ControlSource corect'
|
||||
ELSE
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*-- do_verifica cu chkANAF fortat .T. in Init -> ramura serviciu web ANAF (banda A2)
|
||||
goFormGD.do_verifica(.F., .T., .F.)
|
||||
DO PrLog WITH 'do_verifica rulat (tlValidare=.F. tlMFIN=.T. tlVIES=.F.)'
|
||||
|
||||
SELECT crsVerificareParteneri
|
||||
LOCATE FOR cod_fiscal = lcCodAnaf
|
||||
IF FOUND()
|
||||
LOCAL llArePerioada
|
||||
llArePerioada = !EMPTY(crsVerificareParteneri.data_inceput_scptva) OR ;
|
||||
!EMPTY(crsVerificareParteneri.data_inceput_tvainc) OR ;
|
||||
!EMPTY(crsVerificareParteneri.data_inactivare)
|
||||
IF llArePerioada
|
||||
DO PrLog WITH 'OK A2: do_verifica a completat cel putin o perioada pentru ' + lcCodAnaf
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL A2: nicio perioada completata pentru ' + lcCodAnaf + ' dupa do_verifica'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
DO PrLog WITH ' scpTVA ' + DTOC(crsVerificareParteneri.data_inceput_scptva) + '-' + DTOC(crsVerificareParteneri.data_sfarsit_scptva) + ;
|
||||
' tvaInc ' + DTOC(crsVerificareParteneri.data_inceput_tvainc) + '-' + DTOC(crsVerificareParteneri.data_sfarsit_tvainc) + ;
|
||||
' inactiv ' + DTOC(crsVerificareParteneri.data_inactivare) + ' reactivat ' + DTOC(crsVerificareParteneri.data_reactivare)
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL A2: randul de test ' + lcCodAnaf + ' nu mai exista in cursor'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*=====================================================================
|
||||
* Banda C: dublu-click pe coloanele ROA (denumire/cod fiscal) -> editare partener;
|
||||
* coloanele ANAF (firma/cod) raman pe meniul de verificare
|
||||
*=====================================================================
|
||||
SELECT crsVerificareParteneri
|
||||
LOCATE FOR id_part = lnIdPartTest
|
||||
|
||||
gnMockNomModCount = 0
|
||||
gnMockNomModId = 0
|
||||
gnMockVerifCodCount = 0
|
||||
goFormGD._grdbase1.Column2.Text1.DblClick()
|
||||
IF gnMockNomModCount = 1 AND gnMockNomModId = lnIdPartTest AND gnMockVerifCodCount = 0
|
||||
DO PrLog WITH 'OK C1: dublu-click Column2 (denumire) -> nom_parteneri_modifica(' + TRANSFORM(lnIdPartTest) + ')'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL C1: Column2 DblClick - nom_mod count=' + TRANSFORM(gnMockNomModCount) + ' id=' + TRANSFORM(gnMockNomModId) + ' verifcod count=' + TRANSFORM(gnMockVerifCodCount)
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
gnMockNomModCount = 0
|
||||
gnMockNomModId = 0
|
||||
gnMockVerifCodCount = 0
|
||||
goFormGD._grdbase1.Column3.Text1.DblClick()
|
||||
IF gnMockNomModCount = 1 AND gnMockNomModId = lnIdPartTest AND gnMockVerifCodCount = 0
|
||||
DO PrLog WITH 'OK C2: dublu-click Column3 (cod fiscal ROA) -> nom_parteneri_modifica(' + TRANSFORM(lnIdPartTest) + ')'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL C2: Column3 DblClick - nom_mod count=' + TRANSFORM(gnMockNomModCount) + ' id=' + TRANSFORM(gnMockNomModId) + ' verifcod count=' + TRANSFORM(gnMockVerifCodCount)
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
gnMockNomModCount = 0
|
||||
gnMockVerifCodCount = 0
|
||||
goFormGD._grdbase1.Column5.Text1.DblClick()
|
||||
IF gnMockVerifCodCount = 1 AND gnMockNomModCount = 0
|
||||
DO PrLog WITH 'OK C3: dublu-click Column5 (firma ANAF) -> VerificaCodFiscal, fara editare partener'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL C3: Column5 DblClick - verifcod count=' + TRANSFORM(gnMockVerifCodCount) + ' nom_mod count=' + TRANSFORM(gnMockNomModCount)
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
gnMockNomModCount = 0
|
||||
gnMockVerifCodCount = 0
|
||||
goFormGD._grdbase1.Column6.Text1.DblClick()
|
||||
IF gnMockVerifCodCount = 1 AND gnMockNomModCount = 0
|
||||
DO PrLog WITH 'OK C4: dublu-click Column6 (cod ANAF) -> VerificaCodFiscal, fara editare partener'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL C4: Column6 DblClick - verifcod count=' + TRANSFORM(gnMockVerifCodCount) + ' nom_mod count=' + TRANSFORM(gnMockNomModCount)
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*-- id_part gol -> mesaj de avertizare, fara editare partener
|
||||
SELECT crsVerificareParteneri
|
||||
LOCATE FOR cod_fiscal = 'RO9999999'
|
||||
gnMockNomModCount = 0
|
||||
gcMockUltimMesaj = ''
|
||||
goFormGD._grdbase1.Column2.Text1.DblClick()
|
||||
IF gnMockNomModCount = 0 AND 'nu poate fi identificat' $ LOWER(gcMockUltimMesaj)
|
||||
DO PrLog WITH 'OK C5: id_part gol -> mesaj de avertizare, fara editare partener'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL C5: id_part gol - nom_mod count=' + TRANSFORM(gnMockNomModCount) + ' mesaj=[' + gcMockUltimMesaj + ']'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
goFormGD.Release()
|
||||
|
||||
DO PrLog WITH IIF(gnEsecuri = 0, 'TOTAL OK', 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)')
|
||||
CATCH TO loEx
|
||||
DO PrLog WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
|
||||
DO PrLog WITH 'TOTAL FAIL: exceptie neasteptata'
|
||||
ENDTRY
|
||||
|
||||
QUIT
|
||||
|
||||
**********************************************************
|
||||
PROCEDURE PrLog
|
||||
LPARAMETERS tcMsg
|
||||
LOCAL lcL
|
||||
SET SAFETY OFF
|
||||
lcL = IIF(FILE(gcLog), FILETOSTR(gcLog), '')
|
||||
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcLog)
|
||||
ENDPROC
|
||||
|
||||
**********************************************************
|
||||
PROCEDURE PrErr
|
||||
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
|
||||
DO PrLog WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
|
||||
ENDPROC
|
||||
164
utile/Teste/todo21/test_todo21_jurnal_data_factura.prg
Normal file
164
utile/Teste/todo21/test_todo21_jurnal_data_factura.prg
Normal file
@@ -0,0 +1,164 @@
|
||||
* test_todo21_jurnal_data_factura.prg
|
||||
* TODO #21, banda D: verificarea codurilor fiscale la DATA FACTURII in jurnalele de TVA
|
||||
* (Clase\ovanzcump.vc2 - frm_regcump2010/frm_regcump2025/frm_regvanz2010/frm_regvanz2025.do_verifica).
|
||||
*
|
||||
* Optiunea 3 din meniul XMENU ("VERIFICA TOTI PARTENERII LA DATA FACTURII - ANAF") deschide un
|
||||
* popup interactiv (ACTIVATE POPUP, proceduri_comune.prg:XMENU) care asteapta o tasta - nu poate
|
||||
* fi condus headless fara sa se conduca simularea unui formular de jurnal intreg (ovanzcump.vc2,
|
||||
* fara niciun harness existent, fisier text de 1.9 MB). Testul verifica deci:
|
||||
* 1. RUNTIME - cele doua ramuri de SELECT (optiunea 3 cu data facturii / restul optiunilor fara
|
||||
* data), copiate LITERAL din Clase\ovanzcump.vc2 (frm_regcump2010.do_verifica), rulate pe un
|
||||
* cursor `actcv` construit local: optiunea 3 pastreaza cate un rand PER DATA DE DOCUMENT
|
||||
* (acelasi partener, doua facturi in date diferite -> doua randuri), optiunea implicita
|
||||
* colapseaza pe partener (un singur rand), exact cauza pentru care s-a cerut punctul 4 din
|
||||
* TODO #21 (partenerul care isi schimba starea TVA in cursul lunii).
|
||||
* 2. STATIC - textul optiunii 3 de meniu si fragmentul "dataact As data" exista in TOATE cele
|
||||
* 4 metode (frm_regcump2010/2025, frm_regvanz2010/2025), citind Clase\ovanzcump.vc2 curent
|
||||
* de pe disc (dovada ca write-back-ul a dus modificarea in toate cele 4 locuri, nu doar in
|
||||
* cea testata la pasul 1).
|
||||
* Verificarea prin UI reala (meniul XMENU, formularul de jurnal) ramane de facut manual in IDE.
|
||||
*
|
||||
* Rulare: vfp9.exe -A -T "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_jurnal_data_factura.prg"
|
||||
* Verdict in log: TOTAL OK / TOTAL FAIL: n pas(i).
|
||||
|
||||
SET SAFETY OFF
|
||||
SET TALK OFF
|
||||
SET DELETED ON
|
||||
SET EXACT ON
|
||||
SET CENTURY ON
|
||||
SET DATE DMY
|
||||
SET NULLDISPLAY TO ''
|
||||
CLOSE DATABASES
|
||||
|
||||
PUBLIC gcLog
|
||||
gcLog = "D:\ROA\ROACONT\COMUN\utile\Teste\todo21\test_todo21_jurnal_data_factura_log.txt"
|
||||
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog)
|
||||
|
||||
PUBLIC gnEsecuri
|
||||
gnEsecuri = 0
|
||||
|
||||
ON ERROR DO PrErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
||||
ON SHUTDOWN QUIT
|
||||
|
||||
TRY
|
||||
*=====================================================================
|
||||
* Pasul 1: comportamentul SELECT-urilor, copiate literal din
|
||||
* Clase\ovanzcump.vc2:39304-39318 (frm_regcump2010.do_verifica)
|
||||
*=====================================================================
|
||||
CREATE CURSOR actcv (id_part N(16), cod_fiscal C(30), denumire C(100), dataact D)
|
||||
INSERT INTO actcv VALUES (5001, 'RO12345671', 'PARTENER SCHIMBAT TVA SRL', {^2026-08-05})
|
||||
INSERT INTO actcv VALUES (5001, 'RO12345671', 'PARTENER SCHIMBAT TVA SRL', {^2026-08-22})
|
||||
INSERT INTO actcv VALUES (5002, 'RO12345672', 'PARTENER FIX SRL', {^2026-08-10})
|
||||
|
||||
LOCAL lcWhere
|
||||
lcWhere = ".T."
|
||||
|
||||
*-- optiunea 3: verificare la data facturii
|
||||
Select Distinct id_part, cod_fiscal, denumire, dataact As data, Iif(Left(Upper(cod_fiscal), 2) = "RO", "RO", " ") As ATRIBUT_FISCAL, .T. As IsCIF, .F. As codvalid ;
|
||||
From actcv ;
|
||||
Where &lcWhere ;
|
||||
Into Cursor crsOptiunea3 ;
|
||||
Order By denumire, cod_fiscal ;
|
||||
Readwrite
|
||||
|
||||
*-- optiunea implicita (azi/data 1 a lunii): fara data facturii
|
||||
Select Distinct id_part, cod_fiscal, denumire, Iif(Left(Upper(cod_fiscal), 2) = "RO", "RO", " ") As ATRIBUT_FISCAL, .T. As IsCIF, .F. As codvalid ;
|
||||
From actcv ;
|
||||
Where &lcWhere ;
|
||||
Into Cursor crsOptiunea2 ;
|
||||
Order By denumire, cod_fiscal ;
|
||||
Readwrite
|
||||
|
||||
IF RECCOUNT('crsOptiunea3') = 3
|
||||
DO PrLog WITH 'OK D1: optiunea 3 (data facturii) pastreaza 3 randuri - cate unul per data de document'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL D1: optiunea 3 a dat ' + TRANSFORM(RECCOUNT('crsOptiunea3')) + ' randuri (asteptat 3)'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
IF RECCOUNT('crsOptiunea2') = 2
|
||||
DO PrLog WITH 'OK D2: optiunea implicita colapseaza pe partener - 2 randuri (5001 o singura data)'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL D2: optiunea implicita a dat ' + TRANSFORM(RECCOUNT('crsOptiunea2')) + ' randuri (asteptat 2)'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*-- id_part si data corecte pe fiecare rand din optiunea 3 (regasite dupa data, nu dupa recno)
|
||||
LOCAL llDataOk
|
||||
llDataOk = .T.
|
||||
SELECT crsOptiunea3
|
||||
LOCATE FOR id_part = 5001 AND data = {^2026-08-05}
|
||||
llDataOk = llDataOk AND FOUND()
|
||||
LOCATE FOR id_part = 5001 AND data = {^2026-08-22}
|
||||
llDataOk = llDataOk AND FOUND()
|
||||
LOCATE FOR id_part = 5002 AND data = {^2026-08-10}
|
||||
llDataOk = llDataOk AND FOUND()
|
||||
IF llDataOk
|
||||
DO PrLog WITH 'OK D3: fiecare rand din optiunea 3 are id_part si data (=dataact) corecte'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL D3: cel putin o combinatie id_part/data lipseste din crsOptiunea3'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
*-- id_part completat si pe optiunea implicita (banda C3, in acelasi SELECT)
|
||||
SELECT crsOptiunea2
|
||||
LOCATE FOR EMPTY(NVL(id_part, 0))
|
||||
IF !FOUND()
|
||||
DO PrLog WITH 'OK D4: id_part completat pe toate randurile din optiunea implicita'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL D4: exista randuri fara id_part in optiunea implicita'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
USE IN (SELECT('crsOptiunea3'))
|
||||
USE IN (SELECT('crsOptiunea2'))
|
||||
USE IN (SELECT('actcv'))
|
||||
|
||||
*=====================================================================
|
||||
* Pasul 2: verificare statica - toate cele 4 metode au optiunea 3 de meniu si
|
||||
* SELECT-ul cu "dataact As data" (dovada ca write-back-ul a atins toate cele 4 locuri)
|
||||
*=====================================================================
|
||||
LOCAL lcSrc
|
||||
lcSrc = FILETOSTR("D:\ROA\ROACONT\Clase\ovanzcump.vc2")
|
||||
DO PrLog WITH 'lungime Clase\ovanzcump.vc2 (text curent de pe disc) = ' + TRANSFORM(LEN(lcSrc)) + ' octeti'
|
||||
|
||||
LOCAL lnAparitiiMeniu, lnAparitiiSelect
|
||||
lnAparitiiMeniu = OCCURS('VERIFICA TOTI PARTENERII LA DATA FACTURII - ANAF', lcSrc)
|
||||
lnAparitiiSelect = OCCURS('dataact As data', lcSrc)
|
||||
|
||||
IF lnAparitiiMeniu = 4
|
||||
DO PrLog WITH 'OK D5: optiunea 3 de meniu apare de 4 ori in ovanzcump.vc2 (cate una per jurnal)'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL D5: optiunea 3 de meniu apare de ' + TRANSFORM(lnAparitiiMeniu) + ' ori (asteptat 4)'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
IF lnAparitiiSelect = 4
|
||||
DO PrLog WITH 'OK D6: fragmentul "dataact As data" apare de 4 ori in ovanzcump.vc2 (cate unul per jurnal)'
|
||||
ELSE
|
||||
DO PrLog WITH 'FAIL D6: fragmentul "dataact As data" apare de ' + TRANSFORM(lnAparitiiSelect) + ' ori (asteptat 4)'
|
||||
gnEsecuri = gnEsecuri + 1
|
||||
ENDIF
|
||||
|
||||
DO PrLog WITH IIF(gnEsecuri = 0, 'TOTAL OK', 'TOTAL FAIL: ' + TRANSFORM(gnEsecuri) + ' pas(i)')
|
||||
CATCH TO loEx
|
||||
DO PrLog WITH 'EXCEPTIE: ' + loEx.Message + ' (' + TRANSFORM(loEx.LineNo) + ') ' + loEx.Procedure
|
||||
DO PrLog WITH 'TOTAL FAIL: exceptie neasteptata'
|
||||
ENDTRY
|
||||
|
||||
QUIT
|
||||
|
||||
**********************************************************
|
||||
PROCEDURE PrLog
|
||||
LPARAMETERS tcMsg
|
||||
LOCAL lcL
|
||||
SET SAFETY OFF
|
||||
lcL = IIF(FILE(gcLog), FILETOSTR(gcLog), '')
|
||||
STRTOFILE(lcL + TRANSFORM(tcMsg) + CHR(13) + CHR(10), gcLog)
|
||||
ENDPROC
|
||||
|
||||
**********************************************************
|
||||
PROCEDURE PrErr
|
||||
LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo
|
||||
DO PrLog WITH 'EROARE ' + TRANSFORM(tnError) + ' ' + TRANSFORM(tcMessage) + ' in ' + TRANSFORM(tcProgram) + ' linia ' + TRANSFORM(tnLineNo)
|
||||
ENDPROC
|
||||
Reference in New Issue
Block a user