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

5
.gitignore vendored
View File

@@ -124,3 +124,8 @@ Thumbs.db
Desktop.ini
bash.exe.stackdump
.claude/
# --- artefacte generate de rularile de test headless ---
utile/Teste/**/screenshots/
utile/Teste/**/uisync/
utile/Teste/**/*_log.txt

View File

@@ -111,6 +111,10 @@ Cand un bug apare "de azi", compara cu clasa veche fara a atinge SVN:
## 7. Capcane la SCRIEREA scriptului de test
- **`SET SAFETY OFF` in primele linii, INAINTE de orice `STRTOFILE`/`CREATE CURSOR`** (plus
`SET TALK OFF`). Fara el VFP deschide dialogul de confirmare la suprascrierea fisierului de
log, iar headless dialogul blocheaza procesul pana la timeout. Suitele existente il au deja -
capcana apare la scripturile ad-hoc, scrise repede pentru o masuratoare.
- **`DEFINE CLASS ... ENDDEFINE` nu poate sta la mijlocul programului principal.** Toate liniile
de DUPA `ENDDEFINE` dau "Statement is not in a procedure" (vezi `<script>.ERR`); scriptul
ruleaza doar pana acolo si se opreste silentios, fara sa ajunga la `QUIT` - simptom: vfp9.exe

View File

@@ -31,8 +31,17 @@
acumulat — orchestrator + subagenti proaspeti per sarcina (max ~200-250k tokens/subagent),
handoff compact pe disc: `orchestrare-subagenti.md`.
7. Conventii obligatorii, de citit cand atingi zona respectiva:
- editezi `.vc2`/`.sc2` pe text (orice write, chiar pe o linie) -> `conventie_encoding_cp1252.md`
(tool care nu scrie cp1252 nativ corupe TOATE diacriticele din fisier);
- editezi orice fisier cu octeti cp1252 - `.vc2`/`.sc2`, dar si `.prg` (ex. `programe\ocautare.prg`,
unde `s`-urile cu virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) ->
`conventie_encoding_cp1252.md`. Orice write cu un tool care nu scrie cp1252 nativ (Edit/Write)
corupe caracterele >= 0x80 din TOT fisierul (`0xBA` -> `EF BF BD`), chiar daca schimbi o singura
linie, si o face din nou la FIECARE scriere. Deci: editezi tot ce ai de editat, si abia DUPA ultima
scriere verifici byte-level si repari o singura data; daca mai editezi dupa reparare, se strica iar.
Verificare: `perl -ne 'print "$.\n" if /[\x80-\xFF]/' <fisier>`; reparare (aici pentru `0xBA`):
`perl -e 'binmode(STDIN);binmode(STDOUT);local $/;$_=<STDIN>;s/\xEF\xBF\xBD/\xBA/g;print' < f > f.tmp`.
ATENTIE: `EF BF BD` nu spune ce caracter s-a pierdut - toate diacriticele devin la fel. Ia octetul
corect per pozitie din `svn cat <fisier>` (SVN are versiunea necorupta) si abia apoi inlocuieste;
o inlocuire oarba cu `0xBA` strica `a`/`t` cu caciula (`0xE3`, `0xFE`) din alte fisiere;
- adaugi/rearanjezi controale pe formulare sau coloane in grid -> `conventie_ux_formulare.md`;
- scrii cod cu `GO` pe un `Recno()` capturat sau primit ca parametru -> `conventie_go_recno.md`;
- `ALTER TABLE` pe cursorul intors de `goExecutor.oExecute()` -> `conventie_goexecutor_alter_table.md`;

View File

