Folderul docs\ era pana acum in afara oricarui control de versiuni - nici git, nici SVN - desi contine planurile pe puncte, proiectarile si rapoartele de cercetare pe care se sprijina modificarile din cod. O stergere acolo era definitiva. Fisierele intermediare (handoff-uri intre sesiuni, diff-uri deja aplicate) au fost sterse inainte, nu versionate: ce era durabil in ele a intrat in antetele fisierelor de test la care se refereau. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
194 lines
10 KiB
Markdown
194 lines
10 KiB
Markdown
# 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('<<TTOC(poRec.dataora_exp,1)>>','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.
|