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
This commit is contained in:
236
docs/cercetare/rec_r6_meniu_editare_factura.md
Normal file
236
docs/cercetare/rec_r6_meniu_editare_factura.md
Normal file
@@ -0,0 +1,236 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user