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
233 lines
10 KiB
Plaintext
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
|