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

12 KiB

Diff pentru aprobare — commit unic: runda 6 (punctul 6) + runda 7 (sincronizare)

Marius a cerut un singur commit, dupa ce sunt gata toate trei lucrarile. Toate trei sunt gata. Acest fisier e inventarul complet al commit-ului. Rationamentul detaliat al punctului 6 (filtrul listei de explicatii TVA, cu cifrele pe date) ramane in docs\diff_r6_punct6.md — nu se repeta aici. Raportul rundei 7, inclusiv raspunsul la intrebarea de fapt, e in docs\raport_r7_sincronizare.md.

Stare verificata inainte de livrare

fisier write-back dovada
COMUN\clase\ofacturare_comun.vc2 facut, binar 19:59 reconversie + diff 0 linii, md5 identic
COMUN\clase\omodificari.vc2 facut, binar 22:20 reconversie + diff 0 linii, md5 d23691466b7017380fe36099943b3208
COMUN\programe\ofacturare_editare.prg n/a (.prg) ASCII curat, CRLF
COMUN\utile\Teste\...\test_s4b_sincronizare.prg n/a (.prg) ASCII curat, LF (ca originalul)

Teste: test_s4b_sincronizare 44 PASS / 0 FAIL, test_s4b_dialog 35 PASS / 0 FAIL, zero erori in loguri. O suita per apel, .fxp sters inainte de fiecare rulare.

Punctul 6 a fost probat pe ecran de Marius, de doua ori.

Rezumat pe fisiere

Repo COMUN:

 clase/ofacturare_comun.vc2                         | 129 +++++++++++++++++++--
 clase/omodificari.vc2                              |  11 --
 programe/ofacturare_editare.prg                    |  21 +++-
 .../editare_factura/test_s4b_sincronizare.prg      |  20 +++-
 4 files changed, 152 insertions(+), 29 deletions(-)

Repo ROAFACTURARE:

  M changelog_roafacturare.txt   (2 randuri noi in :modificare:, blocul 2.11.15)
  M docs/progres.md
  ?? docs/raport_r7_sincronizare.md, docs/brief_r7_sincronizare.md, docs/handoff_r6_r7_sincronizare.md,
     docs/brief_r6_punct6_vfp.md, docs/raport_r6_punct6_vfp.md, docs/diff_r6_punct6.md   (doar git)

1. COMUN\clase\omodificari.vc2 — M1: sincronizarea porneste doar din buton

Se comite ca .vcx + .vct, niciodata .vc2.

@@ -14481,17 +14481,6 @@ DEFINE CLASS frm_modific2024 AS _frmbase OF "_frm_base.vcx"
 			ENDIF
 			SELECT (m.lnAreaTvd)
 		ENDIF
-		*!* al doilea punct de declansare al sincronizarii: enumerarea diferentelor la salvare, cu
-		*!* continuarea salvarii daca utilizatorul renunta - de aceea llRet nu se schimba aici;
-		*!* pe document fara linii active nu porneste: propunerea ar marca toata sursa ca "Adaugare"
-		IF m.llRet AND This.lAreArticoleVanzari AND !This.lArticoleReadOnly AND Used('tvd') AND m.lnLiniiActive > 0
-			LOCAL lcSemnaturaAcum
-			lcSemnaturaAcum = This.SemnaturaDivergenteSincronizare()
-			*!* doar divergentele aparute in sesiunea curenta deschid dialogul; N-A nu intra in semnatura
-			IF !Empty(m.lcSemnaturaAcum) AND !(m.lcSemnaturaAcum == This.cSemnaturaSincronizare)
-				This.AfiseazaDialogSincronizareArticole()
-			ENDIF
-		ENDIF
 		RETURN m.llRet
 		
 		

2. COMUN\programe\ofacturare_editare.prg — M2: pretv si tvav in rulaj

@@ -789,8 +789,9 @@ ENDFUNC && ConstruiestePropunereSincronizare
 *!* Modificare/Adaugare pe tvd nu se aplica, doar cele pe trul, care nu au nevoie de metode de formular)
 *!* reconstruieste propunerea (ConstruiestePropunereSincronizare) si aplica tot ce nu e N-A/Semnalare,
 *!* DOAR in cursoarele din memorie (tvd/trul) - niciun INSERT/UPDATE Oracle; RUL_SURSA scrie in tvd
-*!* (cantitate/pret, pastrand pret_cu_tva existent pe rand), ARTICOLE_SURSA scrie doar cant/pretvtva pe
-*!* randul RUL deja existent (niciodata rand RUL nou - lipsesc contul/gestiunea sigure din articol)
+*!* (cantitate/pret, pastrand pret_cu_tva existent pe rand), ARTICOLE_SURSA scrie cant/pretvtva si
+*!* recalculeaza pretv/tvav pe randul RUL deja existent (niciodata rand RUL nou - lipsesc contul/
+*!* gestiunea sigure din articol)
 *!* retur numeric: cate linii au fost efectiv aplicate (ca apelantul sa poata reface bara de totaluri)
 FUNCTION AplicaSincronizareArticole
 	LPARAMETERS tcDirectie, toForm
