docs: planurile, proiectarile si rapoartele de lucru intra in versionare

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
This commit is contained in:
2026-08-11 22:17:17 +03:00
parent 40933df3c8
commit d9f5ca4226
145 changed files with 43431 additions and 0 deletions

View File

@@ -0,0 +1,193 @@
# 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.