Files
comun/docs/flux-editare-vfp-text.md
Marius Mutu 889840357a Verificare ANAF la alegerea partenerului
ocautare.prg - miezul functionalitatii:
- anaf_verif_cautare: verdictul ANAF pe randul curent din formularul de cautare
  (label sub grid), la data documentului; discordantele si codurile fiscale invalide
  cu rosu; F4 sau click deschide detaliile.
- ANAF_StarePartener, cu cache pe sesiune, excludere parteneri externi si persoane
  fizice; ANAF_ValidareCod pentru CIF/CNP.
- ANAF_NivelVerificare: cascada RC_ANAF_VERIF_SELECTIE (kill-switch settings.ini >
  optiuni utilizator > optiuni firma > implicit 1), cu cache invalidat la schimbarea
  firmei sau utilizatorului; ANAF_ComutaVerificare pentru punctul de meniu.
- Detalii: alegerea variantei corecte de partener din perechea RO / fara RO, cu
  discriminator "are documente in perioada"; dupa Da sau Nu se inchide cautarea si
  se revine in formular cu partenerul ales (AplicaInlocuirePartenerANAF).
- ANAF_CaData: data documentului poate veni si ca DateTime (tact.dataact).
- Banda proprie sub grid pentru label: formularul creste cu 54, gridul isi pierde
  ancorarea de jos si primeste inaltimea din AjusteazaBanda, legata de Resize si
  Activate - formularul isi reaseaza gridul dupa Show, deci Activate e momentul util.

validare.prg: ANAF_VerificaCuiSingle, wrapper single-CUI peste serviciul ANAF, cu
data verificarii si o singura eroare logata pe sesiune.

cauta_alfa.prg: hook generic - ataseaza poVerifAlegere pe formularul de cautare
inainte de Show si il detaseaza dupa.

Apelanti opt-in (lVerificaANAF): baza.vc2 (lookup-ul generic de partener din
formularele actbaza/actbaza2007 lansate din meniuri), onote_contabile.vc2 (partener
debit/credit), omodificari.vc2 (do_cauta din cele trei clase de modificare, cu data
notei), ofacturare.vc2 (client, furnizor). Casa/banca ramane in afara: acolo partenerul
se alege pentru imperecherea facturilor.

cauta_alfa_forms.vc2: F4 deschide detaliile, iar terminarea cautarii trece prin
VerificaAlegere.

Teste: suita headless pentru fluxul de verificare (utile/Teste/partener_anaf/), cu
mock pentru apelul ANAF si pentru dialoguri.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019H3r66sVojGhgaKq5niu1u
2026-07-27 01:29:41 +03:00

4.9 KiB

Flux editare .vcx/.scx pe text (comun proiectelor VFP)

Textul .vc2/.sc2 e sursa de editare; write-back in binar cu txt2vcx.ps1, fara VFP IDE. Detalii complete: D:\ROA\UTIL\foxbin2prg\CLAUDE.md. Parametrii per proiect: sectiunea de mai jos.

Proiecte migrate (ROACONT, COMUN, …): flux in-arbore. Textul .??2 sta langa binare, il improspateaza git_sync.ps1 -ProjectRoot <root> (nu cache extern) — la inceput de sesiune si inainte de orice git commit. Write-back doar pentru vcx/scx; frx/mnx/lbx/pjx/dbc/dbf doar in IDE. txt2vcx.ps1 cu -CacheRoot = -ProjectRoot (implicit). Pasul 0 de mai jos devine rularea git_sync.ps1; restul pasilor raman la fel. Fluxul cu cache extern (vcx2txt.ps1 + -CacheRoot separat) ramane doar pentru proiectele nemigrate.

Parametri per proiect (nemigrate, cache extern)

  • ROAGEST: -Project 'D:\ROA\ROAGEST\roagest.pjx' -ProjectRoot 'D:\ROA\ROAGEST' -CacheRoot 'D:\ROA\_vfp_textcache\roagest'; procese de verificat inainte de write-back: vfp9, roagest; patch-uri de review in docs/diff_runda<N>_<subiect>.patch.

