# Inventar COMUN - functii/clase reutilizabile (ROAGEST)

Scop: referinta rapida pt. plan/code-review, ca sa refoloseasca comunele in loc sa se reinventeze
(ex: Scan manual pt. lista dintr-un cursor, cand exista deja cursor2lista()). Generat prin grep pe
COMUN/programe/*.prg + cache text D:\ROA\_vfp_textcache\roagest (nu presupuneri). Numerele = nr.
aparitii grep in tot proiectul (indiciu de cat de "canonic" e functia).

## 1. Functii comune - COMUN\programe\oproceduri_comune.prg (clasa Oracle/executor + utilitare)

| Functie | Semnatura scurta | Ce face | Uz |
|---|---|---|---|
| oExecute | (cSql,cCursor,lProgress,cTitlu,nHandle,lShowError,lQuitOnError,lReconnect) | ruleaza SQL prin Oracle, deschide cursor. Retur: <0 eroare (vezi oPrelucrareEroare), 0 fara randuri, >0 nr. randuri | 851 |
| oExecuta | idem oExecute, wrapper | ca oExecute dar arata singur amessagebox la eroare si intoarce .T./.F. | 256 |
| oPrelucrareEroare | () | intoarce mesajul de eroare Oracle formatat, dupa un oExecute cu retur <0 | 93 |
| oFunction2Value | (cSql/cFunctie,...) | executa o functie Oracle si intoarce direct valoarea scalara | 31 |
| oSelect2Value | (cSql,...) | SELECT cu 1 coloana/1 rand -> valoare scalara | 58 |
| oSelecteaza2Value | variantul "Selecteaza" al lui oSelect2Value | idem, alt nume istoric | 20 |
| oSelecteaza2Object | (cSql,...) | SELECT 1 rand -> obiect cu proprietati = coloane | 23 |
| Connect / Disconnect / Oreset() | - | (re)conectare/deconectare goConn, reset stare executor | 33/10/119 |
| ProcessError | - | procesare interna eroare conexiune | 14 |
| amessagebox | (cMesaj,nIcon,cTitlu,...) | MESSAGEBOX wrapper standard ROA (icon/titlu/localizare) - **functia cea mai folosita din tot COMUN** | 1308 |
| amessage | - | varianta simpla fara icon/butoane multiple | 14 |
| cursor2lista | (cCursor,cColumn,cSeparator,cFiltru) | Scan cursor -> lista valori separate (";" default), pt. coloane necaracter | 36 |
| cursor2listac | (cCursor,cColumn,cSeparator,cFiltru) | ca cursor2lista dar incadreaza itemii intre apostrof (pt. SQL IN ('a','b')) - de folosit in loc de Scan manual | 2 |
| lista2array | (cLista,@aArray,cSeparator) | sparge o lista delimitata intr-un array | 35 |
| lista2cursor | (cLista,...) | lista delimitata -> cursor | 21 |
| get_mask | (nInt,nDec) | intoarce masca de format numeric (ex. "999,999.9999") dupa nr. intregi/zecimale | 24 |
| formateaza | - | formatare valoare dupa masca/tip | 18 |
| NEW_ID | (tabela,...) | genereaza urmatorul ID secvential pt. o tabela | 22 |
| NRORD | - | numar de ordine (contor afisare grid/raport) | 217 |
| NRCRT | - | numar curent (similar NRORD, alt istoric) | 108 |
| Get_Ora | (nTip) | ora curenta formatata dupa tip | 150 |
| ULTIMAZI / ultima_zi_din_luna | (an,luna) | ultima zi calendaristica a lunii | 16/25 |
| C_LUNA / CLUNA3 / cluna | (nLuna) | nume luna (lung/prescurtat) in romana | - |
| get_trimestru / get_semestru | (nLuna) | trimestrul/semestrul din numar luna | - |
| SAVE_GRID / RESTORE_GRID | (oGrid,cCheie) | salveaza/restaureaza layout coloane grid (latimi/ordine) in ini/tabela | 15/15 |
| SAVE_GRID_COMMENT / RESTORE_GRID_COMMENT | idem | variante cu comentarii coloane | - |
| SAVE_GRID_TAG / RESTORE_GRID_TAG | idem | variante cu tag/sortare curenta | - |
| snr_grid | - | switch_and_restore_grid - schimba sursa gridului si reaplica layout salvat | - |
| XMENU / XMENUP | - | meniu contextual generic (popup) | 22 |
| GETCHOICE | - | dialog alegere dintr-o lista | - |
| Get_Version | (lNoRevision,lInfo,cFileName) | citeste versiunea din resursele .exe | 15 |
| Get_Hexa | (nDeca) | conversie zecimal->hex | 12 |
| format_msg | - | formateaza mesaj cu parametri (gen sprintf) | - |
| GetHash | - | hash generic (verificare integritate/duplicate) | 48 |
| export_xls / ExportToXMLExcel | - | export cursor -> Excel (functii libere aici, la 1234/5502; NU sunt metoda goExport.export_xls din oexport.prg - cod si semnatura diferite, doar nume identic) | 24 |
| copiaza_structura_cursor | (cSursa,cDest) | copiaza doar structura unui cursor (fara date) | 27 |
| GETCALLSTACK | - | stack de apel curent, pt. debug/log erori | 24 |
| RemoveCharacters / RemoveCharactersDB | (cStr,cChars) | elimina caractere dintr-un string / varianta safe pt. query | 56/9 |
| XmlSpecialCharacters / WindowsSpecialCharacters / OracleSpecialCharacters | (cStr) | escapare caractere speciale pe context (XML/Windows/Oracle) | 19/11/- |
| EncryptDecrypt | (cStr,cCheie) | criptare/decriptare simetrica simpla | 23 |
| StringAgg | (cCursor,cColumn,cSeparator) | agregare valori coloana intr-un singur string (gen LISTAGG) | 18 |
| GetNrFromString / GetDigitsFromString / GetIBANFromString | (cStr) | extrage numere/cifre/IBAN dintr-un text liber | 18/- |
| Atasament2File / File2Atasament | - | conversie fisier <-> blob-atasament (baza de date) | 12/12 |
| romfast_suport / DownloadSupportFile | - | trimite/descarca fisier suport catre ROA | 18 |
| SaveBackupSet / RestoreBackupSet / ExistsBackupSet / DeleteBackupSet / UpdateBackupSet | - | set de proceduri pt. backup/restaurare setari private utilizator | 22/12/12/12/10 |
| GetOptiuneFirma / citeste_optiune_firma | (cCod) | citeste o optiune de configurare per firma | 20 |
| param_listari | (cRaport,cTitlu,cSemnaturi,lFaraTab) | pregateste parametri standard pt. rapoarte (titlu/semnaturi) | 19 |
| ceretitlu_rap | - | dialog cerere titlu raport | 16 |
| aInputBox | - | InputBox generic cu validare | 12 |
| GetPdfPath | - | cale generare/salvare PDF | 13 |
| GetDefaultValue / HasProperty / GetValue / SetValue | pe clase interne (ex. optiuni) | pattern generic proprietate-cu-default | 14/11/464/540 |
| verificare_note_contabile | - | valideaza notele contabile generate din import (echilibrare debit/credit) | 11 |
| verifica_partener / verificare_parteneri / verificare_parteneri_istoric | (cCUI/cCod) | valideaza/cauta partener in nomenclator dupa CIF/cod, inclusiv istoric | 10/4/6 |
| VerificaCodFiscal / GetMeniuVerificareCodFiscal / GetOptiuneVerificareCodFiscal | - | validare CUI/CIF (ANAF-like) | 10 |
| VerifCF / cValidCNP / ValidCNP / GetDataCNP | (cCod) | validare CIF/CNP + extragere data nastere din CNP | 9/- |
| VerifIBAN / verificare_iban / GetSumaControlIBAN | (cIban) | validare IBAN (cifra de control) | 8/4 |
| TVA2PROCTVA / GetProcTvaStandard / GetCoeficientTvaStandard / ProcentTva2IdJtva / GetIdJtvaStandard | - | conversii cota TVA <-> procent <-> cod TVA Oracle (gcS) | 6/11/-/-/5 |
| GetTaxCodeIdPart / GetTaxCode / GetPaymentCode | - | coduri taxare/plata pt. e-Factura ANAF | 12/-/- |
| GetArticolByCodDenumire / GetArticolById / GetArticolEFByPartDenumire | - | cautare articol nomenclator dupa cod/denumire/id | 10/6/- |
| GetPartenerByCodFiscal / GetPartenerByDenumire / GetPartenerByContBanca / GetPartenerByUtil / GetIdPartenerBy... / GetDenumirePartenerById / GetCodFiscalPartenerById | - | familie de cautari partener (id<->cod fiscal<->denumire<->cont banca) - **cauta_* pt. nomenclatoare, prioritar fata de SELECT ad-hoc** | 2 fiecare |
| GetSectieByCsectie / GetSectieById / GetIdSectie / GetGestiuneById | - | cautari sectie/gestiune | 2 fiecare |
| GetVencheltById / GetIdVenchelt | - | cautare venit/cheltuiala | 2 |
| GetDocumentByContPartenerAct | - | cautare document existent dupa partener+cont+act | 4 |
| GetFdocById | - | cautare tip document (fdoc) | - |
| GetValutaByISO | - | cautare valuta dupa cod ISO | - |
| NrLuni2AnLuna / GetDataIreg | - | conversii perioada an/luna | - |
| sir2array | - | split string -> array (generic, non-cursor) | - |
| nvl2 / nvl2Default | (val,default) | echivalent NVL Oracle in VFP | 11 |
| TooManyInstances | (nInstante) | verifica daca ruleaza deja alta instanta a exe-ului | - |
| MyUnzip / UnzipQuickShell / MyUnzipCallBack | - | dezarhivare (update-uri, atasamente) | - |
| HTTPDownloadFile / DownloadFile | - | descarcare fisier prin HTTP | - |
| lansare_help / lansare_help_meniu / arata_manual | - | deschide manualul/help-ul aplicatiei | - |
| viz_prg_instalat / versiune / CheckNewVersion / CheckVersion / UpdateVersion | - | verificare versiune instalata vs. server update | 57 (versiune) |
| xdir / xdelete / DeleteFiles | - | utilitare fisiere (listare/stergere) | 14/- |
| ImportTable | - | import tabel extern (DBF/CSV) | - |
| GET_SCHEMA_GRID | - | genereaza schema coloane pt. grid dinamic | - |
| CloneObj / CopyProps | (oSursa,[oDest]) | clonare obiect / copiere proprietati intre obiecte | 10/- |
| Get_zileluc | - | zile lucratoare | - |
| GetUserDocPath | - | folder documente utilizator curent | - |
| aleg_document_pereche | (vezi ooperatii_comune) | vezi sectiune 2 | - |

Nota: multe din functiile de mai sus exista **dublat** in `proceduri_comune.prg` (varianta veche,
non-obiect) - ex. NEW_ID, SAVE_GRID*, XMENU, cursor2lista*, lista2array/cursor, get_mask, Get_Version,
Get_Hexa, format_msg, C_LUNA/cluna, get_trimestru/semestru, GETCALLSTACK, CloneObj/CopyProps,
ceretitlu_rap. La duplicat castiga fisierul adaugat **cel mai recent** cu SET PROCEDURE ADDITIVE -
in roagest.prg OPROCEDURI_COMUNE.PRG (linia 238) vine dupa proceduri_comune (linia 218), deci
varianta activa e cea din `oproceduri_comune.prg`. Din varianta veche raman folosite doar 2 functii
unice: `extrage_optiuni(cLista,nId)` (valoare dintr-o lista "id::val;id::val", 11 uz) si
`myScatter(tcBlank)` (SCATTER generic in obiect, 3 uz); restul functiilor unice de acolo = moarte.

## 2. Functii comune - COMUN\programe\ooperatii_comune.prg (contabilitate/analitice/balanta)

| Functie | Ce face | Uz |
|---|---|---|
| viz_act | vizualizare document (act) generic | - |
| aleg_document_pereche | alege documentul pereche (ex. factura<->aviz) la asociere | - |
| exista_cont_in_plan_conturi | verifica daca un cont exista in planul de conturi | - |
| verific_partener | valideaza/completeaza partener pe o inregistrare contabila | 7 |
| verific_analitic / verific_analitic_ | valideaza analitic contabil (cont+subcont) | 7/2 |
| verificare_note_contabile | valideaza echilibrarea notelor contabile generate | 11 |
| sterge_nota / scrie_nota_import | sterge/scrie nota contabila generata din import | - |
| do_assign_analitic | atribuie analitic automat pe o linie | - |
| verific_cont | verifica existenta/valabilitate cont contabil | 9 |
| viz_balanta_contabilitate / viz_balanta / make_tbalanta / Eval_balanta | construire/vizualizare balanta de verificare | - |
| completare_gruputil_analitice / completare_tva_analitice / completare_taxname / completare_paymentname / completare_explicatie_tva | completeaza campuri derivate pe linie contabila (grup util, TVA, taxname, explicatie) | - |

## 3. Export si listare - COMUN\programe\oexport.prg (clasa oExportConfig -> obiect global goExport)

Pattern canonic: `goExport.export2frx(...)` / `goExport.export2xlsx(...)` / `goExport.export2pdf(...)`.
Preview rapoarte: FoxyPreviewer (`gcReportPreviewer = "FoxyPreview"` in roagest.prg).

| Functie/metoda | Semnatura scurta | Ce face | Uz |
|---|---|---|---|
| export2frx | (tcAlias,tcRaport,tlCereTitlu,...,tcReportPreviewer,toPreviewerConfig) | REPORT FORM cu preview/print (FoxyPreview), logo, imprimanta din setari - **listarea standard, cea mai folosita** | 155 |
| export2xls | (tcAlias,tcNumeFisier,tcListaColoane,tcFiltru) | EXPORT TO ... TYPE XL5 (.xls vechi) + deschide fisierul | 30 |
| export2xlsx | (tcAlias,tcNumeFisier,tcListaColoane,tcFiltru) | copytoxlsx() - XLSX nativ modern, **preferat pt. cod nou** | 7 |
| export2xlsxGrid | (toGrid,tcNumeFisier,tcWhere,tcOrder) | schema din grid (get_schema_grid) -> SELECT -> export2xlsx | 3 |
| exportMultiTable2Xlsx | (tcTableList,tcFileName) | mai multe tabele in acelasi workbook xlsx (clasa VFPxWorkbookXLSX) | 3 |
| Export2XmlXls | (toGrid,tcFileName,tcSheetName,tlOpen) | XML SpreadsheetML via clasa excelxml, direct din grid | 2 |
| export2pdf | (tcAlias,tcRaport,tlPreview,tcCursorSalvare) | REPORT FORM OBJECT pdflistener2 -> PDF; optional continutul in cursor | 26 |
| export2html | (tcTargetTables,tcNumeFisier,tcTableTitles,tlJustTables) | HTML/Excel-HTML din unul/mai multe tabele (TEXTMERGE) | 9 |
| export2xml_efactura | (toDateFactura,tcCursorLinii,tlSilentios) | wrapper getXmlEFactura() - XML e-Factura ANAF | 6 |
| export2frx_paginaregrup | (...) | listare cu numerotare pagini per grup (crsPaginiRaportGrup) | 6 |
| getRepPath / getLogoPath | (tcRaport / tcLogo) | rezolva USR_<raport>.frx / logo per schema (DIRGEN\USERREPORTS, atas_atasamente) | 24/10 |
| OPEN_DEFAULT_APP | (tcNumeFisier) | ShellExecute "open" cu aplicatia implicita | 70 |
| citesteSetare / modificaSetare (+ *Ini/*Registru) | (cCheie[,cVal]) | setari registru/ini dupa setTip/setPath/setSectiune | 13/11 |
| verificaDate | (tcAlias,tnTip,tlSilentios) | valideaza alias deschis/cu date inainte de export | 16 |
| listareUserReport / export_frx / export_xls | - | dispatcher + variante vechi (marcate de inlocuit); metoda export_xls != functia libera export_xls din oproceduri_comune.prg | 22/13/26 |
| FoxyPreview (functie libera, nu pe goExport) | (tcRaport,toPreviewerConfig) | preview FoxyPreviewer.App direct pe .frx, apelata din formulare | 19 |
| FoxyPreviewerCaller (clasa) | AddReport(tcReport,tcClauses) / RunReport | combina mai multe .frx intr-un singur preview | 7 |
| PreviewerConfig (clasa) | SetValue/GetValue | property-bag optiuni FoxyPreviewer (param toPreviewerConfig la export2frx) | - |

### Export Excel - 3 mecanisme paralele (atentie la confuzii)
1. `goExport.export2xls/export2xlsx` (mai sus) - preferat pt. cod nou (export2xlsx).
2. `export_excel` / `export_excel_grid` / `exportare` / `LIST_EXCEL` (proceduri_excel.prg) - OLE
   Automation, scrie celula cu celula, necesita Excel instalat; uz mic (2-12). `get_excel_mask` de
   acolo = conversie masca VFP -> format Excel (nu confunda cu `get_mask` din sect. 1).
3. Clasa `excelxml` (excelxml.vcx, COMUN\UTILE\excel) - Excel XML direct din `gridobject`, fara
   Excel instalat (proprietati: file, sheetname, openaftersaving; metoda `save`); 73 uz.
Plus functiile libere `export_xls`/`ExportToXMLExcel` din oproceduri_comune.prg (sect. 1) - cod
diferit de metoda `goExport.export_xls`, doar nume identic.

## 4. Utilitare transversale (COMUN\programe, fisiere neinventariate initial)

### gencursor.prg
| Functie | Semnatura scurta | Ce face | Uz |
|---|---|---|---|
| gencursor | (cNume,cAlias,cSelect,cFiltru,cSchema,cOrder,lAfisare,cGroup,...) | obiect deca_baza/ca_baza cu cursor "lazy" (select/filtru/order pe goConn) - **baza grilelor cu sursa dinamica; nu construi manual ca_baza** | 403 |

### validare.prg - validare CIF/CNP cu ANAF/MFIN/VIES (vs. VerifCF/ValidCNP offline din sect. 1)
| Functie/clasa | Ce face | Uz |
|---|---|---|
| VerificareCod (clasa) | validare completa cu webservice: metode VERIFICARE_CIF/VERIFICARE_CNP/ANAF/MFIN/VIES/validare/GetError | 169 |
| VerificareANAF (clasa) | sincronizare lista CIF-uri cu ANAF (VerificaListaCIF, ANAF_SincronWebService_PlatitorTva) | 26 |
| test_cif / VALIDARE_CIF / test_cnp / VALIDARE_CNP | validari format + cifra control, offline | 27/19/9/15 |
| VERIFICARE_PLATITORTVA / VIES_VAT / ONRC | platitor TVA / verificare VIES / interogare ONRC | 5/5/9 |
| IntroducereCod (clasa Form) | formular introducere + validare cod | 25 |

### ocautare.prg - dialoguri standard de cautare/alegere (de refolosit in loc de SELECT+grid manual)
| Functie | Ce alege | Uz (prg/forme) |
|---|---|---|
| caut_gestiune / caut_gestiune_dest | gestiune (sursa/destinatie) | 25/324, 12/37 |
| caut_fdoc | tip document | 7/170 |
| caut_explicatie_tva | explicatie TVA (filtrare exigibil JC/JV) | 9/143 |
| caut_partener / CautPartenerContabilitate | partener (generic / dupa cont contabil) | 13/104, 16/16 |
| caut_valuta / caut_valuta_iso | valuta | 11/104 |
| cauta_nom_articole / caut_articol | articol (filtru text / multiplu) | 8/87, 20/42 |
| caut_sectie / caut_facturi | sectie / facturi dupa cont+partener+interval | 8/71, 12/34 |
| caut_lucrare, caut_venchelt, caut_contract, caut_delegati, ... | ~40 alte dialoguri de nomenclator, uz mic in ROAGEST | 2-17 |

### oheader.prg
| Clasa | Ce face | Uz |
|---|---|---|
| PSHeader (As Header) | dublu-click pe header = sortare (cHOrder), evidentiaza coloana activa, apeleaza cCallMethod (default Refresh) pe parintele gridului | 37 in forme |

### regex.prg
| Functie | Ce face | Uz |
|---|---|---|
| strtranx | STRTRAN cu regex (grupuri $1, evaluare =expr) | 14 |
| GetRegExp / GetRegExpAll / OccursRegExp / StrtranRegExp | prima/toate potrivirile, numarare, inlocuire simpla | 15/4/4/2 |
| StripNonAscii | elimina caractere non-ASCII dintr-un string (whitelist) | 11 |

### ini.prg
| Functie | Semnatura | Ce face | Uz |
|---|---|---|---|
| getini / setini | (cIniFile,cSection,cVar[,cVal]) | citire/scriere fisiere .ini low-level (FOPEN) - distinct de GetOptiuneFirma (Oracle) si goExport.citesteSetareIni (wwApi) | 28/9 |

### altele (o functie-doua per fisier)
| Functie (fisier) | Ce face | Uz |
|---|---|---|
| get_oluna (oproceduri_util.prg) | (an,luna) -> obiect cu intervalul calendaristic disponibil (lunamin/anmin/lunamax/anmax) din tabela calendar | 22 |
| ReferinteDocumenteNota / ReferinteDocument (odocumente.prg) | verifica daca un document e referentiat de altul (pack_documente Oracle) - inainte de stergere/modificare | 4/4 |
| anunta_rezultat / scrie_in_mesaje / raport_mesaje (mesaje.prg) | log mesaje de verificare in tabel + raport; uz de nisa | 2-3 |

## 5. Clase UI comune (COMUN\clase, cache text D:\ROA\_vfp_textcache\roagest\comun\clase)

### Butoane - cmd_butoane.vcx (parinte: _cmd_base.vcx -> buton/cmd_buton)
Mecanism: fiecare buton seteaza doar proprietatea `caction` (nume metoda) + `cpictureup/down`.
`buton.Click` (in `_cmd_base.vcx`) cauta metoda `caction` pe `this.Parent`, apoi `this.Parent.Parent`,
apoi `Thisform`, si o executa cu `clistaparametri` ca argument daca exista (Pemstatus + macro &).
**Nu suprascrie Click pe butoane noi - seteaza doar caction pe o instanta din cmd_butoane.vcx.**

| Clasa buton | caction | Rol |
|---|---|---|
| but_nou / cmd_adauga | do_adauga | adauga inregistrare noua |
| but_copiaza | do_copiaza | copiaza inregistrarea curenta |
| but_sterge / cmd_sterge | inainte_de_do_sterge | sterge (cu hook de confirmare) |
| but_modifica / cmd_modifica | inainte_de_do_modifica | intra in modificare |
| but_termin / but_da / cmd_termin | do_termin | confirma/salveaza si inchide |
| but_renunt / but_nu / cmd_renunt | do_renunt | renunta/inchide fara salvare |
| but_salveaza | do_salvare | salveaza fara inchidere |
| but_reset / cmd_reset | do_reset | reseteaza formularul/filtrul |
| but_cautare / cmd_cauta | do_cauta | deschide cautare |
| but_compara | do_compara | comparare inregistrari |
| but_verifica | do_verifica | validare |
| but_retur | do_retur | operatie retur |
| but_precedent / but_urmator / but_urmator_tot | do_precedent / do_urmator / do_urmator_tot | navigare inregistrari |
| but_excel | inainte_de_do_excel | export Excel |
| but_listare | inainte_de_do_listare | listare/raport |
| but_factura / but_listfactura | do_factura / do_listfact | facturare/listare factura |
| but_grafic | do_grafic | afisare grafic |
| but_help | do_help | help contextual |
| but_modiparam | do_modiparam | modificare parametri |
| but_attach | do_ataseaza | ataseaza fisier |
| but_reface | inainte_de_do_reface | reface/reia operatie |
| cmd_login / cmd_logoff | do_login / do_logoff | autentificare |
| cmd_executa / cmd_select | do_executa / do_select | executie/selectie generica |
| but_sus / but_jos | do_scrollup / do_scrolldown | scroll |

### Container label+text - lb_tx.vcx (parinte: _container, folosesc _lbbase/_txbase din _lb_base.vcx/_tx_base.vcx)
| Clasa | Rol |
|---|---|
| clb_tx_simplu / cb_tx_simplu | label + textbox simplu |
| cb_tx_autofill | label + textbox cu autocompletare (cautare in nomenclator) |
| cb_tx_cautare | label + textbox + buton cautare integrat |
| clb_tx_data | label + textbox cu masca data |
| clb_an_luna | pereche an/luna |
| clb_luna_intre / clb_nr_intre | interval luna/numar (de-la, pana-la) |
| clb_n1n2_simplu | pereche 2 numere simple |
| ct_cb_tx | container compus text+combo |
| ed_tx_simplu | label + editbox |
| op_tx_simplu | label + optiongroup |

Proprietate cheie comuna: `pcobj` (leaga containerul de camp/proprietate din obiectul sursa).

### Baze formular - _frm_base.vcx / _frm_child.vcx
| Clasa | Rol |
|---|---|
| _frmbase | baza standard formular; implementeaza deja `do_adauga/do_copiaza/do_modifica/do_renunt/do_sterge/do_termin` (override doar daca logica difera de default) |
| _frmnotitle | ca _frmbase, fara bara de titlu; are propriile do_adauga/do_modifica/do_renunt/do_sterge/do_termin |
| frm_termin | subclasa _frmbase, expune direct do_termin |
| frm_termin_renunt | subclasa frm_termin, adauga do_renunt (fara override suplimentar) |
| frm_gol | subclasa _frmbase "goala", cu propriile do_adauga/do_modifica/do_sterge |
| _pgfrmbase | baza pageframe |

### Grid - _grd_base.vcx
| Clasa | Rol |
|---|---|
| _grdbase | grid de baza (subclasa _grid) |
| _grdrow | subclasa _grdbase, randuri custom |
| _grdfooter | grid separat "atasat" la un grid sursa prin metoda `attachtogrid` (copiaza coloane/fonturi de la oSrcGrd) - pt. randuri de total/footer sub un grid principal |

## 6. Conventii transversale

- Prefixe variabile: `g`/`gc`/`gn`/`gl` (globale char/numeric/logic), `p`/`pc`/`pn`/`pl` (proprietati
  obiect), `t`/`tc`/`tn`/`tl` (parametri PARAMETERS/LPARAMETERS), `l`/`lc`/`ln`/`ll` (locale), `m.`
  (scoping explicit memvar quand hay coliziune cu camp).
- SQL pass-through: mereu prin `goExecutor.oExecute`/`oExecuta`, niciodata SQLEXEC direct in cod nou;
  schema calificata cu `gcS` (ex. `gcS + ".STOC"`); parametri legati cu `?param` (bind variable VFP->Oracle).
- Retur executor: oExecute -> numeric (<0 eroare/`oPrelucrareEroare()`, 0 fara randuri, >0 nr. randuri);
  oExecuta -> logic (.T./.F., arata singur eroarea).
- Cursoare temporare: prefix `crs*` (ex. `crsListaTemp` in cursor2lista/cursor2listac).
- Mesaje utilizator: mereu `amessagebox()`/`amessage()`, nu `MESSAGEBOX()` direct.
- Formatare numerica: `get_mask()` + `formateaza()`, nu masti hardcodate in cod nou.
- Fisiere `.vc2`/`.sc2`: TAB-uri semnificative, proprietatile in blocul `*<PropValue>` sunt
  alfabetizate - orice editare manuala trebuie sa respecte formatul (vezi CLAUDE.md, flux editare text).

## 7. Ce am lasat pe dinafara (intentionat)

- `proceduri_comune.prg` (varianta veche) - acoperita acum in nota de la sect. 1 (2 functii unice
  folosite, restul dublate sau moarte); functiile ei unice cu 0 aparitii (caut_nume_politica,
  make_sectii_utilizator, recompune_optiuni, cere*/compara*, debug_*_eventtracking, ...) - omise.
