# 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.
