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

14 KiB

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.