@@ -919,12 +920,15 @@ ENDFUNC && AplicaAdaugareTvd
 
 *!* parametri: id_articol, cantitate/pret noi (pret_nou cu TVA)
 *!* scrie in trul (singurul rand activ gasit pe articol - garantat unic, altfel propunerea a marcat N-A)
-*!* doar cant/cante (dupa care din ele era deja folosit pe rand) si pretvtva; nu atinge id_tip_rulaj,
-*!* conturi (scd/scc) sau alte campuri derivate (valoare/tva/etc.) - raman de recalculat de apelant daca e nevoie
+*!* cant/cante (dupa care din ele era deja folosit pe rand), apoi recalculeaza pretv/tvav/pretvtva cu
+*!* formula din calculeaza_valori_rul (ramura pretvtva); nu atinge valorile (valoarev/valtvav/
+*!* valoarevcTVA), id_tip_rulaj, conturi (scd/scc) sau valoare/tva (pretul de achizitie) - raman de
+*!* recalculat de apelant daca e nevoie
 FUNCTION AplicaModificareTrul
 	LPARAMETERS tnIdArticol, tnCantitateNoua, tnPretNouCuTva
 
 	LOCAL lnAreaOrigine, llAplicat, lcCampCant
+	LOCAL lnPretvtva, lnProcTvav, lnTvav, lnPretv
 	lnAreaOrigine = Select()
 	llAplicat = .F.
 
@@ -933,7 +937,14 @@ FUNCTION AplicaModificareTrul
 		LOCATE FOR id_articol = m.tnIdArticol AND Nvl(sters,0) <> 1
 		IF Found()
 			lcCampCant = IIF(Nvl(cant,0) <> 0, 'cant', 'cante')
-			REPLACE (m.lcCampCant) WITH m.tnCantitateNoua, pretvtva WITH m.tnPretNouCuTva IN trul
+			REPLACE (m.lcCampCant) WITH m.tnCantitateNoua IN trul
+
+			lnPretvtva = ROUND(m.tnPretNouCuTva, m.gnPPretv)
+			lnProcTvav = IIF(Empty(proc_tvav), 1, proc_tvav) - 1                        && 1.19 -> 0.19
+			lnTvav = ROUND(m.lnPretvtva * m.lnProcTvav / (1 + m.lnProcTvav), m.gnPPretv)
+			lnPretv = m.lnPretvtva - m.lnTvav
+
+			REPLACE pretv WITH m.lnPretv, pretvtva WITH m.lnPretvtva, tvav WITH m.lnTvav IN trul
 			llAplicat = .T.
 		ENDIF
 	ENDIF

3. COMUN\utile\Teste\editare_factura\test_s4b_sincronizare.prg — fixture + acoperire

Cursorul trul din test nu avea pretv/tvav, iar harness-ul nu definea gnPPretV; fara ele codul nou dadea eroare in test, nu in productie. Cazul C1 1600 adauga TVA 19% real, ca defalcarea sa fie efectiv verificata (toate cazurile existente aveau proc_tvav = 1, deci tvav iesea 0).

@@ -38,6 +38,11 @@ IF Type('gnPC') <> 'N'
 	gnPC = 2
 ENDIF
 
+IF Type('gnPPretV') <> 'N'
+	PUBLIC gnPPretV
+	gnPPretV = 4
+ENDIF
+
 SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE
 
 
@@ -348,22 +353,32 @@ AdaugaTvd(1400, 5, 12, 1, 1, 'ARTICOL 1400', 'COD1400', 60)
 AdaugaTrul(1400, 0, 3, 9, 0, 1, '371', 1)
 *!* 1500: adaugare in ARTICOLE_SURSA (doar in tvd) - nu se aplica niciodata, trul nu primeste rand nou
 AdaugaTvd(1500, 1, 1, 1, 1, 'ARTICOL 1500', 'COD1500', 1)
+*!* 1600: modificare cu TVA 19% - defalcarea pretvtva -> pretv/tvav (238/2 = 119 -> 100 + 19)
+AdaugaTvd(1600, 2, 119, 1, 1, 'ARTICOL 1600', 'COD1600', 238)
+AdaugaTrul(1600, 1, 0, 100, 0, 1, '371', 1.19)
 
 LOCAL lnReccountTrulInainte, lnAplicateC1
 lnReccountTrulInainte = Reccount('trul')
 lnAplicateC1 = AplicaSincronizareArticole('ARTICOLE_SURSA')
