Files
roafacturare/docs/cercetare/rec_s4_runda3c3.md
Marius Mutu d9f5ca4226 docs: planurile, proiectarile si rapoartele de lucru intra in versionare
Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git,
nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de
cercetare pe care se sprijina modificarile din cod. O stergere acolo era
definitiva.

Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au
fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele
fisierelor de test la care se refereau.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
2026-08-11 22:17:17 +03:00

124 lines
5.9 KiB
Markdown

# S4 sub-blocul C — corectie decizii 36 si 37
Runda scurta de corectie peste `ActualizeazaVerdictActRul` (`COMUN\clase\omodificari.vc2:12978`),
livrata si testata in `rec_s4_runda3c2.md`. Doua reguli schimbate, nimic altceva rescris.
## Ce s-a schimbat
### Decizia 36 — suma RUL doar pe `ID_TIP_RULAJ = 0`
Formula veche (`SUM(cant*pretvtva) + SUM(cante*pretvtva WHERE id_tip_rulaj<>3)`) inlocuita cu:
```
SUM (Nvl(cant,0) + Nvl(cante,0)) * Nvl(pretvtva,0) ;
TO lnTotalRul FOR Nvl(sters,0) = 0 AND Nvl(id_tip_rulaj,0) = 0
```
Randurile `ID_TIP_RULAJ = 3` (miscari virtuale de diferenta de pret) nu mai intra deloc in suma —
nicio euristica de excludere pe potrivire de valoare, doar filtrul semantic cerut.
### Decizia 37 — cont de referinta pe rate/contract accepta 4111/411/461
Adaugat un caz nou in `DO CASE` pe `This.nTipVanzare`, pentru tip 2/6/52, care seteaza `lcCont`
la o lista delimitata de conturi in loc de un singur cont; comparatiile `Alltrim(...) == m.lcCont`
au fost inlocuite cu `(','+Alltrim(...)+',') $ m.lcCont` (echivalent cu `INLIST`, dar pastreaza o
singura variabila `lcCont` in loc sa ramifice codul de sumare). Restul tipurilor de document
(avize 461/418, facturi obisnuite) raman pe un singur cont, neschimbate.
## Cod
`COMUN\clase\omodificari.vc2`, metoda `ActualizeazaVerdictActRul` (linii 13004-13039 dupa editare):
```
DO CASE
CASE INLIST(This.nTipVanzare, 28, 29)
lcCont = ',461,'
CASE INLIST(This.nTipVanzare, 21, 22, 24, 26)
lcCont = ',418,'
CASE INLIST(This.nTipVanzare, 2, 6, 52)
lcCont = ',4111,411,461,'
OTHERWISE
lcCont = ',4111,'
ENDCASE
...
SUM (IIF((','+Alltrim(Nvl(scd,''))+',') $ m.lcCont, Nvl(suma,0), ;
IIF((','+Alltrim(Nvl(scc,''))+',') $ m.lcCont AND !INLIST(Alltrim(Nvl(scd,'')), '5311','5314','5121','5125','5126'), -Nvl(suma,0), 0))) ;
TO lnTotalAct FOR Nvl(sters,0) = 0
...
SUM (Nvl(cant,0) + Nvl(cante,0)) * Nvl(pretvtva,0) ;
TO lnTotalRul FOR Nvl(sters,0) = 0 AND Nvl(id_tip_rulaj,0) = 0
```
Diff complet: `docs\diff_s4_runda3c3_decizii_36_37.patch`.
## Test actualizat
`COMUN\utile\Teste\editare_factura\test_verdict_act_rul.prg`:
- Calculul manual (SCAN independent) de Total RUL actualizat la noua formula (doar
`ID_TIP_RULAJ = 0`, `cant+cante`).
- Asertia care astepta "divergent" pe `cod=1140895` a fost **inversata**: acum verifica explicit
`Total ACT == 1924.59`, `Total RUL == 1924.59` si verdict "sincronizat" — nu doar egalitatea
celor doua totaluri (o asertie care ar trece si daca ambele ar cadea pe zero).
- Asertii noi, prin mutatie in memorie pe cursoarele deja incarcate (fara scriere in Oracle):
- un rand `ID_TIP_RULAJ = 3` cu cantitatea marita cu 1000 nu modifica Total RUL;
- un rand `ID_TIP_RULAJ = 0` cu cantitatea marita cu 1 modifica Total RUL cu exact `pretvtva`;
- pe tip=2, contul mutat pe `411` intra in Total ACT (impreuna cu `4111`/`461`);
- pe tip=6, contul mutat pe `461` intra in Total ACT (impreuna cu `4111`/`411`);
- pe tip=1 (fara rata), acelasi rand mutat pe `461` NU mai intra — contul ramane strict `4111`,
verificand ca extinderea nu s-a scapat pe tipurile obisnuite de factura.
Diff complet: `docs\diff_s4_runda3c3_test.patch`.
## Testat
Regresie, headless (`vfp9.exe -A -T`, watchdog, `-AutoDismiss`), exit 0, zero dialoguri, rulata
DUPA ultima editare de cod (verificat pe mtime: binarele si `.prg`-ul de test la `18:34`/`18:39`,
logurile de test la `18:40`-`18:42`):
| Suita | Rezultat | Baseline |
|---|---|---|
| `test_page3_articole.prg` | 14 PASS / 2 FAIL | identic (cele 2 = artefact headless cunoscut, datoria 7) |
| `test_incarca_vanzare_din_nota.prg` | 5 PASS / 0 FAIL | identic |
| `test_adauga_linie_articol.prg` | 20 PASS / 0 FAIL | identic |
| `test_adauga_linie_valuta.prg` | 6 PASS / 0 FAIL | identic |
| `test_ui_sterge_linie.prg` | 8 PASS / 0 FAIL | identic |
| `test_verdict_act_rul.prg` | **26 PASS / 0 FAIL** | (18 inainte de runda; 8 asertii noi) |
Pe documentul de test (`cod=1140895`, descoperit prin `DescoperaCazTest('FACTURA_ARTICOLE', ...)`,
deterministic pe schema `MARIUSM_AUTO`): `Total ACT = 1924.59`, `Total RUL = 1924.59` (dupa
excluderea perechilor `ID_TIP_RULAJ=3`), verdict **sincronizat** — confirma exact cifra ceruta
(`121.00 + 2*121.01 + 1259.07 + 302.50 = 1924.59`).
Zero scrieri in Oracle (doar `SELECT`-uri prin `goExecutor`, mutatii pe cursoare in memorie
READWRITE, restaurate la valorile initiale inainte de QUIT).
## Cens de octeti si write-back
- **Inainte de editare**: `2 aa / 2 e3 / 2 fe`, zero `EF BF BD` (verificat pe backup
`omodificari.vc2.pre_runda3c3.bak`, facut inainte de prima editare).
- **Editarea cu Edit a stricat din nou** cele doua linii cu diacritice ("Renuntare"/"Adaugare"/
"Stergere", liniile 4104 si 8670) — acelasi tipar cunoscut din runda anterioara (`FE E3 AA` ->
3x `EF BF BD`). Reparat byte-cu-byte cu Perl, restaurand exact bytes-urile din backup-ul curat.
- **Dupa reparare**: `2 aa / 2 e3 / 2 fe`, zero `EF BF BD` — identic cu baseline.
- **Write-back**: `txt2vcx.ps1 -AllowComun`, OK din prima rulare. `.vc2`/`.vcx`/`.VCT` sincrone
(acelasi mtime, `18:34`).
## Fisiere atinse
- `COMUN\clase\omodificari.vc2` (+ `.vcx`/`.VCT`, scris in binar) — cele doua reguli din
`ActualizeazaVerdictActRul`.
- `COMUN\utile\Teste\editare_factura\test_verdict_act_rul.prg` — formula RUL actualizata, asertia
inversata pe `cod=1140895`, 8 asertii noi (excludere `ID_TIP_RULAJ=3`, includere
`ID_TIP_RULAJ=0`, cele trei conturi rate/contract).
- Backup: `COMUN\clase\omodificari.vc2.pre_runda3c3.bak`,
`COMUN\utile\Teste\editare_factura\test_verdict_act_rul.prg.pre_runda3c3.bak` (pastrate).
**Fara commit** (nici git, nici SVN). **Zero scrieri in Oracle** in toata sesiunea.
## Nimic ramas nedovedit
Ambele decizii (36 si 37) sunt implementate exact cum au fost formulate si verificate atat prin
recalcul independent (SCAN) cat si prin mutatie directa pe date reale (conturi 411/461 simulate pe
un rand existent, cantitati modificate pe rand `ID_TIP_RULAJ=3`/`=0`) — nu doar pe "zero cazuri in
date".