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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
This commit is contained in:
2026-07-28 15:11:56 +03:00
parent 85ad3dea02
commit 248ac0e002

View File

@@ -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