Files
roafacturare/docs/diff_r6_punct6.md
2026-08-20 22:44:52 +03:00

13 KiB
Raw Blame History

Diff pentru aprobare — runda 6, punctul 6 (partea VFP) + changelog

Stare verificata inainte de livrare:

  • write-back facut; text din arbore vs. text reconvertit din binar: 0 linii diferenta, md5 identic
  • octetul diacritic din lbExplTva.Caption, citit din binar: 0xFE (cp1250, ca restul clasei)
  • 13 octeti >0x7F, zero EF BF BD, CRLF pe toate liniile
  • PACK_FACTURARE cu semnatura noua era deja aplicat pe MARIUSM_AUTO / ROA_CENTRAL
  • proba pe ecran facuta de Marius; a rezultat o corectie de filtru (mai jos)

Filtrul listei de explicatii TVA — verificat pe date

Prima versiune filtra doar id_jtva_coloana > 0 + cota liniei, si arata si liniile de TVA. Interogare read-only pe vjtva_coloane (MARIUSM_AUTO), 197 de randuri cu id > 0:

afisat ce sunt randurile exemplu
0 liniile de TVA TVA LIVR. INTERN 19%
1 bazele cu cota LIVR. INTERN 19%
2 neimpozabile/scutite (cota 0) LIVR. SCUTITE FARA DREPT DE DEDUCERE

Filtrul devine afisat > 0 and jv = 1, acelasi pe care il foloseste emiterea facturii (ofacturare.prg:170, update_jtva_coloane([JV], ...) cu tnTip gol).

jv = 1 nu a fost cerut explicit, dar fara el o factura de vanzare primea si explicatii de achizitie (ACH. INT. 19% BUNURI VANZARE are cota 19, deci garda FACT-029 din PL/SQL le-ar fi acceptat). Numarul de optiuni ramase per cota, pe datele din MARIUSM_AUTO:

cota:      0    5    9   11   19   20   21   24
tot:      24   16   36   22   40   18   22   19
afisat>0: 24    9   19    9   21   10   12   11
+ jv=1:   15    3    3    3    3    3    3    3

Nicio cota nu ramane cu lista goala, deci ramura "lista goala" ramane teoretica, ca la proiectare. Restrictia pe cote_tva de an/luna curenta pe care o adauga update_jtva_coloane nu a fost preluata intentionat: ar goli lista la editarea unei facturi vechi cu cota iesita din uz (24%).

1. COMUN\clase\ofacturare_comun.vc2 (repo COMUN, se comite ca .vcx + .vct)

diff --git a/clase/ofacturare_comun.vc2 b/clase/ofacturare_comun.vc2
index 6f7f325..367fd89 100644
--- a/clase/ofacturare_comun.vc2
+++ b/clase/ofacturare_comun.vc2
@@ -4647,6 +4647,8 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx"
 			Select crsDetalii
 			Scatter Name poRec Memo
 			poRec.explicatie = NVL(poRec.explicatie, ' ')
+			AddProperty(poRec, 'data_act', crsfacturi.data_act)
+			AddProperty(poRec, 'id_part',  Nvl(crsfacturi.id_part, 0))
 			If poRec.sters = 0
 				ofrmmodificare = Createobject("frm_modifica_articol_factura")
 				ofrmmodificare.Show()
@@ -5135,9 +5137,14 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
 	*< OBJECTDATA: ObjPath="Ed_tx_simplu1" UniqueID="" Timestamp="" />
 	*< OBJECTDATA: ObjPath="cbo_saft" UniqueID="" Timestamp="" />
 	*< OBJECTDATA: ObjPath="lbSaft" UniqueID="" Timestamp="" />
+	*< OBJECTDATA: ObjPath="_shape4" UniqueID="" Timestamp="" />
+	*< OBJECTDATA: ObjPath="lbExplTva" UniqueID="" Timestamp="" />
+	*< OBJECTDATA: ObjPath="cbo_expl_tva" UniqueID="" Timestamp="" />
+	*< OBJECTDATA: ObjPath="lbExplTvaInfo" UniqueID="" Timestamp="" />
 
 	*<DefinedPropArrayMethod>
 		*p: nid
+		*p: nidjtvaales
 		*p: ntip_selectie		&& 0 - cautare in toti delegatii; 1 - cautare in delegatii clientului
 		*p: orec
 	*</DefinedPropArrayMethod>
@@ -5145,9 +5152,10 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
 	*<PropValue>
 		BorderStyle = 1
 		DoCreate = .T.
