Verificare ANAF la alegerea partenerului

ocautare.prg - miezul functionalitatii:
- anaf_verif_cautare: verdictul ANAF pe randul curent din formularul de cautare
  (label sub grid), la data documentului; discordantele si codurile fiscale invalide
  cu rosu; F4 sau click deschide detaliile.
- ANAF_StarePartener, cu cache pe sesiune, excludere parteneri externi si persoane
  fizice; ANAF_ValidareCod pentru CIF/CNP.
- ANAF_NivelVerificare: cascada RC_ANAF_VERIF_SELECTIE (kill-switch settings.ini >
  optiuni utilizator > optiuni firma > implicit 1), cu cache invalidat la schimbarea
  firmei sau utilizatorului; ANAF_ComutaVerificare pentru punctul de meniu.
- Detalii: alegerea variantei corecte de partener din perechea RO / fara RO, cu
  discriminator "are documente in perioada"; dupa Da sau Nu se inchide cautarea si
  se revine in formular cu partenerul ales (AplicaInlocuirePartenerANAF).
- ANAF_CaData: data documentului poate veni si ca DateTime (tact.dataact).
- Banda proprie sub grid pentru label: formularul creste cu 54, gridul isi pierde
  ancorarea de jos si primeste inaltimea din AjusteazaBanda, legata de Resize si
  Activate - formularul isi reaseaza gridul dupa Show, deci Activate e momentul util.

validare.prg: ANAF_VerificaCuiSingle, wrapper single-CUI peste serviciul ANAF, cu
data verificarii si o singura eroare logata pe sesiune.

cauta_alfa.prg: hook generic - ataseaza poVerifAlegere pe formularul de cautare
inainte de Show si il detaseaza dupa.

Apelanti opt-in (lVerificaANAF): baza.vc2 (lookup-ul generic de partener din
formularele actbaza/actbaza2007 lansate din meniuri), onote_contabile.vc2 (partener
debit/credit), omodificari.vc2 (do_cauta din cele trei clase de modificare, cu data
notei), ofacturare.vc2 (client, furnizor). Casa/banca ramane in afara: acolo partenerul
se alege pentru imperecherea facturilor.

cauta_alfa_forms.vc2: F4 deschide detaliile, iar terminarea cautarii trece prin
VerificaAlegere.

Teste: suita headless pentru fluxul de verificare (utile/Teste/partener_anaf/), cu
mock pentru apelul ANAF si pentru dialoguri.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019H3r66sVojGhgaKq5niu1u
This commit is contained in:
2026-07-27 01:29:41 +03:00
parent df9698375a
commit 889840357a
20 changed files with 3083 additions and 110 deletions

View File

@@ -207,8 +207,18 @@ ENDIF
Endif
.cIdColumn = lcIdColumn
Endwith
If Type('poVerifAlegere') = 'O' And !Isnull(poVerifAlegere)
AddProperty(oForm_cautare, 'oVerifAlegere', poVerifAlegere)
poVerifAlegere.Activeaza(oForm_cautare)
Endif
oForm_cautare.Show()
If Type('poVerifAlegere') = 'O' And !Isnull(poVerifAlegere)
poVerifAlegere.Dezactiveaza()
Endif
*!* modificare 30.11.2006
If Type("lorec") = "O"
poRec = lorec

View File

