Cache ANAF pe ISTORIC_CODURI_FISCALE: verificare din memorie, plasa la tacere ANAF

Verificarile de partener nu mai depind exclusiv de raspunsul ANAF: se citeste
intai cache-ul din ISTORIC_CODURI_FISCALE (mutat in CONTAFIN_ORACLE), cu
provenienta afisata pe ecrane (sursa / data_sursa) si cu plasa de siguranta
cand ANAF tace. Ordinea cache/ANAF e configurabila; cache-ul expira.

- programe/validare.prg: verificare single si pe loturi peste cache, contract
  404 separat de caderea de serviciu, expirarea cache-ului, corectii la
  verdictul pe firma si la etichetarea CACHE_INDISP.
- programe/ocautare.prg: plasa de siguranta si banda de provenienta la cautarea
  de partener.
- programe/oproceduri_comune.prg: VERIFICA_RTVAI_DATA citeste si cache-ul.
- clase/overificari.vc2: propagarea provenientei in interfata.
- utile/Teste/: harness-uri de testare headless - echivalenta cache/ANAF pe 200
  de coduri reale, marginile pe inactiv si TVA la incasare, mock batch ANAF,
  baseline D394 si sondele de diagnostic ANAF.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JCzVWfqscv1xyo5uvJiWiW
This commit is contained in:
2026-08-02 01:31:30 +03:00
parent ebb20fab7e
commit 859e67e874
17 changed files with 3889 additions and 84 deletions

View File

@@ -0,0 +1,103 @@
* sonda_anaf_inline.prg
* Diagnostic (NU repara nimic): PACK_PARTENERI e VALID pe MARIUSM_AUTO, cu semnatura
* SAVE_ISTORIC_COD_FISCAL identica (27 parametri, aceeasi ordine/tip) cu apelul din
* SalveazaIstoricDinCursor (validare.prg:2639-2642) - vezi sonda_pack_parteneri.txt.
* Ipoteza PACK_PARTENERI INVALID e infirmata. Acest script REPLICA inline corpul lui
* ANAF_VerificaCuiSingle (validare.prg:1640), FARA sa modifice validare.prg, cu
* Try/Catch separat pe fiecare din cele trei sub-apeluri (ParseJsonANAFv8,
* SalveazaIstoricDinCursor, ANAF_VerdictDinCursor), ca sa vedem exact care arunca.
*
* Rulare headless:
* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ;
* "D:\ROA\ROACONT\COMUN\utile\Teste\partener_anaf\sonda_anaf_inline.prg"
* Rezultatul se scrie in %TEMP%\sonda_anaf_inline.txt
PUBLIC gcLogFile
gcLogFile = ADDBS(SYS(2023)) + 'sonda_anaf_inline.txt'
SET SAFETY OFF
SET TALK OFF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLogFile)
ON ERROR DO SondaErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO SondaLog WITH 'EROARE: conectare Oracle esuata, gnHandle=' + TRANSFORM(gnHandle)
QUIT
ENDIF
DO SondaLog WITH 'mediu OK, gcS=' + gcS
DO SondaLog WITH 'TYPE(gnIdUtil)=' + TYPE('gnIdUtil') + ' gnIdUtil=' + TRANSFORM(gnIdUtil)
LOCAL loVerifANAF, loHttpG, loEx As Exception
LOCAL lcJsonStringG, lcAliasG, lnCuiCautatG, ldDataG
LOCAL llNegasitG, lcClasaEsecG, loResultG
lcAliasG = 'crsANAFSingleTemp'
lnCuiCautatG = 1879855
ldDataG = DATE()
llNegasitG = .F.
lcClasaEsecG = ''
loResultG = .NULL.
lcJsonStringG = ''
loVerifANAF = CREATEOBJECT('VerificareANAF')
DO SondaLog WITH 'PAS G Createobject(VerificareANAF): OK'
TRY
loHttpG = ANAF_CreeazaCerereANAF(m.lnCuiCautatG, m.ldDataG, .F.)
lcJsonStringG = ALLTRIM(loHttpG.responseText)
DO SondaLog WITH 'PAS G ANAF_CreeazaCerereANAF: OK, Status=' + TRANSFORM(loHttpG.Status) + ' len(json)=' + TRANSFORM(LEN(m.lcJsonStringG))
CATCH TO loEx
DO SondaLog WITH 'PAS G ANAF_CreeazaCerereANAF: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
ENDTRY
IF !EMPTY(m.lcJsonStringG) AND LEFT(m.lcJsonStringG, 1) = '{'
USE IN (SELECT(m.lcAliasG))
TRY
loVerifANAF.ParseJsonANAFv8(nfjsonread(m.lcJsonStringG), m.lcAliasG)
DO SondaLog WITH 'PAS G ParseJsonANAFv8: OK, alias deschis=' + TRANSFORM(USED(m.lcAliasG)) + ' RECCOUNT=' + IIF(USED(m.lcAliasG), TRANSFORM(RECCOUNT(m.lcAliasG)), '-')
CATCH TO loEx
DO SondaLog WITH 'PAS G ParseJsonANAFv8: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
ENDTRY
TRY
loVerifANAF.SalveazaIstoricDinCursor(m.lcAliasG, gnIdUtil)
DO SondaLog WITH 'PAS G SalveazaIstoricDinCursor: OK, alias deschis=' + TRANSFORM(USED(m.lcAliasG)) + ' RECCOUNT=' + IIF(USED(m.lcAliasG), TRANSFORM(RECCOUNT(m.lcAliasG)), '-')
IF USED(m.lcAliasG)
LOCAL lnSelSaveG
lnSelSaveG = SELECT()
SELECT (m.lcAliasG)
DO SondaLog WITH 'PAS G dupa Salveaza - pozitie cursor: RECNO=' + TRANSFORM(RECNO()) + ' EOF=' + TRANSFORM(EOF()) + ' denumire=[' + NVL(denumire, '<NULL>') + '] cui=' + TRANSFORM(NVL(cui, -1))
SELECT (m.lnSelSaveG)
ENDIF
CATCH TO loEx
DO SondaLog WITH 'PAS G SalveazaIstoricDinCursor: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
ENDTRY
TRY
loResultG = ANAF_VerdictDinCursor(m.lcAliasG, m.lnCuiCautatG, @llNegasitG, @lcClasaEsecG)
DO SondaLog WITH 'PAS G ANAF_VerdictDinCursor: OK, VARTYPE(loResultG)=' + VARTYPE(loResultG) + ' tlNegasit=' + TRANSFORM(llNegasitG) + ' tcClasaEsec=' + m.lcClasaEsecG
CATCH TO loEx
DO SondaLog WITH 'PAS G ANAF_VerdictDinCursor: EXCEPTIE ' + loEx.Message + ' [' + loEx.Procedure + ':' + TRANSFORM(loEx.LineNo) + ']'
ENDTRY
ELSE
DO SondaLog WITH 'PAS G: raspuns gol sau nu incepe cu {, sarim parsarea'
ENDIF
DO SondaLog WITH 'REZULTAT: TERMINAT ' + TTOC(DATETIME())
QUIT
PROCEDURE SondaErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO SondaLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE SondaLog
LPARAMETERS tcMsg
LOCAL lcL
lcL = FILETOSTR(gcLogFile)
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcLogFile)
ENDPROC

View File

