Files
roafacturare/docs/sabloane/README_sablon_vcx.md
Marius Mutu 104c24ec20 #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Cod: clasa noua ofacturare_util (geometrie si utilitare de formular), inrolata in
roafacturare.prg; meniul "Facturare (nou)" plat, cu reparatia literalului peste
limita VFP de 255 de caractere care impiedica compilarea metodei.

Livrare: changelog 2.11.19, marcajul de versiune DB pentru scripturile finale din
SCRIPTURI_CLAR\2026\09, inventarul livrarii in docs/livrare_13.md si registrul de
erori deschise. Documentatia de lucru a etapei (cercetare, rapoarte, handoff-uri,
snapshot-uri de scripturi si backup-uri de rollback) a fost scoasa din arbore.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:30:51 +03:00

151 lines
7.2 KiB
Markdown

# Sablon `.vc2` gol — pornire pentru o biblioteca de clase noua
`sablon_vcx_gol.vc2` e punctul de plecare cand trebuie creata o biblioteca `.vcx` noua in
proiect. Exista pentru ca `txt2vcx.ps1` **refuza permanent** sa creeze un binar `.vcx`
inexistent (`txt2vcx.ps1:203-206`, garda nu verifica provenienta binarului, doar existenta lui) —
deci fluxul text->binar nu poate produce singur un `.vcx` nou de la zero. Solutia e sa pornesti
de la un binar-purtator **copiat**, peste care aplici acest text.
Continut: antetul FoxBin2Prg (6 linii, obligatoriu identic) + **o singura clasa-exemplu
minimala** (`AS custom`, fara obiecte-copil). Am ales varianta cu o clasa, nu biblioteca goala
de-a dreptul, pentru ca n-am gasit nicaieri in proiect un `.vcx` cu 0 clase de folosit ca
referinta si n-am vrut sa presupun formatul text al unei biblioteci goale fara sa-l vad — o clasa
`custom` fara copii insa exista deja ca tipar verificat (`COMUN\clase\_baza.vc2:114-121`, clasa
`_custom`) si a fost **confirmata printr-un test complet text->binar->text in izolare** (vezi mai
jos), deci e alegerea provata, nu doar plauzibila.
## Procedura, pas cu pas
### 1. Alege binarul-purtator
Trebuie sa fie o pereche `.vcx` + `.vct` **existenta** (ambele — `.vct` e memo-ul cu proprietatile
lungi/codul; fara el binarul nu se deschide). Nu presupune care e cea mai mica — verifica:
```
ls -la Clase/*.vcx Clase/*.vct
```
Alege perechea cu cel mai mic `.vcx`. Nu conteaza ce clase contine acum — le stergi la pasul 3.
### 2. Copiaza si redenumeste
```
cp Clase/<sursa>.vcx Clase/<nume_nou>.vcx
cp Clase/<sursa>.vct Clase/<nume_nou>.vct
```
Ambele comenzi, nu doar `.vcx` — un `.vcx` fara `.vct` pereche e un binar corupt pentru VFP.
### 3. Aplica sablonul si inlocuieste
```
cp docs/sabloane/sablon_vcx_gol.vc2 Clase/<nume_nou>.vc2
```
In fisierul copiat, inlocuieste **toate** aparitiile:
- `SourceFile="__NUME_BIBLIOTECA__.vcx"` -> `SourceFile="<nume_nou>.vcx"` (trebuie sa fie
exact numele fisierului `.vcx` de la pasul 2, cu tot cu extensie).
- `DEFINE CLASS __NumeClasaExemplu__ AS custom` -> numele si clasa-parinte reala dorita. Poti
schimba si baseclass-ul (`AS custom` -> ex. `AS _frmbase OF "_frm_base.vcx"` pentru un formular)
si adauga `ADD OBJECT` / metode dupa nevoie — respecta constrangerile de mai jos.
- `Name = "__NumeClasaExemplu__"` (in blocul `*<PropValue>`) -> **acelasi** nume ca la
`DEFINE CLASS`, cele doua trebuie sa coincida.
Spre deosebire de fluxul folosit la crearea lui `Clase\ofacturare_util.vcx`
(`docs\nota_s8b_vcx_util.md`), care a luat antetul dintr-o conversie reala ca sa nu-l inventeze,
**antetul acestui sablon e deja verificat printr-un test text->binar->text complet** (mai jos) —
nu mai trebuie reconfirmat printr-o conversie separata inainte de folosire, doar `SourceFile`
trebuie sa corespunda numelui ales la pasul 2.
### 4. Write-back
```
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\txt2vcx.ps1 `
-TextFile 'D:\ROA\ROAFACTURARE\Clase\<nume_nou>.vc2' `
-ProjectRoot D:\ROA\ROAFACTURARE -CacheRoot D:\ROA\ROAFACTURARE
```
Fara `-Force`, fara `-NoVerify` (fidelity check-ul trebuie sa treaca real). Adauga
`-AllowComun` **doar** daca `<nume_nou>.vcx` ajunge sub `COMUN\`.
### 5. Dovada de sincronizare — pe continut, nu pe mtime
`txt2vcx.ps1` rescrie mtime-ul textului la refresh de cache, deci mtime-ul egal nu dovedeste
nimic. Reconverteste binarul proaspat scris intr-un cache **izolat** (diferit de `ProjectRoot`,
altfel `vcx2txt.ps1` isi poate sterge singur binarul sursa — vezi capcana documentata in
`docs\nota_s8b_vcx_util.md`, sectiunea "Conversie text") si compara pe octeti:
```
powershell -ExecutionPolicy Bypass -File D:\ROA\UTIL\foxbin2prg\vcx2txt.ps1 `
-Source 'D:\ROA\ROAFACTURARE\Clase\<nume_nou>.vcx' `
-ProjectRoot D:\ROA\ROAFACTURARE -CacheRoot '<cale_temporara_izolata>'
diff Clase/<nume_nou>.vc2 <cale_temporara_izolata>/Clase/<nume_nou>.vc2
```
Zero diferente = dovada reala. Orice diferenta inseamna ca binarul din proiect nu reflecta
textul din arbore.
### 6. Verificari de integritate
```
grep -c 'ADD OBJECT' Clase/<nume_nou>.vc2
grep -c 'OBJECTDATA:' Clase/<nume_nou>.vc2
```
Trebuie sa fie **egale**. Pentru CRLF si diacritice, vezi `COMUN\docs\flux-editare-vfp-text.md`
si memoria de proiect despre editarea `.vc2` in cp1250 (`Edit`/`sed -i` corup octetii non-ASCII —
scrie orice modificare text cu un script Python pe disc, `latin-1`/`cp1250` passthrough, CRLF
explicit, niciodata `sed -i` sau `python -c`).
### 7. `.pjx` ramane manual
`.pjx` nu e editabil din text (cf. `CLAUDE.md` proiect). `Clase\<nume_nou>.vcx` trebuie adaugat
manual in `roafacturare.pjx` (Project Manager > Classes > Add) — dar **doar** cand ai nevoie de
Build/Rebuild pentru EXE. Nu e necesar pentru o proba cu `vfp9.exe` + `DO roafacturare.prg`, unde
`SET CLASSLIB` (pasul 8) rezolva clasa prin `SET PATH`.
### 8. Inregistrare in `roafacturare.prg`
Biblioteca trebuie inregistrata ca sa fie vazuta de aplicatie. Exemplu deja existent in fisier,
langa care se adauga o linie similara pentru biblioteca noua (`Programe\roafacturare.prg:137-139`):
```
SET CLASSLIB TO ocriterii.vcx ADDITIVE
SET CLASSLIB TO ofacturare_util.vcx ADDITIVE
Set Classlib To ctl32_statusbar.vcx Additive
```
`Clase\` e deja pe `SET PATH` (`Programe\roafacturare.prg:89`), deci fara cale completa. Aceasta
editare **nu e facuta automat de acest sablon** — se face separat, cu aprobare, cand biblioteca
noua chiar trebuie incarcata de aplicatie.
## Constrangeri FoxBin2Prg de retinut (au picat fidelity check-ul in trecut)
- `ADD OBJECT` la nivelul unei clase sunt ordonate **ASCII/colationat case-insensitive** pe
`ObjPath` (ex. `Cw10` intre `Cw1` si `Cw2`), inclusiv obiectele de top-nivel.
- Proprietatile in interiorul unui bloc `ADD OBJECT` / `*<PropValue>` sunt in **ordine
alfabetica**.
- **Ultima proprietate dintr-un bloc nu are `, ;`** la final (vezi ultima linie din blocul
`ADD OBJECT` din sablon — n-are virgula).
- Numarul de `ADD OBJECT` == numarul de `*< OBJECTDATA:` (0 = 0 in sablonul de baza).
- Liniile goale din corpul unui `PROCEDURE`/inainte de un `PROCEDURE` la nivel de clasa se
indenteaza cu un TAB; liniile goale **dintre blocuri `ADD OBJECT` consecutive** raman
neindentate (verificat direct pe text regenerat, `docs\nota_s8b_vcx_util.md` punctul 3).
- Encoding **cp1250** pentru diacritice, CRLF (`\r\n`) pe fiecare linie, inclusiv ultima
(`ENDDEFINE\r\n`, fara linie goala dupa la finalul fisierului).
## Ce s-a probat si cum
Test complet text -> binar -> text, **izolat in scratchpad**, fara sa atinga arborele
`D:\ROA\ROAFACTURARE`: copiat un binar-purtator existent intr-un proiect-fals in scratchpad,
aplicat sablonul (cu `SourceFile`/nume de clasa concrete), rulat `txt2vcx.ps1` cu
`-ProjectRoot`/`-CacheRoot` catre acel proiect-fals — **fidelity check trecut din prima
incercare** (spre deosebire de `frm_cursuri_valutare`, care a avut nevoie de 3 corectii). Apoi
reconvertit binarul proaspat cu `vcx2txt.ps1` intr-un cache izolat separat si comparat cu
`diff` — **zero diferente**. Detalii complete si comenzile exacte: `docs\nota_s8b_sablon_vc2.md`.
**Neprobat**: adaugarea in `.pjx` si deschiderea reala in designer/rulare (pasii 7-8 raman
descrisi, nu executati — n-ar fi trebuit sa atinga arborele real fara aprobare).