feat(autopass): baseline transmitere operatii la RAR AUTOPASS (PRD ROAAUTO-1.0)
Baseline al muncii autopass acumulate (necomise pana acum) pe branch dedicat, ca sa existe git diff pentru commit-uri incrementale ulterioare. - oproceduri_autopass.prg: client HTTP + proceduri situatie/transmite/valideaza; fix parsare JSON array (detectie ALEN, iterare directa); GetProprietate fara EVL; fix 'held' numeric -> normalizare la logic inainte de IIF (AUTOPASS_SITUATIE). - frm_autopass.scx: formular US-002/US-005; caption succes "statusuri actualizate". - roaauto.prg: NFJSON in SET PATH + SET PROCEDURE proceduri autopass/nfjson. - ovariabile_globale.prg: scoate SET STEP ON ramas commis din greseala. - ofundal_dev.vcx: buton de deschidere a formularului autopass. - test_autopass_driver.prg: driver de test. - docs: reorg README (insight-uri transversale mutate in COMUN/docs/). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -13,4 +13,18 @@ Notițele sunt organizate pe fișiere separate, câte un subiect pe fișier (ex.
|
||||
|
||||
## Fișiere
|
||||
|
||||
- [cautare_vcx_vct.md](cautare_vcx_vct.md) — cum se caută cod în binarele `.vcx`/`.scx` (conversie text + grep pe cache)
|
||||
Insight-uri valabile doar pentru ROAAUTO stau aici. Insight-urile valabile pe orice proiect
|
||||
ROA* (convenții, capcane de tooling) stau în `COMUN/docs/` (repo separat, partajat) — vezi mai
|
||||
jos.
|
||||
|
||||
### Specifice ROAAUTO
|
||||
|
||||
(niciunul încă — primele insight-uri de proiect au fost, până acum, toate transversale și au
|
||||
migrat în `COMUN/docs/`)
|
||||
|
||||
### Partajate (COMUN/docs/, valabile pe toate proiectele ROA*)
|
||||
|
||||
- [cautare_vcx_vct.md](../COMUN/docs/cautare_vcx_vct.md) — cum se caută cod în binarele `.vcx`/`.scx` (conversie text + grep pe cache)
|
||||
- [conventie_encoding_cp1252.md](../COMUN/docs/conventie_encoding_cp1252.md) — capcană: editarea `.sc2`/`.vc2` cu encoding greșit corupe ireversibil diacriticele
|
||||
- [conventie_ux_formulare.md](../COMUN/docs/conventie_ux_formulare.md) — cum îi place lui Marius formatat un formular nou (grupare, spațiere, culoare = semnal)
|
||||
- [conventie_goexecutor_alter_table.md](../COMUN/docs/conventie_goexecutor_alter_table.md) — capcană: `ALTER TABLE` pe cursorul întors de `goExecutor.oExecute()` pică; include coloanele noi direct în SELECT
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
# 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).
|
||||
@@ -127,8 +127,8 @@ operatiile lor, **pentru ca** sa vad exact ce urmeaza sa se transmita.
|
||||
**pentru ca** transmiterea sa fie robusta si raspunsul parsabil.
|
||||
|
||||
- **Depinde de**: US-001
|
||||
- **Fisiere**: `Programe\oproceduri_autopass.prg` (clasa `AutopassClient`); vendored
|
||||
`nfjsoncreate.prg`/`nfjsonread.prg` in `comun_plugins\utils\` (sursa: `rar-autopass/legacy-vfp/` sau ROAPRELUARECONPRESS)
|
||||
- **Fisiere**: `Programe\oproceduri_autopass.prg` (clasa `AutopassClient`); biblioteca JSON
|
||||
`nfjsoncreate.prg`/`nfjsonread.prg` din `COMUN\utile\nfjson\`
|
||||
- **Acceptance criteria**:
|
||||
- [ ] POST via `winHTTP.winHTTPrequest.5.1` (pattern `D:\ROA\ems_trimite_facturi_spv.prg` → `SendeFactura`), headere `Content-Type: application/json` + `X-API-Key`, body UTF-8.
|
||||
- [ ] Body: `{"prezentari": [...], "rar_env": <din config, optional>}` — prestatii cu `cod_op_service` + `denumire` (maparea ramane in gateway); `raspuns` implicit `minim`.
|
||||
@@ -378,9 +378,17 @@ Decizii luate (fost intrebari 1-4):
|
||||
mediul RAR se editeaza direct din fereastra de transmitere (panou Configurare pliabil
|
||||
in `frm_autopass.scx`), nu dintr-o fereastra separata; salvarea trece prin
|
||||
`scrie_optiune()` (`autopass_salveaza_config`).
|
||||
9. **DECIS (revizie 2026-07-10, Marius)** — **normalizare NRINMAT aprobata**: eliminarea
|
||||
spatiilor, cratimelor si punctelor din numarul de inmatriculare inainte de validare se
|
||||
aplica consecvent pe cele 3 canale: gateway `rar-autopass` (validare + idempotency),
|
||||
clientul VFP (`autopass_valideaza_rand` din `oproceduri_autopass.prg`) si spike-ul SQL de
|
||||
calitate a datelor (`docs\spike_calitate_date_autopass_v2.sql`, versiune noua fata de
|
||||
spike-ul v1 rulat initial). Motivatie: spike-ul v1 a aratat doar 13,8% NRINMAT valide din
|
||||
cauza formatelor reale cu spatii/cratime (ex. "B 99 XYZ"), regula stricta anterioara
|
||||
(doar strip+upper) fiind prea restrictiva fata de datele istorice reale.
|
||||
|
||||
Nu mai exista intrebari deschise — PRD aprobat prin poarta /autoplan (2026-07-09),
|
||||
revizuit conform deciziilor 7-8.
|
||||
revizuit conform deciziilor 7-9 (decizia 9 e o completare post-aprobare, 2026-07-10).
|
||||
|
||||
## 7. Valuri de executie
|
||||
|
||||
@@ -557,5 +565,8 @@ nu se arunca.
|
||||
- **Revizie post-aprobare (2026-07-09, Marius)**: decizia 7 — zero tabele noi; US-001
|
||||
rescris pe tabelul `optiuni`, US-005 rescris pe situatia din gateway (cursor temporar);
|
||||
scripturile SQL revertate.
|
||||
- **Revizie post-aprobare (2026-07-10, Marius)**: decizia 9 — normalizare NRINMAT (strip
|
||||
spatii/cratime/puncte) aprobata pe cele 3 canale (gateway, client VFP, spike SQL v2);
|
||||
motivata de rata scazuta de valid (13,8%) gasita in spike-ul v1.
|
||||
|
||||
NO UNRESOLVED DECISIONS
|
||||
|
||||
Reference in New Issue
Block a user