Files
roafacturare/docs/plan_qa_factura_aviz.md
Marius Mutu e0e7bdef28 Merge branch 'main' of gitea.romfast.ro:romfast/roafacturare
Conflicte in docs/ rezolvate cu versiunea locala (condensata, cu corectia
CLAUDE_AUTOCOMPACT_PCT_OVERRIDE=30), plus repunerea trimiterilor catre documentele
de referinta aduse de merge.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015ZwtBDjGbAWvy7TmcNVxDC
2026-09-17 22:52:05 +03:00

8.3 KiB

Plan QA + corectii: adaugare/editare FACTURA si AVIZ

Stare: APROBAT 17.09.2026. Mandat de executie continua: toate stories, commit dupa fiecare, fara aprobare per story; singura exceptie e mockup-ul de la S4, care se arata inainte de implementare. Handoff la limita de context. Ultima actualizare: 17.09.2026. Fisier de stare viu asociat: docs/progres_qa_factura.md (se actualizeaza dupa FIECARE story). Harti de pornire (deja scrise, read-only): docs/qa_factura_harta.md, docs/qa_factura_unelte.md, docs/qa_factura_hooks_ref.md.

0. Unde se executa

Executia trece pe VM 304 (are D:\ROA, VFP 9, acces Oracle ROA_CENTRAL/MARIUSM_AUTO). Motiv: UI vizibil fara sa fure focusul de pe masina lui Marius. O sesiune noua acolo porneste din acest fisier + docs/progres_qa_factura.md.

Momentul mutarii (decizie Marius): dupa S0, cu prototipul de context/handoff deja functional. S0 se face pe masina curenta (nu cere UI); de la S1 incolo totul e pe VM 304.

Conexiune probe: DO test_init_env_auto_roafacturare WITH 'CENTRAL','MARIUSM_AUTO','ROMFASTSOFT' (COMUN\utile\Teste\test_init_env_auto_roafacturare.prg:11,16-18). gnAn=2026, gnLuna=8, gnIdFirma=110, gnIdUtil=8 inainte de serii.

1. Constatari confirmate pe cod (baza planului)

# Constatare Dovada
C1 Ecranul e clasa frm_facturare_articole2, nu .scx; instantiata doar cand llFacturareNoua COMUN\clase\ofacturare.vc2:15936-22614; COMUN\programe\ofacturare.prg:246-248
C2 Pragul de 3 caractere = ncharcountbegin=2 pe cele doua combo-uri + garda Len(...) <= nCharCountBegin ofacturare.vc2:17524-17537, 17560-17574, 463-496
C3 Cautarea implicita e "incepe cu" (RefreshData(1)); "contine" exista dar e ascunsa dupa Ctrl+Enter COMUN\clase\_cb_base.vc2:636-649,720; ofacturare.vc2:476-489
C4 Zero feedback in timpul cautarii: KeyPress cheama direct RefreshData, fara indicator, fara numar de rezultate, fara mesaj "nimic gasit" _cb_base.vc2:610-776
C5 Nu exista debounce: se cauta la fiecare tasta peste prag idem C4
C6 Sursa duplicatelor pe articol e in Oracle, in pack_facturare.cursor_preturi (join cu politicile de pret) - nu in VFP ofacturare.vc2:446-461; tabela crm_politici_pret_art folosita la ofacturare.vc2:21755
C7 Nu exista niciun selector de lista de preturi in formular; se trimite poDate.id_gestiune_init, sau poDate.listaid doar cand tip=45 ofacturare.vc2:453-457
C8 Controalele de jos sunt copii directe ale formularului, fara container, cu Top 742/745/767/789/792 si Anchor mixt 4 vs 12; nimic nu le repozitioneaza la runtime ofacturare.vc2:18082-18195; Resize la 21847-21854 nu le atinge
C9 Factura vs aviz = poDate.nIdTipDoc 5 vs 6; helper EsteAviz() COMUN\programe\ofacturare_antet.prg:16-18

Necunoscuta blocanta: corpul pack_facturare.cursor_preturi nu e in working copy. Se citeste din ALL_SOURCE pe MARIUSM_AUTO inainte de orice decizie despre listele de preturi (Story S3).

2. Constrangeri de perimetru

  • combosql (COMUN\clase\_cb_base.vc2:519) e clasa de baza folosita de TOATE produsele ROA. Nu se modifica. Tot comportamentul nou de cautare se suprascrie in combosql_cautare (ofacturare.vc2:407-531), care e specifica facturarii.
  • ofacturare.vc2 traieste in COMUN\ - dublu-versionat SVN+git, commit tintit din COMUN\.
  • .vc2 se editeaza cu script Python binar (nu sed -i, nu Edit pe linii cu octeti >0x7F); diacriticele sunt cp1250. Write-back doar txt2vcx.ps1 -ProjectRoot D:\ROA\ROAFACTURARE.
  • Dupa fiecare write-back: MODIFY CLASS + captura, apoi designerul se INCHIDE inainte de urmatorul write-back.
  • Un singur agent scrie pe ofacturare.vc2 la un moment dat. Probele pe aceeasi clasa nu ruleaza in paralel cu write-back-ul.

3. Stories