-		Height = 370
+		Height = 431
 		Name = "frm_modifica_articol_factura"
 		nid = .F.
+		nidjtvaales = 0
 		ntip_selectie = 0
 		orec = .F.
 		Width = 376
@@ -5161,17 +5169,17 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
 		_shape2.ZOrderSet = 2
 		Lb_titlu_alb_b121.Caption = "Modific<69> explica<63>ie articol"
 		Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121"
-		Lb_titlu_alb_b121.TabIndex = 5
+		Lb_titlu_alb_b121.TabIndex = 6
 		Lb_titlu_alb_b121.ZOrderSet = 3
 		BUT_TERMIN1.Left = 344
 		BUT_TERMIN1.Name = "BUT_TERMIN1"
-		BUT_TERMIN1.TabIndex = 3
+		BUT_TERMIN1.TabIndex = 4
 		BUT_TERMIN1.Top = 1
 		BUT_TERMIN1.ZOrderSet = 4
 		Gridsort1.Name = "Gridsort1"
 		But_renunt1.Left = 315
 		But_renunt1.Name = "But_renunt1"
-		But_renunt1.TabIndex = 4
+		But_renunt1.TabIndex = 5
 		But_renunt1.Top = 1
 		But_renunt1.ZOrderSet = 6
 	*</PropValue>
@@ -5181,11 +5189,36 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
 		Height = 37, ;
 		Left = 13, ;
 		Name = "_shape3", ;
-		Top = 323, ;
+		Top = 384, ;
 		Width = 348, ;
 		ZOrderSet = 0
 		*< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" />
 
+	ADD OBJECT '_shape4' AS _shape WITH ;
+		BackStyle = 0, ;
+		Height = 58, ;
+		Left = 13, ;
+		Name = "_shape4", ;
+		Top = 323, ;
+		Width = 348, ;
+		ZOrderSet = 10
+		*< END OBJECT: ClassLib="_baza.vcx" BaseClass="shape" />
+
+	ADD OBJECT 'cbo_expl_tva' AS _cbbase WITH ;
+		BoundColumn = 3, ;
+		BoundTo = .T., ;
+		ColumnCount = 2, ;
+		ColumnWidths = "400,60", ;
+		Height = 24, ;
+		Left = 110, ;
+		Name = "cbo_expl_tva", ;
+		RowSourceType = 3, ;
+		TabIndex = 2, ;
+		Top = 329, ;
+		Width = 238, ;
+		ZOrderSet = 12
+		*< END OBJECT: ClassLib="_cb_base.vcx" BaseClass="combobox" />
+
 	ADD OBJECT 'cbo_saft' AS _cbbase WITH ;
 		BoundColumn = 4, ;
 		BoundTo = .T., ;
@@ -5197,8 +5230,8 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
 		Name = "cbo_saft", ;
 		RowSource = "Select taxname, tip, procent_taxa, taxcode From saft_taxtable where tva = 1 order by taxcode Into Cursor crsTaxTableX", ;
 		RowSourceType = 3, ;
-		TabIndex = 2, ;
-		Top = 329, ;
+		TabIndex = 3, ;
+		Top = 390, ;
 		Width = 266, ;
 		ZOrderSet = 8
 		*< END OBJECT: ClassLib="_cb_base.vcx" BaseClass="combobox" />
@@ -5221,20 +5254,54 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
 		_lbbase1.Name = "_lbbase1"
 		*< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" />
 
+	ADD OBJECT 'lbExplTva' AS _label WITH ;
+		Caption = "Explica<63>ie TVA", ;
+		Left = 24, ;
+		Name = "lbExplTva", ;
+		TabIndex = 8, ;
+		Top = 332, ;
+		ZOrderSet = 11
+		*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
+
+	ADD OBJECT 'lbExplTvaInfo' AS _label WITH ;
+		Caption = "", ;
+		ForeColor = RGB(128,0,0), ;
+		Height = 20, ;
+		Left = 24, ;
+		Name = "lbExplTvaInfo", ;
+		Top = 355, ;
+		Visible = .F., ;
+		Width = 324, ;
+		WordWrap = .T., ;
+		ZOrderSet = 13
+		*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
+
 	ADD OBJECT 'lbSaft' AS _label WITH ;
 		Caption = "Cod taxa", ;
 		Left = 24, ;
 		Name = "lbSaft", ;
-		TabIndex = 6, ;
-		Top = 332, ;
+		TabIndex = 7, ;
+		Top = 393, ;
 		ZOrderSet = 9
 		*< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" />
 	
