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
237 lines
14 KiB
Markdown
237 lines
14 KiB
Markdown
# 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.
|