@@ -39,9 +39,762 @@
*!* marius.mutu
*!* caut_client_contract_activ - nu se iau contracte active de pe clienti inactivi
*!* 26.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
*!* #DEFINE CRLF CHR(13) + CHR(10)
#INCLUDE COMUN\ROA.H
Procedure ANAF_StarePartener
Lparameters tcCodFiscal, tdData
Local lcCodFiscal, lcCodTara, lcCui, loVerificareCod, loRezANAF, lcCheieCache, lnI, llValid, loOut, ldData
*** 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.
Endif
lcCodFiscal = Alltrim(Nvl(m.tcCodFiscal, ''))
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
lcCui = NormalizeazaCUI(m.lcCodFiscal)
llValid = !Empty(m.lcCui)
If m.llValid
For lnI = 1 To Len(m.lcCui)
If !Isdigit(Substr(m.lcCui, lnI, 1))
llValid = .F.
Exit
Endif
Endfor
Endif
If !m.llValid Or Len(m.lcCui) = 13
Return .Null.
Endif
ldData = ANAF_CaData(m.tdData)
If Empty(m.ldData) And Type('poAct.dataact') $ 'DT'
ldData = ANAF_CaData(poAct.dataact)
Endif
If Empty(m.ldData)
ldData = Date()
Endif
*** cache pe sesiune (cheie = CUI normalizat + data verificarii) + apel ANAF (wrapper single-CUI, validare.prg), fara Wait Window
If Type('goCacheANAF_Sesiune') <> 'O'
Public goCacheANAF_Sesiune
goCacheANAF_Sesiune = Createobject('Collection')
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)
Else
loRezANAF = goCacheANAF_Sesiune.Item(m.lcCheieCache)
Endif
If Vartype(m.loRezANAF) <> 'O'
Return .Null. && fara raspuns/CUI negasit -> degradare tacuta
Endif
*** verdict
loOut = Createobject("Empty")
Addproperty(loOut, "cCui", m.lcCui)
Addproperty(loOut, "lAreRO", Left(Upper(Alltrim(m.lcCodFiscal)), 2) = 'RO')
Addproperty(loOut, "lPlatitorANAF", loRezANAF.scpTVA)
Addproperty(loOut, "lInactivANAF", loRezANAF.statusInactivi)
Addproperty(loOut, "cDenumireANAF", Alltrim(Nvl(loRezANAF.denumire, '')))
Addproperty(loOut, "lDiscordanta", (loRezANAF.scpTVA <> loOut.lAreRO) Or loRezANAF.statusInactivi)
Addproperty(loOut, "dData", m.ldData)
Return loOut
Endproc && ANAF_StarePartener
Procedure ANAF_ValidareCod
Lparameters tcCodFiscal, tnTipPersoana
Local lcCodFiscal, lcCui, loVerificareCod, lnTipPersoana, llCnp
If !('VALIDARE' $ Upper(Set('Procedure')))
Return ''
Endif
lcCodFiscal = Alltrim(Nvl(m.tcCodFiscal, ''))
If Empty(m.lcCodFiscal)
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))
If m.llCnp
Return Iif(loVerificareCod.VALIDARE_CNP(m.lcCui), '', 'CNP invalid (' + m.lcCui + ')')
Endif
Return Iif(loVerificareCod.VALIDARE_CIF(m.lcCui), '', 'CIF invalid (' + m.lcCui + ')')
Endproc && ANAF_ValidareCod
Procedure ANAF_CaData
*** data documentului poate veni si ca DateTime (ex. tact.dataact din note contabile)
Lparameters tuValoare
Do Case
Case Vartype(m.tuValoare) = 'D'
Return m.tuValoare
Case Vartype(m.tuValoare) = 'T'
Return Ttod(m.tuValoare)
Otherwise
Return {}
Endcase
Endproc && ANAF_CaData
Procedure ANAF_NivelVerificare
*** cascada RC_ANAF_VERIF_SELECTIE: 0=oprit, 1=verdict pe rand (implicit), 2=rezervat (tratat ca 1), 3=verdict+confirmare
Local lcSel, lcCheie, lnNivel, lcVal
*** kill-switch - doar valoarea explicita '0' opreste; absenta NU seteaza nivelul
If Alltrim(Nvl(getini(gcGeneralIniFile, 'anaf', 'verificare_selectie'), '')) == '0'
Return 0
Endif
*** cache pe sesiune - cheia (schema + utilizator) invalideaza automat la schimbarea firmei/utilizatorului
lcCheie = 'N' + Iif(Type('gcS') = 'C', gcS, '') + '_' + Iif(Type('gnIdUtil') = 'N', Transform(gnIdUtil), '')
If Type('goCacheANAF_Nivel') <> 'O'
Public goCacheANAF_Nivel
goCacheANAF_Nivel = Createobject('Collection')
Endif
If goCacheANAF_Nivel.GetKey(m.lcCheie) <> 0
Return goCacheANAF_Nivel.Item(m.lcCheie)
Endif
lnNivel = 1
lcSel = Select()
If 'OINIT_OPTIUNI' $ Upper(Set('Procedure'))
lcVal = Iif(Used('crsOptiuniUtilizator'), Alltrim(Nvl(citeste_optiune_utilizator('RC_ANAF_VERIF_SELECTIE'), '')), '')
If Empty(m.lcVal) And Used('crsOptiuni')
lcVal = Alltrim(Nvl(citeste_optiune('RC_ANAF_VERIF_SELECTIE'), ''))
Endif
If !Empty(m.lcVal)
lnNivel = Int(Val(m.lcVal))
Endif
Endif
Select (m.lcSel)
goCacheANAF_Nivel.Add(m.lnNivel, m.lcCheie)
Return m.lnNivel
Endproc && ANAF_NivelVerificare
Procedure ANAF_CautaPereche
Lparameters tcCui, tcCursor
Local lcSelect, lnSucces
lcSelect = [SELECT ID_PART, DENUMIRE, COD_FISCAL, INACTIV FROM NOM_PARTENERI ] + ;
[WHERE STERS = 0 AND (UPPER(REPLACE(COD_FISCAL,' ','')) = '] + m.tcCui + [' ] + ;
[OR UPPER(REPLACE(COD_FISCAL,' ','')) = 'RO] + m.tcCui + [') ORDER BY UPPER(DENUMIRE), ID_PART]
If Used(m.tcCursor)
Use In (m.tcCursor)
Endif
lnSucces = goExecutor.oExecute(m.lcSelect, m.tcCursor)
If m.lnSucces < 0
goLog.Log('ANAF_CautaPereche: ' + goExecutor.cEroare, 'ANAF_CautaPereche')
If Used(m.tcCursor)
Use In (m.tcCursor)
Endif
Return .F. && degradare tacuta
Endif
Return .T.
Endproc && ANAF_CautaPereche
Procedure AplicaInlocuirePartenerANAF
Lparameters toPartener, toInlocuire, tcTipuriParteneri
Local lnRecCnt
If Vartype(m.toInlocuire) <> 'O' Or Isnull(m.toPartener) Or Type('toPartener.id_part') <> 'N'
Return
Endif
toPartener.id_part = toInlocuire.nIdPart
If Type('toPartener.denumire') = 'C'
toPartener.denumire = toInlocuire.cDenumire
Endif
If Type('toPartener.nume') = 'C'
toPartener.nume = toInlocuire.cDenumire
Endif
toPartener.cod_fiscal = toInlocuire.cCodFiscal
*** recalculeaza tip pentru id-ul perechii, acelasi criteriu ca SELECT-ul gridului (coresp_tip_part)
If Type('toPartener.tip') = 'N' And !Empty(Nvl(m.tcTipuriParteneri, ''))
lnRecCnt = 0
goExecutor.oSelect2Value([SELECT COUNT(*) AS NR FROM CORESP_TIP_PART WHERE ID_PART = ] + Transform(toInlocuire.nIdPart) + ;
[ AND ID_TIP_PART IN (] + m.tcTipuriParteneri + [)], @lnRecCnt)
toPartener.tip = Iif(Nvl(m.lnRecCnt, 0) > 0, 0, 1)
Endif
goLog.Log('ANAF: inlocuire partener -> id_part=' + Transform(toInlocuire.nIdPart), 'AplicaInlocuirePartenerANAF')
Endproc && AplicaInlocuirePartenerANAF
Procedure ANAF_ComutaVerificare
*** valori: 0 = oprit, 1 = starea pe randul curent, 3 = starea si confirmarea la partener discordant, 9 = oprit pe acest calculator
Local lcSel, lcOptiune, lcEticheta, lcValIni, lcValUtil, lcValFirma, lcSursa, lnNivel, lnNou, lcMesaj
lcEticheta = 'Verificare ANAF la alegerea partenerului'
lcOptiune = 'RC_ANAF_VERIF_SELECTIE'
lcSel = Select()
lcValIni = Alltrim(Nvl(getini(gcGeneralIniFile, 'anaf', 'verificare_selectie'), ''))
lcValUtil = ''
lcValFirma = ''
If 'OINIT_OPTIUNI' $ Upper(Set('Procedure'))
lcValUtil = Iif(Used('crsOptiuniUtilizator'), Alltrim(Nvl(citeste_optiune_utilizator(m.lcOptiune), '')), '')
lcValFirma = Iif(Used('crsOptiuni'), Alltrim(Nvl(citeste_optiune(m.lcOptiune), '')), '')
Endif
Select (m.lcSel)
lnNivel = ANAF_NivelVerificare()
Do Case
Case m.lcValIni == '0'
lcSursa = 'oprita pe acest calculator (settings.ini)'
Case !Empty(m.lcValUtil)
lcSursa = 'setata pentru utilizatorul curent'
Case !Empty(m.lcValFirma)
lcSursa = 'setata pentru firma'
Otherwise
lcSursa = 'implicita'
Endcase
lcMesaj = 'Acum: ' + Transform(m.lnNivel) + ' - ' + ANAF_TextNivel(m.lnNivel) + Chr(13) + ;
'(' + m.lcSursa + ')' + Chr(13) + Chr(13) + ;
' 0 = ' + ANAF_TextNivel(0) + Chr(13) + ;
' 1 = ' + ANAF_TextNivel(1) + Chr(13) + ;
' 3 = ' + ANAF_TextNivel(3) + Chr(13) + ;
' 9 = ' + ANAF_TextNivel(9) + Chr(13) + Chr(13) + ;
'Valorile 0, 1 si 3 va urmaresc pe orice calculator.'
Amessagebox(m.lcMesaj, 0 + 64, lcEticheta)
lnNou = aInputBox('Valoarea noua (0, 1, 3 sau 9):', m.lcEticheta, m.lnNivel)
If Vartype(m.lnNou) <> 'N' Or !Inlist(m.lnNou, 0, 1, 3, 9)
Return
Endif
If m.lnNou = 9
setini(gcGeneralIniFile, 'anaf', 'verificare_selectie', '0')
Else
If m.lcValIni == '0'
setini(gcGeneralIniFile, 'anaf', 'verificare_selectie', '1')
Endif
If !('OINIT_OPTIUNI' $ Upper(Set('Procedure'))) Or !Used('crsOptiuniUtilizator')
Amessagebox('Optiunea nu poate fi salvata: lipseste lista de optiuni ale utilizatorului.', 0 + 48, lcEticheta)
Return
Endif
lcSel = Select()
scrie_optiune_utilizator(m.lcOptiune, Alltrim(Str(m.lnNou)), 'VERIFICARE ANAF LA ALEGEREA PARTENERULUI')
Select (m.lcSel)
Endif
If Type('goCacheANAF_Nivel') = 'O'
Release goCacheANAF_Nivel
Endif
Endproc && ANAF_ComutaVerificare
Procedure ANAF_TextNivel
Lparameters tnNivel
Do Case
Case m.tnNivel = 0
Return 'fara verificare'
Case m.tnNivel = 9
Return 'oprita pe acest calculator, pentru toti utilizatorii lui'
Case m.tnNivel >= 3
Return 'arata starea si intreaba la alegerea unui partener discordant'
Otherwise
Return 'arata starea partenerului la ANAF pe randul curent'
Endcase
Endproc && ANAF_TextNivel
DEFINE CLASS anaf_timer AS Timer
oOwner = .Null.
Interval = 400
Enabled = .F.
PROCEDURE Timer
This.Enabled = .F.
If Vartype(This.oOwner) = 'O'
This.oOwner.VerificaRand(.F.)
Endif
ENDPROC
ENDDEFINE
DEFINE CLASS anaf_label AS Label
FontName = 'Arial'
FontSize = 10
BackStyle = 0
ENDDEFINE
DEFINE CLASS anaf_verif_cautare AS Custom
oForm = .Null.
oTimer = .Null.
nIdPart = 0
oStare = .Null.
cCui = ''
dDataDoc = {}
oCandidati = .Null.
nNivel = 1
lDecis = .F. && 27.07.2026 claude - decizia a fost deja luata in Detalii
PROCEDURE Activeaza
Lparameters toForm
Local lcCursor, llCreat
If Vartype(m.toForm) <> 'O' Or toForm.lAles
Return
Endif
lcCursor = toForm.crs_cursor
If !Used(m.lcCursor) Or Type(m.lcCursor + '.cod_fiscal') <> 'C' Or Type(m.lcCursor + '.id_part') <> 'N'
Return
Endif
llCreat = .F.
Try
toForm.NewObject('lb_anaf', '_label', '_baza.vcx')
llCreat = .T.
Catch
llCreat = .F.
Endtry
If !m.llCreat
Try
toForm.AddObject('lb_anaf', 'anaf_label')
llCreat = .T.
Catch
llCreat = .F.
Endtry
Endif
If !m.llCreat
Return
Endif
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
.WordWrap = .T.
.MousePointer = 15
.Left = 8
.Width = toForm.Width - 20
.Height = 46
.Top = toForm.Height - 50
.Caption = ''
.Visible = .T.
.Anchor = 14
Endwith
Bindevent(toForm.lb_anaf, 'Click', This, 'Detalii')
Bindevent(toForm, 'Resize', This, 'AjusteazaBanda')
Bindevent(toForm, 'Activate', This, 'AjusteazaBanda')
This.AjusteazaBanda()
Bindevent(toForm._GRID1, 'AfterRowColChange', This, 'DupaRand')
ENDPROC
PROCEDURE AjusteazaBanda
*** gridul ramane ancorat jos; il opresc doar sa intre peste banda labelului
Local lnMax
If Vartype(This.oForm) <> 'O' Or Type('This.oForm._GRID1') <> 'O'
Return
Endif
If Bitand(This.oForm._GRID1.Anchor, 8) = 8
This.oForm._GRID1.Anchor = This.oForm._GRID1.Anchor - 8
Endif
lnMax = This.oForm.Height - 58 - This.oForm._GRID1.Top
If m.lnMax > 60
This.oForm._GRID1.Height = m.lnMax
Endif
ENDPROC
PROCEDURE Dezactiveaza
If Vartype(This.oTimer) = 'O'
This.oTimer.Enabled = .F.
This.oTimer.oOwner = .Null.
This.oTimer = .Null.
Endif
If Vartype(This.oForm) = 'O'
Try
Unbindevents(This.oForm, 'Resize', This, 'AjusteazaBanda')
Unbindevents(This.oForm, 'Activate', This, 'AjusteazaBanda')
Catch
Endtry
If Type('This.oForm.lb_anaf') = 'O'
Try
Unbindevents(This.oForm.lb_anaf)
Catch
Endtry
Endif
If Type('This.oForm._GRID1') = 'O'
Try
Unbindevents(This.oForm._GRID1)
Catch
Endtry
Endif
Endif
This.oForm = .Null.
ENDPROC
PROCEDURE DupaRand
Lparameters nColIndex
If Vartype(This.oTimer) = 'O'
This.oTimer.Enabled = .F.
This.oTimer.Enabled = .T.
Endif
ENDPROC
PROCEDURE VerificaRand
Lparameters tlSincron
Local lcCursor, lnId, lcCodFiscal, loStare, lnTipPersoana, lcCodInvalid
If Vartype(This.oForm) <> 'O'
Return .F.
Endif
If Vartype(This.oTimer) = 'O'
This.oTimer.Enabled = .F.
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 = ''
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.)
Return .F.
Endif
If m.lnId = This.nIdPart
Return !Isnull(This.oStare)
Endif
lnTipPersoana = Iif(Type(m.lcCursor + '.tip_persoana') = 'N', Nvl(Evaluate(m.lcCursor + '.tip_persoana'), 0), 0)
lcCodInvalid = ANAF_ValidareCod(m.lcCodFiscal, m.lnTipPersoana)
If !Empty(m.lcCodInvalid)
This.nIdPart = m.lnId
This.oStare = .Null.
This.cCui = ''
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)
This.nIdPart = m.lnId
This.oStare = m.loStare
This.cCui = Iif(Isnull(m.loStare), '', loStare.cCui)
Do Case
Case Isnull(m.loStare)
This.SeteazaLabel('', .F.)
Return .F.
Case !loStare.lDiscordanta
This.SeteazaLabel(This.TextAnaf(m.loStare, .F., 24) + ' (F4 = detalii)', .F.)
Otherwise
This.SeteazaLabel(This.TextAnaf(m.loStare, .F., 24) + ' (F4 = detalii)', .T.)
goLog.Log('Discordanta ANAF: CUI=' + loStare.cCui + ' id_part=' + Transform(m.lnId) + ;
' scpTVA=' + Transform(loStare.lPlatitorANAF) + ' inactivANAF=' + Transform(loStare.lInactivANAF), 'anaf_verif_cautare')
Endcase
Return .T.
ENDPROC
PROCEDURE SeteazaLabel
Lparameters tcText, tlAvertisment
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))
.FontBold = m.tlAvertisment
Endwith
This.oForm.lb_anaf.Refresh()
ENDPROC
PROCEDURE TextStare
Lparameters toStare
Return Iif(toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA') + Iif(toStare.lInactivANAF, ' (inactiv la ANAF)', '')
ENDPROC
PROCEDURE TextAnaf
Lparameters toStare, tlCuVirgula, tnMaxLen
Local lcCodOk, lcDenANAF, lcDenFull
lcCodOk = Iif(toStare.lPlatitorANAF, 'RO', '') + toStare.cCui
lcDenFull = Alltrim(Nvl(toStare.cDenumireANAF, ''))
lcDenANAF = lcDenFull
If Vartype(m.tnMaxLen) = 'N' And m.tnMaxLen > 0 And Len(m.lcDenFull) > m.tnMaxLen
lcDenANAF = Left(m.lcDenFull, m.tnMaxLen) + '...'
Endif
Return 'ANAF: ' + This.TextStare(toStare) + ' (' + ;
Iif(Empty(m.lcDenANAF), '', m.lcDenANAF + Iif(m.tlCuVirgula, ', ', ' ')) + m.lcCodOk + ')' + ;
' la ' + Dtoc(toStare.dData)
ENDPROC
PROCEDURE AntetDialog
Lparameters tcDenAles, tcCodAles
Local lcAntet
lcAntet = Alltrim(m.tcDenAles) + ' (CUI: ' + Alltrim(m.tcCodAles) + ', ID: ' + Transform(This.nIdPart) + ')' + Chr(13) + Chr(13)
If !Isnull(This.oStare)
lcAntet = m.lcAntet + This.TextAnaf(This.oStare, .T.) + Chr(13) + Chr(13)
Endif
Return m.lcAntet
ENDPROC
PROCEDURE ListaCorecti
Lparameters tnCandidati, tnCandidat, tcDenPereche, tlEroare
Local lcCursorP, lcLista, lcCodOk, loCandidat
lcCodOk = Iif(This.oStare.lPlatitorANAF, 'RO', '') + This.cCui
lcLista = ''
tnCandidati = 0
tnCandidat = 0
tcDenPereche = ''
tlEroare = .F.
This.oCandidati = Createobject('Collection')
lcCursorP = Sys(2015)
If ANAF_CautaPereche(This.cCui, m.lcCursorP)
Select (m.lcCursorP)
Scan For Chrtran(Upper(Alltrim(Nvl(cod_fiscal, ''))), ' ', '') == Upper(m.lcCodOk) And id_part <> This.nIdPart
tnCandidati = m.tnCandidati + 1
lcLista = m.lcLista + ' ' + Transform(m.tnCandidati) + '. ' + Alltrim(Nvl(denumire, '')) + ;
' (ID: ' + Transform(id_part) + ')' + Iif(Nvl(inactiv, 0) = 1, ' inactiv', '') + Chr(13)
loCandidat = Createobject('Empty')
Addproperty(loCandidat, 'nIdPart', id_part)
Addproperty(loCandidat, 'cDenumire', Alltrim(Nvl(denumire, '')))
Addproperty(loCandidat, 'lInactiv', Nvl(inactiv, 0) = 1)
Addproperty(loCandidat, 'lAreDocumente', .F.)
This.oCandidati.Add(loCandidat)
If m.tnCandidati = 1
tnCandidat = id_part
tcDenPereche = Alltrim(Nvl(denumire, ''))
Endif
Endscan
Use In (m.lcCursorP)
Else
tlEroare = .T.
Endif
Return m.lcLista
ENDPROC
PROCEDURE MarcheazaDocumente
*** discriminator "are documente in perioada" - un singur SELECT, apelat doar din Detalii
Local lcSirId, lcCursorD, lnI, loCand
If Vartype(This.oCandidati) <> 'O' Or This.oCandidati.Count = 0 Or Type('gnAn') <> 'N' Or Type('gnLuna') <> 'N'
Return
Endif
lcSirId = ''
For lnI = 1 To This.oCandidati.Count
lcSirId = m.lcSirId + Iif(Empty(m.lcSirId), '', ',') + Transform(This.oCandidati.Item(m.lnI).nIdPart)
Endfor
lcCursorD = Sys(2015)
If goExecutor.oExecute([SELECT DISTINCT ID_PART FROM IREG_PARTENERI WHERE AN = ] + Transform(gnAn) + ;
[ AND LUNA = ] + Transform(gnLuna) + [ AND ID_PART IN (] + m.lcSirId + [)], m.lcCursorD) < 0
goLog.Log('MarcheazaDocumente: ' + goExecutor.cEroare, 'anaf_verif_cautare')
If Used(m.lcCursorD)
Use In (m.lcCursorD)
Endif
Return
Endif
Select (m.lcCursorD)
Scan
For lnI = 1 To This.oCandidati.Count
loCand = This.oCandidati.Item(m.lnI)
If loCand.nIdPart = id_part
loCand.lAreDocumente = .T.
Endif
Endfor
Endscan
Use In (m.lcCursorD)
ENDPROC
PROCEDURE TextListaCandidati
Local lcLista, lnI, loCand
lcLista = ''
If Vartype(This.oCandidati) = 'O'
For lnI = 1 To This.oCandidati.Count
loCand = This.oCandidati.Item(m.lnI)
lcLista = m.lcLista + ' ' + Transform(m.lnI) + '. ' + Alltrim(loCand.cDenumire) + ;
' (ID: ' + Transform(loCand.nIdPart) + ')' + Iif(loCand.lInactiv, ' inactiv', '') + ;
Iif(loCand.lAreDocumente, ' are documente in perioada', '') + Chr(13)
Endfor
Endif
Return m.lcLista
ENDPROC
PROCEDURE Detalii
Local lcCursor, lcDenAles, lcCodAles, lcCodOk, lcLista, lcMesaj, lnCandidati, lnCandidat, lcDenPereche
Local lnRasp, lnAles, loAles, llEroare
If Vartype(This.oForm) <> 'O'
Return
Endif
poANAFInlocuire = .Null.
lcCursor = This.oForm.crs_cursor
lcDenAles = Alltrim(Nvl(Evaluate(m.lcCursor + '.denumire'), Nvl(Evaluate(m.lcCursor + '.nume'), '')))
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.', ;
0 + 64, 'Verificare partener ANAF')
Return
Endif
lcCodOk = Iif(This.oStare.lPlatitorANAF, 'RO', '') + This.cCui
lnCandidati = 0
lnCandidat = 0
lcDenPereche = ''
llEroare = .F.
This.ListaCorecti(@lnCandidati, @lnCandidat, @lcDenPereche, @llEroare)
If m.llEroare
Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + 'Nu s-a putut citi lista de parteneri.', ;
0 + 64, 'Verificare partener ANAF')
Return
Endif
If m.lnCandidati = 0
Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + ;
'Nu exista partener cu CUI ' + m.lcCodOk + ' (il puteti crea cu butonul Nou).', 0 + 64, 'Verificare partener ANAF')
Return
Endif
This.MarcheazaDocumente()
lcLista = This.TextListaCandidati()
lcMesaj = This.AntetDialog(m.lcDenAles, m.lcCodAles) + 'Parteneri ROA cu CUI ' + m.lcCodOk + ':' + Chr(13) + m.lcLista + Chr(13) + ;
'Da = Pastreaza selectia' + Chr(13) + ;
Iif(m.lnCandidati = 1, 'Nu = Alege 1 ' + m.lcDenPereche + ' (ID: ' + Transform(m.lnCandidat) + ')', ;
'Nu = Alege din lista (1-' + Transform(m.lnCandidati) + ')') + Chr(13) + ;
'Abandon = Renunta'
Do While .T.
lnRasp = Amessagebox(m.lcMesaj, 3 + 48, 'Verificare partener ANAF')
Do Case
Case m.lnRasp = 7 && Nu - alege alt partener din lista
lnAles = 1
If m.lnCandidati > 1
lnAles = aInputBox('Numarul variantei (1-' + Transform(m.lnCandidati) + ')', 'Verificare ANAF', 1)
If Vartype(m.lnAles) <> 'N' Or m.lnAles < 1 Or m.lnAles > m.lnCandidati
Loop
Endif
Endif
loAles = This.oCandidati.Item(m.lnAles)
poANAFInlocuire = Createobject('Empty')
Addproperty(poANAFInlocuire, 'nIdPart', loAles.nIdPart)
Addproperty(poANAFInlocuire, 'cDenumire', loAles.cDenumire)
Addproperty(poANAFInlocuire, 'cCodFiscal', m.lcCodOk)
goLog.Log('Decizie ANAF (Detalii): ALEGE PERECHEA id_part=' + Transform(loAles.nIdPart), 'anaf_verif_cautare')
This.lDecis = .T.
Exit
Case m.lnRasp = 6 && Da - pastreaza selectia curenta
goLog.Log('Decizie ANAF (Detalii): CONTINUA CU ALEGEREA', 'anaf_verif_cautare')
This.lDecis = .T.
Exit
Otherwise && Abandon - renunta la alegerea unei variante
poANAFInlocuire = .Null.
goLog.Log('Decizie ANAF (Detalii): RENUNTA', 'anaf_verif_cautare')
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
ENDPROC
PROCEDURE VerificaAlegere
Lparameters toForm
Local lcCursor, lcDenAles, lcCodAles, lcCodOk, lnCandidati, lnCandidat, lcDenPereche
Local lcLista, lcMesaj, lnRasp, lnAles, loAles, llEroare, lnIdCurent
If Vartype(This.oForm) <> 'O'
Return .T.
Endif
If This.lDecis
Return .T.
Endif
If This.nNivel < 3
*** nivel 1/2: fara apel ANAF nou - se logheaza doar starea deja cunoscuta din navigarea prin grid
lcCursor = This.oForm.crs_cursor
If Used(m.lcCursor) And Reccount(m.lcCursor) > 0
lnIdCurent = Nvl(Evaluate(m.lcCursor + '.id_part'), 0)
If m.lnIdCurent = This.nIdPart And !Isnull(This.oStare) And This.oStare.lDiscordanta
goLog.Log('Alegere partener discordant ANAF (fara confirmare): CUI=' + This.cCui + ' id_part=' + Transform(This.nIdPart) + ;
' scpTVA=' + Transform(This.oStare.lPlatitorANAF) + ' inactivANAF=' + Transform(This.oStare.lInactivANAF), 'anaf_verif_cautare')
Endif
Endif
Return .T.
Endif
*** nivel 3: comportamentul de azi, neschimbat (verificare sincrona + confirmare)
If !This.VerificaRand(.T.)
Return .T.
Endif
If Isnull(This.oStare) Or !This.oStare.lDiscordanta
Return .T.
Endif
lcCursor = This.oForm.crs_cursor
lcDenAles = Alltrim(Nvl(Evaluate(m.lcCursor + '.denumire'), Nvl(Evaluate(m.lcCursor + '.nume'), '')))
lcCodAles = Alltrim(Nvl(Evaluate(m.lcCursor + '.cod_fiscal'), ''))
lcCodOk = Iif(This.oStare.lPlatitorANAF, 'RO', '') + This.cCui
lnCandidati = 0
lnCandidat = 0
lcDenPereche = ''
llEroare = .F.
lcLista = This.ListaCorecti(@lnCandidati, @lnCandidat, @lcDenPereche, @llEroare)
lcMesaj = This.AntetDialog(m.lcDenAles, m.lcCodAles)
If m.llEroare
lcMesaj = m.lcMesaj + 'Nu s-a putut citi lista de parteneri.' + Chr(13) + Chr(13) + ;
'De acord = Pastreaza selectia' + Chr(13) + ;
'Abandon = Inapoi la cautare'
lnRasp = Amessagebox(m.lcMesaj, 1 + 48, 'Verificare ANAF')
goLog.Log('Decizie ANAF (lista indisponibila): rasp=' + Transform(m.lnRasp), 'anaf_verif_cautare')
Return (m.lnRasp = 1)
Endif
If m.lnCandidati = 0
lcMesaj = m.lcMesaj + 'Nu exista partener cu CUI ' + m.lcCodOk + ' (il puteti crea cu butonul Nou).' + Chr(13) + Chr(13) + ;
'De acord = Pastreaza selectia' + Chr(13) + ;
'Abandon = Inapoi la cautare'
lnRasp = Amessagebox(m.lcMesaj, 1 + 48, 'Verificare ANAF')
goLog.Log('Decizie ANAF (fara pereche): rasp=' + Transform(m.lnRasp), 'anaf_verif_cautare')
Return (m.lnRasp = 1)
Endif
lcMesaj = m.lcMesaj + 'Parteneri ROA cu CUI ' + m.lcCodOk + ':' + Chr(13) + m.lcLista + Chr(13) + ;
'Da = Pastreaza selectia' + Chr(13) + ;
Iif(m.lnCandidati = 1, 'Nu = Alege 1 ' + m.lcDenPereche + ' (ID: ' + Transform(m.lnCandidat) + ')', ;
'Nu = Alege din lista (1-' + Transform(m.lnCandidati) + ')') + Chr(13) + ;
'Abandon = Inapoi la cautare'
Do While .T.
lnRasp = Amessagebox(m.lcMesaj, 3 + 48, 'Verificare ANAF')
Do Case
Case m.lnRasp = 7 && Nu - alternativa cu cod fiscal corect (numarul cerut daca sunt mai multe)
lnAles = 1
If m.lnCandidati > 1
lnAles = aInputBox('Numarul variantei (1-' + Transform(m.lnCandidati) + ')', 'Verificare ANAF', 1)
If Vartype(m.lnAles) <> 'N' Or m.lnAles < 1 Or m.lnAles > m.lnCandidati
Loop
Endif
Endif
loAles = This.oCandidati.Item(m.lnAles)
poANAFInlocuire = Createobject('Empty')
Addproperty(poANAFInlocuire, 'nIdPart', loAles.nIdPart)
Addproperty(poANAFInlocuire, 'cDenumire', loAles.cDenumire)
Addproperty(poANAFInlocuire, 'cCodFiscal', m.lcCodOk)
goLog.Log('Decizie ANAF: ALEGE PERECHEA id_part=' + Transform(loAles.nIdPart), 'anaf_verif_cautare')
Return .T.
Case m.lnRasp = 6 && Da - continua cu selectia curenta
goLog.Log('Decizie ANAF: CONTINUA CU ALEGEREA', 'anaf_verif_cautare')
Return .T.
Otherwise && Abandon - inapoi la cautare
goLog.Log('Decizie ANAF: RAMAI IN CAUTARE', 'anaf_verif_cautare')
Return .F.
Endcase
Enddo
ENDPROC
ENDDEFINE
************************************************************************************************************************
* CautPartenerContabilitate(cTitlu, cTipuriParteneri)
* Date : 04/10/2006
@@ -63,6 +816,7 @@ Procedure CautPartenerContabilitate
Local loHash As MyHash, lcSelect, lcTitlu, lcTipuriParteneri, lnSucces, llAllInList, lnPornire, lcFiltruOrig, lcNumeProcedura, llAdaugCorespondente
Local lVerificaANAF, ldDataDoc, lnNivelANAF
*!* parametrii
lcTitlu = toHash.GetValue("cTitlu")
@@ -73,6 +827,8 @@ Procedure CautPartenerContabilitate
lcFiltruOrig = toHash.GetValue("cFiltruOrig")
llAllInList = toHash.GetValue("lAllInList")
lnPornire = toHash.GetValue("nPornire")
lVerificaANAF = toHash.GetValue("lVerificaANAF")
ldDataDoc = toHash.GetValue("dDataDoc")
*!* parametrii
@@ -93,12 +849,12 @@ Procedure CautPartenerContabilitate
If !Empty(lcTipuriParteneri)
*!* selectia se face din corespondente tipuri partener
lcSelect = [SELECT MIN(CASE WHEN A.ID_TIP_PART in (] + lcTipuriParteneri + [) THEN 0 ELSE 1 END) AS TIP,] + ;
[B.ID_PART, B.DENUMIRE AS NUME, B.COD_FISCAL, B.DENUMIRE ] + ;
[B.ID_PART, B.DENUMIRE AS NUME, B.COD_FISCAL, B.DENUMIRE, B.TIP_PERSOANA ] + ;
[ FROM CORESP_TIP_PART A ] + ;
[ LEFT JOIN NOM_PARTENERI B ON A.ID_PART = B.ID_PART ]
Else
*!* selectia se face din parteneri
lcSelect = [SELECT 0 as TIP, B.ID_PART, B.DENUMIRE AS NUME, B.COD_FISCAL, B.DENUMIRE ] + ;
lcSelect = [SELECT 0 as TIP, B.ID_PART, B.DENUMIRE AS NUME, B.COD_FISCAL, B.DENUMIRE, B.TIP_PERSOANA ] + ;
[ FROM NOM_PARTENERI B ]
Endif
@@ -108,7 +864,7 @@ Procedure CautPartenerContabilitate
.SetValue("cFiltru", "1=2")
.SetValue("cOrder", "1,NUME")
If !Empty(Nvl(lcTipuriParteneri, ''))
.SetValue("cGroup", "B.ID_PART, B.DENUMIRE, B.COD_FISCAL")
.SetValue("cGroup", "B.ID_PART, B.DENUMIRE, B.COD_FISCAL, B.TIP_PERSOANA")
Endif
.SetValue("cColoana", "denumire,cod_fiscal,id_part")
.SetValue("cTitlu", lcTitlu)
@@ -142,8 +898,24 @@ Procedure CautPartenerContabilitate
Endwith
Private poVerifAlegere, poANAFInlocuire
poVerifAlegere = .Null.
poANAFInlocuire = .Null.
If m.lVerificaANAF
lnNivelANAF = ANAF_NivelVerificare()
If m.lnNivelANAF > 0
poVerifAlegere = Createobject('anaf_verif_cautare')
poVerifAlegere.dDataDoc = ANAF_CaData(m.ldDataDoc)
poVerifAlegere.nNivel = m.lnNivelANAF
Endif
Endif
loCauta = cauta_alfa_hash(loHash) && 11.07.2007
If Type('gnbuton') = 'N' And gnbuton = 1
AplicaInlocuirePartenerANAF(loCauta, poANAFInlocuire, lcTipuriParteneri)
Endif
*!* ADAUG TIPURI DE PARTENER - PARTENER DACA NU EXISTA
If llAdaugCorespondente And !Isnull(loCauta) And Type('loCauta.id_part') = 'N' And loCauta.id_part <> 0 And !Empty(lcTipuriParteneri) And loCauta.tip = 1
Do ADAUGA_CORESP_TIP_PART With loCauta.id_part, lcTipuriParteneri In oproceduri_parteneri.prg
@@ -158,14 +930,14 @@ Endproc && CautPartenerContabilitate
* Date : 04/11/2004, 14:01:21
* author : lavinia.viziru
******************************************* INCEPUT:caut_parteneri *******************************************
Procedure caut_parteneri( tcCont, tcTitlu, tlToateIreg, tlNou, tlInactiv)
Procedure caut_parteneri( tcCont, tcTitlu, tlToateIreg, tlNou, tlInactiv, tlVerificaANAF, tdDataDoc)
Local lcCont, loCauta, lcFiltruOriginal
Local lcTitlu, lcFiltru, lcSchema, lcOrder, lcNumeProc, lcTitluColoane
Store "" To loCauta
lcCont = tcCont
llInactiv = m.tlInactiv && daca arat si partenerii inactivi (ex: la fisa de cont, cand un partener s-a unificat, partenerul vechi este inactiv)
lcSelect = [select distinct p.denumire, p.nume, p.cod_fiscal, p.id_part, p.inactiv FROM Vcoresp_tip_part p ] + ;
lcSelect = [select distinct p.denumire, p.nume, p.cod_fiscal, p.id_part, p.inactiv, p.tip_persoana FROM Vcoresp_tip_part p ] + ;
[ join vcoresp_tip_cont c on p.id_tip_part=c.id_tip_part ]
lcFiltru = [1=2]
lcSchema = []
@@ -188,8 +960,26 @@ Procedure caut_parteneri( tcCont, tcTitlu, tlToateIreg, tlNou, tlInactiv)
ENDIF
lcTitluColoane = [Denumire, Nume,Cod fiscal, Id, Inactiv]
Local lnNivelANAF
Private poVerifAlegere, poANAFInlocuire
poVerifAlegere = .Null.
poANAFInlocuire = .Null.
If m.tlVerificaANAF
lnNivelANAF = ANAF_NivelVerificare()
If m.lnNivelANAF > 0
poVerifAlegere = Createobject('anaf_verif_cautare')
poVerifAlegere.dDataDoc = ANAF_CaData(m.tdDataDoc)
poVerifAlegere.nNivel = m.lnNivelANAF
Endif
Endif
loCauta = cauta_alfa(lcSelect, lcFiltru, lcSchema, lcOrder, lccoloane, lcTitlu, lcTitluColoane, lcNumeProc, tlToateIreg, lcFiltruOriginal) && 11.07.2007
If Type('gnbuton') = 'N' And gnbuton = 1
AplicaInlocuirePartenerANAF(loCauta, poANAFInlocuire)
Endif
Return loCauta
Endproc

