diff --git a/programe/ocautare.prg b/programe/ocautare.prg index bdf796d..e28db8c 100644 --- a/programe/ocautare.prg +++ b/programe/ocautare.prg @@ -74,14 +74,21 @@ *!* verificarea ANAF se poate cere si la caut_partener (parametri optionali de verificare *!* si de data a documentului), pentru achizitia de import si pentru schimbarea furnizorului pe rulaj +*!* 29.09.2026 +*!* marius.mutu +*!* ANAF_CitesteDinIstoric transmite sursa (CACHE / CACHE_INDISP) la CitesteIstoricPentruCoduri, care aplica +*!* filtrul de data doar pe CACHE; ANAF_StarePartener: parametru optional tlIstoricIntai (istoricul se citeste +*!* intai, indiferent de ordinea configurata) si lRadiatANAF / dRadiereANAF (partener radiat la data ceruta, doar +*!* din verificarea ANAF live) inclus in lDiscordanta si afisat ', Radiat' in banda de stare + *!* #DEFINE CRLF CHR(13) + CHR(10) #INCLUDE COMUN\ROA.H Procedure ANAF_StarePartener - Lparameters tcCodFiscal, tdData, tlDoarCache, tlNecesitaApel, tlNegasit, tcClasaEsec, tnTipPersoana + Lparameters tcCodFiscal, tdData, tlDoarCache, tlNecesitaApel, tlNegasit, tcClasaEsec, tnTipPersoana, tlIstoricIntai Local lcCodFiscal, lcCui, loRezANAF, lcCheieCache, lnI, llValid, loOut, ldData, llNegasit, lcStareServiciu - Local lcOrdine, loVerificareANAF As "VerificareANAF", lcSelectOrig + Local lcOrdine, loVerificareANAF As "VerificareANAF", lcSelectOrig, ldRadiere, llRadiat tlNecesitaApel = .F. tlNegasit = .F. @@ -139,7 +146,7 @@ Procedure ANAF_StarePartener If Select() <> m.lcSelectOrig And Used(m.lcSelectOrig) Select (m.lcSelectOrig) Endif - If m.lcOrdine == 'CACHE,ANAF' + If m.lcOrdine == 'CACHE,ANAF' Or m.tlIstoricIntai loRezANAF = ANAF_CitesteDinIstoric(m.lcCui, m.ldData, 'CACHE') Endif If Vartype(m.loRezANAF) <> 'O' @@ -186,13 +193,17 @@ Procedure ANAF_StarePartener Return .Null. Endif *** verdict + ldRadiere = Iif(!Pemstatus(loRezANAF, 'cSursa', 5) And Pemstatus(loRezANAF, 'dataRadiere', 5), Nvl(loRezANAF.dataRadiere, {}), {}) + llRadiat = !Empty(m.ldRadiere) And m.ldRadiere <= m.ldData 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, "lRadiatANAF", m.llRadiat) + Addproperty(loOut, "dRadiereANAF", m.ldRadiere) + Addproperty(loOut, "lDiscordanta", (loRezANAF.scpTVA <> loOut.lAreRO) Or loRezANAF.statusInactivi Or m.llRadiat) Addproperty(loOut, "dInceputScpTVA", Iif(Pemstatus(loRezANAF, 'dInceputScpTVA', 5), Nvl(loRezANAF.dInceputScpTVA, {}), {})) Addproperty(loOut, "dSfarsitScpTVA", Iif(Pemstatus(loRezANAF, 'dSfarsitScpTVA', 5), Nvl(loRezANAF.dSfarsitScpTVA, {}), {})) Addproperty(loOut, "dAnulareScpTVA", Iif(Pemstatus(loRezANAF, 'dAnulareScpTVA', 5), Nvl(loRezANAF.dAnulareScpTVA, {}), {})) @@ -221,7 +232,7 @@ Procedure ANAF_CitesteDinIstoric Try Use In (Select(m.lcAliasCache)) loVerificareANAF = Createobject("VerificareANAF") - loVerificareANAF.CitesteIstoricPentruCoduri(m.tcCui, m.tdData, m.lcAliasCache) + loVerificareANAF.CitesteIstoricPentruCoduri(m.tcCui, m.tdData, m.lcAliasCache, m.tcSursa) If Used(m.lcAliasCache) And Reccount(m.lcAliasCache) > 0 Select (m.lcAliasCache) Go Top @@ -850,7 +861,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom PROCEDURE TextStare Lparameters toStare, tcPerioada - Return Iif(toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA') + Nvl(m.tcPerioada, '') + Iif(toStare.lInactivANAF, ', Inactiv', '') + Iif(toStare.lTvaIncasareANAF, ', TVA la incasare', '') + Return Iif(toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA') + Nvl(m.tcPerioada, '') + Iif(toStare.lInactivANAF, ', Inactiv', '') + Iif(toStare.lRadiatANAF, ', Radiat', '') + Iif(toStare.lTvaIncasareANAF, ', TVA la incasare', '') ENDPROC PROCEDURE SufixPerioadaTVA @@ -1049,7 +1060,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom If This.oStare.lAreRO = This.oStare.lPlatitorANAF Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + m.lcPerioadaTVA + ; - Iif(This.oStare.lInactivANAF, 'Nu exista alta varianta de partener de ales.', 'Codul fiscal corespunde.'), ; + Iif(This.oStare.lInactivANAF Or This.oStare.lRadiatANAF, 'Nu exista alta varianta de partener de ales.', 'Codul fiscal corespunde.'), ; 0 + 64, 'Verificare partener ANAF') Return Endif diff --git a/programe/ofacturare_antet.prg b/programe/ofacturare_antet.prg index 5e68e8a..37cd9ad 100644 --- a/programe/ofacturare_antet.prg +++ b/programe/ofacturare_antet.prg @@ -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 diff --git a/programe/validare.prg b/programe/validare.prg index 95a1ba9..901ece6 100644 --- a/programe/validare.prg +++ b/programe/validare.prg @@ -109,6 +109,12 @@ *!* elemente "in (...)" da ORA-01795); plasa de siguranta din VerificaListaCIF aduna codurile ramase *!* fara raspuns si cere istoricul intr-un singur apel, in loc de un apel Oracle per cod +*!* 29.09.2026 +*!* marius.mutu +*!* CitesteIstoricPentruCoduri: pe sursa CACHE randul din istoric se accepta doar daca verificarea ANAF e din +*!* ziua datei cerute sau ulterioara (pentru date viitoare, din azi); CACHE_INDISP accepta si verificari mai vechi +*!* ANAF_VerdictDinCursor: obiectul single-CUI poarta si dataRadiere + *!* 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 @@ -1790,6 +1796,7 @@ Function ANAF_VerdictDinCursor Addproperty(loResult, "cui", cui) Addproperty(loResult, "scpTVA", Nvl(scpTVA, .F.)) Addproperty(loResult, "statusInactivi", Nvl(statusInactivi, .F.)) + Addproperty(loResult, "dataRadiere", Nvl(dataRadiere, {})) Addproperty(loResult, "denumire", Nvl(denumire, "")) Addproperty(loResult, "mesaj", Nvl(mesaj, "")) Addproperty(loResult, "dInceputScpTVA", Nvl(data_inceput_ScpTVA, {})) @@ -2908,6 +2915,7 @@ Define Class VerificareANAF As Custom *** in SQL, la tdData, verdictele din intervale (platitor TVA, TVA la incasare, split TVA, inactiv) *** Adauga randurile in tcAlias (cursor in forma crsANAF + sursa/data_sursa), creandu-l daca lipseste *** tcSursa (optional, implicit 'CACHE') eticheteaza randurile inserate - 'CACHE' sau 'CACHE_INDISP' + *** Cu 'CACHE' se accepta doar verificari din ziua tdData sau ulterioare (pentru tdData viitoare, din azi); 'CACHE_INDISP' accepta si verificari mai vechi *** Un rand NU se intoarce cand tdData e inainte de inceputul unui interval cunoscut (scpTVA/TVAINC/ *** inactivare) - ANAF intoarce o singura perioada, nu istoricul complet, deci pentru o data anterioara *** primei perioade memorate cache-ul nu poate afirma "nu era" - codul ramane netratat, merge la ANAF @@ -2916,7 +2924,7 @@ Define Class VerificareANAF As Custom Function CitesteIstoricPentruCoduri Lparameters tcListaCoduriN, tdData, tcAlias, tcSursa - Local lcAlias, lcCursorIstoric, lcSql, ldData, lnZileCache, lcSelect, lcSursa, lcCondCod, lnTotalCod, lnTranse, lnTransa, lnI, lcTransa + Local lcAlias, lcCursorIstoric, lcSql, ldData, lnZileCache, lcSelect, lcSursa, lcCondCod, lnTotalCod, lnTranse, lnTransa, lnI, lcTransa, lcCondCache *!* 30.07.2026 marius.mutu: pdDataCache/pnZileCache Private, nu Local, ca sa fie vizibile in goExecutor.oExecuta la bind Private pdDataCache, pnZileCache lcAlias = Iif(!Empty(m.tcAlias) And Type('tcAlias') = "C", m.tcAlias, "crsANAF") @@ -2960,6 +2968,9 @@ Define Class VerificareANAF As Custom lcCondCod = '(' + m.lcCondCod + ')' Endif + *!* CACHE: verificarea trebuie sa fie din ziua ceruta sau ulterioara + lcCondCache = Iif(m.lcSursa == 'CACHE', ' and trunc(dataorav_anaf) >= least(?pdDataCache, trunc(sysdate))', '') + *!* 01.08.2026 marius.mutu: v_tvainc - margine exclusiva (data_sfarsit_tvainc - 1), aliniata cu pack_roartvai; ground truth rtvai_istoric confirma [inceput,sfarsit) *!* 02.08.2026 marius.mutu: randul curent se alege pe dataorav_anaf desc - dupa fuziunea istoricelor, ID-ul nu mai urmeaza ordinea cronologica TEXT To lcSql TEXTMERGE Noshow @@ -2975,7 +2986,7 @@ select cod_fiscal_n, firma, adresa, judet, regcom, dataorav_anaf, from istoric_coduri_fiscale i where <> and dataorav_anaf is not null - and sysdate - dataorav_anaf <= ?pnZileCache) + and sysdate - dataorav_anaf <= ?pnZileCache<>) where rn = 1 and (data_inceput_scptva is null or ?pdDataCache >= data_inceput_scptva) and (data_inceput_tvainc is null or ?pdDataCache >= data_inceput_tvainc)