@@ -39,19 +39,27 @@
*!* marius.mutu
*!* caut_client_contract_activ - nu se iau contracte active de pe clienti inactivi
*!* 26.07.2026
*!* 27.07.2026
*!* marius.mutu
*!* verificare ANAF la alegerea partenerului: starea la data documentului si codul fiscal invalid pe randul curent
*!* din formularul de cautare, detalii si alegerea variantei corecte cu F4, optiunea RC_ANAF_VERIF_SELECTIE
*!* verificare ANAF la alegerea partenerului: banda de stare sub gridul de cautare arata starea la data
*!* documentului, codul fiscal invalid, inexistent la ANAF sau nenumeric pe randul curent, imediat ce apar
*!* rezultatele cautarii si la fiecare schimbare de rand; F4 deschide detaliile, iar alegerea altei variante
*!* de partener se propune doar cand codul difera de ANAF; optiunea RC_ANAF_VERIF_SELECTIE; cand serviciul
*!* ANAF nu raspunde, verificarile se opresc pe 10 minute si banda arata ca au fost sarite; la deschiderea
*!* formularului, daca starea serviciului nu e cunoscuta, pleaca o sonda asincrona care stabileste
*!* disponibilitatea fara sa blocheze interfata, iar randul curent asteapta rezultatul ei
*!* #DEFINE CRLF CHR(13) + CHR(10)
#INCLUDE COMUN\ROA.H
Procedure ANAF_StarePartener
Lparameters tcCodFiscal, tdData
Lparameters tcCodFiscal, tdData, tlDoarCache, tlNecesitaApel, tlNegasit, tcClasaEsec
Local lcCodFiscal, lcCodTara, lcCui, loVerificareCod, loRezANAF, lcCheieCache, lnI, llValid, loOut, ldData
Local lcCodFiscal, lcCui, loRezANAF, lcCheieCache, lnI, llValid, loOut, ldData, llNegasit, lcStareServiciu
tlNecesitaApel = .F.
tlNegasit = .F.
tcClasaEsec = ''
*** guard mediu partajat - ocautare.prg e inclus si de alte produse ROA fara validare.prg/goLog incarcate
If !('VALIDARE' $ Upper(Set('Procedure'))) Or Type('goLog') <> 'O'
Return .Null.
@@ -60,13 +68,7 @@ Procedure ANAF_StarePartener
If Empty(m.lcCodFiscal)
Return .Null.
Endif
*** excludere parteneri externi (COD_TARA <> RO)
loVerificareCod = Createobject("VerificareCod")
lcCodTara = loVerificareCod.GetCodTara(m.lcCodFiscal)
If m.lcCodTara <> 'RO'
Return .Null.
Endif
*** normalizare + excludere persoane fizice (CNP 13 cifre) / coduri nenumerice dupa eliminarea RO
*** normalizare + excludere persoane fizice (CNP 13 cifre) / semnalizare coduri nenumerice dupa eliminarea RO
lcCui = NormalizeazaCUI(m.lcCodFiscal)
llValid = !Empty(m.lcCui)
If m.llValid
@@ -77,7 +79,11 @@ Procedure ANAF_StarePartener
Endif
Endfor
Endif
If !m.llValid Or Len(m.lcCui) = 13
If m.llValid And Len(m.lcCui) = 13
Return .Null.
Endif
If !m.llValid
tcClasaEsec = 'COD_NENUMERIC'
Return .Null.
Endif
ldData = ANAF_CaData(m.tdData)
@@ -94,13 +100,38 @@ Procedure ANAF_StarePartener
Endif
lcCheieCache = 'C' + m.lcCui + '_' + Dtos(m.ldData)
If goCacheANAF_Sesiune.GetKey(m.lcCheieCache) = 0
loRezANAF = ANAF_VerificaCuiSingle(m.lcCui, m.ldData)
goCacheANAF_Sesiune.Add(Iif(Vartype(m.loRezANAF) = 'O', m.loRezANAF, .F.), m.lcCheieCache)
lcStareServiciu = ANAF_StareServiciu()
Do Case
Case m.lcStareServiciu == 'CAZUT'
tlNecesitaApel = .F.
tcClasaEsec = 'FARA_RASPUNS'
Return .Null.
Case m.lcStareServiciu == 'SE_TESTEAZA'
tlNecesitaApel = .T.
tcClasaEsec = 'SE_TESTEAZA'
Return .Null.
Endcase
tlNecesitaApel = .T.
If m.tlDoarCache
Return .Null.
Endif
llNegasit = .F.
loRezANAF = ANAF_VerificaCuiSingle(m.lcCui, m.ldData, @llNegasit, @tcClasaEsec)
Do Case
Case m.tcClasaEsec == 'FARA_RASPUNS'
ANAF_SeteazaStareServiciu('CAZUT', 'CUI=' + m.lcCui)
Case m.tcClasaEsec == ''
ANAF_SeteazaStareServiciu('VIU', 'CUI=' + m.lcCui)
Endcase
If Vartype(m.loRezANAF) = 'O'
goCacheANAF_Sesiune.Add(m.loRezANAF, m.lcCheieCache)
Endif
Else
loRezANAF = goCacheANAF_Sesiune.Item(m.lcCheieCache)
Endif
If Vartype(m.loRezANAF) <> 'O'
Return .Null. && fara raspuns/CUI negasit -> degradare tacuta
tlNegasit = m.llNegasit
Return .Null.
Endif
*** verdict
loOut = Createobject("Empty")
@@ -114,6 +145,66 @@ Procedure ANAF_StarePartener
Return loOut
Endproc && ANAF_StarePartener
Procedure ANAF_StareServiciu
If Type('gcANAF_StareServiciu') = 'U'
Public gcANAF_StareServiciu, gtANAF_StareServiciuMoment, gnANAF_StareServiciuStamp
gcANAF_StareServiciu = 'NECUNOSCUT'
gtANAF_StareServiciuMoment = Datetime()
gnANAF_StareServiciuStamp = 0
Endif
If gcANAF_StareServiciu == 'CAZUT' And (Datetime() - gtANAF_StareServiciuMoment) >= 600
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'expirare CAZUT dupa 10 minute')
Endif
Return gcANAF_StareServiciu
Endproc && ANAF_StareServiciu
Procedure ANAF_SeteazaStareServiciu
Lparameters tcStare, tcMotiv
If Type('gcANAF_StareServiciu') = 'U'
ANAF_StareServiciu()
Endif
If gcANAF_StareServiciu == m.tcStare
Return
Endif
If Type('goLog') = 'O'
goLog.Log('ANAF stare serviciu: ' + gcANAF_StareServiciu + ' -> ' + m.tcStare + ' (' + Alltrim(Nvl(m.tcMotiv, '')) + ')', 'anaf_verif_cautare')
Endif
gcANAF_StareServiciu = m.tcStare
gtANAF_StareServiciuMoment = Datetime()
gnANAF_StareServiciuStamp = gnANAF_StareServiciuStamp + 1
Endproc && ANAF_SeteazaStareServiciu
*** interogheaza sonda de disponibilitate (validare.prg) din timerul existent; termen de viata 10 secunde,
*** guard de reintrare (timerele VFP pot trage in timpul pomparii de mesaje dintr-un AMESSAGEBOX)
Procedure ANAF_SondaVerifica
Local llReusit
If ANAF_StareServiciu() <> 'SE_TESTEAZA'
Return
Endif
If Type('glANAF_SondaInterogareInCurs') = 'U'
Public glANAF_SondaInterogareInCurs
glANAF_SondaInterogareInCurs = .F.
Endif
If glANAF_SondaInterogareInCurs
Return
Endif
glANAF_SondaInterogareInCurs = .T.
Try
If (Datetime() - gtANAF_StareServiciuMoment) >= 10
ANAF_SondaOpreste()
ANAF_SeteazaStareServiciu('CAZUT', 'sonda expirata dupa 10 secunde')
Else
If ANAF_SondaAuSositRaspunsul()
llReusit = ANAF_SondaAReusit()
ANAF_SondaOpreste()
ANAF_SeteazaStareServiciu(Iif(m.llReusit, 'VIU', 'CAZUT'), 'sonda de disponibilitate')
Endif
Endif
Finally
glANAF_SondaInterogareInCurs = .F.
Endtry
Endproc && ANAF_SondaVerifica
Procedure ANAF_ValidareCod
Lparameters tcCodFiscal, tnTipPersoana
@@ -126,9 +217,6 @@ Procedure ANAF_ValidareCod
Return ''
Endif
loVerificareCod = Createobject("VerificareCod")
If loVerificareCod.GetCodTara(m.lcCodFiscal) <> 'RO'
Return ''
Endif
lcCui = NormalizeazaCUI(m.lcCodFiscal)
lnTipPersoana = Nvl(m.tnTipPersoana, 0)
llCnp = Iif(m.lnTipPersoana = 2, .T., Iif(m.lnTipPersoana = 1, .F., Len(m.lcCui) = 13))
@@ -314,8 +402,9 @@ DEFINE CLASS anaf_timer AS Timer
PROCEDURE Timer
This.Enabled = .F.
ANAF_SondaVerifica()
If Vartype(This.oOwner) = 'O'
This.oOwner.VerificaRand(.F.)
This.oOwner.EvalueazaRand(.T.)
Endif
ENDPROC
ENDDEFINE
@@ -335,7 +424,11 @@ DEFINE CLASS anaf_verif_cautare AS Custom
dDataDoc = {}
oCandidati = .Null.
nNivel = 1
lDecis = .F. && 27.07.2026 claude - decizia a fost deja luata in Detalii
lNegasit = .F.
lDecis = .F.
lVerificareInCurs = .F.
nStareServiciuStamp = 0
cClasaEsec = ''
PROCEDURE Activeaza
Lparameters toForm
@@ -368,14 +461,14 @@ DEFINE CLASS anaf_verif_cautare AS Custom
This.oForm = toForm
This.oTimer = Createobject('anaf_timer')
This.oTimer.oOwner = This
*!* 27.07.2026 claude - banda proprie sub grid, inalta cat doua linii de label
If Type('toForm._GRID1') = 'O' And Bitand(toForm._GRID1.Anchor, 8) = 8
toForm._GRID1.Anchor = toForm._GRID1.Anchor - 8 && inaltimea gridului o dau eu, in AjusteazaBanda
Endif
toForm.Height = toForm.Height + 54
With toForm.lb_anaf
.AutoSize = .F.
.BackStyle = 0
.BackStyle = 1
.BackColor = Rgb(240, 240, 240)
.WordWrap = .T.
.MousePointer = 15
.Left = 8
@@ -389,8 +482,17 @@ DEFINE CLASS anaf_verif_cautare AS Custom
Bindevent(toForm.lb_anaf, 'Click', This, 'Detalii')
Bindevent(toForm, 'Resize', This, 'AjusteazaBanda')
Bindevent(toForm, 'Activate', This, 'AjusteazaBanda')
If Pemstatus(toForm, 'do_cauta', 5)
Bindevent(toForm, 'do_cauta', This, 'DupaCautare', 1)
Endif
If ANAF_StareServiciu() == 'NECUNOSCUT'
If ANAF_SondaPorneste()
ANAF_SeteazaStareServiciu('SE_TESTEAZA', 'sonda pornita la deschidere formular')
Endif
Endif
This.AjusteazaBanda()
Bindevent(toForm._GRID1, 'AfterRowColChange', This, 'DupaRand')
This.AfiseazaPrompt()
ENDPROC
PROCEDURE AjusteazaBanda
@@ -409,6 +511,11 @@ DEFINE CLASS anaf_verif_cautare AS Custom
ENDPROC
PROCEDURE Dezactiveaza
Local llSondaOprita
llSondaOprita = ANAF_SondaOpreste()
If m.llSondaOprita And ANAF_StareServiciu() == 'SE_TESTEAZA'
ANAF_SeteazaStareServiciu('NECUNOSCUT', 'formular inchis cu sonda in aer')
Endif
If Vartype(This.oTimer) = 'O'
This.oTimer.Enabled = .F.
This.oTimer.oOwner = .Null.
@@ -418,6 +525,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom
Try
Unbindevents(This.oForm, 'Resize', This, 'AjusteazaBanda')
Unbindevents(This.oForm, 'Activate', This, 'AjusteazaBanda')
Unbindevents(This.oForm, 'do_cauta', This, 'DupaCautare')
Catch
Endtry
If Type('This.oForm.lb_anaf') = 'O'
@@ -438,15 +546,21 @@ DEFINE CLASS anaf_verif_cautare AS Custom
PROCEDURE DupaRand
Lparameters nColIndex
If Vartype(This.oTimer) = 'O'
This.oTimer.Enabled = .F.
This.oTimer.Enabled = .T.
Endif
This.EvalueazaRand(.F.)
ENDPROC
PROCEDURE DupaCautare
This.EvalueazaRand(.T.)
ENDPROC
PROCEDURE VerificaRand
Lparameters tlSincron
Local lcCursor, lnId, lcCodFiscal, loStare, lnTipPersoana, lcCodInvalid
Return This.EvalueazaRand(.T.)
ENDPROC
PROCEDURE EvalueazaRand
Lparameters tlPermiteApel
Local lcCursor, lnId, lcCodFiscal, loStare, lnTipPersoana, lcCodInvalid, llNecesitaApel, llNegasit, lcClasaEsec
If Vartype(This.oForm) <> 'O'
Return .F.
Endif
@@ -455,18 +569,24 @@ DEFINE CLASS anaf_verif_cautare AS Custom
Endif
lcCursor = This.oForm.crs_cursor
If !Used(m.lcCursor) Or Reccount(m.lcCursor) = 0
This.SeteazaLabel('', .F.)
This.nIdPart = 0
This.oStare = .Null.
This.cCui = ''
This.lNegasit = .F.
This.cClasaEsec = ''
This.AfiseazaPrompt()
Return .F.
Endif
lnId = Nvl(Evaluate(m.lcCursor + '.id_part'), 0)
lcCodFiscal = Alltrim(Nvl(Evaluate(m.lcCursor + '.cod_fiscal'), ''))
If m.lnId = 0
This.SeteazaLabel('', .F.)
This.AfiseazaPrompt()
Return .F.
Endif
If Type('gnANAF_StareServiciuStamp') = 'N' And gnANAF_StareServiciuStamp <> This.nStareServiciuStamp
This.nStareServiciuStamp = gnANAF_StareServiciuStamp
This.nIdPart = 0
Endif
If m.lnId = This.nIdPart
Return !Isnull(This.oStare)
Endif
@@ -476,18 +596,57 @@ DEFINE CLASS anaf_verif_cautare AS Custom
This.nIdPart = m.lnId
This.oStare = .Null.
This.cCui = ''
This.lNegasit = .F.
This.cClasaEsec = ''
This.SeteazaLabel(m.lcCodInvalid + ' (F4 = detalii)', .T.)
goLog.Log('Cod fiscal invalid: ' + m.lcCodInvalid + ' id_part=' + Transform(m.lnId), 'anaf_verif_cautare')
Return .F.
Endif
This.SeteazaLabel('Verificare ANAF...', .F.)
loStare = ANAF_StarePartener(m.lcCodFiscal, This.dDataDoc)
If This.lVerificareInCurs
Return .F.
Endif
llNecesitaApel = .F.
llNegasit = .F.
lcClasaEsec = ''
This.lVerificareInCurs = .T.
Try
loStare = ANAF_StarePartener(m.lcCodFiscal, This.dDataDoc, !m.tlPermiteApel, @llNecesitaApel, @llNegasit, @lcClasaEsec)
Finally
This.lVerificareInCurs = .F.
Endtry
If m.lcClasaEsec == 'SE_TESTEAZA'
This.SeteazaLabel('ANAF: se verifica ' + Alltrim(m.lcCodFiscal) + '...', .F., .T.)
If Vartype(This.oTimer) = 'O'
This.oTimer.Enabled = .T.
Endif
Return .F.
Endif
If !m.tlPermiteApel And m.llNecesitaApel
This.SeteazaLabel('ANAF: se verifica ' + Alltrim(m.lcCodFiscal) + '...', .F., .T.)
If Vartype(This.oTimer) = 'O'
This.oTimer.Enabled = .T.
Endif
Return .F.
Endif
This.nIdPart = m.lnId
This.oStare = m.loStare
This.lNegasit = m.llNegasit
This.cClasaEsec = m.lcClasaEsec
This.cCui = Iif(Isnull(m.loStare), '', loStare.cCui)
Do Case
Case Isnull(m.loStare) And m.llNegasit
This.SeteazaLabel('Cod fiscal inexistent la ANAF (' + Alltrim(m.lcCodFiscal) + ') (F4 = detalii)', .T.)
goLog.Log('Cod fiscal inexistent la ANAF: ' + Alltrim(m.lcCodFiscal) + ' id_part=' + Transform(m.lnId), 'anaf_verif_cautare')
Return .F.
Case Isnull(m.loStare) And Inlist(m.lcClasaEsec, 'FARA_RASPUNS', 'RASPUNS_NEINTELES')
This.SeteazaLabel('ANAF nu a raspuns - verificare sarita', .F., .T.)
Return .F.
Case Isnull(m.loStare) And m.lcClasaEsec == 'COD_NENUMERIC'
This.SeteazaLabel('Cod fiscal nenumeric - nu se poate verifica la ANAF', .F., .T.)
goLog.Log('Cod fiscal nenumeric: ' + Alltrim(m.lcCodFiscal) + ' id_part=' + Transform(m.lnId), 'anaf_verif_cautare')
Return .F.
Case Isnull(m.loStare)
This.SeteazaLabel('', .F.)
This.AfiseazaPrompt()
Return .F.
Case !loStare.lDiscordanta
This.SeteazaLabel(This.TextAnaf(m.loStare, .F., 24) + ' (F4 = detalii)', .F.)
@@ -499,14 +658,18 @@ DEFINE CLASS anaf_verif_cautare AS Custom
Return .T.
ENDPROC
PROCEDURE AfiseazaPrompt
This.SeteazaLabel('Verificare ANAF la alegerea partenerului (F4 = detalii)', .F., .T.)
ENDPROC
PROCEDURE SeteazaLabel
Lparameters tcText, tlAvertisment
Lparameters tcText, tlAvertisment, tlNeutru
If Vartype(This.oForm) <> 'O'
Return
Endif
With This.oForm.lb_anaf
.Caption = m.tcText
.ForeColor = Iif(m.tlAvertisment, Rgb(192, 0, 0), Rgb(0, 128, 0))
.Caption = Iif(Empty(m.tcText), '', ' ' + Chr(149) + ' ' + m.tcText)
.ForeColor = Iif(m.tlAvertisment, Rgb(192, 0, 0), Iif(m.tlNeutru, Rgb(112, 112, 112), Rgb(0, 128, 0)))
.FontBold = m.tlAvertisment
Endwith
This.oForm.lb_anaf.Refresh()
@@ -514,7 +677,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom
PROCEDURE TextStare
Lparameters toStare
Return Iif(toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA') + Iif(toStare.lInactivANAF, ' (inactiv la ANAF)', '')
Return Iif(toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA') + Iif(toStare.lInactivANAF, ', Inactiv', '')
ENDPROC
PROCEDURE TextAnaf
@@ -634,7 +797,17 @@ DEFINE CLASS anaf_verif_cautare AS Custom
lcCodAles = Alltrim(Nvl(Evaluate(m.lcCursor + '.cod_fiscal'), ''))
If Isnull(This.oStare)
Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + 'ANAF nu a raspuns - verificarea a fost sarita.', ;
Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + ;
Iif(This.lNegasit, 'Codul fiscal nu exista la ANAF.', ;
Iif(This.cClasaEsec == 'COD_NENUMERIC', 'Codul fiscal nu este numeric - nu se poate verifica la ANAF.', ;
'ANAF nu a raspuns - verificarea a fost sarita.')), ;
0 + 64, 'Verificare partener ANAF')
Return
Endif
If This.oStare.lAreRO = This.oStare.lPlatitorANAF
Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + ;
Iif(This.oStare.lInactivANAF, 'Nu exista alta varianta de partener de ales.', 'Codul fiscal corespunde.'), ;
0 + 64, 'Verificare partener ANAF')
Return
Endif
@@ -694,7 +867,6 @@ DEFINE CLASS anaf_verif_cautare AS Custom
Exit
Endcase
Enddo
*!* 27.07.2026 claude - dupa Da/Nu se inchide cautarea, ca sa revina in formular cu partenerul ales
If (m.lnRasp = 6 Or m.lnRasp = 7) And Pemstatus(This.oForm, 'do_termin', 5)
This.oForm.do_termin()
Endif
@@ -725,6 +897,9 @@ DEFINE CLASS anaf_verif_cautare AS Custom
Return .T.
Endif
If Inlist(ANAF_StareServiciu(), 'CAZUT', 'SE_TESTEAZA')
Return .T.
Endif
*** nivel 3: comportamentul de azi, neschimbat (verificare sincrona + confirmare)
If !This.VerificaRand(.T.)
Return .T.
@@ -738,6 +913,15 @@ DEFINE CLASS anaf_verif_cautare AS Custom
lcCodAles = Alltrim(Nvl(Evaluate(m.lcCursor + '.cod_fiscal'), ''))
lcCodOk = Iif(This.oStare.lPlatitorANAF, 'RO', '') + This.cCui
If This.oStare.lAreRO = This.oStare.lPlatitorANAF
lcMesaj = This.AntetDialog(m.lcDenAles, m.lcCodAles) + ;
'De acord = Pastreaza selectia' + Chr(13) + ;
'Abandon = Inapoi la cautare'
lnRasp = Amessagebox(m.lcMesaj, 1 + 48, 'Verificare ANAF')
goLog.Log('Decizie ANAF (inactiv la ANAF): rasp=' + Transform(m.lnRasp), 'anaf_verif_cautare')
Return (m.lnRasp = 1)
Endif
lnCandidati = 0
lnCandidat = 0
lcDenPereche = ''

