sync SVN r18068
This commit is contained in:
124
docs/cercetare/rec_directie_roacont_2026_09.md
Normal file
124
docs/cercetare/rec_directie_roacont_2026_09.md
Normal 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`.
|
||||||
@@ -1,179 +1,187 @@
|
|||||||
# Conexiuni la bazele de productie: tunel SSH (Bitvise) + ODBC/TNS
|
# 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
|
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
|
pentru toate proiectele ROA. Scopul documentului: sa nu se mai piarda o sesiune intreaga
|
||||||
redescoperind lantul.
|
redescoperind lantul.
|
||||||
|
|
||||||
> **Fara credentiale in git.** Acest fisier NU contine parole, si nici un fisier din repo nu
|
> **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
|
> 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 -
|
> 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,
|
> 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.
|
> iar cateva incercari gresite blocheaza contul de schema in PRODUCTIE.
|
||||||
|
|
||||||
## Lantul, pe scurt
|
## Lantul, pe scurt
|
||||||
|
|
||||||
```
|
```
|
||||||
statie -> [tunel SSH Bitvise] -> 127.0.0.1:1521 -> Oracle de pe serverul de productie
|
statie -> [tunel SSH Bitvise] -> 127.0.0.1:1521 -> Oracle de pe serverul de productie
|
||||||
^
|
^
|
||||||
aliasul TNS din instantclient\tnsnames.ora arata AICI
|
aliasul TNS din instantclient\tnsnames.ora arata AICI
|
||||||
^
|
^
|
||||||
DSN-ul ODBC cu acelasi nume e ce primeste goConn.Connect()
|
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
|
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).
|
deschide), **aliasul TNS** (ce host:port foloseste) si **DSN-ul ODBC** (ce alias TNS foloseste).
|
||||||
|
|
||||||
## 1. Tunelul SSH
|
## 1. Tunelul SSH
|
||||||
|
|
||||||
Profilele Bitvise (`.tlp`) stau in `D:\GoogleDrive\` (ex. `vending.tlp`). Un profil contine
|
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
|
gazda, portul, utilizatorul, parola criptata, cheile de gazda deja acceptate si **regulile de
|
||||||
port forwarding** - de obicei `127.0.0.1:1521 -> localhost:1521`.
|
port forwarding** - de obicei `127.0.0.1:1521 -> localhost:1521`.
|
||||||
|
|
||||||
Ridicare din linie de comanda, fara interfata grafica:
|
Ridicare din linie de comanda, fara interfata grafica:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
$exe = 'C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe'
|
$exe = 'C:\Program Files (x86)\Bitvise SSH Client\stnlc.exe'
|
||||||
Start-Process $exe -ArgumentList '-profile=D:\GoogleDrive\vending.tlp' -WindowStyle Hidden `
|
Start-Process $exe -ArgumentList '-profile=D:\GoogleDrive\vending.tlp' -WindowStyle Hidden `
|
||||||
-RedirectStandardOutput "$env:TEMP\stnlc_out.txt" -RedirectStandardError "$env:TEMP\stnlc_err.txt"
|
-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
|
`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
|
in istoricul shell-ului. Ruleaza sub acelasi cont Windows sub care a fost salvat profilul,altfel
|
||||||
DPAPI nu poate decripta parola.
|
DPAPI nu poate decripta parola.
|
||||||
|
|
||||||
Verificare ca tunelul chiar e sus (nu te baza pe faptul ca procesul traieste):
|
Verificare ca tunelul chiar e sus (nu te baza pe faptul ca procesul traieste):
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
(Test-NetConnection 127.0.0.1 -Port 1521 -WarningAction SilentlyContinue).TcpTestSucceeded
|
(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
|
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`.
|
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
|
**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
|
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).
|
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
|
**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".
|
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
|
`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.
|
`netstat`: proba reala e interogarea din pasul 4.
|
||||||
|
|
||||||
## 2. Aliasul TNS
|
## 2. Aliasul TNS
|
||||||
|
|
||||||
`D:\ROA\instantclient_19_18\tnsnames.ora` (si `instantclient_11_2_0_2` pentru driverul ODBC pe
|
`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`:
|
32 de biti). Aliasurile care merg prin tunel arata spre `127.0.0.1`:
|
||||||
|
|
||||||
```
|
```
|
||||||
VENDING =
|
VENDING =
|
||||||
(DESCRIPTION =
|
(DESCRIPTION =
|
||||||
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521)))
|
(ADDRESS_LIST = (ADDRESS = (PROTOCOL = tcp)(HOST = 127.0.0.1)(PORT = 1521)))
|
||||||
(CONNECT_DATA = (SERVICE_NAME = XEPDB1))
|
(CONNECT_DATA = (SERVICE_NAME = XEPDB1))
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
Pentru `sqlplus` trebuie `TNS_ADMIN` setat pe folderul care contine `tnsnames.ora`:
|
Pentru `sqlplus` trebuie `TNS_ADMIN` setat pe folderul care contine `tnsnames.ora`:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18'
|
$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18'
|
||||||
```
|
```
|
||||||
|
|
||||||
## 3. DSN-ul ODBC
|
## 3. DSN-ul ODBC
|
||||||
|
|
||||||
Aplicatia nu foloseste TNS direct: `oConn.Connect(tcHost, tcUser, tcPassword)`
|
Aplicatia nu foloseste TNS direct: `oConn.Connect(tcHost, tcUser, tcPassword)`
|
||||||
(`oproceduri_comune.prg`) construieste `dsn=<tcHost>;Uid=...;Pwd=...` - deci **`tcHost` e un nume
|
(`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),
|
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`.
|
deci in `HKLM\SOFTWARE\WOW6432Node\ODBC\ODBC.INI`, cu driverul din `instantclient_11_2_0_2`.
|
||||||
|
|
||||||
Listare rapida:
|
Listare rapida:
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
Get-ChildItem 'HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBC.INI' |
|
Get-ChildItem 'HKLM:\SOFTWARE\WOW6432Node\ODBC\ODBC.INI' |
|
||||||
Select-Object -ExpandProperty PSChildName
|
Select-Object -ExpandProperty PSChildName
|
||||||
```
|
```
|
||||||
|
|
||||||
De obicei DSN-ul are acelasi nume cu aliasul TNS (`VENDING`, `CENTRAL`, `ROA_CENTRAL`...).
|
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
|
Administrare vizuala: `C:\Windows\SysWOW64\odbcad32.exe` (**nu** cel din `System32`, acela e pe
|
||||||
64 de biti si nu vede DSN-urile VFP).
|
64 de biti si nu vede DSN-urile VFP).
|
||||||
|
|
||||||
## 4. Interogare si verificare
|
## 4. Interogare si verificare
|
||||||
|
|
||||||
```powershell
|
```powershell
|
||||||
$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18'
|
$env:TNS_ADMIN = 'D:\ROA\instantclient_19_18'
|
||||||
& 'D:\ROA\instantclient_19_18\sqlplus.exe' -S -L '<schema>/<parola>@VENDING' '@script.sql'
|
& '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
|
`-L` = o singura incercare de login (nu reincearca la parola gresita). **Foloseste-l intotdeauna
|
||||||
pe productie.**
|
pe productie.**
|
||||||
|
|
||||||
Prima interogare, mereu, ca sa stii unde ai nimerit:
|
Prima interogare, mereu, ca sa stii unde ai nimerit:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;
|
select user || ' @ ' || sys_context('USERENV','DB_NAME') from dual;
|
||||||
```
|
```
|
||||||
|
|
||||||
Pentru extragere in fisier, `spool` scrie **local**, nu pe server:
|
Pentru extragere in fisier, `spool` scrie **local**, nu pe server:
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
set pagesize 0 feedback off heading off linesize 100 trimspool on termout off
|
set pagesize 0 feedback off heading off linesize 100 trimspool on termout off
|
||||||
spool D:\cale\locala\iesire.txt
|
spool D:\cale\locala\iesire.txt
|
||||||
select ...;
|
select ...;
|
||||||
spool off
|
spool off
|
||||||
```
|
```
|
||||||
|
|
||||||
**Capcana PowerShell**: intr-un here-string cu ghilimele duble (`@"..."@`) PowerShell expandeaza
|
**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`
|
`$`. 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 interogarea intoarce 0 randuri **fara nicio eroare**. Foloseste here-string cu apostrof
|
||||||
(`@'...'@`) si inlocuieste caile printr-un token.
|
(`@'...'@`) si inlocuieste caile printr-un token.
|
||||||
|
|
||||||
**Capcana `termout off`**: ascunde si mesajele de eroare. Daca fisierul spool iese gol, ruleaza
|
**Capcana `termout off`**: ascunde si mesajele de eroare. Daca fisierul spool iese gol, ruleaza
|
||||||
din nou fara `termout off` inainte sa banuiesti datele.
|
din nou fara `termout off` inainte sa banuiesti datele.
|
||||||
|
|
||||||
## Schemele cunoscute (fara parole)
|
## Schemele cunoscute (fara parole)
|
||||||
|
|
||||||
| Tunel / profil | Alias TNS + DSN | Schema Oracle |
|
| Tunel / profil | Alias TNS + DSN | Schema Oracle |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
| `vending.tlp` | `VENDING` | `vending` |
|
| `vending.tlp` | `VENDING` | **`VENDING`** (parola standard ROA) |
|
||||||
| conpress | `ROA_CONPRESS` | `xenoti` |
|
| conpress | `ROA_CONPRESS` | `xenoti` |
|
||||||
|
|
||||||
Restul aliasurilor din `tnsnames.ora` (`ROA_CENTRAL`, `CENTRAL105`, `ROA_TEST`, ...) sunt retea
|
Profilele Bitvise sunt in **`D:\roa\BITVISE\`** pe statia curenta (`vending.tlp`, `conpress.tlp`,
|
||||||
interna si nu au nevoie de tunel.
|
`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`
|
||||||
## Reguli pe productie
|
(`TNS_ADMIN` se seteaza pe el). `VENDING` este Oracle 18c XE, serviciu `XEPDB1`.
|
||||||
|
|
||||||
1. **Doar `SELECT`.** Fara `INSERT`/`UPDATE`/`DELETE`/DDL, fara `ALTER SESSION` care schimba
|
Masuratoare read-only rulata pe `VENDING` la 03.09.2026: `ROACONT\docs\cercetare\piata_ai_2026_09\`
|
||||||
comportament persistent. Daca ai nevoie de date de lucru, extrage-le si lucreaza local.
|
(`BACKTEST_VENDING.md` plus scripturile din `sql\bt_*.sql`).
|
||||||
2. **Fara ghicit parole** - vezi avertismentul de la inceput.
|
|
||||||
3. **Interogari marginite**: `fetch first N rows only`, si evita scanarile complete pe tabele
|
Restul aliasurilor din `tnsnames.ora` (`ROA_CENTRAL`, `CENTRAL105`, `ROA_TEST`, ...) sunt retea
|
||||||
mari in orele de lucru.
|
interna si nu au nevoie de tunel.
|
||||||
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
|
## Reguli pe productie
|
||||||
`utile\Teste\cache_anaf\codes_*_reale.txt`). Denumirile de parteneri, adresele, soldurile
|
|
||||||
**nu** - nu le comite.
|
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.
|
||||||
## De unde vin loturile de coduri fiscale pentru teste
|
2. **Fara ghicit parole** - vezi avertismentul de la inceput.
|
||||||
|
3. **Interogari marginite**: `fetch first N rows only`, si evita scanarile complete pe tabele
|
||||||
`COMUN\utile\Teste\cache_anaf\codes_1000_reale.txt` a fost extras din productia `vending`, tabela
|
mari in orele de lucru.
|
||||||
`nom_parteneri` (23932 randuri, 6382 coduri romanesti distincte):
|
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
|
||||||
```sql
|
`utile\Teste\cache_anaf\codes_*_reale.txt`). Denumirile de parteneri, adresele, soldurile
|
||||||
select cif from (
|
**nu** - nu le comite.
|
||||||
select distinct regexp_replace(upper(trim(cod_fiscal)), '[^0-9]', '') as cif
|
|
||||||
from nom_parteneri
|
## De unde vin loturile de coduri fiscale pentru teste
|
||||||
where cod_fiscal is not null
|
|
||||||
and regexp_like(upper(trim(cod_fiscal)), '^(RO)?[[:space:]]*[0-9]{2,10}$')
|
`COMUN\utile\Teste\cache_anaf\codes_1000_reale.txt` a fost extras din productia `vending`, tabela
|
||||||
) where length(cif) between 2 and 10
|
`nom_parteneri` (23932 randuri, 6382 coduri romanesti distincte):
|
||||||
order by ora_hash(cif)
|
|
||||||
fetch first 1000 rows only;
|
```sql
|
||||||
```
|
select cif from (
|
||||||
|
select distinct regexp_replace(upper(trim(cod_fiscal)), '[^0-9]', '') as cif
|
||||||
`order by ora_hash(cif)` da o dispersie **deterministica** (aceeasi de fiecare data), spre
|
from nom_parteneri
|
||||||
deosebire de `dbms_random`; ordonarea crescuta dupa cod ar fi inclinat lotul spre firme vechi,
|
where cod_fiscal is not null
|
||||||
deci spre Bucuresti. Suprapunere cu lotul mai vechi de 200: 8 coduri.
|
and regexp_like(upper(trim(cod_fiscal)), '^(RO)?[[:space:]]*[0-9]{2,10}$')
|
||||||
|
) where length(cif) between 2 and 10
|
||||||
Folosire in proba end-to-end ANAF:
|
order by ora_hash(cif)
|
||||||
|
fetch first 1000 rows only;
|
||||||
```powershell
|
```
|
||||||
$env:E2E_CODURI = 'D:\ROA\ROADEF\COMUN\utile\Teste\cache_anaf\codes_1000_reale.txt'
|
|
||||||
$env:E2E_LIMITA = '1000'
|
`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'
|
||||||
|
```
|
||||||
|
|||||||
@@ -105,3 +105,14 @@
|
|||||||
la incarcare. Propui rezultatul, nu rescrii din oficiu; nu pierzi nicio regula/capcana, doar
|
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,
|
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).
|
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.
|
||||||
|
|||||||
@@ -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.
|
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)
|
||||||
|
|||||||
Reference in New Issue
Block a user