Initial: flux text FoxBin2Prg (git urmareste .??2 in-arbore, binarele VFP git-ignored)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
27
docs/CLAUDE.md
Normal file
27
docs/CLAUDE.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# Mod de lucru Claude ↔ Marius pe ROAGEST
|
||||
|
||||
## Modificare cod VFP binar (.vcx/.scx) — flux write-back pe text
|
||||
|
||||
Din 07.2026 Claude aplică singur modificările pe `.vcx`/`.scx` prin fluxul text→bin.
|
||||
Pașii per rundă (refresh cache, baseline `.pre_runda<N>.bak`, editare byte-safe CP1252,
|
||||
patch de review, write-back cu fidelity-check) + capcanele: **`COMUN\docs\flux-editare-vfp-text.md`**;
|
||||
parametrii ROAGEST: `docs/flux-editare-vfp-text.md`.
|
||||
|
||||
1. Claude investighează pe cache-ul text, propune modificarea și **așteaptă acordul lui Marius
|
||||
pe abordare** înainte să editeze.
|
||||
2. **Commit doar după ce Marius confirmă pe diff și testează în IDE.** Editările de volum se
|
||||
deleagă la subagenți Sonnet în background; sesiunea principală orchestrează și verifică.
|
||||
3. După implementare: changelog, ștergerea fișierului de propunere/patch-ului, iar insight-urile
|
||||
durabile se mută în notițe `docs/flux-*.md` / `docs/pachet-*.md`.
|
||||
|
||||
Excepții rămase pe VFP IDE: `.mnx` (GENMENU) și `.frx` (fragile la round-trip) — pentru ele
|
||||
rămâne valabil fluxul vechi cu fișier de propunere `docs/propuneri_<subiect>.md` aplicat de
|
||||
Marius în IDE. Când Marius a început deja o implementare, Claude compară codul lui cu originalul
|
||||
și listează explicit diferențele/cazurile netratate (nu rescrie orbește).
|
||||
|
||||
## Acces direct la baza de date Oracle
|
||||
|
||||
Claude are acces read la baza de date de dezvoltare și **își face singur exporturile** de surse
|
||||
PL/SQL (pachete, view-uri) — nu se mai cer exporturi manuale. Detalii de conexiune și comanda de
|
||||
export: `COMUN\docs\oracle_export.md`. Parola: `docs/local/oracle.md` (neversionat).
|
||||
Exportul de referință `PACK_CONTAFIN.pck` stă în `COMUN\docs\` și se reîmprospătează la nevoie.
|
||||
20
docs/README.md
Normal file
20
docs/README.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# Documentatie tehnica ROAGEST
|
||||
|
||||
Notite concise despre structura interna a proiectului (fluxuri, pachete, tabele), descoperite in timp ce se lucreaza la sarcini concrete. Completeaza CLAUDE.md — nu il inlocuieste si nu duplica ce e deja evident din cod.
|
||||
|
||||
## Index
|
||||
|
||||
- [CLAUDE.md](CLAUDE.md) — modul de lucru Claude ↔ Marius (propuneri de cod pentru VFP IDE, acces Oracle direct).
|
||||
- [flux-achizitie-import.md](flux-achizitie-import.md) — lantul achizitie import: gestiuni.vcx → achizitie_import → import_nota → import_nir → PACK_CONTAFIN; capcane (ptva bruta vs proc_tva, import_nota_original mort, 4427/401).
|
||||
- [flux-editare-vfp-text.md](flux-editare-vfp-text.md) — parametri ROAGEST pentru editarea pe cache text; fluxul comun (pasi per runda, capcane) e in `COMUN\docs\flux-editare-vfp-text.md`.
|
||||
- [git-svn-crlf.md](git-svn-crlf.md) — modificari fantoma in git dupa svn update (CRLF/mtime); fix cu `.gitattributes` (`* -text`) la radacina fiecarui repo.
|
||||
- [testare-vfp-mcp.md](testare-vfp-mcp.md) — testare vizuala automata: lansare `vfp9.exe DO roagest.prg` (fara rebuild) + interactiune prin `windows-mcp`; capcana focus furat de terminal.
|
||||
- `local/` — notite neversionate (credentiale Oracle etc., in .gitignore).
|
||||
|
||||
Vezi si `COMUN\docs\oracle_export.md` (export surse PL/SQL, PACK_CONTAFIN.pck).
|
||||
|
||||
## Cand actualizezi
|
||||
|
||||
Adauga sau corecteaza o notita aici ori de cate ori descoperi ceva nou si ne-evident despre structura proiectului in timpul rezolvarii unei sarcini (un flux ascuns, o capcana, o conventie, un pachet sau tabel cheie). Nu documenta ce oricine ar afla citind codul in 30 de secunde — scopul e sa scurtezi investigatii viitoare similare, nu sa duplici codul.
|
||||
|
||||
Organizeaza notitele in fisiere separate pe subiect (nu un singur fisier uriaș), ex: `flux-<nume-flux>.md`, `pachet-<nume-pachet>.md`, `tabele.md`.
|
||||
114
docs/flux-achizitie-import.md
Normal file
114
docs/flux-achizitie-import.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# Flux: Achiziție din import (NIR import)
|
||||
|
||||
Lanțul complet (descoperit la sesizarea „achiziție import", 07.2026):
|
||||
|
||||
- **Intrare**: `Clase\gestiuni.vcx` (`gestiuni.vc2:2045-2171`) → meniu „Achizitie din import /
|
||||
Achizitie interna" → `DO achizitie_import WITH <id_set>, llIntern IN ointroduceri.prg`.
|
||||
Id-uri de set: **208/209 = import**, **220/221 = intern** (perechi pe tip de operație).
|
||||
- **`achizitie_import`** (`COMUN\programe\ointroduceri.prg:1435-1617`):
|
||||
- antetul facturii = `poAct` (SCATTER din `actactan`, structura din `pmenu.prg:281-307`,
|
||||
tabelul `ACT`) — o singură pereche `id_valuta` + `curs` pe act;
|
||||
- liniile de notă = cursorul **`introdc`** (din view `vnote_contabile` filtrat pe `id_set`),
|
||||
fiecare rând moștenește `id_valuta`/`curs`/`dataact`/`tva_incasare` din `poAct`; rândurile merg
|
||||
în perechi **impar = linia de bază, par = linia de TVA**;
|
||||
- cursorul **`jtva_coloane2`** (explicații TVA, cu rând 0 gol) — sursa dropdown-ului de explicație;
|
||||
- deschide forma **`import_nota`** (`COMUN\clase\ointroduceri.vcx`). Atenție:
|
||||
**`import_nota_original` din același .vcx NU e instanțiat nicăieri — e copie de rezervă.**
|
||||
- **Modelul de documente**: un NIR de import = factura principală de achiziție (marfă și/sau
|
||||
imobilizări; valuta/cursul ei = `poAct.id_valuta`/`poAct.Curs`, referința de conversie) + opțional
|
||||
factura de transport (poate fi altă valută/curs) + opțional factura de taxe vamale + DVI
|
||||
(declarația vamală, cu TVA-urile fiecărei facturi, plătite în lei). Toate devin linii în `introdc`,
|
||||
apartenența la document fiind per rând: `nract`/`serie_act`/`id_fact` (rândurile au și `id_valuta`/
|
||||
`curs` proprii, dar istoric codul folosește doar `poAct.Curs`).
|
||||
- **`import_nota`** (nota contabilă a facturii): grila pe `introdc`; transport/alte taxe se introduc
|
||||
ca linii de notă suplimentare cu flagurile `in_valuta` (suma e în valută) și `participa_valuta`
|
||||
(linia intră în valoarea de intrare a mărfii). `do_executa` calculează procentele de repartizare
|
||||
(stocate în `explicatia4`/`explicatia5`); `inainte_de_do_termin` sumează bazele
|
||||
(lei/valută, liniile în lei se împart la `poAct.Curs`) și lansează **`import_nir`** cu
|
||||
`procent_lei/procent_val/ncurs`.
|
||||
- **`import_nir`** (grila de articole): `do_adauga` → `viz_catalog_articole()`
|
||||
(`oproceduri_articole.prg:62`, câmpul `in_stoc` = „Gestionabil") filtrat pe conturile `scd` din
|
||||
notă; prețul de intrare per articol = preț valută × `procent_val`, apoi × `ncurs` × `procent_lei`
|
||||
(transportul „umflă" procentele peste 100). Diferența reziduală devine linia „DIFERENTE".
|
||||
`do_modiparam` = preluare articole din XLS (creează articole noi prin `pack_preturi.adauga_articol`,
|
||||
cont implicit 371).
|
||||
- **Salvare**: `oscrie_in_fisiere` → tabelele temporare `ACT_TEMP`/`RUL_TEMP` → pachetul Oracle
|
||||
**`PACK_CONTAFIN`** (`SCRIE_IN_ACT`, `SCRIE_IN_RUL`, `SCRIE_IN_STOC`, …). `SCRIE_IN_RUL` inserează
|
||||
în `RUL` **exact** conținutul `RUL_TEMP` (nu derivă din ACT) — orice filtrare de rulaje se face în
|
||||
clientul VFP. Sursa pachetului: `COMUN\docs\PACK_CONTAFIN.pck` (vezi `COMUN\docs\oracle_export.md`).
|
||||
- **Articole negestionabile** (`nom_articole.in_stoc = 0`): modelul canonic e în clasa **`nir`**
|
||||
(NIR-ul obișnuit, același `ointroduceri.vcx`), mecanism din 2009 — articolul intră normal în grilă
|
||||
și participă la calcule, iar în `inainte_de_do_termin`, chiar înainte de scriere, se face
|
||||
`Delete From rul_temp Where in_stoc = 0` (valoarea rămâne doar pe nota contabilă, nu ajunge în
|
||||
`RUL`/`STOC`). Din v2.11.6 `import_nir` e aliniat la același model, cu un cursor temporar
|
||||
(`crsNegest`) care readaugă rândurile șterse în grilă dacă `oscrie_in_fisiere` eșuează.
|
||||
Cursorul `rul_temp` are coloana `in_stoc` pentru că e creat din view-ul `vrul` (`where 1=2`);
|
||||
la `do_adauga` coloana se umple prin `GATHER NAME loArt` din cursorul catalogului, la
|
||||
`do_modiparam` (XLS) explicit din selectul pe `nom_articole`.
|
||||
- **Explicație TVA**: dropdown istoric `Grid1.cExplicatieTva.Combo1` (RowSource `jtva_coloane2`);
|
||||
modelul alternativ cu formular de căutare = `frm_modific2024.do_modifica_explicatie_tva`
|
||||
(`omodificari.vcx`) → `caut_explicatie_tva()` (`ocautare.prg:1934`, view `vjtva_coloane`,
|
||||
întoarce DOAR `id_jtva_coloana, denumire, cota_tva`). Capcane: în `introdc.ptva` se ține **cota
|
||||
brută** (21), pe când în registru jurnal `proc_tva` = (cota+100)/100; comutarea 4427/401 pe linia
|
||||
de TVA se face prin SEEK în cursorul `cJtvaCol4427`.
|
||||
|
||||
Căutarea generică: `cauta_alfa()` (`COMUN\programe\cauta_alfa.prg`) → forma `cauta_alfa_form_plus`.
|
||||
|
||||
## Structura reală a șablonului `vnote_contabile` (verificat 11.07.2026)
|
||||
|
||||
Cursorul `introdc` NU pornește cu „2 linii" — se încarcă cu **toate** perechile-șablon din
|
||||
`vnote_contabile` pentru `id_set`. Numărul de linii pe baza de dev (`MARIUSM_AUTO`):
|
||||
**208 = 10 linii, 209 = 10, 220 = 10, 221 = 6**. Cele 10 linii ale setului de import (208) =
|
||||
**5 perechi pre-alocate (bază+TVA) = 5 sloturi de document**:
|
||||
|
||||
| Pereche (ordine) | SCD/SCC bază | SCD/SCC TVA | Ce e |
|
||||
|---|---|---|---|
|
||||
| 1 (1-2) | 3028/401 | 4426/4427 | marfă CE 21% + TVA |
|
||||
| 2 (3-4) | 3028/401 | 4426/4427 | slot repetat (gol) |
|
||||
| 3 (5-6) | 3028/401 | 4426/4427 | slot repetat (gol) |
|
||||
| 4 (7-8) | 3028/446 | 4426/446 | vamă/DVI (pe dev) |
|
||||
| 5 (9-10) | 3028/446 | 4426/446 | slot repetat (gol) |
|
||||
|
||||
Model CONT2000: în loc să adaugi rânduri, ai **sloturi goale pre-alocate** pe care le completezi.
|
||||
Factura principală = perechea 1 (2 linii); restul sunt sloturi pentru facturi suplimentare (3 marfă)
|
||||
+ DVI (2). Un „document" = o pereche cu date.
|
||||
|
||||
**Corecție importantă (Marius, verificat pe bază reală de producție):** conturile 446 din setul 208
|
||||
de pe dev **NU sunt reprezentative**. În realitate și DVI-ul vamă folosește **4426 = 401** (nu 446).
|
||||
`vnote_contabile` e **configurabil per firmă**, deci șablonul variază — nu hardcoda conturile, ci
|
||||
clonează perechea-șablon reală a setului. Practic: **un singur pattern de conturi** (bază 3028/401 +
|
||||
TVA 4426/4427 sau 4426/401) acoperă și marfă, și DVI (DVI diferă doar prin partener/unde e plătit
|
||||
TVA, nu prin conturi).
|
||||
|
||||
## DECIZIE 11.07.2026 — pivot la „Direcția A" (rescriere flux introducere)
|
||||
|
||||
Marius a decis să se **abandoneze modelul cu 10 sloturi pre-alocate**. Noul model (de implementat
|
||||
într-o sesiune viitoare, e scop **M2**, mai mare decât runda 1 M1/M3/M6):
|
||||
|
||||
1. **`achizitie_import`**: `introdc` pornește **gol** (0 rânduri de document); se păstrează perechea-
|
||||
șablon (bază+TVA, cu conturile reale din `vnote_contabile` ale setului) ca **sursă de clonare**.
|
||||
Nu se mai încarcă cele 10 sloturi.
|
||||
2. **Buton „Adaugă factură" + dialog (M2)**: clonează perechea-șablon, o completează cu datele
|
||||
facturii, o adaugă în `introdc`. Se folosește **și pentru factura principală**, și pentru DVI
|
||||
(radio-ul furnizor/DVI/fără schimbă doar partenerul/unde e plătit TVA, nu conturile).
|
||||
3. **M1 (culori)**: rămâne cum e — fiecare factură adăugată = o pereche = un document = o culoare
|
||||
(F1, F2, …), incremental, cheie `serie+nr+id_fdoc`. Codul M1 deja aplicat merge neschimbat pe
|
||||
acest model.
|
||||
|
||||
Avertismente: atinge `COMUN` (blast radius: 22 `.pjx` referă `ointroduceri`) și **schimbă
|
||||
comportamentul pentru toți userii de import** (nu mai văd sloturi pre-completate) — testare atentă,
|
||||
dare în funcțiune deliberată.
|
||||
|
||||
## Ștergere note (`import_nota.do_sterge`, 07.2026)
|
||||
|
||||
- Butonul `But_sterge1` (clasa `but_sterge`) șterge nota curentă = **perechea bază+TVA**, de pe
|
||||
oricare din cele două linii (`lnBaza = Recno() - Iif(Mod(Recno(),2)=0,1,0)`, apoi `Delete Next 2`).
|
||||
Dispatch-ul butonului trece prin `inainte_de_do_sterge`, condiționat de `lactiv4` — setat `.T.`
|
||||
în `Init`.
|
||||
- Ștergerea e **logică**, nu fizică: `SET DELETED ON` (roagest.prg:28) ascunde perechea din grid și
|
||||
din toate `Scan`/`Sum`-urile fluxului, iar Recno-urile rămase nu se schimbă → paritatea impar/par
|
||||
se păstrează (perechile se șterg mereu împreună, deci și `Skip`-urile peste liniile șterse cad
|
||||
corect). `Append Blank` ulterior continuă tot pe paritate corectă.
|
||||
- **Capcană generală VFP: niciodată `ZAP` (sau închidere/recreare) pe cursorul-sursă al unui
|
||||
grid** — Zap închide și recreează cursorul, grid-ul își pierde sursa și rămâne blank. Varianta
|
||||
„copiez rândurile rămase + Zap + Append la loc" e greșită exact din acest motiv.
|
||||
13
docs/flux-editare-vfp-text.md
Normal file
13
docs/flux-editare-vfp-text.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Editare .vcx/.scx pe text — parametri ROAGEST
|
||||
|
||||
Fluxul comun (pasi, capcane): `COMUN\docs\flux-editare-vfp-text.md`. Specific ROAGEST:
|
||||
|
||||
- `vcx2txt.ps1/txt2vcx.ps1 -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: `docs/diff_runda<N>_<subiect>.patch`
|
||||
- capcana `*m:` patita aici pe `import_adauga_factura.recalc_tva` (07.2026)
|
||||
- de ce nu se foloseste *Project > Build*: recompileaza toate `.vcx`/`.vct` din proiect (nu doar
|
||||
`.fxp`-urile, ignorate oricum de git/svn) — antetul (timestamp compilare) si posibil p-code-ul
|
||||
intern se rescriu si la librarii neatinse efectiv, aparand fals ca "modificate" in diff; de aici
|
||||
fluxul text->bin punctual pe binarul vizat (07.2026)
|
||||
24
docs/git-svn-crlf.md
Normal file
24
docs/git-svn-crlf.md
Normal file
@@ -0,0 +1,24 @@
|
||||
# Modificari fantoma git dupa svn update (CRLF)
|
||||
|
||||
Simptom: `git status` arata fisiere `.md`/`.pjx` ca modificate dupa `svn update`,
|
||||
desi continutul e identic.
|
||||
|
||||
Cauza: SVN scrie CRLF nativ si atinge mtime la fiecare update; `core.autocrlf=true`
|
||||
face git sa (re)verifice/converteasca EOL-urile si sa le raporteze ca dirty.
|
||||
|
||||
Fix (2026-07-15): `.gitattributes` cu `* -text` la radacina fiecarui repo (ROAGEST,
|
||||
COMUN, ROAAUTO, ROACONT, ROAIMOB, ROAACNPRO) — opreste normalizarea CRLF/LF a git,
|
||||
SVN ramane autoritatea EOL. Pe repo nou cu acelasi tipar svn+git, copiaza acelasi
|
||||
`.gitattributes`.
|
||||
|
||||
Capcana: `-text` opreste doar conversia *viitoare* — blob-urile deja in git (LF)
|
||||
tot difera de ce scrie SVN (CRLF), deci diferenta reala reapare o data. Fix unic:
|
||||
normalizat blob-urile la CRLF (`comun.git` fc11f3e), dupa care raman stabile.
|
||||
|
||||
Diagnostic rapid (fisier "murdar" fara motiv):
|
||||
```
|
||||
git hash-object <fisier>
|
||||
git ls-files -s <fisier> # compara sha cu cel de mai sus
|
||||
git update-index --refresh # sau git add <fisier> daca sha-urile sunt identice
|
||||
diff <(git show HEAD:<f> | tr -d '\r') <(tr -d '\r' < <f>) # confirma ca e doar CRLF/LF
|
||||
```
|
||||
37
docs/testare-vfp-mcp.md
Normal file
37
docs/testare-vfp-mcp.md
Normal file
@@ -0,0 +1,37 @@
|
||||
# Testare automata ROAGEST prin VFP IDE + MCP (windows-mcp)
|
||||
|
||||
Pentru verificare vizuala dupa modificari pe `.vc2`/`.sc2`, nu se porneste `roagest.exe`
|
||||
(ar cere rebuild complet — vezi `flux-editare-vfp-text.md`), ci se lanseaza `vfp9.exe`
|
||||
interpretat peste `Programe\roagest.prg`:
|
||||
|
||||
```powershell
|
||||
Start-Process -FilePath "C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe" `
|
||||
-ArgumentList '-c"D:\ROA\ROAGEST\config.fpw"','D:\ROA\ROAGEST\Programe\roagest.prg' `
|
||||
-WorkingDirectory "D:\ROA\ROAGEST"
|
||||
```
|
||||
|
||||
- Gate-ul de pornire (`gcNumeProgram = 'ROAGEST'` in `roagest.prg`) verifica
|
||||
`JUSTSTEM(SYS(16,0))` — numele programului de la nivelul 0 al stivei, nu numele
|
||||
procesului `.exe`. Rulat interpretat, `SYS(16,0)` = `roagest.prg`, deci gate-ul trece.
|
||||
- Fereastra rezultata are titlul `ROA - Gestiuni` (setat din `NUMEPROGRAM`).
|
||||
|
||||
## Capcana: focus furat de terminal
|
||||
|
||||
Daca sesiunea Claude Code afiseaza output in timp ce comanda de lansare ruleaza,
|
||||
fereastra terminalului/IDE-ului ramane in prim-plan si VFP porneste in fundal —
|
||||
`Screenshot`/`Snapshot` din `windows-mcp` pot raporta "No windows found" desi procesul
|
||||
si fereastra exista (verificabil cu `Get-Process vfp9 | Select MainWindowTitle`).
|
||||
|
||||
Fix: inainte de screenshot, adu explicit fereastra in prim-plan dupa titlu:
|
||||
|
||||
```
|
||||
mcp__windows-mcp__App mode=switch name="ROA - Gestiuni"
|
||||
```
|
||||
|
||||
apoi `Screenshot`. Nu te baza pe enumerarea implicita de ferestre a `windows-mcp` cand
|
||||
ai lansat procesul chiar in runda curenta de comenzi.
|
||||
|
||||
## Curatare dupa test
|
||||
|
||||
Proces de omorat la final: `mcp__windows-mcp__Process mode=kill pid=<pid>` (gasit prin
|
||||
`mode=list name=vfp9` sau `Get-Process vfp9`).
|
||||
Reference in New Issue
Block a user