View File

@@ -55,6 +55,10 @@
*!* marius.mutu
*!* ANAF_SincronWebService_PlatitorTva api v9
*!* 25.07.2026
*!* marius.mutu
*!* NormalizeazaCUI + ANAF_VerificaCuiSingle (verificare la alegerea partenerului, la data documentului)
*!* 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
@@ -1546,6 +1550,123 @@ Define Class VerificareCod As Custom
Endfunc && GetEmptyMfinObj
Enddefine
*************************************
*** Normalizeaza un cod fiscal: UPPER, fara spatii, fara prefixul RO daca restul e numeric
*************************************
Function NormalizeazaCUI
Lparameters tcCui
Local lcCui, lcRest, lnI, llNumeric
lcCui = Upper(Strtran(Alltrim(Nvl(m.tcCui, '')), ' ', ''))
If Left(m.lcCui, 2) = 'RO'
lcRest = Substr(m.lcCui, 3)
llNumeric = !Empty(m.lcRest)
For lnI = 1 To Len(m.lcRest)
If !Isdigit(Substr(m.lcRest, lnI, 1))
llNumeric = .F.
Exit
Endif
Endfor
If m.llNumeric
lcCui = m.lcRest
Endif
Endif
Return m.lcCui
Endfunc && NormalizeazaCUI
*************************************
*** Wrapper single-CUI peste VerificareANAF: tdData = data documentului (lipsa -> data curenta), degradare tacuta (.NULL.)
*************************************
Function ANAF_VerificaCuiSingle
Lparameters tcCui, tdData
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
If Type('gvANAF_EroareLogataSesiune') = 'U'
Public gvANAF_EroareLogataSesiune
gvANAF_EroareLogataSesiune = .F.
Endif
lcCuiNormalizat = NormalizeazaCUI(m.tcCui)
llValid = !Empty(m.lcCuiNormalizat)
If m.llValid
For lnI = 1 To Len(m.lcCuiNormalizat)
If !Isdigit(Substr(m.lcCuiNormalizat, lnI, 1))
llValid = .F.
Exit
Endif
Endfor
Endif
If !m.llValid
Return .Null.
Endif
loResult = .Null.
lcAliasTemp = "crsANAFSingleTemp"
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
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
Endif
Catch To loEx
If !gvANAF_EroareLogataSesiune
If Type('goLog') = 'O'
goLog.Log('ANAF_VerificaCuiSingle: ' + loEx.Message, 'ANAF_VerificaCuiSingle')
Endif
gvANAF_EroareLogataSesiune = .T.
Endif
loResult = .Null.
Endtry
Return m.loResult
Endfunc && ANAF_VerificaCuiSingle
*********************************************
*** Verificare coduri fiscale folosind serviciul web ANAF, cate 500 de coduri per interogare
*********************************************
@@ -1717,7 +1838,6 @@ Define Class VerificareANAF As Custom
goLog.Log('lcJsonString: ' + m.lcJsonString, 'ANAF_SincronWebService_PlatitorTva')
*
SET STEP ON
If Not Empty(m.lcJsonString)
TRY
loJsonObject = nfjsonread(m.lcJsonString) && nfJson from http://vfpx.codeplex.com/