Files
roafacturare/docs/cercetare/rec_r6_meniu_editare_factura.md
Marius Mutu ca3c5d7eea docs: runda 6 - cercetari, propuneri si conventia mediului Oracle
Cercetarile si propunerile rundelor 4-6 pe editarea facturii emise. Starea
rundei 6 si ce s-a stabilit intra in progres.md.

Nou: docs/conventii_mediu_oracle.md - pe dev/test se lucreaza numai cu
ROA_CENTRAL si schemele CONTAFIN_ORACLE si MARIUSM_AUTO; schema ACN nu se
foloseste. Scripturile de pachet sunt necalificate, deci schema tinta o
decide sirul de conectare, nu fisierul.

roafacturare.pj2 regenerat de git_sync.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013gYCNE26G1G7UoGu2ju7aS
2026-08-20 16:35:03 +03:00

14 KiB

Cercetare: eticheta care duce la editarea facturii emise

Sarcina: gasirea locului (locurilor) unde apare textul care duce la editarea facturii emise (formularul frm_modific2024, COMUN\clase\omodificari.vc2), pentru a evalua propunerea utilizatorului de a-l redenumi in "editare factura (note, rulaje, articole)".

Concluzie scurta: nu exista un bar de meniu .mnx clasic cu acest text. Punctul real de intrare e un popup dinamic construit din xmenu(...) intr-un fisier .vc2 (deci write-back-abil prin txt2vcx.ps1, nu editare manuala in IDE cum s-a presupus initial in brief). Vezi punctul C pentru corectia asta.


A. Toate locurile unde apare eticheta / unde s-ar putea afla

Cautari facute (rezultate zero pentru textul cerut in .mnx/.mn2):

  • grep -in "modific\|editeaz\|editare" Meniuri\vanzare1.mn2 ... vanzare5.mn2 -> zero hit-uri.
  • grep -ln "modific\|editeaz\|editare" Meniuri\*.mn2 COMUN\meniuri\*.mn2 -> doar Meniuri\model.mn2 si Meniuri\roafacturare.mn2, ambele irelevante:
    • Meniuri\roafacturare.mn2:50 — DEFINE BAR 3 OF Ajutor PROMPT "\<Jurnal modificari" (jurnal de audit al aplicatiei, nu editare factura).
    • Meniuri\model.mn2:14 — DEFINE BAR 2 OF Shortcut PROMPT "\<Modificare raport" (editare raport definit de utilizator, nu factura).
  • Niciun .mnx/.mn2 din proiect sau din COMUN\meniuri\ nu contine referinta la frm_modific2024 sau ofacturare_editare (verificat cu grep pe toate cele 43 de fisiere unde apare frm_modific2024 — niciunul e .mn2).

Locul real e un buton de toolbar generic + un popup xmenu() construit in cod, in COMUN\clase\ofacturare_comun.vc2, pe formularul frm_facturi (lista de facturi emise):

  1. Butonul de toolbar — clasa but_modifica, definita generic in COMUN\clase\cmd_butoane.vc2:182-197:

    DEFINE CLASS but_modifica AS buton OF "_cmd_base.vcx"
        caction = inainte_de_do_modifica
        ...
        ToolTipText = "Modificare (CTRL+M)"
    

    Acest buton e adaugat direct in clasa de baza a tuturor formularelor, COMUN\clase\_frm_base.vc2:1103 (ADD OBJECT 'But_modifica1' AS but_modifica ...), deci apare pe toate formularele-lista din suita ROA (parteneri, personal, stocuri, note contabile, facturi etc.), nu doar pe cel de facturi. Textul lui ("Modificare (CTRL+M)") e generic si hardcodat, nu vine din Locale\ (vezi punctul C).

  2. Popup-ul specific facturii — frm_facturi (definit in ofacturare.vcx/ofacturare_comun.vc2) suprascrie handler-ul butonului cu propriul sau meniu contextual:

    COMUN\clase\ofacturare_comun.vc2:4928-4937
        PROCEDURE inainte_de_do_modifica
            Local lnOptiune
            lnOptiune = xmenu('Modificare \<date factura;Editare \<factura (articole, cantitati, preturi)')
            Do Case
                Case lnOptiune = 1
                    This.do_modifica()
                Case lnOptiune = 2
                    This.do_editare_factura()
            Endcase
        ENDPROC
    

    Textul exact de azi al liniei (verificat byte cu byte, ASCII curat, fara diacritice corupte): xmenu('Modificare \<date factura;Editare \<factura (articole, cantitati, preturi)') — COMUN\clase\ofacturare_comun.vc2:4930.

    Deci utilizatorul care apasa butonul "Modificare (CTRL+M)" pe lista de facturi vede un mini-meniu cu doua optiuni:

    • "Modificare date factura" (accelerator D) → This.do_modifica() — ruta generica afisjurcom.do_modifica din comun.vc2:2222-2572 (aceeasi metoda partajata de foarte multe tipuri de documente din suita, cu ramuri Do Case pentru fiecare).
    • "Editare factura (articole, cantitati, preturi)" (accelerator F) → This.do_editare_factura() — asta e ruta directa catre frm_modific2024.

