sync SVN r18068

This commit is contained in:
2026-09-03 14:39:52 +03:00
parent 4bc5e26758
commit 644f64f664
4 changed files with 358 additions and 180 deletions

View File

@@ -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`.

View File

@@ -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=<tcHost>;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 '<schema>/<parola>@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=<tcHost>;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 '<schema>/<parola>@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'
```

View File

@@ -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.

View File

@@ -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.
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)