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
239 lines
11 KiB
Plaintext
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
|