B. Lantul real: eticheta -> comanda -> frm_modific2024

frm_facturi (lista facturi emise)
  -> but_modifica1 (mostenit din _frm_base, ToolTipText "Modificare (CTRL+M)")
  -> click -> inainte_de_do_modifica()          [ofacturare_comun.vc2:4928]
       -> xmenu('Modificare \<date factura;Editare \<factura (articole, cantitati, preturi)')
                                                  [ofacturare_comun.vc2:4930]
       -> optiunea 2 -> This.do_editare_factura() [ofacturare_comun.vc2:3715]
            -> seteaza tipul, verifica drepturi (This.lactiv3), Reccount('crsfacturi')...
            -> Omodif = Createobject([frm_modific2024], lnIdSet)  [ofacturare_comun.vc2:3796]
            -> Omodif.Show()

Confirmare independenta a clasei tinta prin vfp_symbols.ps1 -Where "ofacturare_comun.vc2:4935": frm_facturi.inainte_de_do_modifica [method] ofacturare_comun.vc2:4928-4937.

Alte cai catre acelasi formular, gasite prin grep -rn frm_modific2024 (43 fisiere), toate insa in alt context, nu din meniul principal de facturare al utilizatorului final:

  • COMUN\clase\comun.vc2:2439 — afisjurcom.do_modifica (metoda generica, ramura IF gnAn >= ... ELSE Createobject([frm_modific])) — e ruta veche/generica de "nota contabila", partajata cu toate produsele ROA (nu specifica facturii).
  • COMUN\clase\anaf_efactura.vc2:13087 — deschidere frm_modific2024 din fluxul e-Factura ANAF (verificare/validare, nu din butonul de lista).
  • COMUN\ferestre\frm_import_note_facturi_clienti.sc2:898 si COMUN\ferestre\frm_initializare_facturi_balanta.sc2:1806 — fluxuri de import/initializare, nu editarea unei facturi deja emise, deci nu intra in scopul cerut.

Pentru cererea utilizatorului ("editarea facturii emise"), singurul loc relevant si cu text apropiat de ce isi doreste este ofacturare_comun.vc2:4930 (optiunea 2 din popup).

C. Cum se schimba textul in practica

  • Nu e in .mnx/.mn2. Nu exista un DEFINE BAR ... PROMPT cu acest text nicaieri in proiect. Deci nu e nevoie de editare manuala in IDE-ul de meniuri.
  • E literal, hardcodat intr-o metoda .vc2: COMUN\clase\ofacturare_comun.vc2:4930, in interiorul clasei frm_facturi, metoda inainte_de_do_modifica. Fisierul .vc2 este write-back-abil prin txt2vcx.ps1 (regula generala din CLAUDE.md: doar .vc2/.sc2 accepta scriere inapoi in binar). Deci schimbarea propusa de utilizator se poate face prin editare text + txt2vcx.ps1, nu necesita interventie manuala in IDE.
  • Text propus de utilizator ca inlocuitor pentru optiunea 2: in loc de "Editare \<factura (articole, cantitati, preturi)" ar deveni ceva de forma "Editare \<factura (note, rulaje, articole)" — pastrand acceleratorul \<F. (Nu am facut modificarea — doar raportez unde s-ar face, conform interdictiilor primite.)
  • ToolTipText = "Modificare (CTRL+M)" din cmd_butoane.vc2:194 NU trebuie schimbat — e folosit de zeci de formulare din toata suita ROA (am numarat >100 instantieri but_modifica in .vc2/.sc2, majoritatea in onomenclatoare.vc2, onom_sal.vc2, oparteneri.vc2 etc., niciunul specific facturii). Un text de forma "editare factura..." pus acolo ar minti pe toate celelalte ecrane (parteneri, personal, stocuri...).
  • Nu exista mecanism .mnx compilat separat de regenerat pentru aceasta schimbare — nefiind vorba de un .mnx, nu se aplica git_sync.ps1/recompilare de meniu; e nevoie doar de rebuild-ul normal al proiectului dupa modificarea .vcx (Project > Build din VFP IDE), conform fluxului standard descris in CLAUDE.md.

