* 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