- `oproceduri_comune_imob.prg` - varianta specifica ROAIMOB, nu ROAGEST.
- `xdate.prg` - script procedural (incarca cursoarele xsets/xrequest/xnote la DO), nu expune functii.
- Metoda `getUserRepPath` din oExportConfig - complet comentata (moarta); varianta activa e functia
  libera omonima din `proceduri_rapoarte.prg` (cod diferit).
- Clase de nomenclatoare mari (`onomenclatoare.vcx`, `onom_articole.vcx`, `stocuri.vcx`, `rulaje.vcx`,
  `ointroduceri*.vcx`, `oinventar.vcx`) - business logic specific gestiune, prea voluminos pt. acest
  inventar (candidat pt. un inventar separat, per-flux, daca devine necesar).
- Clasele de configurare/serii (`configurare.vcx`, `serii_numere.vcx`, `ferestre_oracle.vcx`,
  `bon_fisc.vcx`) si utilitarele (`GridExtras`, `ctl32`, `hpdf`) - neinventariate, uz mai rar
  in fluxurile curente de lucru (`excelxml.vcx` e acoperita la sect. 3).
- Functiile din `COMUN\programe` fara nicio aparitie gasita prin grep in ROAGEST (posibil folosite
  doar de alte aplicatii ROA) - omise.

## 8. Cum se foloseste

- **La plan**: inainte de a scrie cod/obiecte noi, scaneaza acest fisier + un grep tintit
  (`grep -rn "<nume_functie_candidata>" COMUN/programe D:\ROA\_vfp_textcache\roagest`) ca sa
  confirmi ca nu exista deja o comuna echivalenta.
- **La code-review**: daca un diff introduce Scan manual pt. liste, MESSAGEBOX direct, SQLEXEC direct,
  un buton cu Click suprascris in loc de `caction`, un export Excel/listare construite manual in loc
  de `goExport.export2*`/FoxyPreview, sau un dialog de alegere nomenclator facut din SELECT+grid in
  loc de `caut_*` (ocautare.prg), semnaleaza reutilizarea comunei corespunzatoare din tabelele de mai sus.
