Verificare ANAF: raspunsul 404 citit, intrerupator cand serviciul nu raspunde

Serviciul ANAF intoarce HTTP 404 cu corp complet pentru codurile inexistente
({"found":[],"notFound":[...]}), iar wrapper-ul citea corpul doar pe 200 - deci
verdictul "cod inexistent" nu aparea niciodata. Corpul se citeste acum la orice
status, iar verdictul se da doar cand notFound contine chiar codul interogat;
orice alt corp neinteles inseamna "nu a raspuns", nu acuzatie.

Timeout-uri reale pe apelurile web (2/2/3/3): garda Pemstatus din jurul lui
SetTimeouts intoarce .F. pe obiectul COM legat tarziu, deci timeout-urile nu se
aplicau, iar o gazda care inghite pachetele bloca interfata ~21 s per rand.
Aceleasi timeout-uri si pe drumul batch. Fallback-ul Microsoft.XMLHTTP, fara
timeout, a fost scos de pe calea single.

Cand serviciul nu raspunde, verificarile se opresc 10 minute si banda arata ca
au fost sarite, in loc sa taca. La deschiderea formularului pleaca o sonda
asincrona de disponibilitate, cu termen de viata, guard de reintrare si Abort()
la inchidere; randul care asteapta verdictul nu face apel propriu. Cache doar pe
rezultate pozitive. Codul fiscal nenumeric primeste mesaj propriu, in banda si
in detaliile F4.

ParseJsonANAFv8 restaureaza formatul datei si pe calea de eroare (o exceptie
lasa toata sesiunea pe YMD).

Teste: suita headless 70/70, cu sonda si clasele de esec mock-uite (fara retea)
si fixture peste corpurile 404 masurate pe serviciul real.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
This commit is contained in:
2026-07-27 16:25:02 +03:00
parent eacf145536
commit 95cf54e447
7 changed files with 1160 additions and 124 deletions

View File

@@ -13,9 +13,17 @@
* verifica intai goCacheANAF_Sesiune - cache-hit NU ajunge aici).
* runda 12: tdData (data documentului, trimisa de ANAF_StarePartener) e retinuta in gdANAFUltimaData,
* ca testul sa poata verifica ca data ajunge efectiv la wrapper.
* T7/lane E (handoff_anaf_404.md): al 4-lea parametru tcClasaEsec, prin referinta, identic cu wrapper-ul
* real ('' / 'FARA_RASPUNS' / 'RASPUNS_NEINTELES'). Simulare clasa de esec: daca valoarea din
* goANAFMockData pentru o cheie e STRING (nu obiect), e tratata ca nume de clasa de esec - mock-ul
* intoarce .NULL. cu tcClasaEsec = acea valoare, fara sa atinga tlNegasit (ramane .F., ca la wrapper-ul
* real pe caile FARA_RASPUNS/RASPUNS_NEINTELES). Restul (CUI neconfigurat = "cod inexistent" simulat) e
* neschimbat.
FUNCTION ANAF_VerificaCuiSingle
LPARAMETERS tcCui, tdData
LOCAL lcCui, lcKey
LPARAMETERS tcCui, tdData, tlNegasit, tcClasaEsec
LOCAL lcCui, lcKey, luItem
tlNegasit = .F.
tcClasaEsec = ''
IF TYPE('goANAFMockData') <> 'O'
RETURN .NULL.
ENDIF
@@ -28,7 +36,54 @@ FUNCTION ANAF_VerificaCuiSingle
lcCui = NormalizeazaCUI(m.tcCui)
lcKey = 'C' + m.lcCui
IF goANAFMockData.GetKey(m.lcKey) = 0
RETURN .NULL. && CUI neconfigurat - simuleaza "fara raspuns" (degradare tacuta)
tlNegasit = .T. && CUI neconfigurat - simuleaza raspunsul ANAF "cod inexistent"
RETURN .NULL.
ENDIF
RETURN goANAFMockData.Item(m.lcKey)
luItem = goANAFMockData.Item(m.lcKey)
IF VARTYPE(m.luItem) = 'C'
tcClasaEsec = m.luItem && simuleaza esecul wrapper-ului (FARA_RASPUNS / RASPUNS_NEINTELES)
RETURN .NULL.
ENDIF
RETURN m.luItem
ENDFUNC
* T7/lane E, dupa T5/sonda (handoff_anaf_404.md): mock peste sonda asincrona de disponibilitate
* (ANAF_SondaPorneste/AuSositRaspunsul/AReusit/Opreste, validare.prg) - fara mock, Activeaza()
* ar face un apel HTTP real (winHTTP async) la fiecare test cu starea NECUNOSCUT. Globalele de
* control (gcMockSondaModo, glMockSondaActiva, gnMockSondaPornireCount, glMockSondaGataManual,
* glMockSondaReusitaManual) se construiesc INLINE in programul principal (acelasi motiv ca mai sus).
* Mod 'AUTO' (implicit): sonda "raspunde" instant cu succes la primul ANAF_SondaVerifica() - transparent
* pentru scenariile care nu testeaza explicit sonda. Mod 'MANUAL': testul controleaza explicit daca/cand
* "a sosit raspunsul" (glMockSondaGataManual) si cu ce rezultat (glMockSondaReusitaManual) - foloseste
* pentru S2 (sonda in aer)/S3 (sonda reuseste)/S4 (sonda expira).
FUNCTION ANAF_SondaPorneste
IF TYPE('gnMockSondaPornireCount') = 'N'
gnMockSondaPornireCount = gnMockSondaPornireCount + 1
ENDIF
glMockSondaActiva = .T.
RETURN .T.
ENDFUNC
FUNCTION ANAF_SondaAuSositRaspunsul
IF TYPE('glMockSondaActiva') <> 'L' OR !glMockSondaActiva
RETURN .T.
ENDIF
IF TYPE('gcMockSondaModo') = 'C' AND gcMockSondaModo == 'MANUAL'
RETURN glMockSondaGataManual
ENDIF
RETURN .T. && AUTO: raspunde imediat
ENDFUNC
FUNCTION ANAF_SondaAReusit
IF TYPE('gcMockSondaModo') = 'C' AND gcMockSondaModo == 'MANUAL'
RETURN glMockSondaReusitaManual
ENDIF
RETURN .T. && AUTO: succes implicit
ENDFUNC
FUNCTION ANAF_SondaOpreste
LOCAL llOprita
llOprita = (TYPE('glMockSondaActiva') = 'L' AND glMockSondaActiva)
glMockSondaActiva = .F.
RETURN m.llOprita
ENDFUNC

View File

