sync SVN r18026
This commit is contained in:
250
docs/diff_r6_r7_pentru_commit.md
Normal file
250
docs/diff_r6_r7_pentru_commit.md
Normal file
@@ -0,0 +1,250 @@
|
||||
# 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 @@
|
||||
<!--
|
||||
-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.
|
||||
Reference in New Issue
Block a user