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
10 KiB
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:
ct_clb_cautare(caut_ora.vc2:710, folosit deCt_clb_ruta/agent/delegat/masina/ clb_adresa_facturare) — aredo_activeaza()/do_dezactiveaza()(propertylactiv,caut_ora.vc2:780-806), dar acestea nu blocheaza textbox-ul (care e oricumReadOnly=.T.prin design — editarea se face doar prin popup de cautare, nu prin tastare directa), ci doar ascund iconita de cautare si tooltip-ul:Popup-ul se declanseaza doar dacaPROCEDURE do_dezactiveaza This.lactiv = .F. This.img_cautare.Visible = .F. ... ENDPROCThis.Parent.lactive adevarat (DblClick/KeyPress/img_cautare.Click, :819-844). Confirmat prin grep:do_activeaza/do_dezactiveazaNU sunt apelate nicaieri inofacturare_comun.vc2— deci infrm_modifica_facturaraman mereulactiv=.T.(valoarea implicita), adica mereu deblocate.clb_tx_data(lb_tx.vc2:461-548, container de camp-data cu buton calendar — NU e folosit infrm_modifica_factura, dar e "sora" aclb_tx_simpluin 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. ENDPROCclb_tx_simplu(lb_tx.vc2:551-585, chiar clasa folosita pentruClb_dataora_expinfrm_modifica_factura) — nu are nicio metodaactiveaza/dezactiveaza/reactiveaza(verificat prin grep pe intreg intervalul clasei).clb_serie_act(serii_numere.vc2:7, containerul dedicat seriei-numarului de document) — nu are nicio metodaactiveaza/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
ROAFACTURAREniciun formular existent care sa foloseasca o singura bifa pentru a debloca simultan tot un grup de campuri de antet (nu doarfrm_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 afaraROAFACTURARE\COMUN. - Comportamentul exact al
ReadOnly=.T.pect_clb_cautare.clb_tx_cautare.text_simplu1(adica daca userul poate edita manual textul candlactiv=.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 alefrm_modifica_factura, nu ascendenta completa.