S0 - Prototip context/handoff (se face PRIMUL, se foloseste pe restul planului)

Reutilizeaza ce exista: context_watch.ps1 (in D:\ROA\ROAGEST\COMUN\utile\) deja citeste usage din transcriptul JSONL si alerteaza la 250k/275k. Nu se rescrie. Se repara si se extinde:

  1. Bug activ: hook-ul SubagentStop din ~/.claude/settings.json re-injecteaza acelasi mesaj runda dupa runda (observat azi, si notat deja in memorie). Cauza documentata: hook-ul nu citeste stop_hook_active din JSON-ul de pe stdin si nu iese cu 0 cand e adevarat (plafon 8 blocari consecutive). Fix: garda stop_hook_active la inceputul hook-ului.
  2. Fisier de stare scris de hook, nu de model: context_watch.ps1 primeste -StareFile si, la pragul de avertisment, scrie/actualizeaza un antet in docs/progres_<subiect>.md (procent context, ora, ultimul bloc). Modelul completeaza continutul; hook-ul garanteaza ca fisierul exista si e datat chiar daca sesiunea moare.
  3. Compactare mai devreme si previzibila: CLAUDE_AUTOCOMPACT_PCT_OVERRIDE in env din settings (ex. 70), ca auto-compact-ul sa cada DUPA pragul de avertisment al lui context_watch, nu inaintea lui. Compactarea NU poate fi declansata programatic - documentat, deci mecanismul ramane: hook avertizeaza -> modelul scrie handoff -> compactarea vine singura.
  4. Se muta in COMUN (cerinta Marius) ca sa fie refolosibil de toate produsele ROA.

Proba: o sesiune de proba cu un subagent care se termina => hook-ul ruleaza o singura data; fisierul de stare exista si are marca de timp.

S1 - Baseline QA: dovada vizuala si scenarii

Pe VM 304, formular vizibil prin vfp_ui_harness.ps1:

  • capturi la 1366x768 si la rezolutia de lucru, pentru FACTURA si pentru AVIZ;
  • captura zonei de jos (totaluri+discount) cu formularul la inaltime minima si maximizat - dovada pentru C8 si pentru comportamentul Anchor 4 vs 12;
  • scenariul de cautare: tastare progresiva pe un cod cunoscut din MARIUSM_AUTO, captura dupa fiecare caracter - dovada pentru C2/C4;
  • articol prezent in mai multe politici: captura cu randurile duplicate - dovada pentru C6.

Livrabil: docs/qa_factura_baseline.md + capturi. Nicio modificare de cod in S1.

S2 - Cautare articole (toate cele patru cerinte)

In combosql_cautare, fara sa atinga combosql:

  • prag de la primul caracter (ncharcountbegin=0 pe cele doua instante + garda actualizata);
  • cautare "contine" implicita, si pe cod si pe denumire;
  • debounce ~250ms + limita de randuri, ca sa nu plece o interogare per tasta;
  • feedback: indicator "se cauta...", numarul de rezultate, mesaj explicit la zero potriviri.

Proba: headless pe filtrul construit (asertii pe sirul trimis catre cursor_preturi) + proba UI vizibila pe VM pentru feedback si latenta.

S3 - Selector de lista de preturi (implicit lista clientului)

Depinde de citirea pack_facturare.cursor_preturi din ALL_SOURCE pe MARIUSM_AUTO. Decizie Marius 17.09.2026: citirea ALL_SOURCE e permisa, iar modificarea pachetului e permisa doar pe MARIUSM_AUTO, prin script wip13_*.sql.txt idempotent (CREATE OR REPLACE), inregistrat in registrul de scripturi. Nimic nu pleaca spre clienti. Tinta functionala: un combo in formular, prefixat cu lista din politica clientului, plus optiunea "Toate listele"; in modul implicit fiecare articol apare o singura data.

S4 - Zona totaluri + discount, regandita ca bloc

Mockup HTML inainte de implementare (mockup-urile stau online, nu in docs/). Dupa aprobarea mockup-ului: container dedicat, Anchor unitar, aliniere pe grila, etichete. Atentie: Anchor=4 face ca Top-ul design-time sa conteze la rulare - orice schimbare de inaltime se probeaza la 1366 maximizat.

S5 - Regresie

Suita existenta + probele noi, pe FACTURA si pe AVIZ, adaugare si editare. Raport prin raport_teste.ps1, nu loguri brute.

4. Ordine si commit

S0 -> S1 -> S2 -> S3 -> S4 -> S5. Commit pe branch de lucru dupa fiecare story (cod COMUN din COMUN\, restul din radacina), fara push; SVN si merge raman la Marius. docs/progres_qa_factura.md se actualizeaza dupa fiecare story, nu la final. Documentele de lucru din docs/ nu se comit pe main.

5. Datorii deschise cunoscute la scrierea planului

  • Corpul pack_facturare.cursor_preturi necitit - blocheaza S3.
  • Cifra plafonului de blocari repetate ale unui stop hook: 8 (confirmat in ghid) vs 100 (CLAUDE_CODE_STOP_HOOK_BLOCK_CAP), nereconciliat.
  • Daca PreCompact poate bloca compactarea prin exit 2: nedocumentat.