@@ -24,12 +24,22 @@
* 1234567890128 TEST ANAF PERSFIZ - CNP valid, persoana fizica - fara verificare ANAF
* 1234567890123 TEST ANAF CNP INVALID - persoana fizica cu CNP invalid
* 1234567 TEST ANAF CIF INVALID - persoana juridica cu CIF invalid
* RO9000055 TEST ANAF CADERE SRL - S5 (handoff_anaf_404.md): esec ANAF simulat, apoi verdict
* normal dupa revenirea serviciului (gnIdCadere)
* TEST NENUMERIC OIL MARKET SRL TEST ANAF NENUMERIC SRL - cod fiscal nenumeric in loc de CIF, acelasi
* tipar ca (dar NU acelasi text ca) cazul real FANALEX din
* design-alegere-partener-anaf.md, gnIdNenumeric. ATENTIE: nu
* refolosi textul EXACT "FANALEX OIL MARKET S.R.L." - coincide
* cu un partener real preexistent in schema (ID_PART=2026,
* STERS=0, cu randuri CORESP_TIP_PART reale) folosit la
* investigatia initiala a bug-ului - un DELETE pe acel text
* sterge date reale, nu de test (descoperit 27.07.2026).
*
* NOTA ID_PART: NOM_PARTENERI are trigger BEFORE INSERT (trg_NOM_PARTENERI_befoins) care
* SUPRASCRIE ID_PART cu seq_NOM_PARTENERI.nextval, indiferent de valoarea din INSERT - ID-urile
* nu pot fi alese explicit. Testul insereaza FARA ID_PART si citeste ID-ul real alocat dupa
* insert (dupa COD_FISCAL, care e sub controlul testului) - gnIdConcord/gnIdDiscord/gnIdPereche/
* gnIdNopereche/gnIdPersfiz (PUBLIC).
* gnIdNopereche/gnIdPersfiz/gnIdCadere/gnIdNenumeric (PUBLIC).
*
* Scenarii de decizie (RUNDA 11): dialogul propriu (anaf_dialog) a fost inlocuit cu AMESSAGEBOX
* tip 3+48 (Da/Nu/Abandon) si 1+48 (OK/Abandon) cand nu exista pereche. Raspunsul se impune prin
@@ -113,10 +123,31 @@ ADDPROPERTY(loRespNoPereche, 'statusInactivi', .F.)
ADDPROPERTY(loRespNoPereche, 'denumire', 'NOPERECHE SRL ANAF')
ADDPROPERTY(loRespNoPereche, 'mesaj', '')
goANAFMockData.Add(loRespNoPereche, 'C9000004')
DO VpaLog WITH 'mock ANAF: 3 CUI-uri configurate (1112223, 7654320, 9000004)'
LOCAL loRespInactiv
loRespInactiv = CREATEOBJECT('Empty')
ADDPROPERTY(loRespInactiv, 'cui', '9000012')
ADDPROPERTY(loRespInactiv, 'scpTVA', .F.)
ADDPROPERTY(loRespInactiv, 'statusInactivi', .T.)
ADDPROPERTY(loRespInactiv, 'denumire', 'INACTIV SRL ANAF')
ADDPROPERTY(loRespInactiv, 'mesaj', '')
goANAFMockData.Add(loRespInactiv, 'C9000012')
DO VpaLog WITH 'mock ANAF: 4 CUI-uri configurate (1112223, 7654320, 9000004, 9000012)'
PUBLIC gnIdConcord, gnIdDiscord, gnIdPereche, gnIdNopereche, gnIdPersfiz, gnIdSpatiu
*-- T5/sonda (handoff_anaf_404.md): Activeaza() porneste sonda REALA (ANAF_SondaPorneste, validare.prg)
*-- ori de cate ori starea e NECUNOSCUT - fara mock ar insemna apel HTTP real la fiecare test. Mod 'AUTO'
*-- (implicit): sonda "raspunde" instant cu succes la primul ANAF_SondaVerifica() - transparent pentru
*-- toate scenariile vechi (AsteaptaTimer cheama acum ANAF_SondaVerifica() inainte de VerificaRand, ca
*-- anaf_timer.Timer). Mod 'MANUAL': S2/S3/S4 controleaza explicit gcMockSondaGataManual/ReusitaManual.
PUBLIC gcMockSondaModo, glMockSondaActiva, gnMockSondaPornireCount, glMockSondaGataManual, glMockSondaReusitaManual
gcMockSondaModo = 'AUTO'
glMockSondaActiva = .F.
gnMockSondaPornireCount = 0
glMockSondaGataManual = .F.
glMockSondaReusitaManual = .T.
PUBLIC gnIdConcord, gnIdDiscord, gnIdPereche, gnIdNopereche, gnIdPersfiz, gnIdSpatiu, gnIdInactiv, gnIdInexistent
PUBLIC gnIdCnpInv, gnIdCifInv, gnMockInputBox, gnMockInputCount, gcMockUltimPrompt, gcMockInputSecventa
PUBLIC gnIdCadere, gnIdNenumeric
gnMockInputBox = 1
gnMockInputCount = 0
gcMockUltimPrompt = ''
@@ -261,6 +292,21 @@ TRY
DO RuleazaIzolat WITH 'VerificaDiscriminatorDocumente'
DO RuleazaIzolat WITH 'VerificaB1LabelGolit'
DO RuleazaIzolat WITH 'VerificaComutareOptiune'
DO RuleazaIzolat WITH 'VerificaInactivCodCorect'
DO RuleazaIzolat WITH 'VerificaCodInexistentANAF'
*=========================================================================
* Scenariile T7 (handoff_anaf_404.md / plan-reparatie-anaf-404-breaker.md): intrerupatorul de
* disponibilitate ANAF (S1, S5, S6) si codul fiscal nenumeric (P8)
*=========================================================================
DO RuleazaIzolat WITH 'VerificaStareCazutaZeroApeluri'
DO RuleazaIzolat WITH 'VerificaBandaCazutDistinctaDePrompt'
DO RuleazaIzolat WITH 'VerificaEsecNuSeCacheaza'
DO RuleazaIzolat WITH 'VerificaCodNenumeric'
DO RuleazaIzolat WITH 'VerificaFixtureContract404'
DO RuleazaIzolat WITH 'VerificaSondaInAer'
DO RuleazaIzolat WITH 'VerificaSondaReuseste'
DO RuleazaIzolat WITH 'VerificaSondaExpira'
DO VpaLog WITH 'GATA - toate scenariile executate'
DO HarnessStep WITH 4, 'toate scenariile executate'
@@ -277,10 +323,14 @@ QUIT
*==================================================================================
PROCEDURE CurataDateTest
LOCAL lnOk
lnOk = goExecutor.oExecuta([DELETE FROM NOM_PARTENERI WHERE COD_FISCAL IN ('RO1112223','7654320','RO7654320','RO 7654320','9000004','1234567890128','1234567890123','1234567')])
*-- CORESP_TIP_PART are FK_CORESP_TIP_PART_001 catre NOM_PARTENERI - copilul se sterge inaintea
*-- parintelui (ORA-02292), aceeasi lista de coduri in ambele instructiuni (lcCoduri).
LOCAL lnOk, lnOkCoresp, lcCoduri
lcCoduri = ['RO1112223','7654320','RO7654320','RO 7654320','9000004','9000012','9000039','1234567890128','1234567890123','1234567','RO9000055','TEST NENUMERIC OIL MARKET SRL']
lnOkCoresp = goExecutor.oExecuta([DELETE FROM CORESP_TIP_PART WHERE ID_PART IN (SELECT ID_PART FROM NOM_PARTENERI WHERE COD_FISCAL IN (] + m.lcCoduri + [))])
lnOk = goExecutor.oExecuta([DELETE FROM NOM_PARTENERI WHERE COD_FISCAL IN (] + m.lcCoduri + [)])
=goExecutor.oExecuta('COMMIT')
DO VpaLog WITH 'CurataDateTest: sters=' + TRANSFORM(m.lnOk)
DO VpaLog WITH 'CurataDateTest: sters coresp_tip_part=' + TRANSFORM(m.lnOkCoresp) + ' nom_parteneri=' + TRANSFORM(m.lnOk)
ENDPROC
PROCEDURE CreeazaDateTest
@@ -302,6 +352,12 @@ PROCEDURE CreeazaDateTest
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF NOPERECHE SRL','TEST ANAF NOPERECHE SRL','9000004',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF INACTIV SRL','TEST ANAF INACTIV SRL','9000012',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF INEXISTENT SRL','TEST ANAF INEXISTENT SRL','9000039',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF PERSFIZ','TEST ANAF PERSFIZ','1234567890128',0,0,0,2,0,0)]
=goExecutor.oExecuta(m.lcIns)
@@ -311,27 +367,42 @@ PROCEDURE CreeazaDateTest
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF CIF INVALID SRL','TEST ANAF CIF INVALID SRL','1234567',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF CADERE SRL','TEST ANAF CADERE SRL','RO9000055',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
lcIns = [INSERT INTO NOM_PARTENERI (NUME,DENUMIRE,COD_FISCAL,STERS,ID_MOD,INACTIV,TIP_PERSOANA,INSTITUTIE_PUBLICA,ENTITATE_AFILIATA) VALUES ] + ;
[('TEST ANAF NENUMERIC SRL','TEST ANAF NENUMERIC SRL','TEST NENUMERIC OIL MARKET SRL',0,0,0,1,0,0)]
=goExecutor.oExecuta(m.lcIns)
=goExecutor.oExecuta('COMMIT')
gnIdConcord = 0
gnIdDiscord = 0
gnIdPereche = 0
gnIdNopereche = 0
gnIdInactiv = 0
gnIdInexistent = 0
gnIdPersfiz = 0
gnIdSpatiu = 0
gnIdCnpInv = 0
gnIdCifInv = 0
gnIdCadere = 0
gnIdNenumeric = 0
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO 7654320'], @gnIdSpatiu)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO1112223'], @gnIdConcord)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '7654320'], @gnIdDiscord)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO7654320'], @gnIdPereche)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '9000004'], @gnIdNopereche)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '9000012'], @gnIdInactiv)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '9000039'], @gnIdInexistent)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '1234567890128'], @gnIdPersfiz)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '1234567890123'], @gnIdCnpInv)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = '1234567'], @gnIdCifInv)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'RO9000055'], @gnIdCadere)
=goExecutor.oSelect2Value([SELECT ID_PART AS NR FROM NOM_PARTENERI WHERE COD_FISCAL = 'TEST NENUMERIC OIL MARKET SRL'], @gnIdNenumeric)
DO VpaLog WITH 'CreeazaDateTest: id-uri alocate concord=' + TRANSFORM(gnIdConcord) + ' discord=' + TRANSFORM(gnIdDiscord) + ;
' pereche=' + TRANSFORM(gnIdPereche) + ' spatiu=' + TRANSFORM(gnIdSpatiu) + ;
' nopereche=' + TRANSFORM(gnIdNopereche) + ' persfiz=' + TRANSFORM(gnIdPersfiz)
' nopereche=' + TRANSFORM(gnIdNopereche) + ' persfiz=' + TRANSFORM(gnIdPersfiz) + ;
' cadere=' + TRANSFORM(gnIdCadere) + ' nenumeric=' + TRANSFORM(gnIdNenumeric)
ENDPROC
PROCEDURE PornesteCautare
@@ -369,24 +440,13 @@ PROCEDURE PornesteCautare
goFormT.Show()
DOEVENTS FORCE
*-- RUNDA 17 (B3): cu cmd_select prezent labelul ii ia coordonatele, iar inaltimea formei NU mai creste
IF TYPE('goFormT.cmd_select') = 'O'
IF VARTYPE(goFormT.lb_anaf) = 'O' AND goFormT.Height = m.lnInaltimeInitiala ;
AND goFormT.lb_anaf.Top = goFormT.cmd_select.Top ;
AND goFormT.lb_anaf.Left = goFormT.cmd_select.Left ;
AND goFormT.lb_anaf.Height = goFormT.cmd_select.Height ;
AND goFormT.lb_anaf.Anchor = 14
DO VpaLog WITH 'PASS activare: lb_anaf pe coordonatele cmd_select, inaltimea formei neschimbata (inaltime=' + TRANSFORM(goFormT.Height) + ')'
ELSE
DO VpaLog WITH 'FAIL activare: lb_anaf tip=' + TRANSFORM(VARTYPE(goFormT.lb_anaf)) + ' inaltime=' + TRANSFORM(goFormT.Height) + ;
' (initiala=' + TRANSFORM(m.lnInaltimeInitiala) + ')'
ENDIF
*-- labelul primeste banda lui proprie sub grid: forma creste cu 54, iar banda are fundal propriu
IF VARTYPE(goFormT.lb_anaf) = 'O' AND goFormT.Height = m.lnInaltimeInitiala + 54 ;
AND goFormT.lb_anaf.Anchor = 14 AND goFormT.lb_anaf.BackStyle = 1
DO VpaLog WITH 'PASS activare: lb_anaf creat in banda proprie, forma marita cu 54px (inaltime=' + TRANSFORM(goFormT.Height) + ')'
ELSE
IF VARTYPE(goFormT.lb_anaf) = 'O' AND goFormT.Height = m.lnInaltimeInitiala + 38
DO VpaLog WITH 'PASS activare (fara cmd_select): lb_anaf creat, forma marita cu 38px (inaltime=' + TRANSFORM(goFormT.Height) + ')'
ELSE
DO VpaLog WITH 'FAIL activare (fara cmd_select): lb_anaf tip=' + TRANSFORM(VARTYPE(goFormT.lb_anaf)) + ' inaltime=' + TRANSFORM(goFormT.Height)
ENDIF
DO VpaLog WITH 'FAIL activare: lb_anaf tip=' + TRANSFORM(VARTYPE(goFormT.lb_anaf)) + ' inaltime=' + TRANSFORM(goFormT.Height) + ;
' (initiala=' + TRANSFORM(m.lnInaltimeInitiala) + ')'
ENDIF
*-- RUNDA 11: geometria label-ului DUPA Show() - bug-ul live era ca Anchor setat inainte de Top
@@ -412,8 +472,12 @@ PROCEDURE AsteaptaTimer
*-- intern), nu pompari discrete. Apel DIRECT VerificaRand(.F.) - echivalent functional cu
*-- "timerul s-a declansat" - ca sa testez restul logicii (verdict/cache/dialog). Debounce-ul
*-- PROPRIU-ZIS (timerul reseteaza la fiecare navigare) e verificat separat, fara acest apel.
*-- T5/sonda: ANAF_SondaVerifica() INAINTE de VerificaRand, exact ca anaf_timer.Timer (ocautare.prg) -
*-- altfel o sonda pornita de Activeaza() (stare NECUNOSCUT) n-ar mai fi rezolvata niciodata in acest
*-- runtime headless si ar bloca toate scenariile vechi in banda "se verifica...".
LOCAL loV
loV = IIF(VARTYPE(m.toVerif) = 'O', m.toVerif, poVerifAlegere)
ANAF_SondaVerifica()
IF VARTYPE(m.loV) = 'O'
m.loV.VerificaRand(.F.)
ENDIF
@@ -454,7 +518,7 @@ PROCEDURE VerificaCodInvalid
DO AsteaptaTimer
lcCap = ALLTRIM(goFormT.lb_anaf.Caption)
*-- runda 17 (B2): eticheta primeste sufixul "F4 = detalii" si e BOLD (avertisment), ca discordanta ANAF
IF m.lcCap == 'CIF invalid (1234567) (F4 = detalii)' AND goFormT.lb_anaf.ForeColor = RGB(192,0,0) AND goFormT.lb_anaf.FontBold ;
IF m.lcCap == CHR(149) + ' CIF invalid (1234567) (F4 = detalii)' AND goFormT.lb_anaf.ForeColor = RGB(192,0,0) AND goFormT.lb_anaf.FontBold ;
AND gnANAFCallCount = m.lnInainte
DO VpaLog WITH 'PASS cod-invalid-cif (B2): [' + m.lcCap + '] rosu, bold, fara apel ANAF'
ELSE
@@ -467,7 +531,7 @@ PROCEDURE VerificaCodInvalid
goFormT._GRID1.AfterRowColChange(1)
DO AsteaptaTimer
lcCap = ALLTRIM(goFormT.lb_anaf.Caption)
IF m.lcCap == 'CNP invalid (1234567890123) (F4 = detalii)' AND goFormT.lb_anaf.ForeColor = RGB(192,0,0) AND goFormT.lb_anaf.FontBold
IF m.lcCap == CHR(149) + ' CNP invalid (1234567890123) (F4 = detalii)' AND goFormT.lb_anaf.ForeColor = RGB(192,0,0) AND goFormT.lb_anaf.FontBold
DO VpaLog WITH 'PASS cod-invalid-cnp (B2): [' + m.lcCap + '] rosu, bold'
ELSE
DO VpaLog WITH 'FAIL cod-invalid-cnp (B2): [' + m.lcCap + '] ForeColor=' + TRANSFORM(goFormT.lb_anaf.ForeColor) + ' Bold=' + TRANSFORM(goFormT.lb_anaf.FontBold)
@@ -478,10 +542,10 @@ PROCEDURE VerificaCodInvalid
goFormT._GRID1.AfterRowColChange(1)
DO AsteaptaTimer
lcCap = ALLTRIM(goFormT.lb_anaf.Caption)
IF EMPTY(m.lcCap)
DO VpaLog WITH 'PASS cod-valid-cnp: persoana fizica cu CNP valid - fara label, fara verificare ANAF'
IF m.lcCap == CHR(149) + ' Verificare ANAF la alegerea partenerului (F4 = detalii)' AND goFormT.lb_anaf.ForeColor = RGB(112,112,112)
DO VpaLog WITH 'PASS cod-valid-cnp: persoana fizica cu CNP valid - banda revine la text neutru, fara verificare ANAF'
ELSE
DO VpaLog WITH 'FAIL cod-valid-cnp: label neasteptat [' + m.lcCap + ']'
DO VpaLog WITH 'FAIL cod-valid-cnp: label neasteptat [' + m.lcCap + '] ForeColor=' + TRANSFORM(goFormT.lb_anaf.ForeColor)
ENDIF
ENDPROC
@@ -553,10 +617,15 @@ PROCEDURE VerificaDebounce
LOCATE FOR id_part = gnIdNopereche
goFormT._GRID1.AfterRowColChange(1)
DOEVENTS FORCE
IF gnANAFCallCount = m.lnInainte
DO VpaLog WITH 'PASS debounce: 3 navigari rapide, 0 apeluri ANAF noi (timer resetat de fiecare data)'
*-- randurile intermediare (concord, discord) NU se verifica; banda isi face acum repaint la fiecare
*-- schimbare de rand, iar repaint-ul pompeaza mesaje, deci timerul poate apuca sa se declanseze
*-- pentru randul CURENT (nopereche) inainte de AsteaptaTimer - un singur apel, tot pe randul oprit.
IF gnANAFCallCount <= m.lnInainte + 1 AND (gnANAFCallCount = m.lnInainte OR ALLTRIM(poVerifAlegere.cCui) == '9000004')
DO VpaLog WITH 'PASS debounce: 3 navigari rapide, niciun apel pe randurile intermediare (apeluri noi=' + ;
TRANSFORM(gnANAFCallCount - m.lnInainte) + ', CUI curent=' + ALLTRIM(poVerifAlegere.cCui) + ')'
ELSE
DO VpaLog WITH 'FAIL debounce: gnANAFCallCount a crescut cu ' + TRANSFORM(gnANAFCallCount - m.lnInainte) + ' in timpul navigarii rapide'
DO VpaLog WITH 'FAIL debounce: gnANAFCallCount a crescut cu ' + TRANSFORM(gnANAFCallCount - m.lnInainte) + ;
' in timpul navigarii rapide, CUI curent=' + ALLTRIM(poVerifAlegere.cCui)
ENDIF
DO AsteaptaTimer
IF gnANAFCallCount = m.lnInainte + 1
@@ -625,6 +694,13 @@ PROCEDURE VerificaDetalii
ELSE
DO VpaLog WITH 'FAIL detalii-click: click simplu pe label nu a deschis detaliile'
ENDIF
*-- Detalii se incheie cu do_termin() (dupa Da/Nu se inchide cautarea) - formularul e Release-uit,
*-- deci scenariile urmatoare au nevoie de unul nou.
DO PregatesteFormularD1a
SELECT ctestparteneri
LOCATE FOR id_part = gnIdDiscord
goFormT._GRID1.AfterRowColChange(1)
DO AsteaptaTimer
lnLenInainte = IIF(FILE(gcUILog), LEN(FILETOSTR(gcUILog)), 0)
poVerifAlegere.Detalii()
lcLog = FILETOSTR(gcUILog)
@@ -644,6 +720,8 @@ ENDPROC
PROCEDURE VerificaAlegereRapidaD2
*-- D2: alege un rand FARA sa astepte timerul (VerificaRand(.T.) sincron in VerificaAlegere)
LOCAL lnInainte
*-- formularul precedent a fost inchis de Detalii (do_termin) - reia cu unul nou
DO PregatesteFormularD1a
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection') && reset - CUI 1112223 nu a mai fost verificat "proaspat" pt. acest test
ENDIF
@@ -1101,6 +1179,121 @@ PROCEDURE VerificaDataPoAct
ENDIF
ENDPROC
PROCEDURE VerificaInactivCodCorect
*-- cod fiscal corect (fara RO, ANAF neplatitor), discordanta doar din "inactiv la ANAF":
*-- nu se mai cauta perechi si nu se mai sugereaza crearea unui partener cu acelasi cod.
LOCAL loFormI, loVerifI, lnOk, llRez, lcCapI
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdInactiv), 'ctestinactiv')
loFormI = CREATEOBJECT('cauta_alfa_form', 'ctestinactiv', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormI.crs_cursor = 'ctestinactiv'
loFormI.lAles = .F.
loVerifI = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormI, 'oVerifAlegere', loVerifI)
loVerifI.Activeaza(loFormI)
loVerifI.nNivel = 3
loFormI.WindowType = 0
loFormI.Show()
SELECT ctestinactiv
GO TOP
loFormI._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifI
lcCapI = ALLTRIM(loFormI.lb_anaf.Caption)
gcMockUltimMesaj = ''
gnMockUltimTip = 0
gnMockRaspuns = 1 && De acord
llRez = loVerifI.VerificaAlegere(loFormI)
IF m.llRez AND gnMockUltimTip = 49 AND 'Neplatitor TVA, Inactiv' $ gcMockUltimMesaj ;
AND !('butonul Nou' $ gcMockUltimMesaj) AND !('Parteneri ROA cu CUI' $ gcMockUltimMesaj) ;
AND 'Neplatitor TVA, Inactiv' $ m.lcCapI
DO VpaLog WITH 'PASS inactiv-cod-corect: confirmare fara sugestia de creare - [' + STRTRAN(gcMockUltimMesaj, CHR(13), ' | ') + ']'
ELSE
DO VpaLog WITH 'FAIL inactiv-cod-corect: llRez=' + TRANSFORM(m.llRez) + ' tip=' + TRANSFORM(gnMockUltimTip) + ;
' label=[' + m.lcCapI + '] mesaj=[' + STRTRAN(gcMockUltimMesaj, CHR(13), ' | ') + ']'
ENDIF
gcMockUltimMesaj = ''
loVerifI.Detalii()
IF 'Nu exista alta varianta de partener de ales.' $ gcMockUltimMesaj AND !('butonul Nou' $ gcMockUltimMesaj) ;
AND !('Parteneri ROA cu CUI' $ gcMockUltimMesaj)
DO VpaLog WITH 'PASS inactiv-detalii: F4 arata doar starea, fara lista de variante'
ELSE
DO VpaLog WITH 'FAIL inactiv-detalii: mesaj=[' + STRTRAN(gcMockUltimMesaj, CHR(13), ' | ') + ']'
ENDIF
loVerifI.Dezactiveaza()
loFormI.Release()
IF USED('ctestinactiv')
USE IN ctestinactiv
ENDIF
ENDPROC
PROCEDURE VerificaCodInexistentANAF
*-- cod fiscal valid ca structura, dar pe care ANAF nu il gaseste: se semnaleaza in banda, nu se
*-- mai trece tacut peste el (deosebit de "ANAF nu a raspuns", care ramane tacut).
LOCAL loFormX, loVerifX, lnOk, lcCapX, lnInainte
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdInexistent), 'ctestinexistent')
loFormX = CREATEOBJECT('cauta_alfa_form', 'ctestinexistent', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormX.crs_cursor = 'ctestinexistent'
loFormX.lAles = .F.
loVerifX = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormX, 'oVerifAlegere', loVerifX)
loVerifX.Activeaza(loFormX)
loFormX.WindowType = 0
loFormX.Show()
SELECT ctestinexistent
GO TOP
loFormX._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifX
lcCapX = ALLTRIM(loFormX.lb_anaf.Caption)
IF 'Cod fiscal inexistent la ANAF (9000039)' $ m.lcCapX AND loFormX.lb_anaf.ForeColor = RGB(192,0,0) ;
AND loFormX.lb_anaf.FontBold AND loVerifX.lNegasit
DO VpaLog WITH 'PASS cod-inexistent: banda semnaleaza codul negasit la ANAF - [' + m.lcCapX + ']'
ELSE
DO VpaLog WITH 'FAIL cod-inexistent: label=[' + m.lcCapX + '] ForeColor=' + TRANSFORM(loFormX.lb_anaf.ForeColor) + ;
' Bold=' + TRANSFORM(loFormX.lb_anaf.FontBold) + ' lNegasit=' + TRANSFORM(loVerifX.lNegasit)
ENDIF
*-- al doilea rand pe acelasi cod: verdictul "inexistent" NU se mai retine in cache (T4/handoff_anaf_404
*-- - doar rezultatele POZITIVE se cacheaza) - fiecare verificare noua face iar apel ANAF, acelasi verdict.
lnInainte = gnANAFCallCount
loVerifX.nIdPart = 0
loFormX._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifX
IF gnANAFCallCount = m.lnInainte + 1 AND 'Cod fiscal inexistent la ANAF' $ ALLTRIM(loFormX.lb_anaf.Caption)
DO VpaLog WITH 'PASS cod-inexistent-fara-cache: verdictul "inexistent" nu se cacheaza - apel ANAF nou (' + ;
TRANSFORM(gnANAFCallCount - m.lnInainte) + '), acelasi verdict'
ELSE
DO VpaLog WITH 'FAIL cod-inexistent-fara-cache: apeluri noi=' + TRANSFORM(gnANAFCallCount - m.lnInainte) + ;
' label=[' + ALLTRIM(loFormX.lb_anaf.Caption) + ']'
ENDIF
gcMockUltimMesaj = ''
loVerifX.Detalii()
IF 'Codul fiscal nu exista la ANAF.' $ gcMockUltimMesaj
DO VpaLog WITH 'PASS cod-inexistent-detalii: F4 explica de ce nu exista verdict'
ELSE
DO VpaLog WITH 'FAIL cod-inexistent-detalii: mesaj=[' + STRTRAN(gcMockUltimMesaj, CHR(13), ' | ') + ']'
ENDIF
loVerifX.Dezactiveaza()
loFormX.Release()
IF USED('ctestinexistent')
USE IN ctestinexistent
ENDIF
ENDPROC
PROCEDURE RuleazaIzolat
*-- izoleaza fiecare scenariu nou REVIZIA 4 - o eroare neasteptata intr-unul singur nu opreste
*-- restul suitei (spre deosebire de eroarea din TRY-ul principal, care oricum face QUIT).
@@ -1114,6 +1307,447 @@ PROCEDURE RuleazaIzolat
ENDTRY
ENDPROC
PROCEDURE VerificaStareCazutaZeroApeluri
*-- S1 (handoff_anaf_404.md): stare de serviciu CAZUT -> randul NU face niciun apel ANAF nou,
*-- banda arata "ANAF nu a raspuns - verificare sarita" (gri, fara bold). ANAF_SeteazaStareServiciu
*-- e functia reala din ocautare.prg (nu un global impins direct), ca sceanariul sa treaca prin
*-- acelasi mecanism ca in productie.
LOCAL loFormS, loVerifS, lnOk, lnInainte, lcCapS
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
ANAF_SeteazaStareServiciu('CAZUT', 'test S1')
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdConcord), 'ctests1')
loFormS = CREATEOBJECT('cauta_alfa_form', 'ctests1', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormS.crs_cursor = 'ctests1'
loFormS.lAles = .F.
loVerifS = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormS, 'oVerifAlegere', loVerifS)
loVerifS.Activeaza(loFormS)
loFormS.WindowType = 0
loFormS.Show()
SELECT ctests1
GO TOP
lnInainte = gnANAFCallCount
loFormS._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifS
lcCapS = ALLTRIM(loFormS.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND 'ANAF nu a raspuns - verificare sarita' $ lcCapS ;
AND loFormS.lb_anaf.ForeColor = RGB(112,112,112) AND !loFormS.lb_anaf.FontBold
DO VpaLog WITH 'PASS stare-cazuta-zero-apeluri (S1): stare CAZUT -> 0 apeluri ANAF, banda gri [' + lcCapS + ']'
ELSE
DO VpaLog WITH 'FAIL stare-cazuta-zero-apeluri (S1): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' label=[' + lcCapS + '] ForeColor=' + TRANSFORM(loFormS.lb_anaf.ForeColor) + ' Bold=' + TRANSFORM(loFormS.lb_anaf.FontBold)
ENDIF
loVerifS.Dezactiveaza()
loFormS.Release()
IF USED('ctests1')
USE IN ctests1
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa test S1')
ENDPROC
PROCEDURE VerificaBandaCazutDistinctaDePrompt
*-- S6 (handoff_anaf_404.md): banda gri "ANAF nu a raspuns - verificare sarita" (stare CAZUT) e
*-- DISTINCTA de promptul gri generic "Verificare ANAF la alegerea partenerului (F4 = detalii)" -
*-- regresia care ascundea initial defectul (fara ea, utilizatorul nu distinge "inca neverificat"
*-- de "ANAF picat").
LOCAL loFormB, loVerifB, lnOk, lcPromptGeneric, lcBandaCazut
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdConcord), 'ctests6')
loFormB = CREATEOBJECT('cauta_alfa_form', 'ctests6', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormB.crs_cursor = 'ctests6'
loFormB.lAles = .F.
loVerifB = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormB, 'oVerifAlegere', loVerifB)
loVerifB.Activeaza(loFormB) && Activeaza cheama AfiseazaPrompt() - captureaza promptul generic
loFormB.WindowType = 0
loFormB.Show()
lcPromptGeneric = ALLTRIM(loFormB.lb_anaf.Caption)
ANAF_SeteazaStareServiciu('CAZUT', 'test S6')
SELECT ctests6
GO TOP
loFormB._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifB
lcBandaCazut = ALLTRIM(loFormB.lb_anaf.Caption)
IF !(m.lcPromptGeneric == m.lcBandaCazut) AND 'Verificare ANAF la alegerea partenerului' $ m.lcPromptGeneric ;
AND 'ANAF nu a raspuns - verificare sarita' $ m.lcBandaCazut
DO VpaLog WITH 'PASS banda-cazut-distincta (S6): prompt generic=[' + m.lcPromptGeneric + '] vs banda CAZUT=[' + m.lcBandaCazut + ']'
ELSE
DO VpaLog WITH 'FAIL banda-cazut-distincta (S6): prompt=[' + m.lcPromptGeneric + '] banda=[' + m.lcBandaCazut + ']'
ENDIF
loVerifB.Dezactiveaza()
loFormB.Release()
IF USED('ctests6')
USE IN ctests6
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa test S6')
ENDPROC
PROCEDURE VerificaEsecNuSeCacheaza
*-- S5 (handoff_anaf_404.md): esecul (FARA_RASPUNS) NU se scrie in cache; dupa ce serviciul revine
*-- (stare VIU), ACELASI CUI se verifica din nou si primeste verdict - blocheaza regresia "verdict
*-- lipsa pana la repornirea programului". goANAFMockData primeste STRING 'FARA_RASPUNS' pt. cheia
*-- CUI-ului de test (vezi mock_anaf_verificare.prg), apoi e inlocuita cu obiectul de succes.
LOCAL lnOk, loFormE1, loVerifE1, loFormE2, loVerifE2, lnInainte, lcCap1, lcCap2, loRespCadere
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
IF goANAFMockData.GetKey('C9000055') <> 0
goANAFMockData.Remove('C9000055')
ENDIF
goANAFMockData.Add('FARA_RASPUNS', 'C9000055')
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'pregatire S5')
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCadere), 'ctests5a')
loFormE1 = CREATEOBJECT('cauta_alfa_form', 'ctests5a', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormE1.crs_cursor = 'ctests5a'
loFormE1.lAles = .F.
loVerifE1 = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormE1, 'oVerifAlegere', loVerifE1)
loVerifE1.Activeaza(loFormE1)
loFormE1.WindowType = 0
loFormE1.Show()
SELECT ctests5a
GO TOP
lnInainte = gnANAFCallCount
loFormE1._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifE1
lcCap1 = ALLTRIM(loFormE1.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte + 1 AND 'ANAF nu a raspuns - verificare sarita' $ lcCap1 ;
AND goCacheANAF_Sesiune.GetKey('C9000055_' + DTOS(DATE())) = 0
DO VpaLog WITH 'PASS esec-nu-se-cacheaza (S5, pas 1): apel ANAF esuat (' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' apel nou), banda=[' + lcCap1 + '], NU s-a scris in cache'
ELSE
DO VpaLog WITH 'FAIL esec-nu-se-cacheaza (S5, pas 1): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ;
' banda=[' + lcCap1 + '] cache-key=' + TRANSFORM(goCacheANAF_Sesiune.GetKey('C9000055_' + DTOS(DATE())))
ENDIF
loVerifE1.Dezactiveaza()
loFormE1.Release()
IF USED('ctests5a')
USE IN ctests5a
ENDIF
*-- serviciul revine: inlocuieste intrarea mock cu un obiect de succes real + stare VIU (fara sa
*-- astepte cele 10 minute de expirare CAZUT - vezi ANAF_SeteazaStareServiciu, ocautare.prg)
goANAFMockData.Remove('C9000055')
loRespCadere = CREATEOBJECT('Empty')
ADDPROPERTY(loRespCadere, 'cui', '9000055')
ADDPROPERTY(loRespCadere, 'scpTVA', .T.)
ADDPROPERTY(loRespCadere, 'statusInactivi', .F.)
ADDPROPERTY(loRespCadere, 'denumire', 'CADERE SRL ANAF')
ADDPROPERTY(loRespCadere, 'mesaj', '')
goANAFMockData.Add(loRespCadere, 'C9000055')
ANAF_SeteazaStareServiciu('VIU', 'revenire S5')
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdCadere), 'ctests5b')
loFormE2 = CREATEOBJECT('cauta_alfa_form', 'ctests5b', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormE2.crs_cursor = 'ctests5b'
loFormE2.lAles = .F.
loVerifE2 = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormE2, 'oVerifAlegere', loVerifE2)
loVerifE2.Activeaza(loFormE2)
loFormE2.WindowType = 0
loFormE2.Show()
SELECT ctests5b
GO TOP
lnInainte = gnANAFCallCount
loFormE2._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifE2
lcCap2 = ALLTRIM(loFormE2.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte + 1 AND 'ANAF: Platitor TVA' $ lcCap2 AND 'CADERE SRL ANAF' $ lcCap2
DO VpaLog WITH 'PASS esec-nu-se-cacheaza (S5, pas 2): dupa revenire (VIU), acelasi CUI 9000055 se re-verifica (' + ;
TRANSFORM(gnANAFCallCount - lnInainte) + ' apel nou) si primeste verdict [' + lcCap2 + ']'
ELSE
DO VpaLog WITH 'FAIL esec-nu-se-cacheaza (S5, pas 2): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ' banda=[' + lcCap2 + ']'
ENDIF
loVerifE2.Dezactiveaza()
loFormE2.Release()
IF USED('ctests5b')
USE IN ctests5b
ENDIF
ENDPROC
PROCEDURE VerificaCodNenumeric
*-- P8 (handoff_anaf_404.md, acelasi tipar ca si cazul real FANALEX din design-alegere-partener-anaf.md,
*-- dar cu text disponibil pentru testare - textul EXACT real coincide cu un partener preexistent in
*-- schema, vezi nota din antetul fisierului): cod fiscal nenumeric dupa normalizare (litere in loc de
*-- cifre) -> banda gri distincta, fara apel ANAF si fara tacere completa (comportamentul dinainte de reparatie).
LOCAL loFormN, loVerifN, lnOk, lcCapN, lnInainte
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV, TIP_PERSOANA FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdNenumeric), 'ctestnenum')
loFormN = CREATEOBJECT('cauta_alfa_form', 'ctestnenum', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormN.crs_cursor = 'ctestnenum'
loFormN.lAles = .F.
loVerifN = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormN, 'oVerifAlegere', loVerifN)
loVerifN.Activeaza(loFormN)
loFormN.WindowType = 0
loFormN.Show()
SELECT ctestnenum
GO TOP
lnInainte = gnANAFCallCount
loFormN._GRID1.AfterRowColChange(1)
DO AsteaptaTimer WITH loVerifN
lcCapN = ALLTRIM(loFormN.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND lcCapN == CHR(149) + ' Cod fiscal nenumeric - nu se poate verifica la ANAF' ;
AND loFormN.lb_anaf.ForeColor = RGB(112,112,112) AND !loFormN.lb_anaf.FontBold
DO VpaLog WITH 'PASS cod-nenumeric (P8): cod fiscal "TEST NENUMERIC OIL MARKET SRL" (tiparul cazului real FANALEX) -> banda gri distincta, fara apel ANAF - [' + lcCapN + ']'
ELSE
DO VpaLog WITH 'FAIL cod-nenumeric (P8): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ' label=[' + lcCapN + ']'
ENDIF
*-- F4 (Detalii) pe cod nenumeric: text nou dedicat (cClasaEsec == 'COD_NENUMERIC'), distinct de
*-- "Codul fiscal nu exista la ANAF." si "ANAF nu a raspuns - verificarea a fost sarita." (ocautare.prg)
LOCAL lnLenInainte, lcLog
lnLenInainte = IIF(FILE(gcUILog), LEN(FILETOSTR(gcUILog)), 0)
loVerifN.Detalii()
lcLog = SUBSTR(FILETOSTR(gcUILog), lnLenInainte + 1)
IF 'MOCK amessagebox' $ lcLog AND 'Codul fiscal nu este numeric - nu se poate verifica la ANAF.' $ lcLog ;
AND !('Codul fiscal nu exista la ANAF.' $ lcLog) AND !('verificarea a fost sarita' $ lcLog)
DO VpaLog WITH 'PASS cod-nenumeric-detalii (P8): F4 arata textul dedicat codului nenumeric, distinct de negasit/fara-raspuns'
ELSE
DO VpaLog WITH 'FAIL cod-nenumeric-detalii (P8): log=[' + lcLog + ']'
ENDIF
loVerifN.Dezactiveaza()
loFormN.Release()
IF USED('ctestnenum')
USE IN ctestnenum
ENDIF
ENDPROC
PROCEDURE VerificaFixtureContract404
*-- F1 (handoff_anaf_404.md), REVIZUIT dupa T5/sonda: logica de verdict a fost extrasa in
*-- ANAF_VerdictDinCursor (validare.prg) - fixture-ul apeleaza acum FUNCTIA REALA (nu o replica
*-- locala), peste cursorul produs de ParseJsonANAFv8 (tot cod real, fara HTTP), cu cele doua
*-- corpuri MASURATE pe serviciul ANAF real (plan-reparatie-anaf-404-breaker.md, cauza 1).
LOCAL loVerif, lcJson404, lcJsonStrain, loObj404, loObjStrain, lcAlias404, lcAliasStrain
LOCAL lnCuiCautat, loResult404, loResultStrain, llNegasit404, llNegasitStrain, lcClasa404, lcClasaStrain
loVerif = CREATEOBJECT("VerificareANAF")
lnCuiCautat = 123456789
*=== corp masurat, status 404: {"found":[],"notFound":[123456789]} -> verdict "inexistent" ===
lcJson404 = '{"found":[],"notFound":[123456789]}'
lcAlias404 = 'crsFixtureF1a'
IF USED(lcAlias404)
USE IN (lcAlias404)
ENDIF
loObj404 = nfjsonread(lcJson404)
loVerif.ParseJsonANAFv8(loObj404, lcAlias404)
llNegasit404 = .F.
lcClasa404 = ''
loResult404 = ANAF_VerdictDinCursor(lcAlias404, lnCuiCautat, @llNegasit404, @lcClasa404)
IF ISNULL(loResult404) AND llNegasit404 AND EMPTY(lcClasa404)
DO VpaLog WITH 'PASS fixture-404-inexistent (F1): ANAF_VerdictDinCursor REALA, corp {"found":[],"notFound":[123456789]} -> tlNegasit=.T., clasa=[]'
ELSE
DO VpaLog WITH 'FAIL fixture-404-inexistent (F1): rezultat=' + TRANSFORM(VARTYPE(loResult404)) + ' llNegasit=' + TRANSFORM(llNegasit404) + ' clasa=[' + lcClasa404 + ']'
ENDIF
IF USED(lcAlias404)
USE IN (lcAlias404)
ENDIF
*=== corp strain (proxy/mentenanta/eroare) - NU trebuie sa dea verdict "inexistent" ===
lcJsonStrain = '{"message":"service unavailable"}'
lcAliasStrain = 'crsFixtureF1b'
IF USED(lcAliasStrain)
USE IN (lcAliasStrain)
ENDIF
loObjStrain = nfjsonread(lcJsonStrain)
loVerif.ParseJsonANAFv8(loObjStrain, lcAliasStrain)
llNegasitStrain = .F.
lcClasaStrain = ''
loResultStrain = ANAF_VerdictDinCursor(lcAliasStrain, lnCuiCautat, @llNegasitStrain, @lcClasaStrain)
IF ISNULL(loResultStrain) AND !llNegasitStrain AND lcClasaStrain == 'RASPUNS_NEINTELES'
DO VpaLog WITH 'PASS fixture-corp-strain (F1): ANAF_VerdictDinCursor REALA, corp {"message":"service unavailable"} -> clasa=RASPUNS_NEINTELES'
ELSE
DO VpaLog WITH 'FAIL fixture-corp-strain (F1): rezultat=' + TRANSFORM(VARTYPE(loResultStrain)) + ' llNegasit=' + TRANSFORM(llNegasitStrain) + ' clasa=[' + lcClasaStrain + ']'
ENDIF
IF USED(lcAliasStrain)
USE IN (lcAliasStrain)
ENDIF
ENDPROC
PROCEDURE VerificaSondaInAer
*-- S2 (handoff_anaf_404.md, T5/sonda): sonda in aer (stare SE_TESTEAZA) -> randul NU face apel
*-- propriu (gnANAFCallCount neschimbat), banda "ANAF: se verifica <cod>...". Plus (tabelul de
*-- moduri de esec): formular inchis CU sonda inca in aer -> starea revine la NECUNOSCUT, nu CAZUT
*-- (Dezactiveaza: ANAF_SondaOpreste() + ANAF_SeteazaStareServiciu, ocautare.prg).
LOCAL loFormS2, loVerifS2, lnOk, lnInainte, lcCap
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'pregatire S2')
gcMockSondaModo = 'MANUAL'
glMockSondaGataManual = .F. && sonda pleaca si NU raspunde inca
gnMockSondaPornireCount = 0
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdConcord), 'ctests2')
loFormS2 = CREATEOBJECT('cauta_alfa_form', 'ctests2', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormS2.crs_cursor = 'ctests2'
loFormS2.lAles = .F.
loVerifS2 = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormS2, 'oVerifAlegere', loVerifS2)
loVerifS2.Activeaza(loFormS2) && stare NECUNOSCUT -> porneste sonda (mock) -> SE_TESTEAZA
loFormS2.WindowType = 0
loFormS2.Show()
SELECT ctests2
GO TOP
lnInainte = gnANAFCallCount
loFormS2._GRID1.AfterRowColChange(1) && DupaRand -> EvalueazaRand(.F.) - vede SE_TESTEAZA, NU cheama AsteaptaTimer
DOEVENTS FORCE
lcCap = ALLTRIM(loFormS2.lb_anaf.Caption)
IF gnANAFCallCount = lnInainte AND ANAF_StareServiciu() == 'SE_TESTEAZA' ;
AND 'ANAF: se verifica' $ lcCap AND 'RO1112223' $ lcCap AND gnMockSondaPornireCount = 1
DO VpaLog WITH 'PASS sonda-in-aer (S2): sonda in aer -> 0 apeluri ANAF, banda [' + lcCap + ']'
ELSE
DO VpaLog WITH 'FAIL sonda-in-aer (S2): apeluri noi=' + TRANSFORM(gnANAFCallCount - lnInainte) + ' stare=' + ANAF_StareServiciu() + ;
' banda=[' + lcCap + '] porniri-sonda=' + TRANSFORM(gnMockSondaPornireCount)
ENDIF
*-- inchide formularul CU sonda inca in aer (glMockSondaGataManual ramane .F.) - starea trebuie sa
*-- revina la NECUNOSCUT, nu sa ramana blocata (fals) in SE_TESTEAZA sau sa treaca in CAZUT
loVerifS2.Dezactiveaza()
IF ANAF_StareServiciu() == 'NECUNOSCUT'
DO VpaLog WITH 'PASS sonda-inchisa-in-aer (S2): formular inchis cu sonda in aer -> stare revine la NECUNOSCUT'
ELSE
DO VpaLog WITH 'FAIL sonda-inchisa-in-aer (S2): stare=' + ANAF_StareServiciu()
ENDIF
loFormS2.Release()
IF USED('ctests2')
USE IN ctests2
ENDIF
gcMockSondaModo = 'AUTO'
ENDPROC
PROCEDURE VerificaSondaReuseste
*-- S3 (handoff_anaf_404.md, T5/sonda): sonda reuseste -> stare devine VIU si randul CURENT se
*-- re-evalueaza SINGUR (fara navigare noua) - EvalueazaRand nu comite This.nIdPart cat timp
*-- lcClasaEsec=='SE_TESTEAZA' (ocautare.prg), deci a doua evaluare pe acelasi rand nu iese
*-- devreme pe "acelasi rand" si ajunge la verdictul real. Blocheaza verdictul lipit pe rand.
LOCAL loFormS3, loVerifS3, lnOk, lcCap1, lcCap2
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'pregatire S3')
gcMockSondaModo = 'MANUAL'
glMockSondaGataManual = .F.
glMockSondaReusitaManual = .T.
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdConcord), 'ctests3')
loFormS3 = CREATEOBJECT('cauta_alfa_form', 'ctests3', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormS3.crs_cursor = 'ctests3'
loFormS3.lAles = .F.
loVerifS3 = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormS3, 'oVerifAlegere', loVerifS3)
loVerifS3.Activeaza(loFormS3) && NECUNOSCUT -> porneste sonda (mock) -> SE_TESTEAZA
loFormS3.WindowType = 0
loFormS3.Show()
SELECT ctests3
GO TOP
loFormS3._GRID1.AfterRowColChange(1)
DOEVENTS FORCE
lcCap1 = ALLTRIM(loFormS3.lb_anaf.Caption)
*-- raspunsul soseste, cu succes - FARA sa navighez randul din nou (acelasi rand, acelasi id_part)
glMockSondaGataManual = .T.
glMockSondaReusitaManual = .T.
ANAF_SondaVerifica() && acelasi apel ca in anaf_timer.Timer, inaintea lui EvalueazaRand
loVerifS3.VerificaRand(.F.)
DOEVENTS FORCE
lcCap2 = ALLTRIM(loFormS3.lb_anaf.Caption)
IF 'ANAF: se verifica' $ lcCap1 AND ANAF_StareServiciu() == 'VIU' AND 'ANAF:' $ lcCap2 AND !('se verifica' $ lcCap2)
DO VpaLog WITH 'PASS sonda-reuseste (S3): sonda reusita -> stare VIU, randul curent re-evaluat SINGUR (fara navigare noua) - [' + lcCap1 + '] -> [' + lcCap2 + ']'
ELSE
DO VpaLog WITH 'FAIL sonda-reuseste (S3): banda1=[' + lcCap1 + '] stare=' + ANAF_StareServiciu() + ' banda2=[' + lcCap2 + ']'
ENDIF
loVerifS3.Dezactiveaza()
loFormS3.Release()
IF USED('ctests3')
USE IN ctests3
ENDIF
gcMockSondaModo = 'AUTO'
ENDPROC
PROCEDURE VerificaSondaExpira
*-- S4 (handoff_anaf_404.md, T5/sonda): sonda ramane in aer peste termenul de viata (10s, masurat
*-- fata de gtANAF_StareServiciuMoment, PUBLIC in ocautare.prg) -> stare CAZUT, nu ramane blocata
*-- in SE_TESTEAZA. "Time travel" pe gtANAF_StareServiciuMoment (global de sesiune expus explicit
*-- pentru asta), fara sa astept efectiv 10 secunde reale.
LOCAL loFormS4, loVerifS4, lnOk, lcCap
IF TYPE('goCacheANAF_Sesiune') = 'O'
goCacheANAF_Sesiune = CREATEOBJECT('Collection')
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'pregatire S4')
gcMockSondaModo = 'MANUAL'
glMockSondaGataManual = .F. && sonda ramane in aer, nu raspunde niciodata
lnOk = goExecutor.oExecute([SELECT DISTINCT DENUMIRE, NUME, COD_FISCAL, ID_PART, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE ID_PART = ] + TRANSFORM(gnIdConcord), 'ctests4')
loFormS4 = CREATEOBJECT('cauta_alfa_form', 'ctests4', '', 'Denumire,Nume,Cod fiscal,Id,Inactiv', ;
'denumire,nume,cod_fiscal,id_part,inactiv', .F., '', 1, '', '', '', '')
loFormS4.crs_cursor = 'ctests4'
loFormS4.lAles = .F.
loVerifS4 = CREATEOBJECT('anaf_verif_cautare')
ADDPROPERTY(loFormS4, 'oVerifAlegere', loVerifS4)
loVerifS4.Activeaza(loFormS4) && NECUNOSCUT -> porneste sonda (mock) -> SE_TESTEAZA
loFormS4.WindowType = 0
loFormS4.Show()
*-- da timpul inapoi cu 15s fata de momentul tranzitiei, ca sa simulez expirarea celor 10s fara
*-- sa astept efectiv
gtANAF_StareServiciuMoment = DATETIME() - 15
ANAF_SondaVerifica() && acelasi apel ca in anaf_timer.Timer - constata expirarea si inchide sonda
SELECT ctests4
GO TOP
loFormS4._GRID1.AfterRowColChange(1)
DOEVENTS FORCE
lcCap = ALLTRIM(loFormS4.lb_anaf.Caption)
IF ANAF_StareServiciu() == 'CAZUT' AND 'ANAF nu a raspuns - verificare sarita' $ lcCap
DO VpaLog WITH 'PASS sonda-expira (S4): sonda in aer peste 10s -> stare CAZUT, nu ramane blocata in SE_TESTEAZA - [' + lcCap + ']'
ELSE
DO VpaLog WITH 'FAIL sonda-expira (S4): stare=' + ANAF_StareServiciu() + ' banda=[' + lcCap + ']'
ENDIF
loVerifS4.Dezactiveaza()
loFormS4.Release()
IF USED('ctests4')
USE IN ctests4
ENDIF
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'reset dupa S4')
gcMockSondaModo = 'AUTO'
ENDPROC
PROCEDURE VerificaCascadaOptiuni
*-- REVIZIA 4 pct.1: ini '0' bate tot; utilizator bate firma; firma bate hardcodatul;
*-- absent != 0 (H7); fara crsOptiuni/crsOptiuniUtilizator -> fara eroare (nivel hardcodat).
@@ -1440,6 +2074,16 @@ PROCEDURE VerificaDiscriminatorDocumente
poVerifAlegere.Detalii()
lcLog1 = SUBSTR(FILETOSTR(gcUILog), lnLenInainte + 1)
*-- primul Detalii s-a incheiat cu do_termin() - reface formularul inainte de al doilea
goExecutor = loReal
DO PregatesteFormularD1a
SELECT ctestparteneri
LOCATE FOR id_part = gnIdDiscord
goFormT._GRID1.AfterRowColChange(1)
DO AsteaptaTimer
goExecutor = CREATEOBJECT('dummyexecutordoctest')
goExecutor.oReal = loReal
goExecutor.nIdsConDocumente = gnIdPereche
lnLenInainte = IIF(FILE(gcUILog), LEN(FILETOSTR(gcUILog)), 0)
poVerifAlegere.Detalii()
@@ -1480,8 +2124,9 @@ PROCEDURE VerificaB1LabelGolit
poVerifAlegere.VerificaRand(.F.)
lcCapDupa = ALLTRIM(goFormT.lb_anaf.Caption)
IF !EMPTY(lcCapInainte) AND EMPTY(lcCapDupa)
DO VpaLog WITH 'PASS B1-label-golit (9): verdict anterior [' + lcCapInainte + '] -> golit dupa cautare fara rezultate'
*-- banda nu ramane goala: fara rezultate revine la textul neutru, nu la verdictul anterior
IF !EMPTY(lcCapInainte) AND lcCapDupa == CHR(149) + ' Verificare ANAF la alegerea partenerului (F4 = detalii)'
DO VpaLog WITH 'PASS B1-label-golit (9): verdict anterior [' + lcCapInainte + '] -> text neutru dupa cautare fara rezultate'
ELSE
DO VpaLog WITH 'FAIL B1-label-golit (9): inainte=[' + lcCapInainte + '] dupa=[' + lcCapDupa + ']'
ENDIF