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:
2026-07-16 11:37:36 +03:00
commit 34aed0c4d7
236 changed files with 145556 additions and 0 deletions

11
docs/README.md Normal file
View File

@@ -0,0 +1,11 @@
# Documentatie tehnica ROAIMOB
Notite concise despre structura interna a proiectului (fluxuri, pachete Oracle, 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.
- [flux-transformare-in-mf.md](flux-transformare-in-mf.md) — transformare imobilizare in curs -> imobilizare corporala/necorporala
- [pack_imob.md](pack_imob.md) — pachetul Oracle `pack_imob` (proceduri cheie)
- [tabele.md](tabele.md) — tabele/views `IMOB_*` relevante
## 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). Nu documenta ce oricine ar afla citind codul in 30 de secunde — scopul e sa scurtezi investigatii viitoare similare, nu sa duplici codul.

View File

@@ -0,0 +1,25 @@
# Flux: transformare imobilizare in curs -> imobilizare corporala/necorporala
Cod operatie 3 (vezi enum in `Programe/oproceduri_operatii.prg`).
## UI
- Punct de intrare: `Clase/oimobilizari.vcx`, clasa `frm_introducere`, metoda `inainte_de_do_termin`.
- Declansat cand `Thisform.ntipmodificare = 4`.
- Cursor `crslista3` contine imobilizarile in curs selectate pentru transformare (SCAN peste ele — se pot transforma mai multe simultan intr-un singur activ nou).
## Pasi per imobilizare in curs (in SCAN)
1. `pack_imob.adauga_mf(...)` — creeaza activul NOU (corporal/necorporal); genereaza si prima operatie a acestuia, cu `EXPLICATIA = "TRANSFORMARE IN MF"`.
2. `pack_imob.inreg_transformare_in_mf(...)` — "inchide" imobilizarea in curs veche (`v_id_mf`): actualizeaza `IMOB_NOM_MF`, adauga operatia `id_tip_operatie=3` pe activul vechi, leaga operatia noua de cea veche prin `pack_imob.adauga_la_transformare`.
## Legatura intre activul nou si cel vechi
- `IMOB_TRANSFORMARE_MF` (insert facut de `pack_imob.adauga_la_transformare`) tine perechea `id_mf_nou/id_operatie_nou` <-> `id_mf_vechi/id_operatie_vechi`.
- `inreg_transformare_in_mf` gaseste `id_operatie_nou` prin `select min(id_operatie_mf) from imob_operatii_mf where id_mf = v_id_mf_nou` — presupune ca operatia noua a fost deja inserata (pasul 1) inainte sa ruleze pasul 2. Ordinea pasilor in cod conteaza.
## Capcana descoperita (fix 08/07/2026, v2.1.43)
Valorile numerice mari (NRACT/NRDOC, coloane Oracle `NUMBER(20)`) trebuie convertite explicit cu `STR(x, 20)` cand se construieste SQL ca text (nu parametru legat `?var`). `STR(x)` fara lungime foloseste implicitul VFP (10) si trunchiaza/corupe cifrele — fara eroare vizibila, insertul reuseste cu valoare gresita.
Verifica toate apelurile `STR()`/`ALLTRIM(STR())` dintr-un bloc SQL nou, nu doar unul — e usor sa repari un apel si sa ratezi altul identic in acelasi bloc. Asa a fost bug-ul aici: in acelasi bloc din `inainte_de_do_termin`, doua din trei apeluri (`Str(m.pnnract,20)` pt. `adauga_mf`, `Str(nract,20)` pt. `v_nract`) erau corecte; al treilea (`Str(pnnract)`, pt. `v_nrdoc`) nu avea lungime specificata.

22
docs/pack_imob.md Normal file
View File

@@ -0,0 +1,22 @@
# Pachetul Oracle pack_imob
Sursa vendorizata local: `pack_imob.pck` (specific ROAIMOB, nu e in `COMUN`).
## Proceduri cheie observate
- `pack_imob.adauga_mf(...)` — creeaza o imobilizare noua (in curs/corporala/necorporala) in `IMOB_NOM_MF` + prima operatie in `IMOB_OPERATII_MF`.
- `pack_imob.inreg_transformare_in_mf(...)` — vezi [flux-transformare-in-mf.md](flux-transformare-in-mf.md).
- `pack_imob.add_operatie_mf(...)` — insert generic in `IMOB_OPERATII_MF`, folosit de mai multe fluxuri (majorare, reevaluare, transformare etc).
- `pack_imob.adauga_rata(...)` — genereaza/actualizeaza rata de amortizare asociata unei operatii.
- `pack_imob.adauga_la_transformare(...)` — leaga operatia activului nou de operatia activului vechi in `IMOB_TRANSFORMARE_MF`.
- `pack_imob.schimba_mf(...)` — folosit din fluxul "modificare cu istoric" (`frm_modificare`).
- `pack_imob.inreg_majorare` / `pack_imob.inreg_reevaluare` — apelate din `Programe/oproceduri_operatii.prg` (`op_majorare`, `op_reevaluare`).
## Observatie: doua stiluri de apel din VFP, riscuri diferite
In acelasi fisier (`Clase/oimobilizari.vcx`) coexista:
- **SQL construit prin concatenare de text** (`STR()`, `ALLTRIM()`, `Transform()`) — risc de trunchiere/formatare gresita daca nu esti atent la lungimi (vezi capcana STR() din flux-transformare-in-mf.md).
- **parametri legati** (`?variabila`) prin `goExecutor` — mai sigur, fara conversie manuala numar-in-text.
Cand cauti un bug de tipul "valoare corupta la salvare, fara eroare afisata", verifica intai daca apelul respectiv foloseste stilul text-concatenat.

18
docs/tabele.md Normal file
View File

@@ -0,0 +1,18 @@
# Tabele/views IMOB_* relevante
Schema Oracle e per companie (`gcS`, ex. `CONTAFIN`).
- `IMOB_NOM_MF` — nomenclator/master imobilizari (un rand per activ, indiferent de tip: in curs/corporal/necorporal).
- `IMOB_OPERATII_MF` — istoric operatii per activ. Coloane cheie: `ID_MF`, `ID_TIP_OPERATIE`, `VALOARE`, `VALOARE_RAMASA`, `NRDOC`, `DATADOC`, `EXPLICATIA`, `ID_OPERATIE_PREC` (operatia precedenta), `STERS`/`DATAORA_STERS` (soft delete).
- `IMOB_LISTA_MF` — lista curenta / gestiune (locatie, responsabil, sectie, sucursala), actualizata prin `pack_imob.add_in_lista_mf`.
- `IMOB_TRANSFORMARE_MF` — leaga operatia noului activ (dupa transformare in MF) de operatia activului in curs original. Vezi [flux-transformare-in-mf.md](flux-transformare-in-mf.md).
- `IMOB_BUNURICAPITAL` — bunuri de capital (relevant TVA/ajustare); expus si ca view `imob_vbunuricapital`.
- `IMOB_CONTURI` — mapare conturi contabile.
## Coduri operatie (`ID_TIP_OPERATIE`)
Acelasi enum ca in `Programe/oproceduri_operatii.prg`: 1 introducere, 2 preluare, 3 transformare in MF, 4 iesire din gestiune, 5 intrare in gestiune, 6 majorare, 7 reevaluare, 8 schimbare DNS, 9 recalculare cota, 10 conservare, 11 scoatere din conservare, 12 modificare cu istoric, 13 inchidere, 14 schimbare DNS + reevaluare.
## Coloane numerice mari
`NRACT`/`NRDOC` sunt `NUMBER(20)` — pot contine numere de document lungi. Orice cod VFP care le construieste prin `STR()` (concatenare text SQL, nu parametru legat) trebuie sa foloseasca explicit lungime 20, altfel trunchiaza silentios (vezi capcana in flux-transformare-in-mf.md).