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