- ooperatii_comune: verific_partener nu mai construieste SQL NULL cand contul primit e NULL (EMPTY(.NULL.) e .F. in VFP) - utile\context_watch.ps1 si utile\docs_revizie_check.ps1: masurarea contextului sesiunii si cadenta reviziei de documentatie, prin hook-uri Claude Code (instalare in docs\monitorizare-context.md) - reguli_lucru: delegare la subagenti, modificari minime si scoped, scrierea si revizuirea documentatiei, changelog strictul necesar (regulile 3, 6, 9, 11, 12) - scripturi-migrare-db: continutul unui script (scoped, fara select, idempotent) - teste noi pentru cele doua erori din achizitia de import - restul documentatiei compactata, fara pierdere de reguli Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01RYbiinqXxdEqXi53x4Ro7K
224 lines
9.7 KiB
Plaintext
224 lines
9.7 KiB
Plaintext
* test_repro_anaf_path_nfjson.prg
|
|
* REPRODUCERE: in ROAGEST, la alegerea partenerului, banda arata mereu
|
|
* "ANAF nu a raspuns - verificare sarita", desi ANAF raspunde 200 pe aceeasi masina.
|
|
* Ipoteza testata: SET PATH din Programe\roagest.prg NU contine COMUN\UTILE\NFJSON,
|
|
* deci VerificareANAF.Init (validare.prg:1877, "Set Procedure To nfjsonread.prg Additive")
|
|
* arunca, CREATEOBJECT('VerificareANAF') esueaza in ANAF_VerificaCuiSingle si clasa de
|
|
* esec devine FARA_RASPUNS -> banda gri + serviciul ANAF marcat CAZUT pentru 10 minute.
|
|
*
|
|
* Scenarii:
|
|
* A. path ca in roagest.prg (fara NFJSON) -> CREATEOBJECT esueaza, clasa esec = FARA_RASPUNS
|
|
* B. acelasi path + COMUN\UTILE\NFJSON -> verdict ANAF real pentru CUI 13791411 (ARAFURA)
|
|
*
|
|
* Rulare: powershell -ExecutionPolicy Bypass -File test_repro_anaf_path_nfjson.ps1
|
|
|
|
SET SAFETY OFF
|
|
SET TALK OFF
|
|
SET DELETED ON
|
|
SET EXACT ON
|
|
SET CENTURY ON
|
|
SET DATE DMY
|
|
SET DECIMALS TO 4
|
|
SET NULLDISPLAY TO ''
|
|
CLOSE DATABASES
|
|
|
|
PUBLIC gcUILog, gnAsserts, gnPass
|
|
gcUILog = "D:\ROA\ROAGEST\COMUN\utile\Teste\partener_anaf\test_repro_anaf_path_nfjson_log.txt"
|
|
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcUILog)
|
|
STORE 0 TO gnAsserts, gnPass
|
|
|
|
ON ERROR DO PnErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
|
|
ON SHUTDOWN QUIT
|
|
|
|
LOCAL lcCui, llNegasit, lcClasa, loRez, loEx, lcPath, gcAppPath
|
|
lcCui = '13791411'
|
|
|
|
TRY
|
|
*----- SET PATH exact ca in Programe\roagest.prg (fara COMUN\UTILE\NFJSON) -----
|
|
gcAppPath = "D:\ROA\ROAGEST\"
|
|
SET DEFAULT TO (gcAppPath)
|
|
lcPath = gcAppPath + 'Date;' + gcAppPath + 'Include;' + gcAppPath + 'FERESTRE;' + ;
|
|
gcAppPath + 'GRAFICE;' + gcAppPath + 'CLASE;' + gcAppPath + 'MENIURI;' + ;
|
|
gcAppPath + 'PROGRAME;' + gcAppPath + 'RAPOARTE;' + gcAppPath + 'COMUN;' + ;
|
|
gcAppPath + 'COMUN\CLASE;' + gcAppPath + 'COMUN\FERESTRE;' + gcAppPath + 'COMUN\PROGRAME;' + ;
|
|
gcAppPath + 'COMUN\GRAFICE;' + gcAppPath + 'COMUN\RAPOARTE;' + gcAppPath + 'COMUN\MENIURI;' + ;
|
|
gcAppPath + 'COMUN\UTILE\GRIDEXTRAS;' + gcAppPath + 'COMUN\UTILE\CTL32;' + ;
|
|
gcAppPath + 'COMUN\UTILE\HPDF;' + gcAppPath + 'COMUN\UTILE\HPDF\REPORTOUTPUT;' + ;
|
|
gcAppPath + 'COMUN\UTILE\WEB;' + gcAppPath + 'COMUN\UTILE\EXCEL;' + ;
|
|
ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\]
|
|
SET PATH TO &lcPath
|
|
DO PnLog WITH 'SET PATH (ca in roagest.prg) OK'
|
|
|
|
SET PROCEDURE TO validare.prg
|
|
SET PROCEDURE TO ocautare.prg ADDITIVE
|
|
SET PROCEDURE TO regex.prg ADDITIVE
|
|
DO PnLog WITH 'SET PROCEDURE OK: ' + SET('Procedure')
|
|
|
|
PUBLIC gnIdUtil, goExecutor, goLog, poLog
|
|
gnIdUtil = -3
|
|
goExecutor = CREATEOBJECT('executor_spion')
|
|
LOCAL lcLogApp
|
|
lcLogApp = "D:\ROA\ROAGEST\COMUN\utile\Teste\partener_anaf\test_repro_anaf_path_nfjson_applog.txt"
|
|
STRTOFILE('', lcLogApp)
|
|
poLog = NEWOBJECT("Log_Mesaje", "Log_Mesaje.prg", "", lcLogApp)
|
|
goLog = poLog
|
|
|
|
*===== A1: CREATEOBJECT('VerificareANAF') pe path-ul din roagest.prg =====
|
|
loEx = .NULL.
|
|
TRY
|
|
LOCAL loVerif
|
|
loVerif = CREATEOBJECT('VerificareANAF')
|
|
DO PnLog WITH 'A1 CREATEOBJECT(VerificareANAF): OK (nu reproduce)'
|
|
CATCH TO loEx
|
|
DO PnLog WITH 'A1 CREATEOBJECT(VerificareANAF): EXCEPTIE ' + loEx.Message + ;
|
|
' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
|
|
ENDTRY
|
|
DO PnAssert WITH 'A1 VerificareANAF nu se poate instantia fara NFJSON pe path', !ISNULL(loEx)
|
|
|
|
*===== A2: fluxul real ANAF_VerificaCuiSingle -> clasa de esec =====
|
|
llNegasit = .F.
|
|
lcClasa = ''
|
|
loRez = ANAF_VerificaCuiSingle(m.lcCui, DATE(), @llNegasit, @lcClasa)
|
|
DO PnLog WITH 'A2 ANAF_VerificaCuiSingle: VARTYPE=' + VARTYPE(loRez) + ;
|
|
' negasit=' + TRANSFORM(llNegasit) + ' clasa_esec=[' + lcClasa + ']'
|
|
DO PnAssert WITH 'A2 clasa esec = FARA_RASPUNS (banda "ANAF nu a raspuns")', lcClasa == 'FARA_RASPUNS'
|
|
|
|
*===== A3: banda din ocautare - ANAF_StarePartener pe acelasi cod =====
|
|
LOCAL llNecesita, lcClasa3, loStare3
|
|
llNecesita = .F.
|
|
llNegasit = .F.
|
|
lcClasa3 = ''
|
|
loStare3 = ANAF_StarePartener(m.lcCui, DATE(), .F., @llNecesita, @llNegasit, @lcClasa3, 0)
|
|
DO PnLog WITH 'A3 ANAF_StarePartener: VARTYPE=' + VARTYPE(loStare3) + ' clasa_esec=[' + lcClasa3 + ']' + ;
|
|
' stare_serviciu=' + ANAF_StareServiciu()
|
|
DO PnAssert WITH 'A3 stare serviciu ANAF = CAZUT dupa primul cod', ANAF_StareServiciu() == 'CAZUT'
|
|
|
|
*===== B: acelasi mediu + COMUN\UTILE\NFJSON pe path =====
|
|
SET PATH TO (gcAppPath + 'COMUN\UTILE\NFJSON') ADDITIVE
|
|
DO PnLog WITH 'B SET PATH ... COMUN\UTILE\NFJSON ADDITIVE'
|
|
RELEASE goCacheANAF_Sesiune
|
|
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reluare scenariu B')
|
|
|
|
loEx = .NULL.
|
|
TRY
|
|
LOCAL loVerifB
|
|
loVerifB = CREATEOBJECT('VerificareANAF')
|
|
DO PnLog WITH 'B1 CREATEOBJECT(VerificareANAF): OK'
|
|
CATCH TO loEx
|
|
DO PnLog WITH 'B1 CREATEOBJECT(VerificareANAF): EXCEPTIE ' + loEx.Message
|
|
ENDTRY
|
|
DO PnAssert WITH 'B1 VerificareANAF se instantiaza cu NFJSON pe path', ISNULL(loEx)
|
|
|
|
llNegasit = .F.
|
|
lcClasa = ''
|
|
loRez = ANAF_VerificaCuiSingle(m.lcCui, DATE(), @llNegasit, @lcClasa)
|
|
IF VARTYPE(loRez) = 'O'
|
|
DO PnLog WITH 'B2 ANAF_VerificaCuiSingle: denumire=[' + ALLTRIM(NVL(loRez.denumire, '')) + ;
|
|
'] scpTVA=' + TRANSFORM(loRez.scpTVA) + ' clasa_esec=[' + lcClasa + ']'
|
|
ELSE
|
|
DO PnLog WITH 'B2 ANAF_VerificaCuiSingle: VARTYPE=' + VARTYPE(loRez) + ' clasa_esec=[' + lcClasa + ']'
|
|
ENDIF
|
|
DO PnAssert WITH 'B2 verdict ANAF primit pentru ' + m.lcCui, VARTYPE(loRez) = 'O'
|
|
DO PnAssert WITH 'B3 denumire ANAF = ARAFURA', VARTYPE(loRez) = 'O' AND 'ARAFURA' $ UPPER(ALLTRIM(NVL(loRez.denumire, '')))
|
|
|
|
*===== C: corpul lui ANAF_VerificaCuiSingle replicat inline, pas cu pas =====
|
|
LOCAL loVerifC, loHttpC, lcJson, loParsed, lnSalvate, llNegC, lcClasaC, loRezC
|
|
loVerifC = CREATEOBJECT('VerificareANAF')
|
|
TRY
|
|
loHttpC = ANAF_CreeazaCerereANAF(INT(VAL(m.lcCui)), DATE(), .F.)
|
|
lcJson = ALLTRIM(loHttpC.responseText)
|
|
DO PnLog WITH 'C1 ANAF_CreeazaCerereANAF: Status=' + TRANSFORM(loHttpC.Status) + ' raspuns(120)=' + LEFT(lcJson, 120)
|
|
CATCH TO loEx
|
|
lcJson = ''
|
|
DO PnLog WITH 'C1 ANAF_CreeazaCerereANAF: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
|
|
ENDTRY
|
|
TRY
|
|
loParsed = nfjsonread(m.lcJson)
|
|
DO PnLog WITH 'C2 nfjsonread: OK, TYPE=' + VARTYPE(loParsed)
|
|
CATCH TO loEx
|
|
DO PnLog WITH 'C2 nfjsonread: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
|
|
ENDTRY
|
|
TRY
|
|
USE IN (SELECT('crsANAFDiag'))
|
|
loVerifC.ParseJsonANAFv8(loParsed, 'crsANAFDiag')
|
|
DO PnLog WITH 'C3 ParseJsonANAFv8: OK, RECCOUNT=' + IIF(USED('crsANAFDiag'), TRANSFORM(RECCOUNT('crsANAFDiag')), '-')
|
|
CATCH TO loEx
|
|
DO PnLog WITH 'C3 ParseJsonANAFv8: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
|
|
ENDTRY
|
|
TRY
|
|
lnSalvate = loVerifC.SalveazaIstoricDinCursor('crsANAFDiag', gnIdUtil)
|
|
DO PnLog WITH 'C4 SalveazaIstoricDinCursor: OK, salvate=' + TRANSFORM(lnSalvate)
|
|
CATCH TO loEx
|
|
DO PnLog WITH 'C4 SalveazaIstoricDinCursor: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
|
|
ENDTRY
|
|
TRY
|
|
llNegC = .F.
|
|
lcClasaC = ''
|
|
loRezC = ANAF_VerdictDinCursor('crsANAFDiag', INT(VAL(m.lcCui)), @llNegC, @lcClasaC)
|
|
DO PnLog WITH 'C5 ANAF_VerdictDinCursor: VARTYPE=' + VARTYPE(loRezC) + ' negasit=' + TRANSFORM(llNegC) + ;
|
|
' clasa=[' + lcClasaC + ']' + IIF(VARTYPE(loRezC) = 'O', ' denumire=[' + ALLTRIM(NVL(loRezC.denumire, '')) + ']', '')
|
|
CATCH TO loEx
|
|
DO PnLog WITH 'C5 ANAF_VerdictDinCursor: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
|
|
ENDTRY
|
|
|
|
*===== D: path-ul REAL, construit din blocul lcPath din Programe\roagest.prg =====
|
|
LOCAL lcSursa, lnStart, lnStop, lcBloc, lcScript, lcPathReal, loVerifD, loRezD, lcClasaD, llNegD
|
|
lcSursa = FILETOSTR("D:\ROA\ROAGEST\Programe\roagest.prg")
|
|
lnStart = ATC("lcPath = gcAppPath + 'Date;'", lcSursa)
|
|
lnStop = ATC("COMUNROA\]", SUBSTR(lcSursa, lnStart)) + lnStart - 1
|
|
lcBloc = SUBSTR(lcSursa, lnStart, lnStop - lnStart + LEN("COMUNROA\]"))
|
|
lcScript = "LPARAMETERS gcAppPath" + CHR(13)+CHR(10) + "LOCAL lcPath" + CHR(13)+CHR(10) + ;
|
|
lcBloc + CHR(13)+CHR(10) + "RETURN lcPath"
|
|
lcPathReal = EXECSCRIPT(lcScript, gcAppPath)
|
|
DO PnLog WITH 'D path din roagest.prg: ' + lcPathReal
|
|
RELEASE PROCEDURE nfjsonread.prg, nfjsoncreate.prg
|
|
RELEASE goCacheANAF_Sesiune
|
|
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reluare scenariu D')
|
|
SET PATH TO &lcPathReal
|
|
DO PnAssert WITH 'D1 nfjsonread descarcat inainte de test', !('NFJSONREAD' $ UPPER(SET('Procedure')))
|
|
|
|
llNegD = .F.
|
|
lcClasaD = ''
|
|
loRezD = ANAF_VerificaCuiSingle(m.lcCui, DATE(), @llNegD, @lcClasaD)
|
|
IF VARTYPE(loRezD) = 'O'
|
|
DO PnLog WITH 'D2 ANAF_VerificaCuiSingle pe path-ul real: denumire=[' + ALLTRIM(NVL(loRezD.denumire, '')) + '] clasa_esec=[' + lcClasaD + ']'
|
|
ELSE
|
|
DO PnLog WITH 'D2 ANAF_VerificaCuiSingle pe path-ul real: VARTYPE=' + VARTYPE(loRezD) + ' clasa_esec=[' + lcClasaD + ']'
|
|
ENDIF
|
|
DO PnAssert WITH 'D2 verdict ANAF pe path-ul din roagest.prg', VARTYPE(loRezD) = 'O'
|
|
DO PnAssert WITH 'D3 fara clasa de esec (banda arata verdictul, nu "ANAF nu a raspuns")', lcClasaD == ''
|
|
|
|
CATCH TO loEx
|
|
DO PnLog WITH 'EXCEPTIE NEPRINSA: ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
|
|
ENDTRY
|
|
|
|
DO PnLog WITH 'REZULTAT: ' + TRANSFORM(gnPass) + '/' + TRANSFORM(gnAsserts) + ' PASS'
|
|
QUIT
|
|
|
|
PROCEDURE PnAssert
|
|
LPARAMETERS tcNume, tlOk
|
|
gnAsserts = gnAsserts + 1
|
|
IF tlOk
|
|
gnPass = gnPass + 1
|
|
ENDIF
|
|
DO PnLog WITH IIF(tlOk, 'PASS ', 'FAIL ') + tcNume
|
|
ENDPROC
|
|
|
|
PROCEDURE PnErr
|
|
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
|
|
DO PnLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
|
|
ENDPROC
|
|
|
|
PROCEDURE PnLog
|
|
LPARAMETERS tcMsg
|
|
STRTOFILE(TRANSFORM(tcMsg) + CHR(13)+CHR(10), gcUILog, .T.)
|
|
ENDPROC
|
|
|
|
DEFINE CLASS executor_spion AS Custom
|
|
*-- tine locul lui goExecutor: salvarea in ISTORIC_CODURI_FISCALE nu face obiectul testului
|
|
PROCEDURE oExecuta
|
|
LPARAMETERS tcSql, tcAlias
|
|
RETURN .T.
|
|
ENDPROC
|
|
ENDDEFINE
|