@@ -0,0 +1,149 @@
* sonda_anaf_single.prg
* Diagnostic (NU repara nimic): pe schema MARIUSM_AUTO, ecranul de cautare partener arata
* pentru toate codurile fiscale banda "ANAF nu a raspuns - verificare sarita"
* (COMUN\programe\ocautare.prg:801), desi ANAF raspunde OK 200 la curl direct pe aceeasi masina.
* Scopul scriptului: izoleaza pasul care arunca exceptie in ANAF_VerificaCuiSingle /
* ANAF_CreeazaCerereANAF (validare.prg), pas cu pas, cu Try/Catch separat pe fiecare bucata.
*
* Rulare headless (nu tine VFP IDE sau roacont.exe deschis):
* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ;
* "D:\ROA\ROACONT\COMUN\utile\Teste\partener_anaf\sonda_anaf_single.prg"
* Rezultatul se scrie in %TEMP%\sonda_anaf_single.txt
PUBLIC gcLogFile
gcLogFile = ADDBS(SYS(2023)) + 'sonda_anaf_single.txt'
SET SAFETY OFF
SET TALK OFF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLogFile)
DO SondaLog WITH 'SET(SAFETY)=' + SET('SAFETY') + ' SET(RESOURCE)=' + SET('RESOURCE')
ON ERROR DO SondaErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO SondaLog WITH 'EROARE: conectare Oracle esuata, gnHandle=' + TRANSFORM(gnHandle)
DO SondaLog WITH 'REZULTAT: NEDETERMINAT'
QUIT
ENDIF
DO SondaLog WITH 'mediu OK, gnAn=' + TRANSFORM(gnAn) + ' luna=' + TRANSFORM(gnLuna) + ' gcS=' + gcS
* ===== pas 0: instantiere VerificareANAF, ca in ANAF_VerificaCuiSingle - incarca =====
* ===== nfjsonread.prg / nfjsoncreate.prg ca proceduri (VerificareANAF.Init) =====
LOCAL loVerifANAF, loEx1 As Exception
TRY
loVerifANAF = CREATEOBJECT('VerificareANAF')
DO SondaLog WITH 'PAS0 CREATEOBJECT(VerificareANAF): OK, nfjsonread/nfjsoncreate incarcate'
CATCH TO loEx1
DO SondaLog WITH 'PAS0 CREATEOBJECT(VerificareANAF): EXCEPTIE ' + loEx1.Message + ' [' + loEx1.Procedure + ':' + TRANSFORM(loEx1.LineNo) + ']'
ENDTRY
* ===== pas A: doar Createobject('winHTTP.winHTTPrequest.5.1') =====
LOCAL loHttpA, loEx2 As Exception
TRY
loHttpA = CREATEOBJECT('winHTTP.winHTTPrequest.5.1')
DO SondaLog WITH 'PAS A winHTTP.winHTTPrequest.5.1: OK, VARTYPE=' + VARTYPE(loHttpA)
CATCH TO loEx2
DO SondaLog WITH 'PAS A winHTTP.winHTTPrequest.5.1: EXCEPTIE ' + loEx2.Message + ' [' + loEx2.Procedure + ':' + TRANSFORM(loEx2.LineNo) + ']'
ENDTRY
* ===== pas B: nfjsoncreate pe un array cu un obiect (cui + data), ca in ANAF_CreeazaCerereANAF =====
LOCAL loColB As "empty", laCoduriB[1], lcSendB, loEx3 As Exception
TRY
loColB = CREATEOBJECT('empty')
ADDPROPERTY(loColB, 'cui', 1879855)
ADDPROPERTY(loColB, 'data', '2026-08-01')
laCoduriB[1] = loColB
lcSendB = nfjsoncreate(@laCoduriB)
DO SondaLog WITH 'PAS B nfjsoncreate: OK, rezultat=' + TRANSFORM(lcSendB)
CATCH TO loEx3
DO SondaLog WITH 'PAS B nfjsoncreate: EXCEPTIE ' + loEx3.Message + ' [' + loEx3.Procedure + ':' + TRANSFORM(loEx3.LineNo) + ']'
ENDTRY
* ===== pas C: ANAF_CreeazaCerereANAF(1879855, Date(), .F.) direct, sincron =====
LOCAL loHttpC, loEx4 As Exception
TRY
loHttpC = ANAF_CreeazaCerereANAF(1879855, DATE(), .F.)
IF VARTYPE(loHttpC) = 'O'
DO SondaLog WITH 'PAS C ANAF_CreeazaCerereANAF: OK, Status=' + TRANSFORM(loHttpC.Status) + ' responseText(200)=' + LEFT(ALLTRIM(loHttpC.responseText), 200)
ELSE
DO SondaLog WITH 'PAS C ANAF_CreeazaCerereANAF: OK dar VARTYPE=' + VARTYPE(loHttpC) + ' (nu e obiect)'
ENDIF
CATCH TO loEx4
DO SondaLog WITH 'PAS C ANAF_CreeazaCerereANAF: EXCEPTIE ' + loEx4.Message + ' [' + loEx4.Procedure + ':' + TRANSFORM(loEx4.LineNo) + ']'
ENDTRY
* ===== pas E: nfjsonread + ParseJsonANAFv8 direct pe raspunsul de la pasul C, izolat =====
LOCAL loParsedE, loEx5 As Exception
IF VARTYPE(loHttpC) = 'O'
TRY
loParsedE = nfjsonread(ALLTRIM(loHttpC.responseText))
DO SondaLog WITH 'PAS E nfjsonread: OK, TYPE=' + TYPE('loParsedE') + ' PEMSTATUS(found_vfpsafe_)=' + TRANSFORM(PEMSTATUS(loParsedE, 'found_vfpsafe_', 5))
loVerifANAF.ParseJsonANAFv8(loParsedE, 'crsDiagE')
DO SondaLog WITH 'PAS E ParseJsonANAFv8: OK, RECCOUNT(crsDiagE)=' + TRANSFORM(RECCOUNT('crsDiagE'))
IF USED('crsDiagE') AND RECCOUNT('crsDiagE') > 0
SELECT crsDiagE
GO TOP
DO SondaLog WITH 'PAS E primul rand: cui=' + TRANSFORM(NVL(cui, 0)) + ' denumire=' + NVL(denumire, '')
ENDIF
CATCH TO loEx5
DO SondaLog WITH 'PAS E nfjsonread/ParseJsonANAFv8: EXCEPTIE ' + loEx5.Message + ' [' + loEx5.Procedure + ':' + TRANSFORM(loEx5.LineNo) + ']'
ENDTRY
ELSE
DO SondaLog WITH 'PAS E: sarit, loHttpC nu e obiect (PAS C a esuat)'
ENDIF
* ===== pas F: exact linia "Use In (Select(alias))" din ANAF_VerificaCuiSingle, pe un alias =====
* ===== care NU e deschis (ca la primul apel din sesiune) =====
LOCAL lcAliasF, lnSelF, loEx6 As Exception
lcAliasF = "crsANAFSingleTemp"
lnSelF = SELECT(m.lcAliasF)
DO SondaLog WITH 'PAS F SELECT(' + m.lcAliasF + ')=' + TRANSFORM(lnSelF) + ' inainte de orice Use'
TRY
Use In (SELECT(m.lcAliasF))
DO SondaLog WITH 'PAS F Use In (Select(alias)) pe alias neschis: OK'
CATCH TO loEx6
DO SondaLog WITH 'PAS F Use In (Select(alias)) pe alias neschis: EXCEPTIE ' + loEx6.Message + ' [' + loEx6.Procedure + ':' + TRANSFORM(loEx6.LineNo) + ']'
ENDTRY
* ===== pas D: fluxul real, ANAF_VerificaCuiSingle, pentru cele 3 coduri fiscale =====
LOCAL lcCui, loResult, llNegasit, lcClasaEsec, lnI
LOCAL ARRAY laCui[3]
laCui[1] = '1879855'
laCui[2] = '12751583'
laCui[3] = '11980333'
FOR lnI = 1 TO 3
lcCui = laCui[lnI]
llNegasit = .F.
lcClasaEsec = ''
loResult = ANAF_VerificaCuiSingle(m.lcCui, DATE(), @llNegasit, @lcClasaEsec)
IF VARTYPE(loResult) = 'O'
DO SondaLog WITH 'PAS D CUI=' + m.lcCui + ' -> OBIECT, denumire=' + NVL(loResult.denumire, '') + ' tlNegasit=' + TRANSFORM(llNegasit) + ' tcClasaEsec=' + m.lcClasaEsec
ELSE
DO SondaLog WITH 'PAS D CUI=' + m.lcCui + ' -> VARTYPE=' + VARTYPE(loResult) + ' tlNegasit=' + TRANSFORM(llNegasit) + ' tcClasaEsec=' + m.lcClasaEsec
ENDIF
IF USED('crsANAFSingleTemp')
LOCAL lnSelSaveD
lnSelSaveD = SELECT()
SELECT crsANAFSingleTemp
DO SondaLog WITH 'PAS D dupa CUI=' + m.lcCui + ': crsANAFSingleTemp deschis, RECCOUNT=' + TRANSFORM(RECCOUNT()) + ' RECNO=' + TRANSFORM(RECNO()) + ' EOF=' + TRANSFORM(EOF()) + ' denumire=[' + NVL(denumire, '<NULL>') + ']'
SELECT (m.lnSelSaveD)
ELSE
DO SondaLog WITH 'PAS D dupa CUI=' + m.lcCui + ': crsANAFSingleTemp NU e deschis'
ENDIF
ENDFOR
DO SondaLog WITH 'REZULTAT: TERMINAT ' + TTOC(DATETIME())
QUIT
PROCEDURE SondaErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO SondaLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE SondaLog
LPARAMETERS tcMsg
LOCAL lcL
lcL = FILETOSTR(gcLogFile)
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcLogFile)
ENDPROC

