Achizitie import unificata: documentatie si changelog (2.11.9)
- changelog 2.11.9 (achizitie import unificata, total/TVA automat, TVA pe conturile creditoare); todo actualizat - docs: flux-achizitie-import actualizat; testare-ui-vfp, testare-vfp-mcp si flux-editare-vfp-text mutate in COMUN\docs (general valabile pentru VFP); README fara mentiuni temporare (handoff) - CLAUDE.md / docs/CLAUDE.md: fluxul de editare text vcx/scx si modul de lucru Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019DGibQKa5uK4P2TNSFFQNh
This commit is contained in:
@@ -45,7 +45,7 @@ For `.vcx`/`.scx`, code edits no longer require the VFP IDE — the flow is now:
|
||||
3. Review the diff on the text file like any other source change.
|
||||
4. Write back with `txt2vcx.ps1` (`D:\ROA\UTIL\foxbin2prg\txt2vcx.ps1 -TextFile <path\to\file.vc2> -ProjectRoot 'D:\ROA\ROAGEST' -CacheRoot 'D:\ROA\_vfp_textcache\roagest'`) — it regenerates and recompiles the binary in a staging folder, fidelity-checks it against the edited text, then copies it into the project only if that check passes.
|
||||
|
||||
`.mnx`/`.frx` stay **read-only** in this flow (menus still need GENMENU in the IDE; reports are too fragile to round-trip) — edit those in the VFP IDE as before. Targets under `COMUN\` need `-AllowComun` plus explicit approval, since a change there affects every ROA app. See `D:\ROA\UTIL\foxbin2prg\CLAUDE.md` for full details, `COMUN\docs\flux-editare-vfp-text.md` for the shared per-round workflow (baseline backups, review patches, fidelity check), and `docs/flux-editare-vfp-text.md` for the ROAGEST-specific parameters.
|
||||
`.mnx`/`.frx` stay **read-only** in this flow (menus still need GENMENU in the IDE; reports are too fragile to round-trip) — edit those in the VFP IDE as before. Targets under `COMUN\` need `-AllowComun` plus explicit approval, since a change there affects every ROA app. See `D:\ROA\UTIL\foxbin2prg\CLAUDE.md` for full details and `COMUN\docs\flux-editare-vfp-text.md` for the shared per-round workflow (baseline backups, review patches, fidelity check) plus the per-project parameters (including ROAGEST's).
|
||||
|
||||
## The COMUN shared framework
|
||||
|
||||
@@ -116,6 +116,7 @@ Tags in use: `:nou:` (new feature), `:modificare:` (change), `:eroare:` (bug fix
|
||||
|
||||
Preferințele lui Marius pentru sesiunile pe acest proiect:
|
||||
|
||||
- **Orchestrare pe misiuni lungi**: niciodată un singur subagent care acumulează context pe multe sarcini înlănțuite — sesiunea principală orchestrează subagenți proaspeți per sarcină (prag: max ~200–250k tokens per subagent, apoi handoff + agent nou), cu handoff compact pe disc; regula comună tuturor proiectelor ROA: `COMUN\docs\orchestrare-subagenti.md`.
|
||||
- **Delegare**: modificările de cod de volum/rutină (aplicarea unei propuneri din `docs/propuneri_*.md`, editări pe cache-ul text + write-back, actualizări de documentație, rulări de teste) se deleagă către **subagenți Sonnet care lucrează în background** (team agents — Agent tool cu `model: sonnet`, lane-uri paralele unde e posibil), iar sesiunea principală doar orchestrează și monitorizează: împarte planul pe lane-uri, transmite constatările între agenți, verifică rezultatele (diff, teste, fidelity) și intervine direct doar la deblocări (procese agățate), decizii și verificări.
|
||||
- **Fără commit fără review**: nu da commit din proprie inițiativă pe modificări de cod — Marius vrea întâi să **vadă diff-ul**. Pentru binarele VFP (`.vcx`/`.scx`), diff-ul lizibil se face pe forma text: regenerează textul din binarul vechi (HEAD din git) cu `vcx2txt.ps1 -Source` și compară-l cu textul editat din cache (`git diff --no-index`). Commit doar după ce Marius confirmă pe diff.
|
||||
|
||||
|
||||
@@ -1,4 +1,13 @@
|
||||
<!--
|
||||
19/07/2026
|
||||
ROAGEST - 2.11.9
|
||||
|
||||
:modificare:
|
||||
Marfa > Achizitie import. Formularul de achizitie a fost imbunatatit prin unificarea celor doua formulare (note contabile si articole) intr-unul singur.
|
||||
La modificarea manuala a sumei unei note, totalul facturii se actualizeaza automat, iar TVA-ul nemanual se recalculeaza automat.
|
||||
TVA-ul se imparte pe conturile creditoare ale notelor (ex. baza 371=401 si 212=404 genereaza 4426=401 si 4426=404, proportional cu bazele); schimbarea contului creditor pe o nota muta si TVA-ul corespunzator.
|
||||
-->
|
||||
<!--
|
||||
15/07/2026
|
||||
ROAGEST - 2.11.8
|
||||
|
||||
|
||||
@@ -4,14 +4,19 @@
|
||||
|
||||
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`.
|
||||
patch de review, write-back cu fidelity-check) + capcanele + parametrii per proiect (inclusiv
|
||||
ROAGEST): **`COMUN\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.
|
||||
La propunere/plan: scaneaza intai conventiile si functiile/clasele COMUNE existente si
|
||||
foloseste-le cu prioritate (nu reinventa) - inventar compact: COMUN\docs\inventar-comun.md.
|
||||
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
|
||||
3. **Teste finale obligatorii pe cerința inițială** — regulă comună tuturor proiectelor VFP,
|
||||
pasul 6 din `COMUN\docs\flux-editare-vfp-text.md`; pe ROAGEST cu harness-ul din
|
||||
`COMUN\utile\Teste` (`COMUN\docs\testare-ui-vfp.md`).
|
||||
4. 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
|
||||
|
||||
@@ -6,12 +6,14 @@ Notite concise despre structura interna a proiectului (fluxuri, pachete, tabele)
|
||||
|
||||
- [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).
|
||||
Vezi si, in `COMUN\docs\` (instructiuni general valabile pentru proiectele VFP):
|
||||
`flux-editare-vfp-text.md` (fluxul de editare pe text .vc2/.sc2 — pasi per runda, capcane,
|
||||
parametri per proiect inclusiv ROAGEST), `testare-vfp-mcp.md` (testare vizuala prin vfp9.exe
|
||||
interpretat + windows-mcp), `testare-ui-vfp.md` (harness headless pentru teste UI pe o singura
|
||||
clasa, cu screenshots) si `oracle_export.md` (export surse PL/SQL, PACK_CONTAFIN.pck).
|
||||
|
||||
## Cand actualizezi
|
||||
|
||||
|
||||
@@ -99,7 +99,52 @@ Avertismente: atinge `COMUN` (blast radius: 22 `.pjx` referă `ointroduceri`) ș
|
||||
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)
|
||||
## Model curent `import_nota` (după rundele 8–12, 07.2026, necomis)
|
||||
|
||||
- **`doc_key` e unic per document**: prefix `nr_doc` (contor intern) + câmpurile de business
|
||||
(`calc_doc_key`). Rândul T al unei facturi cu TVA pe DVI poartă câmpurile vamei
|
||||
(partener/nract/4426) dar **păstrează doc_key-ul facturii-mamă** — identitatea nu se mai
|
||||
amestecă între documentele care partajează același nr. DVI (cauza istorică a: explicație TVA
|
||||
scrisă pe T-ul altui document, suma T=0, ștergere în grup, propagare `copiaza_valoare` între
|
||||
documente străine).
|
||||
- **Spargerea principalei** (`sparge_document`/`creeaza_rand_s`): grupare `rul_temp` pe
|
||||
`cont+acont`; analiticul articolului merge direct în `ascd` al rândului S (fallback
|
||||
`assign_analitic` doar când nu e furnizat).
|
||||
- **Procentele per rând** (`explicatia4`/`explicatia5` = coloanele "Procent lei/valuta"): scrise
|
||||
de `sincronizeaza()` după spargere (nu de `do_executa`, care nu mai scrie procente), numitor =
|
||||
baza documentului principal (`This.nbazaprincipala_lei/_val`, calculate în `recalculeaza`).
|
||||
Principala = 100.00; celelalte = pondere lei și valută (convertit la `oact.Curs` dacă e în lei).
|
||||
- **Ștergere/copiere**: `do_sterge` = meniu Da(document, pe doc_key)/Nu(doar linia)/Cancel;
|
||||
`do_copiaza_nota` (buton „Copiază") = același meniu; copiază doar B+T cu `nr_doc`/`doc_key`
|
||||
noi (S/D se regenerează la sincronizare). Capcană rezolvată acolo: `Calculate` mută pointerul
|
||||
la EOF → poziția sursă se salvează/restaurează înainte de `Scatter`.
|
||||
- **Rândul TOTAL** de sub grila notelor: `TxtFtvaLei`/`TxtFtvaVal` (fără TVA) lângă
|
||||
`Text2`/`Text3` (cu TVA), setate în `actualizeaza_banda`.
|
||||
- **Test e2e de referință**: `COMUN\utile\Teste\test_scenariu_dvi_complet.prg` (scenariul complet
|
||||
cu 3 documente pe același DVI + articole 212/1 și 371/4 + ștergere/copiere).
|
||||
- **Valori manuale protejate (r16)**: `mod_manual=1` se setează și pe rândul T (Valid-urile
|
||||
`cSuma`/`cSumaVal`); `do_executa` nu rescrie T manual, `sparge_document` nu-l șterge și nu
|
||||
creează duplicat pe aceeași cotă (`ptva`). Nimic nu resetează `mod_manual` pe rând existent.
|
||||
- **`nOldVal` unic (r15)**: o singură proprietate pentru valoarea la intrarea în celulă
|
||||
(GotFocus) — Valid/LostFocus ies devreme la valoare nemodificată (`cSuma`, `cSumaVal`,
|
||||
`cCotaTva`, `cPretFactura`). `do_calculeaza_diferente` restaurează poziția `rul_temp` de la
|
||||
intrarea în procedură (`tnRecNo` nu mai poziționează); `do_reface` repoziționează explicit.
|
||||
- **Totaluri articole (r17)**: `_grdfooter1` (clasa `_grdfooter` din `_grd_base.vcx`) atașat la
|
||||
`GridArt` la finalul `Init`; sume pe `cValoareValutaFactura`/`cValoareValutaCalculat`/
|
||||
`cValoareLeiCalculat` din `rul_temp`, recalculate în `actualizeaza_banda` +
|
||||
`do_calculeaza_diferente`. Vechile `Clb_leiftva/leitva/valftva/valtva` (dublau totalurile
|
||||
notelor) au fost eliminate de pe `import_nota`. Totalurile de sub grila notelor rămân din
|
||||
`introdc`; Diferențe lei = bază note − Σ articole.
|
||||
- **Test scenariul TVA manual + footer**: `COMUN\utile\Teste\test_manual_tva_footer.prg`.
|
||||
- **TVA pe creditori și la secundare (r30)**: `sparge_document` regrupează T-urile nemanuale ale
|
||||
documentelor secundare pe creditorii (scc/ascc) rândurilor S proprii, proporțional cu sumele S
|
||||
(conservă totalul T, inclusiv TVA tastat la DVI); `recalc_tva_document` aplică aceeași pondere
|
||||
(fără S-uri: împărțire egală 1/N); `uneste_document` reunește T-urile sparte când documentul
|
||||
revine la B. Armarea resincronizării din `cScc/cAscc.Valid` se face pe garda `nOldVal` (nu pe
|
||||
comparația cu câmpul — grila poate scrie câmpul înaintea Valid-ului, ex. Enter) + gardă `lInSync`
|
||||
contra Valid-urilor re-declanșate de regenerare. Test: `COMUN\utile\Teste\test_tva_secundare.prg`.
|
||||
|
||||
## Ștergere note — model istoric pe paritate (înlocuit de rundele de mai sus)
|
||||
|
||||
- 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`).
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
# 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)
|
||||
@@ -1,37 +0,0 @@
|
||||
# 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`).
|
||||
8
todo.txt
8
todo.txt
@@ -35,3 +35,11 @@ dialog "Adauga factura": mod editare ("Modifica factura..." - dublu-click pe per
|
||||
linia de totaluri per document sub grila import_nota (M5 din propuneri_ergonomie_import.md - vezi istoricul git; semafor echilibru lei<->valuta si TVA=baza x cota)
|
||||
preluare automata antet factura din e-Factura/XLS in dialogul de import (do_adauga_factura(toDlg) e deja populabil programatic)
|
||||
persistenta draft la crash intre nota si articole (re-intrarea e tratata; draft-ul e alt proiect)
|
||||
|
||||
* 16.07.2026 - import unificat (din review docs/propuneri_import_unificat.md):
|
||||
import unificat - navigare incrucisata rand S -> filtrare grila articole (E3, amanat)
|
||||
import unificat - copiere repartizare din NIR precedent al furnizorului (E6, amanat)
|
||||
import unificat - preview tiparit al notei inainte de salvare (E7, amanat)
|
||||
import unificat - persistenta pozitiei splitterului per user (amanat)
|
||||
import unificat - dupa 1-2 luni de productie: stergere clase moarte import_nir si import_nota_original din ointroduceri.vcx (F6)
|
||||
import unificat v2 - id_fact per articol + extinderea modelului B/S/T/D la NIR-ul intern clasic
|
||||
|
||||
Reference in New Issue
Block a user