+	PROCEDURE Destroy
+		If Used('crsExplTvaCbo')
+			Use In crsExplTvaCbo
+		Endif
+		If Used('crsExplTvaArt')
+			Use In crsExplTvaArt
+		Endif
+		DoDefault()
+	ENDPROC
+
 	PROCEDURE inainte_de_do_termin
-		Local llReturn
+		Local llReturn, lcParamJtva
 		If amessagebox("Doriti sa salvati modificarile?",4+32,"Confirmare salvare explicatie") = 6
+			lcParamJtva = Iif(Vartype(Thisform.nidjtvaales) = 'N' And Thisform.nidjtvaales > 0, ;
+				Alltrim(Str(Thisform.nidjtvaales)), [null])
 			lcSql = [begin pack_facturare.modifica_explicatie_articol(] + Alltrim(Str(poRec.id_vanzare_det)) + [,] + ;
-				['] + Nvl(Alltrim(OracleSpecialCharacters(poRec.explicatie)),'') + [',?gnIdUtil,?poRec.taxcode); end;]
+				['] + Nvl(Alltrim(OracleSpecialCharacters(poRec.explicatie)),'') + [',?gnIdUtil,?poRec.taxcode,] + lcParamJtva + [); end;]
 			llReturn = goExecutor.oExecuta(lcSql)
 		Else
 			llReturn = .F.
@@ -5258,6 +5325,46 @@ DEFINE CLASS frm_modifica_articol_factura AS frm_termin_renunt OF "_frm_child.vc
 			Endwith
 		Endif
 		
+		Local lnCota, lcSqlTva, lcCursorTva
+		Thisform.nidjtvaales = 0
+		
+		If Isnull(poRec.proc_tvav) Or Nvl(poRec.proc_tvav, 0) = 0
+			Thisform.cbo_expl_tva.Enabled = .F.
+			Thisform.lbExplTvaInfo.Caption = [Cota de TVA a acestei linii nu este cunoscuta; explicatia TVA nu poate fi modificata prin acest buton.]
+			Thisform.lbExplTvaInfo.Visible = .T.
+			Return
+		Endif
+		
+		lnCota = Round((poRec.proc_tvav - 1) * 100, 2)
+		lcCursorTva = [crsExplTvaArt]
+		*!* afisat > 0 = doar bazele, fara liniile de TVA; jv = 1 = doar jurnalul de vanzari
+		lcSqlTva = [select id_jtva_coloana, denumire, cota_tva from vjtva_coloane where id_jtva_coloana > 0 ] + ;
+			[and afisat > 0 and jv = 1 and cota_tva = ] + Alltrim(Str(lnCota, 10, 2)) + [ order by denumire]
+		If goExecutor.oExecuta(lcSqlTva, lcCursorTva) And Reccount(lcCursorTva) > 0
+			Thisform.cbo_expl_tva.RowSource = [select denumire, cota_tva, id_jtva_coloana from ] + lcCursorTva + [ into cursor crsExplTvaCbo]
+			Thisform.cbo_expl_tva.Requery()
+			Thisform.cbo_expl_tva.Value = Nvl(poRec.id_jtva_coloana, 0)
+		Else
+			Thisform.cbo_expl_tva.Enabled = .F.
+			Thisform.lbExplTvaInfo.Caption = [Nu exista nicio explicatie TVA activa cu aceeasi cota ca linia facturata (cota: ] + ;
+				Alltrim(Str(lnCota, 10, 2)) + [ %).]
+			Thisform.lbExplTvaInfo.Visible = .T.
+		Endif
+		
+	ENDPROC
+
+	PROCEDURE cbo_expl_tva.InteractiveChange
+		Local lnIdJtva
+		lnIdJtva = Nvl(This.Value, 0)
+		If lnIdJtva <= 0
+			Return
+		Endif
+		Thisform.nidjtvaales = lnIdJtva
+		poRec.id_jtva_coloana = lnIdJtva
+		If Type('gl406') = 'L' And m.gl406
+			poRec.taxcode = GetTaxCodeIdPart(m.gnAn, m.gnLuna, poRec.data_act, m.lnIdJtva, poRec.id_part)
+			Thisform.cbo_saft.Refresh()
+		Endif
 	ENDPROC
 
 ENDDEFINE

2. changelog_roafacturare.txt (repo ROAFACTURARE)

diff --git a/changelog_roafacturare.txt b/changelog_roafacturare.txt
index ed81ecb..6c0733f 100644
--- a/changelog_roafacturare.txt
+++ b/changelog_roafacturare.txt
@@ -1,5 +1,5 @@
 <!--
