# Investigare: deschidere firma noua (LUDIPEDIA S.R.L.) pe instalatia "ROA ConPress" Investigatie read-only, 16.09.2026. Text FoxBin2Prg (`.??2`) resincronizat cu `git_sync.ps1 -ProjectRoot D:\ROA\ROASTART` inainte de cautari (0 esecuri, 410 fisiere la zi). Nimic din codul aplicatiei, din baza de date sau din configurari a fost modificat. --- ## 1. Localizare ROASTART `D:\ROA\ROASTART` exista si e proiect VFP9, structurat identic cu ROAFACTURARE: `roastart.PJX/.PJT` (proiect), `roastart.pj2` (text FoxBin2Prg), foldere `Programe/ Clase/ Ferestre/ Rapoarte/ Locale/ COMUN/`, `changelog_roastart.txt`, `versiune_db.txt`. Compilat in `roastart.exe`, impachetat cu Armadillo (`ROASTART.ARM`). Din `D:\ROA\ROASTART\CLAUDE.md:7`: "**ROASTART** ('ROA Romfast Applications') is a Visual FoxPro 9 launcher/shell for the ROA business application suite." Entry point: `Programe\roastart.prg`. Formularul de fundal (mereu deschis, gazda proceselor de creare firma si a butoanelor de administrare) e `D:\ROA\ROASTART\Ferestre\frm_fundal.sc2`. --- ## 2. Fluxul "deschidere firma noua" ### 2.1 Declansare din UI Buton/tile "Firma noua" pe fundal, imagine dedicata: - `D:\ROA\ROASTART\roastart.pj2:401` - `.ADD('grafice\admin\firma noua.png')` - `D:\ROA\ROASTART\Ferestre\frm_fundal.sc2:682,684,686` - `lb_imagine.Picture = ..\grafice\admin\firma noua.png`, `lb_program.Caption = "Firma noua"`, `lb_explicatie.Caption = "Initializare firma noua"`. ### 2.2 Introducerea datelor firmei noi `D:\ROA\ROASTART\COMUN\clase\ofirma.vc2`, clasa `frm_firme` / metoda `do_adauga` (linia 875): ``` 886: Do Adauga_Modifica_Inregistrare With "firme_mini",loRec,,"INSERT" ``` Editorul generic deschide un formular legat de clasa de date `cus_odata_firme_mini` (`ofirma.vc2:158`, mosteneste `cus_odata_firme` de la linia 7). `make_sql` din `cus_odata_firme` (linia 14-154) construieste apelul catre pachetul PL/SQL, pentru INSERT: ``` 130-146: lcSql = [begin pack_drepturi.firmemodinsproc(] + lcId + [,'] + lcfirma + [','] + lcantet + [','] + lcCodF + [','] + lcregc + [','] + && CUI, Nr. Reg. Com. lcbanca1..lcbanca10 / lccontb1..lccontb10 + [','] + && banci si conturi (10 seturi) lcadresa + [','] + lcCodFirma + [',] + lnpersj + [,] + lncodang + [,'] + lcnume + [','] + lcprenume + [','] + lctel + [','] + lctel2 + [','] + lctel3 + [','] + lcfax + [','] + lcemail + [','] + lcoasp + [',] + lncapsv + [,] + lncapss + [,'] + lcpctl + [','] + lccaen + [','] + lcschema + [','] + lcjudet + [','] + lclocalitate + [','] + lcstrada + [','] + lcnumar + [','] + lcbloc + [','] + lcscara + [',] + lnapart + [,'] + lccod_postal + [',] + lnidm + [,] + lne_mama + [,] + lnidl + [,] + Alltrim(Str(gnIdUtil)) + [,] + lnid_formaj + [,] + lnid_formao + [,] + lnid_formap + [,] + lnid_tip_soc + [,'] + lcindicativ + [','] + lcDeclarant + [','] + lcFunctie + [','] + lcIndiceitm + [',] + lcTipModificare + [,'] + lcCaenRevizie + ['); end;] ``` **Procedura PL/SQL exacta: `PACK_DREPTURI.FIRMEMODINSPROC`** (pachet `PACK_DREPTURI`). Campurile relevante pentru certificatul RC (cu numele lor din `toRec`, linia 42-106): - `firma` = denumire firma, `cod_fiscal` = **CUI**, `reg_comert` = **Nr. ord. Reg. Com.** - `adresa`, plus componente separate: `judet`, `localitate`, `strada`, `numar`, `bloc`, `scara`, `apart` (apartament), `cod_postal` - `antet`, `cod_firma`, `persoana_juridica`, `codang`, `nume`/`prenume` (reprezentant), `telefon`/`telefon2`/`telefon3`, `fax`, `email`, `oasp`, `capital_soc_var`, `capital_soc_sub`, `punct_luc`, `caen`, `caen_revizie`, `schema` (numele schemei Oracle noi), `id_mama`/`e_mama` (grup de firme), `id_loc`, `id_forma_juridica`, `id_forma_organizare`, `id_forma_prop`, `id_tip_soc`, `indicativ`, `declarant`, `functie`, `indice_itm`, `tip_modificare`. - Etichetele din grid confirma maparea: `ofirma.vc2:567` "Cod fiscal", `ofirma.vc2:433-434` `reg_comert`/"cReg_Comert", `ofirma.vc2:446` "Adresa", `ofirma.vc2:672` "Firma". Stergere firma (pentru referinta): `pack_drepturi.firmedelproc` - `ofirma.vc2:150`. ### 2.3 Crearea schemei Oracle noi (jobul propriu-zis) Dupa INSERT-ul cu succes, tot in `do_adauga` (`ofirma.vc2:888-907`): ``` 890: If Nvl(loRec.id_mama, 0) = 0 && doar firme simple/mama, nu membri de grup 891-893: pcSchema = Alltrim(loRec.schema) ; pnAn = loRec.an ; pnLuna = loRec.luna 895: lcSql = [begin SYN_NEWSCHEMAJOB(?pcSchema, ?pnLuna, ?pnAn); end;] 896: llSucces = goExecutor.oExecuta(m.lcSql) 897-905: seteaza _Screen.cNewSchema/nNewSchemaAn/nNewSchemaLuna/cTime, porneste _Screen.oFundal.tmrProgressBar.Enabled = .T., AMESSAGEBOX('Se creeaza firma "..." in baza de date! Urmariti progresul...') ``` **Procedura/job PL/SQL exacta: `SYN_NEWSCHEMAJOB(pcSchema, pnLuna, pnAn)`** - 3 parametri: numele schemei Oracle noi, luna si anul de start (perioada contabila initiala). Ruleaza asincron (job Oracle), de aceea urmatorul pas e polling. ### 2.4 Urmarirea progresului `D:\ROA\ROASTART\Ferestre\frm_fundal.sc2`, timer `tmrProgressBar.Timer` (linia 1777-1833): ``` 1783-1786: Private pcSchema, pnLuna, pnAn ; pcSchema = Alltrim(_Screen.cNewSchema) ... 1792: lcSql = [SYN_NEWSCHEMAPROGRESS(?pcSchema)] 1793: lnSucces = goExecutor.oFunction2Value(m.lcSql, @lcProgress) 1796: IF m.lcProgress = 'FINALIZAT' 1818-1819: AMESSAGEBOX('S-a creat firma ' + m.pcSchema + ... + 'Puteti da drepturi utilizatorilor pe noua firma!', 0+64, 'Firma noua') ``` **Functie de progres: `SYN_NEWSCHEMAPROGRESS(pcSchema)`** - intoarce un status text; cand devine `'FINALIZAT'` apare mesajul catre operator sa dea drepturi userilor pe firma noua (exact fraza pe care ati mentionat-o). Comentariu din cod (`frm_fundal.sc2:1778-1780`, istoric, 21.10.2014, marius.mutu): pasul separat `SYN_NEWSCHEMAPOST` a fost **mutat in interiorul lui `SYN_NEWSCHEMA`** (jobul asincron), deci azi tot ce tine de scripturi post-import (calendar, cote TVA, plan de conturi) ruleaza automat in job, nu mai e apelat separat din VFP - linia veche e comentata (`*!*` la 1813-1816). **Rezumat lant apeluri**: `do_adauga (ofirma.vc2:886)` -> editor generic "firme_mini" -> `PACK_DREPTURI.FIRMEMODINSPROC(...)` (INSERT firma) -> `SYN_NEWSCHEMAJOB(schema, luna, an)` (pornire job async creare schema) -> poll `SYN_NEWSCHEMAPROGRESS(schema)` din `frm_fundal.sc2` pana la `'FINALIZAT'`. Nota: parametrii CUI/Reg.Com./adresa se scriu o singura data, la INSERT-ul in `FIRMEMODINSPROC`, in tabela master de firme (nu sunt parametri ai jobului de schema - jobul de schema primeste doar numele schemei si perioada contabila initiala). --- ## 3. "ROA ConPress" / "Contpress" Gasit, cu ortografia **"conpress"** (litere mici, fara "Contpress"): `D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md:137` ``` 134: | Tunel / profil | Alias TNS + DSN | Schema Oracle | 135: |---|---|---| 136: | `vending.tlp` | `VENDING` | **`VENDING`** (parola standard ROA) | 137: | conpress | `ROA_CONPRESS` | `xenoti` | 139-141: Profilele Bitvise sunt in D:\roa\BITVISE\ pe statia curenta (..., `conpress.tlp`, ...) ``` Interpretare (document-cadru, sectiunea 1-4 din acelasi fisier, linii 13-131): "conpress" e un **client/instalatie de productie separata**, nu o schema pe serverul central ROA: - profil tunel SSH Bitvise: `conpress.tlp` (in `D:\roa\BITVISE\`) - alias TNS pentru conectare prin tunel: **`ROA_CONPRESS`** (in `tnsnames.ora` din `instantclient_19_18` / `instantclient_11_2_0_2`) - DSN ODBC (32-bit, folosit de VFP): de regula acelasi nume ca aliasul TNS (nu e listat explicit un DSN separat pentru conpress in acest doc - vezi `ODBC.INI` la nevoie) - **schema Oracle**: `xenoti` (nu "conpress" - numele schemei difera de numele clientului) Nu am gasit alta mentiune "ConPress"/"Contpress" in cod (`.??2`) sau in alte fisiere `.ini`/`.md` cautate in ROASTART sau in COMUN. **NU GASIT**: host/IP explicit al serverului conpress, parola, sau vreo mentiune a numelui "ConPress" in codul VFP propriu-zis (numele apare doar in acest document operational, nu in sursa aplicatiei). Implicatie pentru sarcina cerută: pentru a deschide firma LUDIPEDIA pe instalatia ConPress, trebuie intai ridicat tunelul `conpress.tlp`, apoi ROASTART/aplicatia trebuie sa se conecteze prin DSN-ul care foloseste aliasul `ROA_CONPRESS` (deci pe schema `xenoti`), nu pe conexiunea centrala ROA. Procedura tunel+TNS+DSN completa e in `D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md:1-131` (skill asociat: `roa-oracle-production-access`). --- ## 4. Drepturi utilizatori/grupuri pe firma ### 4.1 Tabele de baza (drepturi pe programe, nu neaparat per-firma) `D:\ROA\ROASTART\COMUN\Drepturi utilizatori\drepturi_utilizatori.sql`: - `DEF_GRUP` (linia 12-21): `ID_GRUP, GRUP, STERS, ID_UTILOP, DATAORA, NR_GRUP, ID_TATA` - `DEF_GRUP_DREPT` (linia 66-74): `ID_GRUP, ID_PROGRAM, ID_DGD, ID_UTILOP, DATAORA, STERS` (drepturi grup pe program, nu pe firma) - `DEF_OBIECTE` (linia 112-121): drepturi pe obiecte UI per program ### 4.2 Ecranul de alocare drepturi PE FIRMA (raspunsul direct la cerinta) Meniu ROASTART: `D:\ROA\ROASTART\Programe\oproceduri_start.prg:189` `Procedure viz_utilgrupfirma`: ``` 202: pcselect1=['select id_dug,id_grup,grup,id_firma,firma from vdef_util_grup where 1=2'] 219: ofrmutilgf=Createobject("frm_utilgrupf") ``` View sursa: **`vdef_util_grup`** (coloane: `id_dug`, `id_grup`, `id_firma`, `firma`). Grid-ul deschide un formular de adaugare dedicat: `D:\ROA\ROASTART\Clase\ostart_util.vc2:1102` - `DEFINE CLASS frm_utilgrupf_nou`, titlu `"DEFINIRE ROL PE FIRMA"` (linia 1138), cu 3 campuri combo: `Cb_utilizator` / `Cb_grup` (linia 1170, eticheta "Grup") / `Cb_firma` (linia 1159, eticheta "Firma"). Salvarea foloseste clasa de date `cus_odata_utilgrupf` (`ostart_util.vc2:7-51): ``` 32-34: lcIdUtil = Alltrim(Str(toRec.id_util)) ; lcIdGrup = Alltrim(Str(toRec.id_grup)) ; lcIdFirma = Alltrim(Str(toRec.id_firma)) 38-40: Case lcActiune = "INSERT" lcSql = [begin PACK_DREPTURI.utildreptinsproc(]+lcIdUtil+[,]+lcIdGrup+[,] + lcIdFirma +[,]+Alltrim(Str(gnIdUtil))+[); end;] ``` **Procedura exacta: `PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)`** - adauga un utilizator, intr-un grup/rol, scopat pe o firma anume. Exista si `UTILDREPTMODPROC` (linia 41-43, UPDATE) si `UTILDREPTDELPROC` (linia 44-46, DELETE). ### 4.3 Crearea/gestionarea utilizatorilor (pasul dinaintea alocarii pe firma) Meniu: `oproceduri_start.prg:240` `Procedure viz_utilizatori` -> `frm_utilizatori`, cursor sursa `vutilizatori` (linia 245). Salvare utilizator: `ostart_util.vc2:53-98`, clasa `cus_odata_utilizatori`: ``` 85: Case "INSERT": lcSql = [begin pack_drepturi.utilizatoriinsproc('] + lcutilizator + [','] + lcparola + [',] + lcInactiv + [,]+ Alltrim(Str(gnIdUtil))+[); end;] 88: Case "UPDATE": pack_drepturi.utilizatorimodproc(...) 92: Case "DELETE": pack_drepturi.utilizatoridelproc(id, id_utilop) ``` **Procedura exacta: `PACK_DREPTURI.UTILIZATORIINSPROC(utilizator, parola, inactiv, id_utilop)`** - creeaza un cont nou. Daca "Vali Iliescu"/"Valentina Iliescu" si "Raluca Ion" nu exista deja ca useri, acesta e pasul care ii creeaza, inainte de a le aloca `UTILDREPTINSPROC` pe firma LUDIPEDIA. ### 4.4 Cautare nume "Vali Iliescu" / "Valentina Iliescu" / "Raluca Ion" Cautat in tot codul VFP text (`.??2`) din `D:\ROA\ROASTART` (inclusiv COMUN local), variante `Iliescu`, `ILIESCU`, `Raluca Ion`, `ION R` - **NU GASIT**. Aceste nume nu apar in sursa aplicatiei (asteptat: userii sunt date, nu cod, stocate in tabela Oracle `UTILIZATORI` / vederea `vutilizatori`). Nu am interogat nicio baza Oracle (nici centrala, nici ConPress) in aceasta investigatie - e in afara scopului "read-only pe cod" cerut, si oricum ar necesita tunelul SSH + credentiale pe care nu le am. **Pentru confirmarea existentei conturilor "Vali Iliescu"/"Valentina Iliescu"/"Raluca Ion" e nevoie de o interogare SELECT (read-only) pe `UTILIZATORI`/`vutilizatori` pe instanta corecta (centrala ROA sau ConPress/xenoti, dupa unde vreti sa dati drepturile) - pas separat, de aprobat explicit inainte de rulare.** --- ## 5. Documentatie existenta pentru "deschidere firma noua" Cautat cu Grep (path explicit) in: - `D:\ROA\ROASTART\COMUN\` - **acest folder nu are subfolder `docs\`** (verificat cu `Get-ChildItem`: contine doar `clase, datemenu, Drepturi utilizatori, ferestre, grafice, include, meniuri, Plugin, PluginTemplate, programe, Rapoarte, utile` - fara `docs`). - `D:\ROA\ROAFACTURARE\COMUN\docs\` - singurul hit relevant e `conexiuni-tunel-ssh-odbc.md` (documenteaza tunelul/TNS/DSN, inclusiv randul "conpress", dar **nu** documenteaza fluxul de creare firma / SYN_NEWSCHEMAJOB / PACK_DREPTURI). **NU GASIT**: niciun document `docs/*.md` cu procedura pas-cu-pas de "deschidere firma noua" sau de "acordare drepturi pe firma noua". Fluxul de mai sus (punctele 2 si 4) a fost reconstruit direct din cod, nu dintr-o documentatie existenta. --- ## Concluzie operationala (fara nicio actiune executata) 1. Pentru a deschide firma LUDIPEDIA S.R.L. pe instalatia ConPress trebuie lucrat pe conexiunea `ROA_CONPRESS`/schema `xenoti` (tunel `conpress.tlp`), nu pe conexiunea centrala ROA - altfel firma s-ar crea in schema gresita. 2. Fluxul standard ROASTART (buton "Firma noua" -> editor "firme_mini" -> INSERT prin `PACK_DREPTURI.FIRMEMODINSPROC` -> `SYN_NEWSCHEMAJOB(schema, luna, an)` -> polling `SYN_NEWSCHEMAPROGRESS`) e generic si ruleaza pe orice conexiune activa, inclusiv ConPress - nu exista cod separat "doar pentru ConPress". 3. Drepturile catre Vali Iliescu / Valentina Iliescu / Raluca Ion se dau prin ecranul "DEFINIRE ROL PE FIRMA" (`frm_utilgrupf_nou`), care cheama `PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)` - dar existenta conturilor lor ca utilizatori pe instanta ConPress nu a putut fi confirmata din cod; e nevoie de o interogare separata pe date (aprobata explicit). 4. Niciun script sau modificare nu a fost scris/rulat - investigatie 100% read-only pe cod si pe un singur document `.md`.