View File

@@ -0,0 +1,103 @@
* sonda_pack_parteneri.prg
* Diagnostic (NU repara nimic, doar SELECT-uri): verifica pe schema MARIUSM_AUTO daca
* PACK_PARTENERI e INVALID sau are alta semnatura pentru SAVE_ISTORIC_COD_FISCAL, in
* contextul mutarii ISTORIC_CODURI_FISCALE si recompilarii pachetului din 31.07/01.08.2026
* (vezi D:\ROA\DATABASE\SCRIPTURI_CLAR\2026\08\ff_2026_08_01_02_COMUN_PACK_PARTENERI.sql).
* Foloseste goExecutor (aceeasi conexiune Oracle ca restul harnessului), doar SELECT-uri
* pe dictionarul de date (all_objects/all_arguments/all_errors/all_tables) - nimic scris.
*
* Rulare headless:
* & "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" -A -T ;
* "D:\ROA\ROACONT\COMUN\utile\Teste\partener_anaf\sonda_pack_parteneri.prg"
* Rezultatul se scrie in %TEMP%\sonda_pack_parteneri.txt
PUBLIC gcLogFile
gcLogFile = ADDBS(SYS(2023)) + 'sonda_pack_parteneri.txt'
SET SAFETY OFF
SET TALK OFF
STRTOFILE('START ' + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLogFile)
ON ERROR DO SondaErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO()
ON SHUTDOWN QUIT
DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT'
IF gnHandle <= 0
DO SondaLog WITH 'EROARE: conectare Oracle esuata, gnHandle=' + TRANSFORM(gnHandle)
QUIT
ENDIF
DO SondaLog WITH 'mediu OK, gcS=' + gcS
* ===== a) obiecte INVALID pe MARIUSM_AUTO =====
LOCAL llSucces
llSucces = goExecutor.oExecuta("SELECT object_name, object_type, status, last_ddl_time FROM all_objects WHERE owner = 'MARIUSM_AUTO' AND status <> 'VALID' ORDER BY object_type, object_name", "crsInvalid")
IF m.llSucces
SELECT crsInvalid
DO SondaLog WITH 'a) obiecte INVALID pe MARIUSM_AUTO: RECCOUNT=' + TRANSFORM(RECCOUNT())
SCAN
DO SondaLog WITH ' ' + ALLTRIM(object_type) + ' ' + ALLTRIM(object_name) + ' status=' + ALLTRIM(status) + ' last_ddl=' + TTOC(last_ddl_time)
ENDSCAN
ELSE
DO SondaLog WITH 'a) EROARE la interogarea all_objects (INVALID)'
ENDIF
* ===== b) starea PACK_PARTENERI + semnatura SAVE_ISTORIC_COD_FISCAL =====
llSucces = goExecutor.oExecuta("SELECT object_type, status, last_ddl_time FROM all_objects WHERE owner='MARIUSM_AUTO' AND object_name='PACK_PARTENERI'", "crsStare")
IF m.llSucces
SELECT crsStare
DO SondaLog WITH 'b) PACK_PARTENERI RECCOUNT=' + TRANSFORM(RECCOUNT())
SCAN
DO SondaLog WITH ' ' + ALLTRIM(object_type) + ' status=' + ALLTRIM(status) + ' last_ddl=' + TTOC(last_ddl_time)
ENDSCAN
ELSE
DO SondaLog WITH 'b) EROARE la interogarea all_objects (PACK_PARTENERI)'
ENDIF
llSucces = goExecutor.oExecuta("SELECT argument_name, position, data_type FROM all_arguments WHERE owner='MARIUSM_AUTO' AND package_name='PACK_PARTENERI' AND object_name='SAVE_ISTORIC_COD_FISCAL' ORDER BY position", "crsArg")
IF m.llSucces
SELECT crsArg
DO SondaLog WITH 'b) SAVE_ISTORIC_COD_FISCAL argumente: RECCOUNT=' + TRANSFORM(RECCOUNT())
SCAN
DO SondaLog WITH ' pos=' + TRANSFORM(position) + ' ' + NVL(argument_name, '<return>') + ' ' + ALLTRIM(data_type)
ENDSCAN
ELSE
DO SondaLog WITH 'b) EROARE la interogarea all_arguments'
ENDIF
* ===== c) erori de compilare, daca PACK_PARTENERI e INVALID =====
llSucces = goExecutor.oExecuta("SELECT line, position, text FROM all_errors WHERE owner='MARIUSM_AUTO' AND name='PACK_PARTENERI' ORDER BY sequence", "crsErr")
IF m.llSucces
SELECT crsErr
DO SondaLog WITH 'c) all_errors PACK_PARTENERI: RECCOUNT=' + TRANSFORM(RECCOUNT())
SCAN
DO SondaLog WITH ' linia ' + TRANSFORM(line) + ':' + TRANSFORM(position) + ' ' + ALLTRIM(text)
ENDSCAN
ELSE
DO SondaLog WITH 'c) EROARE la interogarea all_errors'
ENDIF
* ===== d) a ramas tabela locala ISTORIC_CODURI_FISCALE pe schema? =====
llSucces = goExecutor.oExecuta("SELECT table_name FROM all_tables WHERE owner='MARIUSM_AUTO' AND table_name LIKE 'ISTORIC_CODURI_FISCALE%'", "crsTab")
IF m.llSucces
SELECT crsTab
DO SondaLog WITH 'd) tabele ISTORIC_CODURI_FISCALE% pe MARIUSM_AUTO: RECCOUNT=' + TRANSFORM(RECCOUNT())
SCAN
DO SondaLog WITH ' ' + ALLTRIM(table_name)
ENDSCAN
ELSE
DO SondaLog WITH 'd) EROARE la interogarea all_tables'
ENDIF
DO SondaLog WITH 'REZULTAT: TERMINAT ' + TTOC(DATETIME())
QUIT
PROCEDURE SondaErr
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO SondaLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg
ENDPROC
PROCEDURE SondaLog
LPARAMETERS tcMsg
LOCAL lcL
lcL = FILETOSTR(gcLogFile)
STRTOFILE(lcL + tcMsg + CHR(13)+CHR(10), gcLogFile)
ENDPROC

