Files
roafacturare/docs/cercetare/rec_s4_runda3c2.md
Marius Mutu b5a7108f34 docs: cercetarile comune trec in COMUN, reziduul #6 dispare, progres.md la zi
Curatenie ceruta dupa inchiderea lui #6. Folderul cercetare\ NU se putea sterge
in bloc: plan_13 se sprijina pe el cu 85 de trimiteri, deci e baza de dovezi a
planului aflat in lucru. Impartirea:

- 14 cercetari trans-proiect trec in COMUN\docs\cercetare\ - valuta si curs,
  TVA/VANZARI, consumatorii VANZARI din toata suita, integrarile #10/#11/#12,
  watchdog VFP, proiectarea Oracle a lui S5, view-ul VVANZARI_ARTICOLE. Nu sunt
  ale ROAFACTURARE, iar #10/#11/#12 se reiau chiar din ele.
- 20 de rapoarte de executie ale lui #6, nereferite de nimic viu, sterse.
- 91 raman, neatinse.

Trimiterile catre handoff-urile si diff-urile intermediare deja desfiintate au
fost curatate peste tot (39 de fisiere): 50 catre handoff-uri, 37 catre diff-uri
aplicate, plus caile celor mutate in COMUN. Zero trimiteri rupte ramase.

progres.md preia rolul de predare: ce ramane din #6 (cele sase documente
parazite, cele doua esecuri reale din S8 pe factura din aviz), cifrele de test
citite din log, si cele doua capcane de mediu platite - .FXP vechi executat in
locul .prg-ului, si GETFONT() care atarna un formular instantiat fara goApp.

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

163 lines
11 KiB
Markdown