Pasii unei runde

  1. Refresh cache (obligatoriu dupa orice sesiune IDE — staleness pe mtime): vcx2txt.ps1 -Project <pjx> -ProjectRoot <root> -CacheRoot <cache> -Types vcx,scx
  2. Baseline: Copy-Item <f>.vc2 <f>.vc2.pre_runda<N>.bak (in cache; la runde succesive necomise, diff-ul fata de HEAD ar amesteca rundele).
  3. Editare byte-safe: PowerShell [IO.File]::ReadAllText/WriteAllText(..., GetEncoding(1252)); NU tool-ul Edit/Write (UTF-8 strica diacriticele). Continut nou ASCII, TAB-uri ca in jur, fara reflow (format position-sensitive, proprietati alfabetizate). Valabil si pentru .prg.
  4. Patch review: git diff --no-index <bak> <editat> > docs/diff_runda<N>_<subiect>.patch (exit 1 = normal). Utilizatorul revizuieste FISIERUL de patch si aproba; write-back-ul (pasul 5) se face DOAR dupa aprobare. Commit doar dupa confirmare pe patch + test in IDE. Comentariile in cod: conventia din reguli_lucru.md (punctul 2). Obligatoriu inainte de a preda patch-ul la review: skill-ul de code-review rulat pe bucatile de cod din diff (nu doar citire manuala) - prinde defecte gen IIF cu numar gresit de argumente, deduplicari care nu se declanseaza niciodata, interogari mai largi decat e nevoie. Review-ul verifica si compactitatea/reutilizarea: cod care refoloseste functiile si clasele comune existente in loc sa le reinventeze (ex. cursor2lista()/cursor2listac() pentru liste dintr-un cursor in loc de Scan manual; butoane din cmd_butoane.vcx in loc de butoane ad-hoc). Inventarul comunelor: COMUN\docs\inventar-comun.md - se consulta si la pasul de plan/arhitectura, inainte de a scrie cod nou.
  5. Preconditie write-back: niciun proces vfp9/ (tin lock pe binar); nu se omoara.
  6. Write-back: txt2vcx.ps1 -TextFile <vc2> -ProjectRoot <root> -CacheRoot <cache> (+ -AllowComun cu aprobare explicita pentru tinte COMUN — afecteaza toate aplicatiile ROA). Succes = fidelity-check trecut: binar cu mtime nou; vcx2txt.ps1 ulterior il vede la zi.
  7. Teste finale pe cerinta initiala (cerinta Marius, valabila in toate proiectele VFP): dupa ultima runda, teste e2e (harness UI, pe fluxul real al utilizatorului) care verifica ca rezultatul construit arata si se comporta conform cerintei initiale — scenariul concret dat de Marius, cu valorile lui asteptate — nu doar teste per-fix. Assert-uri pe continutul rezultatului (sume, campuri, randuri), nu pe efecte de suprafata ("a aparut un rand" nu e suficient).
  8. Backup-urile .pre_runda*.bak si patch-urile se sterg la curatenia de dupa commit.

Capcane

  • .mnx/.frx raman read-only (GENMENU in IDE / round-trip fragil).
  • Linii complet goale in metode pica fidelity doar pe whitespace; fix: preia verify\*.vc2 din staging peste cache si reia write-back-ul.
  • Metoda noua de clasa cere *m: nume in *<DefinedPropArrayMethod>; fara ea, prima salvare din IDE o arunca tacut, iar refresh-ul urmator absoarbe pierderea in cache (si in .bak-uri). Override-urile de metode de baza (Init, Show, hook-uri) nu au nevoie de *m:.
  • Salvarea din VFP IDE peste un binar scris de txt2vcx poate PIERDE si definitii *m: deja existente, desi corpurile PROCEDURE raman (patit pe ROAGEST: import_adauga_factura.recalc_tva, import_nota.do_adauga/do_copie/do_reface, 07.2026); simptom: crash la Createobject cu "Data type mismatch" raportat la linia apelanta. Dupa orice sesiune IDE pe clasa: refresh cache + compara lista *m: cu starea de dinainte.
  • Nu folosi Project > Build ca sa recompilezi un binar vizat: rebuild-ul recompileaza toate .vcx/.vct din proiect si le rescrie antetul (timestamp compilare) si posibil p-code-ul intern si la librarii neatinse efectiv, aparand fals ca "modificate" in diff — de aici fluxul text->bin punctual pe binarul vizat.
  • Subagentii delegati primesc regulile 2-5 in prompt si raporteaza unicitatea sirurilor inlocuite + rezultatul fidelity-check-ului.