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:
@@ -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 = ''
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user