diff --git a/docs/cercetare/rec_directie_roacont_2026_09.md b/docs/cercetare/rec_directie_roacont_2026_09.md new file mode 100644 index 0000000..dc64f5d --- /dev/null +++ b/docs/cercetare/rec_directie_roacont_2026_09.md @@ -0,0 +1,124 @@ +# Propuneri de directie ROACONT (09.2026) + +Propunerile finale dupa cercetarea de piata si backtestul pe 23 de scheme de productie. Cifrele +marcate "masurat" vin din backtest cronologic pe date reale, comparat cu ce a confirmat operatorul; +restul sunt marcate "nemasurat". Dovezile si metoda: `ROACONT\docs\cercetare\piata_ai_2026_09\`. + +Premisa: fara clienti noi, fara rescriere, datele raman in Oracle-ul clientului. + +## 1. Import eFactura primite + +Ecranul `frm_import_efactura` (`COMUN\clase\anaf_efactura.vcx`, lansat din +`COMUN\programe\import_efactura.prg:167`). Aici e concentrata munca manuala repetitiva a lunii: +13.418 facturi de intrare si 33.844 linii de articol pe an la un cabinet de 21 de firme, din care +15.565 linii primesc cont de la operator. Restul fluxului lunar e deja automatizat. + +**1.1 Cheie de articol normalizata.** `GetArticolEFByPartDenumire` +(`COMUN\programe\oproceduri_comune.prg:7362`) cauta in `ANAF_VEFACTURA_DETALII` cu +`TRIM(UPPER(d.articol)) = ?pcDenumire` - litera cu litera, deci orice cifra din denumire strica +potrivirea ("Abonament 08/2026" vs "09/2026"). Propunere: cheie fara cifre + prefix configurabil per +firma. Masurat: 52,0% -> 72,3% recunoscute, ~3.150 linii/an in plus; precizia scade 95,0% -> 93,4%. + +**1.2 Contabilizare in lot.** Semafor pe factura (verde = ultimele 5 facturi ale furnizorului contate +identic; galben = istoric variabil; rosu = furnizor nou), buton pentru tot ce e verde, anulare in +bloc. Masurat pe cont sintetic: 41,3% din facturi pe verde cu 93,8% precizie, nicio firma sub 85% - +circa 5.200 facturi/an fara interventie. Anularea in bloc nu e optionala. + +**1.3 LLM doar pe rest.** ~28% din linii nu au precedent, plus 7% furnizori noi. Se trimite doar +textul articolului si lista de conturi - fara sume, fara parteneri. Sub 20 USD/luna pentru toti +clientii. Obligatoriu: eticheta vizibila ca sugestia vine de la AI (regula UE, august 2026). + +## 2. Import extrase de banca + +Flux: `Programe\ocont2003.prg:845` -> fabrica `ImportNote` (`Programe\oproceduri_import.prg:57`) -> +parser per format -> imperechere in `ExtrasBanca::CreeazaNote` (`oproceduri_import.prg:312-926`) -> +corectie manuala in `frm_modific2024` -> scriere in `ACT` cu `id_set = 90023`. + +**2.1 Cheie de partener invatata din istoric.** Azi partenerul se ia de pe o pozitie fixa in +descriere (`oproceduri_import.prg:3013`) si se cauta exact in nomenclator +(`oproceduri_comune.prg:6623-6645`). Nu exista cheie disponibila la toate formatele: codul fiscal +lipseste la majoritatea (la BT e fixat gol, `oproceduri_import.prg:3015`), iar IBAN-ul nu are pe ce +lucra - doar 4,5% din parteneri au `CONT_BANCA` completat. Propunere: se retine din istoric ce +partener a fost confirmat pentru un IBAN si pentru un text de descriere normalizat, si se propune +doar cand acea cheie a dus **de fiecare data** la acelasi partener. +Masurat pe 3.490 de linii, 7 firme, 12 luni: **4,6% -> 28,5% acoperire la 97,9% precizie**. +Pe firme: 79,5% (BT) ... 10,5% (banci care trimit doar numere de referinta) - regula tace singura +acolo unde textul nu spune nimic, deci nu cere configurare per banca. +**Garda de unicitate e esentiala**: fara ea, 58,3% acoperire dar 56,4% precizie. + +**2.2 Salvarea IBAN-ului pe partener.** Parserul extrage IBAN-ul (`oproceduri_import.prg:3014`, scris +in `explicatia4` la `:902`) dar nu ajunge in baza: gol la 878 din 879 de linii. Daca s-ar salva pe +partener la confirmarea operatorului, nomenclatorul s-ar umple singur si cheia cea mai sigura ar +deveni utilizabila. + +**2.3 Factura: nu se automatizeaza, se scurteaza cautarea.** Masurat pe 3.074 de linii legate de o +factura: numarul acelei facturi apare in textul bancii doar in **25,0%** din cazuri (0% - 56,6% pe +firma). Potrivirea dupa suma pe documentele deschise acopera 21,2% cu 89,9% precizie, prea slaba +pentru completare automata. Plafonul e structural - informatia lipseste din fisier. Efortul merita +mutat pe: dupa ce partenerul e cunoscut, arata lista scurta a documentelor lui deschise ordonate +dupa potrivirea sumei. + +**2.4 Defecte confirmate (de reparat oricum, independent de propuneri).** +- Pozitiile fixe din descrierea BT nu sunt validate (`oproceduri_import.prg:3013-3014`): la "Plata OP + inter" si "Comision plata OP" descrierea are un camp in plus, deci denumirea se citeste ca numar de + OP si IBAN-ul ca denumire. Dovedit prin test headless pe fisiere reale. +- Bucla de asociere document iese neconditionat dupa primul numar incercat + (`EXIT`, `oproceduri_import.prg:736`), contrar comentariului de la `:701-706` - o plata care acopera + mai multe facturi ramane nepereche. +- La numar de document ambiguu, `GetDocumentByContPartenerAct` doar scrie in log + (`oproceduri_comune.prg:7038`) fara sa arate operatorului candidatii. +- **`VerifIBAN` (`COMUN\programe\oproceduri_comune.prg:7885`) intoarce raspuns gresit** cand apelantul + are selectat un cursor cu camp `iban`: variabilele nu sunt declarate si citirile neprefixate se + rezolva la CAMP, nu la parametru. Afecteaza si validarea IBAN-ului la introducerea partenerului + (`onomenclatoare.vcx`, `oparteneri.vcx`). Corectie: `LOCAL` + prefix `m.` pe toate referintele. + +**2.5 Adoptie.** Doar 7 din 21 de firme au linii venite din import de extras. Inainte de a imbunatati +algoritmul, merita aflat de ce nu se foloseste la celelalte. + +## 3. Restul, in ordinea recomandata (nemasurate) + +1. **Drepturi in modulul web** - blocant: pana nu se rezolva, nimic nu se poate arata unui client. +2. **Punte MCP peste Oracle** - intrebi in Claude Code, el ruleaza interogari pregatite; modelul + primeste rezultatul, nu baza. Singura cale prin care AI-ul intra adanc in ROA fara rescriere. +3. **Tablou de bord multi-firma cu alerte** (luna neinchisa, token SPV expirat, facturi + necontabilizate) - **singurul candidat de abonament nou** din toata cercetarea. +4. **Inchiderea de luna ca flux unic** - azi 13 comenzi in doua meniuri, fara ordine si fara bifare. +5. **Sablon de import la preluarea unui client** - maparea de conturi produsa o data si refolosita. +6. **Asistent de suport pe documentatie** - butonul de chat exista, ii lipseste continutul. +7. **e-Transport** - azi nu exista nimic. + +## 4. Respinse, ca sa nu fie repropuse + +- **Bon fiscal digital**: QR-ul contine doar identificatori (data/ora, numar, seria AMEF, optional CUI + cumparator), nu valoare/TVA/cote; nu exista serviciu ANAF pentru descarcarea bonurilor **primite**; + obligatiile cad pe producatorii de case de marcat. Zero efort in ROACONT. +- **Codul de articol din eFactura**: furnizorii nu-l trimit (34 linii din 4.426). +- **GPU local pentru AI**: costa cat 30 de ani de abonament la volumele actuale. +- **Rescriere in alt limbaj / mutare in browser**: un an fara actualizari legislative = pierderea + clientilor. Nici SAGA nu face asta. +- **Cloud propriu cu datele clientilor**: cost de operare imposibil pentru doi oameni si sterge + singurul avantaj fata de SmartBill/Oblio/Keez. +- **Intrebari in limbaj natural direct pe baza de date**: 31% raspunsuri corecte pe baze reale. + +## 5. Capcane de masurare (platite) + +- Numarul de linii cu `ID_FACTD/ID_FACTC` completat **nu** masoara automatizarea - imperecherea o face + operatorul. Nu exista tabel de audit: corectiile din `frm_modific2024` se fac inainte de scrierea in + `ACT` (`ocont2003.prg:1245-1257`). Singurul backtest valid: se reia regula cronologic pe + `ACT.EXPLICATIA` al liniilor cu `id_set = 90023` si se compara cu ce e inregistrat pe linie. +- Pe o linie de banca, partenerul se ia **de pe latura contului 401/411**, nu cu + `nvl(id_partd, id_partc)` - pe latura 512 partenerul e contul bancar propriu si cifrele ies fals + de bune. +- Subinterogarile corelate peste `ACT` omoara serverul; se scriu cu JOIN si hint `materialize`. + +## 6. Surse externe pentru afirmatiile de piata + +Verificate 03.09.2026. + +- SmartBill a livrat preluarea si prelucrarea automata a eFacturilor primite din SPV la 28.08.2026: + ajutor.smartbill.ro/article/1256 si /1128. Extrase bancare prin open banking: /article/1073. +- Obligatia de transparenta AI (Regulament UE, Art. 50) se aplica din 02.08.2026 - utilizatorul trebuie + informat ca interactioneaza cu AI: bchlaw.eu/articles/regulamentul-european-privind-ia-etapa-de-la-2-august-2026/ +- Pret GPU la 08.2026: RTX 5090 ~28.000 lei, RTX PRO 6000 96GB ~76.000 lei (techpowerup.com/351549). +- Intrebari in limbaj natural pe baze de date: 82% pe BIRD, 31% pe Spider - de aceea e respins. +- Bon fiscal digital: sursele legale, in `ROACONT\docs\cercetare\piata_ai_2026_09\BON_FISCAL_DIGITAL.md`. diff --git a/docs/conexiuni-tunel-ssh-odbc.md b/docs/conexiuni-tunel-ssh-odbc.md index ea3b9c9..eec86d7 100644 --- a/docs/conexiuni-tunel-ssh-odbc.md +++ b/docs/conexiuni-tunel-ssh-odbc.md @@ -1,179 +1,187 @@ -# Conexiuni la bazele de productie: tunel SSH (Bitvise) + ODBC/TNS - -Cum se ajunge, de pe statia de lucru, la un Oracle care nu e expus direct in internet. Valabil -pentru toate proiectele ROA. Scopul documentului: sa nu se mai piarda o sesiune intreaga -redescoperind lantul. - -> **Fara credentiale in git.** Acest fisier NU contine parole, si nici un fisier din repo nu -> trebuie sa contina. Parolele stau in profilul Bitvise (criptate cu DPAPI, legate de contul -> Windows) si in capul celui care lucreaza. Daca ai nevoie de o parola pe care nu o ai, cere-o - -> nu o cauta prin fisiere si **nu o ghici**: Oracle poate avea `FAILED_LOGIN_ATTEMPTS` in profil, -> iar cateva incercari gresite blocheaza contul de schema in PRODUCTIE. - -## Lantul, pe scurt - -``` -statie -> [tunel SSH Bitvise] -> 127.0.0.1:1521 -> Oracle de pe serverul de productie - ^ - aliasul TNS din instantclient\tnsnames.ora arata AICI - ^ - DSN-ul ODBC cu acelasi nume e ce primeste goConn.Connect() -``` - -Trei nume trebuie sa se potriveasca, si e usor de ratat: **profilul Bitvise** (ce port local -deschide), **aliasul TNS** (ce host:port foloseste) si **DSN-ul ODBC** (ce alias TNS foloseste). - -## 1. Tunelul SSH - -Profilele Bitvise (`.tlp`) stau in `D:\GoogleDrive\` (ex. `vending.tlp`). Un profil contine -gazda, portul, utilizatorul, parola criptata, cheile de gazda deja acceptate si **regulile de -port forwarding** - de obicei `127.0.0.1:1521 -> localhost:1521`. - -Ridicare din linie de comanda, fara interfata grafica: - -```powershell -$exe = 'C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe' -Start-Process $exe -ArgumentList '-profile=D:\GoogleDrive\vending.tlp' -WindowStyle Hidden ` - -RedirectStandardOutput "$env:TEMP\stnlc_out.txt" -RedirectStandardError "$env:TEMP\stnlc_err.txt" -``` - -`stnlc` foloseste singur parola stocata in profil - **nu o trece pe linia de comanda**, ar ajunge -in istoricul shell-ului. Ruleaza sub acelasi cont Windows sub care a fost salvat profilul,altfel -DPAPI nu poate decripta parola. - -Verificare ca tunelul chiar e sus (nu te baza pe faptul ca procesul traieste): - -```powershell -(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded -``` - -In `stnlc_out.txt` linia care conteaza e `Added client-to-server forwarding rule on -127.0.0.1:1521 to localhost:1521.` Inchidere: opreste procesul `stnlc`. - -**Capcana**: un singur port local 1521 pentru mai multe destinatii. Daca ai deja un tunel ridicat -catre alt client, al doilea nu mai poate lega portul si vei interoga **alta baza** fara sa-ti dai -seama. Verifica intotdeauna cu ce te-ai conectat (vezi pasul 4). - -**Capcana inrudita**: interfata grafica `BvSsh.exe` poate tine portul 1521 legat pe `0.0.0.0` cu o -sesiune moarta - `sqlplus` raspunde atunci `ORA-12541: TNS:no listener`, desi "tunelul pare sus". -`stnlc` isi poate lega totusi propria regula pe `127.0.0.1:1521` peste ea si merge. Nu te lua dupa -`netstat`: proba reala e interogarea din pasul 4. - -## 2. Aliasul TNS - -`D:\ROA\instantclient_19_18\tnsnames.ora` (si `instantclient_11_2_0_2` pentru driverul ODBC pe -32 de biti). Aliasurile care merg prin tunel arata spre `127.0.0.1`: - -``` -VENDING = - (DESCRIPTION = - (ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))) - (CONNECT_DATA = (SERVICE_NAME = XEPDB1)) - ) -``` - -Pentru `sqlplus` trebuie `TNS_ADMIN` setat pe folderul care contine `tnsnames.ora`: - -```powershell -$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18' -``` - -## 3. DSN-ul ODBC - -Aplicatia nu foloseste TNS direct: `oConn.Connect(tcHost, tcUser, tcPassword)` -(`oproceduri_comune.prg`) construieste `dsn=;Uid=...;Pwd=...` - deci **`tcHost` e un nume -de DSN ODBC**, nu un host si nu un alias TNS. DSN-urile sunt pe 32 de biti (VFP e pe 32 de biti), -deci in `HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI`, cu driverul din `instantclient_11_2_0_2`. - -Listare rapida: - -```powershell -Get-ChildItem 'HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBC.INI' | - Select-Object -ExpandProperty PSChildName -``` - -De obicei DSN-ul are acelasi nume cu aliasul TNS (`VENDING`, `CENTRAL`, `ROA_CENTRAL`...). -Administrare vizuala: `C:\Windows\SysWOW64\odbcad32.exe` (**nu** cel din `System32`, acela e pe -64 de biti si nu vede DSN-urile VFP). - -## 4. Interogare si verificare - -```powershell -$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18' -& 'D:\ROA\instantclient_19_18\sqlplus.exe' -S -L '/@VENDING' '@script.sql' -``` - -`-L` = o singura incercare de login (nu reincearca la parola gresita). **Foloseste-l intotdeauna -pe productie.** - -Prima interogare, mereu, ca sa stii unde ai nimerit: - -```sql -select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual; -``` - -Pentru extragere in fisier, `spool` scrie **local**, nu pe server: - -```sql -set pagesize 0 feedback off heading off linesize 100 trimspool on termout off -spool D:\cale\locala\iesire.txt -select ...; -spool off -``` - -**Capcana PowerShell**: intr-un here-string cu ghilimele duble (`@"..."@`) PowerShell expandeaza -`$`. Un regex Oracle care se termina cu `$` (ancora de sfarsit) ajunge stricat in fisierul `.sql` -si interogarea intoarce 0 randuri **fara nicio eroare**. Foloseste here-string cu apostrof -(`@'...'@`) si inlocuieste caile printr-un token. - -**Capcana `termout off`**: ascunde si mesajele de eroare. Daca fisierul spool iese gol, ruleaza -din nou fara `termout off` inainte sa banuiesti datele. - -## Schemele cunoscute (fara parole) - -| Tunel / profil | Alias TNS + DSN | Schema Oracle | -|---|---|---| -| `vending.tlp` | `VENDING` | `vending` | -| conpress | `ROA_CONPRESS` | `xenoti` | - -Restul aliasurilor din `tnsnames.ora` (`ROA_CENTRAL`, `CENTRAL105`, `ROA_TEST`, ...) sunt retea -interna si nu au nevoie de tunel. - -## Reguli pe productie - -1. **Doar `SELECT`.** Fara `INSERT`/`UPDATE`/`DELETE`/DDL, fara `ALTER SESSION` care schimba - comportament persistent. Daca ai nevoie de date de lucru, extrage-le si lucreaza local. -2. **Fara ghicit parole** - vezi avertismentul de la inceput. -3. **Interogari marginite**: `fetch first N rows only`, si evita scanarile complete pe tabele - mari in orele de lucru. -4. **Inchide tunelul** cand ai terminat; nu-l lasa deschis peste noapte. -5. **Datele extrase**: codurile fiscale sunt publice si pot sta in repo (vezi - `utile\Teste\cache_anaf\codes_*_reale.txt`). Denumirile de parteneri, adresele, soldurile - **nu** - nu le comite. - -## De unde vin loturile de coduri fiscale pentru teste - -`COMUN\utile\Teste\cache_anaf\codes_1000_reale.txt` a fost extras din productia `vending`, tabela -`nom_parteneri` (23932 randuri, 6382 coduri romanesti distincte): - -```sql -select cif from ( - select distinct regexp_replace(upper(trim(cod_fiscal)), '[^0-9]', '') as cif - from nom_parteneri - where cod_fiscal is not null - and regexp_like(upper(trim(cod_fiscal)), '^(RO)?[[:space:]]*[0-9]{2,10}$') -) where length(cif) between 2 and 10 -order by ora_hash(cif) -fetch first 1000 rows only; -``` - -`order by ora_hash(cif)` da o dispersie **deterministica** (aceeasi de fiecare data), spre -deosebire de `dbms_random`; ordonarea crescuta dupa cod ar fi inclinat lotul spre firme vechi, -deci spre Bucuresti. Suprapunere cu lotul mai vechi de 200: 8 coduri. - -Folosire in proba end-to-end ANAF: - -```powershell -$env:E2E_CODURI = 'D:\ROA\ROADEF\COMUN\utile\Teste\cache_anaf\codes_1000_reale.txt' -$env:E2E_LIMITA = '1000' -``` +# Conexiuni la bazele de productie: tunel SSH (Bitvise) + ODBC/TNS + +Cum se ajunge, de pe statia de lucru, la un Oracle care nu e expus direct in internet. Valabil +pentru toate proiectele ROA. Scopul documentului: sa nu se mai piarda o sesiune intreaga +redescoperind lantul. + +> **Fara credentiale in git.** Acest fisier NU contine parole, si nici un fisier din repo nu +> trebuie sa contina. Parolele stau in profilul Bitvise (criptate cu DPAPI, legate de contul +> Windows) si in capul celui care lucreaza. Daca ai nevoie de o parola pe care nu o ai, cere-o - +> nu o cauta prin fisiere si **nu o ghici**: Oracle poate avea `FAILED_LOGIN_ATTEMPTS` in profil, +> iar cateva incercari gresite blocheaza contul de schema in PRODUCTIE. + +## Lantul, pe scurt + +``` +statie -> [tunel SSH Bitvise] -> 127.0.0.1:1521 -> Oracle de pe serverul de productie + ^ + aliasul TNS din instantclient\tnsnames.ora arata AICI + ^ + DSN-ul ODBC cu acelasi nume e ce primeste goConn.Connect() +``` + +Trei nume trebuie sa se potriveasca, si e usor de ratat: **profilul Bitvise** (ce port local +deschide), **aliasul TNS** (ce host:port foloseste) si **DSN-ul ODBC** (ce alias TNS foloseste). + +## 1. Tunelul SSH + +Profilele Bitvise (`.tlp`) stau in `D:\GoogleDrive\` (ex. `vending.tlp`). Un profil contine +gazda, portul, utilizatorul, parola criptata, cheile de gazda deja acceptate si **regulile de +port forwarding** - de obicei `127.0.0.1:1521 -> localhost:1521`. + +Ridicare din linie de comanda, fara interfata grafica: + +```powershell +$exe = 'C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe' +Start-Process $exe -ArgumentList '-profile=D:\GoogleDrive\vending.tlp' -WindowStyle Hidden ` + -RedirectStandardOutput "$env:TEMP\stnlc_out.txt" -RedirectStandardError "$env:TEMP\stnlc_err.txt" +``` + +`stnlc` foloseste singur parola stocata in profil - **nu o trece pe linia de comanda**, ar ajunge +in istoricul shell-ului. Ruleaza sub acelasi cont Windows sub care a fost salvat profilul,altfel +DPAPI nu poate decripta parola. + +Verificare ca tunelul chiar e sus (nu te baza pe faptul ca procesul traieste): + +```powershell +(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded +``` + +In `stnlc_out.txt` linia care conteaza e `Added client-to-server forwarding rule on +127.0.0.1:1521 to localhost:1521.` Inchidere: opreste procesul `stnlc`. + +**Capcana**: un singur port local 1521 pentru mai multe destinatii. Daca ai deja un tunel ridicat +catre alt client, al doilea nu mai poate lega portul si vei interoga **alta baza** fara sa-ti dai +seama. Verifica intotdeauna cu ce te-ai conectat (vezi pasul 4). + +**Capcana inrudita**: interfata grafica `BvSsh.exe` poate tine portul 1521 legat pe `0.0.0.0` cu o +sesiune moarta - `sqlplus` raspunde atunci `ORA-12541: TNS:no listener`, desi "tunelul pare sus". +`stnlc` isi poate lega totusi propria regula pe `127.0.0.1:1521` peste ea si merge. Nu te lua dupa +`netstat`: proba reala e interogarea din pasul 4. + +## 2. Aliasul TNS + +`D:\ROA\instantclient_19_18\tnsnames.ora` (si `instantclient_11_2_0_2` pentru driverul ODBC pe +32 de biti). Aliasurile care merg prin tunel arata spre `127.0.0.1`: + +``` +VENDING = + (DESCRIPTION = + (ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521))) + (CONNECT_DATA = (SERVICE_NAME = XEPDB1)) + ) +``` + +Pentru `sqlplus` trebuie `TNS_ADMIN` setat pe folderul care contine `tnsnames.ora`: + +```powershell +$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18' +``` + +## 3. DSN-ul ODBC + +Aplicatia nu foloseste TNS direct: `oConn.Connect(tcHost, tcUser, tcPassword)` +(`oproceduri_comune.prg`) construieste `dsn=;Uid=...;Pwd=...` - deci **`tcHost` e un nume +de DSN ODBC**, nu un host si nu un alias TNS. DSN-urile sunt pe 32 de biti (VFP e pe 32 de biti), +deci in `HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI`, cu driverul din `instantclient_11_2_0_2`. + +Listare rapida: + +```powershell +Get-ChildItem 'HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBC.INI' | + Select-Object -ExpandProperty PSChildName +``` + +De obicei DSN-ul are acelasi nume cu aliasul TNS (`VENDING`, `CENTRAL`, `ROA_CENTRAL`...). +Administrare vizuala: `C:\Windows\SysWOW64\odbcad32.exe` (**nu** cel din `System32`, acela e pe +64 de biti si nu vede DSN-urile VFP). + +## 4. Interogare si verificare + +```powershell +$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18' +& 'D:\ROA\instantclient_19_18\sqlplus.exe' -S -L '/@VENDING' '@script.sql' +``` + +`-L` = o singura incercare de login (nu reincearca la parola gresita). **Foloseste-l intotdeauna +pe productie.** + +Prima interogare, mereu, ca sa stii unde ai nimerit: + +```sql +select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual; +``` + +Pentru extragere in fisier, `spool` scrie **local**, nu pe server: + +```sql +set pagesize 0 feedback off heading off linesize 100 trimspool on termout off +spool D:\cale\locala\iesire.txt +select ...; +spool off +``` + +**Capcana PowerShell**: intr-un here-string cu ghilimele duble (`@"..."@`) PowerShell expandeaza +`$`. Un regex Oracle care se termina cu `$` (ancora de sfarsit) ajunge stricat in fisierul `.sql` +si interogarea intoarce 0 randuri **fara nicio eroare**. Foloseste here-string cu apostrof +(`@'...'@`) si inlocuieste caile printr-un token. + +**Capcana `termout off`**: ascunde si mesajele de eroare. Daca fisierul spool iese gol, ruleaza +din nou fara `termout off` inainte sa banuiesti datele. + +## Schemele cunoscute (fara parole) + +| Tunel / profil | Alias TNS + DSN | Schema Oracle | +|---|---|---| +| `vending.tlp` | `VENDING` | **`VENDING`** (parola standard ROA) | +| conpress | `ROA_CONPRESS` | `xenoti` | + +Profilele Bitvise sunt in **`D:\roa\BITVISE\`** pe statia curenta (`vending.tlp`, `conpress.tlp`, +`clever.tlp`, `automotive.tlp`, `avis.tlp`, `eduard.tlp`, `ems.tlp`, `romfast.tlp`, `sigma.tlp`, +`vadeco.tlp`) - nu in `D:\GoogleDrive\`. Clientul Oracle prezent e `instantclient_11_2_0_2` +(`TNS_ADMIN` se seteaza pe el). `VENDING` este Oracle 18c XE, serviciu `XEPDB1`. + +Masuratoare read-only rulata pe `VENDING` la 03.09.2026: `ROACONT\docs\cercetare\piata_ai_2026_09\` +(`BACKTEST_VENDING.md` plus scripturile din `sql\bt_*.sql`). + +Restul aliasurilor din `tnsnames.ora` (`ROA_CENTRAL`, `CENTRAL105`, `ROA_TEST`, ...) sunt retea +interna si nu au nevoie de tunel. + +## Reguli pe productie + +1. **Doar `SELECT`.** Fara `INSERT`/`UPDATE`/`DELETE`/DDL, fara `ALTER SESSION` care schimba + comportament persistent. Daca ai nevoie de date de lucru, extrage-le si lucreaza local. +2. **Fara ghicit parole** - vezi avertismentul de la inceput. +3. **Interogari marginite**: `fetch first N rows only`, si evita scanarile complete pe tabele + mari in orele de lucru. +4. **Inchide tunelul** cand ai terminat; nu-l lasa deschis peste noapte. +5. **Datele extrase**: codurile fiscale sunt publice si pot sta in repo (vezi + `utile\Teste\cache_anaf\codes_*_reale.txt`). Denumirile de parteneri, adresele, soldurile + **nu** - nu le comite. + +## De unde vin loturile de coduri fiscale pentru teste + +`COMUN\utile\Teste\cache_anaf\codes_1000_reale.txt` a fost extras din productia `vending`, tabela +`nom_parteneri` (23932 randuri, 6382 coduri romanesti distincte): + +```sql +select cif from ( + select distinct regexp_replace(upper(trim(cod_fiscal)), '[^0-9]', '') as cif + from nom_parteneri + where cod_fiscal is not null + and regexp_like(upper(trim(cod_fiscal)), '^(RO)?[[:space:]]*[0-9]{2,10}$') +) where length(cif) between 2 and 10 +order by ora_hash(cif) +fetch first 1000 rows only; +``` + +`order by ora_hash(cif)` da o dispersie **deterministica** (aceeasi de fiecare data), spre +deosebire de `dbms_random`; ordonarea crescuta dupa cod ar fi inclinat lotul spre firme vechi, +deci spre Bucuresti. Suprapunere cu lotul mai vechi de 200: 8 coduri. + +Folosire in proba end-to-end ANAF: + +```powershell +$env:E2E_CODURI = 'D:\ROA\ROADEF\COMUN\utile\Teste\cache_anaf\codes_1000_reale.txt' +$env:E2E_LIMITA = '1000' +``` diff --git a/docs/reguli_lucru.md b/docs/reguli_lucru.md index de8602b..36ea081 100644 --- a/docs/reguli_lucru.md +++ b/docs/reguli_lucru.md @@ -105,3 +105,14 @@ la incarcare. Propui rezultatul, nu rescrii din oficiu; nu pierzi nicio regula/capcana, doar cuvintele in plus. Fisierele de reguli/conventii se completeaza doar cu ce e super-util, simplu si concis. Cadenta o da hook-ul din `monitorizare-context.md` (marker la 30 de zile). +13. Documente de propuneri/directie: unul singur, final, in `COMUN\docs\cercetare\rec_*.md`. + Materialul de lucru (brief-uri, handoff-uri, variante intermediare, patch-uri) NU se pastreaza; + dovezile masurate si scripturile raman in `docs\` al proiectului, iar documentul trimite la ele. + Structura per propunere, in aceasta ordine: **unde** (modulul/ecranul + `fisier:linie`), **cum e + azi**, **ce se schimba**, **ce se castiga** (cifra, marcata `masurat` sau `nemasurat`), **ce risc**. + Gruparea e pe sectiuni de program, nu pe teme abstracte. `masurat` = backtest cronologic pe date + reale comparat cu ce a confirmat operatorul, nu estimare; orice cifra nemarcata se citeste ca + inventata. Se adauga o sectiune de **respinse, cu motivul intr-un rand**, ca sa nu fie repropuse, + si capcanele de masurare platite. INTERZIS: naratiune de proces (cine ce a raportat, cum s-au + coordonat benzile), tabele de tip "efort mic/mediu" fara explicatie, liste de etichete tehnice, + aceeasi idee in doua fisiere. diff --git a/docs/todos.txt b/docs/todos.txt index 211ddc3..1f21fee 100644 --- a/docs/todos.txt +++ b/docs/todos.txt @@ -54,4 +54,39 @@ INTERESUL MEU ESTE SA SIMPLIFIC INTERFATA, SA FIE MAI EFICIENTA, SA NU FIE 2 FOR DONE 21. ROACONT - in formularul de verificare coduri fiscale, ar trebui sa fie si perioadele de tva, tva incasare, inactivitate, la fel ca in istoric, pentru ca utilizatorul sa nu mai caute altundeva. de asemenea, in messagebox pentru verificarea automata pe ANAF individuala ar trebui sa fie toate aceste informatii. sa se poata edita partenerul din formularul de verificare coduri fiscale prin dublu-click pe numele/codul fiscal al partenerului, similar cu formularul saft. -22. ROADEF - la datele firmei, dupa completarea codului fiscal sa existe buton de preluare date de pe ANAF, similar cu cel din ROACONT partener nou. vezi ca trebuie completate localitatea si judetul cu id-uri. am inceput sa lucrez ceva - poate trebuie doar continuat si corectat - am ramas la judet si localitate. \ No newline at end of file +22. ROADEF - la datele firmei, dupa completarea codului fiscal sa existe buton de preluare date de pe ANAF, similar cu cel din ROACONT partener nou. vezi ca trebuie completate localitatea si judetul cu id-uri. am inceput sa lucrez ceva - poate trebuie doar continuat si corectat - am ramas la judet si localitate. +23. ROACONT - importul de eFactura recunoaste articolul doar pe text identic; cheie normalizata (fara cifre) + prefix configurabil per firma duce recunoasterea de la 52% la 72,3%. (rec_directie_roacont_2026_09.md, 1.1) + +24. ROACONT - contabilizare in lot a eFacturilor primite, cu semafor verde/galben/rosu pe furnizor si anulare in bloc: 41,3% din facturi intra pe verde cu 93,8% precizie. (rec_directie_roacont_2026_09.md, 1.2) + +25. ROACONT - LLM doar pe liniile fara precedent in istoric (~28%) si pe furnizorii noi, cu eticheta vizibila ca sugestia vine de la AI. (rec_directie_roacont_2026_09.md, 1.3) + +26. ROACONT - la importul de extrase, partenerul sa se invete din istoric (IBAN + text de descriere normalizat, propus doar cand cheia a dus mereu la acelasi partener): 4,6% -> 28,5% acoperire la 97,9% precizie. (rec_directie_roacont_2026_09.md, 2.1) + +27. ROACONT - importul de extrase sa salveze IBAN-ul pe partener cand operatorul confirma potrivirea; azi nomenclatorul are IBAN la 4,5% dintre parteneri si cheia cea mai sigura nu are pe ce lucra. (rec_directie_roacont_2026_09.md, 2.2) + +28. ROACONT - la extrase, dupa ce partenerul e cunoscut sa se arate lista scurta a documentelor lui deschise, ordonate dupa potrivirea sumei; automatizarea completa a facturii e limitata structural - numarul facturii apare in textul bancii doar in 25% din cazuri. (rec_directie_roacont_2026_09.md, 2.3) + +29. ROACONT - importul de extrase Banca Transilvania citeste denumirea si IBAN-ul de pe pozitii fixe in descriere, dar la platile prin OP catre alta banca apare un camp in plus si denumirea se citeste ca numar de OP. (rec_directie_roacont_2026_09.md, 2.4) + +30. ROACONT - la asocierea platii cu factura, bucla iese neconditionat dupa primul numar incercat (oproceduri_import.prg:736), deci o plata care acopera mai multe facturi ramane nepereche. (rec_directie_roacont_2026_09.md, 2.4) + +31. ROACONT - cand acelasi numar de document se potriveste pe mai multe randuri, GetDocumentByContPartenerAct doar scrie in log fara sa arate operatorului candidatii. (rec_directie_roacont_2026_09.md, 2.4) + +32. COMUN - VerifIBAN (oproceduri_comune.prg:7885) intoarce raspuns gresit cand apelantul are selectat un cursor cu camp iban: variabilele nu sunt declarate si citirile neprefixate se rezolva la camp, nu la parametru. Afecteaza si validarea IBAN-ului la introducerea partenerului. (rec_directie_roacont_2026_09.md, 2.4) + +33. ROACONT - de aflat de ce doar 7 din 21 de firme ale cabinetului folosesc importul de extrase; la restul extrasele se bat integral de mana. (rec_directie_roacont_2026_09.md, 2.5) + +34. ROA2WEB - drepturile de utilizator nu sunt implementate; pana nu se rezolva, nimic nu poate fi aratat unui client. (rec_directie_roacont_2026_09.md, 3.1) + +35. ROA - punte MCP peste Oracle: intrebi in Claude Code si el ruleaza interogari pregatite, modelul primeste rezultatul, nu baza. (rec_directie_roacont_2026_09.md, 3.2) + +36. ROA - tablou de bord pe toate firmele cabinetului, cu alerte de noapte (luna neinchisa, token SPV expirat, facturi necontabilizate); singurul candidat de abonament nou. (rec_directie_roacont_2026_09.md, 3.3) + +37. ROACONT - inchiderea de luna ca flux unic: azi sunt 13 comenzi in doua meniuri, fara ordine si fara bifare. (rec_directie_roacont_2026_09.md, 3.4) + +38. ROACONT - sablon reutilizabil de mapare la preluarea unui client din alt program; azi maparea de conturi se reface manual la fiecare preluare. (rec_directie_roacont_2026_09.md, 3.5) + +39. ROA - asistent de suport pe documentatia proprie; butonul de chat exista deja in mesajele de eroare, ii lipseste continutul (manual, versiuni, dictionar de erori). (rec_directie_roacont_2026_09.md, 3.6) + +40. ROACONT - e-Transport: azi nu exista nimic, concurenta are modul dedicat. (rec_directie_roacont_2026_09.md, 3.7)