From 248ac0e00293ba7df89cfdee07cc36803f17e911 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Tue, 28 Jul 2026 15:11:56 +0300 Subject: [PATCH] Note contabile: avertizare la salvare cand raman facturi cu TVA la incasare neexigibilizat La salvarea notei, VerificaAvertizareExigibilizareTVA (identica in frm_modific2007 si frm_modific2024) verifica incasarile si platile cu factura pereche completata si avertizeaza daca vreuna dintre facturile lor cu TVA la incasare nu are inca nota de TVA exigibilizat. Candidatii sunt exact cele doua tipare pe care do_adauga_tva_exigibil le trateaza automat (id_factd > 0 cu scc pe 5xx, id_factc > 0 cu scd pe 5xx); facturile deja acoperite de o linie tipnota = 1 din nota curenta sunt suprimate. Soldul neexigibil se citeste dintr-un singur SELECT peste VJC2025/VJV2025, filtrat pe perioada curenta si pe toate cele 14 coloane de cota. La "Da" se apeleaza do_adauga_tva_exigibil NEMODIFICAT, marcand temporar `ales` doar pe liniile candidate si restaurandu-l dupa; programul ramane in formular, ca notele adaugate sa poata fi verificate. Orice esec (optiune, cursor, SQL) se logheaza si lasa salvarea sa continue. Se poate opri din settings.ini [tva] avertizare_exigibilizare=0 sau din optiunea RC_TVA_AVERT_EXIGIB. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti --- clase/omodificari.vc2 | 368 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 366 insertions(+), 2 deletions(-) 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