Compare commits

...

5 Commits

Author SHA1 Message Date
1d83854f56 Merge claude/anaf-tva-efactura: avertizare exigibilizare TVA, verificare ANAF 2026-07-28 15:12:58 +03:00
ccb8fd2cc6 Verificare ANAF: perioada de TVA spune ce reprezinta; optiunea intreaba inainte sa modifice
SufixPerioadaTVA lipea intervalul direct dupa verdict ("Neplatitor TVA
05/07/2002 - 18/04/2012"), ceea ce se citea ca perioada in care partenerul NU a
fost platitor - exact pe dos. Eticheta spune acum ce reprezinta: "inregistrat TVA
<de la> - <pana la>", respectiv "cod TVA anulat din <data>". Detaliile F4 arata
perioada si in ramurile "Nu exista partener cu CUI ..." si "Nu s-a putut citi
lista de parteneri", unde lipsea - adica tocmai in cazul in care utilizatorul
n-avea de unde sa afle ce inseamna datele din banda de stare.

ANAF_ComutaVerificare afisa un mesaj informativ si apoi cerea neconditionat
valoarea noua, propunand valoarea curenta. Cand verificarea era oprita local din
settings.ini, valoarea propusa era 0, iar un Enter reflex o salva ca optiune de
utilizator - ceea ce transforma tacut o oprire locala in oprire pe orice
calculator. Mesajul intreaba acum Da/Nu si propune 9 (oprire locala) in loc de 0.

reguli_lucru.md pct. 2: istoricul modificarilor sta doar in antetul fisierului,
la fel in .prg si in package-urile/procedurile PL/SQL Oracle; in corpul codului
doar comentarii functionale, niciodata data/autor/"am modificat".

Adaugat docs/sold-neexigibil-reportat-jc2007-jv2007.md: jc2007/jv2007 tin o linie
per factura PER PERIOADA (soldul neexigibil se reporteaza lunar), deci orice
interogare pe sold se filtreaza pe an/luna.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-28 15:12:13 +03:00
248ac0e002 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
2026-07-28 15:11:56 +03:00
85ad3dea02 Borderou eFactura: diferenta ignora TVA-ul de taxare inversa
Expresia diferentei scade jtva_ti din jtotctva pentru facturile primite. Sonda pe user_tab_columns
inainte de construirea SELECT-ului, ca borderoul sa se deschida si daca migrarea DB nu a ajuns inca
la client. lcSchema (schema pozitionala) neatinsa.

SVN r17913; script DB in DATABASE r17912.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-28 08:23:19 +03:00
d440dd91fc 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 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DhJwsrFFe1ZNAAtS8Twuti
2026-07-28 00:50:11 +03:00
6 changed files with 500 additions and 24 deletions

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

View File

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

View File

@@ -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*`.

View File

@@ -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, <<m.lcExprDiferenta>>, 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

View File

@@ -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) + ;

View File

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