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

@@ -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