sync SVN r18238

This commit is contained in:
2026-09-30 22:27:28 +03:00
parent 1a24467667
commit 6f3e25d888
3 changed files with 420 additions and 9 deletions

View File

@@ -11,8 +11,29 @@
*!* Ct_clb_gestiune_init, Ed_tx_simplu1) au trecut in containerul ct_contabilitate al formularului, deci
*!* referintele lor din acest fisier sunt prefixate cu containerul, inclusiv in expresiile Type().
*!* 29.09.2026
*!* marius.mutu
*!* verificare automata ANAF a clientului de pe factura: VerificaANAFAutomat clasifica verdictul (ClasificaRezultat) si il arata pe
*!* butonul But_verifica1 (AplicaIndicatorANAF: OK / ATENTIE / NECUNOSCUT / NEUTRU): textul casetei txtCodFiscal da verdictul (verde OK, rosu ATENTIE, original
*!* altfel), iconita "!!" da sursa (verde/rosu = ANAF sau istoric valabil pentru data facturii, gri = ANAF indisponibil si verdict doar din istoric mai vechi sau fara istoric,
*!* albastra originala = nimic de verificat); cod fiscal romanesc invalid (nenumeric, lungime in afara 2..10, cifra de control gresita) sau CNP invalid = ATENTIE fara apel ANAF;
*!* istoric mai vechi decat factura cu discordanta = ATENTIE cu iconita gri; la deschidere
*!* se citeste intai istoricul, la schimbarea clientului si a datei se interogheaza ANAF; butonul manual verifica la data
*!* facturii si actualizeaza indicatorul din rezultatul lui, fara alte intrebari.
*!* Acelasi indicator si aceiasi declansatori pe dialogul frm_date_factura (lFormVechi);
*!* cautarea inchisa fara alegere pastreaza indicatorul cat timp clientul ramane afisat (NEUTRU doar fara client).
Define Class oAntetFacturare As Custom
lInVerificare = .F.
lVerificaLaActivare = .F.
cCheieVerificata = ''
cStare = 'NEUTRU'
cTooltip = 'Verificare'
oNegasit = .Null.
oTextAnaf = .Null.
lFormVechi = .F.
Function EsteAviz
Return poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie
Endfunc
@@ -150,6 +171,7 @@ Define Class oAntetFacturare As Custom
If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire)
poDate.id_client = loCauta.id_part
poDate.nume_client = loCauta.denumire
poDate.cod_fiscal = Nvl(loCauta.cod_fiscal, '')
If Inlist(poDate.tip,21,28,42,47) && modificare v 2.0.93 : am adaugat 47
lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda(?poDate.id_client,?gnIdSucursala,] + ;
@@ -175,6 +197,7 @@ Define Class oAntetFacturare As Custom
*!* modificare v 2.0.70 ^
toForm.ct_clb_nume_client.Refresh()
toForm.ct_contabilitate.ct_clb_lucrare.SetFocus()
This.VerificaANAFAutomat(m.toForm, .F.)
Else
Local loCauta
loHash = GetHash([cTitlu=>Clienti??cCont=>4111??lAdaugCorespondente=>1??lVerificaANAF=>1])
@@ -218,6 +241,7 @@ Define Class oAntetFacturare As Custom
toForm.ct_contabilitate.ct_clb_lucrare.SetFocus()
toForm.ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText = 'Id client: ' + TRANSFORM(poDate.id_client)
This.VerificaANAFAutomat(m.toForm, .F.)
Else
poDate.listaid = []
poDate.descriere = []
@@ -228,6 +252,7 @@ Define Class oAntetFacturare As Custom
toForm.nSoldLei = 0
toForm.nSoldValuta = 0
toForm.txtSoldLei.Refresh()
This.ReseteazaIndicator(m.toForm)
Endif
*!* modificare v 2.0.70
If Type('toForm.ct_clb_altele.visible')<>'U'
@@ -754,9 +779,11 @@ Define Class oAntetFacturare As Custom
AddProperty(loDate, "denumire", poDate.nume_client)
AddProperty(loDate, "cod_fiscal", poDate.cod_fiscal)
AddProperty(loDate, "data", ANAF_CaData(Iif(Type('poDate.dataact') $ 'DT', poDate.dataact, {})))
AddProperty(loDate, "tip_verificare", "ANAF_SERVICIU_WEB")
lnRaspuns = VerificaCodFiscal(loDate, @lnOptiune, @loPartener)
This.AplicaRezultatButon(m.toForm, m.loPartener)
Endproc
Procedure valideaza_antet
@@ -922,4 +949,366 @@ Define Class oAntetFacturare As Custom
Return .T.
Endfunc
Procedure VerificaANAFAutomat
Lparameters toForm, tlIstoricIntai
Local lcCod, ldData, lcMotiv, lcCheie, loRez, loEx
If This.lInVerificare
Return
Endif
This.lVerificaLaActivare = .F.
This.lInVerificare = .T.
Try
lcCod = This.CodFiscalClient()
ldData = ANAF_CaData(Iif(Type('poDate.dataact') $ 'DT', poDate.dataact, {}))
lcMotiv = This.MotivNeutru(m.lcCod, m.ldData)
lcCheie = Upper(Chrtran(m.lcCod, ' ', '')) + '_' + Dtos(m.ldData)
Do Case
Case !Empty(m.lcMotiv)
This.cCheieVerificata = ''
This.AplicaIndicatorANAF(m.toForm, 'NEUTRU', m.lcMotiv)
Case This.CodInvalid(m.lcCod)
This.cCheieVerificata = ''
This.AplicaIndicatorANAF(m.toForm, 'ATENTIE', 'Cod fiscal invalid: ' + m.lcCod)
Case m.lcCheie == This.cCheieVerificata
&& indicatorul e deja la zi pentru cod si data
Otherwise
This.cCheieVerificata = ''
loRez = This.CalculeazaStare(m.toForm, m.lcCod, m.ldData, m.lcCheie, m.tlIstoricIntai)
This.AplicaIndicatorANAF(m.toForm, loRez.cStare, loRez.cTooltip, loRez.lGri)
This.cCheieVerificata = Iif(loRez.cStare == 'NEUTRU', '', m.lcCheie)
Endcase
Catch To loEx
This.cCheieVerificata = ''
This.AplicaIndicatorANAF(m.toForm, 'NEUTRU', 'Verificare ANAF esuata - apasati pentru verificare manuala')
This.Logheaza('eroare: ' + loEx.Message + ' linia ' + Transform(loEx.LineNo))
Finally
This.lInVerificare = .F.
This.SeteazaCursor(m.toForm, 0)
Endtry
Endproc
Procedure LaSchimbareData
Lparameters toForm
If !This.lVerificaLaActivare
This.VerificaANAFAutomat(m.toForm, .F.)
Endif
Endproc
Procedure ReseteazaIndicator
Lparameters toForm
If Type('poDate.id_client') = 'N' And !Empty(Nvl(poDate.id_client, 0))
Return
Endif
This.cCheieVerificata = ''
This.AplicaIndicatorANAF(m.toForm, 'NEUTRU', 'Verificare')
Endproc
Procedure MarcheazaVerificareLaActivare
If Type('poDate.tip') = 'N' And !Inlist(poDate.tip, 23, 25, 41) And Type('poDate.cod_fiscal') $ 'CX'
poDate.cod_fiscal = This.CodFiscalClient()
Endif
This.lVerificaLaActivare = .T.
Endproc
Function AplicaRezultatButon
Lparameters toForm, toPartener
Local lcCod, ldData, lcCheie, lcCheieSes, loStare, loRez, lcRO
lcCod = This.CodFiscalClient()
ldData = ANAF_CaData(Iif(Type('poDate.dataact') $ 'DT', poDate.dataact, {}))
If !Empty(This.MotivNeutru(m.lcCod, m.ldData)) Or Vartype(m.toPartener) <> 'O' Or !Pemstatus(m.toPartener, 'platitortvamfin', 5) Or !Empty(Nvl(toPartener.eroare, ''))
Return ''
Endif
lcCheie = Upper(Chrtran(m.lcCod, ' ', '')) + '_' + Dtos(m.ldData)
If Empty(Alltrim(Nvl(toPartener.firma, '')))
lcCheieSes = 'C' + NormalizeazaCUI(m.lcCod) + '_' + Dtos(m.ldData)
If Type('goCacheANAF_Sesiune') = 'O' And goCacheANAF_Sesiune.GetKey(m.lcCheieSes) > 0
goCacheANAF_Sesiune.Remove(m.lcCheieSes)
Endif
This.cCheieVerificata = ''
This.VerificaANAFAutomat(m.toForm, .F.)
Return This.cStare
Endif
lcRO = Left(Upper(Alltrim(m.lcCod)), 2) == 'RO'
loStare = Createobject('Empty')
Addproperty(loStare, 'cCui', NormalizeazaCUI(m.lcCod))
Addproperty(loStare, 'lAreRO', m.lcRO)
Addproperty(loStare, 'lPlatitorANAF', toPartener.platitortvamfin)
Addproperty(loStare, 'lInactivANAF', toPartener.inactiv)
Addproperty(loStare, 'cDenumireANAF', Alltrim(toPartener.firma))
Addproperty(loStare, 'lRadiatANAF', .F.)
Addproperty(loStare, 'dRadiereANAF', {})
Addproperty(loStare, 'lDiscordanta', (toPartener.platitortvamfin <> m.lcRO) Or toPartener.inactiv)
Addproperty(loStare, 'dInceputScpTVA', Nvl(toPartener.data_inceput_scptva, {}))
Addproperty(loStare, 'dSfarsitScpTVA', Nvl(toPartener.data_sfarsit_scptva, {}))
Addproperty(loStare, 'dAnulareScpTVA', Nvl(toPartener.data_anul_imp_scptva, {}))
Addproperty(loStare, 'cMesajScpTVA', Alltrim(Nvl(toPartener.stare, '')))
Addproperty(loStare, 'lTvaIncasareANAF', Nvl(toPartener.tvaincasare, .F.))
Addproperty(loStare, 'dInceputTvaInc', Nvl(toPartener.data_inceput_tvainc, {}))
Addproperty(loStare, 'dSfarsitTvaInc', Nvl(toPartener.data_sfarsit_tvainc, {}))
Addproperty(loStare, 'dData', m.ldData)
Addproperty(loStare, 'cSursa', Iif(Empty(Alltrim(Nvl(toPartener.sursa, ''))), 'ANAF', Alltrim(toPartener.sursa)))
Addproperty(loStare, 'dDataSursa', Nvl(toPartener.data_sursa, {}))
loRez = This.ClasificaRezultat(m.loStare, .F., '', m.lcCod, m.ldData)
This.AplicaIndicatorANAF(m.toForm, loRez.cStare, loRez.cTooltip, loRez.lGri)
This.cCheieVerificata = m.lcCheie
Return loRez.cStare
Endfunc
Procedure PuneFiltruCui
Lparameters toHash, tcCui
Local lcFiltru, lnNr
If Empty(m.tcCui) Or !Empty(Chrtran(m.tcCui, '0123456789', ''))
Return
Endif
lcFiltru = "LTRIM(UPPER(B.COD_FISCAL), 'RO ') = '" + m.tcCui + "'"
lnNr = 0
goExecutor.oSelect2Value('select count(*) from nom_parteneri b where b.sters = 0 and b.inactiv = 0 and ' + m.lcFiltru, @lnNr)
If Nvl(m.lnNr, 0) > 1
toHash.SetValue('cFiltruOrig', m.lcFiltru)
Endif
Endproc
Function CalculeazaStare
Lparameters toForm, tcCod, tdData, tcCheie, tlIstoricIntai
Local loStare, llNecesita, llNegasit, lcClasa, loRez, lnT0
If Isnull(This.oNegasit)
This.oNegasit = Createobject('Collection')
Endif
If This.oNegasit.GetKey(m.tcCheie) > 0
Return This.oNegasit.Item(m.tcCheie)
Endif
This.AplicaIndicatorANAF(m.toForm, 'NEUTRU', 'Se verifica la ANAF...')
This.SeteazaCursor(m.toForm, 11)
lnT0 = Seconds()
Store .F. To llNecesita, llNegasit
lcClasa = ''
loStare = ANAF_StarePartener(m.tcCod, m.tdData, .F., @llNecesita, @llNegasit, @lcClasa, 0, m.tlIstoricIntai)
loRez = This.ClasificaRezultat(m.loStare, m.llNegasit, m.lcClasa, m.tcCod, m.tdData)
If m.llNegasit
This.oNegasit.Add(m.loRez, m.tcCheie)
Endif
This.Logheaza('stare=' + loRez.cStare + ' cod=' + m.tcCod + ' data=' + Dtoc(m.tdData) + ;
' sursa=' + Iif(Isnull(m.loStare), '-', loStare.cSursa) + ' data_sursa=' + Iif(Isnull(m.loStare), '-', Dtoc(loStare.dDataSursa)) + ;
' ms=' + Transform(Int((Seconds() - m.lnT0) * 1000)))
Return m.loRez
Endfunc
Function ClasificaRezultat
Lparameters toStare, tlNegasit, tcClasaEsec, tcCod, tdData
Local lcStare, lcTip, llGri, loRez
lcStare = 'NEUTRU'
llGri = .F.
lcTip = 'Verificare'
Do Case
Case Isnull(m.toStare) And m.tlNegasit
lcStare = 'ATENTIE'
lcTip = 'ATENTIE: cod fiscal inexistent la ANAF (' + Alltrim(Iif(Left(Upper(Alltrim(m.tcCod)), 2) == 'RO', Substr(Alltrim(m.tcCod), 3), m.tcCod)) + ') - verificati daca e client strain. Click/Enter = detalii'
Case Isnull(m.toStare)
Do Case
Case Inlist(m.tcClasaEsec, 'FARA_RASPUNS', 'RASPUNS_NEINTELES')
lcStare = 'NECUNOSCUT'
llGri = .T.
lcTip = 'ANAF indisponibil, fara istoric - verificati manual'
Case m.tcClasaEsec == 'CNP'
lcTip = 'Persoana fizica (CNP) - fara verificare ANAF'
Case m.tcClasaEsec == 'COD_NENUMERIC'
lcTip = 'Cod fiscal nenumeric - nu se poate verifica la ANAF'
Case m.tcClasaEsec == 'SE_TESTEAZA'
lcTip = 'Verificarea ANAF se testeaza - reincercati'
Endcase
Case m.toStare.cSursa == 'CACHE_INDISP' And !Empty(m.toStare.dDataSursa) And m.toStare.dDataSursa < m.tdData
llGri = .T.
If m.toStare.lDiscordanta
lcStare = 'ATENTIE'
lcTip = 'ATENTIE: ANAF indisponibil; ultima verificare din ' + Dtoc(m.toStare.dDataSursa) + ', anterioara facturii: ' + ;
This.MotiveDiscordanta(m.toStare) + '. Click/Enter = detalii'
Else
lcStare = 'NECUNOSCUT'
lcTip = 'ANAF indisponibil; ultima verificare din ' + Dtoc(m.toStare.dDataSursa) + ', anterioara facturii: ' + ;
Iif(m.toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA')
Endif
Case m.toStare.lDiscordanta
lcStare = 'ATENTIE'
lcTip = 'ATENTIE: ' + This.MotiveDiscordanta(m.toStare) + '. ' + This.TextAnafStare(m.toStare) + ' Click/Enter = detalii'
Otherwise
lcStare = 'OK'
lcTip = 'OK - ' + This.TextAnafStare(m.toStare) + Iif(m.toStare.cSursa == 'ANAF', '', ' Radierea nu se verifica din istoric.')
Endcase
loRez = Createobject('Empty')
Addproperty(loRez, 'cStare', m.lcStare)
Addproperty(loRez, 'cTooltip', m.lcTip)
Addproperty(loRez, 'lGri', m.llGri)
Return m.loRez
Endfunc
Function MotiveDiscordanta
Lparameters toStare
Local lcMotiv
lcMotiv = ''
If m.toStare.lAreRO And !m.toStare.lPlatitorANAF
lcMotiv = 'cod cu RO, dar ANAF il da neplatitor TVA la data facturii'
Endif
If !m.toStare.lAreRO And m.toStare.lPlatitorANAF
lcMotiv = 'cod fara RO, dar ANAF il da platitor TVA la data facturii'
Endif
If m.toStare.lInactivANAF
lcMotiv = m.lcMotiv + Iif(Empty(m.lcMotiv), '', '; ') + 'client inactiv la ANAF'
Endif
If m.toStare.lRadiatANAF
lcMotiv = m.lcMotiv + Iif(Empty(m.lcMotiv), '', '; ') + 'client radiat la ANAF din ' + Dtoc(m.toStare.dRadiereANAF)
Endif
Return m.lcMotiv
Endfunc
Procedure AplicaIndicatorANAF
Lparameters toForm, tcStare, tcTooltip, tlGri
Local loBtn, lcTip, lcUp, lcDown, lcPic
lcTip = Left(m.tcTooltip, 255)
This.cStare = m.tcStare
This.cTooltip = m.lcTip
This.ColoreazaCodFiscal(m.toForm, m.tcStare)
If Vartype(m.toForm) <> 'O' Or !Pemstatus(m.toForm, 'But_verifica1', 5)
Return
Endif
loBtn = toForm.But_verifica1
If !Pemstatus(m.loBtn, 'cPicOrig', 5)
Addproperty(m.loBtn, 'cPicOrig', m.loBtn.Picture)
Addproperty(m.loBtn, 'cUpOrig', m.loBtn.cpictureup)
Addproperty(m.loBtn, 'cDownOrig', m.loBtn.cpicturedown)
Endif
Do Case
Case m.tcStare == 'NECUNOSCUT' Or (Vartype(m.tlGri) = 'L' And m.tlGri)
lcUp = 'verificare1_gri.bmp'
lcDown = 'verificare2_gri.bmp'
lcPic = m.lcUp
Case m.tcStare == 'OK'
lcUp = 'verificare1_verde.bmp'
lcDown = 'verificare2_verde.bmp'
lcPic = m.lcUp
Case m.tcStare == 'ATENTIE'
lcUp = 'verificare1_rosu.bmp'
lcDown = 'verificare2_rosu.bmp'
lcPic = m.lcUp
Otherwise
lcUp = m.loBtn.cUpOrig
lcDown = m.loBtn.cDownOrig
lcPic = m.loBtn.cPicOrig
Endcase
This.PuneProprietate(m.loBtn, 'cpictureup', m.lcUp)
This.PuneProprietate(m.loBtn, 'cpicturedown', m.lcDown)
This.PuneProprietate(m.loBtn, 'Picture', m.lcPic)
This.PuneProprietate(m.loBtn, 'ToolTipText', m.lcTip)
This.PuneProprietate(m.loBtn, 'StatusBarText', m.lcTip)
If Pemstatus(m.loBtn, 'Refresh', 5)
loBtn.Refresh()
Endif
Endproc
Procedure ColoreazaCodFiscal
Lparameters toForm, tcStare
Local loTxt, lnCuloare
If Vartype(m.toForm) <> 'O' Or !Pemstatus(m.toForm, 'txtCodFiscal', 5)
Return
Endif
loTxt = toForm.txtCodFiscal
If !Pemstatus(m.loTxt, 'ForeColor', 5) Or !Pemstatus(m.loTxt, 'DisabledForeColor', 5)
Return
Endif
If !Pemstatus(m.loTxt, 'nForeOrig', 5)
Addproperty(m.loTxt, 'nForeOrig', m.loTxt.ForeColor)
Addproperty(m.loTxt, 'nDisOrig', m.loTxt.DisabledForeColor)
Endif
Do Case
Case m.tcStare == 'OK'
loTxt.ForeColor = Rgb(0, 110, 0)
loTxt.DisabledForeColor = Rgb(0, 110, 0)
Case m.tcStare == 'ATENTIE'
loTxt.ForeColor = Rgb(192, 0, 0)
loTxt.DisabledForeColor = Rgb(192, 0, 0)
Otherwise
loTxt.ForeColor = m.loTxt.nForeOrig
loTxt.DisabledForeColor = m.loTxt.nDisOrig
Endcase
Endproc
Procedure PuneProprietate
Lparameters toObj, tcNume, tuValoare
If Pemstatus(m.toObj, m.tcNume, 5)
toObj.&tcNume = m.tuValoare
Endif
Endproc
Procedure SeteazaCursor
Lparameters toForm, tnCursor
If Vartype(m.toForm) = 'O' And Pemstatus(m.toForm, 'MousePointer', 5)
toForm.MousePointer = m.tnCursor
Endif
Endproc
Procedure Logheaza
Lparameters tcText
If Type('goLog') = 'O'
goLog.Log(m.tcText, 'anaf_verif_factura')
Endif
Endproc
Function MotivNeutru
Lparameters tcCod, tdData
Do Case
Case !('OCAUTARE' $ Upper(Set('Procedure'))) Or ANAF_NivelVerificare() = 0
Return 'Verificare'
Case Type('poDate.lEditare') = 'L' And poDate.lEditare
Return 'Verificare'
Case Type('poDate.tip') = 'N' And Inlist(poDate.tip, 23, 25, 41)
Return 'Gestiune - fara verificare ANAF'
Case Empty(m.tcCod)
Return 'Verificare'
Case Empty(m.tdData)
Return 'Completati data facturii'
Endcase
Return ''
Endfunc
Function CodInvalid
Lparameters tcCod
Local lcCui
lcCui = NormalizeazaCUI(m.tcCod)
If Empty(m.lcCui)
Return .F.
Endif
If Len(m.lcCui) = 13 And Empty(Chrtran(m.lcCui, '0123456789', ''))
Return !Empty(ANAF_ValidareCod(m.tcCod, 2))
Endif
Return !Empty(ANAF_ValidareCod(m.tcCod, 1)) Or (Len(m.lcCui) < 2 And Empty(Chrtran(m.lcCui, '0123456789', '')))
Endfunc
Function TextAnafStare
Lparameters toStare
If Isnull(This.oTextAnaf)
This.oTextAnaf = Createobject('anaf_verif_cautare')
Endif
Return This.oTextAnaf.TextAnaf(m.toStare, .F., 24)
Endfunc
Function CodFiscalClient
Local lcCod, lnSelect
Private pnIdClientAnaf
lcCod = Iif(Type('poDate.cod_fiscal') $ 'CX', Alltrim(Nvl(poDate.cod_fiscal, '')), '')
If Empty(m.lcCod) And Type('poDate.id_client') = 'N' And Type('goExecutor') = 'O'
pnIdClientAnaf = poDate.id_client
If !Empty(pnIdClientAnaf)
lnSelect = Select()
Use In (Select('crsCodFiscalAnaf'))
If goExecutor.oExecute('select cod_fiscal from nom_parteneri where id_part = ?pnIdClientAnaf', 'crsCodFiscalAnaf') >= 0 And Used('crsCodFiscalAnaf')
lcCod = Alltrim(Nvl(crsCodFiscalAnaf.cod_fiscal, ''))
Endif
Use In (Select('crsCodFiscalAnaf'))
If Used(m.lnSelect)
Select (m.lnSelect)
Endif
Endif
Endif
Return m.lcCod
Endfunc
Enddefine