View File

@@ -59,6 +59,14 @@
*!* marius.mutu
*!* NormalizeazaCUI + ANAF_VerificaCuiSingle (verificare la alegerea partenerului, la data documentului)
*!* 27.07.2026
*!* marius.mutu
*!* ANAF_VerificaCuiSingle: raspunsul ANAF se citeste si cand serviciul intoarce cod 404, iar codul e
*!* declarat inexistent doar cand raspunsul chiar contine codul cautat; apelurile web (single si lot)
*!* folosesc timeout-uri reale, iar formatul datei se restaureaza si daca interpretarea raspunsului esueaza;
*!* sonda asincrona de disponibilitate (ANAF_SondaPorneste/AuSositRaspunsul/AReusit/Opreste) verifica in
*!* fundal, la nevoie, daca serviciul ANAF a revenit, fara sa blocheze interfata
*!* http://ec.europa.eu/taxation_customs/vies/viesquer.do
*!* http://localhost/contafinupdate/verificarecod.aspx/verificarecod/verificare/CIF/1879855/MFIN
*!* http://localhost/contafinupdate/verificarecod.aspx/verificarecod/verificare/CNP/1810228134187
@@ -1576,19 +1584,23 @@ Function NormalizeazaCUI
Endfunc && NormalizeazaCUI
*************************************
*** Wrapper single-CUI peste VerificareANAF: tdData = data documentului (lipsa -> data curenta), degradare tacuta (.NULL.)
*** Wrapper single-CUI peste VerificareANAF: tdData = data documentului (lipsa -> data curenta), degradare tacuta (.NULL.),
*** tlNegasit (prin referinta) = ANAF a raspuns ca nu exista codul, spre deosebire de lipsa raspunsului
*************************************
Function ANAF_VerificaCuiSingle
Lparameters tcCui, tdData
Lparameters tcCui, tdData, tlNegasit, tcClasaEsec
Local lcCuiNormalizat, loHTTP, loEx As Exception, loResult, lcServer, lcSend, lcJsonString, lcDataFormatted, ldData
Local loVerificareANAF As "VerificareANAF", loCol As "empty", laCoduri[1], lcAliasTemp, lnReccountTemp, lnI, llValid
Local lcCuiNormalizat, loHTTP, loEx As Exception, loResult, lcJsonString, ldData
Local loVerificareANAF As "VerificareANAF", lcAliasTemp, lnI, llValid
Local llRaspunsPrimit, lnCuiCautat
If Type('gvANAF_EroareLogataSesiune') = 'U'
Public gvANAF_EroareLogataSesiune
gvANAF_EroareLogataSesiune = .F.
Endif
tcClasaEsec = ''
tlNegasit = .F.
lcCuiNormalizat = NormalizeazaCUI(m.tcCui)
llValid = !Empty(m.lcCuiNormalizat)
If m.llValid
@@ -1605,54 +1617,23 @@ Function ANAF_VerificaCuiSingle
loResult = .Null.
lcAliasTemp = "crsANAFSingleTemp"
llRaspunsPrimit = .F.
ldData = Iif(Vartype(m.tdData) = 'D' And !Empty(m.tdData), m.tdData, Date())
lnCuiCautat = Int(Val(m.lcCuiNormalizat))
Try
loVerificareANAF = Createobject("VerificareANAF") && incarca nfjsonread/nfjsoncreate (Init)
Try
loHTTP = Createobject('winHTTP.winHTTPrequest.5.1')
If Pemstatus(m.loHTTP, 'SetTimeouts', 5)
loHTTP.SetTimeouts(3000, 3000, 5000, 5000) && rezolvare/conectare 3s, trimitere/primire 5s - de revizuit dupa masuratori (Tema)
Endif
Catch To loEx
loHTTP = Createobject('Microsoft.XMLHTTP')
Endtry
ldData = Iif(Vartype(m.tdData) = 'D' And !Empty(m.tdData), m.tdData, Date())
lcDataFormatted = Left(Dtos(m.ldData), 4) + "-" + Substr(Dtos(m.ldData), 5, 2) + "-" + Substr(Dtos(m.ldData), 7, 2)
loCol = Createobject("empty")
Addproperty(loCol, "cui", Int(Val(m.lcCuiNormalizat)))
Addproperty(loCol, "data", m.lcDataFormatted)
laCoduri[1] = loCol
lcSend = nfjsoncreate(@laCoduri)
lcServer = 'https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva'
lcJsonString = ''
loHTTP.Open('POST', lcServer, .F.)
loHTTP.setRequestHeader("Content-Type", "application/json;")
loHTTP.Send(lcSend)
If loHTTP.Status = 200
lcJsonString = Alltrim(loHTTP.responseText)
Endif
loHTTP = ANAF_CreeazaCerereANAF(m.lnCuiCautat, m.ldData, .F.)
llRaspunsPrimit = .T.
lcJsonString = Alltrim(loHTTP.responseText)
If !Empty(m.lcJsonString) And Left(m.lcJsonString, 1) = '{'
Use In (Select(m.lcAliasTemp))
loVerificareANAF.ParseJsonANAFv8(nfjsonread(m.lcJsonString), m.lcAliasTemp)
If Used(m.lcAliasTemp)
Select (m.lcAliasTemp)
lnReccountTemp = Reccount()
If m.lnReccountTemp = 1 And !Empty(denumire)
loResult = Createobject("empty")
Addproperty(loResult, "cui", cui)
Addproperty(loResult, "scpTVA", Nvl(scpTVA, .F.))
Addproperty(loResult, "statusInactivi", Nvl(statusInactivi, .F.))
Addproperty(loResult, "denumire", Nvl(denumire, ""))
Addproperty(loResult, "mesaj", Nvl(mesaj, ""))
Endif
Use In (Select(m.lcAliasTemp))
Endif
loResult = ANAF_VerdictDinCursor(m.lcAliasTemp, m.lnCuiCautat, @tlNegasit, @tcClasaEsec)
Else
tcClasaEsec = 'RASPUNS_NEINTELES'
Endif
Catch To loEx
If !gvANAF_EroareLogataSesiune
@@ -1662,11 +1643,157 @@ Function ANAF_VerificaCuiSingle
gvANAF_EroareLogataSesiune = .T.
Endif
loResult = .Null.
tlNegasit = .F.
tcClasaEsec = Iif(m.llRaspunsPrimit, 'RASPUNS_NEINTELES', 'FARA_RASPUNS')
Endtry
Return m.loResult
Endfunc && ANAF_VerificaCuiSingle
*************************************
*** Alege intre obiect de rezultat / tlNegasit (exact 1 rand, denumire goala, cui = CUI-ul cautat) /
*** tcClasaEsec = 'RASPUNS_NEINTELES', pe baza cursorului lasat de ParseJsonANAFv8; ambele prin referinta
*************************************
Function ANAF_VerdictDinCursor
Lparameters tcAlias, tnCuiCautat, tlNegasit, tcClasaEsec
Local loResult, lnReccountTemp
loResult = .Null.
tlNegasit = .F.
tcClasaEsec = ''
If Used(m.tcAlias)
Select (m.tcAlias)
lnReccountTemp = Reccount()
If m.lnReccountTemp = 1 And !Empty(denumire)
loResult = Createobject("empty")
Addproperty(loResult, "cui", cui)
Addproperty(loResult, "scpTVA", Nvl(scpTVA, .F.))
Addproperty(loResult, "statusInactivi", Nvl(statusInactivi, .F.))
Addproperty(loResult, "denumire", Nvl(denumire, ""))
Addproperty(loResult, "mesaj", Nvl(mesaj, ""))
Else
If m.lnReccountTemp = 1 And Empty(denumire) And Nvl(cui, 0) = m.tnCuiCautat
tlNegasit = .T.
Else
tcClasaEsec = 'RASPUNS_NEINTELES'
Endif
Endif
Use In (Select(m.tcAlias))
Else
tcClasaEsec = 'RASPUNS_NEINTELES'
Endif
Return m.loResult
Endfunc && ANAF_VerdictDinCursor
*************************************
*** Construieste, deschide (sincron sau asincron) si trimite o cerere PlatitorTvaRest v9 pentru un singur CUI;
*** folosita atat de wrapper-ul de verificare cat si de sonda de disponibilitate
*************************************
Function ANAF_CreeazaCerereANAF
Lparameters tnCui, tdData, tlAsync
Local loHTTP, loEx As Exception, loCol As "empty", laCoduri[1], lcSend, lcServer, ldData, lcDataFormatted
Try
loHTTP = Createobject('winHTTP.winHTTPrequest.5.1')
Try
loHTTP.SetTimeouts(2000, 2000, 3000, 3000) && rezolvare/conectare 2s, trimitere/primire 3s
Catch To loEx
Endtry
Catch To loEx
loHTTP = .Null.
Endtry
ldData = Iif(Vartype(m.tdData) = 'D' And !Empty(m.tdData), m.tdData, Date())
lcDataFormatted = Left(Dtos(m.ldData), 4) + "-" + Substr(Dtos(m.ldData), 5, 2) + "-" + Substr(Dtos(m.ldData), 7, 2)
loCol = Createobject("empty")
Addproperty(loCol, "cui", Int(Val(Transform(m.tnCui))))
Addproperty(loCol, "data", m.lcDataFormatted)
laCoduri[1] = loCol
lcSend = nfjsoncreate(@laCoduri)
lcServer = 'https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva'
loHTTP.Open('POST', lcServer, m.tlAsync)
loHTTP.setRequestHeader("Content-Type", "application/json;")
loHTTP.Send(lcSend)
Return m.loHTTP
Endfunc && ANAF_CreeazaCerereANAF
*************************************
*** Sonda asincrona de disponibilitate ANAF: porneste o cerere pe un CUI constant (1879855, ROMFAST SRL,
*** deja folosit ca CUI de test in acest fisier), fara sa scrie in cache si fara sa produca vreun verdict de partener
*************************************
Function ANAF_SondaPorneste
Local loEx As Exception
ANAF_SondaOpreste()
If Type('goANAF_SondaHTTP') = 'U'
Public goANAF_SondaHTTP, glANAF_SondaReusita
Endif
goANAF_SondaHTTP = .Null.
glANAF_SondaReusita = .F.
Try
goANAF_SondaHTTP = ANAF_CreeazaCerereANAF(1879855, Date(), .T.)
Catch To loEx
goANAF_SondaHTTP = .Null.
Endtry
Return (Vartype(goANAF_SondaHTTP) = 'O')
Endfunc && ANAF_SondaPorneste
*************************************
*** .T. daca sonda in curs si-a primit raspunsul (indiferent de rezultat) sau nu exista nicio sonda activa
*************************************
Function ANAF_SondaAuSositRaspunsul
Local loEx As Exception, llSosit
If Vartype(goANAF_SondaHTTP) <> 'O'
Return .T.
Endif
llSosit = .F.
Try
llSosit = goANAF_SondaHTTP.WaitForResponse(0)
Catch To loEx
glANAF_SondaReusita = .F.
Return .T.
Endtry
If m.llSosit
glANAF_SondaReusita = .T.
Endif
Return m.llSosit
Endfunc && ANAF_SondaAuSositRaspunsul
*************************************
*** Verdictul sondei, valabil dupa ce ANAF_SondaAuSositRaspunsul() a intors .T.
*************************************
Function ANAF_SondaAReusit
Return (Vartype(glANAF_SondaReusita) = 'L' And glANAF_SondaReusita)
Endfunc && ANAF_SondaAReusit
*************************************
*** Abandoneaza si elibereaza sonda in curs, daca exista; intoarce .T. daca chiar era o sonda in aer
*************************************
Function ANAF_SondaOpreste
Local loEx As Exception, llOprita
llOprita = (Vartype(goANAF_SondaHTTP) = 'O')
If m.llOprita
Try
goANAF_SondaHTTP.Abort()
Catch To loEx
Endtry
goANAF_SondaHTTP = .Null.
Endif
Return m.llOprita
Endfunc && ANAF_SondaOpreste
*********************************************
*** Verificare coduri fiscale folosind serviciul web ANAF, cate 500 de coduri per interogare
*********************************************
@@ -1751,6 +1878,10 @@ Define Class VerificareANAF As Custom
goLog.Log('lnRecords: ' + Transform(m.lnRecords), 'ANAF_SincronWebService_PlatitorTva')
Try
loHTTP = Createobject('winHTTP.winHTTPrequest.5.1')
Try
loHTTP.SetTimeouts(2000, 2000, 3000, 3000)
Catch To loEx
Endtry
Catch To loEx
ENDTRY
@@ -1890,6 +2021,7 @@ Define Class VerificareANAF As Custom
lcSave_SetDate = Set("Date")
Set Date To YMD
Try
*
lnRecords = Alen(loJsonObject.found_vfpsafe_, 1)
For lnRec = 1 To m.lnRecords
@@ -1995,7 +2127,9 @@ Define Class VerificareANAF As Custom
Endif
Endfor
*
Set Date To &lcSave_SetDate
Finally
Set Date To &lcSave_SetDate
Endtry
Else
goLog.Log('JsonObject is null', 'ParseJsonANAF')
Endif

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