-19/08/2026
+20/08/2026
 ROAFACTURARE - 2.11.15
 
 :nou:
@@ -7,11 +7,19 @@ ROAFACTURARE - 2.11.15
 
   Pe linia de articol se poate alege explicatia TVA. Lista propune doar explicatiile cu cota TVA a liniei, iar codul de taxa SAF-T se completeaza automat dupa explicatia aleasa.
 
+  Lista de facturi, butonul de modificare a explicatiei articolului: se poate alege acum si explicatia TVA. Lista propune doar explicatiile cu aceeasi cota de TVA ca linia facturii, iar codul de taxa SAF-T se completeaza automat dupa explicatia aleasa. Valorile facturii raman neschimbate - nu se recalculeaza cota si nici totalurile documentului.
+
 :modificare:
   Totalul notelor din bara de jos se actualizeaza imediat dupa modificarea sumei de pe randul de nota, nu doar la editarea articolelor.
 
   Fereastra de sincronizare articole - rulaje: coloanele arata acum ce valoare se inlocuieste si de unde se preia cea noua, in loc de "vechi" si "nou" explicate separat.
 
+  Editare factura, pagina Articole: seria, lotul si explicatia se tasteaza direct in grid, iar articolul, gestiunea, valuta, explicatia TVA si codul de taxa SAF-T se aleg prin dublu clic pe celula. Culorile arata la ce foloseste fiecare coloana: alb - se tasteaza direct, verde - se alege dintr-o lista, gri - nu se poate edita.
+
+  Editare factura, pagina Articole: pretul si pretul cu TVA se afiseaza cu numarul de zecimale stabilit pentru preturile de vanzare, nu cu cel pentru preturile de achizitie.
+
+  Optiunea de meniu prin care se deschide editarea se numeste acum "Editare factura (note, rulaje, articole)".
+
 :eroare:
   S-a corectat o eroare la descarcarea articolelor importate din eFactura, care aveau pret de achizitie cu 4 zecimale.
 

3. docs\progres.md (repo ROAFACTURARE)

diff --git a/docs/progres.md b/docs/progres.md
index 52c419d..f1805d9 100644
--- a/docs/progres.md
+++ b/docs/progres.md
@@ -2309,5 +2309,20 @@ initial, apoi **respinsa** — nu se reintroduce.
 - `ff_2026_08_20_01` (garda `FACT-025`, runda 5) e **deja aplicat** pe `MARIUSM_AUTO`; scriptul 02 il
   contine. **Nu se re-aplica 01** — ar sterge punctul 6.
 
-Ramase: proba pe ecran a punctelor 1-5, aplicarea scriptului pe `MARIUSM_AUTO`, partea VFP a
-punctului 6, si intrarea de changelog pentru runda 6 (nu exista inca).
+Ramase: partea VFP a punctului 6 si intrarea de changelog pentru runda 6 (nu exista inca).
+
+**Corectie 20.08.2026, seara** — doua puncte din lista de mai sus erau deja facute:
+
+- **Proba pe ecran a punctelor 1-5**: facuta de Marius.
+- **Scriptul `ff_2026_08_20_02_COMUN_PACK_FACTURARE.sql` era deja aplicat** pe schema
+  `MARIUSM_AUTO` de pe `ROA_CENTRAL`, contrar notei de mai sus ("NERULAT"). Dovezi, nu mtime:
+  `VERSIUNE` are randul `20.08.2026 / seq 2 / COMUN_PACK_FACTURARE`; `ALL_OBJECTS` da PACKAGE si
+  PACKAGE BODY **VALID**, `last_ddl_time` 20.08.2026 13:56:38; iar sursa vie din `ALL_SOURCE`
+  (spec + body, normalizata: fara `CREATE OR REPLACE`, fara `/`, fara antetul de comentariu si
+  fara `exec`/`commit`) e **identica cu fisierul de pe disc — 0 linii diferenta pe 16 407**.
+  Deci in Oracle sta varianta **finala** (fara recalcul), nu varianta respinsa, desi fisierul are
+  mtime 15:45, ulterior compilarii de la 13:56.
+  Concluzie de metoda: mtime-ul fisierului si nota "scriptul nu a fost rulat" din raportul de
+  livrare nu sunt surse de stare pentru ce e in Oracle. Starea se citeste din `VERSIUNE` +
+  `ALL_SOURCE`, prin diff, inainte de a re-aplica ceva.
+- Ramane valabila interdictia: **nu se re-aplica `ff_2026_08_20_01`** — ar sterge punctul 6.