sync SVN r18143

This commit is contained in:
2026-09-16 21:11:39 +03:00
parent b4d1d0bf7b
commit 6239681ac7
5 changed files with 1098 additions and 0 deletions

View File

@@ -0,0 +1,309 @@
<#
Genereaza fisierul .sql de deschidere firma (sablon PACK_DREPTURI.FIRMEMODINSPROC pe ConPress)
pornind de la interogarea publica ANAF (sursa de adevar pentru denumire/adresa/CAEN/data
inregistrare -- NU certificatul ONRC, care poate avea erori de OCR/transcriere).
Nu scrie nimic in Oracle. Genereaza doar un fisier .sql (cu Pasii 1/2/4 tot comentati, ca in
sablon) plecand de la schita existenta. Pasul 0 (SELECT) poate fi rulat optional daca se dau
parametrii de conexiune -- tunelul si credentialele raman responsabilitatea lui Marius.
Exemplu minimal:
.\deschide_firma_conpress.ps1 -Cui 54602536
Exemplu cu parametri suplimentari (banca, drepturi):
.\deschide_firma_conpress.ps1 -Cui 54602536 -Banca1 'BANCA X' -Contb1 'RO00XXXX...' `
-IdUtil 5 -IdGrupUseri 3 -IdUtilOp 5 -NumeUser1 Iliescu -PrenumeUser1 Vali `
-NumeUser2 Ion -PrenumeUser2 Raluca
#>
[CmdletBinding()]
param(
[Parameter(Mandatory)] [string]$Cui,
[datetime]$DataVerificare = (Get-Date),
[int]$LunaStart = 5,
[int]$AnStart = 2026,
[string]$TemplateSql = '',
[string]$OutSql = '',
# --- date pe care ANAF nu le are: parametri optionali, implicit goale ("DE COMPLETAT") ---
[string]$Antet = '',
[string]$Banca1 = '', [string]$Contb1 = '',
[string]$Codang = '', [string]$Nume = '', [string]$Prenume = '',
[string]$Telefon2 = '', [string]$Telefon3 = '', [string]$Fax = '', [string]$Email = '',
[string]$Oasp = '', [string]$CapitalSocVar = '', [string]$CapitalSocSub = '', [string]$PunctLuc = '',
[string]$Schema = '',
[string]$IdMama = '0', [string]$EMama = '',
[string]$IdLoc = '', [string]$IdUtil = '',
[string]$IdFormaJuridica = '', [string]$IdFormaOrganizare = '', [string]$IdFormaProp = '', [string]$IdTipSoc = '',
[string]$Indicativ = '', [string]$Declarant = '', [string]$Functie = '', [string]$IndiceItm = '',
[string]$TipModificare = '', [string]$CodFirma = '',
[string]$NumeUser1 = '', [string]$PrenumeUser1 = '', [string]$NumeUser2 = '', [string]$PrenumeUser2 = '',
[string]$IdGrupUseri = '', [string]$IdUtilOp = '',
# --- Pasul 0 (SELECT) optional -- doar daca se dau explicit parametrii de conexiune ---
[string]$TnsAlias = 'ROA_CONPRESS',
[string]$DbUser = '',
[securestring]$DbPassword,
[switch]$RunPas0,
[string]$SqlplusPath = 'D:\ROA\instantclient_19_18\sqlplus.exe',
[string]$TnsAdmin = 'D:\ROA\instantclient_19_18'
)
$ErrorActionPreference = 'Stop'
function Write-Utf8NoBom {
# sqlplus se poticneste pe BOM (SP2-0734) chiar rulat cu @fisier - scrie fara BOM explicit
param([string]$Path, [string[]]$Lines)
[System.IO.File]::WriteAllText($Path, ($Lines -join "`r`n") + "`r`n", (New-Object Text.UTF8Encoding($false)))
}
$ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path }
if (-not $TemplateSql) { $TemplateSql = Join-Path $ScriptDir 'schita_deschidere_firma_conpress.sql' }
function ConvertTo-DataRo {
param([string]$s)
if ([string]::IsNullOrWhiteSpace($s)) { return '' }
foreach ($fmt in @('dd.MM.yyyy', 'dd-MM-yyyy', 'yyyy-MM-dd')) {
$d = [datetime]::MinValue
if ([datetime]::TryParseExact($s, $fmt, [Globalization.CultureInfo]::InvariantCulture, [Globalization.DateTimeStyles]::None, [ref]$d)) {
return $d.ToString('dd.MM.yyyy')
}
}
return $s
}
function Get-DateAnaf {
param([string]$Cui, [datetime]$Data)
$cuiNum = ($Cui -replace '[^0-9]', '')
if ([string]::IsNullOrEmpty($cuiNum)) { throw "CUI invalid: '$Cui'" }
$dataStr = $Data.ToString('yyyy-MM-dd')
# JSON construit manual (payload trivial) - evita capcana ConvertTo-Json care despacheteaza
# array-uri de un singur element cand trece prin pipeline.
$body = '[{"cui":' + $cuiNum + ',"data":"' + $dataStr + '"}]'
$url = 'https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva'
# acelasi URL folosit de ANAF_CreeazaCerereANAF, COMUN\programe\validare.prg:1845
# decodare explicita UTF-8 din raspuns (nu Invoke-RestMethod): serverul ANAF nu trimite
# charset in Content-Type, PowerShell 5.1 ghiceste ISO-8859-1 si strica diacriticele -
# acelasi motiv notat in validare.prg:1744 pentru clientul VFP.
$req = [System.Net.WebRequest]::Create($url)
$req.Method = 'POST'
$req.ContentType = 'application/json; charset=utf-8'
$bytesOut = [Text.Encoding]::UTF8.GetBytes($body)
$req.ContentLength = $bytesOut.Length
$reqStream = $req.GetRequestStream()
$reqStream.Write($bytesOut, 0, $bytesOut.Length)
$reqStream.Close()
$webResp = $req.GetResponse()
$reader = New-Object IO.StreamReader($webResp.GetResponseStream(), [Text.Encoding]::UTF8)
$json = $reader.ReadToEnd()
$reader.Close()
$webResp.Close()
return $json | ConvertFrom-Json
}
function Get-DetaliiAdresa {
param([string]$Text)
$r = [ordered]@{ Bloc = ''; Scara = ''; Apart = '' }
if ([string]::IsNullOrWhiteSpace($Text)) { return $r }
if ($Text -match '(?i)BL\.?\s*([A-Z0-9\-]+)') { $r.Bloc = $Matches[1] }
if ($Text -match '(?i)SC\.?\s*([A-Z0-9\-]+)') { $r.Scara = $Matches[1] }
if ($Text -match '(?i)AP\.?\s*([A-Z0-9\-]+)') { $r.Apart = $Matches[1] }
return $r
# ponytail: heuristica regex pe text liber ANAF (bl./sc./ap.), nu un parser de adrese complet;
# de verificat manual daca formatul sediului difera (ex. "et." lipsa, abrevieri neuzuale).
}
# ---------------------------------------------------------------------------
# 1. Interogare ANAF
# ---------------------------------------------------------------------------
Write-Host "Interogare ANAF pentru CUI $Cui (data verificare $($DataVerificare.ToString('yyyy-MM-dd')))..."
$resp = Get-DateAnaf -Cui $Cui -Data $DataVerificare
if (-not $resp.found -or $resp.found.Count -eq 0) {
Write-Warning "ANAF nu a gasit CUI $Cui (cod=$($resp.cod), message=$($resp.message)). Nu se genereaza fisierul .sql."
if ($resp.notFound) { Write-Warning "notFound: $($resp.notFound -join ', ')" }
return
}
$item = $resp.found[0]
$dg = $item.date_generale
$adr = $item.adresa_sediu_social
$tva = $item.inregistrare_scop_Tva
# data_inregistrare (yyyy-MM-dd) e campul structurat; stare_inregistrare (text liber cu
# data in dd.mm.yyyy) e fallback daca lipseste.
$dataInregRaw = if ($dg.data_inregistrare) { [string]$dg.data_inregistrare }
elseif ($dg.stare_inregistrare -match '(\d{2}\.\d{2}\.\d{4})') { $Matches[1] }
else { '' }
# bl./sc./et./ap. NU sunt in adresa_sediu_social.sdetalii_Adresa (acolo apare doar
# "CAMERA n") - sunt in date_generale.adresa, campul text liber complet.
$detalii = Get-DetaliiAdresa -Text $dg.adresa
$anaf = [ordered]@{
p_firma = $dg.denumire
p_reg_comert = $dg.nrRegCom
p_caen = if ($dg.cod_CAEN) { [string]$dg.cod_CAEN } else { '' }
p_data_inreg = ConvertTo-DataRo $dataInregRaw
p_telefon = $dg.telefon
p_judet = $adr.sdenumire_Judet
p_localitate = $adr.sdenumire_Localitate
p_strada = $adr.sdenumire_Strada
p_numar = $adr.snumar_Strada
p_cod_postal = $adr.scod_Postal
p_bloc = $detalii.Bloc
p_scara = $detalii.Scara
p_apart = $detalii.Apart
}
$persoanaJuridica = if ($dg.forma_organizare -match '(?i)persoana\s*juridica') { 'D' } else { '' }
# ---------------------------------------------------------------------------
# 2. Restul parametrilor - din argumentele scriptului (ANAF nu le are)
# ---------------------------------------------------------------------------
$params = [ordered]@{
p_firma = @{ v = $anaf.p_firma; src = 'ANAF' }
p_antet = @{ v = if ($Antet) { $Antet } else { $anaf.p_firma }; src = if ($Antet) { 'PARAM' } else { 'ANAF (= denumire)' } }
p_cod_fiscal = @{ v = ($Cui -replace '[^0-9]', ''); src = 'PARAM (-Cui)' }
p_reg_comert = @{ v = $anaf.p_reg_comert; src = 'ANAF' }
p_caen = @{ v = $anaf.p_caen; src = 'ANAF' }
p_data_inreg = @{ v = $anaf.p_data_inreg; src = 'ANAF (date_generale.data_inregistrare)' }
p_judet = @{ v = $anaf.p_judet; src = 'ANAF' }
p_localitate = @{ v = $anaf.p_localitate; src = 'ANAF' }
p_strada = @{ v = $anaf.p_strada; src = 'ANAF' }
p_numar = @{ v = $anaf.p_numar; src = 'ANAF' }
p_bloc = @{ v = $anaf.p_bloc; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }
p_scara = @{ v = $anaf.p_scara; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }
p_apart = @{ v = $anaf.p_apart; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }
p_cod_postal = @{ v = $anaf.p_cod_postal; src = 'ANAF' }
p_banca1 = @{ v = $Banca1; src = if ($Banca1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }
p_contb1 = @{ v = $Contb1; src = if ($Contb1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }
p_persoana_juridica = @{ v = $persoanaJuridica; src = 'ANAF (forma_organizare)' }
p_codang = @{ v = $Codang; src = if ($Codang) { 'PARAM' } else { 'DE COMPLETAT' } }
p_nume = @{ v = $Nume; src = if ($Nume) { 'PARAM' } else { 'DE COMPLETAT (reprezentant legal)' } }
p_prenume = @{ v = $Prenume; src = if ($Prenume) { 'PARAM' } else { 'DE COMPLETAT' } }
p_telefon = @{ v = $anaf.p_telefon; src = 'ANAF' }
p_telefon2 = @{ v = $Telefon2; src = if ($Telefon2) { 'PARAM' } else { 'DE COMPLETAT' } }
p_telefon3 = @{ v = $Telefon3; src = if ($Telefon3) { 'PARAM' } else { 'DE COMPLETAT' } }
p_fax = @{ v = $Fax; src = if ($Fax) { 'PARAM' } else { 'DE COMPLETAT' } }
p_email = @{ v = $Email; src = if ($Email) { 'PARAM' } else { 'DE COMPLETAT' } }
p_oasp = @{ v = $Oasp; src = if ($Oasp) { 'PARAM' } else { 'DE COMPLETAT' } }
p_capital_soc_var = @{ v = $CapitalSocVar; src = if ($CapitalSocVar) { 'PARAM' } else { 'DE COMPLETAT' } }
p_capital_soc_sub = @{ v = $CapitalSocSub; src = if ($CapitalSocSub) { 'PARAM' } else { 'DE COMPLETAT' } }
p_punct_luc = @{ v = $PunctLuc; src = if ($PunctLuc) { 'PARAM' } else { 'gol (fara punct de lucru declarat)' } }
p_schema = @{ v = if ($Schema) { $Schema } else { $Cui }; src = if ($Schema) { 'PARAM' } else { 'DE CONFIRMAT (implicit = CUI, corecteaza cu -Schema)' } }
p_id_mama = @{ v = $IdMama; src = 'PARAM (implicit 0 = firma simpla)' }
p_e_mama = @{ v = $EMama; src = if ($EMama) { 'PARAM' } else { 'gol (relevant doar daca p_id_mama <> 0)' } }
p_id_loc = @{ v = $IdLoc; src = if ($IdLoc) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_util = @{ v = $IdUtil; src = if ($IdUtil) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_forma_juridica = @{ v = $IdFormaJuridica; src = if ($IdFormaJuridica) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_forma_organizare = @{ v = $IdFormaOrganizare; src = if ($IdFormaOrganizare) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_forma_prop = @{ v = $IdFormaProp; src = if ($IdFormaProp) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_tip_soc = @{ v = $IdTipSoc; src = if ($IdTipSoc) { 'PARAM' } else { 'DE COMPLETAT' } }
p_indicativ = @{ v = $Indicativ; src = if ($Indicativ) { 'PARAM' } else { 'DE COMPLETAT' } }
p_declarant = @{ v = $Declarant; src = if ($Declarant) { 'PARAM' } else { 'DE COMPLETAT' } }
p_functie = @{ v = $Functie; src = if ($Functie) { 'PARAM' } else { 'DE COMPLETAT' } }
p_indice_itm = @{ v = $IndiceItm; src = if ($IndiceItm) { 'PARAM' } else { 'DE COMPLETAT' } }
p_tip_modificare = @{ v = $TipModificare; src = if ($TipModificare) { 'PARAM' } else { 'DE COMPLETAT' } }
p_cod_firma = @{ v = $CodFirma; src = if ($CodFirma) { 'PARAM' } else { 'DE COMPLETAT' } }
p_luna_start = @{ v = [string]$LunaStart; src = 'PARAM (implicit 5)' }
p_an_start = @{ v = [string]$AnStart; src = 'PARAM (implicit 2026)' }
p_nume_user1 = @{ v = $NumeUser1; src = if ($NumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }
p_prenume_user1 = @{ v = $PrenumeUser1; src = if ($PrenumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }
p_nume_user2 = @{ v = $NumeUser2; src = if ($NumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }
p_prenume_user2 = @{ v = $PrenumeUser2; src = if ($PrenumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_grup_useri = @{ v = $IdGrupUseri; src = if ($IdGrupUseri) { 'PARAM' } else { 'DE COMPLETAT' } }
p_id_utilop = @{ v = $IdUtilOp; src = if ($IdUtilOp) { 'PARAM' } else { 'DE COMPLETAT' } }
}
# adresa compusa, ca in sablon
$params['p_adresa'] = @{
v = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'
src = 'derivat (sablon sqlplus, substituit din campurile de mai sus)'
}
# ---------------------------------------------------------------------------
# 3. Genereaza blocul DEFINE si scrie fisierul .sql (Pas 0-4 din sablon, neschimbate)
# ---------------------------------------------------------------------------
if (-not (Test-Path -LiteralPath $TemplateSql)) { throw "Sablon lipsa: $TemplateSql" }
$templateLines = Get-Content -LiteralPath $TemplateSql -Encoding UTF8
$startIdx = ($templateLines | Select-String -Pattern '^DEFINE p_firma\s*=').LineNumber
$endIdx = ($templateLines | Select-String -Pattern '^DEFINE p_id_utilop\s*=').LineNumber
if (-not $startIdx -or -not $endIdx) { throw "Sablonul '$TemplateSql' nu are markerii asteptati (DEFINE p_firma / DEFINE p_id_utilop) - format schimbat?" }
$startIdx = $startIdx[0] - 1
$endIdx = $endIdx[0] - 1
$before = $templateLines[0..($startIdx - 1)]
$after = $templateLines[($endIdx + 1)..($templateLines.Count - 1)]
$newBlock = New-Object System.Collections.Generic.List[string]
$newBlock.Add('-- ============================================================================')
$newBlock.Add("-- PARAMETRI GENERATI AUTOMAT de deschide_firma_conpress.ps1")
$newBlock.Add("-- Rulat: $(Get-Date -Format 'dd.MM.yyyy HH:mm') -- CUI interogat: $Cui -- data verificare ANAF: $($DataVerificare.ToString('dd.MM.yyyy'))")
$newBlock.Add("-- Sursa adresa/denumire/CAEN/data inregistrare: ANAF (webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva),")
$newBlock.Add("-- NU certificatul ONRC -- ANAF e sursa de adevar (posibil OCR gresit pe certificat).")
$newBlock.Add("-- Fiecare linie e adnotata cu sursa valorii: ANAF / PARAM (dat la rulare) / DE COMPLETAT.")
$newBlock.Add('-- ============================================================================')
$newBlock.Add('')
foreach ($key in $params.Keys) {
$entry = $params[$key]
$val = [string]$entry.v
$line = "DEFINE $key".PadRight(30) + "= '$val' -- $($entry.src)"
$newBlock.Add($line)
}
$newBlock.Add('')
if (-not $OutSql) {
$OutSql = Join-Path (Split-Path -Path $TemplateSql -Parent) "deschidere_firma_$($Cui)_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql"
}
$outLines = $before + $newBlock + $after
Write-Utf8NoBom -Path $OutSql -Lines $outLines
Write-Host "Fisier generat: $OutSql"
# ---------------------------------------------------------------------------
# 4. Rezumat consola: ce a venit din ANAF vs ce a ramas gol
# ---------------------------------------------------------------------------
Write-Host ''
Write-Host '=== Rezumat campuri ==='
foreach ($key in $params.Keys) {
$entry = $params[$key]
$shown = if ([string]::IsNullOrWhiteSpace([string]$entry.v)) { '(gol)' } else { $entry.v }
Write-Host ("{0,-24} {1,-45} [{2}]" -f $key, $shown, $entry.src)
}
# ---------------------------------------------------------------------------
# 5. Pasul 0 (SELECT) optional -- doar daca s-au dat explicit parametrii de conexiune
# ---------------------------------------------------------------------------
if ($RunPas0) {
if (-not $DbUser -or -not $DbPassword) {
Write-Warning "RunPas0 cerut dar lipsesc -DbUser/-DbPassword. Tunelul/conexiunea raman responsabilitatea lui Marius -- se sare peste Pasul 0."
}
elseif (-not (Test-Path -LiteralPath $SqlplusPath)) {
Write-Warning "sqlplus nu a fost gasit la '$SqlplusPath'. Se sare peste Pasul 0."
}
else {
$pas0Start = ($after | Select-String -Pattern '^-- PAS 0 ').LineNumber
$pas0End = ($after | Select-String -Pattern '^-- PAS 1 ').LineNumber
if (-not $pas0Start -or -not $pas0End) {
Write-Warning "Nu s-a gasit sectiunea PAS 0 in sablon. Se sare peste."
}
else {
$pas0Lines = $after[($pas0Start[0] - 1)..($pas0End[0] - 2)]
$tmpSql = [System.IO.Path]::GetTempFileName() -replace '\.tmp$', '.sql'
Write-Utf8NoBom -Path $tmpSql -Lines ($newBlock + $pas0Lines)
$bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($DbPassword)
try {
$plainPwd = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)
$env:TNS_ADMIN = $TnsAdmin
& $SqlplusPath -S -L "$DbUser/$plainPwd@$TnsAlias" "@$tmpSql"
} finally {
[Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)
$plainPwd = $null
Remove-Item -LiteralPath $tmpSql -ErrorAction SilentlyContinue
}
}
}
}

View File

@@ -0,0 +1,265 @@
# 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`.

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,94 @@
# Sarcina lane firma-ludipedia-contafin
Continuam un draft (neexecutat) de deschidere firma LUDIPEDIA S.R.L. (CUI 54602536) pe
instalatia Oracle ROA ConPress, schema noua **LUDIPEDIA**. Fisiere deja existente, CITESTE-LE
INTAI (nu suprascrie structura, doar completeaza):
- `C:\Users\mmari\AppData\Local\Temp\claude\D--ROA-ROAFACTURARE\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\scratchpad\schita_deschidere_firma_conpress.sql`
- `C:\Users\mmari\AppData\Local\Temp\claude\D--ROA-ROAFACTURARE\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\scratchpad\deschide_firma_conpress.ps1`
Documente de referinta (citeste-le, nu presupune):
- `D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md` (tunel/TNS/DSN, reguli productie:
DOAR SELECT, fara INSERT/UPDATE/DELETE/DDL)
- `D:\ROA\ROAFACTURARE\COMUN\docs\conventie_mediu_oracle.md` (rolul schemei `CONTAFIN_ORACLE`)
- `D:\ROA\ROAFACTURARE\COMUN\docs\local\oracle.md` (parole reale, neversionat in git — foloseste-l
pentru user/parola de conectare)
## Contract de parametri al scriptului PS1 (cerinta noua a lui Marius, prioritara)
`deschide_firma_conpress.ps1` trebuie sa aiba ca parametri **OBLIGATORII doar 3**: codul fiscal
(CUI), anul si luna de deschidere (start contabil). Restul (adresa, denumire, reg.com., CAEN,
telefon, cod postal) se obtin automat din interogarea ANAF folosind CUI-ul. Codurile interne
comune (`id_forma_juridica/organizare/prop/tip_soc`, `id_grup` uzual) gasite la pasul de
verificare DB de mai jos devin **valori implicite hardcodate in script** (nu parametri
obligatorii) — daca Marius vrea sa le schimbe pentru un caz special, ramane parametru optional
cu acea valoare implicita. Datele care chiar nu au nicio sursa automata (banca/IBAN, email,
reprezentant legal, capital social) raman parametri optionali, impliciti goale.
Rescrie semnatura `param(...)` a scriptului sa reflecte asta: `-Cui` (obligatoriu), `-An`
(obligatoriu), `-Luna` (obligatoriu), apoi restul optionale cu valori implicite (codurile comune
gasite la pasul DB, sau gol/"DE COMPLETAT" pentru ce nu are sursa). Nu schimba `-Cui/-An/-Luna`
sa fie optionale sau sa aiba alte nume.
## Ce a stabilit deja Marius (nu re-investiga, doar aplica)
- Nu e nevoie de parola schemei `xenoti`/`LUDIPEDIA` (firma inca nu exista). Nomenclatorul de
firme si drepturile de utilizatori sunt in schema **`CONTAFIN_ORACLE`** (comuna, o instanta pe
fiecare server — deci exista un `CONTAFIN_ORACLE` propriu pe serverul ConPress, la care trebuie
sa te conectezi, nu pe schema centrala ROA_CENTRAL).
- Tabela cu nomenclatorul de firme se numeste **`nom_firme`** (nu "firme" — corecteaza daca
gasesti alt nume real dupa ce te conectezi si verifici).
- Parola standard pe care sistemul o pune automat la deschiderea unei firme noi este
**`ROMFASTSOFT`** (confirmat de Marius; consistent cu `COMUN\docs\depanare-spatiu-oracle.md:59-63`
care spune ca `PACK_UPDATE.GetSchemaParola` intoarce `'ROMFASTSOFT'` hardcodat pentru schemele
de firma). Foloseste-o ca prima incercare daca ai nevoie sa te loghezi ca `contafin_oracle` si
nu gasesti alta parola explicita in `oracle.md`; daca `oracle.md` are o parola specifica pentru
`contafin_oracle` pe serverul conpress, aceea are prioritate.
- Profilul Bitvise pentru tunelul conpress a fost gasit anterior la
`D:\vm303-profile\conpress.tlp` (NU la calea din `conexiuni-tunel-ssh-odbc.md`,
`D:\roa\BITVISE\`) — verifica ambele cai, foloseste-o pe cea care exista.
## Ce trebuie sa faci (READ-ONLY pe Oracle — doar SELECT, respecta strict regula din
`conexiuni-tunel-ssh-odbc.md`; NU rula niciun INSERT/UPDATE/DELETE/DDL pe ConPress)
1. Ridica tunelul Bitvise spre conpress (`stnlc.exe -profile=<cale gasita>`), verifica portul
1521 deschis, conecteaza-te cu `sqlplus` (sau alt client disponibil) ca user `contafin_oracle`
pe alias TNS `ROA_CONPRESS`.
2. `DESC nom_firme` (sau interogare pe `USER_TAB_COLUMNS`/`ALL_TAB_COLUMNS`) ca sa confirmi
coloanele reale (asteptate: ceva similar cu `id_forma_juridica`, `id_forma_organizare`,
`id_forma_prop`, `id_tip_soc`, `cod_fiscal`, `reg_comert`, `schema`, etc. — numele exacte pot
diferi usor fata de ce a fost dedus anterior din codul VFP).
3. Gaseste combinatia cea mai FRECVENTA de `id_forma_juridica/id_forma_organizare/id_forma_prop/
id_tip_soc` in `nom_firme` (GROUP BY + COUNT, ORDER BY COUNT DESC) — Marius spune ca aceste
coduri sunt comune intre firme, deci cea mai frecventa combinatie e raspunsul corect pentru o
firma noua obisnuita (SRL).
4. Verifica daca CUI `54602536` exista deja in `nom_firme` (evitare duplicat).
5. Cauta userii "Vali"/"Valentina Iliescu" si "Raluca Ion" in tabelele/vederile de utilizatori
din `CONTAFIN_ORACLE` (numele exact poate fi `UTILIZATORI`/`vutilizatori` sau altul — verifica
ce exista real in schema). Daca exista, noteaza `id_util`.
6. Gaseste `id_grup` cel mai frecvent alocat pe firme recente (tabela de drepturi grup-firma,
posibil `DEF_GRUP`/`vdef_util_grup` sau echivalent real din schema).
7. Inchide tunelul la final, indiferent de rezultat.
## Actualizeaza cele 2 fisiere existente
- In `schita_deschidere_firma_conpress.sql`: completeaza `p_id_forma_juridica`,
`p_id_forma_organizare`, `p_id_forma_prop`, `p_id_tip_soc` cu combinatia gasita (noteaza sursa:
"cea mai frecventa combinatie, X din Y firme in CONTAFIN_ORACLE.nom_firme"). Completeaza
`p_id_util_1`/`p_id_util_2` daca userii exista, sau lasa gol cu nota clara daca nu exista inca
(caz in care trebuie creati intai cu `PACK_DREPTURI.UTILIZATORIINSPROC`, parola implicita
`ROMFASTSOFT`). Completeaza `p_id_grup_useri`. Actualizeaza notele de la inceputul fisierului
(inlocuieste "NOTA IMPORTANTA 6" care spunea ca verificarea a fost blocata, cu rezultatul real).
- In `deschide_firma_conpress.ps1`: daca ai gasit tabele/coloane cu nume diferite fata de ce
presupunea scriptul, corecteaza. Adauga parola implicita `ROMFASTSOFT` ca valoare implicita
pentru parametrul de parola la crearea userilor noi, daca scriptul are asa ceva.
## Raport obligatoriu (conform promptului de sistem)
Scrie `docs\raport_firma-ludipedia-contafin.md` (in radacina `D:\ROA\ROAFACTURARE`, sau daca nu
ai drept de scriere acolo, in acelasi folder scratchpad de mai sus) cu: ce ai reusit sa
conectezi/interoghezi, valorile exacte gasite, ce ai schimbat in cele 2 fisiere, si orice blocaj
(parola gresita, tabela cu alt nume, tunel care nu porneste). NU inventa date daca ceva nu merge —
raporteaza exact eroarea.
Ultimul tau mesaj: `GATA firma-ludipedia-contafin` sau
`BLOCAT firma-ludipedia-contafin: <motiv intr-un rand>`.

View File

@@ -0,0 +1,407 @@
-- ============================================================================
-- SCHITA (DRAFT) - Deschidere firma noua pe instalatia Oracle ROA ConPress
-- Fisier NEEXECUTAT, de aprobat de Marius inainte de orice rulare.
-- Schema tinta: LUDIPEDIA (confirmat de Marius; server conpress, tunel
-- Bitvise conpress.tlp, alias TNS + DSN ODBC ROA_CONPRESS).
-- ============================================================================
--
-- NOTA IMPORTANTA 1 - conflict de regula:
-- D:\ROA\ROAFACTURARE\COMUN\docs\conexiuni-tunel-ssh-odbc.md, sectiunea
-- "Reguli pe productie" (linia ~152), interzice explicit pe canalul manual
-- sqlplus-pe-tunel orice altceva in afara de SELECT:
-- "Doar SELECT. Fara INSERT/UPDATE/DELETE/DDL, fara ALTER SESSION care
-- schimba comportament persistent."
-- PASUL 0 din acest fisier (verificari) respecta regula (doar SELECT).
-- PASII 1-4 (INSERT firma, job schema, drepturi utilizatori) SCRIU date si
-- NU respecta acea regula daca ar fi rulati pe canalul manual descris in
-- document. Nu e o decizie luata aici: Marius decide canalul de executie
-- (cont/canal cu drept de scriere pe ConPress, sau rularea propriu-zisa
-- prin aplicatia ROASTART, care e calea normala de productie pentru
-- deschidere de firma).
--
-- NOTA IMPORTANTA 2 - stare fisier:
-- Acesta e o SCHITA, nu un script gata de rulare. Nimeni nu s-a conectat
-- la ConPress pentru a pregati acest fisier si nimeni nu l-a rulat.
--
-- NOTA IMPORTANTA 3 - parametri lipsa din certificatul ONRC (LUDIPEDIA):
-- certificatul de inregistrare acopera doar firma, CUI, nr. registru
-- comert, sediu social, CAEN principal si data inregistrarii. Urmatorii
-- parametri NU sunt in certificat si trebuie completati de Marius inainte
-- de orice executie (marcati mai jos si in sectiunea de parametri cu
-- "-- DE COMPLETAT"):
-- 1. Date bancare: nume banca + cont (IBAN) - pot fi 1 pana la 10 perechi
-- (banca1..banca10 / contb1..contb10 in FIRMEMODINSPROC). Interogarea
-- ANAF publica nu intoarce IBAN (camp gol in raspuns) - ramane de
-- completat de Marius.
-- 2. Telefon2, telefon3, fax, email (telefonul principal a fost completat
-- din ANAF, vezi NOTA IMPORTANTA 5).
-- 3. Reprezentant legal / declarant: nume, prenume, functie, cod
-- angajat (codang), indicativ, indice_itm.
-- 4. Incadrare firma: id_forma_juridica, id_forma_organizare,
-- id_forma_prop, id_tip_soc (coduri interne din nomenclatoarele
-- ROASTART - ANAF intoarce doar text descriptiv, nu codul ROASTART,
-- vezi NOTA IMPORTANTA 5).
-- 5. Capital social varsat (capital_soc_var) si subscris
-- (capital_soc_sub).
-- 6. Punct de lucru (punct_luc) - daca exista, separat de sediul social.
-- 7. id_mama / e_mama - firma simpla sau membra a unui grup deja
-- existent in ROASTART; daca simpla, id_mama = 0.
-- 8. id_loc (identificator localitate in nomenclatorul ROASTART),
-- cod_firma (cod intern firma), id_util (operatorul care introduce
-- firma - userul care ruleaza scriptul in ROASTART), oasp
-- (obligatie de asigurare - da/nu), tip_modificare.
-- Lista completa de parametri "DE COMPLETAT" e reluata langa fiecare
-- variabila din sectiunea PARAMETRI de mai jos.
--
-- NOTA IMPORTANTA 5 - date confirmate/completate din interogarea publica
-- ANAF (16.09.2026, CUI 54602536, serviciu
-- https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva - acelasi URL
-- folosit de procedura existenta ANAF_CreeazaCerereANAF in
-- D:\ROA\ROAFACTURARE\COMUN\programe\validare.prg:1845):
-- - Denumire, nr. registru comert (J2026028926001) si CAEN (9329)
-- CONFIRMATE, identice cu certificatul ONRC.
-- - Telefon completat: 0724968582 (p_telefon).
-- - Cod postal completat: 900217 (p_cod_postal).
-- - Adresa CONFIRMATA in mare parte, cu O DISCREPANTA fata de certificat:
-- certificatul avea p_numar = 'ZA', ANAF intoarce "2A" pentru acelasi
-- sediu (judet, localitate, strada, bloc L119A, scara A, apartament 2 -
-- identice, extrase din date_generale.adresa). Marius a confirmat ca
-- ANAF e sursa de adevar (OCR-ul certificatului e suspect) - p_numar a
-- fost SCHIMBAT mai jos la '2A' (fostul 'ZA' era probabil o citire
-- gresita a lui '2A').
-- - Data inregistrarii: certificatul avea 06.05.2026, ANAF intoarce
-- date_generale.data_inregistrare = 2026-05-04 (04.05.2026) si
-- stare_inregistrare = "INREGISTRAT din data 04.05.2026" - confirma
-- aceeasi data. Marius a confirmat ANAF ca sursa de adevar - p_data_inreg
-- a fost SCHIMBAT mai jos la '04.05.2026'.
-- - scpTVA = false -> firma NU e inregistrata ca platitoare de TVA la
-- data interogarii (util pentru p_persoana_juridica / incadrare, nu
-- schimba niciun parametru din FIRMEMODINSPROC direct).
-- - forma_organizare ANAF = "PERSOANA JURIDICA" -> confirma
-- p_persoana_juridica = 'D'.
-- - IBAN, email, capital social, reprezentant legal, forma juridica
-- interna ROASTART: NU sunt in raspunsul ANAF (serviciul public nu le
-- are) - raman "DE COMPLETAT" de Marius, nu s-au inventat valori.
--
-- NOTA IMPORTANTA 4 - useri drepturi:
-- Marius a CONFIRMAT: sunt DOAR 2 useri carora li se dau drepturi pe firma
-- noua. "Vali Iliescu" / "Valentina Iliescu" e UN SINGUR user (user 1,
-- prescurtare a aceluiasi nume), al doilea e "Raluca Ion" (user 2).
-- Fisierul schiteaza exact 2 blocuri la Pasul 4, dupa acelasi sablon.
-- Niciun id_util/id_grup nu e cunoscut inca -- se completeaza DUPA ce
-- Pasul 0 confirma daca userii exista deja in UTILIZATORI/vutilizatori.
--
-- NOTA IMPORTANTA 6 - verificare DB (Pasul A) INCERCATA si BLOCATA (16.09.2026):
-- Tunelul Bitvise s-a ridicat cu succes (`stnlc.exe -profile=D:\vm303-profile\
-- conpress.tlp`, profil gasit acolo, nu la calea din documentul de conexiuni;
-- port 127.0.0.1:1521 confirmat deschis, alias TNS ROA_CONPRESS rezolvat
-- spre SID=ROA). NU s-a putut merge mai departe: schema Oracle de pe
-- ConPress e "xenoti" (conform tabelului din conexiuni-tunel-ssh-odbc.md),
-- iar parola pentru acel user NU exista nicaieri accesibil (DSN ODBC
-- ROA_CONPRESS are UserID/Password goale in registry, nu e in Windows
-- Credential Manager, nu e in vreun fisier din D:\ROA cautat). Conform
-- regulii explicite din document ("Fara ghicit parole"), verificarea NU s-a
-- facut - nu s-a incercat nicio parola. Tunelul a fost inchis la loc dupa
-- incercare (port 1521 reconfirmat inchis).
-- RAMASE NEVERIFICATE, deci NEschimbate mai jos (raman "DE COMPLETAT"):
-- - combinatia comuna id_forma_juridica/id_forma_organizare/id_forma_prop/
-- id_tip_soc (GROUP BY pe firme) - nerulat.
-- - existenta userilor Vali/Valentina Iliescu si Raluca Ion in
-- UTILIZATORI/vutilizatori si id_util al lor - nerulat.
-- - id_grup uzual din vdef_util_grup - nerulat.
-- - unicitate CUI 54602536 in firme (nu exista deja) - nerulat.
-- Marius (sau cine are parola schemei xenoti pe ConPress) trebuie sa ruleze
-- Pasul 0 manual, sau sa dea parola unei sesiuni viitoare.
--
-- ============================================================================
-- PARAMETRI DE SUBSTITUIRE (sqlplus DEFINE) - reutilizabile pentru orice
-- firma noua. Valorile de mai jos vin din interogarea ANAF (sursa de adevar
-- pentru identificare/adresa/CAEN/data inregistrare) plus certificatul ONRC
-- pentru ce ANAF nu acopera; codurile interne ROASTART si userii raman
-- DE COMPLETAT -- verificarea DB (NOTA IMPORTANTA 6) a fost blocata.
-- ============================================================================
-- --- identificare firma (din certificatul ONRC) ---
DEFINE p_firma = 'LUDIPEDIA S.R.L.'
DEFINE p_antet = 'LUDIPEDIA S.R.L.'
DEFINE p_cod_fiscal = '54602536'
DEFINE p_reg_comert = 'J2026028926001'
DEFINE p_caen = '9329' -- CONFIRMAT: identic in raspunsul ANAF (cod_CAEN) din 16.09.2026
DEFINE p_data_inreg = '04.05.2026' -- SCHIMBAT din certificat (06.05.2026) -- sursa ANAF (date_generale.data_inregistrare), vezi NOTA IMPORTANTA 5
-- --- adresa sediu social (din certificatul ONRC) ---
DEFINE p_judet = 'Constanta'
DEFINE p_localitate = 'Constanta'
DEFINE p_strada = 'Strada Baba Novac'
DEFINE p_numar = '2A' -- SCHIMBAT din certificat ('ZA') -- sursa ANAF (date_generale.adresa / snumar_Strada), vezi NOTA IMPORTANTA 5
DEFINE p_bloc = 'L119A'
DEFINE p_scara = 'A'
DEFINE p_apart = '2'
DEFINE p_cod_postal = '900217' -- completat din ANAF (16.09.2026), nu era in certificat
DEFINE p_adresa = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'
-- --- date lipsa din certificat, obligatorii pentru FIRMEMODINSPROC ---
DEFINE p_banca1 = '' -- DE COMPLETAT (serviciul public ANAF nu intoarce IBAN)
DEFINE p_contb1 = '' -- DE COMPLETAT (IBAN)
-- banca2..banca10 / contb2..contb10: DE COMPLETAT doar daca exista mai multe conturi
DEFINE p_persoana_juridica = 'D' -- confirmat de forma_organizare ANAF = "PERSOANA JURIDICA" (D/F dupa conventia ROASTART)
DEFINE p_codang = '' -- DE COMPLETAT (cod angajat / reprezentant)
DEFINE p_nume = '' -- DE COMPLETAT (nume reprezentant legal / declarant)
DEFINE p_prenume = '' -- DE COMPLETAT
DEFINE p_telefon = '0724968582' -- completat din ANAF (16.09.2026), nu era in certificat
DEFINE p_telefon2 = '' -- DE COMPLETAT
DEFINE p_telefon3 = '' -- DE COMPLETAT
DEFINE p_fax = '' -- DE COMPLETAT
DEFINE p_email = '' -- DE COMPLETAT
DEFINE p_oasp = '' -- DE COMPLETAT (da/nu, dupa conventia ROASTART)
DEFINE p_capital_soc_var = '' -- DE COMPLETAT
DEFINE p_capital_soc_sub = '' -- DE COMPLETAT
DEFINE p_punct_luc = '' -- DE COMPLETAT (daca exista, altfel gol)
DEFINE p_schema = 'LUDIPEDIA' -- CONFIRMAT de Marius
DEFINE p_id_mama = '0' -- DE CONFIRMAT: 0 daca firma simpla, altfel id firma-mama existenta
DEFINE p_e_mama = '' -- DE COMPLETAT doar daca p_id_mama <> 0
DEFINE p_id_loc = '' -- DE COMPLETAT (id localitate in nomenclator ROASTART)
DEFINE p_id_util = '' -- DE COMPLETAT (operatorul care introduce firma in ROASTART)
DEFINE p_id_forma_juridica = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6
DEFINE p_id_forma_organizare = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6
DEFINE p_id_forma_prop = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6
DEFINE p_id_tip_soc = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6
DEFINE p_indicativ = '' -- DE COMPLETAT
DEFINE p_declarant = '' -- DE COMPLETAT (nume declarant, poate fi = p_nume/p_prenume)
DEFINE p_functie = '' -- DE COMPLETAT (functia declarantului)
DEFINE p_indice_itm = '' -- DE COMPLETAT
DEFINE p_tip_modificare = '' -- DE COMPLETAT
DEFINE p_cod_firma = '' -- DE COMPLETAT (cod intern firma in ROASTART)
-- --- job schema Oracle noua (start contabil) ---
DEFINE p_luna_start = '5' -- CONFIRMAT de Marius pentru LUDIPEDIA
DEFINE p_an_start = '2026' -- CONFIRMAT de Marius pentru LUDIPEDIA
-- --- useri carora li se dau drepturi pe firma noua (DOAR 2, confirmat de Marius) ---
DEFINE p_nume_user1 = 'Iliescu'
DEFINE p_prenume_user1= 'Vali' -- "Vali" / "Valentina" -- confirmat: aceeasi persoana (user 1)
DEFINE p_nume_user2 = 'Ion'
DEFINE p_prenume_user2= 'Raluca'
DEFINE p_id_grup_useri = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6
DEFINE p_id_utilop = '' -- DE COMPLETAT (operator care insereaza drepturile, poate fi = p_id_util)
-- ============================================================================
-- PAS 0 -- VERIFICARE (doar SELECT, sigur pe canalul sqlplus-tunel)
-- Scop: (a) userii Vali/Valentina Iliescu si Raluca Ion exista deja in
-- UTILIZATORI/vutilizatori? (b) firma cu acest CUI exista deja pe
-- schema LUDIPEDIA (evitare duplicat)?
-- ============================================================================
-- 0a. Cautare useri dupa nume (LIKE, pentru ca nu stim daca "Vali" e nume complet)
SELECT id_util, utilizator, nume, prenume, inactiv
FROM vutilizatori
WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user1.' || '%')
OR UPPER(prenume) LIKE UPPER('%Vali%')
OR UPPER(prenume) LIKE UPPER('%Valentina%')
FETCH FIRST 20 ROWS ONLY;
SELECT id_util, utilizator, nume, prenume, inactiv
FROM vutilizatori
WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user2.' || '%')
OR UPPER(prenume) LIKE UPPER('%' || '&p_prenume_user2.' || '%')
FETCH FIRST 20 ROWS ONLY;
-- 0b. Drepturi deja existente pe firme, ca sa vedem grupul folosit uzual
-- (util pentru completarea p_id_grup_useri de mai sus)
SELECT id_dug, id_grup, id_firma, firma
FROM vdef_util_grup
WHERE id_grup IN (
SELECT DISTINCT id_grup FROM vdef_util_grup
)
FETCH FIRST 50 ROWS ONLY;
-- 0c. Firma cu acest CUI exista deja? (evitare duplicat la Pasul 1)
SELECT id, firma, cod_fiscal, reg_comert
FROM firme
WHERE REGEXP_REPLACE(UPPER(TRIM(cod_fiscal)), '[^0-9]', '') =
REGEXP_REPLACE(UPPER(TRIM('&p_cod_fiscal.')), '[^0-9]', '')
FETCH FIRST 10 ROWS ONLY;
-- ============================================================================
-- PAS 1 -- INSERT FIRMA
-- PACK_DREPTURI.FIRMEMODINSPROC(...)
-- Sursa semnaturii: D:\ROA\ROASTART\COMUN\clase\ofirma.vc2:130-146
-- ATENTIE: scrie date -- NU e SELECT, vezi NOTA IMPORTANTA 1 de la inceput.
-- Ordinea parametrilor de mai jos respecta exact ordinea din semnatura.
-- ============================================================================
-- BEGIN
-- PACK_DREPTURI.FIRMEMODINSPROC(
-- p_id => NULL, -- id nou, generat de procedura/secventa
-- p_firma => '&p_firma.',
-- p_antet => '&p_antet.',
-- p_cod_fiscal => '&p_cod_fiscal.',
-- p_reg_comert => '&p_reg_comert.',
-- p_banca1 => '&p_banca1.',
-- p_contb1 => '&p_contb1.',
-- p_banca2 => NULL, p_contb2 => NULL,
-- p_banca3 => NULL, p_contb3 => NULL,
-- p_banca4 => NULL, p_contb4 => NULL,
-- p_banca5 => NULL, p_contb5 => NULL,
-- p_banca6 => NULL, p_contb6 => NULL,
-- p_banca7 => NULL, p_contb7 => NULL,
-- p_banca8 => NULL, p_contb8 => NULL,
-- p_banca9 => NULL, p_contb9 => NULL,
-- p_banca10 => NULL, p_contb10 => NULL,
-- p_adresa => '&p_adresa.',
-- p_cod_firma => '&p_cod_firma.',
-- p_persoana_juridica=> '&p_persoana_juridica.',
-- p_codang => '&p_codang.',
-- p_nume => '&p_nume.',
-- p_prenume => '&p_prenume.',
-- p_telefon => '&p_telefon.',
-- p_telefon2 => '&p_telefon2.',
-- p_telefon3 => '&p_telefon3.',
-- p_fax => '&p_fax.',
-- p_email => '&p_email.',
-- p_oasp => '&p_oasp.',
-- p_capital_soc_var => '&p_capital_soc_var.',
-- p_capital_soc_sub => '&p_capital_soc_sub.',
-- p_punct_luc => '&p_punct_luc.',
-- p_caen => '&p_caen.',
-- p_schema => '&p_schema.',
-- p_judet => '&p_judet.',
-- p_localitate => '&p_localitate.',
-- p_strada => '&p_strada.',
-- p_numar => '&p_numar.',
-- p_bloc => '&p_bloc.',
-- p_scara => '&p_scara.',
-- p_apart => '&p_apart.',
-- p_cod_postal => '&p_cod_postal.',
-- p_id_mama => &p_id_mama.,
-- p_e_mama => '&p_e_mama.',
-- p_id_loc => '&p_id_loc.',
-- p_id_util => '&p_id_util.',
-- p_id_forma_juridica=> '&p_id_forma_juridica.',
-- p_id_forma_organizare => '&p_id_forma_organizare.',
-- p_id_forma_prop => '&p_id_forma_prop.',
-- p_id_tip_soc => '&p_id_tip_soc.',
-- p_indicativ => '&p_indicativ.',
-- p_declarant => '&p_declarant.',
-- p_functie => '&p_functie.',
-- p_indice_itm => '&p_indice_itm.',
-- p_tip_modificare => '&p_tip_modificare.',
-- p_caen_revizie => NULL
-- );
-- END;
-- /
-- ============================================================================
-- PAS 2 -- JOB CREARE SCHEMA ORACLE (async)
-- SYN_NEWSCHEMAJOB(pcSchema, pnLuna, pnAn)
-- Se apeleaza doar daca firma e simpla (p_id_mama = 0), nu membra de grup.
-- ATENTIE: porneste un job -- scrie/creeaza obiecte, nu e SELECT.
-- ============================================================================
-- BEGIN
-- IF &p_id_mama. = 0 THEN
-- SYN_NEWSCHEMAJOB('&p_schema.', &p_luna_start., &p_an_start.);
-- END IF;
-- END;
-- /
-- ============================================================================
-- PAS 3 -- POLL STATUS JOB SCHEMA
-- SYN_NEWSCHEMAPROGRESS(pcSchema) -- functie, intoarce status text.
-- Se astepta 'FINALIZAT'. Job async: poate dura; NU se face poll fara
-- timeout/numar maxim de incercari (exemplu mai jos, de adaptat manual
-- sau intr-un script client, nu ca bucla PL/SQL blocanta pe productie).
-- ============================================================================
-- Interogare punctuala (de rulat manual, la interval, cu numarare manuala
-- a incercarilor -- max. N incercari, ex. 30, la 10 secunde):
SELECT SYN_NEWSCHEMAPROGRESS('&p_schema.') AS status_job FROM dual;
-- Varianta PL/SQL cu timeout explicit (DOAR ca exemplu -- de adaptat/testat
-- de Marius inainte de folosire, nu se stie limita reala de reincercari):
-- DECLARE
-- v_status VARCHAR2(100);
-- v_incercari PLS_INTEGER := 0;
-- c_max_incercari CONSTANT PLS_INTEGER := 30; -- DE CONFIRMAT
-- c_pauza_sec CONSTANT PLS_INTEGER := 10; -- DE CONFIRMAT
-- BEGIN
-- LOOP
-- v_status := SYN_NEWSCHEMAPROGRESS('&p_schema.');
-- EXIT WHEN v_status = 'FINALIZAT' OR v_incercari >= c_max_incercari;
-- v_incercari := v_incercari + 1;
-- DBMS_LOCK.SLEEP(c_pauza_sec);
-- END LOOP;
-- IF v_status != 'FINALIZAT' THEN
-- RAISE_APPLICATION_ERROR(-20000, 'Job schema neterminat dupa timeout, status=' || v_status);
-- END IF;
-- END;
-- /
-- ============================================================================
-- PAS 4 -- DREPTURI UTILIZATORI PE FIRMA NOUA
-- PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)
-- Sursa: D:\ROA\ROASTART\Clase\ostart_util.vc2:32-40
-- id_util / id_grup se completeaza DUPA ce Pasul 0a confirma daca userii
-- exista deja. id_firma se completeaza cu id-ul intors de Pasul 1.
-- ATENTIE: scrie date, nu e SELECT.
-- ============================================================================
DEFINE p_id_firma_noua = '' -- DE COMPLETAT dupa Pasul 1 (id firma inserata)
-- --- user 1: Vali / Valentina Iliescu (o singura persoana, confirmat) ---
DEFINE p_id_util_1 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6); gol daca userul nu exista inca
-- optional, doar daca userul NU exista inca in UTILIZATORI:
-- BEGIN
-- PACK_DREPTURI.UTILIZATORIINSPROC(
-- p_utilizator => '', -- DE COMPLETAT (login)
-- p_parola => '', -- DE COMPLETAT (parola initiala)
-- p_inactiv => 'N',
-- p_id_utilop => &p_id_utilop.
-- );
-- END;
-- /
-- BEGIN
-- PACK_DREPTURI.UTILDREPTINSPROC(
-- p_id_util => &p_id_util_1.,
-- p_id_grup => &p_id_grup_useri.,
-- p_id_firma => &p_id_firma_noua.,
-- p_id_utilop=> &p_id_utilop.
-- );
-- END;
-- /
-- --- user 2: Raluca Ion ---
DEFINE p_id_util_2 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6)
-- optional, doar daca userul NU exista inca:
-- BEGIN
-- PACK_DREPTURI.UTILIZATORIINSPROC(
-- p_utilizator => '', -- DE COMPLETAT (login)
-- p_parola => '', -- DE COMPLETAT (parola initiala)
-- p_inactiv => 'N',
-- p_id_utilop => &p_id_utilop.
-- );
-- END;
-- /
-- BEGIN
-- PACK_DREPTURI.UTILDREPTINSPROC(
-- p_id_util => &p_id_util_2.,
-- p_id_grup => &p_id_grup_useri.,
-- p_id_firma => &p_id_firma_noua.,
-- p_id_utilop=> &p_id_utilop.
-- );
-- END;
-- /
-- ============================================================================
-- SFARSIT SCHITA. De aprobat de Marius -- vezi NOTA IMPORTANTA 1-4 de la
-- inceputul fisierului inainte de orice rulare.
-- ============================================================================