# Cercetare: bifa de deblocare campuri in formularul actual de modificare antet Sursa: cache text `.vc2` (deja la zi in acest working copy) din `COMUN\clase\`. Investigatie read-only, fara editare de cod. ## 1. Localizarea clasei `frm_modifica_factura` **Concluzie**: Clasa e definita in `COMUN\clase\ofacturare_comun.vc2:5262-5774` (`DEFINE CLASS frm_modifica_factura AS frm_termin_renunt OF "_frm_child.vcx"`), formular modal mic (Width=613, Height=412), deschis din `frm_facturi.do_modifica` (`ofacturare_comun.vc2:4538-4637`, `Createobject("frm_modifica_factura", ...)` la linia 4588). Ancestor chain: `frm_modifica_factura -> frm_termin_renunt -> _frm_child.vcx`. **Dovezi** — lista completa a controalelor proprii (nume / clasa-baza / caption sau control source): | Control | Clasa | Caption / rol | Linie | |---|---|---|---| | `Ct_clb_ruta` | `ct_clb_cautare` (caut_ora.vcx) | "Ruta" | 5510 | | `Ct_clb_agent` | `ct_clb_cautare` | "Agent" | 5455 | | `Ct_clb_delegat` | `ct_clb_cautare` | "Delegat" | 5473 | | `Ct_clb_masina` | `ct_clb_cautare` | "Masina" | 5491 | | `clb_adresa_facturare` | `ct_clb_cautare` | "Adresa facturare" | 5418 | | `Clb_dataora_exp` | `clb_tx_simplu` (lb_tx.vcx) | "Data si ora expedierii", `poRec.dataora_exp` | 5437 | | `shpTipFactura` / `lblTipFactura` / `cboTipFactura` | shape / label / `_combobox` | "Tip factura", `poRec.tip_saft` (vizibil doar daca `gl406`) | 5335, 5553, 5562 | | `chkDetaliat` | `_checkbox` | "Listare detaliata", `poRec.listare_detaliata` | 5379 | | `Ed_tx_simplu1` | `ed_tx_simplu` (lb_tx.vcx) | "Text aditional...", `poRec.text_aditional` | 5528 | | `chkSerieAct` | `_checkbox` | "Serie factura", `Enabled=.F.` implicit | 5405 | | `chkNrAct` | `_checkbox` | "Numar factura", `Enabled=.F.` implicit | 5392 | | `chkDataAct` | `_checkbox` | "Data factura", `Enabled=.F.` implicit | 5353 | | `chkDataScad` | `_checkbox` | "Data scadenta", `Enabled=.F.` implicit | 5366 | | `txtSerieAct` | `_textbox` | `poRec.serie_act`, `Enabled=.F.` implicit | 5605 | | `txtNrAct` | `_textbox` | `poRec.numar_act`, `Enabled=.F.` implicit | 5594 | | `txtDataAct` | `_textbox` | `poRec.data_act`, `Enabled=.F.` implicit | 5572 | | `txtDataScad` | `_textbox` | `poRec.data_scad`, `Enabled=.F.` implicit | 5583 | | `BUT_TERMIN1` / `But_renunt1` | din `frm_termin_renunt` | Terminat / Renunta | 5322, 5328 | | `Lb_titlu_alb_b121` | label titlu | "Modifica date factura" | 5318 | ## 2. Bifa de deblocare a campurilor **Concluzie: NU exista o singura bifa care sa activeze/dezactiveze tot antetul.** Ceea ce exista e altceva: **4 checkbox-uri separate**, cate unul pentru fiecare camp "act" (serie/numar/data factura + data scadenta), fiecare deblocand DOAR campul lui propriu, si toate 4 pornesc ele insele dezactivate (`Enabled=.F.`) daca factura nu are deja un "act" atasat. Toate celelalte campuri (ruta, delegat, agent, masina, adresa, data/ora expeditie, tip factura, listare detaliata, text aditional) **nu sunt blocate deloc** — sunt mereu editabile, fara nicio bifa. **Dovezi**: `Init` (`ofacturare_comun.vc2:5736-5750`): ``` this.chkSerieAct.Enabled = !EMPTY(NVL(poRec.numar_act,0)) this.chkNrAct.Enabled = !EMPTY(NVL(poRec.numar_act,0)) this.chkDataAct.Enabled = !EMPTY(NVL(poRec.numar_act,0)) this.chkDataScad.Enabled = !EMPTY(NVL(poRec.numar_act,0)) ``` adica cele 4 checkbox-uri sunt ele insele clickabile doar daca factura are deja `numar_act` completat (act existent); altfel raman gri, nefolosibile. Handlerele lor (`:5758-5772`), fiecare cuplat 1-la-1 cu textbox-ul corespunzator: ``` PROCEDURE chkDataAct.Valid thisform.txtDataAct.Enabled = this.Value ENDPROC PROCEDURE chkDataScad.Click thisform.txtDataScad.Enabled = this.Value ENDPROC PROCEDURE chkNrAct.Valid thisform.txtNrAct.Enabled = this.Value ENDPROC PROCEDURE chkSerieAct.Valid thisform.txtSerieAct.Enabled = this.Value ENDPROC ``` Nu apeleaza `.activeaza()`/`.dezactiveaza()` pe niciun container — seteaza direct `Enabled = this.Value` pe textbox-ul propriu. Nu exista alt mecanism de blocare (nu se apeleaza `dezactiveaza()` in `Init` pe vreun container din formular — vezi punctul 5). ## 3. Campuri sub bifa vs. campuri libere **Concluzie**: singurele campuri gatate sunt cele 4 legate de documentul "act" (justificativ): serie act, numar act, data act, data scadenta. Serie/numar **ale facturii insesi** nu sunt pe acest formular deloc (se aloca ireversibil la emitere, prin `poGeneratorNumere`, in afara acestui flux). Delegat/agent/masina/ruta/adresa sunt tratate identic intre ele — toate prin containere `ct_clb_cautare` fara nicio gata de `Enabled`/`ReadOnly` proprie in acest formular. **Dovezi**: vezi tabelul de la punctul 1 — coloana "Caption / rol" arata `Enabled=.F.` explicit doar pe cele 4 perechi checkbox+textbox de "act"; niciun `Enabled=.F.` sau apel de dezactivare pe `Ct_clb_ruta`/`Ct_clb_agent`/`Ct_clb_delegat`/`Ct_clb_masina`/`clb_adresa_facturare`/ `Clb_dataora_exp`/`chkDetaliat`/`Ed_tx_simplu1`/`cboTipFactura`. ## 4. Calea de salvare **Concluzie**: la `Terminat` (`gnButon=1`), se apeleaza **`pack_facturare.modifica_date_factura`** o data pentru fiecare factura selectata, cu 14 parametri — toti metadate de antet/logistica, deci salvarea antetului e **complet independenta de articole/note contabile**: nu exista in `do_modifica` niciun apel spre `oscrie_in_fisiere`, `pack_contafin`, sau vreun cursor de articole. **Dovezi** (`ofacturare_comun.vc2:4587-4630`, `do_modifica` pe `frm_facturi`): ``` If poRec.sters = 0 AND NVL(m.pnEFactura,0) = 0 ofrmmodificare = Createobject("frm_modifica_factura", ...) ofrmmodificare.Show(1) ... If gnButon = 1 ... Scan For &lcFiltru TEXT TO lcSql NOSHOW TEXTMERGE begin pack_facturare.modifica_date_factura(<<...id_vanzare...>>, <<...id_ruta...>>, <<...id_delegat...>>, <<...id_agent...>>, <<...id_masina...>>, to_date('<>','YYYYMMDDHH24:MI:SS'), <<...id_facturare...>>, <<...listare_detaliata...>>, ?poRec.text_aditional, ?poRec.tip_saft, ?poRec.efactura, ?poRec.data_act, ?poRec.data_scad, ?poRec.numar_act, ?poRec.serie_act); end; ENDTEXT lnSucces = goExecutor.oExecute(lcSql) ENDSCAN Endif Else amessagebox("Nu puteti face modificari pe inregistrarile sterse sau facturile trimise in eFactura!", 48, "Atentie") Endif ``` Garda de intrare (poate edita doar daca nu e stearsa si nu e in eFactura) e la linia 4587, verificarea `anaf_efactura` la 4583-4585. Se poate confirma direct din semnatura RPC-ului (`id_vanzare, id_ruta, id_delegat, id_agent, id_masina, dataora_exp, id_facturare, listare_detaliata, text_aditional, tip_saft, efactura, data_act, data_scad, numar_act, serie_act`) ca nu exista niciun parametru de articol/nota — deci da, **antetul se salveaza singur, fara sa atinga restul documentului**. ## 5. Conventia de containere blocabile in suita (`clb_*`/`ct_clb_*`) **Concluzie**: conventia exista, dar **e inconsistenta intre clase si niciuna din variantele cu adevarat blocante nu e folosita in `frm_modifica_factura`**. Trei situatii diferite gasite: 1. **`ct_clb_cautare`** (`caut_ora.vc2:710`, folosit de `Ct_clb_ruta/agent/delegat/masina/ clb_adresa_facturare`) — are `do_activeaza()`/`do_dezactiveaza()` (property `lactiv`, `caut_ora.vc2:780-806`), dar acestea **nu blocheaza textbox-ul** (care e oricum `ReadOnly=.T.` prin design — editarea se face doar prin popup de cautare, nu prin tastare directa), ci doar ascund iconita de cautare si tooltip-ul: ``` PROCEDURE do_dezactiveaza This.lactiv = .F. This.img_cautare.Visible = .F. ... ENDPROC ``` Popup-ul se declanseaza doar daca `This.Parent.lactiv` e adevarat (`DblClick`/`KeyPress`/ `img_cautare.Click`, :819-844). **Confirmat prin grep: `do_activeaza`/`do_dezactiveaza` NU sunt apelate nicaieri in `ofacturare_comun.vc2`** — deci in `frm_modifica_factura` raman mereu `lactiv=.T.` (valoarea implicita), adica mereu deblocate. 2. **`clb_tx_data`** (`lb_tx.vc2:461-548`, container de camp-data cu buton calendar — NU e folosit in `frm_modifica_factura`, dar e "sora" a `clb_tx_simplu` in aceeasi biblioteca) — are metodele care fac chiar ce cere Marius: `dezactiveaza()`/`reactiveaza()` (`lb_tx.vc2:521-538`): ``` PROCEDURE dezactiveaza This.text_simplu1.ReadOnly = .T. This.text_simplu1.TabStop =.F. This.cmd_buton1.Enabled = .F. ENDPROC PROCEDURE reactiveaza This.text_simplu1.ReadOnly = .F. This.text_simplu1.TabStop =.T. This.cmd_buton1.Enabled = .T. ENDPROC ``` 3. **`clb_tx_simplu`** (`lb_tx.vc2:551-585`, chiar clasa folosita pentru `Clb_dataora_exp` in `frm_modifica_factura`) — **nu are nicio metoda `activeaza`/`dezactiveaza`/`reactiveaza`** (verificat prin grep pe intreg intervalul clasei). 4. **`clb_serie_act`** (`serii_numere.vc2:7`, containerul dedicat seriei-numarului de document) — **nu are nicio metoda `activeaza`/`dezactiveaza`** (grep negativ pe tot fisierul). Deci: mecanismul "blocheaza antetul, deblocheaza-l la bifa" **NU exista gata-facut la nivel de container** pentru containerele efectiv folosite in `frm_modifica_factura`. Ce exista deja, gata de reutilizat ca tipar (nu ca apel direct), e reteta din `clb_tx_data.dezactiveaza()/reactiveaza()` (punctul 2 de mai sus, ReadOnly+TabStop+buton) — si tiparul checkbox-pe-camp deja folosit chiar in `frm_modifica_factura` pentru cele 4 campuri "act" (`Enabled = this.Value` pe `Valid`/`Click`, punctul 2 de mai sus). ## Necunoscute ramase - Nu am gasit in `ROAFACTURARE` niciun formular existent care sa foloseasca o **singura** bifa pentru a debloca simultan tot un grup de campuri de antet (nu doar `frm_modifica_factura`) — posibil exista un asemenea tipar in alt produs ROA (ROAGEST/ROACONT) sau in alta clasa ne-cautata aici; nu am extins cautarea in afara `ROAFACTURARE\COMUN`. - Comportamentul exact al `ReadOnly=.T.` pe `ct_clb_cautare.clb_tx_cautare.text_simplu1` (adica daca userul poate edita manual textul cand `lactiv=.F.`, sau doar iconita dispare) nu a fost testat vizual/headless, doar dedus din cod. - Nu am verificat daca exista vreo diferenta de comportament la nivel de `_frm_child.vcx` / `frm_termin_renunt` (clasele parinte) care ar putea injecta alt mecanism de blocare — am citit doar metodele proprii ale `frm_modifica_factura`, nu ascendenta completa.