Files
comun/docs/wip_firma-ludipedia-conpress/opencode_firma-ludipedia-contafin.log
2026-09-16 21:11:41 +03:00

24 lines
173 KiB
Plaintext

{"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":"<path>D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\reguli_lucru.md</path>\n<type>file</type>\n<content>\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<N>_<subiect>.patch`\n13: (`git diff --no-index <baseline.bak> <editat>`), 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_<aplicatie>.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: <plafonul> - <cum se creste daca deranjeaza>`;\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 \"<script.prg>\" <param>` 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</content>","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<N>_<subiect>.patch`\n (`git diff --no-index <baseline.bak> <editat>`), 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<N>_<subiect>.patch`\n (`git diff --no-index <baseline.bak> <editat>`), 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_<aplicatie>.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: <plafonul> - <cum se creste daca deranjeaza>`;\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 \"<script.prg>\" <param>` 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":"<path>C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\schita_deschidere_firma_conpress.sql</path>\n<type>file</type>\n<content>\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</content>","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":"<path>C:\\Users\\mmari\\AppData\\Local\\Temp\\claude\\D--ROA-ROAFACTURARE\\8e9e8ac8-a9eb-48de-a26c-85e5cb7a35d8\\scratchpad\\deschide_firma_conpress.ps1</path>\n<type>file</type>\n<content>\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</content>","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":"<path>D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conexiuni-tunel-ssh-odbc.md</path>\n<type>file</type>\n<content>\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=<tcHost>;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 '<schema>/<parola>@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</content>","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=<tcHost>;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 '<schema>/<parola>@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":"<path>D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\conventie_mediu_oracle.md</path>\n<type>file</type>\n<content>\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</content>","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":"<path>D:\\ROA\\ROAFACTURARE\\COMUN\\docs\\local\\oracle.md</path>\n<type>file</type>\n<content>\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@<alias> 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</content>","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@<alias> 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@<alias> 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":"<skill_content name=\"roa-oracle-production-access\">\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 '<schema>/<parola>@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<skill_files>\n\n</skill_files>\n</skill_content>","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"}}