Files
comun/utile/Teste/cache_anaf/test_echivalenta_cache_rtvai.prg
Marius Mutu 859e67e874 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
2026-08-02 01:33:18 +03:00

233 lines
10 KiB
Plaintext

* test_echivalenta_cache_rtvai.prg - S13, Testul 1 EXTINS: echivalenta cache vs ANAF cu RTVAI
* ca al treilea termen de comparatie (docs\stories-cache-anaf.md sectiunea S13, extindere ceruta
* in handoff_cache_anaf.md - "ANAF nu da istoricul complet").
*
* PROBLEMA cu testul simplu cache-vs-ANAF (deja facut de S6, 200 coduri sintetice, 0 diferente):
* daca ANAF si cache-ul stiu AMANDOI o singura perioada (ANAF nu intoarce istoricul complet -
* verificat direct pe serviciu: CUI 16548698 da 2015-05-27->2024-11-01, rtvai_istoric are 9
* perioade din 2013), cei doi termeni sunt de acord CHIAR SI CAND raspunsul e gresit pentru o
* data din trecut. Testul simplu nu ar prinde asta niciodata.
*
* SOLUTIE: pe 8 CUI REALE (companii reale, alese din rtvai_istoric pe MARIUSM_AUTO/CONTAFIN_ORACLE,
* 7-9 perioade fiecare - interogare si tabel complet in docs\diff-S13-teste-echivalenta.md), pentru
* fiecare cod:
* - seed ISTORIC_CODURI_FISCALE cu O SINGURA perioada (cea mai recenta din rtvai_istoric - proxy
* pentru "ce ar spune ANAF azi", documentat/asumat explicit, vezi diff) - asta e SIMULTAN
* termenul (a) cache SI baza termenului (b) ANAF (vezi mai jos)
* - termen (a) CACHE: CitesteIstoricPentruCoduri REALA (validare.prg, cu garda S6) la o data
* VECHE, dinaintea perioadei seedate
* - termen (b) ANAF: simplul test de interval [pLatStart,pLatEnd] - ACELASI interval cu care a
* fost seedat cache-ul (nu exista alt canal ANAF disponibil headless) - reprezinta explicit
* ce ar raspunde cache-ul DACA garda S6 nu ar exista (formula v_tvainc e identica)
* - termen (c) RTVAI: pack_roartvai.PartenerInRTVAI, PROCEDURA REALA neschimbata (S2 nu a
* atins-o inca), citeste rtvai_istoric COMPLET (toate perioadele)
* Plus control: aceeasi comparatie la o data DIN INTERIORUL perioadei seedate - toti 3 termenii
* trebuie sa fie de acord (garda nu trebuie sa strice calea normala).
*
* PASS per cod: la data veche, (a) abtine (nu returneaza rand - garda S6 functioneaza), (b) = 0
* (ANAF/cache-fara-garda ar fi spus gresit "nu"), (c) = 1 (RTVAI, ground truth, spune "da") -
* garda impiedica exact propagarea verdictului gresit pe care (b) l-ar fi dat. La data control,
* (a)=(b)=(c)=1.
*
* Fara CREATEOBJECT/ADDPROPERTY in interiorul unei PROCEDURE (capcana l, depanare_testare_vfp.md) -
* obiectele se construiesc INLINE in programul principal.
SET SAFETY OFF
SET TALK OFF
SET DELETED ON
SET EXACT ON
SET CENTURY ON
SET DATE DMY
SET NULLDISPLAY TO ''
CLOSE DATABASES
PUBLIC gcTestLog, gnTestOk, gnTestTotal
gcTestLog = "D:\ROA\ROACONT\COMUN\utile\Teste\cache_anaf\test_echivalenta_cache_rtvai_log.txt"
gnTestOk = 0
gnTestTotal = 0
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrRTVAI 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 WriteTestLogRTVAI WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT
ENDIF
DO WriteTestLogRTVAI WITH 'mediu OK, schema=' + gcS
*!* 01.08.2026 marius.mutu: watermark pe ID, inainte de orice scriere - garda pt DELETE-ul din CurataIstoricRTVAITest
PUBLIC gnIdMaxIstoricRTVAI
gnIdMaxIstoricRTVAI = 0
IF goExecutor.oExecuta('SELECT NVL(MAX(ID),0) AS IDMAX FROM ISTORIC_CODURI_FISCALE', 'crsWmIstoricRTVAI')
SELECT crsWmIstoricRTVAI
GO TOP
gnIdMaxIstoricRTVAI = IDMAX
USE IN (SELECT('crsWmIstoricRTVAI'))
ENDIF
*!* 01.08.2026 marius.mutu: watermark invalid = SELECT esuat - avertisment explicit, stergerile se vor sari
IF gnIdMaxIstoricRTVAI <= 0
DO WriteTestLogRTVAI WITH 'ATENTIE: watermark invalid (0) - stergerile din ISTORIC_CODURI_FISCALE vor fi SARITE'
ENDIF
DO WriteTestLogRTVAI WITH 'watermark ISTORIC_CODURI_FISCALE id_max=' + TRANSFORM(gnIdMaxIstoricRTVAI)
DO CurataIstoricRTVAITest
PUBLIC goVerifRTVAI
goVerifRTVAI = CREATEOBJECT('VerificareANAF')
* -- 8 CUI REALE, alese din rtvai_istoric (interogare + tabel complet de perioade in diff) --
* cui, pLatStart/pLatEnd = perioada cea mai recenta cunoscuta (proxy ANAF), dOld = in perioada
* VECHE (inainte de pLatStart), dCtrl = in interiorul perioadei recente (control)
IF USED('crsCoduriTest')
USE IN crsCoduriTest
ENDIF
CREATE CURSOR crsCoduriTest (cui N(10), pLatStart D, pLatEnd D, dOld D, dCtrl D)
INSERT INTO crsCoduriTest VALUES (8060237, {^2018-06-14}, {^2020-04-30}, {^2013-03-01}, {^2019-01-01})
INSERT INTO crsCoduriTest VALUES (16548698, {^2015-05-27}, {^2024-11-01}, {^2013-06-01}, {^2016-01-01})
INSERT INTO crsCoduriTest VALUES (17254755, {^2013-12-12}, {^2019-07-07}, {^2013-04-01}, {^2015-01-01})
INSERT INTO crsCoduriTest VALUES (18010589, {^2018-10-31}, {^2019-07-31}, {^2013-04-01}, {^2019-02-01})
INSERT INTO crsCoduriTest VALUES (21438829, {^2019-04-01}, {^2020-01-31}, {^2013-06-01}, {^2019-08-01})
INSERT INTO crsCoduriTest VALUES (28333609, {^2020-04-01}, {^2020-07-31}, {^2013-04-01}, {^2020-06-01})
INSERT INTO crsCoduriTest VALUES (28493170, {^2019-06-19}, {^2019-12-31}, {^2013-04-01}, {^2019-09-01})
INSERT INTO crsCoduriTest VALUES (30719386, {^2016-05-25}, {^2018-02-28}, {^2014-01-01}, {^2017-01-01})
LOCAL lnCui, ldLatStart, ldLatEnd, ldOld, ldCtrl
LOCAL llAAbstineOld, lnAOld, lnBOld, lnCOld, lnACtrl, lnBCtrl, lnCCtrl, llOk
LOCAL lnAllOk, lnTotal
lnAllOk = 0
lnTotal = 0
SELECT crsCoduriTest
SCAN
lnCui = cui
ldLatStart = pLatStart
ldLatEnd = pLatEnd
ldOld = dOld
ldCtrl = dCtrl
* -- seed cache cu perioada "cunoscuta de ANAF" (aceeasi forma ca crsANAF din ParseJsonANAFv8) --
IF USED('crsSeedANAF')
USE IN crsSeedANAF
ENDIF
CREATE CURSOR crsSeedANAF (cui N(13), data D, denumire V(100), firma V(100), adresa C(244), nrRegCom C(30), ;
scpTVA L, data_inceput_ScpTVA D, data_sfarsit_ScpTVA D, data_anul_imp_ScpTVA D, mesaj_ScpTVA C(244), ;
dataInceputTvaInc D, dataSfarsitTvaInc D, dataActualizareTvaInc D, dataPublicareTvaInc D, tipActTvaInc C(100), statusTvaIncasare L, ;
dataInactivare D, dataReactivare D, dataPublicare D, dataRadiere D, statusInactivi L, ;
dataInceputSplitTVA D, dataAnulareSplitTVA D, tva L, tvaincasare L, splittva L, inactiv L, ;
mesaj V(100), judet V(100), strada V(100), nr V(20), localitate V(100), Bloc V(20), scara V(20), etaj V(20), apart V(20), ;
sursa C(20), data_sursa D)
INSERT INTO crsSeedANAF (cui, data, dataInceputTvaInc, dataSfarsitTvaInc, tvaincasare) ;
VALUES (lnCui, DATE(), ldLatStart, ldLatEnd, .T.)
goVerifRTVAI.SalveazaIstoricDinCursor('crsSeedANAF', gnIdUtil)
USE IN crsSeedANAF
* -- termen (a): cache REAL (cu garda S6), la data VECHE - asteptat: abtinere (niciun rand) --
IF USED('crsCacheOld')
USE IN crsCacheOld
ENDIF
goVerifRTVAI.CitesteIstoricPentruCoduri(TRANSFORM(lnCui), ldOld, 'crsCacheOld')
llAAbstineOld = .T.
lnAOld = -1
IF USED('crsCacheOld')
SELECT crsCacheOld
LOCATE FOR cui = lnCui
IF FOUND()
llAAbstineOld = .F.
lnAOld = IIF(tvaincasare, 1, 0)
ENDIF
ENDIF
* -- termen (b): ANAF - acelasi interval unic folosit la seed (nu exista alt canal ANAF headless) --
lnBOld = IIF(BETWEEN(ldOld, ldLatStart, ldLatEnd), 1, 0)
* -- termen (c): RTVAI - procedura REALA neschimbata, citeste rtvai_istoric complet --
lnCOld = ObtineVerdictRTVAI(lnCui, ldOld)
* -- control: data in interiorul perioadei cunoscute - toti 3 termenii trebuie sa fie de acord --
IF USED('crsCacheCtrl')
USE IN crsCacheCtrl
ENDIF
goVerifRTVAI.CitesteIstoricPentruCoduri(TRANSFORM(lnCui), ldCtrl, 'crsCacheCtrl')
lnACtrl = -1
IF USED('crsCacheCtrl')
SELECT crsCacheCtrl
LOCATE FOR cui = lnCui
IF FOUND()
lnACtrl = IIF(tvaincasare, 1, 0)
ENDIF
ENDIF
lnBCtrl = IIF(BETWEEN(ldCtrl, ldLatStart, ldLatEnd), 1, 0)
lnCCtrl = ObtineVerdictRTVAI(lnCui, ldCtrl)
lnTotal = lnTotal + 1
llOk = (lnCOld = 1) AND llAAbstineOld AND (lnBOld = 0) AND ;
(lnCCtrl = 1) AND (lnACtrl = 1) AND (lnBCtrl = 1)
IF llOk
lnAllOk = lnAllOk + 1
ENDIF
DO WriteTestLogRTVAI WITH 'cui=' + TRANSFORM(lnCui) + ;
' | dOld=' + DTOC(ldOld) + ' a(abstine)=' + TRANSFORM(llAAbstineOld) + ' a(val)=' + TRANSFORM(lnAOld) + ' b=' + TRANSFORM(lnBOld) + ' c=' + TRANSFORM(lnCOld) + ;
' | dCtrl=' + DTOC(ldCtrl) + ' a=' + TRANSFORM(lnACtrl) + ' b=' + TRANSFORM(lnBCtrl) + ' c=' + TRANSFORM(lnCCtrl) + ;
' -> ' + IIF(llOk, 'PASS', 'FAIL')
IF USED('crsCacheOld')
USE IN crsCacheOld
ENDIF
IF USED('crsCacheCtrl')
USE IN crsCacheCtrl
ENDIF
SELECT crsCoduriTest
ENDSCAN
DO WriteTestLogRTVAI WITH 'REZULTAT criteriul-8-extins-RTVAI: ' + TRANSFORM(lnAllOk) + '/' + TRANSFORM(lnTotal) + ' coduri PASS'
DO CurataIstoricRTVAITest
QUIT
*-- verdict "TVA la incasare la data D" din rtvai_istoric COMPLET (istoricul importat, nu ANAF),
*-- prin procedura Oracle REALA pack_roartvai.PartenerInRTVAI (neschimbata de S2 inca) --
PROCEDURE ObtineVerdictRTVAI
LPARAMETERS tnCui, tdData
PRIVATE pnCodFiscal, pdData, pcDenumire, pnRTVAI
pnCodFiscal = tnCui
pdData = tdData
pcDenumire = ''
pnRTVAI = 0
LOCAL lcSql
lcSql = [begin pack_roartvai.PartenerInRTVAI(?pnCodFiscal, ?pdData, ?@pcDenumire, ?@pnRTVAI); end;]
IF !goExecutor.oExecuta(lcSql)
RETURN -1
ENDIF
RETURN pnRTVAI
ENDPROC
PROCEDURE WriteTestLogRTVAI
LPARAMETERS tcMesaj
STRTOFILE(TTOC(DATETIME()) + ' ' + tcMesaj + CHR(13)+CHR(10), gcTestLog, 1)
ENDPROC
PROCEDURE VpaErrRTVAI
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO WriteTestLogRTVAI WITH 'ON ERROR nEroare=' + TRANSFORM(tnErr) + ' mesaj=' + tcMsg + ' program=' + tcProg + ' linia=' + TRANSFORM(tnLine)
ENDPROC
*-- sterge DOAR cele 8 CUI reale folosite de acest test din ISTORIC_CODURI_FISCALE --
PROCEDURE CurataIstoricRTVAITest
LOCAL lnSterse
*!* 01.08.2026 marius.mutu: watermark invalid - nu sterg nimic (fara el, DELETE ar lovi tot istoricul comun)
IF TYPE('gnIdMaxIstoricRTVAI') <> 'N' OR gnIdMaxIstoricRTVAI <= 0
DO WriteTestLogRTVAI WITH 'CurataIstoricRTVAITest: SARIT - watermark invalid, nu sterg nimic'
RETURN
ENDIF
*!* 01.08.2026 marius.mutu: garda pe ID > watermark (nu SCHEMA_SURSA - stergea randuri de referinta proprii)
lnSterse = goExecutor.oExecuta([DELETE FROM ISTORIC_CODURI_FISCALE WHERE ID > ] + TRANSFORM(gnIdMaxIstoricRTVAI) + [ AND COD_FISCAL_N IN ] + ;
[(8060237,16548698,17254755,18010589,21438829,28333609,28493170,30719386)])
=goExecutor.oExecuta('COMMIT')
DO WriteTestLogRTVAI WITH 'CurataIstoricRTVAITest: sters=' + TRANSFORM(lnSterse)
ENDPROC