C-bis. Localizare (Locale\)

  • Directorul Locale\ exista dar e complet gol in aceasta copie de lucru (find D:\ROA\ROAFACTURARE\Locale -type f → 0 fisiere). Nu exista tabele DBF de traducere incarcate aici.
  • Nu exista niciun apel Traduc(...)/goApp.Traduc(...) in jurul ToolTipText-ului but_modifica sau al liniei xmenu(...) de mai sus — am cautat in cmd_butoane.vc2 si _frm_base.vc2 (grep -n "Traduc\b" → zero hit-uri in ambele). Singura potrivire pentru "traduc" in tot proiectul e in comun.vc2:2157-2158, cod comentat (*!* IF THIS.filtru_traducere()#""), nefolosit si nelegat de acest buton.
  • Concluzie: textul e o constanta Romana hardcodata direct in .vc2, nu vine din nicio sursa de traducere. Nu exista alte limbi de verificat pentru acest text.

D. Captions reale ale paginilor din frm_modific2024

Premisa utilizatorului ("trei pagini: Note, Rulaje si Articole") nu se potriveste exact cu Caption-urile din formular. Am verificat cu:

vfp_symbols.ps1 -Find frm_modific2024   -> class frm_modific2024  omodificari.vc2:6375-16836
awk 'NR==6375,NR==16836' omodificari.vc2 | grep -n "AS _pageframe\|PAGE.\.Caption"

Rezultat: exista un singur PageFrame in formular, pgfArticole (omodificari.vc2:8714-8732, adica linia absoluta ≈ 6375+2341 in indexare relativa), cu 3 pagini, niciuna captionata "Note":

COMUN\clase\omodificari.vc2:8725   PAGE1.Caption = "Rulaje materii prime, materiale, marfuri, obiecte inventar (303)"
COMUN\clase\omodificari.vc2:8728   PAGE2.Caption = "Rulaje obiecte inventar in folosinta (8039)"
COMUN\clase\omodificari.vc2:8731   PAGE3.Caption = "Articole factura"

Nu exista nicio pagina/tab captionat literal "Note". Zona de "note" (liniile notei contabile — coloane precum "Explicatie C", "Cont", "Cota TVA" etc., verificate prin grep -n "Caption = \"" in intervalul clasei) e corpul principal al formularului (grid-ul de baza grid1), nu o pagina din pageframe. Deci structura reala e:

  • corp principal (nepaginat) = liniile notei contabile ("Note" e denumirea informala folosita in discutii, nu un Caption efectiv);
  • pgfArticole.PAGE1 + PAGE2 = doua variante de "Rulaje" (materiale 303 / obiecte inventar 8039);
  • pgfArticole.PAGE3 = "Articole factura".

Titlul formularului insusi e generic: Lb_titlu_alb_b121.Caption = "MODIFICARE" (omodificari.vc2:6934, in Init-ul clasei frm_modific2024), nu mentioneaza nici el "factura" sau "note/rulaje/articole".

Recomandare pentru textul de meniu: formularea "note, rulaje, articole" e conceptual corecta (reflecta cele 3 zone reale), dar nu e un citat al Caption-urilor efective de pe ecran — daca se doreste consistenta stricta cu ce vede utilizatorul, ar trebui fie sa se ajusteze si Caption-urile paginilor (schimbare separata, in afara scopului acestei cercetari), fie sa se accepte ca eticheta de meniu descrie zonele functional, nu litera Caption-urilor.

E. Pagina Articole e conditionata

Da, e strict conditionata — nu apare intotdeauna. Dovezi:

COMUN\clase\omodificari.vc2:14927   This.lAreArticoleVanzari = .F.
COMUN\clase\omodificari.vc2:14928   IF "OFACTURARE_EDITARE" $ Upper(Set("Procedure")) AND Reccount('tact') > 0
COMUN\clase\omodificari.vc2:14929       IncarcaVanzareDinNota('tact')
COMUN\clase\omodificari.vc2:14930       IF Reccount('tvanz') = 1
COMUN\clase\omodificari.vc2:14931           This.lAreArticoleVanzari = .T.
COMUN\clase\omodificari.vc2:14932           This.nIdVanzare = tvanz.id_vanzare
COMUN\clase\omodificari.vc2:14933           This.nTipVanzare = tvanz.tip
COMUN\clase\omodificari.vc2:14934           This.lArticoleReadOnly = EsteInEFactura(Nvl(tvanz.id_fact,0))
COMUN\clase\omodificari.vc2:14935       ENDIF
COMUN\clase\omodificari.vc2:14936   ENDIF
...
COMUN\clase\omodificari.vc2:14941   IF This.lAreArticoleVanzari
COMUN\clase\omodificari.vc2:...         This.pgfArticole.PageCount = 3
COMUN\clase\omodificari.vc2:...     ELSE
COMUN\clase\omodificari.vc2:14958       This.pgfArticole.PageCount = 2
COMUN\clase\omodificari.vc2:14959       This.but_nouR.Enabled = .F.
COMUN\clase\omodificari.vc2:14960   ENDIF

Conditia exacta pentru ca pagina "Articole factura" sa fie vizibila:

  1. formularul a fost deschis din contextul de editare factura ("OFACTURARE_EDITARE" $ Upper(Set("Procedure")) — adica din lantul frm_facturi -> do_editare_factura, nu din ruta generica do_modifica);
  2. nota are cel putin o linie de tip articol (Reccount('tact') > 0);
  3. exista exact o vanzare (factura) legata de nota (Reccount('tvanz') = 1).

Daca oricare din conditii lipseste, pgfArticole.PageCount = 2 — pagina "Articole factura" nu apare deloc, ramanand doar cele doua pagini de "Rulaje". In plus, chiar cand pagina apare, poate fi doar-citire (This.lArticoleReadOnly = EsteInEFactura(...)) daca factura a fost deja trimisa in e-Factura ANAF (omodificari.vc2:14934, plus dezactivari vizibile in omodificari.vc2:14943-14947: but_nouR.Enabled, txtDiscountArt.ReadOnly, lblArticoleReadOnly.Visible, cmdSincronizeazaArticole.Enabled).

Implicatie pentru textul de meniu: un text care promite mereu "articole" (ex. "editare factura (note, rulaje, articole)") poate minti in unele cazuri — cand nota nu are exact o vanzare asociata sau nu are linii de tip articol, utilizatorul nu vede pagina de articole deloc, desi eticheta i-a promis-o. E o observatie de continut, nu un blocaj — decizia de a accepta acest risc (eticheta descrie "ce se poate edita in general", nu "ce va vedea de fiecare data") apartine utilizatorului/echipei.

Sumar raspunsuri la intrebarile din brief

Intrebare Raspuns
Exista eticheta .mnx literala? NU — cautare completa in toate .mn2-urile proiectului si COMUN\meniuri\, zero hit-uri pe "editare factura" sau variante
Unde e reala eticheta? COMUN\clase\ofacturare_comun.vc2:4930, in xmenu(), clasa frm_facturi, metoda inainte_de_do_modifica
Textul de azi Editare \<factura (articole, cantitati, preturi)
Vine din Locale\? Nu — Locale\ e goala, nu exista apel Traduc() in jurul acestui text
Se schimba in .mnx sau in cod? In cod (.vc2), write-back prin txt2vcx.ps1 — nu necesita editare manuala in IDE
Paginile se numesc Note/Rulaje/Articole? Nu literal — un singur pageframe cu 3 pagini: "Rulaje materii prime..." / "Rulaje obiecte inventar..." / "Articole factura"; zona de note e corpul principal, nepaginat
Pagina Articole e mereu prezenta? Nu — conditionata de 3 conditii (omodificari.vc2:14927-14936), poate lipsi sau fi doar-citire

Nimic din NESTABILIT — toate afirmatiile au dovada fisier:linie verificata direct in text.