From d440dd91fcb657de2b6aa0cb8285a7ddbcebd5bc Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Tue, 28 Jul 2026 00:50:11 +0300 Subject: [PATCH] Verificare ANAF: perioada de inregistrare in scopuri de TVA + corectie mesaj fals la CNP/cod invalid L1: perioada de TVA (inceput, sfarsit, anulare din oficiu) si mesajul ANAF integral propagate din cursor pana in banda si in dialogul F4. Banda arata data doar la discordanta, anulare sau perioada incheiata; F4 o arata intotdeauna. L2: clasele de esec CNP si COD_INVALID au text propriu in F4, in loc de mesajul fals 'ANAF nu a raspuns'. Garda Vartype pe parametrul nou tnTipPersoana pentru apelantii cu vechea semnatura (fisier partajat de ROACONT/ROAGEST/ROAFACTURARE). SVN r17910. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti --- programe/ocautare.prg | 82 ++++++++++++++++++++++++++++++++++++------- programe/validare.prg | 23 ++++++++++-- 2 files changed, 91 insertions(+), 14 deletions(-) diff --git a/programe/ocautare.prg b/programe/ocautare.prg index 33585e0..acafaf4 100644 --- a/programe/ocautare.prg +++ b/programe/ocautare.prg @@ -49,11 +49,18 @@ *!* formularului, daca starea serviciului nu e cunoscuta, pleaca o sonda asincrona care stabileste *!* disponibilitatea fara sa blocheze interfata, iar randul curent asteapta rezultatul ei +*!* 27.07.2026 +*!* marius.mutu +*!* verificare ANAF: banda de stare arata si de cand e valabila starea de TVA (data de inceput, +*!* data de incetare sau data anularii din oficiu), doar cand starea difera de ROA, partenerul e +*!* inactiv sau perioada s-a incheiat deja; F4 arata intotdeauna perioada completa si mesajul +*!* primit de la ANAF + *!* #DEFINE CRLF CHR(13) + CHR(10) #INCLUDE COMUN\ROA.H Procedure ANAF_StarePartener - Lparameters tcCodFiscal, tdData, tlDoarCache, tlNecesitaApel, tlNegasit, tcClasaEsec + Lparameters tcCodFiscal, tdData, tlDoarCache, tlNecesitaApel, tlNegasit, tcClasaEsec, tnTipPersoana Local lcCodFiscal, lcCui, loRezANAF, lcCheieCache, lnI, llValid, loOut, ldData, llNegasit, lcStareServiciu @@ -79,7 +86,8 @@ Procedure ANAF_StarePartener Endif Endfor Endif - If m.llValid And Len(m.lcCui) = 13 + If m.llValid And Len(m.lcCui) = 13 And !(Vartype(m.tnTipPersoana) = 'N' And m.tnTipPersoana = 1) + tcClasaEsec = 'CNP' Return .Null. Endif If !m.llValid @@ -141,6 +149,10 @@ Procedure ANAF_StarePartener Addproperty(loOut, "lInactivANAF", loRezANAF.statusInactivi) Addproperty(loOut, "cDenumireANAF", Alltrim(Nvl(loRezANAF.denumire, ''))) Addproperty(loOut, "lDiscordanta", (loRezANAF.scpTVA <> loOut.lAreRO) Or loRezANAF.statusInactivi) + 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, {}), {})) + Addproperty(loOut, "cMesajScpTVA", Iif(Pemstatus(loRezANAF, 'cMesajScpTVA', 5), Alltrim(Nvl(loRezANAF.cMesajScpTVA, '')), '')) Addproperty(loOut, "dData", m.ldData) Return loOut Endproc && ANAF_StarePartener @@ -597,7 +609,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom This.oStare = .Null. This.cCui = '' This.lNegasit = .F. - This.cClasaEsec = '' + This.cClasaEsec = 'COD_INVALID' This.SeteazaLabel(m.lcCodInvalid + ' (F4 = detalii)', .T.) goLog.Log('Cod fiscal invalid: ' + m.lcCodInvalid + ' id_part=' + Transform(m.lnId), 'anaf_verif_cautare') Return .F. @@ -610,7 +622,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom lcClasaEsec = '' This.lVerificareInCurs = .T. Try - loStare = ANAF_StarePartener(m.lcCodFiscal, This.dDataDoc, !m.tlPermiteApel, @llNecesitaApel, @llNegasit, @lcClasaEsec) + loStare = ANAF_StarePartener(m.lcCodFiscal, This.dDataDoc, !m.tlPermiteApel, @llNecesitaApel, @llNegasit, @lcClasaEsec, m.lnTipPersoana) Finally This.lVerificareInCurs = .F. Endtry @@ -645,6 +657,9 @@ DEFINE CLASS anaf_verif_cautare AS Custom 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) And m.lcClasaEsec == 'CNP' + This.SeteazaLabel('Persoana fizica - CNP corect', .F., .T.) + Return .F. Case Isnull(m.loStare) This.AfiseazaPrompt() Return .F. @@ -676,22 +691,61 @@ DEFINE CLASS anaf_verif_cautare AS Custom ENDPROC PROCEDURE TextStare + Lparameters toStare, tcPerioada + Return Iif(toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA') + Nvl(m.tcPerioada, '') + Iif(toStare.lInactivANAF, ', Inactiv', '') + ENDPROC + + PROCEDURE SufixPerioadaTVA Lparameters toStare - Return Iif(toStare.lPlatitorANAF, 'Platitor TVA', 'Neplatitor TVA') + Iif(toStare.lInactivANAF, ', Inactiv', '') + If !(toStare.lDiscordanta Or !Empty(toStare.dAnulareScpTVA) Or (!Empty(toStare.dSfarsitScpTVA) And toStare.dSfarsitScpTVA < Date())) + Return '' + Endif + Do Case + Case !Empty(toStare.dAnulareScpTVA) + Return ', anulat din ' + Dtoc(toStare.dAnulareScpTVA) + Case !Empty(toStare.dSfarsitScpTVA) And !Empty(toStare.dInceputScpTVA) + Return ' ' + Dtoc(toStare.dInceputScpTVA) + ' - ' + Dtoc(toStare.dSfarsitScpTVA) + Case !Empty(toStare.dInceputScpTVA) + Return ' din ' + Dtoc(toStare.dInceputScpTVA) + Endcase + Return '' ENDPROC PROCEDURE TextAnaf Lparameters toStare, tlCuVirgula, tnMaxLen - Local lcCodOk, lcDenANAF, lcDenFull + Local lcCodOk, lcDenANAF, lcDenFull, lcPerioada 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) + ' (' + ; + lcPerioada = This.SufixPerioadaTVA(toStare) + Return 'ANAF: ' + This.TextStare(toStare, m.lcPerioada) + ' (' + ; Iif(Empty(m.lcDenANAF), '', m.lcDenANAF + Iif(m.tlCuVirgula, ', ', ' ')) + m.lcCodOk + ')' + ; - ' la ' + Dtoc(toStare.dData) + Iif(Empty(m.lcPerioada), ' la ' + Dtoc(toStare.dData), '') + ENDPROC + + PROCEDURE TextPerioadaTVA + Lparameters toStare + Local lcTxt + lcTxt = '' + If !Empty(toStare.dInceputScpTVA) + lcTxt = m.lcTxt + 'Inceput inregistrare TVA: ' + Dtoc(toStare.dInceputScpTVA) + Chr(13) + Endif + If !Empty(toStare.dSfarsitScpTVA) + lcTxt = m.lcTxt + 'Sfarsit inregistrare TVA: ' + Dtoc(toStare.dSfarsitScpTVA) + Chr(13) + Endif + If !Empty(toStare.dAnulareScpTVA) + lcTxt = m.lcTxt + 'Anulare din oficiu: ' + Dtoc(toStare.dAnulareScpTVA) + Chr(13) + Endif + If !Empty(toStare.cMesajScpTVA) + lcTxt = m.lcTxt + 'Mesaj ANAF: ' + Alltrim(toStare.cMesajScpTVA) + Chr(13) + Endif + If !Empty(m.lcTxt) + lcTxt = m.lcTxt + Chr(13) + Endif + Return m.lcTxt ENDPROC PROCEDURE AntetDialog @@ -786,7 +840,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom PROCEDURE Detalii Local lcCursor, lcDenAles, lcCodAles, lcCodOk, lcLista, lcMesaj, lnCandidati, lnCandidat, lcDenPereche - Local lnRasp, lnAles, loAles, llEroare + Local lnRasp, lnAles, loAles, llEroare, lcPerioadaTVA If Vartype(This.oForm) <> 'O' Return Endif @@ -800,13 +854,17 @@ DEFINE CLASS anaf_verif_cautare AS Custom 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.')), ; + Iif(This.cClasaEsec == 'CNP', 'Persoana fizica - CNP corect.', ; + Iif(This.cClasaEsec == 'COD_INVALID', 'Cod fiscal invalid - nu s-a interogat ANAF. Corectati codul in fisa partenerului.', ; + 'ANAF nu a raspuns - verificarea a fost sarita.'))))), ; 0 + 64, 'Verificare partener ANAF') Return Endif + lcPerioadaTVA = This.TextPerioadaTVA(This.oStare) + If This.oStare.lAreRO = This.oStare.lPlatitorANAF - Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + ; + Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + m.lcPerioadaTVA + ; Iif(This.oStare.lInactivANAF, 'Nu exista alta varianta de partener de ales.', 'Codul fiscal corespunde.'), ; 0 + 64, 'Verificare partener ANAF') Return @@ -833,7 +891,7 @@ DEFINE CLASS anaf_verif_cautare AS Custom This.MarcheazaDocumente() lcLista = This.TextListaCandidati() - lcMesaj = This.AntetDialog(m.lcDenAles, m.lcCodAles) + 'Parteneri ROA cu CUI ' + m.lcCodOk + ':' + Chr(13) + m.lcLista + Chr(13) + ; + lcMesaj = This.AntetDialog(m.lcDenAles, m.lcCodAles) + m.lcPerioadaTVA + '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) + ; diff --git a/programe/validare.prg b/programe/validare.prg index f6214f4..558d45c 100644 --- a/programe/validare.prg +++ b/programe/validare.prg @@ -67,6 +67,12 @@ *!* sonda asincrona de disponibilitate (ANAF_SondaPorneste/AuSositRaspunsul/AReusit/Opreste) verifica in *!* fundal, la nevoie, daca serviciul ANAF a revenit, fara sa blocheze interfata +*!* 27.07.2026 +*!* marius.mutu +*!* ANAF_VerdictDinCursor expune si perioada de inregistrare in scopuri de TVA (inceput, sfarsit, +*!* anulare din oficiu) si mesajul ANAF integral (mesaj_ScpTVA), citite din cursorul deja parsat de +*!* ParseJsonANAFv8; parsarea esuata a datelor de perioada se logheaza + *!* 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 @@ -1673,6 +1679,10 @@ Function ANAF_VerdictDinCursor Addproperty(loResult, "statusInactivi", Nvl(statusInactivi, .F.)) Addproperty(loResult, "denumire", Nvl(denumire, "")) Addproperty(loResult, "mesaj", Nvl(mesaj, "")) + Addproperty(loResult, "dInceputScpTVA", Nvl(data_inceput_ScpTVA, {})) + Addproperty(loResult, "dSfarsitScpTVA", Nvl(data_sfarsit_ScpTVA, {})) + Addproperty(loResult, "dAnulareScpTVA", Nvl(data_anul_imp_ScpTVA, {})) + Addproperty(loResult, "cMesajScpTVA", Nvl(mesaj_ScpTVA, "")) Else If m.lnReccountTemp = 1 And Empty(denumire) And Nvl(cui, 0) = m.tnCuiCautat tlNegasit = .T. @@ -2062,13 +2072,22 @@ Define Class VerificareANAF As Custom loDate.scpTVA = loInregistrareTVA.scpTVA IF TYPE('loInregistrareTVA.perioade_tva',1) <> "U" - TRY + TRY loDate.data_inceput_ScpTVA = CTOD(loInregistrareTVA.perioade_tva[1].data_inceput_ScpTVA) loDate.data_sfarsit_ScpTVA = CTOD(loInregistrareTVA.perioade_tva[1].data_sfarsit_ScpTVA) loDate.data_anul_imp_ScpTVA = CTOD(loInregistrareTVA.perioade_tva[1].data_anul_imp_ScpTVA) loDate.mesaj_ScpTVA = loInregistrareTVA.perioade_tva[1].mesaj_ScpTVA + IF !Empty(loInregistrareTVA.perioade_tva[1].data_inceput_ScpTVA) And Empty(loDate.data_inceput_ScpTVA) + goLog.Log('ParseJsonANAFv8: data_inceput_ScpTVA neparsabila (' + loInregistrareTVA.perioade_tva[1].data_inceput_ScpTVA + ')', 'ParseJsonANAF') + ENDIF + IF !Empty(loInregistrareTVA.perioade_tva[1].data_sfarsit_ScpTVA) And Empty(loDate.data_sfarsit_ScpTVA) + goLog.Log('ParseJsonANAFv8: data_sfarsit_ScpTVA neparsabila (' + loInregistrareTVA.perioade_tva[1].data_sfarsit_ScpTVA + ')', 'ParseJsonANAF') + ENDIF + IF !Empty(loInregistrareTVA.perioade_tva[1].data_anul_imp_ScpTVA) And Empty(loDate.data_anul_imp_ScpTVA) + goLog.Log('ParseJsonANAFv8: data_anul_imp_ScpTVA neparsabila (' + loInregistrareTVA.perioade_tva[1].data_anul_imp_ScpTVA + ')', 'ParseJsonANAF') + ENDIF CATCH TO loEx - ENDTRY + ENDTRY ENDIF ENDIF