Files
comun/docs/wip_firma-ludipedia-conpress/investigare_firma_noua_roastart.md
2026-09-16 21:11:41 +03:00

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`.