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

11 KiB

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?