diff --git a/clase/omodificari.vc2 b/clase/omodificari.vc2 index bcd3e73..2b930e6 100644 --- a/clase/omodificari.vc2 +++ b/clase/omodificari.vc2 @@ -2359,11 +2359,13 @@ DEFINE CLASS frm_modific2007 AS _frmbase OF "_frm_base.vcx" *m: salveazaxml *m: updateexplicatiesaft *m: valideaza_data + *m: verificaavertizareexigibilizaretva *p: cacont *p: ccont *p: ccontrol *p: cpaymentcode *p: fel_compensare + *p: lavertizatexigibilizare *p: lmodificare *p: lnotanoua *p: lverificare @@ -2390,6 +2392,7 @@ DEFINE CLASS frm_modific2007 AS _frmbase OF "_frm_base.vcx" DoCreate = .T. FontCharSet = 238 Height = 360 + lavertizatexigibilizare = .F. lmodificare = .F. lnotanoua = .F. lverificare = .F. @@ -5035,7 +5038,10 @@ DEFINE CLASS frm_modific2007 AS _frmbase OF "_frm_base.vcx" "Doriti sa continuati?", 4+32, "Note 4426-4428/4428-4427")=6,.T.,.F.) Endif ENDIF - ENDIF + If m.llRet + llRet = This.VerificaAvertizareExigibilizareTVA() + Endif + ENDIF *!* modificare v 2.4.4 ^ RETURN m.llRet @@ -5409,6 +5415,182 @@ DEFINE CLASS frm_modific2007 AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE VerificaAvertizareExigibilizareTVA + Local llKillSwitch, lcValOpt, lcSql, lcCursor, lnSucces, lnNrFacturi, lcMesaj, lnRasp + Local lnRecno, lnCntSalvat, lnJ + Local Array laAlesOrig(1,2) + + If !(Type('tact.id_factd') = 'N' And Type('tact.id_factc') = 'N' And Type('tact.id_fact') = 'N' And Type('tact.tipnota') = 'N' And Type('tact.ales') = 'L' And Type('tact.scd') = 'C' And Type('tact.scc') = 'C') + Return .T. + Endif + + If This.lAvertizatExigibilizare + Return .T. + Endif + + Try + llKillSwitch = (Alltrim(Nvl(getini(gcGeneralIniFile, 'tva', 'avertizare_exigibilizare'), '')) == '0') + If !llKillSwitch And 'OINIT_OPTIUNI' $ Upper(Set('Procedure')) + lcValOpt = '' + If Used('crsOptiuniUtilizator') + lcValOpt = Alltrim(Nvl(citeste_optiune_utilizator('RC_TVA_AVERT_EXIGIB'), '')) + Endif + If Empty(lcValOpt) And Used('crsOptiuni') + lcValOpt = Alltrim(Nvl(citeste_optiune('RC_TVA_AVERT_EXIGIB'), '')) + Endif + llKillSwitch = (lcValOpt == '0') + Endif + If llKillSwitch + Return .T. + Endif + Catch + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la citirea optiunii, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Return .T. + Endtry + + Try + Select Distinct id_factd As id_fact From tact Where id_factd > 0 And Left(Nvl(scc,''),1) = '5' Into Cursor crsCandidDTVAEx Readwrite + Select Distinct id_factc As id_fact From tact Where id_factc > 0 And Left(Nvl(scd,''),1) = '5' Into Cursor crsCandidCTVAEx Readwrite + Select id_fact From crsCandidDTVAEx Union Select id_fact From crsCandidCTVAEx Into Cursor crsCandidTVAEx Readwrite + Use In crsCandidDTVAEx + Use In crsCandidCTVAEx + Catch + If Used('crsCandidDTVAEx') + Use In crsCandidDTVAEx + Endif + If Used('crsCandidCTVAEx') + Use In crsCandidCTVAEx + Endif + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la colectarea facturilor din nota, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Return .T. + Endtry + + If Reccount('crsCandidTVAEx') = 0 + Use In crsCandidTVAEx + Return .T. + Endif + + Try + Select Distinct id_fact From tact Where tipnota = 1 And id_fact > 0 Into Cursor crsAcopTVAEx Readwrite + Select crsCandidTVAEx.id_fact From crsCandidTVAEx Left Join crsAcopTVAEx On crsCandidTVAEx.id_fact = crsAcopTVAEx.id_fact Where Isnull(crsAcopTVAEx.id_fact) Into Cursor crsNeacopTVAEx Readwrite + Use In crsCandidTVAEx + Use In crsAcopTVAEx + Catch + If Used('crsCandidTVAEx') + Use In crsCandidTVAEx + Endif + If Used('crsAcopTVAEx') + Use In crsAcopTVAEx + Endif + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la suprimarea platilor acoperite, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Return .T. + Endtry + + If Reccount('crsNeacopTVAEx') = 0 + Use In crsNeacopTVAEx + Return .T. + Endif + + If Type('goExecutor') <> 'O' Or goExecutor.nHandle <= 0 + Use In crsNeacopTVAEx + Return .T. + Endif + + lcSql = ; + [SELECT id_fact FROM VJC2025 WHERE an = ] + Transform(gnAn) + [ AND luna = ] + Transform(gnLuna) + ; + [ AND tva_incasare = 1 AND (ro24nb+ro24nt+ro20nb+ro20nt+ro21nb+ro21nt+ro11nb+ro11nt+ro19nb+ro19nt+ro9nb+ro9nt+ro5nb+ro5nt) <> 0] + ; + [ UNION SELECT id_fact FROM VJV2025 WHERE an = ] + Transform(gnAn) + [ AND luna = ] + Transform(gnLuna) + ; + [ AND tva_incasare = 1 AND (ro24nb+ro24nt+ro20nb+ro20nt+ro21nb+ro21nt+ro11nb+ro11nt+ro19nb+ro19nt+ro9nb+ro9nt+ro5nb+ro5nt) <> 0] + lcCursor = Sys(2015) + lnSucces = 0 + Try + lnSucces = goExecutor.oExecute(lcSql, lcCursor, .F., '', 0, .F., .F., .F.) + Catch + lnSucces = -1 + Endtry + + If lnSucces < 0 + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: interogare esuata - ' + Nvl(goExecutor.cEroare,''), 'VerificaAvertizareExigibilizareTVA') + Endif + Use In crsNeacopTVAEx + If Used(lcCursor) + Use In (lcCursor) + Endif + Return .T. + Endif + + Try + Select crsNeacopTVAEx.id_fact From crsNeacopTVAEx Inner Join (lcCursor) tvaex On crsNeacopTVAEx.id_fact = tvaex.id_fact Into Cursor crsFinalTVAEx Readwrite + Catch + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la intersectia locala, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Use In crsNeacopTVAEx + If Used(lcCursor) + Use In (lcCursor) + Endif + Return .T. + Endtry + + Use In crsNeacopTVAEx + If Used(lcCursor) + Use In (lcCursor) + Endif + + lnNrFacturi = Reccount('crsFinalTVAEx') + If lnNrFacturi = 0 + Use In crsFinalTVAEx + Return .T. + Endif + + Index On id_fact Tag id_fact + + lcMesaj = 'Exista ' + Transform(lnNrFacturi) + ' facturi cu TVA la incasare pentru care nu s-a adaugat nota de TVA exigibilizat.' + Chr(13) + Chr(13) + ; + 'Da = adaugati acum notele de TVA exigibilizat si ramaneti in formular, ca sa le verificati.' + Chr(13) + ; + 'Nu = continuati salvarea fara sa adaugati notele.' + Chr(13) + ; + 'Anulare = renuntati, nu salvati.' + lnRasp = Amessagebox(lcMesaj, 3+32, 'TVA la incasare - exigibilizare') + This.lAvertizatExigibilizare = (lnRasp <> 2) + + If lnRasp = 6 + Select tact + lnRecno = Recno() + lnCntSalvat = 0 + Dimension laAlesOrig(Reccount('tact'), 2) + Scan + lnCntSalvat = lnCntSalvat + 1 + laAlesOrig(lnCntSalvat, 1) = Recno() + laAlesOrig(lnCntSalvat, 2) = ales + Replace ales With (id_factd > 0 And Left(Nvl(scc,''),1) = '5' And Seek(id_factd, 'crsFinalTVAEx')) Or (id_factc > 0 And Left(Nvl(scd,''),1) = '5' And Seek(id_factc, 'crsFinalTVAEx')) + Endscan + Thisform.do_adauga_tva_exigibil() + Select tact + For lnJ = 1 To lnCntSalvat + Try + Go laAlesOrig(lnJ, 1) + Replace ales With laAlesOrig(lnJ, 2) + Catch + Endtry + Endfor + Try + Go lnRecno + Catch + Go Top + Endtry + Endif + + Use In crsFinalTVAEx + + Return (lnRasp = 7) + ENDPROC + PROCEDURE cmdSelect.Click Local lnRecno Select tAct @@ -6583,11 +6765,13 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" *m: updateexplicatiesaft *m: updateexplicatiesaftrul *m: valideaza_data + *m: verificaavertizareexigibilizaretva *p: cacont *p: ccont *p: ccontrol *p: cpaymentcode *p: fel_compensare + *p: lavertizatexigibilizare *p: leditare *p: lmodificare *p: lnotanoua @@ -6617,6 +6801,7 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" DoCreate = .T. FontCharSet = 238 Height = 508 + lavertizatexigibilizare = .F. leditare = .F. lmodificare = .F. lnotanoua = .F. @@ -13170,7 +13355,10 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" "Doriti sa continuati?", 4+32, "Note 4426-4428/4428-4427")=6,.T.,.F.) Endif ENDIF - ENDIF + If m.llRet + llRet = This.VerificaAvertizareExigibilizareTVA() + Endif + ENDIF *!* modificare v 2.4.4 ^ RETURN m.llRet @@ -13630,6 +13818,182 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE VerificaAvertizareExigibilizareTVA + Local llKillSwitch, lcValOpt, lcSql, lcCursor, lnSucces, lnNrFacturi, lcMesaj, lnRasp + Local lnRecno, lnCntSalvat, lnJ + Local Array laAlesOrig(1,2) + + If !(Type('tact.id_factd') = 'N' And Type('tact.id_factc') = 'N' And Type('tact.id_fact') = 'N' And Type('tact.tipnota') = 'N' And Type('tact.ales') = 'L' And Type('tact.scd') = 'C' And Type('tact.scc') = 'C') + Return .T. + Endif + + If This.lAvertizatExigibilizare + Return .T. + Endif + + Try + llKillSwitch = (Alltrim(Nvl(getini(gcGeneralIniFile, 'tva', 'avertizare_exigibilizare'), '')) == '0') + If !llKillSwitch And 'OINIT_OPTIUNI' $ Upper(Set('Procedure')) + lcValOpt = '' + If Used('crsOptiuniUtilizator') + lcValOpt = Alltrim(Nvl(citeste_optiune_utilizator('RC_TVA_AVERT_EXIGIB'), '')) + Endif + If Empty(lcValOpt) And Used('crsOptiuni') + lcValOpt = Alltrim(Nvl(citeste_optiune('RC_TVA_AVERT_EXIGIB'), '')) + Endif + llKillSwitch = (lcValOpt == '0') + Endif + If llKillSwitch + Return .T. + Endif + Catch + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la citirea optiunii, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Return .T. + Endtry + + Try + Select Distinct id_factd As id_fact From tact Where id_factd > 0 And Left(Nvl(scc,''),1) = '5' Into Cursor crsCandidDTVAEx Readwrite + Select Distinct id_factc As id_fact From tact Where id_factc > 0 And Left(Nvl(scd,''),1) = '5' Into Cursor crsCandidCTVAEx Readwrite + Select id_fact From crsCandidDTVAEx Union Select id_fact From crsCandidCTVAEx Into Cursor crsCandidTVAEx Readwrite + Use In crsCandidDTVAEx + Use In crsCandidCTVAEx + Catch + If Used('crsCandidDTVAEx') + Use In crsCandidDTVAEx + Endif + If Used('crsCandidCTVAEx') + Use In crsCandidCTVAEx + Endif + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la colectarea facturilor din nota, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Return .T. + Endtry + + If Reccount('crsCandidTVAEx') = 0 + Use In crsCandidTVAEx + Return .T. + Endif + + Try + Select Distinct id_fact From tact Where tipnota = 1 And id_fact > 0 Into Cursor crsAcopTVAEx Readwrite + Select crsCandidTVAEx.id_fact From crsCandidTVAEx Left Join crsAcopTVAEx On crsCandidTVAEx.id_fact = crsAcopTVAEx.id_fact Where Isnull(crsAcopTVAEx.id_fact) Into Cursor crsNeacopTVAEx Readwrite + Use In crsCandidTVAEx + Use In crsAcopTVAEx + Catch + If Used('crsCandidTVAEx') + Use In crsCandidTVAEx + Endif + If Used('crsAcopTVAEx') + Use In crsAcopTVAEx + Endif + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la suprimarea platilor acoperite, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Return .T. + Endtry + + If Reccount('crsNeacopTVAEx') = 0 + Use In crsNeacopTVAEx + Return .T. + Endif + + If Type('goExecutor') <> 'O' Or goExecutor.nHandle <= 0 + Use In crsNeacopTVAEx + Return .T. + Endif + + lcSql = ; + [SELECT id_fact FROM VJC2025 WHERE an = ] + Transform(gnAn) + [ AND luna = ] + Transform(gnLuna) + ; + [ AND tva_incasare = 1 AND (ro24nb+ro24nt+ro20nb+ro20nt+ro21nb+ro21nt+ro11nb+ro11nt+ro19nb+ro19nt+ro9nb+ro9nt+ro5nb+ro5nt) <> 0] + ; + [ UNION SELECT id_fact FROM VJV2025 WHERE an = ] + Transform(gnAn) + [ AND luna = ] + Transform(gnLuna) + ; + [ AND tva_incasare = 1 AND (ro24nb+ro24nt+ro20nb+ro20nt+ro21nb+ro21nt+ro11nb+ro11nt+ro19nb+ro19nt+ro9nb+ro9nt+ro5nb+ro5nt) <> 0] + lcCursor = Sys(2015) + lnSucces = 0 + Try + lnSucces = goExecutor.oExecute(lcSql, lcCursor, .F., '', 0, .F., .F., .F.) + Catch + lnSucces = -1 + Endtry + + If lnSucces < 0 + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: interogare esuata - ' + Nvl(goExecutor.cEroare,''), 'VerificaAvertizareExigibilizareTVA') + Endif + Use In crsNeacopTVAEx + If Used(lcCursor) + Use In (lcCursor) + Endif + Return .T. + Endif + + Try + Select crsNeacopTVAEx.id_fact From crsNeacopTVAEx Inner Join (lcCursor) tvaex On crsNeacopTVAEx.id_fact = tvaex.id_fact Into Cursor crsFinalTVAEx Readwrite + Catch + If Type('goLog') = 'O' + goLog.Log('Avertizare exigibilizare TVA la incasare: eroare la intersectia locala, verificare sarita', 'VerificaAvertizareExigibilizareTVA') + Endif + Use In crsNeacopTVAEx + If Used(lcCursor) + Use In (lcCursor) + Endif + Return .T. + Endtry + + Use In crsNeacopTVAEx + If Used(lcCursor) + Use In (lcCursor) + Endif + + lnNrFacturi = Reccount('crsFinalTVAEx') + If lnNrFacturi = 0 + Use In crsFinalTVAEx + Return .T. + Endif + + Index On id_fact Tag id_fact + + lcMesaj = 'Exista ' + Transform(lnNrFacturi) + ' facturi cu TVA la incasare pentru care nu s-a adaugat nota de TVA exigibilizat.' + Chr(13) + Chr(13) + ; + 'Da = adaugati acum notele de TVA exigibilizat si ramaneti in formular, ca sa le verificati.' + Chr(13) + ; + 'Nu = continuati salvarea fara sa adaugati notele.' + Chr(13) + ; + 'Anulare = renuntati, nu salvati.' + lnRasp = Amessagebox(lcMesaj, 3+32, 'TVA la incasare - exigibilizare') + This.lAvertizatExigibilizare = (lnRasp <> 2) + + If lnRasp = 6 + Select tact + lnRecno = Recno() + lnCntSalvat = 0 + Dimension laAlesOrig(Reccount('tact'), 2) + Scan + lnCntSalvat = lnCntSalvat + 1 + laAlesOrig(lnCntSalvat, 1) = Recno() + laAlesOrig(lnCntSalvat, 2) = ales + Replace ales With (id_factd > 0 And Left(Nvl(scc,''),1) = '5' And Seek(id_factd, 'crsFinalTVAEx')) Or (id_factc > 0 And Left(Nvl(scd,''),1) = '5' And Seek(id_factc, 'crsFinalTVAEx')) + Endscan + Thisform.do_adauga_tva_exigibil() + Select tact + For lnJ = 1 To lnCntSalvat + Try + Go laAlesOrig(lnJ, 1) + Replace ales With laAlesOrig(lnJ, 2) + Catch + Endtry + Endfor + Try + Go lnRecno + Catch + Go Top + Endtry + Endif + + Use In crsFinalTVAEx + + Return (lnRasp = 7) + ENDPROC + PROCEDURE But_modificaR.Click Local lcRul diff --git a/docs/reguli_lucru.md b/docs/reguli_lucru.md index 128f9be..2d19c87 100644 --- a/docs/reguli_lucru.md +++ b/docs/reguli_lucru.md @@ -7,8 +7,11 @@ .gitignore ca `docs/diff_runda*.patch`); raman doar local, pe disc. Curatenie: dupa commit se sterg patch-urile de review si backup-urile de lucru (`*.pre_runda*.bak`). -2. Comentarii in cod: NU se pun comentarii in corpul codului (nici la functionalitati noi). - In ANTETUL fisierului se tine o singura intrare CUMULATIVA per functionalitate, in stilul +2. Comentarii in cod: istoricul modificarilor sta DOAR in ANTETUL fisierului, niciodata inline. + Se aplica la fel in `.prg` si in package-urile/procedurile PL/SQL Oracle. + In corpul codului sunt permise numai comentarii FUNCTIONALE (ce face codul si de ce, acolo + unde nu se vede din cod) - niciodata "am adaugat / am modificat / am sters", data sau autor. + In ANTET se tine o singura intrare CUMULATIVA per functionalitate, scurta si compacta, in stilul existent (`*!* DD.MM.YYYY` / `*!* autor` / `*!* ce face, 1-2 fraze`): la revenirea pe aceeasi lucrare se rescrie intrarea, nu se adauga alta. Autorul e persoana care semneaza livrarea (ex. `marius.mutu`) - niciodata "claude" sau alt nume de agent. diff --git a/docs/sold-neexigibil-reportat-jc2007-jv2007.md b/docs/sold-neexigibil-reportat-jc2007-jv2007.md new file mode 100644 index 0000000..b4a4f15 --- /dev/null +++ b/docs/sold-neexigibil-reportat-jc2007-jv2007.md @@ -0,0 +1,16 @@ +# `jc2007` / `jv2007` — reguli + +Masurat pe date (`MARIUSM_AUTO`, 28.07.2026). + +- **O linie per factura PER PERIOADA**, nu una per factura. Cat timp factura are sold de TVA + neexigibil, randul ei se reporteaza luna de luna cu soldul ramas (masurat: acelasi `id_fact` in + 113-115 perioade). Reportarea e in tabela de baza, nu introdusa de view-uri. +- Deci **orice interogare pe sold neexigibil se filtreaza pe `an`/`luna`**. Soldul lunii curente e + cel la zi; fara filtru intorci si facturi stinse demult. +- Nu cauta si in perioade anterioare "ca sa nu scapi nimic" — o factura din mai apare si pe randul + lunii iulie. Ai dubla randurile. +- `tva_incasare` **nu exista pe tabele**, doar pe view-uri (`VJC2025`/`VJV2025`, `vjc2010`/`vjv2010`). +- Coloanele de sold neexigibil, lista completa: `ro24nb/nt`, `ro20nb/nt`, `ro21nb/nt`, `ro11nb/nt`, + `ro19nb/nt`, `ro9nb/nt`, `ro5nb/nt`. **21% si 11% sunt in vigoare din august 2025** si lipsesc din + filtre mai vechi — verifica lista inainte de a refolosi un filtru existent. +- `vjc2010`/`vjv2010` au si ele coloanele `ro11*`/`ro21*`. diff --git a/programe/import_efactura.prg b/programe/import_efactura.prg index 30e81cc..ce3249f 100644 --- a/programe/import_efactura.prg +++ b/programe/import_efactura.prg @@ -3,6 +3,12 @@ *!* 13.08.2024 *!* vizImportEFactura + discountfaratva +*!* 28.07.2026 +*!* marius.mutu +*!* borderoul eFactura, facturi primite: diferenta ignora TVA-ul de taxare inversa (coloana +*!* jtva_ti din view-ul anaf_vefactura_primit), ca sa nu mai apara colorate fals facturile +*!* cu 4426=4427; degradare automata daca migrarea DB nu a ajuns inca la client + Procedure importEfacturaPrimite DO vizImportEFactura WITH 'PRIMITE' ENDPROC @@ -18,6 +24,7 @@ PROCEDURE vizImportEFactura Private poFacturi, poFacturiDetalii Local loFrmFacturi As "frm_efactura_import", lcTip, llPrimite Local lcData1, lcFiltru, lcFiltruOriginal, lcOrder, lcSchema, lcgroup, llAfiseaza, llModParam + Local lcExprDiferenta, llAreJtvaTi poFacturi = Null poFacturiDetalii = Null @@ -25,7 +32,14 @@ PROCEDURE vizImportEFactura llPrimite = (m.lcTip = 'PRIMITE') lcTabel = IIF(m.lcTip = 'PRIMITE', 'anaf_vefactura_primit', 'anaf_vefactura_trimis') - + + llAreJtvaTi = .F. + IF goExecutor.oExecuta("select column_name from user_tab_columns where table_name = '" + Upper(m.lcTabel) + "' and column_name = 'JTVA_TI'", 'cColoaneJTva') And Used('cColoaneJTva') + llAreJtvaTi = (Reccount('cColoaneJTva') > 0) + Use In (Select('cColoaneJTva')) + ENDIF + lcExprDiferenta = IIF(m.llAreJtvaTi, [NVL(total_cu_tva,0.00) - (NVL(jtotctva,0.00) - NVL(jtva_ti,0.00)) as diferenta], [NVL(total_cu_tva, 0.00)-NVL(jtotctva, 0.00) as diferenta]) + * FACTURI PRIMITE/TRIMISE lcData1 = '01' + Padl(Int(m.gnLuna),2,'0') + Alltrim(Str(m.gnAn)) TEXT To lcSchema Noshow @@ -33,7 +47,7 @@ ales N(1), id N(20), id_fact N(20), data_act D, data_scad D, numar_act C(30), xf ENDTEXT TEXT To lcSelect TEXTMERGE Noshow -SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, NVL(total_cu_tva, 0.00)-NVL(jtotctva, 0.00) as diferenta, procesat, +SELECT 0 as ales, id, id_fact, data_act, data_scad, numar_act, xfurnizor, xclient, partener, id_incarcare, id_descarcare, tip_mesaj_raspuns, mesaj_raspuns, data_raspuns, NVL(trimis,0) as trimis, data_trimis, cod_fiscal, cod_fiscal_emitent, cod_fiscal_beneficiar, '' as detalii, total_fara_tva, total_tva, total_tva_ron, total_cu_tva, discount_fara_tva, taxe_fara_tva, valoare_fara_tva, total_de_plata, nume_valuta, test, jtotctva, descriere, detalii_plata, <>, procesat, '' as SerieActRoa, CAST(null as Number(14)) as NrActRoa, CAST(null as Number(20)) as idPartRoa, '' as PartenerRoa, '' as codFiscalROA, CAST(null as Number(10)) as idValutaROA, '' as numeValutaROA, CAST(null as Number(16,6)) as cursROA, '' as Cont, '' as acont, 0 as TVAIncasare, '' as Fdoc, CAST(0 as Number(5)) as Id_Fdoc, '' as Nrord, CAST(0 as Number(10)) as id_Lucrare, '' as Contract, CAST(null as Number(10)) as id_ctr, '' Sectie, CAST(0 as Number(10)) as id_Sectie, '' as dst_chlt, CAST(0 as Number(10)) as id_Venchelt, '' as nresp, CAST(0 as Number(10)) as id_responsabil, 0 as completat, 0 as completatdet, creditnote, '' as explicatiaROA diff --git a/programe/ocautare.prg b/programe/ocautare.prg index 33585e0..4c904de 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 perioada de inregistrare in scopuri de TVA, cu eticheta +*!* explicita ('inregistrat TVA' / 'cod TVA anulat din'), 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, inclusiv cand nu exista partener cu codul corect + *!* #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 @@ -356,8 +368,10 @@ Procedure ANAF_ComutaVerificare ' 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 Amessagebox(m.lcMesaj + Chr(13) + Chr(13) + 'Modificati valoarea?', 4 + 32, lcEticheta) <> 6 + Return + Endif + lnNou = aInputBox('Valoarea noua (0, 1, 3 sau 9):', m.lcEticheta, Iif(m.lcValIni == '0', 9, m.lnNivel)) If Vartype(m.lnNou) <> 'N' Or !Inlist(m.lnNou, 0, 1, 3, 9) Return Endif @@ -597,7 +611,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 +624,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 +659,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 +693,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 ', cod TVA anulat din ' + Dtoc(toStare.dAnulareScpTVA) + Case !Empty(toStare.dSfarsitScpTVA) And !Empty(toStare.dInceputScpTVA) + Return ', inregistrat TVA ' + Dtoc(toStare.dInceputScpTVA) + ' - ' + Dtoc(toStare.dSfarsitScpTVA) + Case !Empty(toStare.dInceputScpTVA) + Return ', inregistrat TVA 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 +842,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 +856,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 @@ -820,20 +880,20 @@ DEFINE CLASS anaf_verif_cautare AS Custom This.ListaCorecti(@lnCandidati, @lnCandidat, @lcDenPereche, @llEroare) If m.llEroare - Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + 'Nu s-a putut citi lista de parteneri.', ; + Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + m.lcPerioadaTVA + '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) + ; + Amessagebox(This.AntetDialog(m.lcDenAles, m.lcCodAles) + m.lcPerioadaTVA + ; '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) + ; + 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