-DO asserteaza WITH 'C1 ARTICOLE_SURSA: 2 linii aplicate (modificarile 1300 si 1400; adaugarea 1500 sarita)', lnAplicateC1 == 2, TRANSFORM(lnAplicateC1)
+DO asserteaza WITH 'C1 ARTICOLE_SURSA: 3 linii aplicate (modificarile 1300, 1400 si 1600; adaugarea 1500 sarita)', lnAplicateC1 == 3, TRANSFORM(lnAplicateC1)
 DO asserteaza WITH 'C1: trul nu a crescut (adaugarea 1500 nu creeaza rand RUL nou)', Reccount('trul') == m.lnReccountTrulInainte, TRANSFORM(Reccount('trul'))
 
 SELECT trul
 LOCATE FOR id_articol = 1300
 DO asserteaza WITH 'C1 1300: cant (campul folosit initial) actualizat la 5, pretvtva la 12, id_tip_rulaj neatins', ;
 	Found() AND cant == 5 AND cante == 0 AND pretvtva == 12 AND id_tip_rulaj == 0, TRANSFORM(cant) + '/' + TRANSFORM(cante)
+DO asserteaza WITH 'C1 1300: pretv/tvav recalculate (proc_tvav = 1, deci TVA 0 si pretv = pretvtva)', ;
+	pretv == 12 AND tvav == 0, TRANSFORM(pretv) + '/' + TRANSFORM(tvav)
 
 LOCATE FOR id_articol = 1400
 DO asserteaza WITH 'C1 1400: cante (campul folosit initial) actualizat la 5, cant ramane 0', ;
 	Found() AND cante == 5 AND cant == 0 AND pretvtva == 12, TRANSFORM(cant) + '/' + TRANSFORM(cante)
 
+LOCATE FOR id_articol = 1600
+DO asserteaza WITH 'C1 1600: pretvtva 119 defalcat in pretv 100 + tvav 19, cant actualizat la 2', ;
+	Found() AND cant == 2 AND pretvtva == 119 AND pretv == 100 AND tvav == 19, ;
+	TRANSFORM(pretv) + '/' + TRANSFORM(tvav) + '/' + TRANSFORM(cant)
+
 
 STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), lcLog, 1)
 
@@ -395,7 +410,8 @@ PROCEDURE CreeazaTrulTest
 		Use In trul
 	ENDIF
 	CREATE CURSOR trul (id_articol N(20), denumire C(100), codmat C(30), um C(10), cant N(12,3), cante N(12,3), ;
-		pretvtva N(14,4), id_tip_rulaj I, sters I, id_gestiune I, cont C(20), proc_tvav N(6,4))
+		pretv N(14,4), pretvtva N(14,4), tvav N(14,4), id_tip_rulaj I, sters I, id_gestiune I, cont C(20), ;
+		proc_tvav N(6,4))
 ENDPROC
 
 

4. changelog_roafacturare.txt

@@ -1,5 +1,5 @@
 <!--
-19/08/2026
+20/08/2026
 ROAFACTURARE - 2.11.15
 
 :nou:
@@ -7,11 +7,23 @@ 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.
 
+  Sincronizarea articole - rulaje porneste doar din butonul de pe pagina Articole. Nu mai apare automat la salvarea notei.
+
+  Sincronizarea articole - rulaje completeaza pe randul de rulaj si pretul fara TVA, si TVA-ul unitar - pana acum se actualizau doar cantitatea si pretul cu TVA.
+
+  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.
 

5. COMUN\clase\ofacturare_comun.vc2 — punctul 6

Neschimbat fata de livrarea precedenta, deja aprobata la proba pe ecran. Diff-ul integral si rationamentul filtrului: docs\diff_r6_punct6.md, sectiunile "Filtrul listei de explicatii TVA" si "1. COMUN\clase\ofacturare_comun.vc2".

Ce se comite, in ordine

SVN (sursa de adevar), tintit — pe binare, niciodata pe .vc2/.sc2:

  • COMUN\clase\ofacturare_comun.vcx + .vct
  • COMUN\clase\omodificari.vcx + .vct
  • COMUN\programe\ofacturare_editare.prg
  • COMUN\utile\Teste\editare_factura\test_s4b_sincronizare.prg
  • changelog_roafacturare.txt
  • docs\progres.md

Nu se comit: roafacturare.PJT / .PJX / .exe — apar modificate in svn status, dar vin din sesiunea de VFP a lui Marius, nu din aceasta lucrare.

Imediat dupa svn commit -> roa_sync.bat, apoi se raporteaza revizia SVN si ce a intrat pe main. Fisierele noi din docs\ sunt doar in git.

Ce NU s-a facut, intentionat

  • valoarev/valtvav/valoarevcTVA nu se scriu la sincronizare — perimetru respins explicit de Marius. Consecinta e documentata ca defect in docs\raport_r7_sincronizare.md: VALOAREV si VALTVAV ajung invechite in Oracle, VALOAREVCTVA nu e coloana in RUL si ramane invechit doar pe ecran pana la reincarcarea notei. Decizia de reparare e a lui Marius.
  • SemnaturaDivergenteSincronizare si cSemnaturaSincronizare au ramas fara consumator dupa M1. Semnalate, nesterse, conform deciziei.