# S4 runda 3, sub-blocul C — verdictul de corelatie ACT/RUL (partea 2)
Livrat: doua randuri de control (`Total ACT`, `Total RUL`) plus un indicator informativ cu 3 stari
(sincronizat / divergent / nu se aplica), pe `pgfArticole.PAGE3` din `frm_modific2024`
(`COMUN\clase\omodificari.vc2`). Formulele erau deja stabilite si verificate in
`docs\cercetare\rec_suma_act.md` — s-au aplicat direct, fara recercetare.
## Ce s-a implementat
`COMUN\clase\omodificari.vc2`, clasa `frm_modific2024`:
- **Metoda noua `ActualizeazaVerdictActRul`** (apelata din `ActualizeazaBaraTotaluri`, in acelasi
punct in care se recalculeaza azi bara — `Show()`, `calculeaza_valori_articol()`,
`cmdStergeArticol.Click`, `txtDiscountArt.Valid`):
- **Total ACT**: sold net debit-credit pe cursorul `tact` deja incarcat, filtrat `sters=0`
(`tact` e deja filtrat `cod+an+luna` de `IncarcaCursoareModificareNota` — nicio interogare noua).
Contul de referinta se alege pe grupa de tip: `461` pentru avize catre clienti debitori (28,29),
`418` pentru restul avizelor (21,22,24,26), `4111` pentru restul (facturi, factura din aviz,
rate/contract, ROAACNPRO) — simplificare fata de tabelul complet din `rec_suma_act.md` (acolo
contul pentru rate/contract vine teoretic din `NOTE_CONTABILE`, dar cercetarea a confirmat empiric
ca iese mereu `4111`; a deschide o interogare noua doar pentru acest caz ar fi contrazis principiul
"nu deschide interogare noua daca sumele se pot calcula din cursoarele deja deschise").
- **Total RUL**: `SUM(cant*pretvtva) + SUM(cante*pretvtva WHERE id_tip_rulaj<>3)` pe `trul` (deja
incarcat), corectat cu valoarea liniilor nestocate din `tvd` (`in_stoc=0`), convertita in RON la
cursul documentului (acelasi `curs`/`multiplicator` ca restul barei, decizia 33). Eticheta
randului devine "Total RUL (ajustat):" cand corectia s-a aplicat efectiv (corectie <> 0).
- **Indicator informativ, 3 stari**: "sincronizat" (`|ACT-RUL| <= 0.02`), "divergent (informativ,
nu e eroare)" (peste toleranta), sau "nu se aplica (informativ, date de import)" — fortat pe
tipul 51 (ROAACNPRO), unde cercetarea a stabilit ca divergenta nu e de formula, ci de calitatea
datelor de import (`rec_suma_act.md`, sectiunea D). Toleranta de 0.02 acopera rotunjirile de genul
celei documentate pe `cod=1138989` (0.01 lei).
- **Ascundere pe tipurile fara suma comparabila** (23,25,27,30,41,42,47, decizia 22): cele 5
controale noi se ascund odata cu restul barei, pe acelasi flag `!llAscunde` transmis ca parametru
— nu se dubleaza lista de tipuri in doua locuri.
- **8 controale existente + 5 noi** pe `PAGE3`: `lblTotalActArt`/`txtTotalActArt`,
`lblTotalRulArt`/`txtTotalRulArt` (Top=132/136, al doilea rand sub bara existenta), si
`lblVerdictArt` (text + culoare setate direct in cod, dupa modelul `Visible`-urilor existente —
`Label` nu suporta `ControlSource` pentru `Caption`).
- **Randul 2 a cerut spatiu vertical nou**: `pgfArticole.Height` 142->164, `frm_modific2024.Height`
508->530 (+22px, acelasi delta pe ambele, ca pageframe-ul sa nu depaseasca formularul), si cele 4
butoane din coloana din dreapta (`But_copiazaR`, `But_modificaR`, `But_stergeR`,
`but_afiseaza_rulaje`) mutate cu acelasi +22px, ca sa ramana la aceeasi distanta vizuala fata de
cadrul `pgfArticole` (`Anchor=12`, bottom+right, dar editarea e statica — anchor-ul VFP nu
recalculeaza pozitia la o simpla schimbare de `Height` in clasa, doar la un resize la runtime).
Verificat pe cod ca nimic altceva nu depinde de valorile vechi (`resize_grid1` foloseste `284`
fix cand `pgfArticole` e vizibil, si `This.Height - 100` cand e ascuns — ambele raman corecte,
a doua chiar beneficiaza de cei 22px in plus). Grid-ul `grdArticoleFactura` (Height=81) **nu s-a
atins** — 0 linii pierdute, la fel ca la partea 1.
`COMUN\programe\ofacturare_editare.prg`:
- `tvd` capata coloana noua `in_stoc I NULL`, in ambele locuri unde structura cursorului se repeta
(`CreeazaCursorArticoleGol` si `Load()` ramura `ELSE` din `omodificari.vc2`).
- `IncarcaArticoleFactura` extinde interogarea existenta (nu adauga una noua) cu
`left join nom_articole na on na.id_articol = v.id_articol`, proiectand `na.in_stoc` — view-ul
`VVANZARI_ARTICOLE` nu expune `IN_STOC` (verificat pe cod, confirmat pe date printr-un probe live).
## Verificat pe cod / pe date, nu presupus
- **Coloanele reale ale `tact`/`trul`/`tvd`** au fost verificate live pe schema (`MARIUSM_AUTO`,
document `cod=1140895/an=2026/luna=8`, tip=1) inainte de a scrie codul: `tact` are
`SCD/ASCD/SCC/ASCC/SUMA/STERS/AN/LUNA/COD`, `trul` are `CANT/CANTE/PRETVTVA/ID_TIP_RULAJ/STERS`,
ambele exact ca in `rec_suma_act.md`. Scriptul de probe (`test_probe_columns.prg`) a fost sters
dupa verificare — nu face parte din suita permanenta.
- **Comparatia de cont foloseste `==` pe `Alltrim()`**, nu `=` simplu — VFP cu `SET EXACT OFF`
(implicit) ar fi potrivit `'411'` ca prefix al lui `'4111'` cu un `=` simplu, exact capcana
semnalata in cercetare ("411 vs 4111").
## Descoperire pe parcurs: randuri RUL "duplicat" schimba verdictul pe documentul de test
Documentul folosit pentru testul dedicat (`cod=1140895`, descoperit prin `DescoperaCazTest`) are
exact tiparul semnalat ca intrebare deschisa in `rec_suma_act.md` sectiunea F punctul 3: perechi
`ID_TIP_RULAJ=3` (diferenta de pret) insotite de randuri `ID_TIP_RULAJ=0` cu **aceeasi
cantitate/pret** ca randul-partener din pereche. Aplicand formula **exact cum e specificata**
(`SUM(cant*pretvtva) + SUM(cante*pretvtva WHERE id_tip_rulaj<>3)`, fara nicio excludere
suplimentara), rezultatul pe acest document e **3728.18**, in timp ce `Total ACT` (si
`VANZARI.TOTAL_CU_TVA`) e **1924.59** — deci verdictul iese "divergent" desi documentul e, de fapt,
corect emis. Cercetarea anterioara (E.4) aratase ca EXCLUDEREA randurilor "duplicat" inchide exact
diferenta, dar aceasta excludere **nu a fost inclusa in formula finala transmisa** (a ramas intrebare
deschisa, nu decizie). Am implementat formula **asa cum a fost specificata in brief/decizii**, fara
sa adaug o regula de excludere nedecisa — testul nou confirma ca implementarea calculeaza exact ce
scrie formula (verificat prin recalcul independent, SCAN separat de codul din clasa), iar
"divergent" pe acest tip de document e comportamentul **asteptat si documentat**, nu un bug. Ramane
o intrebare pentru Marius: se decide excluderea randurilor `ID_TIP_RULAJ=0` care dubleaza exact un
rand din perechea `3` (ar inchide acest caz), sau ramane asa cum e acum (informativ, divergenta
posibila pe documentele cu acest tipar de date)?
## Limitare cunoscuta, in afara perimetrului
Liniile adaugate manual in aceeasi sesiune (`AdaugaLinieTvdDinArticol`, sub-blocul B) nu primesc
`in_stoc` — selectorul `caut_articol()` (decizia 34) nu carrying stocul articolului. Pana la
salvarea si reincarcarea notei, o linie noua e tratata implicit ca stocata (`Nvl(in_stoc,1)=1`, fara
corectie). Nu a fost atins `AdaugaLinieTvdDinArticol` — in afara scopului acestei livrari.
## Testat
**Regresie, headless, `vfp9.exe -A -T`, watchdog, exit 0, zero dialoguri**, identic cu baseline-ul
de plecare (handoff intermediar (sters)):
- `test_page3_articole.prg`: **14 PASS / 2 FAIL** (cele 2 = artefactul headless cunoscut de la
datoria 7, neschimbat).
- `test_incarca_vanzare_din_nota.prg`: **5 PASS / 0 FAIL**.
- `test_adauga_linie_articol.prg`: **20 PASS / 0 FAIL** (linia `REZULTAT` din log — grep brut pe
"PASS"/"FAIL" da 21/1 din cauza ca linia de sumar contine ambele cuvinte; cifra corecta e cea din
`REZULTAT`).
- `test_adauga_linie_valuta.prg`: **6 PASS / 0 FAIL**.
- `test_ui_sterge_linie.prg`: **8 PASS / 0 FAIL**.
**Suita noua**, `COMUN\utile\Teste\editare_factura\test_verdict_act_rul.prg`, pe documentul
descoperit prin proprietate (`FACTURA_ARTICOLE`, nu ancorat pe `cod`): **18 PASS / 0 FAIL**
(`REZULTAT` in log). Acopera: calculul `Total ACT` si `Total RUL` verificat prin recalcul
independent (SCAN, cod separat de metoda testata); marcajul "(ajustat)" cand corectia pe linii
nestocate s-a aplicat; textul verdictului informativ, niciodata prezentat ca eroare de sine
statatoare; starile sincronizat/divergent; tratamentul special tip=51 (verdict fortat "nu se
aplica", cifrele raman vizibile); ascunderea celor 5 controale pe transfer (23) si custodie (42);
alegerea contului pe grupa de tip (28→461, 21→418); corectia sintetica pe linie fortata `in_stoc=0`
(creste `Total RUL` exact cu valoarea liniei convertita in RON).
**Zero scrieri in Oracle** in toata sesiunea (doar `SELECT`-uri prin `goExecutor` si cursoare in
memorie). Date de test (`MARIUSM_AUTO`) — divergenta gasita pe documentul de test e un caz izolat
documentat mai sus, nu o dovada ca formula e gresita pe restul datelor.
## Cens de octeti si write-back
- **Inainte**: `2 aa / 2 e3 / 2 fe`, zero `EF BF BD`.
- **In timpul editarii**: fiecare scriere cu Edit a stricat din nou cele doua linii cu diacritice
(`Renunțare`/`Adăugare`/`Ștergere`, censul a urcat la `6 ef/6 bf/6 bd`) — reparat byte-cu-byte cu
Perl, folosind bytes-urile corecte din backup-ul `omodificari.vc2.pre_verdict.bak` (facut inainte
de prima editare).
- **Final**: `2 aa / 2 e3 / 2 fe`, zero `EF BF BD` — identic cu baseline-ul.
- **Write-back**: `txt2vcx.ps1 -AllowComun`. Prima rulare a picat fidelity check-ul (diferenta era
doar formatarea liniilor goale din metoda noua — spatii vs tab-uri, capcana deja cunoscuta),
rezolvata prin adoptarea textului regenerat din staging ca sursa canonica (verificat ca are acelasi
cens de octeti inainte de a-l adopta). **A doua rulare: OK.** `.vc2`/`.vcx`/`.VCT` sincrone
(acelasi mtime, `svn status` arata `M` pe `.vcx`/`.VCT`, `I` pe `.vc2` — ignorat de SVN, urmarit doar
in git).
## Fisiere atinse
- `COMUN\clase\omodificari.vc2` (+ `.vcx`/`.VCT`, scris in binar) — metoda noua
`ActualizeazaVerdictActRul`, apel din `ActualizeazaBaraTotaluri`, 5 controale noi pe PAGE3,
proprietati noi (`ntotalactron`, `ntotalrulron`, `lrulajustat`), redimensionare `pgfArticole` +
formular + 4 butoane din dreapta.
- `COMUN\programe\ofacturare_editare.prg` — `in_stoc` in `tvd` (structura + interogare).
- `COMUN\utile\Teste\editare_factura\test_verdict_act_rul.prg` (nou) — suita dedicata.
- Backup: `COMUN\clase\omodificari.vc2.pre_verdict.bak`,
`COMUN\programe\ofacturare_editare.prg.pre_verdict.bak` (pastrate).
## Diff-uri
- diff aplicat (sters) — `omodificari.vc2` (fata de `.pre_verdict.bak`).
- diff aplicat (sters) — `ofacturare_editare.prg`, izolat.
**Fara commit** (nici git, nici SVN).
## Intrebari ramase pentru Marius
1. Randurile RUL "duplicat" (`ID_TIP_RULAJ=0` care dubleaza exact un rand din perechea `3`) — se
exclud din formula (ar inchide cazuri ca cel gasit pe `cod=1140895`), sau ramane formula literala
asa cum a fost decisa, cu riscul asumat de "divergent" pe aceste documente? Vezi sectiunea
dedicata de mai sus.
2. Cont pentru rate/contract (tip 2,6,52 cu `id_rata<>0`): s-a folosit simplificarea `4111` (empiric
confirmat, dar nu derivat din `NOTE_CONTABILE`). Ramane acceptabil, sau merita o interogare
dedicata intr-o runda viitoare?