# ROA2WEB Telegram Bot > **Architecture:** Ultrathin Monolith — bot rulează ca background task în backend-ul unificat pe portul 8000. > Vezi `docs/telegram/DEPLOYMENT.md` pentru cerința single-worker. ## Overview Botul Telegram ROA2WEB oferă acces la sistemul ERP financiar prin comenzi simple și procesare bonuri fiscale prin OCR. ### Funcționalități principale - **Autentificare** prin cod de legătură (Deep Link / QR Code / Manual) - **Date financiare**: dashboard, facturi, trezorerie, sold clienți/furnizori - **Bonuri fiscale**: trimite PDF sau fotografie → OCR → preview → salvare în Oracle --- ## Arhitectură Modulul este integrat în monolitul unificat: ``` backend/modules/telegram/ ├── agent/ │ └── session.py # Gestionare sesiune (firma activă) ├── api/ │ └── client.py # HTTP client pentru ROA2WEB backend ├── auth/ │ ├── email_auth.py │ └── linking.py # Legare cont Oracle ↔ Telegram ├── bot/ │ ├── handlers.py # Handlere comenzi (/dashboard, /facturi, etc.) │ ├── formatters.py # Formatare răspunsuri Markdown │ ├── keyboards.py # Taste inline │ ├── helpers.py │ └── menus.py ├── db/ │ ├── database.py # SQLite — schemă și conexiune │ └── operations.py # CRUD operații ├── handlers/ │ └── receipt_handlers.py # Procesare bonuri fiscale (OCR flow) ├── routers/ │ ├── auth_codes.py │ └── internal_api.py # FastAPI endpoint pentru backend callbacks └── bot_main.py # Punct intrare bot (ApplicationBuilder) ``` ### Flux date — Bonuri fiscale ``` User trimite PDF/foto ↓ handle_document_message() / handle_photo_message() ↓ submit_ocr_job() → OCR Worker Pool (docTR + pypdfium2) ↓ wait_for_result() — polling până la 120s ↓ _format_receipt_preview() → mesaj Telegram cu butoane Confirmă/Anulează ↓ handle_receipt_callback() → confirm ↓ _resolve_schema() → CONTAFIN_ORACLE.v_nom_firme (schema firmei active) ↓ _save_to_oracle() → write_receipt() → PACK_CONTAFIN (COD din seq_cod.nextval) ↓ "✅ Bon salvat! Cod document: XXXXXXX" ``` ### Flux date — Comenzi financiare ``` User → Comandă Telegram → handlers.py → API client → Backend API → Oracle DB → Formater → User ``` --- ## Setup ### Configurare `.env` ```bash # backend/.env sau backend/.env.test MODULE_TELEGRAM_ENABLED=true TELEGRAM_BOT_TOKEN=your_bot_token_from_botfather ``` ### Pornire ```bash ./start.sh prod # Pornește tot (backend + frontend + bot) ./start.sh test # Mod test (conexiune Oracle directă, fără SSH tunnel) ``` Botul pornește automat ca background task când `MODULE_TELEGRAM_ENABLED=true`. > **Important:** Backend-ul trebuie rulat cu `--workers 1`. Vezi `docs/telegram/DEPLOYMENT.md`. --- ## Comenzi disponibile | Comandă | Descriere | |---------|-----------| | `/start [cod]` | Pornire bot sau legare cont cu cod 8 caractere | | `/help` | Afișează comenzile disponibile | | `/companies` | Lista firme accesibile | | `/selectcompany [nume]` | Selectează firma activă | | `/dashboard` | Dashboard financiar pentru firma activă | | `/sold` | Sold (alias `/dashboard`) | | `/facturi [filtru]` | Facturi (filtre: `neplatite`, `platite`) | | `/trezorerie` | Date trezorerie (casă + bancă) | | `/clear` | Șterge selecția firmei active | | `/unlink` | Deconectează contul Telegram de la Oracle | ### Bonuri fiscale (fără comandă explicită) Trimite direct un **fișier PDF** sau o **fotografie** a bonului fiscal → botul pornește automat fluxul OCR. --- ## Autentificare ### Metoda 1: Deep Link (recomandat) 1. Login în aplicația ROA2WEB → `/telegram` 2. Click "Generează Cod" 3. Click "🚀 Deschide în Telegram" → Telegram se deschide cu codul pre-completat 4. Gata — cont legat în ~30 secunde ### Metoda 2: QR Code (cross-device) 1. Login pe desktop → `/telegram` → "Generează Cod" 2. Scanează QR Code-ul afișat cu Telegram pe mobil 3. Gata ### Metoda 3: Manual 1. Login → `/telegram` → "Generează Cod" → copiază codul 2. Trimite codul la bot (ex: `ABC123XY`) **Detalii tehnice:** - Cod 8 caractere, valabil 15 minute - Backend salvează codul via `POST /internal/save-code` - Bot verifică codul și leagă conturile în SQLite - User primește JWT token --- ## Bonuri fiscale — detalii tehnice ### OCR Pipeline - **Engine principal:** docTR (CPU-only, fără NVIDIA/CUDA) - **PDF decode:** pypdfium2 (fallback când poppler-utils nu e instalat) - **Profil fallback:** GENERIC când CUI-ul furnizorului nu are profil dedicat - **Timeout OCR:** 120 secunde - **Pending TTL:** 600 secunde (bon în așteptare expiră după 10 minute) ### Scriere Oracle - COD unic generat din `seq_cod.nextval` (nu MAX+1 — evită race conditions) - Conexiunea se face AS schema owner (nu read user) — cerut de `PACK_CONTAFIN` care folosește `SESSION_USER` în SQL dinamic - Pool per `(server_id, schema)` — fiecare schemă Oracle are propriul connection pool - 3 linii contabile per bon: cheltuială (6x/401), TVA (4426/401), plată (401/5311 sau 401/5121) ### Câmpuri extrase de OCR → preview Telegram | Câmp OCR | Afișat în preview | |----------|-------------------| | `partner_name` | Furnizor | | `cui` | CUI furnizor | | `receipt_date` | Data | | `receipt_number` | Nr. bon | | `amount` | Total RON | | `tva_total` | TVA RON | --- ## Teste ```bash # Toate testele modulului Telegram pytest backend/modules/telegram/tests/ -v # Teste cu DB live Oracle ORACLE_INTEGRATION_USER=MARIUSM_AUTO \ PASSWORD=ROMFASTSOFT \ DSN=10.0.20.121:1521/ROA \ pytest backend/modules/telegram/tests/ -v # Doar testele E2E (necesită DB) pytest backend/modules/telegram/tests/test_e2e_receipt_flow.py -v ``` **Stare teste (la merge):** 48 pass + 2 skipped (real DB, rulează cu env vars). --- ## Troubleshooting ### Botul nu răspunde - Verifică log: `tail -f /tmp/unified_backend_test.log` - Verifică `MODULE_TELEGRAM_ENABLED=true` în `.env` - Backend rulează cu `--workers 1`? ### OCR eșuat / timeout - Worker pool se pre-warmează la pornire (~11 secunde) - Dacă modifici `ocr_worker_process.py`, restart complet necesar (`./start.sh test stop && ./start.sh test`) — uvicorn --reload nu reîncarcă procesele separate ### Oracle write eșuat - `ORA-01017`: credențiale incorecte — verifică `backend/secrets/.oracle_pass` - `ORA-00001`: bon duplicat (constraint unique) - `ORA-28000`: user Oracle blocat — prea multe login-uri eșuate; DBA trebuie să deblocheze - **Nu schimba** `secrets/*.oracle_pass` cât botul rulează — provoacă spam failed logins → ORA-28000 ### SSH Tunnel warnings (inofensive în test) ``` [SSH-MONITOR] [vending] FAIL — Restart failed (code 1) ``` Normal în modul test dacă `sshpass` nu e instalat. Nu afectează funcționalitatea.