* 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
