diff --git a/docs/wip_firma-ludipedia-conpress/deschide_firma_conpress.ps1 b/docs/wip_firma-ludipedia-conpress/deschide_firma_conpress.ps1 new file mode 100644 index 0000000..bf0073f --- /dev/null +++ b/docs/wip_firma-ludipedia-conpress/deschide_firma_conpress.ps1 @@ -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 + } + } + } +} diff --git a/docs/wip_firma-ludipedia-conpress/investigare_firma_noua_roastart.md b/docs/wip_firma-ludipedia-conpress/investigare_firma_noua_roastart.md new file mode 100644 index 0000000..0913a09 --- /dev/null +++ b/docs/wip_firma-ludipedia-conpress/investigare_firma_noua_roastart.md @@ -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`. diff --git a/docs/wip_firma-ludipedia-conpress/opencode_firma-ludipedia-contafin.log b/docs/wip_firma-ludipedia-conpress/opencode_firma-ludipedia-contafin.log new file mode 100644 index 0000000..0f84033 --- /dev/null +++ b/docs/wip_firma-ludipedia-conpress/opencode_firma-ludipedia-contafin.log @@ -0,0 +1,23 @@ +{"type":"step_start","timestamp":1789550001490,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97dfd4a001Pa5Zy6YyOWb6tx","messageID":"msg_0a97df014001gSUlcHj9aZimH0","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","type":"step-start"}} +{"type":"tool_use","timestamp":1789550003084,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"read","callID":"call_00_4l42OIXHnB5P75vEZOIp0778","state":{"status":"completed","input":{"filePath":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\reguli_lucru.md"},"output":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\reguli_lucru.md\nfile\n\n1: # Reguli de lucru agent (comune proiectelor ROA VFP)\n2: \n3: 0. **Contextul sesiunii principale: te opresti la maxim 250k si salvezi progresul.** Nu e\n4: optional si nu se negociaza cu \"mai termin o banda\". La 250k opresti lucrul, scrii in fisierul\n5: de progres starea exacta - ce e gata si testat, ce e scris dar neverificat, ce fisiere sunt\n6: lasate intr-o stare intermediara (in special text `.vc2`/`.sc2` fara write-back in binar) si\n7: care e primul lucru de facut - si predai unei sesiuni noi. Limita absoluta 275k.\n8: Nu estima contextul, masoara-l (`monitorizare-context.md`); daca nu ai masuratoare, opreste-te\n9: mai devreme, nu mai tarziu. Orchestrarea multor benzi paralele consuma context mai repede\n10: decat pare: fiecare raport de agent, fiecare verificare si fiecare decizie se aduna.\n11: \n12: 1. Modificari de cod: diff ca FISIER `docs\\diff_runda_.patch`\n13: (`git diff --no-index `), nu in terminal. **COMMIT-ul** e singurul pas\n14: care asteapta aprobarea patch-ului. Write-back-ul in binar (txt2vcx) si testele se fac IMEDIAT\n15: dupa editarea `.vc2`/`.sc2`, fara sa astepti raspunsul — inclusiv pe `COMUN` — ca sa ajungi la\n16: review cu rezultatele testelor, nu cu o propunere netestata; daca nu merge, revii cu\n17: `git checkout` pe binare (`.vcx`+`.vct`) sau cu write-back din `*.pre_runda*.bak`.\n18: Patch-urile (in .gitignore, `docs/diff_runda*.patch`) nu se comit niciodata, raman local.\n19: Curatenia de dinainte de commit NU se face pe cap de agent, ci cu\n20: `powershell -File COMUN\\utile\\curatenie.ps1` (`-DryRun` listeaza fara sa stearga): patch-uri,\n21: handoff-uri/planuri de runda, notele de rezolvare (`docs/fix_*.md`, `docs/fix_*.diff`),\n22: `*.pre_runda*.bak`, `.bak`-urile din cache-ul text si artefactele\n23: de test (`screenshots*`, `uisync*`, `.fxp`, `.err`, loguri). Sterge doar fisiere neurmarite de\n24: git — cele tracked sunt sarite.\n25: 2. Comentarii in cod SI in scripturile de migrare `.sql`: minime, strict functionale, descriu\n26: comportamentul CURENT (ca si cum ar fi scris asa de la inceput). **Doar daca e cazul** — un\n27: comentariu se scrie acolo unde explica o **ramura** sau un **filtru** care nu se citeste singur,\n28: ca sa se inteleaga codul; unde codul e limpede, nu se comenteaza. O linie de regula, 2-3 doar\n29: pentru metode cu contract nebanal (parametri, cursor asteptat/lasat deschis, pozitionare la\n30: iesire), 4-5 in antetul unui script de migrare (ce e obiectul si ce contract are).\n31: INTERZIS in comentariu: nume de agent (\"claude\"), referinte la planuri, stories, propuneri,\n32: decizii, etape sau erori (`docs/plan_*.md`, `docs/propuneri_*.md`, \"#6\", \"S4\", \"M2\", \"T3\",\n33: \"dec.6\", \"runda27\", \"E7\", \"D-H2\"), trimiteri la rapoartele din `docs/` (\"vezi raportul,\n34: sectiunea ...\"), justificarea alegerii facute (de ce numele acesta, de ce s-a respins varianta\n35: cealalta), istoricul modificarii (\"inlocuieste...\", \"nu mai depinde de...\", \"mutat din...\"),\n36: date si autori pe cod nou.\n37: Comentarii vechi in stil jurnal nu se rescriu din oficiu — doar cand blocul e oricum atins\n38: sau la cerere explicita.\n39: Istoricul modificarilor sta DOAR in antetul fisierului (niciodata inline, la fel in `.prg`,\n40: `.sql` si PL/SQL Oracle): o singura intrare CUMULATIVA per functionalitate (`*!* DD.MM.YYYY` /\n41: `*!* autor` / `*!* ce face, 1-2 fraze`) — la revenire se rescrie intrarea, nu se adauga alta;\n42: autorul e cine semneaza livrarea (ex. `marius.mutu`), niciodata agent. Doar comportamentul\n43: final — fara revizii/runde/patch-uri/corectii. La rezolvari de erori: fara comentarii.\n44: Explicatiile merg in docs/ sau in mesajul de commit, nu in cod.\n45: Changelog (`changelog_.txt`): strictul necesar, pe limba utilizatorului, non-tehnic\n46: — 1-3 fraze/intrare, fara detalii de implementare, fara enumerarea locurilor atinse. Cat timp\n47: lucrarea n-a ajuns la utilizatori, erorile introduse si corectate in interior NU se mentioneaza\n48: — intrarea descrie functionalitatea finala, `:nou:`/`:modificare:`; `:eroare:` doar pentru erori\n49: care au fost in productie.\n50: 3. Modificari minime si SCOPED: doar ce s-a cerut, doar pe cazul cu problema, fara refactorizari\n51: din oficiu. Cauta intai ce exista (`inventar-comun.md`) si refoloseste; daca lipseste ceva,\n52: propune COMPLETAREA unei functii/tabele/view comune, nu o varianta paralela. 80/20: solutia cea\n53: mai simpla care rezolva cazul real. Completeaza `inventar-comun.md` la orice descoperire/creare\n54: de element comun nedocumentat.\n55: **Scara (ponytail), te opresti la prima treapta care tine** - se aplica si de subagenti, nu doar\n56: de sesiunea principala: (1) trebuie sa existe? nevoie presupusa, nu ceruta = nu se scrie, se\n57: spune intr-un rand; (2) exista deja in cod (`inventar-comun.md`, `COMUN\\`, clasa/procedura din\n58: acelasi modul)? refoloseste; (3) o face limbajul (VFP, SQL Oracle) sau o biblioteca deja\n59: incarcata in `roacont.prg`? foloseste-o - dependinta noua, niciodata pentru ce tin cateva linii;\n60: (4) intra intr-o linie? o linie; (5) abia apoi minimul care merge.\n61: Scara scurteaza SOLUTIA, niciodata cititul: intai urmaresti fluxul real prin toate fisierele\n62: atinse, apoi alegi treapta. Diff mic in locul gresit nu e economie, e a doua eroare.\n63: La eroare: repari cauza in functia comuna prin care trec toti apelantii (`-Grep` pe apelanti\n64: inainte de a edita), nu doar calea din raport - o garda intr-un loc e diff mai mic decat o garda\n65: in fiecare apelant, si nu lasa fratii stricati.\n66: Interzis din oficiu: clasa/interfata cu o singura utilizare, optiune de configurare pentru o\n67: valoare care nu se schimba, schele \"pentru mai tarziu\", generalizare pentru un al doilea caz\n68: care nu exista.\n69: Nu se simplifica NICIODATA: validarea datelor venite din exterior (XML eFactura, import,\n70: raspuns web), tratarea erorilor care pot pierde date, drepturile de utilizator, si ce s-a cerut\n71: explicit.\n72: Scurtatura deliberata cu plafon cunoscut (blocare globala, scanare O(n2), euristica naiva) se\n73: marcheaza cu un singur comentariu `*!* ponytail: - `;\n74: e singura exceptie de la regula 2, care interzice justificarile in cod.\n75: **Cod nou: clase in `.prg`, nu metode in `.vcx`/`.scx`.** Logica se incapsuleaza intr-o clasa\n76: (`Define Class ... As Custom`) dintr-un `.prg`; formularul sau clasa vizuala doar instantiaza\n77: obiectul (`Createobject`) si il apeleaza, metoda din binar ramanand un apel de o linie. Sablon:\n78: `COMUN\\programe\\anaf_efactura.prg` (`AnafeFacturaServer`, `ANAFeFactura`), apelat din\n79: `clase\\anaf_efactura.vcx`. Motivul e de intretinere: un `.prg` se editeaza direct si diff-ul lui\n80: se citeste in git, pe cand codul pus ca metoda in binar trece prin FoxBin2Prg si write-back si\n81: se urmareste greu.\n82: **Scara ponytail** (plugin activ implicit pe `full`, injectat si in subagenti; `ultra` nu se\n83: foloseste pe cod legacy partajat): opreste-te la prima treapta care tine - 1) trebuie sa existe?\n84: 2) exista deja (`inventar-comun.md`, `COMUN\\programe`, `COMUN\\clase`) -> refolosesti; 3) o\n85: functie VFP nativa o face; 4) se rezolva pe Oracle (view, constrangere, pachet) in loc de cod\n86: client; 5) o linie; 6) abia apoi minimul care merge. Scurteaza SOLUTIA, nu cititul - intai\n87: urmaresti fluxul real atins. Nu se simplifica niciodata: garzile pe NULL, validarile, tratarea\n88: erorilor, drepturile de acces, ce s-a cerut explicit.\n89: Abateri obligatorii fata de plugin: (a) **fara comentarii `ponytail:`** in cod (regula 2) -\n90: scurtatura deliberata si limita ei se noteaza in `docs\\progres.md`, deci `/ponytail-debt` nu\n91: are ce culege aici; (b) proba unei logici noi e un script headless (regulile 4 si 8), nu\n92: `test_*.py`; (c) handoff-urile, rapoartele din `docs\\` si patch-urile sunt output cerut\n93: explicit - regula \"cod intai, maxim trei randuri\" nu li se aplica; (d) `/ponytail-review` pe\n94: diff-ul rundei inainte de commit e util, dar `delete:`/`yagni:` sunt IPOTEZE, nu constatari: in\n95: `COMUN` apelantii sunt in toate produsele, deci cauti in tot `D:\\ROA` inainte sa stergi, iar o\n96: garda fara caz in datele de test nu e garda moarta (regula 6); `/ponytail-audit` pe tot\n97: arborele nu se ruleaza aici.\n98: 4. Testare headless (fara IDE): `vfp9.exe -A -T \"\" ` din PowerShell.\n99: Mediu, sabloane, capcane, depanare: skill roa-vfp-headless-test (headless si UI; criteriile lui blocheaza \"gata\").\n100: Rularile intermediare acopera doar familiile de teste atinse de modificarea curenta; suita\n101: completa, inclusiv testele de garda pe zonele vecine, se ruleaza doar la rularea finala —\n102: garzile exista fiindca schimbarile cad de regula in cod partajat (`COMUN`), vizibil in toate\n103: produsele, dar costul lor nu se plateste la fiecare rulare intermediara. Ideal, doar testele\n104: atinse direct (de regula 3-10), nu toata familia.\n105: Un test normal dureaza 1-5s — ce umfla o rulare nu e testarea, ci asteptarea unui test atarnat.\n106: La rulari intermediare: timeout **90s**/test (ce trece de atat e atarnat, nu lent) si pauza\n107: **0,5s** intre teste, nu implicitul de 12 minute / 3s, rezervat rularii finale unde chiar\n108: conteaza sa distingi \"atarnat\" de \"lent\". Tinta: o rulare intermediara sta in secunde-minute,\n109: nu ore — daca depaseste, lista e prea larga sau timeout-ul prea mare.\n110: 5. Editare `.vcx`/`.scx` pe text, cautare in binare: skill roa-vfp-text-edit (cache, cp1250\n111: byte-safe, fidelity-check si membrii noi sunt in procedura lui). Versiunile `.??2` sunt\n112: instantanee, pot fi mai vechi decat binarul - verifica mtime inainte de concluzii; continutul\n113: real e in `.PJX`.\n114: 6. Delegare: implementarile, testele, verificarile si cercetarile se dau unor subagenti Sonnet in\n115: background (lane-uri paralele); sesiunea principala doar orchestreaza si verifica, ca sa nu i\n116: se umple contextul. Misiuni lungi: subagenti proaspeti per sarcina (max ~200-250k\n117: tokens/subagent), nu unul singur cu context acumulat; handoff compact pe disc. Verificarea a\n118: ce se intoarce si modelul de lucru (backlog de story-uri mici): `orchestrare-subagenti.md`.\n119: 7. Conventii obligatorii, de citit cand atingi zona respectiva:\n120: - editezi `.vc2`/`.sc2` sau `.prg` cu diacritice -> skill roa-vfp-text-edit (el detine procedura; criteriile lui blocheaza \"gata\");\n121: - adaugi o PROPRIETATE sau o METODA noua intr-o clasa `.vc2`/`.sc2` -> skill roa-vfp-text-edit (membrul nou si `*p:`/`*m:` sunt in procedura lui; criteriile lui blocheaza \"gata\");\n122: - adaugi/rearanjezi controale pe formulare sau coloane in grid -> `conventie_ux_formulare.md`;\n123: - grid needitabil pe formular cu 2+ grid-uri -> `capcana_grid_controlsource.md`;\n124: - adaugi o coloana intr-un grid deja livrat (ordinea din clasa e neutralizata de\n125: preferintele salvate per utilizator) -> `capcana_grid_preferinte_utilizator.md`;\n126: - `GO` pe un `Recno()` capturat/primit ca parametru -> skill roa-vfp-go-recno (el detine procedura; criteriile lui blocheaza \"gata\");\n127: - `ALTER TABLE` pe cursorul intors de `goExecutor.oExecute()` -> `conventie_goexecutor_alter_table.md`;\n128: - testare UI -> skill roa-vfp-headless-test (acopera si testul headless; criteriile lui blocheaza \"gata\");\n129: - te conectezi la Oracle pe dev/test, alegi schema sau rulezi un script de pachet ->\n130: `conventie_mediu_oracle.md`;\n131: - garzi pe valori NULL din Oracle -> skill roa-vfp-null-guards (el detine procedura; criteriile lui blocheaza \"gata\");\n132: - procedura PL/SQL cu `SELECT ... INTO` chemata din VFP (linii pierdute tacut) -> skill roa-oracle-sqlexec-no-data (el detine procedura; criteriile lui blocheaza \"gata\");\n133: - export date din Oracle -> skill roa-oracle-migration (reexportul sursei de pachet e in procedura lui; criteriile lui blocheaza \"gata\");\n134: - actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) -> skill roa-oracle-diagnostic (acopera si spatiul plin; criteriile lui blocheaza \"gata\");\n135: - modifici schema Oracle (tabele/view-uri/pachete) -> skill roa-oracle-migration (scriere + publicare scripturi; criteriile lui blocheaza \"gata\").\n136: 8. Eroare raportata de utilizator: nu analiza statica indelungata — scrie intai un test care o\n137: reproduce pe fluxul real; el da cauza si confirma remedierea. Analiza statica doar cat sa stii\n138: ce sa pui in test.\n139: 9. Context sesiune principala: la peste **250k** salveaza contextul intr-un handoff pe disc, il\n140: predai unei sesiuni noi si te opresti. Limita maxima absoluta: **275k**. Nu estima - masoara:\n141: hook-ul din `monitorizare-context.md` anunta pragul la fiecare mesaj.\n142: 10. Fisier de progres MASTER per proiect (`docs\\progres.md`): la zi pe tot parcursul, nu doar la\n143: predare — stare curenta, facut/testat, ipoteze excluse (cu dovada), ce urmeaza, fisiere atinse,\n144: comenzi de rulat. O sesiune noua porneste de acolo, fara sa reia investigatia. E ajutor de\n145: predare, nu documentatie: dupa commit, cu toate sarcinile terminate, se sterge.\n146: 11. La final de lucrare/cercetare: **propune** actualizarea documentatiei — `COMUN\\docs\\` daca e\n147: comun tuturor aplicatiilor, `docs\\` al proiectului daca e specific (plus `inventar-comun.md`,\n148: regula 3). Doar relevant si reutilizabil (80/20): flux ascuns, capcana, procedura/tabela cheie\n149: — nu tot ce ai atins, nu verbose. Cateva randuri; propui, nu scrii din oficiu.\n150: O notita = regula + strictul de context ca sa fie aplicabila: fara cazul particular in care ai\n151: gasit-o, fara simptomele lantului de erori, fara ce se deduce din cod (cititorul stie deja).\n152: 12. Revizuire periodica a documentatiei (`COMUN\\docs\\`, `docs\\` al proiectului, inclusiv acest\n153: fisier): compacteaza pastrand semantica — taie ce se deduce din cod, exemplele repetate,\n154: istoricul, tot ce nu mai schimba o decizie. Scopul: docs + reguli sa ocupe cat mai putin context\n155: la incarcare. Propui rezultatul, nu rescrii din oficiu; nu pierzi nicio regula/capcana, doar\n156: cuvintele in plus. Fisierele de reguli/conventii se completeaza doar cu ce e super-util,\n157: simplu si concis. Cadenta o da hook-ul din `monitorizare-context.md` (marker la 30 de zile).\n158: 13. Documente de propuneri/directie: unul singur, final, in `COMUN\\docs\\cercetare\\rec_*.md`.\n159: Materialul de lucru (brief-uri, handoff-uri, variante intermediare, patch-uri) NU se pastreaza;\n160: dovezile masurate si scripturile raman in `docs\\` al proiectului, iar documentul trimite la ele.\n161: Structura per propunere, in aceasta ordine: **unde** (modulul/ecranul + `fisier:linie`), **cum e\n162: azi**, **ce se schimba**, **ce se castiga** (cifra, marcata `masurat` sau `nemasurat`), **ce risc**.\n163: Gruparea e pe sectiuni de program, nu pe teme abstracte. `masurat` = backtest cronologic pe date\n164: reale comparat cu ce a confirmat operatorul, nu estimare; orice cifra nemarcata se citeste ca\n165: inventata. Se adauga o sectiune de **respinse, cu motivul intr-un rand**, ca sa nu fie repropuse,\n166: si capcanele de masurare platite. INTERZIS: naratiune de proces (cine ce a raportat, cum s-au\n167: coordonat benzile), tabele de tip \"efort mic/mediu\" fara explicatie, liste de etichete tehnice,\n168: aceeasi idee in doua fisiere.\n\n(End of file - total 168 lines)\n","metadata":{"preview":"# Reguli de lucru agent (comune proiectelor ROA VFP)\n\n0. **Contextul sesiunii principale: te opresti la maxim 250k si salvezi progresul.** Nu e\n optional si nu se negociaza cu \"mai termin o banda\". La 250k opresti lucrul, scrii in fisierul\n de progres starea exacta - ce e gata si testat, ce e scris dar neverificat, ce fisiere sunt\n lasate intr-o stare intermediara (in special text `.vc2`/`.sc2` fara write-back in binar) si\n care e primul lucru de facut - si predai unei sesiuni noi. Limita absoluta 275k.\n Nu estima contextul, masoara-l (`monitorizare-context.md`); daca nu ai masuratoare, opreste-te\n mai devreme, nu mai tarziu. Orchestrarea multor benzi paralele consuma context mai repede\n decat pare: fiecare raport de agent, fiecare verificare si fiecare decizie se aduna.\n\n1. Modificari de cod: diff ca FISIER `docs\\diff_runda_.patch`\n (`git diff --no-index `), nu in terminal. **COMMIT-ul** e singurul pas\n care asteapta aprobarea patch-ului. Write-back-ul in binar (txt2vcx) si testele se fac IMEDIAT\n dupa editarea `.vc2`/`.sc2`, fara sa astepti raspunsul — inclusiv pe `COMUN` — ca sa ajungi la\n review cu rezultatele testelor, nu cu o propunere netestata; daca nu merge, revii cu\n `git checkout` pe binare (`.vcx`+`.vct`) sau cu write-back din `*.pre_runda*.bak`.\n Patch-urile (in .gitignore, `docs/diff_runda*.patch`) nu se comit niciodata, raman local.\n Curatenia de dinainte de commit NU se face pe cap de agent, ci cu\n `powershell -File COMUN\\utile\\curatenie.ps1` (`-DryRun` listeaza fara sa stearga): patch-uri,","truncated":false,"loaded":[],"display":{"type":"file","path":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\reguli_lucru.md","text":"# Reguli de lucru agent (comune proiectelor ROA VFP)\n\n0. **Contextul sesiunii principale: te opresti la maxim 250k si salvezi progresul.** Nu e\n optional si nu se negociaza cu \"mai termin o banda\". La 250k opresti lucrul, scrii in fisierul\n de progres starea exacta - ce e gata si testat, ce e scris dar neverificat, ce fisiere sunt\n lasate intr-o stare intermediara (in special text `.vc2`/`.sc2` fara write-back in binar) si\n care e primul lucru de facut - si predai unei sesiuni noi. Limita absoluta 275k.\n Nu estima contextul, masoara-l (`monitorizare-context.md`); daca nu ai masuratoare, opreste-te\n mai devreme, nu mai tarziu. Orchestrarea multor benzi paralele consuma context mai repede\n decat pare: fiecare raport de agent, fiecare verificare si fiecare decizie se aduna.\n\n1. Modificari de cod: diff ca FISIER `docs\\diff_runda_.patch`\n (`git diff --no-index `), nu in terminal. **COMMIT-ul** e singurul pas\n care asteapta aprobarea patch-ului. Write-back-ul in binar (txt2vcx) si testele se fac IMEDIAT\n dupa editarea `.vc2`/`.sc2`, fara sa astepti raspunsul — inclusiv pe `COMUN` — ca sa ajungi la\n review cu rezultatele testelor, nu cu o propunere netestata; daca nu merge, revii cu\n `git checkout` pe binare (`.vcx`+`.vct`) sau cu write-back din `*.pre_runda*.bak`.\n Patch-urile (in .gitignore, `docs/diff_runda*.patch`) nu se comit niciodata, raman local.\n Curatenia de dinainte de commit NU se face pe cap de agent, ci cu\n `powershell -File COMUN\\utile\\curatenie.ps1` (`-DryRun` listeaza fara sa stearga): patch-uri,\n handoff-uri/planuri de runda, notele de rezolvare (`docs/fix_*.md`, `docs/fix_*.diff`),\n `*.pre_runda*.bak`, `.bak`-urile din cache-ul text si artefactele\n de test (`screenshots*`, `uisync*`, `.fxp`, `.err`, loguri). Sterge doar fisiere neurmarite de\n git — cele tracked sunt sarite.\n2. Comentarii in cod SI in scripturile de migrare `.sql`: minime, strict functionale, descriu\n comportamentul CURENT (ca si cum ar fi scris asa de la inceput). **Doar daca e cazul** — un\n comentariu se scrie acolo unde explica o **ramura** sau un **filtru** care nu se citeste singur,\n ca sa se inteleaga codul; unde codul e limpede, nu se comenteaza. O linie de regula, 2-3 doar\n pentru metode cu contract nebanal (parametri, cursor asteptat/lasat deschis, pozitionare la\n iesire), 4-5 in antetul unui script de migrare (ce e obiectul si ce contract are).\n INTERZIS in comentariu: nume de agent (\"claude\"), referinte la planuri, stories, propuneri,\n decizii, etape sau erori (`docs/plan_*.md`, `docs/propuneri_*.md`, \"#6\", \"S4\", \"M2\", \"T3\",\n \"dec.6\", \"runda27\", \"E7\", \"D-H2\"), trimiteri la rapoartele din `docs/` (\"vezi raportul,\n sectiunea ...\"), justificarea alegerii facute (de ce numele acesta, de ce s-a respins varianta\n cealalta), istoricul modificarii (\"inlocuieste...\", \"nu mai depinde de...\", \"mutat din...\"),\n date si autori pe cod nou.\n Comentarii vechi in stil jurnal nu se rescriu din oficiu — doar cand blocul e oricum atins\n sau la cerere explicita.\n Istoricul modificarilor sta DOAR in antetul fisierului (niciodata inline, la fel in `.prg`,\n `.sql` si PL/SQL Oracle): o singura intrare CUMULATIVA per functionalitate (`*!* DD.MM.YYYY` /\n `*!* autor` / `*!* ce face, 1-2 fraze`) — la revenire se rescrie intrarea, nu se adauga alta;\n autorul e cine semneaza livrarea (ex. `marius.mutu`), niciodata agent. Doar comportamentul\n final — fara revizii/runde/patch-uri/corectii. La rezolvari de erori: fara comentarii.\n Explicatiile merg in docs/ sau in mesajul de commit, nu in cod.\n Changelog (`changelog_.txt`): strictul necesar, pe limba utilizatorului, non-tehnic\n — 1-3 fraze/intrare, fara detalii de implementare, fara enumerarea locurilor atinse. Cat timp\n lucrarea n-a ajuns la utilizatori, erorile introduse si corectate in interior NU se mentioneaza\n — intrarea descrie functionalitatea finala, `:nou:`/`:modificare:`; `:eroare:` doar pentru erori\n care au fost in productie.\n3. Modificari minime si SCOPED: doar ce s-a cerut, doar pe cazul cu problema, fara refactorizari\n din oficiu. Cauta intai ce exista (`inventar-comun.md`) si refoloseste; daca lipseste ceva,\n propune COMPLETAREA unei functii/tabele/view comune, nu o varianta paralela. 80/20: solutia cea\n mai simpla care rezolva cazul real. Completeaza `inventar-comun.md` la orice descoperire/creare\n de element comun nedocumentat.\n **Scara (ponytail), te opresti la prima treapta care tine** - se aplica si de subagenti, nu doar\n de sesiunea principala: (1) trebuie sa existe? nevoie presupusa, nu ceruta = nu se scrie, se\n spune intr-un rand; (2) exista deja in cod (`inventar-comun.md`, `COMUN\\`, clasa/procedura din\n acelasi modul)? refoloseste; (3) o face limbajul (VFP, SQL Oracle) sau o biblioteca deja\n incarcata in `roacont.prg`? foloseste-o - dependinta noua, niciodata pentru ce tin cateva linii;\n (4) intra intr-o linie? o linie; (5) abia apoi minimul care merge.\n Scara scurteaza SOLUTIA, niciodata cititul: intai urmaresti fluxul real prin toate fisierele\n atinse, apoi alegi treapta. Diff mic in locul gresit nu e economie, e a doua eroare.\n La eroare: repari cauza in functia comuna prin care trec toti apelantii (`-Grep` pe apelanti\n inainte de a edita), nu doar calea din raport - o garda intr-un loc e diff mai mic decat o garda\n in fiecare apelant, si nu lasa fratii stricati.\n Interzis din oficiu: clasa/interfata cu o singura utilizare, optiune de configurare pentru o\n valoare care nu se schimba, schele \"pentru mai tarziu\", generalizare pentru un al doilea caz\n care nu exista.\n Nu se simplifica NICIODATA: validarea datelor venite din exterior (XML eFactura, import,\n raspuns web), tratarea erorilor care pot pierde date, drepturile de utilizator, si ce s-a cerut\n explicit.\n Scurtatura deliberata cu plafon cunoscut (blocare globala, scanare O(n2), euristica naiva) se\n marcheaza cu un singur comentariu `*!* ponytail: - `;\n e singura exceptie de la regula 2, care interzice justificarile in cod.\n **Cod nou: clase in `.prg`, nu metode in `.vcx`/`.scx`.** Logica se incapsuleaza intr-o clasa\n (`Define Class ... As Custom`) dintr-un `.prg`; formularul sau clasa vizuala doar instantiaza\n obiectul (`Createobject`) si il apeleaza, metoda din binar ramanand un apel de o linie. Sablon:\n `COMUN\\programe\\anaf_efactura.prg` (`AnafeFacturaServer`, `ANAFeFactura`), apelat din\n `clase\\anaf_efactura.vcx`. Motivul e de intretinere: un `.prg` se editeaza direct si diff-ul lui\n se citeste in git, pe cand codul pus ca metoda in binar trece prin FoxBin2Prg si write-back si\n se urmareste greu.\n **Scara ponytail** (plugin activ implicit pe `full`, injectat si in subagenti; `ultra` nu se\n foloseste pe cod legacy partajat): opreste-te la prima treapta care tine - 1) trebuie sa existe?\n 2) exista deja (`inventar-comun.md`, `COMUN\\programe`, `COMUN\\clase`) -> refolosesti; 3) o\n functie VFP nativa o face; 4) se rezolva pe Oracle (view, constrangere, pachet) in loc de cod\n client; 5) o linie; 6) abia apoi minimul care merge. Scurteaza SOLUTIA, nu cititul - intai\n urmaresti fluxul real atins. Nu se simplifica niciodata: garzile pe NULL, validarile, tratarea\n erorilor, drepturile de acces, ce s-a cerut explicit.\n Abateri obligatorii fata de plugin: (a) **fara comentarii `ponytail:`** in cod (regula 2) -\n scurtatura deliberata si limita ei se noteaza in `docs\\progres.md`, deci `/ponytail-debt` nu\n are ce culege aici; (b) proba unei logici noi e un script headless (regulile 4 si 8), nu\n `test_*.py`; (c) handoff-urile, rapoartele din `docs\\` si patch-urile sunt output cerut\n explicit - regula \"cod intai, maxim trei randuri\" nu li se aplica; (d) `/ponytail-review` pe\n diff-ul rundei inainte de commit e util, dar `delete:`/`yagni:` sunt IPOTEZE, nu constatari: in\n `COMUN` apelantii sunt in toate produsele, deci cauti in tot `D:\\ROA` inainte sa stergi, iar o\n garda fara caz in datele de test nu e garda moarta (regula 6); `/ponytail-audit` pe tot\n arborele nu se ruleaza aici.\n4. Testare headless (fara IDE): `vfp9.exe -A -T \"\" ` din PowerShell.\n Mediu, sabloane, capcane, depanare: skill roa-vfp-headless-test (headless si UI; criteriile lui blocheaza \"gata\").\n Rularile intermediare acopera doar familiile de teste atinse de modificarea curenta; suita\n completa, inclusiv testele de garda pe zonele vecine, se ruleaza doar la rularea finala —\n garzile exista fiindca schimbarile cad de regula in cod partajat (`COMUN`), vizibil in toate\n produsele, dar costul lor nu se plateste la fiecare rulare intermediara. Ideal, doar testele\n atinse direct (de regula 3-10), nu toata familia.\n Un test normal dureaza 1-5s — ce umfla o rulare nu e testarea, ci asteptarea unui test atarnat.\n La rulari intermediare: timeout **90s**/test (ce trece de atat e atarnat, nu lent) si pauza\n **0,5s** intre teste, nu implicitul de 12 minute / 3s, rezervat rularii finale unde chiar\n conteaza sa distingi \"atarnat\" de \"lent\". Tinta: o rulare intermediara sta in secunde-minute,\n nu ore — daca depaseste, lista e prea larga sau timeout-ul prea mare.\n5. Editare `.vcx`/`.scx` pe text, cautare in binare: skill roa-vfp-text-edit (cache, cp1250\n byte-safe, fidelity-check si membrii noi sunt in procedura lui). Versiunile `.??2` sunt\n instantanee, pot fi mai vechi decat binarul - verifica mtime inainte de concluzii; continutul\n real e in `.PJX`.\n6. Delegare: implementarile, testele, verificarile si cercetarile se dau unor subagenti Sonnet in\n background (lane-uri paralele); sesiunea principala doar orchestreaza si verifica, ca sa nu i\n se umple contextul. Misiuni lungi: subagenti proaspeti per sarcina (max ~200-250k\n tokens/subagent), nu unul singur cu context acumulat; handoff compact pe disc. Verificarea a\n ce se intoarce si modelul de lucru (backlog de story-uri mici): `orchestrare-subagenti.md`.\n7. Conventii obligatorii, de citit cand atingi zona respectiva:\n - editezi `.vc2`/`.sc2` sau `.prg` cu diacritice -> skill roa-vfp-text-edit (el detine procedura; criteriile lui blocheaza \"gata\");\n - adaugi o PROPRIETATE sau o METODA noua intr-o clasa `.vc2`/`.sc2` -> skill roa-vfp-text-edit (membrul nou si `*p:`/`*m:` sunt in procedura lui; criteriile lui blocheaza \"gata\");\n - adaugi/rearanjezi controale pe formulare sau coloane in grid -> `conventie_ux_formulare.md`;\n - grid needitabil pe formular cu 2+ grid-uri -> `capcana_grid_controlsource.md`;\n - adaugi o coloana intr-un grid deja livrat (ordinea din clasa e neutralizata de\n preferintele salvate per utilizator) -> `capcana_grid_preferinte_utilizator.md`;\n - `GO` pe un `Recno()` capturat/primit ca parametru -> skill roa-vfp-go-recno (el detine procedura; criteriile lui blocheaza \"gata\");\n - `ALTER TABLE` pe cursorul intors de `goExecutor.oExecute()` -> `conventie_goexecutor_alter_table.md`;\n - testare UI -> skill roa-vfp-headless-test (acopera si testul headless; criteriile lui blocheaza \"gata\");\n - te conectezi la Oracle pe dev/test, alegi schema sau rulezi un script de pachet ->\n `conventie_mediu_oracle.md`;\n - garzi pe valori NULL din Oracle -> skill roa-vfp-null-guards (el detine procedura; criteriile lui blocheaza \"gata\");\n - procedura PL/SQL cu `SELECT ... INTO` chemata din VFP (linii pierdute tacut) -> skill roa-oracle-sqlexec-no-data (el detine procedura; criteriile lui blocheaza \"gata\");\n - export date din Oracle -> skill roa-oracle-migration (reexportul sursei de pachet e in procedura lui; criteriile lui blocheaza \"gata\");\n - actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) -> skill roa-oracle-diagnostic (acopera si spatiul plin; criteriile lui blocheaza \"gata\");\n - modifici schema Oracle (tabele/view-uri/pachete) -> skill roa-oracle-migration (scriere + publicare scripturi; criteriile lui blocheaza \"gata\").\n8. Eroare raportata de utilizator: nu analiza statica indelungata — scrie intai un test care o\n reproduce pe fluxul real; el da cauza si confirma remedierea. Analiza statica doar cat sa stii\n ce sa pui in test.\n9. Context sesiune principala: la peste **250k** salveaza contextul intr-un handoff pe disc, il\n predai unei sesiuni noi si te opresti. Limita maxima absoluta: **275k**. Nu estima - masoara:\n hook-ul din `monitorizare-context.md` anunta pragul la fiecare mesaj.\n10. Fisier de progres MASTER per proiect (`docs\\progres.md`): la zi pe tot parcursul, nu doar la\n predare — stare curenta, facut/testat, ipoteze excluse (cu dovada), ce urmeaza, fisiere atinse,\n comenzi de rulat. O sesiune noua porneste de acolo, fara sa reia investigatia. E ajutor de\n predare, nu documentatie: dupa commit, cu toate sarcinile terminate, se sterge.\n11. La final de lucrare/cercetare: **propune** actualizarea documentatiei — `COMUN\\docs\\` daca e\n comun tuturor aplicatiilor, `docs\\` al proiectului daca e specific (plus `inventar-comun.md`,\n regula 3). Doar relevant si reutilizabil (80/20): flux ascuns, capcana, procedura/tabela cheie\n — nu tot ce ai atins, nu verbose. Cateva randuri; propui, nu scrii din oficiu.\n O notita = regula + strictul de context ca sa fie aplicabila: fara cazul particular in care ai\n gasit-o, fara simptomele lantului de erori, fara ce se deduce din cod (cititorul stie deja).\n12. Revizuire periodica a documentatiei (`COMUN\\docs\\`, `docs\\` al proiectului, inclusiv acest\n fisier): compacteaza pastrand semantica — taie ce se deduce din cod, exemplele repetate,\n istoricul, tot ce nu mai schimba o decizie. Scopul: docs + reguli sa ocupe cat mai putin context\n la incarcare. Propui rezultatul, nu rescrii din oficiu; nu pierzi nicio regula/capcana, doar\n cuvintele in plus. Fisierele de reguli/conventii se completeaza doar cu ce e super-util,\n simplu si concis. Cadenta o da hook-ul din `monitorizare-context.md` (marker la 30 de zile).\n13. Documente de propuneri/directie: unul singur, final, in `COMUN\\docs\\cercetare\\rec_*.md`.\n Materialul de lucru (brief-uri, handoff-uri, variante intermediare, patch-uri) NU se pastreaza;\n dovezile masurate si scripturile raman in `docs\\` al proiectului, iar documentul trimite la ele.\n Structura per propunere, in aceasta ordine: **unde** (modulul/ecranul + `fisier:linie`), **cum e\n azi**, **ce se schimba**, **ce se castiga** (cifra, marcata `masurat` sau `nemasurat`), **ce risc**.\n Gruparea e pe sectiuni de program, nu pe teme abstracte. `masurat` = backtest cronologic pe date\n reale comparat cu ce a confirmat operatorul, nu estimare; orice cifra nemarcata se citeste ca\n inventata. Se adauga o sectiune de **respinse, cu motivul intr-un rand**, ca sa nu fie repropuse,\n si capcanele de masurare platite. INTERZIS: naratiune de proces (cine ce a raportat, cum s-au\n coordonat benzile), tabele de tip \"efort mic/mediu\" fara explicatie, liste de etichete tehnice,\n aceeasi idee in doua fisiere.","lineStart":1,"lineEnd":168,"totalLines":168,"truncated":false}},"title":"COMUN\\docs\\reguli_lucru.md","time":{"start":1789550002849,"end":1789550003077}},"id":"prt_0a97e0252001YbXvPDItNnDVdq","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97df014001gSUlcHj9aZimH0"}} +{"type":"tool_use","timestamp":1789550003298,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"read","callID":"call_01_88cReJg3TfVaTSso1iyR0647","state":{"status":"completed","input":{"filePath":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\schita_deschidere_firma_conpress.sql"},"output":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\schita_deschidere_firma_conpress.sql\nfile\n\n1: -- ============================================================================\n2: -- SCHITA (DRAFT) - Deschidere firma noua pe instalatia Oracle ROA ConPress\n3: -- Fisier NEEXECUTAT, de aprobat de Marius inainte de orice rulare.\n4: -- Schema tinta: LUDIPEDIA (confirmat de Marius; server conpress, tunel\n5: -- Bitvise conpress.tlp, alias TNS + DSN ODBC ROA_CONPRESS).\n6: -- ============================================================================\n7: --\n8: -- NOTA IMPORTANTA 1 - conflict de regula:\n9: -- D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conexiuni-tunel-ssh-odbc.md, sectiunea\n10: -- \"Reguli pe productie\" (linia ~152), interzice explicit pe canalul manual\n11: -- sqlplus-pe-tunel orice altceva in afara de SELECT:\n12: -- \"Doar SELECT. Fara INSERT/UPDATE/DELETE/DDL, fara ALTER SESSION care\n13: -- schimba comportament persistent.\"\n14: -- PASUL 0 din acest fisier (verificari) respecta regula (doar SELECT).\n15: -- PASII 1-4 (INSERT firma, job schema, drepturi utilizatori) SCRIU date si\n16: -- NU respecta acea regula daca ar fi rulati pe canalul manual descris in\n17: -- document. Nu e o decizie luata aici: Marius decide canalul de executie\n18: -- (cont/canal cu drept de scriere pe ConPress, sau rularea propriu-zisa\n19: -- prin aplicatia ROASTART, care e calea normala de productie pentru\n20: -- deschidere de firma).\n21: --\n22: -- NOTA IMPORTANTA 2 - stare fisier:\n23: -- Acesta e o SCHITA, nu un script gata de rulare. Nimeni nu s-a conectat\n24: -- la ConPress pentru a pregati acest fisier si nimeni nu l-a rulat.\n25: --\n26: -- NOTA IMPORTANTA 3 - parametri lipsa din certificatul ONRC (LUDIPEDIA):\n27: -- certificatul de inregistrare acopera doar firma, CUI, nr. registru\n28: -- comert, sediu social, CAEN principal si data inregistrarii. Urmatorii\n29: -- parametri NU sunt in certificat si trebuie completati de Marius inainte\n30: -- de orice executie (marcati mai jos si in sectiunea de parametri cu\n31: -- \"-- DE COMPLETAT\"):\n32: -- 1. Date bancare: nume banca + cont (IBAN) - pot fi 1 pana la 10 perechi\n33: -- (banca1..banca10 / contb1..contb10 in FIRMEMODINSPROC). Interogarea\n34: -- ANAF publica nu intoarce IBAN (camp gol in raspuns) - ramane de\n35: -- completat de Marius.\n36: -- 2. Telefon2, telefon3, fax, email (telefonul principal a fost completat\n37: -- din ANAF, vezi NOTA IMPORTANTA 5).\n38: -- 3. Reprezentant legal / declarant: nume, prenume, functie, cod\n39: -- angajat (codang), indicativ, indice_itm.\n40: -- 4. Incadrare firma: id_forma_juridica, id_forma_organizare,\n41: -- id_forma_prop, id_tip_soc (coduri interne din nomenclatoarele\n42: -- ROASTART - ANAF intoarce doar text descriptiv, nu codul ROASTART,\n43: -- vezi NOTA IMPORTANTA 5).\n44: -- 5. Capital social varsat (capital_soc_var) si subscris\n45: -- (capital_soc_sub).\n46: -- 6. Punct de lucru (punct_luc) - daca exista, separat de sediul social.\n47: -- 7. id_mama / e_mama - firma simpla sau membra a unui grup deja\n48: -- existent in ROASTART; daca simpla, id_mama = 0.\n49: -- 8. id_loc (identificator localitate in nomenclatorul ROASTART),\n50: -- cod_firma (cod intern firma), id_util (operatorul care introduce\n51: -- firma - userul care ruleaza scriptul in ROASTART), oasp\n52: -- (obligatie de asigurare - da/nu), tip_modificare.\n53: -- Lista completa de parametri \"DE COMPLETAT\" e reluata langa fiecare\n54: -- variabila din sectiunea PARAMETRI de mai jos.\n55: --\n56: -- NOTA IMPORTANTA 5 - date confirmate/completate din interogarea publica\n57: -- ANAF (16.09.2026, CUI 54602536, serviciu\n58: -- https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva - acelasi URL\n59: -- folosit de procedura existenta ANAF_CreeazaCerereANAF in\n60: -- D:\\ROA\\ROAFACTURARE\\COMUN\\programe\\validare.prg:1845):\n61: -- - Denumire, nr. registru comert (J2026028926001) si CAEN (9329)\n62: -- CONFIRMATE, identice cu certificatul ONRC.\n63: -- - Telefon completat: 0724968582 (p_telefon).\n64: -- - Cod postal completat: 900217 (p_cod_postal).\n65: -- - Adresa CONFIRMATA in mare parte, cu O DISCREPANTA fata de certificat:\n66: -- certificatul avea p_numar = 'ZA', ANAF intoarce \"2A\" pentru acelasi\n67: -- sediu (judet, localitate, strada, bloc L119A, scara A, apartament 2 -\n68: -- identice, extrase din date_generale.adresa). Marius a confirmat ca\n69: -- ANAF e sursa de adevar (OCR-ul certificatului e suspect) - p_numar a\n70: -- fost SCHIMBAT mai jos la '2A' (fostul 'ZA' era probabil o citire\n71: -- gresita a lui '2A').\n72: -- - Data inregistrarii: certificatul avea 06.05.2026, ANAF intoarce\n73: -- date_generale.data_inregistrare = 2026-05-04 (04.05.2026) si\n74: -- stare_inregistrare = \"INREGISTRAT din data 04.05.2026\" - confirma\n75: -- aceeasi data. Marius a confirmat ANAF ca sursa de adevar - p_data_inreg\n76: -- a fost SCHIMBAT mai jos la '04.05.2026'.\n77: -- - scpTVA = false -> firma NU e inregistrata ca platitoare de TVA la\n78: -- data interogarii (util pentru p_persoana_juridica / incadrare, nu\n79: -- schimba niciun parametru din FIRMEMODINSPROC direct).\n80: -- - forma_organizare ANAF = \"PERSOANA JURIDICA\" -> confirma\n81: -- p_persoana_juridica = 'D'.\n82: -- - IBAN, email, capital social, reprezentant legal, forma juridica\n83: -- interna ROASTART: NU sunt in raspunsul ANAF (serviciul public nu le\n84: -- are) - raman \"DE COMPLETAT\" de Marius, nu s-au inventat valori.\n85: --\n86: -- NOTA IMPORTANTA 4 - useri drepturi:\n87: -- Marius a CONFIRMAT: sunt DOAR 2 useri carora li se dau drepturi pe firma\n88: -- noua. \"Vali Iliescu\" / \"Valentina Iliescu\" e UN SINGUR user (user 1,\n89: -- prescurtare a aceluiasi nume), al doilea e \"Raluca Ion\" (user 2).\n90: -- Fisierul schiteaza exact 2 blocuri la Pasul 4, dupa acelasi sablon.\n91: -- Niciun id_util/id_grup nu e cunoscut inca -- se completeaza DUPA ce\n92: -- Pasul 0 confirma daca userii exista deja in UTILIZATORI/vutilizatori.\n93: --\n94: -- NOTA IMPORTANTA 6 - verificare DB (Pasul A) INCERCATA si BLOCATA (16.09.2026):\n95: -- Tunelul Bitvise s-a ridicat cu succes (`stnlc.exe -profile=D:\\vm303-profile\\\n96: -- conpress.tlp`, profil gasit acolo, nu la calea din documentul de conexiuni;\n97: -- port 127.0.0.1:1521 confirmat deschis, alias TNS ROA_CONPRESS rezolvat\n98: -- spre SID=ROA). NU s-a putut merge mai departe: schema Oracle de pe\n99: -- ConPress e \"xenoti\" (conform tabelului din conexiuni-tunel-ssh-odbc.md),\n100: -- iar parola pentru acel user NU exista nicaieri accesibil (DSN ODBC\n101: -- ROA_CONPRESS are UserID/Password goale in registry, nu e in Windows\n102: -- Credential Manager, nu e in vreun fisier din D:\\ROA cautat). Conform\n103: -- regulii explicite din document (\"Fara ghicit parole\"), verificarea NU s-a\n104: -- facut - nu s-a incercat nicio parola. Tunelul a fost inchis la loc dupa\n105: -- incercare (port 1521 reconfirmat inchis).\n106: -- RAMASE NEVERIFICATE, deci NEschimbate mai jos (raman \"DE COMPLETAT\"):\n107: -- - combinatia comuna id_forma_juridica/id_forma_organizare/id_forma_prop/\n108: -- id_tip_soc (GROUP BY pe firme) - nerulat.\n109: -- - existenta userilor Vali/Valentina Iliescu si Raluca Ion in\n110: -- UTILIZATORI/vutilizatori si id_util al lor - nerulat.\n111: -- - id_grup uzual din vdef_util_grup - nerulat.\n112: -- - unicitate CUI 54602536 in firme (nu exista deja) - nerulat.\n113: -- Marius (sau cine are parola schemei xenoti pe ConPress) trebuie sa ruleze\n114: -- Pasul 0 manual, sau sa dea parola unei sesiuni viitoare.\n115: --\n116: -- ============================================================================\n117: -- PARAMETRI DE SUBSTITUIRE (sqlplus DEFINE) - reutilizabile pentru orice\n118: -- firma noua. Valorile de mai jos vin din interogarea ANAF (sursa de adevar\n119: -- pentru identificare/adresa/CAEN/data inregistrare) plus certificatul ONRC\n120: -- pentru ce ANAF nu acopera; codurile interne ROASTART si userii raman\n121: -- DE COMPLETAT -- verificarea DB (NOTA IMPORTANTA 6) a fost blocata.\n122: -- ============================================================================\n123: \n124: -- --- identificare firma (din certificatul ONRC) ---\n125: DEFINE p_firma = 'LUDIPEDIA S.R.L.'\n126: DEFINE p_antet = 'LUDIPEDIA S.R.L.'\n127: DEFINE p_cod_fiscal = '54602536'\n128: DEFINE p_reg_comert = 'J2026028926001'\n129: DEFINE p_caen = '9329' -- CONFIRMAT: identic in raspunsul ANAF (cod_CAEN) din 16.09.2026\n130: DEFINE p_data_inreg = '04.05.2026' -- SCHIMBAT din certificat (06.05.2026) -- sursa ANAF (date_generale.data_inregistrare), vezi NOTA IMPORTANTA 5\n131: \n132: -- --- adresa sediu social (din certificatul ONRC) ---\n133: DEFINE p_judet = 'Constanta'\n134: DEFINE p_localitate = 'Constanta'\n135: DEFINE p_strada = 'Strada Baba Novac'\n136: DEFINE p_numar = '2A' -- SCHIMBAT din certificat ('ZA') -- sursa ANAF (date_generale.adresa / snumar_Strada), vezi NOTA IMPORTANTA 5\n137: DEFINE p_bloc = 'L119A'\n138: DEFINE p_scara = 'A'\n139: DEFINE p_apart = '2'\n140: DEFINE p_cod_postal = '900217' -- completat din ANAF (16.09.2026), nu era in certificat\n141: DEFINE p_adresa = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'\n142: \n143: -- --- date lipsa din certificat, obligatorii pentru FIRMEMODINSPROC ---\n144: DEFINE p_banca1 = '' -- DE COMPLETAT (serviciul public ANAF nu intoarce IBAN)\n145: DEFINE p_contb1 = '' -- DE COMPLETAT (IBAN)\n146: -- banca2..banca10 / contb2..contb10: DE COMPLETAT doar daca exista mai multe conturi\n147: DEFINE p_persoana_juridica = 'D' -- confirmat de forma_organizare ANAF = \"PERSOANA JURIDICA\" (D/F dupa conventia ROASTART)\n148: DEFINE p_codang = '' -- DE COMPLETAT (cod angajat / reprezentant)\n149: DEFINE p_nume = '' -- DE COMPLETAT (nume reprezentant legal / declarant)\n150: DEFINE p_prenume = '' -- DE COMPLETAT\n151: DEFINE p_telefon = '0724968582' -- completat din ANAF (16.09.2026), nu era in certificat\n152: DEFINE p_telefon2 = '' -- DE COMPLETAT\n153: DEFINE p_telefon3 = '' -- DE COMPLETAT\n154: DEFINE p_fax = '' -- DE COMPLETAT\n155: DEFINE p_email = '' -- DE COMPLETAT\n156: DEFINE p_oasp = '' -- DE COMPLETAT (da/nu, dupa conventia ROASTART)\n157: DEFINE p_capital_soc_var = '' -- DE COMPLETAT\n158: DEFINE p_capital_soc_sub = '' -- DE COMPLETAT\n159: DEFINE p_punct_luc = '' -- DE COMPLETAT (daca exista, altfel gol)\n160: DEFINE p_schema = 'LUDIPEDIA' -- CONFIRMAT de Marius\n161: DEFINE p_id_mama = '0' -- DE CONFIRMAT: 0 daca firma simpla, altfel id firma-mama existenta\n162: DEFINE p_e_mama = '' -- DE COMPLETAT doar daca p_id_mama <> 0\n163: DEFINE p_id_loc = '' -- DE COMPLETAT (id localitate in nomenclator ROASTART)\n164: DEFINE p_id_util = '' -- DE COMPLETAT (operatorul care introduce firma in ROASTART)\n165: DEFINE p_id_forma_juridica = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6\n166: DEFINE p_id_forma_organizare = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6\n167: DEFINE p_id_forma_prop = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6\n168: DEFINE p_id_tip_soc = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6\n169: DEFINE p_indicativ = '' -- DE COMPLETAT\n170: DEFINE p_declarant = '' -- DE COMPLETAT (nume declarant, poate fi = p_nume/p_prenume)\n171: DEFINE p_functie = '' -- DE COMPLETAT (functia declarantului)\n172: DEFINE p_indice_itm = '' -- DE COMPLETAT\n173: DEFINE p_tip_modificare = '' -- DE COMPLETAT\n174: DEFINE p_cod_firma = '' -- DE COMPLETAT (cod intern firma in ROASTART)\n175: \n176: -- --- job schema Oracle noua (start contabil) ---\n177: DEFINE p_luna_start = '5' -- CONFIRMAT de Marius pentru LUDIPEDIA\n178: DEFINE p_an_start = '2026' -- CONFIRMAT de Marius pentru LUDIPEDIA\n179: \n180: -- --- useri carora li se dau drepturi pe firma noua (DOAR 2, confirmat de Marius) ---\n181: DEFINE p_nume_user1 = 'Iliescu'\n182: DEFINE p_prenume_user1= 'Vali' -- \"Vali\" / \"Valentina\" -- confirmat: aceeasi persoana (user 1)\n183: DEFINE p_nume_user2 = 'Ion'\n184: DEFINE p_prenume_user2= 'Raluca'\n185: DEFINE p_id_grup_useri = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6\n186: DEFINE p_id_utilop = '' -- DE COMPLETAT (operator care insereaza drepturile, poate fi = p_id_util)\n187: \n188: \n189: -- ============================================================================\n190: -- PAS 0 -- VERIFICARE (doar SELECT, sigur pe canalul sqlplus-tunel)\n191: -- Scop: (a) userii Vali/Valentina Iliescu si Raluca Ion exista deja in\n192: -- UTILIZATORI/vutilizatori? (b) firma cu acest CUI exista deja pe\n193: -- schema LUDIPEDIA (evitare duplicat)?\n194: -- ============================================================================\n195: \n196: -- 0a. Cautare useri dupa nume (LIKE, pentru ca nu stim daca \"Vali\" e nume complet)\n197: SELECT id_util, utilizator, nume, prenume, inactiv\n198: FROM vutilizatori\n199: WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user1.' || '%')\n200: OR UPPER(prenume) LIKE UPPER('%Vali%')\n201: OR UPPER(prenume) LIKE UPPER('%Valentina%')\n202: FETCH FIRST 20 ROWS ONLY;\n203: \n204: SELECT id_util, utilizator, nume, prenume, inactiv\n205: FROM vutilizatori\n206: WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user2.' || '%')\n207: OR UPPER(prenume) LIKE UPPER('%' || '&p_prenume_user2.' || '%')\n208: FETCH FIRST 20 ROWS ONLY;\n209: \n210: -- 0b. Drepturi deja existente pe firme, ca sa vedem grupul folosit uzual\n211: -- (util pentru completarea p_id_grup_useri de mai sus)\n212: SELECT id_dug, id_grup, id_firma, firma\n213: FROM vdef_util_grup\n214: WHERE id_grup IN (\n215: SELECT DISTINCT id_grup FROM vdef_util_grup\n216: )\n217: FETCH FIRST 50 ROWS ONLY;\n218: \n219: -- 0c. Firma cu acest CUI exista deja? (evitare duplicat la Pasul 1)\n220: SELECT id, firma, cod_fiscal, reg_comert\n221: FROM firme\n222: WHERE REGEXP_REPLACE(UPPER(TRIM(cod_fiscal)), '[^0-9]', '') =\n223: REGEXP_REPLACE(UPPER(TRIM('&p_cod_fiscal.')), '[^0-9]', '')\n224: FETCH FIRST 10 ROWS ONLY;\n225: \n226: \n227: -- ============================================================================\n228: -- PAS 1 -- INSERT FIRMA\n229: -- PACK_DREPTURI.FIRMEMODINSPROC(...)\n230: -- Sursa semnaturii: D:\\ROA\\ROASTART\\COMUN\\clase\\ofirma.vc2:130-146\n231: -- ATENTIE: scrie date -- NU e SELECT, vezi NOTA IMPORTANTA 1 de la inceput.\n232: -- Ordinea parametrilor de mai jos respecta exact ordinea din semnatura.\n233: -- ============================================================================\n234: \n235: -- BEGIN\n236: -- PACK_DREPTURI.FIRMEMODINSPROC(\n237: -- p_id => NULL, -- id nou, generat de procedura/secventa\n238: -- p_firma => '&p_firma.',\n239: -- p_antet => '&p_antet.',\n240: -- p_cod_fiscal => '&p_cod_fiscal.',\n241: -- p_reg_comert => '&p_reg_comert.',\n242: -- p_banca1 => '&p_banca1.',\n243: -- p_contb1 => '&p_contb1.',\n244: -- p_banca2 => NULL, p_contb2 => NULL,\n245: -- p_banca3 => NULL, p_contb3 => NULL,\n246: -- p_banca4 => NULL, p_contb4 => NULL,\n247: -- p_banca5 => NULL, p_contb5 => NULL,\n248: -- p_banca6 => NULL, p_contb6 => NULL,\n249: -- p_banca7 => NULL, p_contb7 => NULL,\n250: -- p_banca8 => NULL, p_contb8 => NULL,\n251: -- p_banca9 => NULL, p_contb9 => NULL,\n252: -- p_banca10 => NULL, p_contb10 => NULL,\n253: -- p_adresa => '&p_adresa.',\n254: -- p_cod_firma => '&p_cod_firma.',\n255: -- p_persoana_juridica=> '&p_persoana_juridica.',\n256: -- p_codang => '&p_codang.',\n257: -- p_nume => '&p_nume.',\n258: -- p_prenume => '&p_prenume.',\n259: -- p_telefon => '&p_telefon.',\n260: -- p_telefon2 => '&p_telefon2.',\n261: -- p_telefon3 => '&p_telefon3.',\n262: -- p_fax => '&p_fax.',\n263: -- p_email => '&p_email.',\n264: -- p_oasp => '&p_oasp.',\n265: -- p_capital_soc_var => '&p_capital_soc_var.',\n266: -- p_capital_soc_sub => '&p_capital_soc_sub.',\n267: -- p_punct_luc => '&p_punct_luc.',\n268: -- p_caen => '&p_caen.',\n269: -- p_schema => '&p_schema.',\n270: -- p_judet => '&p_judet.',\n271: -- p_localitate => '&p_localitate.',\n272: -- p_strada => '&p_strada.',\n273: -- p_numar => '&p_numar.',\n274: -- p_bloc => '&p_bloc.',\n275: -- p_scara => '&p_scara.',\n276: -- p_apart => '&p_apart.',\n277: -- p_cod_postal => '&p_cod_postal.',\n278: -- p_id_mama => &p_id_mama.,\n279: -- p_e_mama => '&p_e_mama.',\n280: -- p_id_loc => '&p_id_loc.',\n281: -- p_id_util => '&p_id_util.',\n282: -- p_id_forma_juridica=> '&p_id_forma_juridica.',\n283: -- p_id_forma_organizare => '&p_id_forma_organizare.',\n284: -- p_id_forma_prop => '&p_id_forma_prop.',\n285: -- p_id_tip_soc => '&p_id_tip_soc.',\n286: -- p_indicativ => '&p_indicativ.',\n287: -- p_declarant => '&p_declarant.',\n288: -- p_functie => '&p_functie.',\n289: -- p_indice_itm => '&p_indice_itm.',\n290: -- p_tip_modificare => '&p_tip_modificare.',\n291: -- p_caen_revizie => NULL\n292: -- );\n293: -- END;\n294: -- /\n295: \n296: \n297: -- ============================================================================\n298: -- PAS 2 -- JOB CREARE SCHEMA ORACLE (async)\n299: -- SYN_NEWSCHEMAJOB(pcSchema, pnLuna, pnAn)\n300: -- Se apeleaza doar daca firma e simpla (p_id_mama = 0), nu membra de grup.\n301: -- ATENTIE: porneste un job -- scrie/creeaza obiecte, nu e SELECT.\n302: -- ============================================================================\n303: \n304: -- BEGIN\n305: -- IF &p_id_mama. = 0 THEN\n306: -- SYN_NEWSCHEMAJOB('&p_schema.', &p_luna_start., &p_an_start.);\n307: -- END IF;\n308: -- END;\n309: -- /\n310: \n311: \n312: -- ============================================================================\n313: -- PAS 3 -- POLL STATUS JOB SCHEMA\n314: -- SYN_NEWSCHEMAPROGRESS(pcSchema) -- functie, intoarce status text.\n315: -- Se astepta 'FINALIZAT'. Job async: poate dura; NU se face poll fara\n316: -- timeout/numar maxim de incercari (exemplu mai jos, de adaptat manual\n317: -- sau intr-un script client, nu ca bucla PL/SQL blocanta pe productie).\n318: -- ============================================================================\n319: \n320: -- Interogare punctuala (de rulat manual, la interval, cu numarare manuala\n321: -- a incercarilor -- max. N incercari, ex. 30, la 10 secunde):\n322: SELECT SYN_NEWSCHEMAPROGRESS('&p_schema.') AS status_job FROM dual;\n323: \n324: -- Varianta PL/SQL cu timeout explicit (DOAR ca exemplu -- de adaptat/testat\n325: -- de Marius inainte de folosire, nu se stie limita reala de reincercari):\n326: -- DECLARE\n327: -- v_status VARCHAR2(100);\n328: -- v_incercari PLS_INTEGER := 0;\n329: -- c_max_incercari CONSTANT PLS_INTEGER := 30; -- DE CONFIRMAT\n330: -- c_pauza_sec CONSTANT PLS_INTEGER := 10; -- DE CONFIRMAT\n331: -- BEGIN\n332: -- LOOP\n333: -- v_status := SYN_NEWSCHEMAPROGRESS('&p_schema.');\n334: -- EXIT WHEN v_status = 'FINALIZAT' OR v_incercari >= c_max_incercari;\n335: -- v_incercari := v_incercari + 1;\n336: -- DBMS_LOCK.SLEEP(c_pauza_sec);\n337: -- END LOOP;\n338: -- IF v_status != 'FINALIZAT' THEN\n339: -- RAISE_APPLICATION_ERROR(-20000, 'Job schema neterminat dupa timeout, status=' || v_status);\n340: -- END IF;\n341: -- END;\n342: -- /\n343: \n344: \n345: -- ============================================================================\n346: -- PAS 4 -- DREPTURI UTILIZATORI PE FIRMA NOUA\n347: -- PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)\n348: -- Sursa: D:\\ROA\\ROASTART\\Clase\\ostart_util.vc2:32-40\n349: -- id_util / id_grup se completeaza DUPA ce Pasul 0a confirma daca userii\n350: -- exista deja. id_firma se completeaza cu id-ul intors de Pasul 1.\n351: -- ATENTIE: scrie date, nu e SELECT.\n352: -- ============================================================================\n353: \n354: DEFINE p_id_firma_noua = '' -- DE COMPLETAT dupa Pasul 1 (id firma inserata)\n355: \n356: -- --- user 1: Vali / Valentina Iliescu (o singura persoana, confirmat) ---\n357: DEFINE p_id_util_1 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6); gol daca userul nu exista inca\n358: \n359: -- optional, doar daca userul NU exista inca in UTILIZATORI:\n360: -- BEGIN\n361: -- PACK_DREPTURI.UTILIZATORIINSPROC(\n362: -- p_utilizator => '', -- DE COMPLETAT (login)\n363: -- p_parola => '', -- DE COMPLETAT (parola initiala)\n364: -- p_inactiv => 'N',\n365: -- p_id_utilop => &p_id_utilop.\n366: -- );\n367: -- END;\n368: -- /\n369: \n370: -- BEGIN\n371: -- PACK_DREPTURI.UTILDREPTINSPROC(\n372: -- p_id_util => &p_id_util_1.,\n373: -- p_id_grup => &p_id_grup_useri.,\n374: -- p_id_firma => &p_id_firma_noua.,\n375: -- p_id_utilop=> &p_id_utilop.\n376: -- );\n377: -- END;\n378: -- /\n379: \n380: -- --- user 2: Raluca Ion ---\n381: DEFINE p_id_util_2 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6)\n382: \n383: -- optional, doar daca userul NU exista inca:\n384: -- BEGIN\n385: -- PACK_DREPTURI.UTILIZATORIINSPROC(\n386: -- p_utilizator => '', -- DE COMPLETAT (login)\n387: -- p_parola => '', -- DE COMPLETAT (parola initiala)\n388: -- p_inactiv => 'N',\n389: -- p_id_utilop => &p_id_utilop.\n390: -- );\n391: -- END;\n392: -- /\n393: \n394: -- BEGIN\n395: -- PACK_DREPTURI.UTILDREPTINSPROC(\n396: -- p_id_util => &p_id_util_2.,\n397: -- p_id_grup => &p_id_grup_useri.,\n398: -- p_id_firma => &p_id_firma_noua.,\n399: -- p_id_utilop=> &p_id_utilop.\n400: -- );\n401: -- END;\n402: -- /\n403: \n404: -- ============================================================================\n405: -- SFARSIT SCHITA. De aprobat de Marius -- vezi NOTA IMPORTANTA 1-4 de la\n406: -- inceputul fisierului inainte de orice rulare.\n407: -- ============================================================================\n\n(End of file - total 407 lines)\n","metadata":{"preview":"-- ============================================================================\n-- SCHITA (DRAFT) - Deschidere firma noua pe instalatia Oracle ROA ConPress\n-- Fisier NEEXECUTAT, de aprobat de Marius inainte de orice rulare.\n-- Schema tinta: LUDIPEDIA (confirmat de Marius; server conpress, tunel\n-- Bitvise conpress.tlp, alias TNS + DSN ODBC ROA_CONPRESS).\n-- ============================================================================\n--\n-- NOTA IMPORTANTA 1 - conflict de regula:\n-- D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conexiuni-tunel-ssh-odbc.md, sectiunea\n-- \"Reguli pe productie\" (linia ~152), interzice explicit pe canalul manual\n-- sqlplus-pe-tunel orice altceva in afara de SELECT:\n-- \"Doar SELECT. Fara INSERT/UPDATE/DELETE/DDL, fara ALTER SESSION care\n-- schimba comportament persistent.\"\n-- PASUL 0 din acest fisier (verificari) respecta regula (doar SELECT).\n-- PASII 1-4 (INSERT firma, job schema, drepturi utilizatori) SCRIU date si\n-- NU respecta acea regula daca ar fi rulati pe canalul manual descris in\n-- document. Nu e o decizie luata aici: Marius decide canalul de executie\n-- (cont/canal cu drept de scriere pe ConPress, sau rularea propriu-zisa\n-- prin aplicatia ROASTART, care e calea normala de productie pentru\n-- deschidere de firma).","truncated":false,"loaded":[],"display":{"type":"file","path":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\schita_deschidere_firma_conpress.sql","text":"-- ============================================================================\n-- SCHITA (DRAFT) - Deschidere firma noua pe instalatia Oracle ROA ConPress\n-- Fisier NEEXECUTAT, de aprobat de Marius inainte de orice rulare.\n-- Schema tinta: LUDIPEDIA (confirmat de Marius; server conpress, tunel\n-- Bitvise conpress.tlp, alias TNS + DSN ODBC ROA_CONPRESS).\n-- ============================================================================\n--\n-- NOTA IMPORTANTA 1 - conflict de regula:\n-- D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conexiuni-tunel-ssh-odbc.md, sectiunea\n-- \"Reguli pe productie\" (linia ~152), interzice explicit pe canalul manual\n-- sqlplus-pe-tunel orice altceva in afara de SELECT:\n-- \"Doar SELECT. Fara INSERT/UPDATE/DELETE/DDL, fara ALTER SESSION care\n-- schimba comportament persistent.\"\n-- PASUL 0 din acest fisier (verificari) respecta regula (doar SELECT).\n-- PASII 1-4 (INSERT firma, job schema, drepturi utilizatori) SCRIU date si\n-- NU respecta acea regula daca ar fi rulati pe canalul manual descris in\n-- document. Nu e o decizie luata aici: Marius decide canalul de executie\n-- (cont/canal cu drept de scriere pe ConPress, sau rularea propriu-zisa\n-- prin aplicatia ROASTART, care e calea normala de productie pentru\n-- deschidere de firma).\n--\n-- NOTA IMPORTANTA 2 - stare fisier:\n-- Acesta e o SCHITA, nu un script gata de rulare. Nimeni nu s-a conectat\n-- la ConPress pentru a pregati acest fisier si nimeni nu l-a rulat.\n--\n-- NOTA IMPORTANTA 3 - parametri lipsa din certificatul ONRC (LUDIPEDIA):\n-- certificatul de inregistrare acopera doar firma, CUI, nr. registru\n-- comert, sediu social, CAEN principal si data inregistrarii. Urmatorii\n-- parametri NU sunt in certificat si trebuie completati de Marius inainte\n-- de orice executie (marcati mai jos si in sectiunea de parametri cu\n-- \"-- DE COMPLETAT\"):\n-- 1. Date bancare: nume banca + cont (IBAN) - pot fi 1 pana la 10 perechi\n-- (banca1..banca10 / contb1..contb10 in FIRMEMODINSPROC). Interogarea\n-- ANAF publica nu intoarce IBAN (camp gol in raspuns) - ramane de\n-- completat de Marius.\n-- 2. Telefon2, telefon3, fax, email (telefonul principal a fost completat\n-- din ANAF, vezi NOTA IMPORTANTA 5).\n-- 3. Reprezentant legal / declarant: nume, prenume, functie, cod\n-- angajat (codang), indicativ, indice_itm.\n-- 4. Incadrare firma: id_forma_juridica, id_forma_organizare,\n-- id_forma_prop, id_tip_soc (coduri interne din nomenclatoarele\n-- ROASTART - ANAF intoarce doar text descriptiv, nu codul ROASTART,\n-- vezi NOTA IMPORTANTA 5).\n-- 5. Capital social varsat (capital_soc_var) si subscris\n-- (capital_soc_sub).\n-- 6. Punct de lucru (punct_luc) - daca exista, separat de sediul social.\n-- 7. id_mama / e_mama - firma simpla sau membra a unui grup deja\n-- existent in ROASTART; daca simpla, id_mama = 0.\n-- 8. id_loc (identificator localitate in nomenclatorul ROASTART),\n-- cod_firma (cod intern firma), id_util (operatorul care introduce\n-- firma - userul care ruleaza scriptul in ROASTART), oasp\n-- (obligatie de asigurare - da/nu), tip_modificare.\n-- Lista completa de parametri \"DE COMPLETAT\" e reluata langa fiecare\n-- variabila din sectiunea PARAMETRI de mai jos.\n--\n-- NOTA IMPORTANTA 5 - date confirmate/completate din interogarea publica\n-- ANAF (16.09.2026, CUI 54602536, serviciu\n-- https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva - acelasi URL\n-- folosit de procedura existenta ANAF_CreeazaCerereANAF in\n-- D:\\ROA\\ROAFACTURARE\\COMUN\\programe\\validare.prg:1845):\n-- - Denumire, nr. registru comert (J2026028926001) si CAEN (9329)\n-- CONFIRMATE, identice cu certificatul ONRC.\n-- - Telefon completat: 0724968582 (p_telefon).\n-- - Cod postal completat: 900217 (p_cod_postal).\n-- - Adresa CONFIRMATA in mare parte, cu O DISCREPANTA fata de certificat:\n-- certificatul avea p_numar = 'ZA', ANAF intoarce \"2A\" pentru acelasi\n-- sediu (judet, localitate, strada, bloc L119A, scara A, apartament 2 -\n-- identice, extrase din date_generale.adresa). Marius a confirmat ca\n-- ANAF e sursa de adevar (OCR-ul certificatului e suspect) - p_numar a\n-- fost SCHIMBAT mai jos la '2A' (fostul 'ZA' era probabil o citire\n-- gresita a lui '2A').\n-- - Data inregistrarii: certificatul avea 06.05.2026, ANAF intoarce\n-- date_generale.data_inregistrare = 2026-05-04 (04.05.2026) si\n-- stare_inregistrare = \"INREGISTRAT din data 04.05.2026\" - confirma\n-- aceeasi data. Marius a confirmat ANAF ca sursa de adevar - p_data_inreg\n-- a fost SCHIMBAT mai jos la '04.05.2026'.\n-- - scpTVA = false -> firma NU e inregistrata ca platitoare de TVA la\n-- data interogarii (util pentru p_persoana_juridica / incadrare, nu\n-- schimba niciun parametru din FIRMEMODINSPROC direct).\n-- - forma_organizare ANAF = \"PERSOANA JURIDICA\" -> confirma\n-- p_persoana_juridica = 'D'.\n-- - IBAN, email, capital social, reprezentant legal, forma juridica\n-- interna ROASTART: NU sunt in raspunsul ANAF (serviciul public nu le\n-- are) - raman \"DE COMPLETAT\" de Marius, nu s-au inventat valori.\n--\n-- NOTA IMPORTANTA 4 - useri drepturi:\n-- Marius a CONFIRMAT: sunt DOAR 2 useri carora li se dau drepturi pe firma\n-- noua. \"Vali Iliescu\" / \"Valentina Iliescu\" e UN SINGUR user (user 1,\n-- prescurtare a aceluiasi nume), al doilea e \"Raluca Ion\" (user 2).\n-- Fisierul schiteaza exact 2 blocuri la Pasul 4, dupa acelasi sablon.\n-- Niciun id_util/id_grup nu e cunoscut inca -- se completeaza DUPA ce\n-- Pasul 0 confirma daca userii exista deja in UTILIZATORI/vutilizatori.\n--\n-- NOTA IMPORTANTA 6 - verificare DB (Pasul A) INCERCATA si BLOCATA (16.09.2026):\n-- Tunelul Bitvise s-a ridicat cu succes (`stnlc.exe -profile=D:\\vm303-profile\\\n-- conpress.tlp`, profil gasit acolo, nu la calea din documentul de conexiuni;\n-- port 127.0.0.1:1521 confirmat deschis, alias TNS ROA_CONPRESS rezolvat\n-- spre SID=ROA). NU s-a putut merge mai departe: schema Oracle de pe\n-- ConPress e \"xenoti\" (conform tabelului din conexiuni-tunel-ssh-odbc.md),\n-- iar parola pentru acel user NU exista nicaieri accesibil (DSN ODBC\n-- ROA_CONPRESS are UserID/Password goale in registry, nu e in Windows\n-- Credential Manager, nu e in vreun fisier din D:\\ROA cautat). Conform\n-- regulii explicite din document (\"Fara ghicit parole\"), verificarea NU s-a\n-- facut - nu s-a incercat nicio parola. Tunelul a fost inchis la loc dupa\n-- incercare (port 1521 reconfirmat inchis).\n-- RAMASE NEVERIFICATE, deci NEschimbate mai jos (raman \"DE COMPLETAT\"):\n-- - combinatia comuna id_forma_juridica/id_forma_organizare/id_forma_prop/\n-- id_tip_soc (GROUP BY pe firme) - nerulat.\n-- - existenta userilor Vali/Valentina Iliescu si Raluca Ion in\n-- UTILIZATORI/vutilizatori si id_util al lor - nerulat.\n-- - id_grup uzual din vdef_util_grup - nerulat.\n-- - unicitate CUI 54602536 in firme (nu exista deja) - nerulat.\n-- Marius (sau cine are parola schemei xenoti pe ConPress) trebuie sa ruleze\n-- Pasul 0 manual, sau sa dea parola unei sesiuni viitoare.\n--\n-- ============================================================================\n-- PARAMETRI DE SUBSTITUIRE (sqlplus DEFINE) - reutilizabile pentru orice\n-- firma noua. Valorile de mai jos vin din interogarea ANAF (sursa de adevar\n-- pentru identificare/adresa/CAEN/data inregistrare) plus certificatul ONRC\n-- pentru ce ANAF nu acopera; codurile interne ROASTART si userii raman\n-- DE COMPLETAT -- verificarea DB (NOTA IMPORTANTA 6) a fost blocata.\n-- ============================================================================\n\n-- --- identificare firma (din certificatul ONRC) ---\nDEFINE p_firma = 'LUDIPEDIA S.R.L.'\nDEFINE p_antet = 'LUDIPEDIA S.R.L.'\nDEFINE p_cod_fiscal = '54602536'\nDEFINE p_reg_comert = 'J2026028926001'\nDEFINE p_caen = '9329' -- CONFIRMAT: identic in raspunsul ANAF (cod_CAEN) din 16.09.2026\nDEFINE p_data_inreg = '04.05.2026' -- SCHIMBAT din certificat (06.05.2026) -- sursa ANAF (date_generale.data_inregistrare), vezi NOTA IMPORTANTA 5\n\n-- --- adresa sediu social (din certificatul ONRC) ---\nDEFINE p_judet = 'Constanta'\nDEFINE p_localitate = 'Constanta'\nDEFINE p_strada = 'Strada Baba Novac'\nDEFINE p_numar = '2A' -- SCHIMBAT din certificat ('ZA') -- sursa ANAF (date_generale.adresa / snumar_Strada), vezi NOTA IMPORTANTA 5\nDEFINE p_bloc = 'L119A'\nDEFINE p_scara = 'A'\nDEFINE p_apart = '2'\nDEFINE p_cod_postal = '900217' -- completat din ANAF (16.09.2026), nu era in certificat\nDEFINE p_adresa = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'\n\n-- --- date lipsa din certificat, obligatorii pentru FIRMEMODINSPROC ---\nDEFINE p_banca1 = '' -- DE COMPLETAT (serviciul public ANAF nu intoarce IBAN)\nDEFINE p_contb1 = '' -- DE COMPLETAT (IBAN)\n-- banca2..banca10 / contb2..contb10: DE COMPLETAT doar daca exista mai multe conturi\nDEFINE p_persoana_juridica = 'D' -- confirmat de forma_organizare ANAF = \"PERSOANA JURIDICA\" (D/F dupa conventia ROASTART)\nDEFINE p_codang = '' -- DE COMPLETAT (cod angajat / reprezentant)\nDEFINE p_nume = '' -- DE COMPLETAT (nume reprezentant legal / declarant)\nDEFINE p_prenume = '' -- DE COMPLETAT\nDEFINE p_telefon = '0724968582' -- completat din ANAF (16.09.2026), nu era in certificat\nDEFINE p_telefon2 = '' -- DE COMPLETAT\nDEFINE p_telefon3 = '' -- DE COMPLETAT\nDEFINE p_fax = '' -- DE COMPLETAT\nDEFINE p_email = '' -- DE COMPLETAT\nDEFINE p_oasp = '' -- DE COMPLETAT (da/nu, dupa conventia ROASTART)\nDEFINE p_capital_soc_var = '' -- DE COMPLETAT\nDEFINE p_capital_soc_sub = '' -- DE COMPLETAT\nDEFINE p_punct_luc = '' -- DE COMPLETAT (daca exista, altfel gol)\nDEFINE p_schema = 'LUDIPEDIA' -- CONFIRMAT de Marius\nDEFINE p_id_mama = '0' -- DE CONFIRMAT: 0 daca firma simpla, altfel id firma-mama existenta\nDEFINE p_e_mama = '' -- DE COMPLETAT doar daca p_id_mama <> 0\nDEFINE p_id_loc = '' -- DE COMPLETAT (id localitate in nomenclator ROASTART)\nDEFINE p_id_util = '' -- DE COMPLETAT (operatorul care introduce firma in ROASTART)\nDEFINE p_id_forma_juridica = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6\nDEFINE p_id_forma_organizare = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6\nDEFINE p_id_forma_prop = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6\nDEFINE p_id_tip_soc = '' -- DE COMPLETAT -- verificare DB blocata, vezi NOTA IMPORTANTA 6\nDEFINE p_indicativ = '' -- DE COMPLETAT\nDEFINE p_declarant = '' -- DE COMPLETAT (nume declarant, poate fi = p_nume/p_prenume)\nDEFINE p_functie = '' -- DE COMPLETAT (functia declarantului)\nDEFINE p_indice_itm = '' -- DE COMPLETAT\nDEFINE p_tip_modificare = '' -- DE COMPLETAT\nDEFINE p_cod_firma = '' -- DE COMPLETAT (cod intern firma in ROASTART)\n\n-- --- job schema Oracle noua (start contabil) ---\nDEFINE p_luna_start = '5' -- CONFIRMAT de Marius pentru LUDIPEDIA\nDEFINE p_an_start = '2026' -- CONFIRMAT de Marius pentru LUDIPEDIA\n\n-- --- useri carora li se dau drepturi pe firma noua (DOAR 2, confirmat de Marius) ---\nDEFINE p_nume_user1 = 'Iliescu'\nDEFINE p_prenume_user1= 'Vali' -- \"Vali\" / \"Valentina\" -- confirmat: aceeasi persoana (user 1)\nDEFINE p_nume_user2 = 'Ion'\nDEFINE p_prenume_user2= 'Raluca'\nDEFINE p_id_grup_useri = '' -- DE COMPLETAT -- verificare DB blocata (fara parola schema xenoti), vezi NOTA IMPORTANTA 6\nDEFINE p_id_utilop = '' -- DE COMPLETAT (operator care insereaza drepturile, poate fi = p_id_util)\n\n\n-- ============================================================================\n-- PAS 0 -- VERIFICARE (doar SELECT, sigur pe canalul sqlplus-tunel)\n-- Scop: (a) userii Vali/Valentina Iliescu si Raluca Ion exista deja in\n-- UTILIZATORI/vutilizatori? (b) firma cu acest CUI exista deja pe\n-- schema LUDIPEDIA (evitare duplicat)?\n-- ============================================================================\n\n-- 0a. Cautare useri dupa nume (LIKE, pentru ca nu stim daca \"Vali\" e nume complet)\nSELECT id_util, utilizator, nume, prenume, inactiv\n FROM vutilizatori\n WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user1.' || '%')\n OR UPPER(prenume) LIKE UPPER('%Vali%')\n OR UPPER(prenume) LIKE UPPER('%Valentina%')\n FETCH FIRST 20 ROWS ONLY;\n\nSELECT id_util, utilizator, nume, prenume, inactiv\n FROM vutilizatori\n WHERE UPPER(nume) LIKE UPPER('%' || '&p_nume_user2.' || '%')\n OR UPPER(prenume) LIKE UPPER('%' || '&p_prenume_user2.' || '%')\n FETCH FIRST 20 ROWS ONLY;\n\n-- 0b. Drepturi deja existente pe firme, ca sa vedem grupul folosit uzual\n-- (util pentru completarea p_id_grup_useri de mai sus)\nSELECT id_dug, id_grup, id_firma, firma\n FROM vdef_util_grup\n WHERE id_grup IN (\n SELECT DISTINCT id_grup FROM vdef_util_grup\n )\n FETCH FIRST 50 ROWS ONLY;\n\n-- 0c. Firma cu acest CUI exista deja? (evitare duplicat la Pasul 1)\nSELECT id, firma, cod_fiscal, reg_comert\n FROM firme\n WHERE REGEXP_REPLACE(UPPER(TRIM(cod_fiscal)), '[^0-9]', '') =\n REGEXP_REPLACE(UPPER(TRIM('&p_cod_fiscal.')), '[^0-9]', '')\n FETCH FIRST 10 ROWS ONLY;\n\n\n-- ============================================================================\n-- PAS 1 -- INSERT FIRMA\n-- PACK_DREPTURI.FIRMEMODINSPROC(...)\n-- Sursa semnaturii: D:\\ROA\\ROASTART\\COMUN\\clase\\ofirma.vc2:130-146\n-- ATENTIE: scrie date -- NU e SELECT, vezi NOTA IMPORTANTA 1 de la inceput.\n-- Ordinea parametrilor de mai jos respecta exact ordinea din semnatura.\n-- ============================================================================\n\n-- BEGIN\n-- PACK_DREPTURI.FIRMEMODINSPROC(\n-- p_id => NULL, -- id nou, generat de procedura/secventa\n-- p_firma => '&p_firma.',\n-- p_antet => '&p_antet.',\n-- p_cod_fiscal => '&p_cod_fiscal.',\n-- p_reg_comert => '&p_reg_comert.',\n-- p_banca1 => '&p_banca1.',\n-- p_contb1 => '&p_contb1.',\n-- p_banca2 => NULL, p_contb2 => NULL,\n-- p_banca3 => NULL, p_contb3 => NULL,\n-- p_banca4 => NULL, p_contb4 => NULL,\n-- p_banca5 => NULL, p_contb5 => NULL,\n-- p_banca6 => NULL, p_contb6 => NULL,\n-- p_banca7 => NULL, p_contb7 => NULL,\n-- p_banca8 => NULL, p_contb8 => NULL,\n-- p_banca9 => NULL, p_contb9 => NULL,\n-- p_banca10 => NULL, p_contb10 => NULL,\n-- p_adresa => '&p_adresa.',\n-- p_cod_firma => '&p_cod_firma.',\n-- p_persoana_juridica=> '&p_persoana_juridica.',\n-- p_codang => '&p_codang.',\n-- p_nume => '&p_nume.',\n-- p_prenume => '&p_prenume.',\n-- p_telefon => '&p_telefon.',\n-- p_telefon2 => '&p_telefon2.',\n-- p_telefon3 => '&p_telefon3.',\n-- p_fax => '&p_fax.',\n-- p_email => '&p_email.',\n-- p_oasp => '&p_oasp.',\n-- p_capital_soc_var => '&p_capital_soc_var.',\n-- p_capital_soc_sub => '&p_capital_soc_sub.',\n-- p_punct_luc => '&p_punct_luc.',\n-- p_caen => '&p_caen.',\n-- p_schema => '&p_schema.',\n-- p_judet => '&p_judet.',\n-- p_localitate => '&p_localitate.',\n-- p_strada => '&p_strada.',\n-- p_numar => '&p_numar.',\n-- p_bloc => '&p_bloc.',\n-- p_scara => '&p_scara.',\n-- p_apart => '&p_apart.',\n-- p_cod_postal => '&p_cod_postal.',\n-- p_id_mama => &p_id_mama.,\n-- p_e_mama => '&p_e_mama.',\n-- p_id_loc => '&p_id_loc.',\n-- p_id_util => '&p_id_util.',\n-- p_id_forma_juridica=> '&p_id_forma_juridica.',\n-- p_id_forma_organizare => '&p_id_forma_organizare.',\n-- p_id_forma_prop => '&p_id_forma_prop.',\n-- p_id_tip_soc => '&p_id_tip_soc.',\n-- p_indicativ => '&p_indicativ.',\n-- p_declarant => '&p_declarant.',\n-- p_functie => '&p_functie.',\n-- p_indice_itm => '&p_indice_itm.',\n-- p_tip_modificare => '&p_tip_modificare.',\n-- p_caen_revizie => NULL\n-- );\n-- END;\n-- /\n\n\n-- ============================================================================\n-- PAS 2 -- JOB CREARE SCHEMA ORACLE (async)\n-- SYN_NEWSCHEMAJOB(pcSchema, pnLuna, pnAn)\n-- Se apeleaza doar daca firma e simpla (p_id_mama = 0), nu membra de grup.\n-- ATENTIE: porneste un job -- scrie/creeaza obiecte, nu e SELECT.\n-- ============================================================================\n\n-- BEGIN\n-- IF &p_id_mama. = 0 THEN\n-- SYN_NEWSCHEMAJOB('&p_schema.', &p_luna_start., &p_an_start.);\n-- END IF;\n-- END;\n-- /\n\n\n-- ============================================================================\n-- PAS 3 -- POLL STATUS JOB SCHEMA\n-- SYN_NEWSCHEMAPROGRESS(pcSchema) -- functie, intoarce status text.\n-- Se astepta 'FINALIZAT'. Job async: poate dura; NU se face poll fara\n-- timeout/numar maxim de incercari (exemplu mai jos, de adaptat manual\n-- sau intr-un script client, nu ca bucla PL/SQL blocanta pe productie).\n-- ============================================================================\n\n-- Interogare punctuala (de rulat manual, la interval, cu numarare manuala\n-- a incercarilor -- max. N incercari, ex. 30, la 10 secunde):\nSELECT SYN_NEWSCHEMAPROGRESS('&p_schema.') AS status_job FROM dual;\n\n-- Varianta PL/SQL cu timeout explicit (DOAR ca exemplu -- de adaptat/testat\n-- de Marius inainte de folosire, nu se stie limita reala de reincercari):\n-- DECLARE\n-- v_status VARCHAR2(100);\n-- v_incercari PLS_INTEGER := 0;\n-- c_max_incercari CONSTANT PLS_INTEGER := 30; -- DE CONFIRMAT\n-- c_pauza_sec CONSTANT PLS_INTEGER := 10; -- DE CONFIRMAT\n-- BEGIN\n-- LOOP\n-- v_status := SYN_NEWSCHEMAPROGRESS('&p_schema.');\n-- EXIT WHEN v_status = 'FINALIZAT' OR v_incercari >= c_max_incercari;\n-- v_incercari := v_incercari + 1;\n-- DBMS_LOCK.SLEEP(c_pauza_sec);\n-- END LOOP;\n-- IF v_status != 'FINALIZAT' THEN\n-- RAISE_APPLICATION_ERROR(-20000, 'Job schema neterminat dupa timeout, status=' || v_status);\n-- END IF;\n-- END;\n-- /\n\n\n-- ============================================================================\n-- PAS 4 -- DREPTURI UTILIZATORI PE FIRMA NOUA\n-- PACK_DREPTURI.UTILDREPTINSPROC(id_util, id_grup, id_firma, id_utilop)\n-- Sursa: D:\\ROA\\ROASTART\\Clase\\ostart_util.vc2:32-40\n-- id_util / id_grup se completeaza DUPA ce Pasul 0a confirma daca userii\n-- exista deja. id_firma se completeaza cu id-ul intors de Pasul 1.\n-- ATENTIE: scrie date, nu e SELECT.\n-- ============================================================================\n\nDEFINE p_id_firma_noua = '' -- DE COMPLETAT dupa Pasul 1 (id firma inserata)\n\n-- --- user 1: Vali / Valentina Iliescu (o singura persoana, confirmat) ---\nDEFINE p_id_util_1 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6); gol daca userul nu exista inca\n\n-- optional, doar daca userul NU exista inca in UTILIZATORI:\n-- BEGIN\n-- PACK_DREPTURI.UTILIZATORIINSPROC(\n-- p_utilizator => '', -- DE COMPLETAT (login)\n-- p_parola => '', -- DE COMPLETAT (parola initiala)\n-- p_inactiv => 'N',\n-- p_id_utilop => &p_id_utilop.\n-- );\n-- END;\n-- /\n\n-- BEGIN\n-- PACK_DREPTURI.UTILDREPTINSPROC(\n-- p_id_util => &p_id_util_1.,\n-- p_id_grup => &p_id_grup_useri.,\n-- p_id_firma => &p_id_firma_noua.,\n-- p_id_utilop=> &p_id_utilop.\n-- );\n-- END;\n-- /\n\n-- --- user 2: Raluca Ion ---\nDEFINE p_id_util_2 = '' -- DE COMPLETAT -- Pasul 0a nerulat (verificare DB blocata, NOTA IMPORTANTA 6)\n\n-- optional, doar daca userul NU exista inca:\n-- BEGIN\n-- PACK_DREPTURI.UTILIZATORIINSPROC(\n-- p_utilizator => '', -- DE COMPLETAT (login)\n-- p_parola => '', -- DE COMPLETAT (parola initiala)\n-- p_inactiv => 'N',\n-- p_id_utilop => &p_id_utilop.\n-- );\n-- END;\n-- /\n\n-- BEGIN\n-- PACK_DREPTURI.UTILDREPTINSPROC(\n-- p_id_util => &p_id_util_2.,\n-- p_id_grup => &p_id_grup_useri.,\n-- p_id_firma => &p_id_firma_noua.,\n-- p_id_utilop=> &p_id_utilop.\n-- );\n-- END;\n-- /\n\n-- ============================================================================\n-- SFARSIT SCHITA. De aprobat de Marius -- vezi NOTA IMPORTANTA 1-4 de la\n-- inceputul fisierului inainte de orice rulare.\n-- ============================================================================","lineStart":1,"lineEnd":407,"totalLines":407,"truncated":false}},"title":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\schita_deschidere_firma_conpress.sql","time":{"start":1789550003040,"end":1789550003113}},"id":"prt_0a97e02ab001Sqi4GwqX3u2lwY","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97df014001gSUlcHj9aZimH0"}} +{"type":"tool_use","timestamp":1789550003874,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"read","callID":"call_02_QWPgRcbWhfFQLZYfBxxX3141","state":{"status":"completed","input":{"filePath":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\deschide_firma_conpress.ps1"},"output":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\deschide_firma_conpress.ps1\nfile\n\n1: <#\n2: Genereaza fisierul .sql de deschidere firma (sablon PACK_DREPTURI.FIRMEMODINSPROC pe ConPress)\n3: pornind de la interogarea publica ANAF (sursa de adevar pentru denumire/adresa/CAEN/data\n4: inregistrare -- NU certificatul ONRC, care poate avea erori de OCR/transcriere).\n5: \n6: Nu scrie nimic in Oracle. Genereaza doar un fisier .sql (cu Pasii 1/2/4 tot comentati, ca in\n7: sablon) plecand de la schita existenta. Pasul 0 (SELECT) poate fi rulat optional daca se dau\n8: parametrii de conexiune -- tunelul si credentialele raman responsabilitatea lui Marius.\n9: \n10: Exemplu minimal:\n11: .\\deschide_firma_conpress.ps1 -Cui 54602536\n12: \n13: Exemplu cu parametri suplimentari (banca, drepturi):\n14: .\\deschide_firma_conpress.ps1 -Cui 54602536 -Banca1 'BANCA X' -Contb1 'RO00XXXX...' `\n15: -IdUtil 5 -IdGrupUseri 3 -IdUtilOp 5 -NumeUser1 Iliescu -PrenumeUser1 Vali `\n16: -NumeUser2 Ion -PrenumeUser2 Raluca\n17: #>\n18: [CmdletBinding()]\n19: param(\n20: [Parameter(Mandatory)] [string]$Cui,\n21: [datetime]$DataVerificare = (Get-Date),\n22: [int]$LunaStart = 5,\n23: [int]$AnStart = 2026,\n24: \n25: [string]$TemplateSql = '',\n26: [string]$OutSql = '',\n27: \n28: # --- date pe care ANAF nu le are: parametri optionali, implicit goale (\"DE COMPLETAT\") ---\n29: [string]$Antet = '',\n30: [string]$Banca1 = '', [string]$Contb1 = '',\n31: [string]$Codang = '', [string]$Nume = '', [string]$Prenume = '',\n32: [string]$Telefon2 = '', [string]$Telefon3 = '', [string]$Fax = '', [string]$Email = '',\n33: [string]$Oasp = '', [string]$CapitalSocVar = '', [string]$CapitalSocSub = '', [string]$PunctLuc = '',\n34: [string]$Schema = '',\n35: [string]$IdMama = '0', [string]$EMama = '',\n36: [string]$IdLoc = '', [string]$IdUtil = '',\n37: [string]$IdFormaJuridica = '', [string]$IdFormaOrganizare = '', [string]$IdFormaProp = '', [string]$IdTipSoc = '',\n38: [string]$Indicativ = '', [string]$Declarant = '', [string]$Functie = '', [string]$IndiceItm = '',\n39: [string]$TipModificare = '', [string]$CodFirma = '',\n40: [string]$NumeUser1 = '', [string]$PrenumeUser1 = '', [string]$NumeUser2 = '', [string]$PrenumeUser2 = '',\n41: [string]$IdGrupUseri = '', [string]$IdUtilOp = '',\n42: \n43: # --- Pasul 0 (SELECT) optional -- doar daca se dau explicit parametrii de conexiune ---\n44: [string]$TnsAlias = 'ROA_CONPRESS',\n45: [string]$DbUser = '',\n46: [securestring]$DbPassword,\n47: [switch]$RunPas0,\n48: [string]$SqlplusPath = 'D:\\ROA\\instantclient_19_18\\sqlplus.exe',\n49: [string]$TnsAdmin = 'D:\\ROA\\instantclient_19_18'\n50: )\n51: \n52: $ErrorActionPreference = 'Stop'\n53: \n54: function Write-Utf8NoBom {\n55: # sqlplus se poticneste pe BOM (SP2-0734) chiar rulat cu @fisier - scrie fara BOM explicit\n56: param([string]$Path, [string[]]$Lines)\n57: [System.IO.File]::WriteAllText($Path, ($Lines -join \"`r`n\") + \"`r`n\", (New-Object Text.UTF8Encoding($false)))\n58: }\n59: \n60: $ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path }\n61: if (-not $TemplateSql) { $TemplateSql = Join-Path $ScriptDir 'schita_deschidere_firma_conpress.sql' }\n62: \n63: function ConvertTo-DataRo {\n64: param([string]$s)\n65: if ([string]::IsNullOrWhiteSpace($s)) { return '' }\n66: foreach ($fmt in @('dd.MM.yyyy', 'dd-MM-yyyy', 'yyyy-MM-dd')) {\n67: $d = [datetime]::MinValue\n68: if ([datetime]::TryParseExact($s, $fmt, [Globalization.CultureInfo]::InvariantCulture, [Globalization.DateTimeStyles]::None, [ref]$d)) {\n69: return $d.ToString('dd.MM.yyyy')\n70: }\n71: }\n72: return $s\n73: }\n74: \n75: function Get-DateAnaf {\n76: param([string]$Cui, [datetime]$Data)\n77: $cuiNum = ($Cui -replace '[^0-9]', '')\n78: if ([string]::IsNullOrEmpty($cuiNum)) { throw \"CUI invalid: '$Cui'\" }\n79: $dataStr = $Data.ToString('yyyy-MM-dd')\n80: # JSON construit manual (payload trivial) - evita capcana ConvertTo-Json care despacheteaza\n81: # array-uri de un singur element cand trece prin pipeline.\n82: $body = '[{\"cui\":' + $cuiNum + ',\"data\":\"' + $dataStr + '\"}]'\n83: $url = 'https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva'\n84: # acelasi URL folosit de ANAF_CreeazaCerereANAF, COMUN\\programe\\validare.prg:1845\n85: # decodare explicita UTF-8 din raspuns (nu Invoke-RestMethod): serverul ANAF nu trimite\n86: # charset in Content-Type, PowerShell 5.1 ghiceste ISO-8859-1 si strica diacriticele -\n87: # acelasi motiv notat in validare.prg:1744 pentru clientul VFP.\n88: $req = [System.Net.WebRequest]::Create($url)\n89: $req.Method = 'POST'\n90: $req.ContentType = 'application/json; charset=utf-8'\n91: $bytesOut = [Text.Encoding]::UTF8.GetBytes($body)\n92: $req.ContentLength = $bytesOut.Length\n93: $reqStream = $req.GetRequestStream()\n94: $reqStream.Write($bytesOut, 0, $bytesOut.Length)\n95: $reqStream.Close()\n96: $webResp = $req.GetResponse()\n97: $reader = New-Object IO.StreamReader($webResp.GetResponseStream(), [Text.Encoding]::UTF8)\n98: $json = $reader.ReadToEnd()\n99: $reader.Close()\n100: $webResp.Close()\n101: return $json | ConvertFrom-Json\n102: }\n103: \n104: function Get-DetaliiAdresa {\n105: param([string]$Text)\n106: $r = [ordered]@{ Bloc = ''; Scara = ''; Apart = '' }\n107: if ([string]::IsNullOrWhiteSpace($Text)) { return $r }\n108: if ($Text -match '(?i)BL\\.?\\s*([A-Z0-9\\-]+)') { $r.Bloc = $Matches[1] }\n109: if ($Text -match '(?i)SC\\.?\\s*([A-Z0-9\\-]+)') { $r.Scara = $Matches[1] }\n110: if ($Text -match '(?i)AP\\.?\\s*([A-Z0-9\\-]+)') { $r.Apart = $Matches[1] }\n111: return $r\n112: # ponytail: heuristica regex pe text liber ANAF (bl./sc./ap.), nu un parser de adrese complet;\n113: # de verificat manual daca formatul sediului difera (ex. \"et.\" lipsa, abrevieri neuzuale).\n114: }\n115: \n116: # ---------------------------------------------------------------------------\n117: # 1. Interogare ANAF\n118: # ---------------------------------------------------------------------------\n119: Write-Host \"Interogare ANAF pentru CUI $Cui (data verificare $($DataVerificare.ToString('yyyy-MM-dd')))...\"\n120: $resp = Get-DateAnaf -Cui $Cui -Data $DataVerificare\n121: \n122: if (-not $resp.found -or $resp.found.Count -eq 0) {\n123: Write-Warning \"ANAF nu a gasit CUI $Cui (cod=$($resp.cod), message=$($resp.message)). Nu se genereaza fisierul .sql.\"\n124: if ($resp.notFound) { Write-Warning \"notFound: $($resp.notFound -join ', ')\" }\n125: return\n126: }\n127: \n128: $item = $resp.found[0]\n129: $dg = $item.date_generale\n130: $adr = $item.adresa_sediu_social\n131: $tva = $item.inregistrare_scop_Tva\n132: \n133: # data_inregistrare (yyyy-MM-dd) e campul structurat; stare_inregistrare (text liber cu\n134: # data in dd.mm.yyyy) e fallback daca lipseste.\n135: $dataInregRaw = if ($dg.data_inregistrare) { [string]$dg.data_inregistrare }\n136: elseif ($dg.stare_inregistrare -match '(\\d{2}\\.\\d{2}\\.\\d{4})') { $Matches[1] }\n137: else { '' }\n138: # bl./sc./et./ap. NU sunt in adresa_sediu_social.sdetalii_Adresa (acolo apare doar\n139: # \"CAMERA n\") - sunt in date_generale.adresa, campul text liber complet.\n140: $detalii = Get-DetaliiAdresa -Text $dg.adresa\n141: \n142: $anaf = [ordered]@{\n143: p_firma = $dg.denumire\n144: p_reg_comert = $dg.nrRegCom\n145: p_caen = if ($dg.cod_CAEN) { [string]$dg.cod_CAEN } else { '' }\n146: p_data_inreg = ConvertTo-DataRo $dataInregRaw\n147: p_telefon = $dg.telefon\n148: p_judet = $adr.sdenumire_Judet\n149: p_localitate = $adr.sdenumire_Localitate\n150: p_strada = $adr.sdenumire_Strada\n151: p_numar = $adr.snumar_Strada\n152: p_cod_postal = $adr.scod_Postal\n153: p_bloc = $detalii.Bloc\n154: p_scara = $detalii.Scara\n155: p_apart = $detalii.Apart\n156: }\n157: $persoanaJuridica = if ($dg.forma_organizare -match '(?i)persoana\\s*juridica') { 'D' } else { '' }\n158: \n159: # ---------------------------------------------------------------------------\n160: # 2. Restul parametrilor - din argumentele scriptului (ANAF nu le are)\n161: # ---------------------------------------------------------------------------\n162: $params = [ordered]@{\n163: p_firma = @{ v = $anaf.p_firma; src = 'ANAF' }\n164: p_antet = @{ v = if ($Antet) { $Antet } else { $anaf.p_firma }; src = if ($Antet) { 'PARAM' } else { 'ANAF (= denumire)' } }\n165: p_cod_fiscal = @{ v = ($Cui -replace '[^0-9]', ''); src = 'PARAM (-Cui)' }\n166: p_reg_comert = @{ v = $anaf.p_reg_comert; src = 'ANAF' }\n167: p_caen = @{ v = $anaf.p_caen; src = 'ANAF' }\n168: p_data_inreg = @{ v = $anaf.p_data_inreg; src = 'ANAF (date_generale.data_inregistrare)' }\n169: \n170: p_judet = @{ v = $anaf.p_judet; src = 'ANAF' }\n171: p_localitate = @{ v = $anaf.p_localitate; src = 'ANAF' }\n172: p_strada = @{ v = $anaf.p_strada; src = 'ANAF' }\n173: p_numar = @{ v = $anaf.p_numar; src = 'ANAF' }\n174: p_bloc = @{ v = $anaf.p_bloc; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }\n175: p_scara = @{ v = $anaf.p_scara; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }\n176: p_apart = @{ v = $anaf.p_apart; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }\n177: p_cod_postal = @{ v = $anaf.p_cod_postal; src = 'ANAF' }\n178: \n179: p_banca1 = @{ v = $Banca1; src = if ($Banca1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }\n180: p_contb1 = @{ v = $Contb1; src = if ($Contb1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }\n181: p_persoana_juridica = @{ v = $persoanaJuridica; src = 'ANAF (forma_organizare)' }\n182: p_codang = @{ v = $Codang; src = if ($Codang) { 'PARAM' } else { 'DE COMPLETAT' } }\n183: p_nume = @{ v = $Nume; src = if ($Nume) { 'PARAM' } else { 'DE COMPLETAT (reprezentant legal)' } }\n184: p_prenume = @{ v = $Prenume; src = if ($Prenume) { 'PARAM' } else { 'DE COMPLETAT' } }\n185: p_telefon = @{ v = $anaf.p_telefon; src = 'ANAF' }\n186: p_telefon2 = @{ v = $Telefon2; src = if ($Telefon2) { 'PARAM' } else { 'DE COMPLETAT' } }\n187: p_telefon3 = @{ v = $Telefon3; src = if ($Telefon3) { 'PARAM' } else { 'DE COMPLETAT' } }\n188: p_fax = @{ v = $Fax; src = if ($Fax) { 'PARAM' } else { 'DE COMPLETAT' } }\n189: p_email = @{ v = $Email; src = if ($Email) { 'PARAM' } else { 'DE COMPLETAT' } }\n190: p_oasp = @{ v = $Oasp; src = if ($Oasp) { 'PARAM' } else { 'DE COMPLETAT' } }\n191: p_capital_soc_var = @{ v = $CapitalSocVar; src = if ($CapitalSocVar) { 'PARAM' } else { 'DE COMPLETAT' } }\n192: p_capital_soc_sub = @{ v = $CapitalSocSub; src = if ($CapitalSocSub) { 'PARAM' } else { 'DE COMPLETAT' } }\n193: p_punct_luc = @{ v = $PunctLuc; src = if ($PunctLuc) { 'PARAM' } else { 'gol (fara punct de lucru declarat)' } }\n194: p_schema = @{ v = if ($Schema) { $Schema } else { $Cui }; src = if ($Schema) { 'PARAM' } else { 'DE CONFIRMAT (implicit = CUI, corecteaza cu -Schema)' } }\n195: p_id_mama = @{ v = $IdMama; src = 'PARAM (implicit 0 = firma simpla)' }\n196: p_e_mama = @{ v = $EMama; src = if ($EMama) { 'PARAM' } else { 'gol (relevant doar daca p_id_mama <> 0)' } }\n197: p_id_loc = @{ v = $IdLoc; src = if ($IdLoc) { 'PARAM' } else { 'DE COMPLETAT' } }\n198: p_id_util = @{ v = $IdUtil; src = if ($IdUtil) { 'PARAM' } else { 'DE COMPLETAT' } }\n199: p_id_forma_juridica = @{ v = $IdFormaJuridica; src = if ($IdFormaJuridica) { 'PARAM' } else { 'DE COMPLETAT' } }\n200: p_id_forma_organizare = @{ v = $IdFormaOrganizare; src = if ($IdFormaOrganizare) { 'PARAM' } else { 'DE COMPLETAT' } }\n201: p_id_forma_prop = @{ v = $IdFormaProp; src = if ($IdFormaProp) { 'PARAM' } else { 'DE COMPLETAT' } }\n202: p_id_tip_soc = @{ v = $IdTipSoc; src = if ($IdTipSoc) { 'PARAM' } else { 'DE COMPLETAT' } }\n203: p_indicativ = @{ v = $Indicativ; src = if ($Indicativ) { 'PARAM' } else { 'DE COMPLETAT' } }\n204: p_declarant = @{ v = $Declarant; src = if ($Declarant) { 'PARAM' } else { 'DE COMPLETAT' } }\n205: p_functie = @{ v = $Functie; src = if ($Functie) { 'PARAM' } else { 'DE COMPLETAT' } }\n206: p_indice_itm = @{ v = $IndiceItm; src = if ($IndiceItm) { 'PARAM' } else { 'DE COMPLETAT' } }\n207: p_tip_modificare = @{ v = $TipModificare; src = if ($TipModificare) { 'PARAM' } else { 'DE COMPLETAT' } }\n208: p_cod_firma = @{ v = $CodFirma; src = if ($CodFirma) { 'PARAM' } else { 'DE COMPLETAT' } }\n209: \n210: p_luna_start = @{ v = [string]$LunaStart; src = 'PARAM (implicit 5)' }\n211: p_an_start = @{ v = [string]$AnStart; src = 'PARAM (implicit 2026)' }\n212: \n213: p_nume_user1 = @{ v = $NumeUser1; src = if ($NumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }\n214: p_prenume_user1 = @{ v = $PrenumeUser1; src = if ($PrenumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }\n215: p_nume_user2 = @{ v = $NumeUser2; src = if ($NumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }\n216: p_prenume_user2 = @{ v = $PrenumeUser2; src = if ($PrenumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }\n217: p_id_grup_useri = @{ v = $IdGrupUseri; src = if ($IdGrupUseri) { 'PARAM' } else { 'DE COMPLETAT' } }\n218: p_id_utilop = @{ v = $IdUtilOp; src = if ($IdUtilOp) { 'PARAM' } else { 'DE COMPLETAT' } }\n219: }\n220: \n221: # adresa compusa, ca in sablon\n222: $params['p_adresa'] = @{\n223: v = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'\n224: src = 'derivat (sablon sqlplus, substituit din campurile de mai sus)'\n225: }\n226: \n227: # ---------------------------------------------------------------------------\n228: # 3. Genereaza blocul DEFINE si scrie fisierul .sql (Pas 0-4 din sablon, neschimbate)\n229: # ---------------------------------------------------------------------------\n230: if (-not (Test-Path -LiteralPath $TemplateSql)) { throw \"Sablon lipsa: $TemplateSql\" }\n231: $templateLines = Get-Content -LiteralPath $TemplateSql -Encoding UTF8\n232: \n233: $startIdx = ($templateLines | Select-String -Pattern '^DEFINE p_firma\\s*=').LineNumber\n234: $endIdx = ($templateLines | Select-String -Pattern '^DEFINE p_id_utilop\\s*=').LineNumber\n235: if (-not $startIdx -or -not $endIdx) { throw \"Sablonul '$TemplateSql' nu are markerii asteptati (DEFINE p_firma / DEFINE p_id_utilop) - format schimbat?\" }\n236: $startIdx = $startIdx[0] - 1\n237: $endIdx = $endIdx[0] - 1\n238: \n239: $before = $templateLines[0..($startIdx - 1)]\n240: $after = $templateLines[($endIdx + 1)..($templateLines.Count - 1)]\n241: \n242: $newBlock = New-Object System.Collections.Generic.List[string]\n243: $newBlock.Add('-- ============================================================================')\n244: $newBlock.Add(\"-- PARAMETRI GENERATI AUTOMAT de deschide_firma_conpress.ps1\")\n245: $newBlock.Add(\"-- Rulat: $(Get-Date -Format 'dd.MM.yyyy HH:mm') -- CUI interogat: $Cui -- data verificare ANAF: $($DataVerificare.ToString('dd.MM.yyyy'))\")\n246: $newBlock.Add(\"-- Sursa adresa/denumire/CAEN/data inregistrare: ANAF (webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva),\")\n247: $newBlock.Add(\"-- NU certificatul ONRC -- ANAF e sursa de adevar (posibil OCR gresit pe certificat).\")\n248: $newBlock.Add(\"-- Fiecare linie e adnotata cu sursa valorii: ANAF / PARAM (dat la rulare) / DE COMPLETAT.\")\n249: $newBlock.Add('-- ============================================================================')\n250: $newBlock.Add('')\n251: foreach ($key in $params.Keys) {\n252: $entry = $params[$key]\n253: $val = [string]$entry.v\n254: $line = \"DEFINE $key\".PadRight(30) + \"= '$val' -- $($entry.src)\"\n255: $newBlock.Add($line)\n256: }\n257: $newBlock.Add('')\n258: \n259: if (-not $OutSql) {\n260: $OutSql = Join-Path (Split-Path -Path $TemplateSql -Parent) \"deschidere_firma_$($Cui)_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql\"\n261: }\n262: $outLines = $before + $newBlock + $after\n263: Write-Utf8NoBom -Path $OutSql -Lines $outLines\n264: Write-Host \"Fisier generat: $OutSql\"\n265: \n266: # ---------------------------------------------------------------------------\n267: # 4. Rezumat consola: ce a venit din ANAF vs ce a ramas gol\n268: # ---------------------------------------------------------------------------\n269: Write-Host ''\n270: Write-Host '=== Rezumat campuri ==='\n271: foreach ($key in $params.Keys) {\n272: $entry = $params[$key]\n273: $shown = if ([string]::IsNullOrWhiteSpace([string]$entry.v)) { '(gol)' } else { $entry.v }\n274: Write-Host (\"{0,-24} {1,-45} [{2}]\" -f $key, $shown, $entry.src)\n275: }\n276: \n277: # ---------------------------------------------------------------------------\n278: # 5. Pasul 0 (SELECT) optional -- doar daca s-au dat explicit parametrii de conexiune\n279: # ---------------------------------------------------------------------------\n280: if ($RunPas0) {\n281: if (-not $DbUser -or -not $DbPassword) {\n282: Write-Warning \"RunPas0 cerut dar lipsesc -DbUser/-DbPassword. Tunelul/conexiunea raman responsabilitatea lui Marius -- se sare peste Pasul 0.\"\n283: }\n284: elseif (-not (Test-Path -LiteralPath $SqlplusPath)) {\n285: Write-Warning \"sqlplus nu a fost gasit la '$SqlplusPath'. Se sare peste Pasul 0.\"\n286: }\n287: else {\n288: $pas0Start = ($after | Select-String -Pattern '^-- PAS 0 ').LineNumber\n289: $pas0End = ($after | Select-String -Pattern '^-- PAS 1 ').LineNumber\n290: if (-not $pas0Start -or -not $pas0End) {\n291: Write-Warning \"Nu s-a gasit sectiunea PAS 0 in sablon. Se sare peste.\"\n292: }\n293: else {\n294: $pas0Lines = $after[($pas0Start[0] - 1)..($pas0End[0] - 2)]\n295: $tmpSql = [System.IO.Path]::GetTempFileName() -replace '\\.tmp$', '.sql'\n296: Write-Utf8NoBom -Path $tmpSql -Lines ($newBlock + $pas0Lines)\n297: $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($DbPassword)\n298: try {\n299: $plainPwd = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)\n300: $env:TNS_ADMIN = $TnsAdmin\n301: & $SqlplusPath -S -L \"$DbUser/$plainPwd@$TnsAlias\" \"@$tmpSql\"\n302: } finally {\n303: [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)\n304: $plainPwd = $null\n305: Remove-Item -LiteralPath $tmpSql -ErrorAction SilentlyContinue\n306: }\n307: }\n308: }\n309: }\n\n(End of file - total 309 lines)\n","metadata":{"preview":"<#\nGenereaza fisierul .sql de deschidere firma (sablon PACK_DREPTURI.FIRMEMODINSPROC pe ConPress)\npornind de la interogarea publica ANAF (sursa de adevar pentru denumire/adresa/CAEN/data\ninregistrare -- NU certificatul ONRC, care poate avea erori de OCR/transcriere).\n\nNu scrie nimic in Oracle. Genereaza doar un fisier .sql (cu Pasii 1/2/4 tot comentati, ca in\nsablon) plecand de la schita existenta. Pasul 0 (SELECT) poate fi rulat optional daca se dau\nparametrii de conexiune -- tunelul si credentialele raman responsabilitatea lui Marius.\n\nExemplu minimal:\n .\\deschide_firma_conpress.ps1 -Cui 54602536\n\nExemplu cu parametri suplimentari (banca, drepturi):\n .\\deschide_firma_conpress.ps1 -Cui 54602536 -Banca1 'BANCA X' -Contb1 'RO00XXXX...' `\n -IdUtil 5 -IdGrupUseri 3 -IdUtilOp 5 -NumeUser1 Iliescu -PrenumeUser1 Vali `\n -NumeUser2 Ion -PrenumeUser2 Raluca\n#>\n[CmdletBinding()]\nparam(\n [Parameter(Mandatory)] [string]$Cui,","truncated":false,"loaded":[],"display":{"type":"file","path":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\deschide_firma_conpress.ps1","text":"<#\nGenereaza fisierul .sql de deschidere firma (sablon PACK_DREPTURI.FIRMEMODINSPROC pe ConPress)\npornind de la interogarea publica ANAF (sursa de adevar pentru denumire/adresa/CAEN/data\ninregistrare -- NU certificatul ONRC, care poate avea erori de OCR/transcriere).\n\nNu scrie nimic in Oracle. Genereaza doar un fisier .sql (cu Pasii 1/2/4 tot comentati, ca in\nsablon) plecand de la schita existenta. Pasul 0 (SELECT) poate fi rulat optional daca se dau\nparametrii de conexiune -- tunelul si credentialele raman responsabilitatea lui Marius.\n\nExemplu minimal:\n .\\deschide_firma_conpress.ps1 -Cui 54602536\n\nExemplu cu parametri suplimentari (banca, drepturi):\n .\\deschide_firma_conpress.ps1 -Cui 54602536 -Banca1 'BANCA X' -Contb1 'RO00XXXX...' `\n -IdUtil 5 -IdGrupUseri 3 -IdUtilOp 5 -NumeUser1 Iliescu -PrenumeUser1 Vali `\n -NumeUser2 Ion -PrenumeUser2 Raluca\n#>\n[CmdletBinding()]\nparam(\n [Parameter(Mandatory)] [string]$Cui,\n [datetime]$DataVerificare = (Get-Date),\n [int]$LunaStart = 5,\n [int]$AnStart = 2026,\n\n [string]$TemplateSql = '',\n [string]$OutSql = '',\n\n # --- date pe care ANAF nu le are: parametri optionali, implicit goale (\"DE COMPLETAT\") ---\n [string]$Antet = '',\n [string]$Banca1 = '', [string]$Contb1 = '',\n [string]$Codang = '', [string]$Nume = '', [string]$Prenume = '',\n [string]$Telefon2 = '', [string]$Telefon3 = '', [string]$Fax = '', [string]$Email = '',\n [string]$Oasp = '', [string]$CapitalSocVar = '', [string]$CapitalSocSub = '', [string]$PunctLuc = '',\n [string]$Schema = '',\n [string]$IdMama = '0', [string]$EMama = '',\n [string]$IdLoc = '', [string]$IdUtil = '',\n [string]$IdFormaJuridica = '', [string]$IdFormaOrganizare = '', [string]$IdFormaProp = '', [string]$IdTipSoc = '',\n [string]$Indicativ = '', [string]$Declarant = '', [string]$Functie = '', [string]$IndiceItm = '',\n [string]$TipModificare = '', [string]$CodFirma = '',\n [string]$NumeUser1 = '', [string]$PrenumeUser1 = '', [string]$NumeUser2 = '', [string]$PrenumeUser2 = '',\n [string]$IdGrupUseri = '', [string]$IdUtilOp = '',\n\n # --- Pasul 0 (SELECT) optional -- doar daca se dau explicit parametrii de conexiune ---\n [string]$TnsAlias = 'ROA_CONPRESS',\n [string]$DbUser = '',\n [securestring]$DbPassword,\n [switch]$RunPas0,\n [string]$SqlplusPath = 'D:\\ROA\\instantclient_19_18\\sqlplus.exe',\n [string]$TnsAdmin = 'D:\\ROA\\instantclient_19_18'\n)\n\n$ErrorActionPreference = 'Stop'\n\nfunction Write-Utf8NoBom {\n # sqlplus se poticneste pe BOM (SP2-0734) chiar rulat cu @fisier - scrie fara BOM explicit\n param([string]$Path, [string[]]$Lines)\n [System.IO.File]::WriteAllText($Path, ($Lines -join \"`r`n\") + \"`r`n\", (New-Object Text.UTF8Encoding($false)))\n}\n\n$ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } else { Split-Path -Parent $MyInvocation.MyCommand.Path }\nif (-not $TemplateSql) { $TemplateSql = Join-Path $ScriptDir 'schita_deschidere_firma_conpress.sql' }\n\nfunction ConvertTo-DataRo {\n param([string]$s)\n if ([string]::IsNullOrWhiteSpace($s)) { return '' }\n foreach ($fmt in @('dd.MM.yyyy', 'dd-MM-yyyy', 'yyyy-MM-dd')) {\n $d = [datetime]::MinValue\n if ([datetime]::TryParseExact($s, $fmt, [Globalization.CultureInfo]::InvariantCulture, [Globalization.DateTimeStyles]::None, [ref]$d)) {\n return $d.ToString('dd.MM.yyyy')\n }\n }\n return $s\n}\n\nfunction Get-DateAnaf {\n param([string]$Cui, [datetime]$Data)\n $cuiNum = ($Cui -replace '[^0-9]', '')\n if ([string]::IsNullOrEmpty($cuiNum)) { throw \"CUI invalid: '$Cui'\" }\n $dataStr = $Data.ToString('yyyy-MM-dd')\n # JSON construit manual (payload trivial) - evita capcana ConvertTo-Json care despacheteaza\n # array-uri de un singur element cand trece prin pipeline.\n $body = '[{\"cui\":' + $cuiNum + ',\"data\":\"' + $dataStr + '\"}]'\n $url = 'https://webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva'\n # acelasi URL folosit de ANAF_CreeazaCerereANAF, COMUN\\programe\\validare.prg:1845\n # decodare explicita UTF-8 din raspuns (nu Invoke-RestMethod): serverul ANAF nu trimite\n # charset in Content-Type, PowerShell 5.1 ghiceste ISO-8859-1 si strica diacriticele -\n # acelasi motiv notat in validare.prg:1744 pentru clientul VFP.\n $req = [System.Net.WebRequest]::Create($url)\n $req.Method = 'POST'\n $req.ContentType = 'application/json; charset=utf-8'\n $bytesOut = [Text.Encoding]::UTF8.GetBytes($body)\n $req.ContentLength = $bytesOut.Length\n $reqStream = $req.GetRequestStream()\n $reqStream.Write($bytesOut, 0, $bytesOut.Length)\n $reqStream.Close()\n $webResp = $req.GetResponse()\n $reader = New-Object IO.StreamReader($webResp.GetResponseStream(), [Text.Encoding]::UTF8)\n $json = $reader.ReadToEnd()\n $reader.Close()\n $webResp.Close()\n return $json | ConvertFrom-Json\n}\n\nfunction Get-DetaliiAdresa {\n param([string]$Text)\n $r = [ordered]@{ Bloc = ''; Scara = ''; Apart = '' }\n if ([string]::IsNullOrWhiteSpace($Text)) { return $r }\n if ($Text -match '(?i)BL\\.?\\s*([A-Z0-9\\-]+)') { $r.Bloc = $Matches[1] }\n if ($Text -match '(?i)SC\\.?\\s*([A-Z0-9\\-]+)') { $r.Scara = $Matches[1] }\n if ($Text -match '(?i)AP\\.?\\s*([A-Z0-9\\-]+)') { $r.Apart = $Matches[1] }\n return $r\n # ponytail: heuristica regex pe text liber ANAF (bl./sc./ap.), nu un parser de adrese complet;\n # de verificat manual daca formatul sediului difera (ex. \"et.\" lipsa, abrevieri neuzuale).\n}\n\n# ---------------------------------------------------------------------------\n# 1. Interogare ANAF\n# ---------------------------------------------------------------------------\nWrite-Host \"Interogare ANAF pentru CUI $Cui (data verificare $($DataVerificare.ToString('yyyy-MM-dd')))...\"\n$resp = Get-DateAnaf -Cui $Cui -Data $DataVerificare\n\nif (-not $resp.found -or $resp.found.Count -eq 0) {\n Write-Warning \"ANAF nu a gasit CUI $Cui (cod=$($resp.cod), message=$($resp.message)). Nu se genereaza fisierul .sql.\"\n if ($resp.notFound) { Write-Warning \"notFound: $($resp.notFound -join ', ')\" }\n return\n}\n\n$item = $resp.found[0]\n$dg = $item.date_generale\n$adr = $item.adresa_sediu_social\n$tva = $item.inregistrare_scop_Tva\n\n # data_inregistrare (yyyy-MM-dd) e campul structurat; stare_inregistrare (text liber cu\n # data in dd.mm.yyyy) e fallback daca lipseste.\n$dataInregRaw = if ($dg.data_inregistrare) { [string]$dg.data_inregistrare }\n elseif ($dg.stare_inregistrare -match '(\\d{2}\\.\\d{2}\\.\\d{4})') { $Matches[1] }\n else { '' }\n # bl./sc./et./ap. NU sunt in adresa_sediu_social.sdetalii_Adresa (acolo apare doar\n # \"CAMERA n\") - sunt in date_generale.adresa, campul text liber complet.\n$detalii = Get-DetaliiAdresa -Text $dg.adresa\n\n$anaf = [ordered]@{\n p_firma = $dg.denumire\n p_reg_comert = $dg.nrRegCom\n p_caen = if ($dg.cod_CAEN) { [string]$dg.cod_CAEN } else { '' }\n p_data_inreg = ConvertTo-DataRo $dataInregRaw\n p_telefon = $dg.telefon\n p_judet = $adr.sdenumire_Judet\n p_localitate = $adr.sdenumire_Localitate\n p_strada = $adr.sdenumire_Strada\n p_numar = $adr.snumar_Strada\n p_cod_postal = $adr.scod_Postal\n p_bloc = $detalii.Bloc\n p_scara = $detalii.Scara\n p_apart = $detalii.Apart\n}\n$persoanaJuridica = if ($dg.forma_organizare -match '(?i)persoana\\s*juridica') { 'D' } else { '' }\n\n# ---------------------------------------------------------------------------\n# 2. Restul parametrilor - din argumentele scriptului (ANAF nu le are)\n# ---------------------------------------------------------------------------\n$params = [ordered]@{\n p_firma = @{ v = $anaf.p_firma; src = 'ANAF' }\n p_antet = @{ v = if ($Antet) { $Antet } else { $anaf.p_firma }; src = if ($Antet) { 'PARAM' } else { 'ANAF (= denumire)' } }\n p_cod_fiscal = @{ v = ($Cui -replace '[^0-9]', ''); src = 'PARAM (-Cui)' }\n p_reg_comert = @{ v = $anaf.p_reg_comert; src = 'ANAF' }\n p_caen = @{ v = $anaf.p_caen; src = 'ANAF' }\n p_data_inreg = @{ v = $anaf.p_data_inreg; src = 'ANAF (date_generale.data_inregistrare)' }\n\n p_judet = @{ v = $anaf.p_judet; src = 'ANAF' }\n p_localitate = @{ v = $anaf.p_localitate; src = 'ANAF' }\n p_strada = @{ v = $anaf.p_strada; src = 'ANAF' }\n p_numar = @{ v = $anaf.p_numar; src = 'ANAF' }\n p_bloc = @{ v = $anaf.p_bloc; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }\n p_scara = @{ v = $anaf.p_scara; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }\n p_apart = @{ v = $anaf.p_apart; src = 'ANAF (heuristica text liber, DE VERIFICAT)' }\n p_cod_postal = @{ v = $anaf.p_cod_postal; src = 'ANAF' }\n\n p_banca1 = @{ v = $Banca1; src = if ($Banca1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }\n p_contb1 = @{ v = $Contb1; src = if ($Contb1) { 'PARAM' } else { 'DE COMPLETAT (ANAF nu da IBAN)' } }\n p_persoana_juridica = @{ v = $persoanaJuridica; src = 'ANAF (forma_organizare)' }\n p_codang = @{ v = $Codang; src = if ($Codang) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_nume = @{ v = $Nume; src = if ($Nume) { 'PARAM' } else { 'DE COMPLETAT (reprezentant legal)' } }\n p_prenume = @{ v = $Prenume; src = if ($Prenume) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_telefon = @{ v = $anaf.p_telefon; src = 'ANAF' }\n p_telefon2 = @{ v = $Telefon2; src = if ($Telefon2) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_telefon3 = @{ v = $Telefon3; src = if ($Telefon3) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_fax = @{ v = $Fax; src = if ($Fax) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_email = @{ v = $Email; src = if ($Email) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_oasp = @{ v = $Oasp; src = if ($Oasp) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_capital_soc_var = @{ v = $CapitalSocVar; src = if ($CapitalSocVar) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_capital_soc_sub = @{ v = $CapitalSocSub; src = if ($CapitalSocSub) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_punct_luc = @{ v = $PunctLuc; src = if ($PunctLuc) { 'PARAM' } else { 'gol (fara punct de lucru declarat)' } }\n p_schema = @{ v = if ($Schema) { $Schema } else { $Cui }; src = if ($Schema) { 'PARAM' } else { 'DE CONFIRMAT (implicit = CUI, corecteaza cu -Schema)' } }\n p_id_mama = @{ v = $IdMama; src = 'PARAM (implicit 0 = firma simpla)' }\n p_e_mama = @{ v = $EMama; src = if ($EMama) { 'PARAM' } else { 'gol (relevant doar daca p_id_mama <> 0)' } }\n p_id_loc = @{ v = $IdLoc; src = if ($IdLoc) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_id_util = @{ v = $IdUtil; src = if ($IdUtil) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_id_forma_juridica = @{ v = $IdFormaJuridica; src = if ($IdFormaJuridica) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_id_forma_organizare = @{ v = $IdFormaOrganizare; src = if ($IdFormaOrganizare) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_id_forma_prop = @{ v = $IdFormaProp; src = if ($IdFormaProp) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_id_tip_soc = @{ v = $IdTipSoc; src = if ($IdTipSoc) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_indicativ = @{ v = $Indicativ; src = if ($Indicativ) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_declarant = @{ v = $Declarant; src = if ($Declarant) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_functie = @{ v = $Functie; src = if ($Functie) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_indice_itm = @{ v = $IndiceItm; src = if ($IndiceItm) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_tip_modificare = @{ v = $TipModificare; src = if ($TipModificare) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_cod_firma = @{ v = $CodFirma; src = if ($CodFirma) { 'PARAM' } else { 'DE COMPLETAT' } }\n\n p_luna_start = @{ v = [string]$LunaStart; src = 'PARAM (implicit 5)' }\n p_an_start = @{ v = [string]$AnStart; src = 'PARAM (implicit 2026)' }\n\n p_nume_user1 = @{ v = $NumeUser1; src = if ($NumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_prenume_user1 = @{ v = $PrenumeUser1; src = if ($PrenumeUser1) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_nume_user2 = @{ v = $NumeUser2; src = if ($NumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_prenume_user2 = @{ v = $PrenumeUser2; src = if ($PrenumeUser2) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_id_grup_useri = @{ v = $IdGrupUseri; src = if ($IdGrupUseri) { 'PARAM' } else { 'DE COMPLETAT' } }\n p_id_utilop = @{ v = $IdUtilOp; src = if ($IdUtilOp) { 'PARAM' } else { 'DE COMPLETAT' } }\n}\n\n# adresa compusa, ca in sablon\n$params['p_adresa'] = @{\n v = '&p_strada. nr. &p_numar., bl. &p_bloc., sc. &p_scara., et. Parter, ap. &p_apart.'\n src = 'derivat (sablon sqlplus, substituit din campurile de mai sus)'\n}\n\n# ---------------------------------------------------------------------------\n# 3. Genereaza blocul DEFINE si scrie fisierul .sql (Pas 0-4 din sablon, neschimbate)\n# ---------------------------------------------------------------------------\nif (-not (Test-Path -LiteralPath $TemplateSql)) { throw \"Sablon lipsa: $TemplateSql\" }\n$templateLines = Get-Content -LiteralPath $TemplateSql -Encoding UTF8\n\n$startIdx = ($templateLines | Select-String -Pattern '^DEFINE p_firma\\s*=').LineNumber\n$endIdx = ($templateLines | Select-String -Pattern '^DEFINE p_id_utilop\\s*=').LineNumber\nif (-not $startIdx -or -not $endIdx) { throw \"Sablonul '$TemplateSql' nu are markerii asteptati (DEFINE p_firma / DEFINE p_id_utilop) - format schimbat?\" }\n$startIdx = $startIdx[0] - 1\n$endIdx = $endIdx[0] - 1\n\n$before = $templateLines[0..($startIdx - 1)]\n$after = $templateLines[($endIdx + 1)..($templateLines.Count - 1)]\n\n$newBlock = New-Object System.Collections.Generic.List[string]\n$newBlock.Add('-- ============================================================================')\n$newBlock.Add(\"-- PARAMETRI GENERATI AUTOMAT de deschide_firma_conpress.ps1\")\n$newBlock.Add(\"-- Rulat: $(Get-Date -Format 'dd.MM.yyyy HH:mm') -- CUI interogat: $Cui -- data verificare ANAF: $($DataVerificare.ToString('dd.MM.yyyy'))\")\n$newBlock.Add(\"-- Sursa adresa/denumire/CAEN/data inregistrare: ANAF (webservicesp.anaf.ro/api/PlatitorTvaRest/v9/tva),\")\n$newBlock.Add(\"-- NU certificatul ONRC -- ANAF e sursa de adevar (posibil OCR gresit pe certificat).\")\n$newBlock.Add(\"-- Fiecare linie e adnotata cu sursa valorii: ANAF / PARAM (dat la rulare) / DE COMPLETAT.\")\n$newBlock.Add('-- ============================================================================')\n$newBlock.Add('')\nforeach ($key in $params.Keys) {\n $entry = $params[$key]\n $val = [string]$entry.v\n $line = \"DEFINE $key\".PadRight(30) + \"= '$val' -- $($entry.src)\"\n $newBlock.Add($line)\n}\n$newBlock.Add('')\n\nif (-not $OutSql) {\n $OutSql = Join-Path (Split-Path -Path $TemplateSql -Parent) \"deschidere_firma_$($Cui)_$(Get-Date -Format 'yyyyMMdd_HHmmss').sql\"\n}\n$outLines = $before + $newBlock + $after\nWrite-Utf8NoBom -Path $OutSql -Lines $outLines\nWrite-Host \"Fisier generat: $OutSql\"\n\n# ---------------------------------------------------------------------------\n# 4. Rezumat consola: ce a venit din ANAF vs ce a ramas gol\n# ---------------------------------------------------------------------------\nWrite-Host ''\nWrite-Host '=== Rezumat campuri ==='\nforeach ($key in $params.Keys) {\n $entry = $params[$key]\n $shown = if ([string]::IsNullOrWhiteSpace([string]$entry.v)) { '(gol)' } else { $entry.v }\n Write-Host (\"{0,-24} {1,-45} [{2}]\" -f $key, $shown, $entry.src)\n}\n\n# ---------------------------------------------------------------------------\n# 5. Pasul 0 (SELECT) optional -- doar daca s-au dat explicit parametrii de conexiune\n# ---------------------------------------------------------------------------\nif ($RunPas0) {\n if (-not $DbUser -or -not $DbPassword) {\n Write-Warning \"RunPas0 cerut dar lipsesc -DbUser/-DbPassword. Tunelul/conexiunea raman responsabilitatea lui Marius -- se sare peste Pasul 0.\"\n }\n elseif (-not (Test-Path -LiteralPath $SqlplusPath)) {\n Write-Warning \"sqlplus nu a fost gasit la '$SqlplusPath'. Se sare peste Pasul 0.\"\n }\n else {\n $pas0Start = ($after | Select-String -Pattern '^-- PAS 0 ').LineNumber\n $pas0End = ($after | Select-String -Pattern '^-- PAS 1 ').LineNumber\n if (-not $pas0Start -or -not $pas0End) {\n Write-Warning \"Nu s-a gasit sectiunea PAS 0 in sablon. Se sare peste.\"\n }\n else {\n $pas0Lines = $after[($pas0Start[0] - 1)..($pas0End[0] - 2)]\n $tmpSql = [System.IO.Path]::GetTempFileName() -replace '\\.tmp$', '.sql'\n Write-Utf8NoBom -Path $tmpSql -Lines ($newBlock + $pas0Lines)\n $bstr = [Runtime.InteropServices.Marshal]::SecureStringToBSTR($DbPassword)\n try {\n $plainPwd = [Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)\n $env:TNS_ADMIN = $TnsAdmin\n & $SqlplusPath -S -L \"$DbUser/$plainPwd@$TnsAlias\" \"@$tmpSql\"\n } finally {\n [Runtime.InteropServices.Marshal]::ZeroFreeBSTR($bstr)\n $plainPwd = $null\n Remove-Item -LiteralPath $tmpSql -ErrorAction SilentlyContinue\n }\n }\n }\n}","lineStart":1,"lineEnd":309,"totalLines":309,"truncated":false}},"title":"C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\deschide_firma_conpress.ps1","time":{"start":1789550003265,"end":1789550003865}},"id":"prt_0a97e0368001ZCi3uwh3GYEf03","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97df014001gSUlcHj9aZimH0"}} +{"type":"tool_use","timestamp":1789550003920,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"read","callID":"call_03_u9PigakkFsf0RnpYw0B89779","state":{"status":"completed","input":{"filePath":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conexiuni-tunel-ssh-odbc.md"},"output":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conexiuni-tunel-ssh-odbc.md\nfile\n\n1: # Conexiuni la bazele de productie: tunel SSH (Bitvise) + ODBC/TNS\n2: \n3: Cum se ajunge, de pe statia de lucru, la un Oracle care nu e expus direct in internet. Valabil\n4: pentru toate proiectele ROA. Scopul documentului: sa nu se mai piarda o sesiune intreaga\n5: redescoperind lantul.\n6: \n7: > **Fara credentiale in git.** Acest fisier NU contine parole, si nici un fisier din repo nu\n8: > trebuie sa contina. Parolele stau in profilul Bitvise (criptate cu DPAPI, legate de contul\n9: > Windows) si in capul celui care lucreaza. Daca ai nevoie de o parola pe care nu o ai, cere-o -\n10: > nu o cauta prin fisiere si **nu o ghici**: Oracle poate avea `FAILED_LOGIN_ATTEMPTS` in profil,\n11: > iar cateva incercari gresite blocheaza contul de schema in PRODUCTIE.\n12: \n13: ## Lantul, pe scurt\n14: \n15: ```\n16: statie -> [tunel SSH Bitvise] -> 127.0.0.1:1521 -> Oracle de pe serverul de productie\n17: ^\n18: aliasul TNS din instantclient\\tnsnames.ora arata AICI\n19: ^\n20: DSN-ul ODBC cu acelasi nume e ce primeste goConn.Connect()\n21: ```\n22: \n23: Trei nume trebuie sa se potriveasca, si e usor de ratat: **profilul Bitvise** (ce port local\n24: deschide), **aliasul TNS** (ce host:port foloseste) si **DSN-ul ODBC** (ce alias TNS foloseste).\n25: \n26: ## 1. Tunelul SSH\n27: \n28: Profilele Bitvise (`.tlp`) stau in `D:\\GoogleDrive\\` (ex. `vending.tlp`). Un profil contine\n29: gazda, portul, utilizatorul, parola criptata, cheile de gazda deja acceptate si **regulile de\n30: port forwarding** - de obicei `127.0.0.1:1521 -> localhost:1521`.\n31: \n32: Ridicare din linie de comanda, fara interfata grafica:\n33: \n34: ```powershell\n35: $exe = 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe'\n36: Start-Process $exe -ArgumentList '-profile=D:\\GoogleDrive\\vending.tlp' -WindowStyle Hidden `\n37: -RedirectStandardOutput \"$env:TEMP\\stnlc_out.txt\" -RedirectStandardError \"$env:TEMP\\stnlc_err.txt\"\n38: ```\n39: \n40: `stnlc` foloseste singur parola stocata in profil - **nu o trece pe linia de comanda**, ar ajunge\n41: in istoricul shell-ului. Ruleaza sub acelasi cont Windows sub care a fost salvat profilul,altfel\n42: DPAPI nu poate decripta parola.\n43: \n44: Verificare ca tunelul chiar e sus (nu te baza pe faptul ca procesul traieste):\n45: \n46: ```powershell\n47: (Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded\n48: ```\n49: \n50: In `stnlc_out.txt` linia care conteaza e `Added client-to-server forwarding rule on\n51: 127.0.0.1:1521 to localhost:1521.` Inchidere: opreste procesul `stnlc`.\n52: \n53: **Capcana**: un singur port local 1521 pentru mai multe destinatii. Daca ai deja un tunel ridicat\n54: catre alt client, al doilea nu mai poate lega portul si vei interoga **alta baza** fara sa-ti dai\n55: seama. Verifica intotdeauna cu ce te-ai conectat (vezi pasul 4).\n56: \n57: **Capcana inrudita**: interfata grafica `BvSsh.exe` poate tine portul 1521 legat pe `0.0.0.0` cu o\n58: sesiune moarta - `sqlplus` raspunde atunci `ORA-12541: TNS:no listener`, desi \"tunelul pare sus\".\n59: `stnlc` isi poate lega totusi propria regula pe `127.0.0.1:1521` peste ea si merge. Nu te lua dupa\n60: `netstat`: proba reala e interogarea din pasul 4.\n61: \n62: ## 2. Aliasul TNS\n63: \n64: `D:\\ROA\\instantclient_19_18\\tnsnames.ora` (si `instantclient_11_2_0_2` pentru driverul ODBC pe\n65: 32 de biti). Aliasurile care merg prin tunel arata spre `127.0.0.1`:\n66: \n67: ```\n68: VENDING =\n69: (DESCRIPTION =\n70: (ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521)))\n71: (CONNECT_DATA = (SERVICE_NAME = XEPDB1))\n72: )\n73: ```\n74: \n75: Pentru `sqlplus` trebuie `TNS_ADMIN` setat pe folderul care contine `tnsnames.ora`:\n76: \n77: ```powershell\n78: $env:TNS_ADMIN = 'D:\\ROA\\instantclient_19_18'\n79: ```\n80: \n81: ## 3. DSN-ul ODBC\n82: \n83: Aplicatia nu foloseste TNS direct: `oConn.Connect(tcHost, tcUser, tcPassword)`\n84: (`oproceduri_comune.prg`) construieste `dsn=;Uid=...;Pwd=...` - deci **`tcHost` e un nume\n85: de DSN ODBC**, nu un host si nu un alias TNS. DSN-urile sunt pe 32 de biti (VFP e pe 32 de biti),\n86: deci in `HKLM\\SOFTWARE\\WOW6432Node\\ODBC\\ODBC.INI`, cu driverul din `instantclient_11_2_0_2`.\n87: \n88: Listare rapida:\n89: \n90: ```powershell\n91: Get-ChildItem 'HKLM:\\SOFTWARE\\WOW6432Node\\ODBC\\ODBC.INI' |\n92: Select-Object -ExpandProperty PSChildName\n93: ```\n94: \n95: De obicei DSN-ul are acelasi nume cu aliasul TNS (`VENDING`, `CENTRAL`, `ROA_CENTRAL`...).\n96: Administrare vizuala: `C:\\Windows\\SysWOW64\\odbcad32.exe` (**nu** cel din `System32`, acela e pe\n97: 64 de biti si nu vede DSN-urile VFP).\n98: \n99: ## 4. Interogare si verificare\n100: \n101: ```powershell\n102: $env:TNS_ADMIN = 'D:\\ROA\\instantclient_19_18'\n103: & 'D:\\ROA\\instantclient_19_18\\sqlplus.exe' -S -L '/@VENDING' '@script.sql'\n104: ```\n105: \n106: `-L` = o singura incercare de login (nu reincearca la parola gresita). **Foloseste-l intotdeauna\n107: pe productie.**\n108: \n109: Prima interogare, mereu, ca sa stii unde ai nimerit:\n110: \n111: ```sql\n112: select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;\n113: ```\n114: \n115: Pentru extragere in fisier, `spool` scrie **local**, nu pe server:\n116: \n117: ```sql\n118: set pagesize 0 feedback off heading off linesize 100 trimspool on termout off\n119: spool D:\\cale\\locala\\iesire.txt\n120: select ...;\n121: spool off\n122: ```\n123: \n124: **Capcana PowerShell**: intr-un here-string cu ghilimele duble (`@\"...\"@`) PowerShell expandeaza\n125: `$`. Un regex Oracle care se termina cu `$` (ancora de sfarsit) ajunge stricat in fisierul `.sql`\n126: si interogarea intoarce 0 randuri **fara nicio eroare**. Foloseste here-string cu apostrof\n127: (`@'...'@`) si inlocuieste caile printr-un token.\n128: \n129: **Capcana `termout off`**: ascunde si mesajele de eroare. Daca fisierul spool iese gol, ruleaza\n130: din nou fara `termout off` inainte sa banuiesti datele.\n131: \n132: ## Schemele cunoscute (fara parole)\n133: \n134: | Tunel / profil | Alias TNS + DSN | Schema Oracle |\n135: |---|---|---|\n136: | `vending.tlp` | `VENDING` | **`VENDING`** (parola standard ROA) |\n137: | conpress | `ROA_CONPRESS` | `xenoti` |\n138: \n139: Profilele Bitvise sunt in **`D:\\roa\\BITVISE\\`** pe statia curenta (`vending.tlp`, `conpress.tlp`,\n140: `clever.tlp`, `automotive.tlp`, `avis.tlp`, `eduard.tlp`, `ems.tlp`, `romfast.tlp`, `sigma.tlp`,\n141: `vadeco.tlp`) - nu in `D:\\GoogleDrive\\`. Clientul Oracle prezent e `instantclient_11_2_0_2`\n142: (`TNS_ADMIN` se seteaza pe el). `VENDING` este Oracle 18c XE, serviciu `XEPDB1`.\n143: \n144: Masuratoare read-only rulata pe `VENDING` la 03.09.2026: `ROACONT\\docs\\cercetare\\piata_ai_2026_09\\`\n145: (`BACKTEST_VENDING.md` plus scripturile din `sql\\bt_*.sql`).\n146: \n147: Restul aliasurilor din `tnsnames.ora` (`ROA_CENTRAL`, `CENTRAL105`, `ROA_TEST`, ...) sunt retea\n148: interna si nu au nevoie de tunel.\n149: \n150: ## Reguli pe productie\n151: \n152: 1. **Doar `SELECT`.** Fara `INSERT`/`UPDATE`/`DELETE`/DDL, fara `ALTER SESSION` care schimba\n153: comportament persistent. Daca ai nevoie de date de lucru, extrage-le si lucreaza local.\n154: 2. **Fara ghicit parole** - vezi avertismentul de la inceput.\n155: 3. **Interogari marginite**: `fetch first N rows only`, si evita scanarile complete pe tabele\n156: mari in orele de lucru.\n157: 4. **Inchide tunelul** cand ai terminat; nu-l lasa deschis peste noapte.\n158: 5. **Datele extrase**: codurile fiscale sunt publice si pot sta in repo (vezi\n159: `utile\\Teste\\cache_anaf\\codes_*_reale.txt`). Denumirile de parteneri, adresele, soldurile\n160: **nu** - nu le comite.\n161: \n162: ## De unde vin loturile de coduri fiscale pentru teste\n163: \n164: `COMUN\\utile\\Teste\\cache_anaf\\codes_1000_reale.txt` a fost extras din productia `vending`, tabela\n165: `nom_parteneri` (23932 randuri, 6382 coduri romanesti distincte):\n166: \n167: ```sql\n168: select cif from (\n169: select distinct regexp_replace(upper(trim(cod_fiscal)), '[^0-9]', '') as cif\n170: from nom_parteneri\n171: where cod_fiscal is not null\n172: and regexp_like(upper(trim(cod_fiscal)), '^(RO)?[[:space:]]*[0-9]{2,10}$')\n173: ) where length(cif) between 2 and 10\n174: order by ora_hash(cif)\n175: fetch first 1000 rows only;\n176: ```\n177: \n178: `order by ora_hash(cif)` da o dispersie **deterministica** (aceeasi de fiecare data), spre\n179: deosebire de `dbms_random`; ordonarea crescuta dupa cod ar fi inclinat lotul spre firme vechi,\n180: deci spre Bucuresti. Suprapunere cu lotul mai vechi de 200: 8 coduri.\n181: \n182: Folosire in proba end-to-end ANAF:\n183: \n184: ```powershell\n185: $env:E2E_CODURI = 'D:\\ROA\\ROADEF\\COMUN\\utile\\Teste\\cache_anaf\\codes_1000_reale.txt'\n186: $env:E2E_LIMITA = '1000'\n187: ```\n\n(End of file - total 187 lines)\n","metadata":{"preview":"# Conexiuni la bazele de productie: tunel SSH (Bitvise) + ODBC/TNS\n\nCum se ajunge, de pe statia de lucru, la un Oracle care nu e expus direct in internet. Valabil\npentru toate proiectele ROA. Scopul documentului: sa nu se mai piarda o sesiune intreaga\nredescoperind lantul.\n\n> **Fara credentiale in git.** Acest fisier NU contine parole, si nici un fisier din repo nu\n> trebuie sa contina. Parolele stau in profilul Bitvise (criptate cu DPAPI, legate de contul\n> Windows) si in capul celui care lucreaza. Daca ai nevoie de o parola pe care nu o ai, cere-o -\n> nu o cauta prin fisiere si **nu o ghici**: Oracle poate avea `FAILED_LOGIN_ATTEMPTS` in profil,\n> iar cateva incercari gresite blocheaza contul de schema in PRODUCTIE.\n\n## Lantul, pe scurt\n\n```\nstatie -> [tunel SSH Bitvise] -> 127.0.0.1:1521 -> Oracle de pe serverul de productie\n ^\n aliasul TNS din instantclient\\tnsnames.ora arata AICI\n ^\n DSN-ul ODBC cu acelasi nume e ce primeste goConn.Connect()","truncated":false,"loaded":[],"display":{"type":"file","path":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conexiuni-tunel-ssh-odbc.md","text":"# Conexiuni la bazele de productie: tunel SSH (Bitvise) + ODBC/TNS\n\nCum se ajunge, de pe statia de lucru, la un Oracle care nu e expus direct in internet. Valabil\npentru toate proiectele ROA. Scopul documentului: sa nu se mai piarda o sesiune intreaga\nredescoperind lantul.\n\n> **Fara credentiale in git.** Acest fisier NU contine parole, si nici un fisier din repo nu\n> trebuie sa contina. Parolele stau in profilul Bitvise (criptate cu DPAPI, legate de contul\n> Windows) si in capul celui care lucreaza. Daca ai nevoie de o parola pe care nu o ai, cere-o -\n> nu o cauta prin fisiere si **nu o ghici**: Oracle poate avea `FAILED_LOGIN_ATTEMPTS` in profil,\n> iar cateva incercari gresite blocheaza contul de schema in PRODUCTIE.\n\n## Lantul, pe scurt\n\n```\nstatie -> [tunel SSH Bitvise] -> 127.0.0.1:1521 -> Oracle de pe serverul de productie\n ^\n aliasul TNS din instantclient\\tnsnames.ora arata AICI\n ^\n DSN-ul ODBC cu acelasi nume e ce primeste goConn.Connect()\n```\n\nTrei nume trebuie sa se potriveasca, si e usor de ratat: **profilul Bitvise** (ce port local\ndeschide), **aliasul TNS** (ce host:port foloseste) si **DSN-ul ODBC** (ce alias TNS foloseste).\n\n## 1. Tunelul SSH\n\nProfilele Bitvise (`.tlp`) stau in `D:\\GoogleDrive\\` (ex. `vending.tlp`). Un profil contine\ngazda, portul, utilizatorul, parola criptata, cheile de gazda deja acceptate si **regulile de\nport forwarding** - de obicei `127.0.0.1:1521 -> localhost:1521`.\n\nRidicare din linie de comanda, fara interfata grafica:\n\n```powershell\n$exe = 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe'\nStart-Process $exe -ArgumentList '-profile=D:\\GoogleDrive\\vending.tlp' -WindowStyle Hidden `\n -RedirectStandardOutput \"$env:TEMP\\stnlc_out.txt\" -RedirectStandardError \"$env:TEMP\\stnlc_err.txt\"\n```\n\n`stnlc` foloseste singur parola stocata in profil - **nu o trece pe linia de comanda**, ar ajunge\nin istoricul shell-ului. Ruleaza sub acelasi cont Windows sub care a fost salvat profilul,altfel\nDPAPI nu poate decripta parola.\n\nVerificare ca tunelul chiar e sus (nu te baza pe faptul ca procesul traieste):\n\n```powershell\n(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded\n```\n\nIn `stnlc_out.txt` linia care conteaza e `Added client-to-server forwarding rule on\n127.0.0.1:1521 to localhost:1521.` Inchidere: opreste procesul `stnlc`.\n\n**Capcana**: un singur port local 1521 pentru mai multe destinatii. Daca ai deja un tunel ridicat\ncatre alt client, al doilea nu mai poate lega portul si vei interoga **alta baza** fara sa-ti dai\nseama. Verifica intotdeauna cu ce te-ai conectat (vezi pasul 4).\n\n**Capcana inrudita**: interfata grafica `BvSsh.exe` poate tine portul 1521 legat pe `0.0.0.0` cu o\nsesiune moarta - `sqlplus` raspunde atunci `ORA-12541: TNS:no listener`, desi \"tunelul pare sus\".\n`stnlc` isi poate lega totusi propria regula pe `127.0.0.1:1521` peste ea si merge. Nu te lua dupa\n`netstat`: proba reala e interogarea din pasul 4.\n\n## 2. Aliasul TNS\n\n`D:\\ROA\\instantclient_19_18\\tnsnames.ora` (si `instantclient_11_2_0_2` pentru driverul ODBC pe\n32 de biti). Aliasurile care merg prin tunel arata spre `127.0.0.1`:\n\n```\nVENDING =\n (DESCRIPTION =\n (ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521)))\n (CONNECT_DATA = (SERVICE_NAME = XEPDB1))\n )\n```\n\nPentru `sqlplus` trebuie `TNS_ADMIN` setat pe folderul care contine `tnsnames.ora`:\n\n```powershell\n$env:TNS_ADMIN = 'D:\\ROA\\instantclient_19_18'\n```\n\n## 3. DSN-ul ODBC\n\nAplicatia nu foloseste TNS direct: `oConn.Connect(tcHost, tcUser, tcPassword)`\n(`oproceduri_comune.prg`) construieste `dsn=;Uid=...;Pwd=...` - deci **`tcHost` e un nume\nde DSN ODBC**, nu un host si nu un alias TNS. DSN-urile sunt pe 32 de biti (VFP e pe 32 de biti),\ndeci in `HKLM\\SOFTWARE\\WOW6432Node\\ODBC\\ODBC.INI`, cu driverul din `instantclient_11_2_0_2`.\n\nListare rapida:\n\n```powershell\nGet-ChildItem 'HKLM:\\SOFTWARE\\WOW6432Node\\ODBC\\ODBC.INI' |\n Select-Object -ExpandProperty PSChildName\n```\n\nDe obicei DSN-ul are acelasi nume cu aliasul TNS (`VENDING`, `CENTRAL`, `ROA_CENTRAL`...).\nAdministrare vizuala: `C:\\Windows\\SysWOW64\\odbcad32.exe` (**nu** cel din `System32`, acela e pe\n64 de biti si nu vede DSN-urile VFP).\n\n## 4. Interogare si verificare\n\n```powershell\n$env:TNS_ADMIN = 'D:\\ROA\\instantclient_19_18'\n& 'D:\\ROA\\instantclient_19_18\\sqlplus.exe' -S -L '/@VENDING' '@script.sql'\n```\n\n`-L` = o singura incercare de login (nu reincearca la parola gresita). **Foloseste-l intotdeauna\npe productie.**\n\nPrima interogare, mereu, ca sa stii unde ai nimerit:\n\n```sql\nselect user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;\n```\n\nPentru extragere in fisier, `spool` scrie **local**, nu pe server:\n\n```sql\nset pagesize 0 feedback off heading off linesize 100 trimspool on termout off\nspool D:\\cale\\locala\\iesire.txt\nselect ...;\nspool off\n```\n\n**Capcana PowerShell**: intr-un here-string cu ghilimele duble (`@\"...\"@`) PowerShell expandeaza\n`$`. Un regex Oracle care se termina cu `$` (ancora de sfarsit) ajunge stricat in fisierul `.sql`\nsi interogarea intoarce 0 randuri **fara nicio eroare**. Foloseste here-string cu apostrof\n(`@'...'@`) si inlocuieste caile printr-un token.\n\n**Capcana `termout off`**: ascunde si mesajele de eroare. Daca fisierul spool iese gol, ruleaza\ndin nou fara `termout off` inainte sa banuiesti datele.\n\n## Schemele cunoscute (fara parole)\n\n| Tunel / profil | Alias TNS + DSN | Schema Oracle |\n|---|---|---|\n| `vending.tlp` | `VENDING` | **`VENDING`** (parola standard ROA) |\n| conpress | `ROA_CONPRESS` | `xenoti` |\n\nProfilele Bitvise sunt in **`D:\\roa\\BITVISE\\`** pe statia curenta (`vending.tlp`, `conpress.tlp`,\n`clever.tlp`, `automotive.tlp`, `avis.tlp`, `eduard.tlp`, `ems.tlp`, `romfast.tlp`, `sigma.tlp`,\n`vadeco.tlp`) - nu in `D:\\GoogleDrive\\`. Clientul Oracle prezent e `instantclient_11_2_0_2`\n(`TNS_ADMIN` se seteaza pe el). `VENDING` este Oracle 18c XE, serviciu `XEPDB1`.\n\nMasuratoare read-only rulata pe `VENDING` la 03.09.2026: `ROACONT\\docs\\cercetare\\piata_ai_2026_09\\`\n(`BACKTEST_VENDING.md` plus scripturile din `sql\\bt_*.sql`).\n\nRestul aliasurilor din `tnsnames.ora` (`ROA_CENTRAL`, `CENTRAL105`, `ROA_TEST`, ...) sunt retea\ninterna si nu au nevoie de tunel.\n\n## Reguli pe productie\n\n1. **Doar `SELECT`.** Fara `INSERT`/`UPDATE`/`DELETE`/DDL, fara `ALTER SESSION` care schimba\n comportament persistent. Daca ai nevoie de date de lucru, extrage-le si lucreaza local.\n2. **Fara ghicit parole** - vezi avertismentul de la inceput.\n3. **Interogari marginite**: `fetch first N rows only`, si evita scanarile complete pe tabele\n mari in orele de lucru.\n4. **Inchide tunelul** cand ai terminat; nu-l lasa deschis peste noapte.\n5. **Datele extrase**: codurile fiscale sunt publice si pot sta in repo (vezi\n `utile\\Teste\\cache_anaf\\codes_*_reale.txt`). Denumirile de parteneri, adresele, soldurile\n **nu** - nu le comite.\n\n## De unde vin loturile de coduri fiscale pentru teste\n\n`COMUN\\utile\\Teste\\cache_anaf\\codes_1000_reale.txt` a fost extras din productia `vending`, tabela\n`nom_parteneri` (23932 randuri, 6382 coduri romanesti distincte):\n\n```sql\nselect cif from (\n select distinct regexp_replace(upper(trim(cod_fiscal)), '[^0-9]', '') as cif\n from nom_parteneri\n where cod_fiscal is not null\n and regexp_like(upper(trim(cod_fiscal)), '^(RO)?[[:space:]]*[0-9]{2,10}$')\n) where length(cif) between 2 and 10\norder by ora_hash(cif)\nfetch first 1000 rows only;\n```\n\n`order by ora_hash(cif)` da o dispersie **deterministica** (aceeasi de fiecare data), spre\ndeosebire de `dbms_random`; ordonarea crescuta dupa cod ar fi inclinat lotul spre firme vechi,\ndeci spre Bucuresti. Suprapunere cu lotul mai vechi de 200: 8 coduri.\n\nFolosire in proba end-to-end ANAF:\n\n```powershell\n$env:E2E_CODURI = 'D:\\ROA\\ROADEF\\COMUN\\utile\\Teste\\cache_anaf\\codes_1000_reale.txt'\n$env:E2E_LIMITA = '1000'\n```","lineStart":1,"lineEnd":187,"totalLines":187,"truncated":false}},"title":"COMUN\\docs\\conexiuni-tunel-ssh-odbc.md","time":{"start":1789550003446,"end":1789550003911}},"id":"prt_0a97e044d001b4bt8zHM4X04lt","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97df014001gSUlcHj9aZimH0"}} +{"type":"tool_use","timestamp":1789550003977,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"read","callID":"call_04_wfJebj4PTo3njIs95HWq5353","state":{"status":"completed","input":{"filePath":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conventie_mediu_oracle.md"},"output":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conventie_mediu_oracle.md\nfile\n\n1: # Conventii - mediul Oracle de dev/test\n2: \n3: Regula lui Marius, 20.08.2026. Se aplica **de fiecare data**, si sesiunii principale, si\n4: subagentilor. Nu e context, e conventie de lucru.\n5: \n6: ## 1. Nu se spune \"baza\"\n7: \n8: Termenul e vag si a produs deja o intrebare care n-ar fi trebuit sa existe: *\"ce este baza? care\n9: schema?\"*. Se scrie intotdeauna **schema + instanta**, explicit:\n10: \n11: > \"se ruleaza pe schema `MARIUSM_AUTO` de pe `ROA_CENTRAL`\"\n12: \n13: nu \"se ruleaza pe baza\". Acelasi lucru in rapoarte, in handoff-uri, in propuneri si in mesaje.\n14: \n15: ## 2. Pe dev/test se lucreaza NUMAI cu ROA_CENTRAL\n16: \n17: Instanta: **`ROA_CENTRAL`**. Schemele permise, singurele doua:\n18: \n19: | Schema | Ce este |\n20: |---|---|\n21: | **`MARIUSM_AUTO`** | schema **de firma** - datele si pachetele de business (`VANZARI`, `VANZARI_DETALII`, `JTVA_COLOANE`, `PACK_FACTURARE`...). Aici se lucreaza pe functionalitate. |\n22: | **`CONTAFIN_ORACLE`** | schema **comuna tuturor schemelor de firma**: pachete comune, actualizarea bazei de date, utilizatori, drepturi de utilizator, nomenclatorul de firme. Se creeaza **pe fiecare server**. |\n23: \n24: Nimic altceva. Daca o sarcina pare sa ceara altceva, se intreaba intai.\n25: \n26: Modelul de retinut: fiecare firma are schema ei (in dev/test, `MARIUSM_AUTO`), iar\n27: `CONTAFIN_ORACLE` sta alaturi, o singura data per server, si deserveste toate schemele de firma.\n28: Deci o modificare in `CONTAFIN_ORACLE` e **transversala peste toate firmele de pe acel server** -\n29: se trateaza cu grija corespunzatoare, nu ca o schimbare locala.\n30: \n31: ## 3. Schema `ACN` nu se foloseste si nu se citeaza\n32: \n33: Nu se interogheaza, nu se ia ca sursa de adevar, nu se pomeneste in rapoarte ca element de\n34: comparatie. Daca apare in rezultatul unei interogari pe `ALL_OBJECTS`/`ALL_SOURCE`, se **filtreaza\n35: din start**, nu se comenteaza.\n36: \n37: Consecinta practica pentru interogarile de dictionar: se pune **intotdeauna** filtrul de `owner`.\n38: Fara el, randurile mai multor scheme se intercaleaza si output-ul devine ilizibil - capcana deja\n39: platita o data la citirea unui corp de pachet din `ALL_SOURCE`.\n40: \n41: ```sql\n42: select text from all_source\n43: where owner = 'MARIUSM_AUTO' -- niciodata fara aceasta linie\n44: and name = 'PACK_FACTURARE'\n45: and type = 'PACKAGE BODY'\n46: order by line;\n47: ```\n48: \n49: ## 4. Conectare\n50: \n51: Client: `D:\\ROA\\instantclient_19_18\\sqlplus.exe` (`TNS_ADMIN` deja setat spre acelasi folder).\n52: Alias TNS: `ROA_CENTRAL` -> `10.0.20.121:1521`, `SERVICE_NAME=ROA` (`tnsnames.ora` din acelasi\n53: folder).\n54: \n55: ```\n56: & 'D:\\ROA\\instantclient_19_18\\sqlplus.exe' -L -S 'MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL' '@fisier.sql'\n57: ```\n58: \n59: Fisierul `.sql` se scrie in **ASCII**. SQL trimis prin pipe din PowerShell e spart de BOM\n60: (`SP2-0734: unknown command beginning \"...select...\"` - BOM UTF-16 sparge parserul).\n61: \n62: Parola nu e versionata in git - in `COMUN\\docs\\local\\oracle.md` (ignorat de git, exista in SVN).\n63: \n64: ## 5. Ce inseamna \"se ruleaza un script de pachet\"\n65: \n66: Scripturile din `D:\\ROA\\DATABASE\\SCRIPTURI_CLAR\\` **nu modifica date** - inlocuiesc **cod stocat in\n67: Oracle** (`CREATE OR REPLACE PACKAGE` + `PACKAGE BODY`). De retinut:\n68: \n69: - Efectul e **imediat si pentru toti cei conectati**. Nu seamana cu VFP, unde fiecare statie ruleaza\n70: propriul `.exe`.\n71: - Se recreeaza si **specificatia**, nu doar corpul - asta invalideaza obiectele dependente, care se\n72: recompileaza la prima folosire.\n73: - **Nu exista \"undo\".** Revenirea inseamna rularea unei versiuni anterioare a pachetului.\n74: - Scripturile sunt scrise **necalificat** (`CREATE OR REPLACE PACKAGE \"PACK_FACTURARE\"`, fara\n75: `CONNECT`, fara prefix de schema). Deci **se aplica schemei cu care esti conectat**, nu au tinta\n76: proprie. Schema tinta o decide exclusiv sirul de conectare.\n77: - Rularea unui script pe orice schema **se face doar la cererea explicita a lui Marius**. Un agent\n78: scrie scriptul; nu il aplica.\n79: \n80: ## 6. Stare constatata pe `ROA_CENTRAL`, 20.08.2026\n81: \n82: Reper istoric, constatat din ROAFACTURARE; de reconfirmat daca a trecut timp. Punctele 1-5\n83: sunt conventia propriu-zisa si se aplica in toate produsele ROA.\n84: \n85: ```\n86: DB_NAME: ROA server: 4e73d257c791 alias TNS: ROA_CENTRAL\n87: ```\n88: \n89: - `MARIUSM_AUTO` isi detine **propriile tabele** (`VANZARI_DETALII`, `JTVA_COLOANE` sunt TABLE in\n90: schema, nu sinonime catre alta schema). Deci cifrele obtinute conectat ca `MARIUSM_AUTO` sunt ale\n91: datelor din `MARIUSM_AUTO`.\n92: - `CONTAFIN_ORACLE` are 393 de obiecte si **nu** detine `VANZARI_DETALII`/`JTVA_COLOANE` - coerent\n93: cu rolul ei: infrastructura comuna (utilizatori, drepturi, firme, actualizare), nu date de firma.\n94: - `MARIUSM_AUTO.PACK_FACTURARE`: PACKAGE si PACKAGE BODY **VALID**, corpul modificat ultima data\n95: **20.08.2026 08:43** (aplicarea scriptului `ff_2026_08_20_01`, garda `FACT-025`).\n\n(End of file - total 95 lines)\n","metadata":{"preview":"# Conventii - mediul Oracle de dev/test\n\nRegula lui Marius, 20.08.2026. Se aplica **de fiecare data**, si sesiunii principale, si\nsubagentilor. Nu e context, e conventie de lucru.\n\n## 1. Nu se spune \"baza\"\n\nTermenul e vag si a produs deja o intrebare care n-ar fi trebuit sa existe: *\"ce este baza? care\nschema?\"*. Se scrie intotdeauna **schema + instanta**, explicit:\n\n> \"se ruleaza pe schema `MARIUSM_AUTO` de pe `ROA_CENTRAL`\"\n\nnu \"se ruleaza pe baza\". Acelasi lucru in rapoarte, in handoff-uri, in propuneri si in mesaje.\n\n## 2. Pe dev/test se lucreaza NUMAI cu ROA_CENTRAL\n\nInstanta: **`ROA_CENTRAL`**. Schemele permise, singurele doua:\n\n| Schema | Ce este |\n|---|---|","truncated":false,"loaded":[],"display":{"type":"file","path":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conventie_mediu_oracle.md","text":"# Conventii - mediul Oracle de dev/test\n\nRegula lui Marius, 20.08.2026. Se aplica **de fiecare data**, si sesiunii principale, si\nsubagentilor. Nu e context, e conventie de lucru.\n\n## 1. Nu se spune \"baza\"\n\nTermenul e vag si a produs deja o intrebare care n-ar fi trebuit sa existe: *\"ce este baza? care\nschema?\"*. Se scrie intotdeauna **schema + instanta**, explicit:\n\n> \"se ruleaza pe schema `MARIUSM_AUTO` de pe `ROA_CENTRAL`\"\n\nnu \"se ruleaza pe baza\". Acelasi lucru in rapoarte, in handoff-uri, in propuneri si in mesaje.\n\n## 2. Pe dev/test se lucreaza NUMAI cu ROA_CENTRAL\n\nInstanta: **`ROA_CENTRAL`**. Schemele permise, singurele doua:\n\n| Schema | Ce este |\n|---|---|\n| **`MARIUSM_AUTO`** | schema **de firma** - datele si pachetele de business (`VANZARI`, `VANZARI_DETALII`, `JTVA_COLOANE`, `PACK_FACTURARE`...). Aici se lucreaza pe functionalitate. |\n| **`CONTAFIN_ORACLE`** | schema **comuna tuturor schemelor de firma**: pachete comune, actualizarea bazei de date, utilizatori, drepturi de utilizator, nomenclatorul de firme. Se creeaza **pe fiecare server**. |\n\nNimic altceva. Daca o sarcina pare sa ceara altceva, se intreaba intai.\n\nModelul de retinut: fiecare firma are schema ei (in dev/test, `MARIUSM_AUTO`), iar\n`CONTAFIN_ORACLE` sta alaturi, o singura data per server, si deserveste toate schemele de firma.\nDeci o modificare in `CONTAFIN_ORACLE` e **transversala peste toate firmele de pe acel server** -\nse trateaza cu grija corespunzatoare, nu ca o schimbare locala.\n\n## 3. Schema `ACN` nu se foloseste si nu se citeaza\n\nNu se interogheaza, nu se ia ca sursa de adevar, nu se pomeneste in rapoarte ca element de\ncomparatie. Daca apare in rezultatul unei interogari pe `ALL_OBJECTS`/`ALL_SOURCE`, se **filtreaza\ndin start**, nu se comenteaza.\n\nConsecinta practica pentru interogarile de dictionar: se pune **intotdeauna** filtrul de `owner`.\nFara el, randurile mai multor scheme se intercaleaza si output-ul devine ilizibil - capcana deja\nplatita o data la citirea unui corp de pachet din `ALL_SOURCE`.\n\n```sql\nselect text from all_source\n where owner = 'MARIUSM_AUTO' -- niciodata fara aceasta linie\n and name = 'PACK_FACTURARE'\n and type = 'PACKAGE BODY'\n order by line;\n```\n\n## 4. Conectare\n\nClient: `D:\\ROA\\instantclient_19_18\\sqlplus.exe` (`TNS_ADMIN` deja setat spre acelasi folder).\nAlias TNS: `ROA_CENTRAL` -> `10.0.20.121:1521`, `SERVICE_NAME=ROA` (`tnsnames.ora` din acelasi\nfolder).\n\n```\n& 'D:\\ROA\\instantclient_19_18\\sqlplus.exe' -L -S 'MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL' '@fisier.sql'\n```\n\nFisierul `.sql` se scrie in **ASCII**. SQL trimis prin pipe din PowerShell e spart de BOM\n(`SP2-0734: unknown command beginning \"...select...\"` - BOM UTF-16 sparge parserul).\n\nParola nu e versionata in git - in `COMUN\\docs\\local\\oracle.md` (ignorat de git, exista in SVN).\n\n## 5. Ce inseamna \"se ruleaza un script de pachet\"\n\nScripturile din `D:\\ROA\\DATABASE\\SCRIPTURI_CLAR\\` **nu modifica date** - inlocuiesc **cod stocat in\nOracle** (`CREATE OR REPLACE PACKAGE` + `PACKAGE BODY`). De retinut:\n\n- Efectul e **imediat si pentru toti cei conectati**. Nu seamana cu VFP, unde fiecare statie ruleaza\n propriul `.exe`.\n- Se recreeaza si **specificatia**, nu doar corpul - asta invalideaza obiectele dependente, care se\n recompileaza la prima folosire.\n- **Nu exista \"undo\".** Revenirea inseamna rularea unei versiuni anterioare a pachetului.\n- Scripturile sunt scrise **necalificat** (`CREATE OR REPLACE PACKAGE \"PACK_FACTURARE\"`, fara\n `CONNECT`, fara prefix de schema). Deci **se aplica schemei cu care esti conectat**, nu au tinta\n proprie. Schema tinta o decide exclusiv sirul de conectare.\n- Rularea unui script pe orice schema **se face doar la cererea explicita a lui Marius**. Un agent\n scrie scriptul; nu il aplica.\n\n## 6. Stare constatata pe `ROA_CENTRAL`, 20.08.2026\n\nReper istoric, constatat din ROAFACTURARE; de reconfirmat daca a trecut timp. Punctele 1-5\nsunt conventia propriu-zisa si se aplica in toate produsele ROA.\n\n```\nDB_NAME: ROA server: 4e73d257c791 alias TNS: ROA_CENTRAL\n```\n\n- `MARIUSM_AUTO` isi detine **propriile tabele** (`VANZARI_DETALII`, `JTVA_COLOANE` sunt TABLE in\n schema, nu sinonime catre alta schema). Deci cifrele obtinute conectat ca `MARIUSM_AUTO` sunt ale\n datelor din `MARIUSM_AUTO`.\n- `CONTAFIN_ORACLE` are 393 de obiecte si **nu** detine `VANZARI_DETALII`/`JTVA_COLOANE` - coerent\n cu rolul ei: infrastructura comuna (utilizatori, drepturi, firme, actualizare), nu date de firma.\n- `MARIUSM_AUTO.PACK_FACTURARE`: PACKAGE si PACKAGE BODY **VALID**, corpul modificat ultima data\n **20.08.2026 08:43** (aplicarea scriptului `ff_2026_08_20_01`, garda `FACT-025`).","lineStart":1,"lineEnd":95,"totalLines":95,"truncated":false}},"title":"COMUN\\docs\\conventie_mediu_oracle.md","time":{"start":1789550003700,"end":1789550003969}},"id":"prt_0a97e04fd001w1a1wy87cCbEcl","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97df014001gSUlcHj9aZimH0"}} +{"type":"tool_use","timestamp":1789550004057,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"read","callID":"call_05_8pVmqNIK3snRtUYE9ax32485","state":{"status":"completed","input":{"filePath":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\local\\oracle.md"},"output":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\local\\oracle.md\nfile\n\n1: # Credențiale Oracle (NEVERSIONAT în git — `docs/local/` e în `.gitignore`; există doar în SVN)\n2: \n3: Partajat de toate aplicațiile ROA (`COMUN\\docs\\local\\`).\n4: \n5: - Conexiune dev: `MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL`\n6: - Alias `ROA_CENTRAL` → `10.0.20.121:1521`, `SERVICE_NAME=ROA` (`D:\\ROA\\instantclient_19_18\\tnsnames.ora`)\n7: - Client: `D:\\ROA\\instantclient_19_18\\sqlplus.exe`\n8: - Serverele de client (prin tunel SSH pe 1521, alias TNS pe `127.0.0.1`): utilizator\n9: `contafin_oracle`, **aceeași parolă ca la dev** — ex. `contafin_oracle/ROMFASTSOFT@ROA_SIGMA`.\n10: - Parola `SYS` este **generică**: `sys/romfastsoft@ as sysdba`.\n11: - Tunelul SSH se repornește cu `D:\\ROA\\ROASSH\\MyEnTunnel\\myentunnel.exe`.\n12: \n13: ## Tunel VENDING (producție) din linia de comandă\n14: \n15: Profilul Bitvise `D:\\GoogleDrive\\vending.tlp` conține gazda, utilizatorul și parola. Se pornește\n16: headless cu `stnlc.exe` (nu `BvSsh.exe`, care e GUI) și rămâne în execuție cât ține sesiunea:\n17: \n18: ```powershell\n19: & 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe' -profile=D:\\GoogleDrive\\vending.tlp -noRegistry=y\n20: ```\n21: \n22: Deschide `127.0.0.1:1521` (alias TNS `VENDING`, `SERVICE_NAME=XEPDB1`) și `127.0.0.1:8080`.\n23: Utilizator de citire: `contafin_oracle/ROMFASTSOFT@VENDING`; tabelele sunt în schema `VENDING`,\n24: deci se prefixează (`vending.vanzari`). **Strict read-only.**\n25: \n26: **Testele se fac pe bazele de test, nu prin tunel către producție**: `ROA_CENTRAL`,\n27: `ROA_CENTRAL2` (`SERVICE_NAME=ROA2`), `ROA_CENTRAL3` (`SERVICE_NAME=XEPDB1` pe 1522 — PDB, util\n28: pentru ramurile CDB). Tunelul spre un client se folosește doar când acel server e chiar subiectul\n29: investigației, și atunci strict read-only.\n30: \n31: Exemplu test rapid (SQL-ul într-un fișier ASCII, nu prin pipe — vezi `COMUN\\docs\\oracle_export.md`):\n32: \n33: ```powershell\n34: & 'D:\\ROA\\instantclient_19_18\\sqlplus.exe' -L -S 'MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL' '@test.sql'\n35: ```\n\n(End of file - total 35 lines)\n","metadata":{"preview":"# Credențiale Oracle (NEVERSIONAT în git — `docs/local/` e în `.gitignore`; există doar în SVN)\n\nPartajat de toate aplicațiile ROA (`COMUN\\docs\\local\\`).\n\n- Conexiune dev: `MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL`\n- Alias `ROA_CENTRAL` → `10.0.20.121:1521`, `SERVICE_NAME=ROA` (`D:\\ROA\\instantclient_19_18\\tnsnames.ora`)\n- Client: `D:\\ROA\\instantclient_19_18\\sqlplus.exe`\n- Serverele de client (prin tunel SSH pe 1521, alias TNS pe `127.0.0.1`): utilizator\n `contafin_oracle`, **aceeași parolă ca la dev** — ex. `contafin_oracle/ROMFASTSOFT@ROA_SIGMA`.\n- Parola `SYS` este **generică**: `sys/romfastsoft@ as sysdba`.\n- Tunelul SSH se repornește cu `D:\\ROA\\ROASSH\\MyEnTunnel\\myentunnel.exe`.\n\n## Tunel VENDING (producție) din linia de comandă\n\nProfilul Bitvise `D:\\GoogleDrive\\vending.tlp` conține gazda, utilizatorul și parola. Se pornește\nheadless cu `stnlc.exe` (nu `BvSsh.exe`, care e GUI) și rămâne în execuție cât ține sesiunea:\n\n```powershell\n& 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe' -profile=D:\\GoogleDrive\\vending.tlp -noRegistry=y\n```","truncated":false,"loaded":[],"display":{"type":"file","path":"D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\local\\oracle.md","text":"# Credențiale Oracle (NEVERSIONAT în git — `docs/local/` e în `.gitignore`; există doar în SVN)\n\nPartajat de toate aplicațiile ROA (`COMUN\\docs\\local\\`).\n\n- Conexiune dev: `MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL`\n- Alias `ROA_CENTRAL` → `10.0.20.121:1521`, `SERVICE_NAME=ROA` (`D:\\ROA\\instantclient_19_18\\tnsnames.ora`)\n- Client: `D:\\ROA\\instantclient_19_18\\sqlplus.exe`\n- Serverele de client (prin tunel SSH pe 1521, alias TNS pe `127.0.0.1`): utilizator\n `contafin_oracle`, **aceeași parolă ca la dev** — ex. `contafin_oracle/ROMFASTSOFT@ROA_SIGMA`.\n- Parola `SYS` este **generică**: `sys/romfastsoft@ as sysdba`.\n- Tunelul SSH se repornește cu `D:\\ROA\\ROASSH\\MyEnTunnel\\myentunnel.exe`.\n\n## Tunel VENDING (producție) din linia de comandă\n\nProfilul Bitvise `D:\\GoogleDrive\\vending.tlp` conține gazda, utilizatorul și parola. Se pornește\nheadless cu `stnlc.exe` (nu `BvSsh.exe`, care e GUI) și rămâne în execuție cât ține sesiunea:\n\n```powershell\n& 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe' -profile=D:\\GoogleDrive\\vending.tlp -noRegistry=y\n```\n\nDeschide `127.0.0.1:1521` (alias TNS `VENDING`, `SERVICE_NAME=XEPDB1`) și `127.0.0.1:8080`.\nUtilizator de citire: `contafin_oracle/ROMFASTSOFT@VENDING`; tabelele sunt în schema `VENDING`,\ndeci se prefixează (`vending.vanzari`). **Strict read-only.**\n\n**Testele se fac pe bazele de test, nu prin tunel către producție**: `ROA_CENTRAL`,\n`ROA_CENTRAL2` (`SERVICE_NAME=ROA2`), `ROA_CENTRAL3` (`SERVICE_NAME=XEPDB1` pe 1522 — PDB, util\npentru ramurile CDB). Tunelul spre un client se folosește doar când acel server e chiar subiectul\ninvestigației, și atunci strict read-only.\n\nExemplu test rapid (SQL-ul într-un fișier ASCII, nu prin pipe — vezi `COMUN\\docs\\oracle_export.md`):\n\n```powershell\n& 'D:\\ROA\\instantclient_19_18\\sqlplus.exe' -L -S 'MARIUSM_AUTO/ROMFASTSOFT@ROA_CENTRAL' '@test.sql'\n```","lineStart":1,"lineEnd":35,"totalLines":35,"truncated":false}},"title":"COMUN\\docs\\local\\oracle.md","time":{"start":1789550003799,"end":1789550004039}},"id":"prt_0a97e05fc001Bfkwnx9Yw1v87a","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97df014001gSUlcHj9aZimH0"}} +{"type":"step_finish","timestamp":1789550004556,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e0925001UxlSeb0PA1nTs9","reason":"tool-calls","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","messageID":"msg_0a97df014001gSUlcHj9aZimH0","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","type":"step-finish","tokens":{"total":25025,"input":24510,"output":408,"reasoning":107,"cache":{"write":0,"read":0}},"cost":0.0039855}} +{"type":"step_start","timestamp":1789550006549,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e1110001fDnJP0RnkxF5ga","messageID":"msg_0a97e0aab00144D33FQr04rEJy","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","type":"step-start"}} +{"type":"tool_use","timestamp":1789550010720,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"skill","callID":"call_00_Z8RHsnUjq0uBkzze7Hil0875","state":{"status":"completed","input":{"name":"roa-oracle-production-access"},"output":"\n# Skill: roa-oracle-production-access\n\n# Acces la productia Oracle: tunel SSH (Bitvise) + TNS + DSN ODBC\r\n\r\nScopul e sa NU se mai piarda o sesiune redescoperind lantul: executa pasii de mai jos, nu trimite utilizatorul in alta parte.\r\n\r\n## Cand se foloseste\r\n\r\n- \"conecteaza-te la productia clientului X\", \"intra pe Oracle la client\", \"deschide baza de productie\";\r\n- \"ridica tunelul SSH\", \"porneste tunelul Bitvise\", \"profilul vending.tlp / conpress.tlp\";\r\n- \"nu merge DSN-ul ODBC\", \"eroare `ORA-12541: TNS:no listener`\", \"sqlplus nu se conecteaza\";\r\n- \"verifica TNS\", \"unde e tnsnames.ora\", \"seteaza `TNS_ADMIN`\", \"SELECT pe productie\" (read-only).\r\n\r\nNu acopera: re-exportul sursei unui pachet PL/SQL si editarea de text VFP.\r\n\r\n## Pasi\r\n\r\n1. Fixeaza lantul. TREI nume trebuie sa se potriveasca, si e usor de ratat:\r\n - **profilul Bitvise** (`.tlp`) - ce port local deschide (de obicei `127.0.0.1:1521`);\r\n - **aliasul TNS** din `tnsnames.ora` - ce host:port foloseste (`127.0.0.1:1521`);\r\n - **DSN-ul ODBC** - ce alias TNS foloseste. `tcHost` din `oConn.Connect(tcHost, ...)`\r\n (`oproceduri_comune.prg`) e NUMELE DSN-ului, nu un host si nu un alias TNS.\r\n2. Profilele Bitvise sunt pe statia curenta in `D:\\roa\\BITVISE\\` (`vending.tlp`, `conpress.tlp`,\r\n `clever.tlp`, `automotive.tlp`, `avis.tlp`, `eduard.tlp`, `ems.tlp`, `romfast.tlp`, `sigma.tlp`, `vadeco.tlp`).\r\n3. Ridica tunelul fara interfata grafica:\r\n `& 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe' -profile=D:\\roa\\BITVISE\\vending.tlp`\r\n (sau `Start-Process ... -WindowStyle Hidden` cu redirect in `$env:TEMP\\stnlc_out.txt`).\r\n `stnlc` foloseste singur parola din profil: NU o pune pe linia de comanda si ruleaza sub\r\n acelasi cont Windows sub care a fost salvat profilul, altfel DPAPI nu poate decripta.\r\n4. Verifica tunelul inainte de orice altceva (nu te baza ca procesul traieste):\r\n `(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded`.\r\n5. Seteaza TNS: `$env:TNS_ADMIN = 'D:\\ROA\\instantclient_11_2_0_2'` pentru driverul ODBC pe 32 de\r\n biti, sau `instantclient_19_18` pentru `sqlplus`. Aliasul care merge prin tunel are\r\n `HOST = 127.0.0.1`, `PORT = 1521`.\r\n6. DSN: sunt pe 32 de biti, in `HKLM\\SOFTWARE\\WOW6432Node\\ODBC\\ODBC.INI`. Listeaza cu\r\n `Get-ChildItem 'HKLM:\\SOFTWARE\\WOW6432Node\\ODBC\\ODBC.INI' | Select-Object -ExpandProperty PSChildName`.\r\n Administrare vizuala: `C:\\Windows\\SysWOW64\\odbcad32.exe` (**NU** cel din `System32`).\r\n7. Interogheaza: `& 'D:\\ROA\\instantclient_19_18\\sqlplus.exe' -S -L '/@VENDING' '@script.sql'`.\r\n `-L` = o singura incercare de login. **Foloseste-l intotdeauna pe productie.**\r\n8. Prima interogare, mereu, ca sa stii unde ai nimerit:\r\n `select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;`\r\n9. La final inchide tunelul (opreste procesul `stnlc`); nu-l lasa deschis peste noapte.\r\n\r\n## Capcane\r\n\r\n- **Port local 1521 unic pentru mai multe destinatii**: daca ai deja un tunel catre alt client,\r\n al doilea nu mai poate lega portul si interoghezi **alta baza** fara sa-ti dai seama. Proba e\r\n pasul 8.\r\n- **`BvSsh.exe` (GUI)** poate tine portul 1521 legat pe `0.0.0.0` cu o sesiune moarta -> `sqlplus`\r\n da `ORA-12541: TNS:no listener`, desi \"tunelul pare sus\". `stnlc` isi poate lega totusi regula\r\n pe `127.0.0.1:1521` peste ea. Nu te lua dupa `netstat`: proba reala e interogarea.\r\n- **DSN-urile sunt pe 32 de biti** (VFP e pe 32 de biti) si stau in `WOW6432Node\\ODBC\\ODBC.INI`;\r\n `odbcad32.exe` din `System32` e pe 64 de biti si nu le vede.\r\n- **`$` in here-string** cu ghilimele duble (`@\"...\"@`): PowerShell expandeaza `$`, iar un regex\r\n Oracle care se termina cu ancora `$` ajunge stricat in `.sql` -> interogarea intoarce 0 randuri\r\n **fara nicio eroare**. Foloseste here-string cu apostrof (`@'...'@`).\r\n- **`termout off`** ascunde si mesajele de eroare: un spool gol nu inseamna date lipsa; ruleaza din\r\n nou fara `termout off` inainte sa banuiesti datele.\r\n- **Fara credentiale in git** si **fara ghicit parole**: `FAILED_LOGIN_ATTEMPTS` poate bloca\r\n schema in PRODUCTIE dupa cateva incercari gresite. Cere parola.\r\n- **Doar `SELECT`**: fara `INSERT`/`UPDATE`/`DELETE`/DDL, fara `ALTER SESSION` persistent;\r\n margineaza cu `fetch first N rows only`. Codurile fiscale publice pot sta in repo, denumirile de\r\n parteneri, adresele si soldurile NU.\r\n\r\n## Criterii de acceptare si dovada\r\n\r\nFara dovezile da/nu de mai jos, conexiunea NU se raporteaza ca functionala. \"S-a conectat\" nu e dovada.\r\n\r\n1. `(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded` -> `True`.\r\n2. In `%TEMP%\\stnlc_out.txt` apare `Added client-to-server forwarding rule on 127.0.0.1:1521 to localhost:1521.`\r\n3. `sqlplus -S -L` chiar intoarce randuri din\r\n `select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;` -> schema si baza asteptate.\r\n4. DSN-ul rezolva la host:port corect: numele e prezent in `WOW6432Node\\ODBC\\ODBC.INI`, iar\r\n aliasul TNS folosit de el arata spre `127.0.0.1:1521`.\r\n5. Tunelul e inchis la final (procesul `stnlc` oprit).\r\n\r\n## Scripturi\r\n\r\n- `C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe` - tunel din linie de comanda.\r\n- `C:\\Program Files (x86)\\Bitvise SSH Client\\BvSsh.exe` - GUI (sursa capcanei de port).\r\n- `D:\\ROA\\instantclient_19_18\\sqlplus.exe` - interogare read-only.\r\n- `D:\\ROA\\instantclient_11_2_0_2\\` - clientul pentru driverul ODBC pe 32 de biti (`TNS_ADMIN`).\r\n- `C:\\Windows\\SysWOW64\\odbcad32.exe` - administrarea DSN-urilor pe 32 de biti.\r\n- `Test-NetConnection` (PowerShell) - proba ca tunelul e sus.\r\n\r\n## Referinta (doar la nevoie)\r\n\r\n- Doar daca ai nevoie de tabelul schemelor cunoscute (profil -> alias/DSN -> schema) sau de exemplul de extragere a codurilor fiscale, citeste `COMUN\\docs\\conexiuni-tunel-ssh-odbc.md`; re-exportul sursei unui pachet PL/SQL nu e acoperit aici, vezi `COMUN\\docs\\oracle_export.md`.\n\nBase directory for this skill: C:\\Users\\mmari\\.claude\\skills\\roa-oracle-production-access\nRelative paths in this skill (e.g., scripts/, reference/) are relative to this base directory.\nNote: file list is sampled.\n\n\n\n\n","metadata":{"name":"roa-oracle-production-access","dir":"C:\\Users\\mmari\\.claude\\skills\\roa-oracle-production-access","truncated":false},"title":"Loaded skill: roa-oracle-production-access","time":{"start":1789550010651,"end":1789550010705}},"id":"prt_0a97e20d1001szpFiUQ6IhYX8V","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e0aab00144D33FQr04rEJy"}} +{"type":"tool_use","timestamp":1789550011106,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"bash","callID":"call_01_O1BVzKbXmdfdia0GK9TD3399","state":{"status":"completed","input":{"command":"ls -la \"D:\\vm303-profile\\conpress.tlp\" 2>/dev/null; ls \"D:\\roa\\BITVISE\\\" 2>/dev/null; ls \"C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe\" 2>/dev/null; ls \"D:\\ROA\\instantclient_19_18\\sqlplus.exe\" 2>/dev/null"},"output":"/usr/bin/bash: -c: line 0: syntax error near unexpected token `('\n/usr/bin/bash: -c: line 0: `ls -la \"D:\\vm303-profile\\conpress.tlp\" 2>/dev/null; ls \"D:\\roa\\BITVISE\\\" 2>/dev/null; ls \"C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe\" 2>/dev/null; ls \"D:\\ROA\\instantclient_19_18\\sqlplus.exe\" 2>/dev/null'\n","metadata":{"output":"/usr/bin/bash: -c: line 0: syntax error near unexpected token `('\n/usr/bin/bash: -c: line 0: `ls -la \"D:\\vm303-profile\\conpress.tlp\" 2>/dev/null; ls \"D:\\roa\\BITVISE\\\" 2>/dev/null; ls \"C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe\" 2>/dev/null; ls \"D:\\ROA\\instantclient_19_18\\sqlplus.exe\" 2>/dev/null'\n","exit":1,"truncated":false},"title":"ls -la \"D:\\vm303-profile\\conpress.tlp\" 2>/dev/null; ls \"D:\\roa\\BITVISE\\\" 2>/dev/null; ls \"C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe\" 2>/dev/null; ls \"D:\\ROA\\instantclient_19_18\\sqlplus.exe\" 2>/dev/null","time":{"start":1789550010948,"end":1789550011100}},"id":"prt_0a97e211f001ZmzquQTKkEsaks","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e0aab00144D33FQr04rEJy"}} +{"type":"tool_use","timestamp":1789550011539,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"bash","callID":"call_02_ptBiWol0QaVxp0kioUHf6384","state":{"status":"completed","input":{"command":"grep -i -A4 \"ROA_CONPRESS\" \"D:\\ROA\\instantclient_19_18\\tnsnames.ora\" 2>/dev/null; echo \"---11_2---\"; grep -i -A4 \"ROA_CONPRESS\" \"D:\\ROA\\instantclient_11_2_0_2\\tnsnames.ora\" 2>/dev/null"},"output":"ROA_CONPRESS =\n (DESCRIPTION =\n (ADDRESS_LIST =\n (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))\n )\n---11_2---\nROA_CONPRESS =\n (DESCRIPTION =\n (ADDRESS_LIST =\n (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))\n )\n","metadata":{"output":"ROA_CONPRESS =\n (DESCRIPTION =\n (ADDRESS_LIST =\n (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))\n )\n---11_2---\nROA_CONPRESS =\n (DESCRIPTION =\n (ADDRESS_LIST =\n (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))\n )\n","exit":0,"truncated":false},"title":"grep -i -A4 \"ROA_CONPRESS\" \"D:\\ROA\\instantclient_19_18\\tnsnames.ora\" 2>/dev/null; echo \"---11_2---\"; grep -i -A4 \"ROA_CONPRESS\" \"D:\\ROA\\instantclient_11_2_0_2\\tnsnames.ora\" 2>/dev/null","time":{"start":1789550011416,"end":1789550011517}},"id":"prt_0a97e226f001OwenMBRMSitgpz","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e0aab00144D33FQr04rEJy"}} +{"type":"step_finish","timestamp":1789550011766,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e256c001J9T2ccc1QGV8AN","reason":"tool-calls","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","messageID":"msg_0a97e0aab00144D33FQr04rEJy","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","type":"step-finish","tokens":{"total":52250,"input":26400,"output":266,"reasoning":624,"cache":{"write":0,"read":24960}},"cost":0.00456888}} +{"type":"step_start","timestamp":1789550013365,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e2bb3001a0S9AS35qzFPtW","messageID":"msg_0a97e265e001xyazpMOrhSOtCH","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","type":"step-start"}} +{"type":"tool_use","timestamp":1789550014302,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"glob","callID":"call_00_cKRB9hxTh7zXzwKAJPCL2572","state":{"status":"completed","input":{"pattern":"D:\\vm303-profile\\*.tlp"},"output":"No files found","metadata":{"count":0,"truncated":false},"title":"","time":{"start":1789550014243,"end":1789550014290}},"id":"prt_0a97e2ed5001YaXxq8f8XEMI4V","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e265e001xyazpMOrhSOtCH"}} +{"type":"tool_use","timestamp":1789550014409,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"glob","callID":"call_01_FLESAGOZwe6eWgO2pqIB8083","state":{"status":"completed","input":{"pattern":"D:\\roa\\BITVISE\\*.tlp"},"output":"No files found","metadata":{"count":0,"truncated":false},"title":"","time":{"start":1789550014336,"end":1789550014396}},"id":"prt_0a97e2f33001OqXWNNZxTFDg23","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e265e001xyazpMOrhSOtCH"}} +{"type":"tool_use","timestamp":1789550015962,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"bash","callID":"call_02_m8Txt0AQ0rdW1fEmMALl0462","state":{"status":"completed","input":{"command":"powershell -NoProfile -Command \"Test-Path 'D:\\vm303-profile\\conpress.tlp'; Test-Path 'D:\\roa\\BITVISE\\conpress.tlp'; Test-Path 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe'; Test-Path 'D:\\ROA\\instantclient_19_18\\sqlplus.exe'\""},"output":"True\r\nFalse\r\nTrue\r\nTrue\r\n","metadata":{"output":"True\r\nFalse\r\nTrue\r\nTrue\r\n","exit":0,"truncated":false},"title":"powershell -NoProfile -Command \"Test-Path 'D:\\vm303-profile\\conpress.tlp'; Test-Path 'D:\\roa\\BITVISE\\conpress.tlp'; Test-Path 'C:\\Program Files (x86)\\Bitvise SSH Client\\stnlc.exe'; Test-Path 'D:\\ROA\\instantclient_19_18\\sqlplus.exe'\"","time":{"start":1789550014634,"end":1789550015945}},"id":"prt_0a97e2fb0001QV76cm9Zuj7LHr","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e265e001xyazpMOrhSOtCH"}} +{"type":"step_finish","timestamp":1789550016196,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e36b3001gAXH1IOZmQsq4D","reason":"tool-calls","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","messageID":"msg_0a97e265e001xyazpMOrhSOtCH","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","type":"step-finish","tokens":{"total":55186,"input":2679,"output":193,"reasoning":90,"cache":{"write":0,"read":52224}},"cost":0.000728322}} +{"type":"step_start","timestamp":1789550017849,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e3d37001cKIq57F57F8cPO","messageID":"msg_0a97e3795001oJE8sCJM7h3ZYD","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","type":"step-start"}} +{"type":"tool_use","timestamp":1789550019770,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"todowrite","callID":"call_00_d0dMAigVTJgPze98aAx20403","state":{"status":"completed","input":{"todos":[{"content":"Ridica tunelul Bitvise conpress + verifica port 1521","status":"in_progress","priority":"high"},{"content":"Conectare sqlplus ca contafin_oracle@ROA_CONPRESS","status":"pending","priority":"high"},{"content":"DESC/coloane nom_firme","status":"pending","priority":"high"},{"content":"Combinatia cea mai frecventa forma_* din nom_firme","status":"pending","priority":"high"},{"content":"Verifica CUI 54602536 inexistent","status":"pending","priority":"high"},{"content":"Cauta useri Vali/Valentina Iliescu + Raluca Ion","status":"pending","priority":"high"},{"content":"Gaseste id_grup uzual","status":"pending","priority":"high"},{"content":"Inchide tunelul","status":"pending","priority":"high"},{"content":"Actualizeaza schita_deschidere_firma_conpress.sql","status":"pending","priority":"high"},{"content":"Actualizeaza deschide_firma_conpress.ps1 (parametri + nume reale)","status":"pending","priority":"high"},{"content":"Scrie docs\\raport_firma-ludipedia-contafin.md","status":"pending","priority":"high"}]},"output":"[\n {\n \"content\": \"Ridica tunelul Bitvise conpress + verifica port 1521\",\n \"status\": \"in_progress\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Conectare sqlplus ca contafin_oracle@ROA_CONPRESS\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"DESC/coloane nom_firme\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Combinatia cea mai frecventa forma_* din nom_firme\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Verifica CUI 54602536 inexistent\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Cauta useri Vali/Valentina Iliescu + Raluca Ion\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Gaseste id_grup uzual\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Inchide tunelul\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Actualizeaza schita_deschidere_firma_conpress.sql\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Actualizeaza deschide_firma_conpress.ps1 (parametri + nume reale)\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n },\n {\n \"content\": \"Scrie docs\\\\raport_firma-ludipedia-contafin.md\",\n \"status\": \"pending\",\n \"priority\": \"high\"\n }\n]","metadata":{"todos":[{"content":"Ridica tunelul Bitvise conpress + verifica port 1521","status":"in_progress","priority":"high"},{"content":"Conectare sqlplus ca contafin_oracle@ROA_CONPRESS","status":"pending","priority":"high"},{"content":"DESC/coloane nom_firme","status":"pending","priority":"high"},{"content":"Combinatia cea mai frecventa forma_* din nom_firme","status":"pending","priority":"high"},{"content":"Verifica CUI 54602536 inexistent","status":"pending","priority":"high"},{"content":"Cauta useri Vali/Valentina Iliescu + Raluca Ion","status":"pending","priority":"high"},{"content":"Gaseste id_grup uzual","status":"pending","priority":"high"},{"content":"Inchide tunelul","status":"pending","priority":"high"},{"content":"Actualizeaza schita_deschidere_firma_conpress.sql","status":"pending","priority":"high"},{"content":"Actualizeaza deschide_firma_conpress.ps1 (parametri + nume reale)","status":"pending","priority":"high"},{"content":"Scrie docs\\raport_firma-ludipedia-contafin.md","status":"pending","priority":"high"}],"truncated":false},"title":"11 todos","time":{"start":1789550019756,"end":1789550019764}},"id":"prt_0a97e3f6f001Cr3kE4cT4plrZM","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e3795001oJE8sCJM7h3ZYD"}} +{"type":"tool_use","timestamp":1789550021293,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"type":"tool","tool":"bash","callID":"call_01_g8NlLHVAX3iEzcsqoCf64145","state":{"status":"completed","input":{"command":"powershell -NoProfile -Command \"Get-Content 'D:\\ROA\\instantclient_19_18\\tnsnames.ora' | Select-String -Pattern 'ROA_CONPRESS' -Context 0,6\""},"output":"\r\n> ROA_CONPRESS =\r\n (DESCRIPTION =\r\n (ADDRESS_LIST =\r\n (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))\r\n )\r\n (CONNECT_DATA =\r\n (SID = ROA)\r\n\r\n\r\n","metadata":{"output":"\r\n> ROA_CONPRESS =\r\n (DESCRIPTION =\r\n (ADDRESS_LIST =\r\n (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))\r\n )\r\n (CONNECT_DATA =\r\n (SID = ROA)\r\n\r\n\r\n","exit":0,"truncated":false},"title":"powershell -NoProfile -Command \"Get-Content 'D:\\ROA\\instantclient_19_18\\tnsnames.ora' | Select-String -Pattern 'ROA_CONPRESS' -Context 0,6\"","time":{"start":1789550019997,"end":1789550021283}},"id":"prt_0a97e44af001EK7P2t9CRvPBMN","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","messageID":"msg_0a97e3795001oJE8sCJM7h3ZYD"}} +{"type":"step_finish","timestamp":1789550021741,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e4c5d001ZaIdFADPrXsFkr","reason":"tool-calls","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","messageID":"msg_0a97e3795001oJE8sCJM7h3ZYD","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","type":"step-finish","tokens":{"total":55730,"input":192,"output":455,"reasoning":43,"cache":{"write":0,"read":55040}},"cost":0.00049272}} +{"type":"step_start","timestamp":1789550023563,"sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","part":{"id":"prt_0a97e5389001anZpIBtW76hGeL","messageID":"msg_0a97e4dab001N5BpEPdfAZZ57t","sessionID":"ses_f568215ebffe9jfQwrk6knKCrM","snapshot":"3f8ea897d7b57edb018e53fd82b0e50ad581dbc9","type":"step-start"}} diff --git a/docs/wip_firma-ludipedia-conpress/sarcina_firma-ludipedia-contafin.md b/docs/wip_firma-ludipedia-conpress/sarcina_firma-ludipedia-contafin.md new file mode 100644 index 0000000..bee0b89 --- /dev/null +++ b/docs/wip_firma-ludipedia-conpress/sarcina_firma-ludipedia-contafin.md @@ -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=`), 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: `. diff --git a/docs/wip_firma-ludipedia-conpress/schita_deschidere_firma_conpress.sql b/docs/wip_firma-ludipedia-conpress/schita_deschidere_firma_conpress.sql new file mode 100644 index 0000000..5ac2ccf --- /dev/null +++ b/docs/wip_firma-ludipedia-conpress/schita_deschidere_firma_conpress.sql @@ -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. +-- ============================================================================