View File

@@ -52,6 +52,13 @@
* ANAF plus data verificarii. Scenariile 11-13 (VerificaDataDocument/VerificaCacheData/
* VerificaDataFallback) acopera data documentului; mock_anaf_verificare.prg retine data primita
* in gdANAFUltimaData (PUBLIC, declarata mai jos).
*
* S12 (contract-cache-anaf.md, 31.07.2026): scenariile cache-ului ANAF pe ISTORIC_CODURI_FISCALE
* (plasa S9/ocautare.prg + helper-ele S3/validare.prg) - CUI-uri dedicate cu cifra de control CIF
* valida (8000090/8000197/8000294/8000391/8000499, gnIdCacheA/B/C/D/F)
* (gnIdCacheA/B/C/D/F), randuri de istoric inserate prin pack_parteneri.save_istoric_cod_fiscal
* (InsereazaIstoricTest); interogarile pe ISTORIC_CODURI_FISCALE se numara cu dummyexecutoristorictest
* (acelasi tipar ca dummyexecutorH2test), ca sa dovedeasca cand cache-ul e sarit sau folosit o singura data.
SET SAFETY OFF
SET TALK OFF
@@ -85,6 +92,21 @@ IF gnHandle <= 0
ENDIF
DO VpaLog WITH 'mediu OK, schema=' + gcS
*!* 01.08.2026 marius.mutu: watermark pe ID, o singura data la inceput - garda pt toate DELETE-urile din ISTORIC_CODURI_FISCALE de mai jos
PUBLIC gnIdMaxIstoricV2UI
gnIdMaxIstoricV2UI = 0
IF goExecutor.oExecuta('SELECT NVL(MAX(ID),0) AS IDMAX FROM ISTORIC_CODURI_FISCALE', 'crsWmIstoricV2UI')
SELECT crsWmIstoricV2UI
GO TOP
gnIdMaxIstoricV2UI = IDMAX
USE IN (SELECT('crsWmIstoricV2UI'))
ENDIF
*!* 01.08.2026 marius.mutu: watermark invalid = SELECT esuat - avertisment explicit, stergerile se vor sari
IF gnIdMaxIstoricV2UI <= 0
DO VpaLog WITH 'ATENTIE: watermark invalid (0) - stergerile din ISTORIC_CODURI_FISCALE vor fi SARITE'
ENDIF
DO VpaLog WITH 'watermark ISTORIC_CODURI_FISCALE id_max=' + TRANSFORM(gnIdMaxIstoricV2UI)
*-- RE-TEST RUNDA 10: fix aplicat in ocautare.prg (guard '_BAZA' eliminat, NewObject pe _label
*-- din _baza.vcx rezolvat pe SET PATH, cu fallback anaf_label) - FARA workaround de test, cale
*-- reala (Activeaza se apeleaza natural, fara SET CLASSLIB manual).
@@ -148,6 +170,7 @@ glMockSondaReusitaManual = .T.
PUBLIC gnIdConcord, gnIdDiscord, gnIdPereche, gnIdNopereche, gnIdPersfiz, gnIdSpatiu, gnIdInactiv, gnIdInexistent
PUBLIC gnIdCnpInv, gnIdCifInv, gnMockInputBox, gnMockInputCount, gcMockUltimPrompt, gcMockInputSecventa
PUBLIC gnIdCadere, gnIdNenumeric
PUBLIC gnIdCacheA, gnIdCacheB, gnIdCacheC, gnIdCacheD, gnIdCacheF
gnMockInputBox = 1
gnMockInputCount = 0
gcMockUltimPrompt = ''
@@ -308,6 +331,17 @@ TRY
DO RuleazaIzolat WITH 'VerificaSondaReuseste'
DO RuleazaIzolat WITH 'VerificaSondaExpira'
*=========================================================================
* Scenariile S12 (contract-cache-anaf.md): cache-ul ANAF pe ISTORIC_CODURI_FISCALE, prin
* plasa de siguranta din ocautare.prg (S9) si helper-ele din validare.prg (S3)
*=========================================================================
DO RuleazaIzolat WITH 'VerificaCacheIndispIstoricPopulat'
DO RuleazaIzolat WITH 'VerificaCacheIndispIstoricGol'
DO RuleazaIzolat WITH 'VerificaCacheIndispIstoricVechi'
DO RuleazaIzolat WITH 'VerificaCodInexistentNuAtingeCache'
DO RuleazaIzolat WITH 'VerificaSeTesteazaNuAtingeCache'
DO RuleazaIzolat WITH 'VerificaOrdineCacheAnafSarit'
DO VpaLog WITH 'GATA - toate scenariile executate'
DO HarnessStep WITH 4, 'toate scenariile executate'
DO HarnessDone WITH 'done'
@@ -325,12 +359,29 @@ QUIT
PROCEDURE CurataDateTest
*-- CORESP_TIP_PART are FK_CORESP_TIP_PART_001 catre NOM_PARTENERI - copilul se sterge inaintea
*-- parintelui (ORA-02292), aceeasi lista de coduri in ambele instructiuni (lcCoduri).
LOCAL lnOk, lnOkCoresp, lcCoduri
lcCoduri = ['RO1112223','7654320','RO7654320','RO 7654320','9000004','9000012','9000039','1234567890128','1234567890123','1234567','RO9000055','TEST NENUMERIC OIL MARKET SRL']
LOCAL lnOk, lnOkCoresp, lcCoduri, lnOkIstoric
lcCoduri = ['RO1112223','7654320','RO7654320','RO 7654320','9000004','9000012','9000039','1234567890128','1234567890123','1234567','RO9000055','TEST NENUMERIC OIL MARKET SRL','8000090','8000197','8000294','8000391','8000499']
lnOkCoresp = goExecutor.oExecuta([DELETE FROM CORESP_TIP_PART WHERE ID_PART IN (SELECT ID_PART FROM NOM_PARTENERI WHERE COD_FISCAL IN (] + m.lcCoduri + [))])
lnOk = goExecutor.oExecuta([DELETE FROM NOM_PARTENERI WHERE COD_FISCAL IN (] + m.lcCoduri + [)])
*-- S12: randuri de istoric ale scenariilor de cache (9000039 e reutilizat de scenariul 4, testul lui isi
*-- insereaza propriul rand pt. CUI-ul existent gnIdInexistent) - plasa de siguranta, fiecare scenariu isi
*-- sterge deja randul propriu la final, dar CurataDateTest acopera si opririle premature (CATCH/FINALLY).
*!* 01.08.2026 marius.mutu: garda pe ID > watermark, prin StergeIstoricV2UI (nu SCHEMA_SURSA - stergea randuri de referinta proprii)
lnOkIstoric = StergeIstoricV2UI("COD_FISCAL IN ('8000090','8000197','8000294','8000391','8000499','9000039')")
DO VpaLog WITH 'CurataDateTest: sters coresp_tip_part=' + TRANSFORM(m.lnOkCoresp) + ' nom_parteneri=' + TRANSFORM(m.lnOk) + ' istoric_coduri_fiscale=' + TRANSFORM(m.lnOkIstoric)
ENDPROC
*!* 01.08.2026 marius.mutu: helper unic pt DELETE-urile din ISTORIC_CODURI_FISCALE - garda watermark o singura data
PROCEDURE StergeIstoricV2UI
LPARAMETERS tcCondCod
LOCAL lnOkD
IF TYPE('gnIdMaxIstoricV2UI') <> 'N' OR gnIdMaxIstoricV2UI <= 0
DO VpaLog WITH 'StergeIstoricV2UI: SARIT - watermark invalid, nu sterg nimic (' + m.tcCondCod + ')'
RETURN 0
ENDIF
lnOkD = goExecutor.oExecuta("DELETE FROM ISTORIC_CODURI_FISCALE WHERE ID > " + TRANSFORM(gnIdMaxIstoricV2UI) + " AND " + m.tcCondCod)
=goExecutor.oExecuta('COMMIT')
DO VpaLog WITH 'CurataDateTest: sters coresp_tip_part=' + TRANSFORM(m.lnOkCoresp) + ' nom_parteneri=' + TRANSFORM(m.lnOk)
RETURN lnOkD
ENDPROC
PROCEDURE CreeazaDateTest
@@ -373,6 +424,22 @@ PROCEDURE CreeazaDateTest
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF NENUMERIC SRL','TEST ANAF NENUMERIC SRL','TEST NENUMERIC OIL MARKET SRL',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
*-- S12: parteneri disposable pt. scenariile de cache (istoric ANAF pe ISTORIC_CODURI_FISCALE)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF CACHE A SRL','TEST ANAF CACHE A SRL','8000090',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF CACHE B SRL','TEST ANAF CACHE B SRL','8000197',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF CACHE C SRL','TEST ANAF CACHE C SRL','8000294',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF CACHE D SRL','TEST ANAF CACHE D SRL','8000391',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF CACHE F SRL','TEST ANAF CACHE F SRL','8000499',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
=goExecutor.oExecuta('COMMIT')
gnIdConcord = 0
@@ -387,6 +454,11 @@ PROCEDURE CreeazaDateTest
gnIdCifInv = 0
gnIdCadere = 0
gnIdNenumeric = 0
gnIdCacheA = 0
gnIdCacheB = 0
gnIdCacheC = 0
gnIdCacheD = 0
gnIdCacheF = 0
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO 7654320'], @gnIdSpatiu)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO1112223'], @gnIdConcord)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '7654320'], @gnIdDiscord)
@@ -399,10 +471,17 @@ PROCEDURE CreeazaDateTest
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '1234567'], @gnIdCifInv)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO9000055'], @gnIdCadere)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'TEST NENUMERIC OIL MARKET SRL'], @gnIdNenumeric)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '8000090'], @gnIdCacheA)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '8000197'], @gnIdCacheB)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '8000294'], @gnIdCacheC)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '8000391'], @gnIdCacheD)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '8000499'], @gnIdCacheF)
DO VpaLog WITH 'CreeazaDateTest: id-uri alocate concord=' + TRANSFORM(gnIdConcord) + ' discord=' + TRANSFORM(gnIdDiscord) + ;
' pereche=' + TRANSFORM(gnIdPereche) + ' spatiu=' + TRANSFORM(gnIdSpatiu) + ;
' nopereche=' + TRANSFORM(gnIdNopereche) + ' persfiz=' + TRANSFORM(gnIdPersfiz) + ;
' cadere=' + TRANSFORM(gnIdCadere) + ' nenumeric=' + TRANSFORM(gnIdNenumeric)
' cadere=' + TRANSFORM(gnIdCadere) + ' nenumeric=' + TRANSFORM(gnIdNenumeric) + ;
' cacheA=' + TRANSFORM(gnIdCacheA) + ' cacheB=' + TRANSFORM(gnIdCacheB) + ' cacheC=' + TRANSFORM(gnIdCacheC) + ;
' cacheD=' + TRANSFORM(gnIdCacheD) + ' cacheF=' + TRANSFORM(gnIdCacheF)
ENDPROC
PROCEDURE PornesteCautare
@@ -2217,6 +2296,428 @@ PROCEDURE VerificaComutareOptiune
RELEASE goCacheANAF_Nivel
ENDPROC
PROCEDURE InsereazaIstoricTest
*-- S12: insereaza un rand in ISTORIC_CODURI_FISCALE prin pack_parteneri.save_istoric_cod_fiscal
*-- (26 parametri, acelasi apel ca in validare.prg), cu scpTVA activ din tdInceput - cel putin o
*-- data de interval, altfel DATAORAV_ANAF ramane null si randul nu conteaza ca proaspat (contract
*-- -cache-anaf.md 2.3). Fara CREATEOBJECT/ADDPROPERTY (doar variabile Private + goExecutor.oExecuta),
*-- deci sigura de apelat dintr-o PROCEDURA (spre deosebire de capcana l). Intoarce .T./.F.
LPARAMETERS tcCui, tcFirma, tdInceput
PRIVATE pcCodFiscal, pcFirma, pcAdresa, pcJudet, pcRegCom, pcCodPostal, pcTelefon, pcFax, pcDataTvamfin, ;
pnPlatitorTvaMfin, pcStare, pnPlatitorTvaVies, pnInterogareVies, pnIdUtil, ;
pnInactiv, pnTvaIncasare, pnSplitTva, ;
pdInceputScpTva, pdSfarsitScpTva, pdAnulImpScpTva, pdInceputTvaInc, pdSfarsitTvaInc, ;
pdInactivare, pdReactivare, pdInceputSplitTva, pdAnulareSplitTva
LOCAL lcSqlIstoric, llOk
pcCodFiscal = m.tcCui
pcFirma = m.tcFirma
pcAdresa = ''
pcJudet = ''
pcRegCom = ''
pcCodPostal = ''
pcTelefon = ''
pcFax = ''
pcDataTvamfin = ''
pnPlatitorTvaMfin = 0
pcStare = ''
pnPlatitorTvaVies = 0
pnInterogareVies = 0
pnIdUtil = 0
pnInactiv = 0
pnTvaIncasare = 0
pnSplitTva = 0
pdInceputScpTva = m.tdInceput
pdSfarsitScpTva = {}
pdAnulImpScpTva = {}
pdInceputTvaInc = {}
pdSfarsitTvaInc = {}
pdInactivare = {}
pdReactivare = {}
pdInceputSplitTva = {}
pdAnulareSplitTva = {}
lcSqlIstoric = "begin pack_parteneri.save_istoric_cod_fiscal(?pcCodFiscal,?pcFirma,?pcAdresa,?pcJudet,?pcRegCom,?pcCodPostal,?pcTelefon,?pcFax,?pcDataTvamfin,?pnPlatitorTvaMfin,?pcStare," + ;
"?pnPlatitorTvaVies,?pnInterogareVies,?pnIdUtil,?pnInactiv,?pnTvaIncasare,?pnSplitTva,?pdInceputScpTva,?pdSfarsitScpTva," + ;
"?pdAnulImpScpTva,?pdInceputTvaInc,?pdSfarsitTvaInc,?pdInactivare,?pdReactivare,?pdInceputSplitTva,?pdAnulareSplitTva); end;"
llOk = goExecutor.oExecuta(m.lcSqlIstoric)
IF m.llOk
=goExecutor.oExecuta('COMMIT')
ENDIF
RETURN m.llOk
ENDPROC
PROCEDURE VerificaCacheIndispIstoricPopulat
*-- S12 scenariile 1+6 (contract-cache-anaf.md, plasa S9): ANAF cazut + istoric proaspat pt.
*-- acelasi CUI -> verdict citit din istoric, etichetat CACHE_INDISP, cu dDataSursa completat si
*-- sufixul "ANAF indisponibil" pe banda; AL DOILEA apel (formular nou, acelasi CUI) vine din
*-- goCacheANAF_Sesiune, FARA o a doua interogare pe ISTORIC_CODURI_FISCALE (contor prin dummy
*-- executor, acelasi tipar ca H2/discriminatorul de documente, mai sus in fisier).
LOCAL loFormP, loVerifP, lnOk, lcCapP, lnInainte, llInsP, loReal, loFormP2, loVerifP2, lnOk2, loDummy, loExcP2
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
llInsP = InsereazaIstoricTest('8000090', 'TEST S12 CACHE POPULAT SRL', {^2020-01-01})
IF !m.llInsP
DO VpaLog WITH 'FAIL cache-indisp-populat (S12/1): insert istoric esuat - ' + goExecutor.cEroare
RETURN
ENDIF
ANAF_SeteazaStareServiciu('CAZUT', 'test S12/1')
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCacheA), 'ctests12a')
loFormP = CREATEOBJECT('cauta_alfa_form', 'ctests12a', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormP.crs_cursor = 'ctests12a'
loFormP.lAles = .F.
loVerifP = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormP, 'oVerifAlegere', loVerifP)
loVerifP.Activeaza(loFormP)
loFormP.WindowType = 0
loFormP.Show()
SELECT ctests12a
GO TOP
lnInainte = gnANAFCallCount
loFormP._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifP
lcCapP = ALLTRIM(loFormP.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND VARTYPE(loVerifP.oStare) = 'O' AND loVerifP.oStare.cSursa == 'CACHE_INDISP' ;
AND !EMPTY(loVerifP.oStare.dDataSursa) AND 'ANAF indisponibil' $ lcCapP AND 'date din' $ lcCapP
DO VpaLog WITH 'PASS cache-indisp-populat (S12/1): ANAF cazut + istoric proaspat -> cSursa=CACHE_INDISP, dDataSursa=' + ;
DTOC(loVerifP.oStare.dDataSursa) + ', banda=[' + lcCapP + '], 0 apeluri ANAF noi'
ELSE
DO VpaLog WITH 'FAIL cache-indisp-populat (S12/1): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' oStare=' + TRANSFORM(VARTYPE(loVerifP.oStare)) + ' banda=[' + lcCapP + ']'
ENDIF
*-- scenariul 6: al doilea apel, pe formular NOU, acelasi CUI - trebuie servit din goCacheANAF_Sesiune,
*-- FARA o a doua interogare pe ISTORIC_CODURI_FISCALE.
loReal = goExecutor
loDummy = CREATEOBJECT('dummyexecutoristorictest')
loDummy.oReal = loReal
goExecutor = loDummy
TRY
lnOk2 = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCacheA), 'ctests12a2')
loFormP2 = CREATEOBJECT('cauta_alfa_form', 'ctests12a2', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormP2.crs_cursor = 'ctests12a2'
loFormP2.lAles = .F.
loVerifP2 = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormP2, 'oVerifAlegere', loVerifP2)
loVerifP2.Activeaza(loFormP2)
loFormP2.WindowType = 0
loFormP2.Show()
SELECT ctests12a2
GO TOP
loFormP2._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifP2
CATCH TO loExcP2
DO VpaLog WITH 'FAIL cache-sesiune-fara-oracle (S12/6, EXCEPTIE): ' + loExcP2.Message
FINALLY
goExecutor = loReal
ENDTRY
IF VARTYPE(loVerifP2.oStare) = 'O' AND loVerifP2.oStare.cSursa == 'CACHE_INDISP' AND loDummy.nIstoricQueryCount = 0
DO VpaLog WITH 'PASS cache-sesiune-fara-oracle (S12/6): al doilea apel (formular nou, acelasi CUI) servit din goCacheANAF_Sesiune, 0 interogari noi pe ISTORIC_CODURI_FISCALE'
ELSE
DO VpaLog WITH 'FAIL cache-sesiune-fara-oracle (S12/6): oStare=' + TRANSFORM(VARTYPE(loVerifP2.oStare)) + ;
' interogari-istoric=' + TRANSFORM(loDummy.nIstoricQueryCount)
ENDIF
TRY
loVerifP.Dezactiveaza()
loVerifP2.Dezactiveaza()
CATCH
ENDTRY
loFormP.Release()
loFormP2.Release()
IF USED('ctests12a')
USE IN ctests12a
ENDIF
IF USED('ctests12a2')
USE IN ctests12a2
ENDIF
*!* 01.08.2026 marius.mutu: garda pe ID > watermark, prin StergeIstoricV2UI (nu SCHEMA_SURSA - stergea randuri de referinta proprii)
=StergeIstoricV2UI("COD_FISCAL = '8000090'")
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa S12/1')
ENDPROC
PROCEDURE VerificaCacheIndispIstoricGol
*-- S12 scenariul 2: ANAF cazut, istoric FARA niciun rand pt. CUI -> comportament identic cu azi
*-- (.NULL., banda "ANAF nu a raspuns - verificare sarita"), fara eticheta de cache.
LOCAL loFormG, loVerifG, lnOk, lcCapG, lnInainte
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
ANAF_SeteazaStareServiciu('CAZUT', 'test S12/2')
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCacheB), 'ctests12b')
loFormG = CREATEOBJECT('cauta_alfa_form', 'ctests12b', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormG.crs_cursor = 'ctests12b'
loFormG.lAles = .F.
loVerifG = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormG, 'oVerifAlegere', loVerifG)
loVerifG.Activeaza(loFormG)
loFormG.WindowType = 0
loFormG.Show()
SELECT ctests12b
GO TOP
lnInainte = gnANAFCallCount
loFormG._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifG
lcCapG = ALLTRIM(loFormG.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND ISNULL(loVerifG.oStare) AND 'ANAF nu a raspuns - verificare sarita' $ lcCapG
DO VpaLog WITH 'PASS cache-indisp-istoric-gol (S12/2): ANAF cazut, istoric gol -> .NULL., banda identica cu azi [' + lcCapG + ']'
ELSE
DO VpaLog WITH 'FAIL cache-indisp-istoric-gol (S12/2): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' oStare=' + TRANSFORM(VARTYPE(loVerifG.oStare)) + ' banda=[' + lcCapG + ']'
ENDIF
loVerifG.Dezactiveaza()
loFormG.Release()
IF USED('ctests12b')
USE IN ctests12b
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa S12/2')
ENDPROC
PROCEDURE VerificaCacheIndispIstoricVechi
*-- S12 scenariul 3: ANAF cazut, istoric are un rand pt. CUI dar DATAORAV_ANAF mai vechi decat
*-- ANAFCACHEZILE (30 zile implicit) -> filtrul din CitesteIstoricPentruCoduri il exclude, deci
*-- comportamentul ramane identic cu istoricul gol (.NULL.).
LOCAL loFormV, loVerifV, lnOk, lcCapV, lnInainte, llInsV
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
llInsV = InsereazaIstoricTest('8000294', 'TEST S12 CACHE VECHI SRL', {^2020-01-01})
IF !m.llInsV
DO VpaLog WITH 'FAIL cache-indisp-istoric-vechi (S12/3): insert istoric esuat - ' + goExecutor.cEroare
RETURN
ENDIF
*-- imbatraneste DATAORAV_ANAF direct in Oracle - numai randul propriu de test (COD_FISCAL='8000294')
=goExecutor.oExecuta("UPDATE ISTORIC_CODURI_FISCALE SET DATAORAV_ANAF = SYSDATE - 40 WHERE COD_FISCAL = '8000294'")
=goExecutor.oExecuta('COMMIT')
ANAF_SeteazaStareServiciu('CAZUT', 'test S12/3')
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCacheC), 'ctests12c')
loFormV = CREATEOBJECT('cauta_alfa_form', 'ctests12c', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormV.crs_cursor = 'ctests12c'
loFormV.lAles = .F.
loVerifV = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormV, 'oVerifAlegere', loVerifV)
loVerifV.Activeaza(loFormV)
loFormV.WindowType = 0
loFormV.Show()
SELECT ctests12c
GO TOP
lnInainte = gnANAFCallCount
loFormV._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifV
lcCapV = ALLTRIM(loFormV.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND ISNULL(loVerifV.oStare) AND 'ANAF nu a raspuns - verificare sarita' $ lcCapV
DO VpaLog WITH 'PASS cache-indisp-istoric-vechi (S12/3): istoric 40 zile (peste ANAFCACHEZILE=30) -> .NULL., nu se ofera nimic [' + lcCapV + ']'
ELSE
DO VpaLog WITH 'FAIL cache-indisp-istoric-vechi (S12/3): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' oStare=' + TRANSFORM(VARTYPE(loVerifV.oStare)) + ' banda=[' + lcCapV + ']'
ENDIF
loVerifV.Dezactiveaza()
loFormV.Release()
IF USED('ctests12c')
USE IN ctests12c
ENDIF
*!* 01.08.2026 marius.mutu: garda pe ID > watermark, prin StergeIstoricV2UI (nu SCHEMA_SURSA - stergea randuri de referinta proprii)
=StergeIstoricV2UI("COD_FISCAL = '8000294'")
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa S12/3')
ENDPROC
PROCEDURE VerificaCodInexistentNuAtingeCache
*-- S12 scenariul 4: cod fiscal valid ca structura dar negasit la ANAF (tlNegasit) -> verdict
*-- "inexistent", istoricul NU e atins deloc (nici citit, nici folosit ca plasa) - chiar daca exista
*-- un rand proaspat pt. acelasi CUI. Contor de interogari pe ISTORIC_CODURI_FISCALE prin dummy
*-- executor (acelasi tipar ca H2/discriminatorul de documente, mai sus in fisier).
LOCAL loFormN, loVerifN, lnOk, lcCapN, llInsN, loReal, loDummy, loExcN4
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
llInsN = InsereazaIstoricTest('9000039', 'TEST S12 NU TREBUIE FOLOSIT SRL', {^2020-01-01})
IF !m.llInsN
DO VpaLog WITH 'FAIL cod-inexistent-nu-atinge-cache (S12/4): insert istoric esuat - ' + goExecutor.cEroare
RETURN
ENDIF
loReal = goExecutor
loDummy = CREATEOBJECT('dummyexecutoristorictest')
loDummy.oReal = loReal
goExecutor = loDummy
TRY
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdInexistent), 'ctests12d')
loFormN = CREATEOBJECT('cauta_alfa_form', 'ctests12d', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormN.crs_cursor = 'ctests12d'
loFormN.lAles = .F.
loVerifN = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormN, 'oVerifAlegere', loVerifN)
loVerifN.Activeaza(loFormN)
loFormN.WindowType = 0
loFormN.Show()
SELECT ctests12d
GO TOP
loFormN._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifN
lcCapN = ALLTRIM(loFormN.lb_anaf.Caption)
CATCH TO loExcN4
lcCapN = 'EXCEPTIE: ' + loExcN4.Message
FINALLY
goExecutor = loReal
ENDTRY
IF 'Cod fiscal inexistent la ANAF (9000039)' $ lcCapN AND loDummy.nIstoricQueryCount = 0
DO VpaLog WITH 'PASS cod-inexistent-nu-atinge-cache (S12/4): verdict inexistent, 0 interogari pe ISTORIC_CODURI_FISCALE (istoric avea rand proaspat, neatins) - [' + lcCapN + ']'
ELSE
DO VpaLog WITH 'FAIL cod-inexistent-nu-atinge-cache (S12/4): banda=[' + lcCapN + '] interogari-istoric=' + TRANSFORM(loDummy.nIstoricQueryCount)
ENDIF
TRY
loVerifN.Dezactiveaza()
CATCH
ENDTRY
loFormN.Release()
IF USED('ctests12d')
USE IN ctests12d
ENDIF
*!* 01.08.2026 marius.mutu: garda pe ID > watermark, prin StergeIstoricV2UI (nu SCHEMA_SURSA - stergea randuri de referinta proprii)
=StergeIstoricV2UI("COD_FISCAL = '9000039'")
ENDPROC
PROCEDURE VerificaSeTesteazaNuAtingeCache
*-- S12 scenariul 5: sonda in aer (stare SE_TESTEAZA) ramane neschimbata dupa S9 - randul NU face
*-- apel ANAF propriu si NU atinge istoricul (spre deosebire de CAZUT/FARA_RASPUNS, care citesc din
*-- cache); banda ramane "ANAF: se verifica ...", nu devine CACHE_INDISP.
LOCAL loFormT5, loVerifT5, lnOk, lcCapT5, lnInainte, llInsT5
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
llInsT5 = InsereazaIstoricTest('8000391', 'TEST S12 CACHE SONDA SRL', {^2020-01-01})
IF !m.llInsT5
DO VpaLog WITH 'FAIL se-testeaza-nu-atinge-cache (S12/5): insert istoric esuat - ' + goExecutor.cEroare
RETURN
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'pregatire S12/5')
gcMockSondaModo = 'MANUAL'
glMockSondaGataManual = .F.
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCacheD), 'ctests12e')
loFormT5 = CREATEOBJECT('cauta_alfa_form', 'ctests12e', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormT5.crs_cursor = 'ctests12e'
loFormT5.lAles = .F.
loVerifT5 = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormT5, 'oVerifAlegere', loVerifT5)
loVerifT5.Activeaza(loFormT5) && NECUNOSCUT -> porneste sonda (mock) -> SE_TESTEAZA
loFormT5.WindowType = 0
loFormT5.Show()
SELECT ctests12e
GO TOP
lnInainte = gnANAFCallCount
loFormT5._GRID1.AfterRowColChange(1)
DOEVENTS FORCE
lcCapT5 = ALLTRIM(loFormT5.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND ANAF_StareServiciu() == 'SE_TESTEAZA' AND 'ANAF: se verifica' $ lcCapT5 ;
AND (ISNULL(loVerifT5.oStare) OR loVerifT5.oStare.cSursa <> 'CACHE_INDISP')
DO VpaLog WITH 'PASS se-testeaza-nu-atinge-cache (S12/5): sonda in aer -> neschimbat, banda [' + lcCapT5 + '], nu trece prin cache desi istoricul are rand proaspat'
ELSE
DO VpaLog WITH 'FAIL se-testeaza-nu-atinge-cache (S12/5): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' stare=' + ANAF_StareServiciu() + ' banda=[' + lcCapT5 + ']'
ENDIF
loVerifT5.Dezactiveaza()
loFormT5.Release()
IF USED('ctests12e')
USE IN ctests12e
ENDIF
*!* 01.08.2026 marius.mutu: garda pe ID > watermark, prin StergeIstoricV2UI (nu SCHEMA_SURSA - stergea randuri de referinta proprii)
=StergeIstoricV2UI("COD_FISCAL = '8000391'")
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa S12/5')
gcMockSondaModo = 'AUTO'
ENDPROC
PROCEDURE VerificaOrdineCacheAnafSarit
*-- S12 scenariul 7: OrdineCache('UNIC')=CACHE,ANAF + rand proaspat in istoric -> ANAF NU e apelat
*-- deloc (verificat prin gnANAFCallCount), verdictul vine direct din cache (cSursa=CACHE - pe acest
*-- traseu istoricul e incercat INAINTE de starea serviciului).
LOCAL loFormO, loVerifO, lnOk, lcCapO, lnInainte, llInsO, lcOrdineOrig, llAveaRand
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
llInsO = InsereazaIstoricTest('8000499', 'TEST S12 CACHE ORDINE SRL', {^2020-01-01})
IF !m.llInsO
DO VpaLog WITH 'FAIL ordine-cache-anaf-sarit (S12/7): insert istoric esuat - ' + goExecutor.cEroare
RETURN
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'pregatire S12/7')
lcOrdineOrig = ''
=goExecutor.oSelect2Value("SELECT VARVALUE AS NR FROM OPTIUNI WHERE VARNAME = 'ANAFCACHEORDINE_UNIC'", @lcOrdineOrig)
llAveaRand = !EMPTY(NVL(lcOrdineOrig, ''))
IF m.llAveaRand
=goExecutor.oExecuta("UPDATE OPTIUNI SET VARVALUE = 'CACHE,ANAF' WHERE VARNAME = 'ANAFCACHEORDINE_UNIC'")
ELSE
=goExecutor.oExecuta("INSERT INTO OPTIUNI (VARNAME, VARVALUE) VALUES ('ANAFCACHEORDINE_UNIC', 'CACHE,ANAF')")
ENDIF
=goExecutor.oExecuta('COMMIT')
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCacheF), 'ctests12f')
loFormO = CREATEOBJECT('cauta_alfa_form', 'ctests12f', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormO.crs_cursor = 'ctests12f'
loFormO.lAles = .F.
loVerifO = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormO, 'oVerifAlegere', loVerifO)
loVerifO.Activeaza(loFormO)
loFormO.WindowType = 0
loFormO.Show()
SELECT ctests12f
GO TOP
lnInainte = gnANAFCallCount
loFormO._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifO
lcCapO = ALLTRIM(loFormO.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND VARTYPE(loVerifO.oStare) = 'O' AND loVerifO.oStare.cSursa == 'CACHE'
DO VpaLog WITH 'PASS ordine-cache-anaf-sarit (S12/7): OrdineCache=CACHE,ANAF + rand proaspat -> 0 apeluri ANAF, verdict din cache [' + lcCapO + ']'
ELSE
DO VpaLog WITH 'FAIL ordine-cache-anaf-sarit (S12/7): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' oStare=' + TRANSFORM(VARTYPE(loVerifO.oStare)) + ' banda=[' + lcCapO + ']'
ENDIF
loVerifO.Dezactiveaza()
loFormO.Release()
IF USED('ctests12f')
USE IN ctests12f
ENDIF
*-- restaureaza optiunea originala (per schema - alte teste/utilizatori depind de implicit)
IF m.llAveaRand
=goExecutor.oExecuta("UPDATE OPTIUNI SET VARVALUE = '" + STRTRAN(m.lcOrdineOrig, "'", "''") + "' WHERE VARNAME = 'ANAFCACHEORDINE_UNIC'")
ELSE
=goExecutor.oExecuta("DELETE FROM OPTIUNI WHERE VARNAME = 'ANAFCACHEORDINE_UNIC'")
ENDIF
=goExecutor.oExecuta('COMMIT')
*!* 01.08.2026 marius.mutu: garda pe ID > watermark, prin StergeIstoricV2UI (nu SCHEMA_SURSA - stergea randuri de referinta proprii)
=StergeIstoricV2UI("COD_FISCAL = '8000499'")
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa S12/7')
ENDPROC
PROCEDURE VpaErr
*-- OBLIGATORIU headless (depanare_testare_vfp.md): handlerul ON ERROR se termina cu QUIT.
*-- In fluxul normal, erorile din TRY-ul principal ajung la CATCH TO loExc (nu aici) - VpaErr
@@ -2303,3 +2804,34 @@ DEFINE CLASS dummyexecutordoctest AS Custom
RETURN This.oReal.oSelect2Value(m.tcSql, @tuValue)
ENDPROC
ENDDEFINE
*-- S12: dublura de goExecutor pentru scenariile de cache - numara interogarile care ating
*-- ISTORIC_CODURI_FISCALE (CitesteIstoricPentruCoduri trece prin oExecuta, validare.prg), ca sa
*-- dovedeasca cand cache-ul Oracle e sarit (cod negasit la ANAF) sau folosit o singura data (al
*-- doilea apel pe acelasi CUI vine din goCacheANAF_Sesiune).
DEFINE CLASS dummyexecutoristorictest AS Custom
oReal = .NULL.
cEroare = ''
nIstoricQueryCount = 0
PROCEDURE oExecuta
LPARAMETERS tcSql, tcCursor
LOCAL lnRez
IF 'ISTORIC_CODURI_FISCALE' $ UPPER(tcSql)
This.nIstoricQueryCount = This.nIstoricQueryCount + 1
ENDIF
lnRez = This.oReal.oExecuta(m.tcSql, m.tcCursor)
This.cEroare = This.oReal.cEroare
RETURN lnRez
ENDPROC
PROCEDURE oExecute
LPARAMETERS tcSql, tcCursor
LOCAL lnRez
lnRez = This.oReal.oExecute(m.tcSql, m.tcCursor)
This.cEroare = This.oReal.cEroare
RETURN lnRez
ENDPROC
PROCEDURE oSelect2Value
LPARAMETERS tcSql, tuValue
RETURN This.oReal.oSelect2Value(m.tcSql, @tuValue)
ENDPROC
ENDDEFINE