Files
comun/utile/Teste/cache_anaf/test_margine_inactiv_frontiera.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

239 lines
11 KiB
Plaintext

* test_margine_inactiv_frontiera.prg - S13, marginea NEVERIFICATA semnalata in
* docs\diff-S13-teste-echivalenta.md ("REPARATIA FINALA"): CitesteIstoricPentruCoduri (cache REAL,
* validare.prg:2697, formula "?pdDataCache < data_reactivare") trateaza ziua dataReactivare insasi
* ca NEinactiva (sfarsit exclusiv). Documentatia oficiala ANAF (doc_WS_V9.txt, verificata separat -
* citeaza fiecare boolean doar ca "true/false ... la data cautata", fara sa precizeze granita) NU
* confirma si NU infirma aceasta alegere - deci mock-ul (mock_batch_anaf.prg::PropBool, dupa
* reparatia din 01.08.2026) NU mai copiaza sfarsitul exclusiv al cache-ului, foloseste acelasi
* BETWEEN inclusiv ca la scpTVA/tvaIncasare/splitTva.
*
* SCOP: nu decide care variant e "corecta" (nu exista sursa externa care sa spuna) - doar
* demonstreaza, cu rulare reala, exact ZIUA in care cache-ul REAL si mock-ul REPARAT ar da verdicte
* diferite daca cineva ar interoga exact la data reactivarii. O divergenta aici e rezultatul
* ASTEPTAT si CORECT al reparatiei (nu mai e ascunsa de o formula copiata) - se raporteaza ca atare,
* nu ca "FAIL". Cele 3 date de control (inainte de sfarsit, exact la inceput, dupa sfarsit) trebuie
* sa fie de acord pe ambele cai - daca nu sunt, ATUNCI e semnal de bug real.
*
* 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
gcTestLog = "D:\ROA\ROACONT\COMUN\utile\Teste\cache_anaf\test_margine_inactiv_frontiera_log.txt"
STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog)
ON ERROR DO VpaErrMargine 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 WriteTestLogMargine WITH 'EROARE: conectare Oracle esuata - GATA'
QUIT
ENDIF
DO WriteTestLogMargine WITH 'mediu OK, schema=' + gcS
*!* 01.08.2026 marius.mutu: watermark pe ID, inainte de orice scriere - garda pt DELETE-ul din CurataIstoricMargine
PUBLIC gnIdMaxIstoricMargine
gnIdMaxIstoricMargine = 0
IF goExecutor.oExecuta('SELECT NVL(MAX(ID),0) AS IDMAX FROM ISTORIC_CODURI_FISCALE', 'crsWmIstoricMargine')
SELECT crsWmIstoricMargine
GO TOP
gnIdMaxIstoricMargine = IDMAX
USE IN (SELECT('crsWmIstoricMargine'))
ENDIF
*!* 01.08.2026 marius.mutu: watermark invalid = SELECT esuat - avertisment explicit, stergerile se vor sari
IF gnIdMaxIstoricMargine <= 0
DO WriteTestLogMargine WITH 'ATENTIE: watermark invalid (0) - stergerile din ISTORIC_CODURI_FISCALE vor fi SARITE'
ENDIF
DO WriteTestLogMargine WITH 'watermark ISTORIC_CODURI_FISCALE id_max=' + TRANSFORM(gnIdMaxIstoricMargine)
* mock-ul e o SUBCLASA a VerificareANAF - se incarca DUPA test_init_env_auto (vezi mock_batch_anaf.prg)
SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\cache_anaf\mock_batch_anaf.prg" ADDITIVE
PUBLIC goANAFBatchMock, gnANAFBatchApeluri, gcANAFBatchCuiuriTrimise
goANAFBatchMock = CREATEOBJECT('Collection')
gnANAFBatchApeluri = 0
gcANAFBatchCuiuriTrimise = ''
PUBLIC goVerifMargine
goVerifMargine = CREATEOBJECT('VerificareANAFMockBatch')
DO CurataIstoricMargine
* -- 1 CUI de test, cifra de control valida (VALIDARE_CIF), nefolosit de alta suita din transa --
LOCAL lnCui, lcCui, ldInactivare, ldReactivare
lnCui = 80100377
lcCui = TRANSFORM(lnCui)
ldInactivare = {^2023-01-15}
ldReactivare = {^2024-06-01}
* -- seed cache (aceeasi forma ca crsANAF din ParseJsonANAFv8) --
IF USED('crsSeedMargine')
USE IN crsSeedMargine
ENDIF
CREATE CURSOR crsSeedMargine (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 crsSeedMargine (cui, data, dataInactivare, dataReactivare, inactiv) ;
VALUES (lnCui, DATE(), ldInactivare, ldReactivare, .T.)
goVerifMargine.SalveazaIstoricDinCursor('crsSeedMargine', gnIdUtil)
USE IN crsSeedMargine
DO WriteTestLogMargine WITH 'seed cache: cui=' + lcCui + ' dataInactivare=' + DTOC(ldInactivare) + ' dataReactivare=' + DTOC(ldReactivare)
* -- item mock ANAF (aceeasi perioada, ca si cum ANAF ar fi raspuns cu ea) --
LOCAL loMockItem
loMockItem = CREATEOBJECT('Empty')
ADDPROPERTY(loMockItem, 'dataInactivare', DtoisoMargine(ldInactivare))
ADDPROPERTY(loMockItem, 'dataReactivare', DtoisoMargine(ldReactivare))
goANAFBatchMock.Add(loMockItem, 'C' + lcCui)
* -- cursor cu 1 CUI, forma ceruta de ANAF_SincronWebService_PlatitorTva (scan pe cod_fiscal) --
IF USED('crsCuiMargine')
USE IN crsCuiMargine
ENDIF
CREATE CURSOR crsCuiMargine (cod_fiscal C(30))
INSERT INTO crsCuiMargine VALUES (lcCui)
* -- 5 date de proba: inceput (ambele inclusiv, trebuie sa fie de acord), o zi inainte de sfarsit
* (interior, trebuie sa fie de acord), EXACT sfarsitul (marginea disputata - divergenta ASTEPTATA),
* o zi dupa sfarsit (trebuie sa fie de acord) --
IF USED('crsProbeMargine')
USE IN crsProbeMargine
ENDIF
CREATE CURSOR crsProbeMargine (eticheta C(30), proba D, asteptare C(20))
INSERT INTO crsProbeMargine VALUES ('inceput (inclusiv)', ldInactivare, 'ACORD')
INSERT INTO crsProbeMargine VALUES ('o zi inainte de sfarsit', ldReactivare - 1, 'ACORD')
INSERT INTO crsProbeMargine VALUES ('EXACT sfarsitul (frontiera)', ldReactivare, 'DIVERGENTA')
INSERT INTO crsProbeMargine VALUES ('o zi dupa sfarsit', ldReactivare + 1, 'ACORD')
LOCAL lnTotalProbe, lnAcordCorect, lnFrontieraCorecta, lnNeasteptat
lnTotalProbe = 0
lnAcordCorect = 0
lnFrontieraCorecta = 0
lnNeasteptat = 0
SELECT crsProbeMargine
SCAN
LOCAL lcEticheta, ldProba, lcAsteptare, llCacheInactiv, llCacheAbtine, llMockInactiv
lcEticheta = eticheta
ldProba = proba
lcAsteptare = asteptare
* -- termen (a): CACHE REAL, formula exclusiva la sfarsit (validare.prg:2697, neschimbata) --
IF USED('crsCacheMargine')
USE IN crsCacheMargine
ENDIF
goVerifMargine.CitesteIstoricPentruCoduri(lcCui, ldProba, 'crsCacheMargine')
llCacheAbtine = .T.
llCacheInactiv = .F.
IF USED('crsCacheMargine')
SELECT crsCacheMargine
LOCATE FOR cui = lnCui
IF FOUND()
llCacheAbtine = .F.
llCacheInactiv = inactiv
ENDIF
ENDIF
* -- termen (b): MOCK/"ANAF", PropBool reparat (BETWEEN inclusiv, fara sa copieze cache-ul) --
IF USED('crsMockRezMargine')
USE IN crsMockRezMargine
ENDIF
goVerifMargine.ANAF_SincronWebService_PlatitorTva('crsCuiMargine', ldProba, 'crsMockRezMargine')
llMockInactiv = .F.
IF USED('crsMockRezMargine')
SELECT crsMockRezMargine
LOCATE FOR cui = lnCui
IF FOUND()
llMockInactiv = inactiv
ENDIF
ENDIF
lnTotalProbe = lnTotalProbe + 1
*!* 01.08.2026 marius.mutu: ALLTRIM inainte de == - campul asteptare e C(20), padding-ul stricase comparatia (toate randurile cadeau pe ramura ACORD)
IF ALLTRIM(lcAsteptare) == 'DIVERGENTA'
DO CASE
CASE llCacheAbtine
lnNeasteptat = lnNeasteptat + 1
DO WriteTestLogMargine WITH ' ' + lcEticheta + ' (' + DTOC(ldProba) + '): NEASTEPTAT - cache s-a abtinut, nu mai poate fi comparat'
CASE !llCacheInactiv AND llMockInactiv
* exact divergenta prezisa: cache (sfarsit exclusiv) = NU mai e inactiv; mock (inclusiv) = INCA inactiv
lnFrontieraCorecta = lnFrontieraCorecta + 1
DO WriteTestLogMargine WITH ' ' + lcEticheta + ' (' + DTOC(ldProba) + '): DIVERGENTA CONFIRMATA (asteptata) - cache(inactiv=' + TRANSFORM(llCacheInactiv) + ', sfarsit exclusiv) mock(inactiv=' + TRANSFORM(llMockInactiv) + ', sfarsit inclusiv) - marginea ramane neverificata fata de ANAF real, vezi antetul fisierului'
OTHERWISE
lnNeasteptat = lnNeasteptat + 1
DO WriteTestLogMargine WITH ' ' + lcEticheta + ' (' + DTOC(ldProba) + '): NEASTEPTAT - cache(inactiv=' + TRANSFORM(llCacheInactiv) + ') mock(inactiv=' + TRANSFORM(llMockInactiv) + ') nu (mai) corespunde formulelor cunoscute'
ENDCASE
ELSE
IF !llCacheAbtine AND (llCacheInactiv == llMockInactiv)
lnAcordCorect = lnAcordCorect + 1
DO WriteTestLogMargine WITH ' ' + lcEticheta + ' (' + DTOC(ldProba) + '): ACORD (asteptat) - cache(inactiv=' + TRANSFORM(llCacheInactiv) + ') mock(inactiv=' + TRANSFORM(llMockInactiv) + ')'
ELSE
lnNeasteptat = lnNeasteptat + 1
DO WriteTestLogMargine WITH ' ' + lcEticheta + ' (' + DTOC(ldProba) + '): NEASTEPTAT - cache abtine=' + TRANSFORM(llCacheAbtine) + ' cache(inactiv=' + TRANSFORM(llCacheInactiv) + ') mock(inactiv=' + TRANSFORM(llMockInactiv) + ')'
ENDIF
ENDIF
IF USED('crsCacheMargine')
USE IN crsCacheMargine
ENDIF
IF USED('crsMockRezMargine')
USE IN crsMockRezMargine
ENDIF
SELECT crsProbeMargine
ENDSCAN
DO WriteTestLogMargine WITH 'REZULTAT: total=' + TRANSFORM(lnTotalProbe) + ' acord-in-interior=' + TRANSFORM(lnAcordCorect) + '/3 (asteptat 3)' + ;
' divergenta-la-frontiera=' + TRANSFORM(lnFrontieraCorecta) + '/1 (asteptat 1 - marginea ramane neverificata fata de ANAF real)' + ;
' neasteptat=' + TRANSFORM(lnNeasteptat) + ' (asteptat 0)'
DO CurataIstoricMargine
DO WriteTestLogMargine WITH 'GATA'
QUIT
PROCEDURE WriteTestLogMargine
LPARAMETERS tcMesaj
STRTOFILE(TTOC(DATETIME()) + ' ' + tcMesaj + CHR(13)+CHR(10), gcTestLog, 1)
ENDPROC
PROCEDURE VpaErrMargine
LPARAMETERS tnErr, tcMsg, tcProg, tnLine
DO WriteTestLogMargine WITH 'ON ERROR nEroare=' + TRANSFORM(tnErr) + ' mesaj=' + tcMsg + ' program=' + tcProg + ' linia=' + TRANSFORM(tnLine)
ENDPROC
*-- 'YYYY-MM-DD' (formatul mock-ului ANAF, mock_batch_anaf.prg) dintr-o Date VFP; data goala -> '' --
PROCEDURE DtoisoMargine
LPARAMETERS tdVal
IF EMPTY(tdVal)
RETURN ''
ENDIF
RETURN LEFT(DTOS(tdVal),4) + '-' + SUBSTR(DTOS(tdVal),5,2) + '-' + SUBSTR(DTOS(tdVal),7,2)
ENDPROC
*-- sterge DOAR CUI-ul de test al acestui fisier din ISTORIC_CODURI_FISCALE --
PROCEDURE CurataIstoricMargine
LOCAL lnSterse
*!* 01.08.2026 marius.mutu: watermark invalid - nu sterg nimic (fara el, DELETE ar lovi tot istoricul comun)
IF TYPE('gnIdMaxIstoricMargine') <> 'N' OR gnIdMaxIstoricMargine <= 0
DO WriteTestLogMargine WITH 'CurataIstoricMargine: 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(gnIdMaxIstoricMargine) + [ AND COD_FISCAL_N IN (80100377)])
=goExecutor.oExecuta('COMMIT')
DO WriteTestLogMargine WITH 'CurataIstoricMargine: sters=' + TRANSFORM(lnSterse)
ENDPROC