Files
roafacturare/docs/cercetare/modifica_antet_bifa.md
Marius Mutu d9f5ca4226 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
2026-08-11 22:17:17 +03:00

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:

  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.