# 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`. ```diff @@ -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 ```diff @@ -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). ```diff @@ -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` ```diff @@ -1,5 +1,5 @@