Files
comun/utile/Teste/partener_anaf/test_repro_anaf_path_nfjson.prg
Marius Mutu c4d869921d verificare partener: garda pe cont NULL, hook-uri de disciplina, docs compactate
- 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
2026-08-02 22:30:44 +03:00

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