From b8ab1c781f1d58a8c797c8a0d5980b3f5922fe77 Mon Sep 17 00:00:00 2001 From: Marius Mutu Date: Thu, 9 Jul 2026 22:04:12 +0300 Subject: [PATCH] docs: adauga CLAUDE.md si ghid cautare vcx/scx (git+SVN paralel, COMUN partajat) --- CLAUDE.md | 56 ++++++++++++++++++ docs/cautare_vcx_vct.md | 127 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 183 insertions(+) create mode 100644 CLAUDE.md create mode 100644 docs/cautare_vcx_vct.md diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c3ef797 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,56 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What this is + +ROAAUTO is a **Visual FoxPro 9** desktop application (Romanian-language) for auto-service / +car-dealer operations: devize (quotes/estimates), comenzi (work orders), facturare (invoicing). +It is one member of the larger "ROA" suite and shares the `COMUN\` framework with the other +ROA applications (ROAACNPRO, ROAGEST, etc.). + +## Build, run, version control + +- **Build/run requires the Visual FoxPro 9 IDE on Windows.** There is no command-line build. + Open `roaauto.pjx` in the VFP IDE and use *Build > Build Executable* to produce `roaauto.exe`. +- **`.prg` files are source; `.fxp` are compiled, `.bak` are backups.** Edit the `.prg`. The + `.scx/.sct` (forms), `.vcx/.vct` (class libraries), `.frx/.frt` (reports), and `.mnx/.mpr` + (menus) are VFP binary/generated artifacts — **edit them in the VFP IDE, not by hand.** +- **Version control: git runs in parallel with the legacy SVN.** SVN (`.svn/`) remains the "live" + source of truth for this project and especially for `COMUN/`, which stays a working copy + synced manually to git — git does not replace it, just mirrors it for tooling (search, diffing, + agent workflows). Don't run `svn` commands from here unless explicitly asked; `.gitignore` + simply excludes `.svn/`. + - **Repo principal** (rădăcina acestui folder): `git@gitea.romfast.ro:romfast/roaauto.git`. + - **`COMUN/`** are propriul `.git`, separat de repo-ul principal (de aceea `COMUN/` e în + `.gitignore`-ul de la rădăcină — nu e tracked de repo-ul principal). Origin-ul lui e + **același pentru toate aplicațiile ROA**: `git@gitea.romfast.ro:romfast/comun.git` — repo + partajat, populat inițial din ROAACNPRO. Nu face force-push peste el fără să verifici întâi + diferențele față de `origin/main` (ar afecta toate proiectele ROA care îl folosesc). +- **`config.fpw`** sets the runtime environment. Don't enable SAFETY — the code relies on silent + overwrite (see `EXCLUSIVE=OFF`/`SAFETY=OFF` conventions shared across ROA apps). +- The compiler error log is `roaauto.ERR`; the runtime log is `LOG.txt`. + +## Searching code inside `.vcx`/`.scx` (binary) libraries + +Most class/form code lives **inside binaries** (`.vcx`+`.vct`, `.scx`+`.sct`, …), not in `.prg`, +so plain grep can't read it cleanly. Convert to TEXT form first and grep the text: + +```powershell +powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` + -Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO ` + -CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto +``` + +This is project-driven (reads `roaauto.pjx`, converts only the `.vcx`/`.scx` the project +actually uses) and writes to a **cache dedicated to this project** +(`D:\ROA\UTIL\foxbin2prg\_textcache_roaauto\`) — don't mix it with other ROA projects' caches +(e.g. `_textcache_roaacnpro`). Then `Grep` in that cache. Full guide: `docs/cautare_vcx_vct.md`. + +## The COMUN shared framework + +`COMUN/` is shared, framework-level code used by every ROA app — not specific to ROAAUTO. Treat +it as a vendored library: prefer app-specific changes in this repo's top-level `Programe/`, +`Clase/`, `Ferestre/`, `Rapoarte/`, `Meniuri/` directories, and only touch `COMUN/` when the fix +genuinely belongs to the shared framework (and remember it's versioned separately, shared with +every other ROA app). diff --git a/docs/cautare_vcx_vct.md b/docs/cautare_vcx_vct.md new file mode 100644 index 0000000..8deb6ea --- /dev/null +++ b/docs/cautare_vcx_vct.md @@ -0,0 +1,127 @@ +# Căutare în codul din librăriile/formele VFP (`.vcx`/`.vct`, `.scx`/`.sct`, ...) + +Cum se caută cod-sursă (proceduri, metode, parametri) care **nu** stă în fișiere `.prg`, ci +în interiorul fișierelor binare VFP: librării de clase (`.vcx`+`.vct`), forme (`.scx`+`.sct`), +rapoarte (`.frx`+`.frt`), meniuri (`.mnx`+`.mnt`), baze de date (`.dbc`+`.dct`). + +## De ce e nevoie de asta + +Un `.vcx` este de fapt o **tabelă DBF**: codul metodelor stă în câmpuri memo în `.vct`. Un +`grep` direct pe `.vct` *găsește* textul, dar îl vede ca fișier binar (octeți `\0` între linii), +fără numere de linie utile și greu de citit. Soluția: convertim binarul în reprezentarea lui +**TEXT** (`.vc2`, `.sc2`, …) — un PRG-style lizibil, cu metode sortate alfabetic — și căutăm +în text cu `grep`/`Grep`. + +> **Regula de aur:** textul generat e **doar pentru citire/căutare**. Modificările de cod se fac +> tot în **IDE-ul VFP** (vezi `CLAUDE.md`). Nu edita `.vcx/.vct` pe text și nu pune textul înapoi +> în binar pentru aceste scopuri. + +## Unelte disponibile (verificate) + +| Unealtă | Cale | Rol | Recomandare | +|---|---|---|---| +| **FoxBin2Prg** | `D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE` | Binar VFP ⇄ text bidirecțional (`.vc2/.sc2/.fr2/.mn2/.dc2/.lb2`) | **De folosit.** Complet, fidel, include corpul metodelor, parametri, comentarii | +| vcx2prg | `D:\ROA\UTIL\vcx2prg\x2prg.prg` | Doar `.vcx` → `.prg` *compilabil* | Alternativă; mai vechi, doar clase, necesită IDE VFP deschis pentru a rula forma | +| prgtovcx | `D:\ROA\UTIL\prgtovcx\prgtovcx.PRG` | Invers: `.prg` → `.vcx` | **Nu** pentru căutare (e direcția opusă) | + +FoxBin2Prg e prima alegere: rulează din linia de comandă fără IDE deschis (EXE compilat), acoperă +toate tipurile de container, și produce text mult mai fidel decât vcx2prg. + +> Dacă `FoxBin2Prg.EXE` lipsește, se compilează o singură dată: deschide +> `D:\ROA\UTIL\foxbin2prg\foxbin2prg.pj2` în VFP 9 și *Build > Build Executable*. Lângă EXE trebuie +> să existe `filename_caps.exe` și fișierele `props*.txt` (sunt deja în folder). + +## Mod recomandat: scriptul `vcx2txt.ps1` + +`D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1` automatizează tot: copiază binarul + memo-ul într-un +**cache** care oglindește structura proiectului (ca să nu murdărească arborele SVN), rulează +FoxBin2Prg, păstrează doar fișierul text. E **incremental** (sare peste ce e deja la zi). + +Pentru ROAAUTO, scriptul trebuie parametrizat cu proiectul curent și un cache separat (nu-l +amesteca cu cel al altor proiecte ROA, ex. ROAACNPRO): + +```powershell +# DOAR fișierele proiectului ROAAUTO (recomandat, rapid) -> cache text propriu +powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` + -Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO ` + -CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto + +# include și rapoartele (.frx) și meniurile (.mnx) +powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` + -Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO ` + -CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto -Types vcx,scx,frx,mnx + +# conversie punctuală a unui fișier sau folder (chiar dacă NU e în proiect) +powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 -Source D:\ROA\ROAAUTO\COMUN\clase\caut.vcx + +# rebuild curat (șterge cache-ul întâi) / forțează reconversia +powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` + -Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO ` + -CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto -Clean +powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 ` + -Project D:\ROA\ROAAUTO\roaauto.pjx -ProjectRoot D:\ROA\ROAAUTO ` + -CacheRoot D:\ROA\UTIL\foxbin2prg\_textcache_roaauto -Force +``` + +Rezultatul ajunge în `D:\ROA\UTIL\foxbin2prg\_textcache_roaauto\` cu aceeași structură de +directoare ca proiectul (ex.: `_textcache_roaauto\Clase\odevize.vc2`, +`_textcache_roaauto\comun\clase\_frm_base.vc2`). Apoi: + +```bash +# cu unealta Grep (preferat) sau grep: +grep -rn "PROCEDURE do_calcul_tarife" "D:\ROA\UTIL\foxbin2prg\_textcache_roaauto" +grep -rln "factura_salvare" "D:\ROA\UTIL\foxbin2prg\_textcache_roaauto" # ce clase ating subiectul +``` + +Flux tipic pentru o problemă: rulează scriptul cu parametrii de mai sus o dată (populează +cache-ul), apoi caută cu `Grep` în `_textcache_roaauto`. La sesiuni următoare rescrie doar ce +s-a schimbat (incremental). Dacă ai nevoie de o librărie din `COMUN\` care nu e în proiect, +convertește-o punctual cu `-Source`. + +## Alternativă manuală (fără script) + +FoxBin2Prg scrie textul **lângă sursă**. Ca să nu murdărești `Clase/`, copiază perechea +binar+memo într-un folder temporar și convertește acolo: + +```powershell +# .vcx -> .vc2 (cType gol = extensia decide direcția BIN2PRG) +Copy-Item D:\ROA\ROAAUTO\Clase\odevize.vcx, D:\ROA\ROAAUTO\Clase\odevize.vct D:\tmp\ +& 'D:\ROA\UTIL\foxbin2prg\FoxBin2Prg.EXE' 'D:\tmp\odevize.vcx' '' '' '' '1' '0' '1' +# => D:\tmp\odevize.vc2 +``` + +Pozițiile parametrilor folosite: `fișier, cType, cTextName, lGenText, cDontShowErrors=1, +cDebug=0, cDontShowProgress=1`. **Lasă `cType` gol** — extensia (`.vcx`) determină direcția. +(Nu da explicit `"BIN2PRG"` pentru un singur fișier: în acel mod EXE-ul așteaptă un *director*.) + +Detalii complete de parametri: `D:\ROA\UTIL\foxbin2prg\docs\FoxBin2Prg_Run.md`. + +## Soluție rapidă „murdară" (un singur fișier, fără conversie) + +Pentru o verificare rapidă „există metoda X undeva în librărie?", `grep` merge direct pe `.vct` +(o vede ca binar, dar găsește potrivirile): + +```bash +grep -c "PROCEDURE" "D:\ROA\ROAAUTO\Clase\odevize.VCT" +grep -a -o "PROCEDURE [a-zA-Z0-9_]*" "D:\ROA\ROAAUTO\Clase\odevize.VCT" +``` + +Bun pentru „da/nu" și nume de metode; pentru citit corpul/contextul, folosește conversia în text. + +## Corespondență extensii binar → text + +| Container | Binar (+memo) | Text | +|---|---|---| +| Librărie clase | `.vcx` + `.vct` | `.vc2` | +| Formă | `.scx` + `.sct` | `.sc2` | +| Raport | `.frx` + `.frt` | `.fr2` | +| Etichetă | `.lbx` + `.lbt` | `.lb2` | +| Meniu | `.mnx` + `.mnt` | `.mn2` | +| Bază de date | `.dbc` + `.dct` | `.dc2` | + +## Note + +- Codul aplicației stă mai ales în `Clase\*.vcx`; cea mai mare parte din `.vcx`-uri sunt în + `COMUN\` (framework partajat — vezi `CLAUDE.md`). +- `_textcache_roaauto\` e regenerabil și e în afara arborelui SVN — poate fi șters oricând. +- Conversia **nu** necesită IDE-ul VFP deschis (folosește EXE-ul compilat).