264 lines
7.7 KiB
Markdown
264 lines
7.7 KiB
Markdown
# Analiză: Telegram/WhatsApp → roa2web → Contabilitate ROA
|
|
|
|
**Data:** 2026-02-03
|
|
**Status:** Analiză tehnică actualizată după review cod
|
|
**Tags:** @work @project
|
|
|
|
---
|
|
|
|
## TL;DR
|
|
|
|
Integrare canale messaging (Telegram/WhatsApp) cu roa2web pentru import documente în contabilitatea ROA. OCR prin Doctr (cost zero, local). Flux cu aprobare contabil.
|
|
|
|
**UPDATE:** După analiza codului, roa2web are deja:
|
|
- ✅ OCR complet (Doctr + PaddleOCR + Tesseract)
|
|
- ✅ API `/api/data-entry/ocr/extract` funcțional
|
|
- ✅ Bot Telegram pentru dashboard/facturi/sold
|
|
- ❌ **LIPSEȘTE:** Handler fișiere în bot Telegram
|
|
- ❌ **LIPSEȘTE:** PDF text layer extraction (optimizare pentru Adobe Scan)
|
|
|
|
---
|
|
|
|
## 1. Ce Există Deja
|
|
|
|
### roa2web
|
|
- **OCR:** Doctr (local, gratuit, rezultate bune)
|
|
- **Storage:** SQLite local (bonuri procesate)
|
|
- **API:** FastAPI endpoints
|
|
|
|
### Clawdbot
|
|
- **Canale:** Telegram ✅, WhatsApp ✅, Discord ✅
|
|
- **Capabilități:** Primire fișiere, rutare, răspuns
|
|
|
|
### ROA (ERP)
|
|
- **DB:** Oracle
|
|
- **Contabilitate:** Module existente pentru intrări/facturi
|
|
|
|
---
|
|
|
|
## 2. Ce Lipsește (Gap Analysis)
|
|
|
|
| Component | Status | Ce trebuie |
|
|
|-----------|--------|------------|
|
|
| Telegram → roa2web | ❌ | Endpoint webhook sau polling |
|
|
| WhatsApp → roa2web | ❌ | Endpoint webhook sau polling |
|
|
| roa2web → Oracle | ❌ | API salvare în contabilitate |
|
|
| Workflow aprobare | ❌ | UI contabil + status draft/approved |
|
|
|
|
---
|
|
|
|
## 3. Arhitectură Propusă
|
|
|
|
```
|
|
┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
|
│ Telegram │ │ │ │ │ │ │
|
|
│ WhatsApp │────▶│ Clawdbot │────▶│ roa2web │────▶│ ROA Oracle │
|
|
└─────────────┘ │ (Bridge) │ │ (OCR+API) │ │ (Contab) │
|
|
└─────────────┘ └─────────────┘ └─────────────┘
|
|
│ │ │
|
|
▼ ▼ ▼
|
|
• Primește fișier • Doctr OCR • Salvare draft
|
|
• Forward la API • Extrage date • Aprobare contabil
|
|
• Răspuns user • Validare • Înregistrare finală
|
|
```
|
|
|
|
---
|
|
|
|
## 4. Opțiuni Implementare
|
|
|
|
### Opțiunea A: Clawdbot ca Bridge (RECOMANDAT)
|
|
|
|
**Flux:**
|
|
1. User trimite bon pe Telegram/WhatsApp
|
|
2. Clawdbot detectează fișier, îl descarcă
|
|
3. Clawdbot trimite fișierul la `roa2web/api/upload`
|
|
4. roa2web procesează cu Doctr, returnează JSON
|
|
5. Clawdbot trimite răspuns user: "Bon procesat: Mega Image, 45.50 RON"
|
|
6. roa2web salvează draft în Oracle (status: pending)
|
|
7. Contabil vede în UI, aprobă → status: approved
|
|
|
|
**Pro:**
|
|
- Folosește Clawdbot existent
|
|
- Nu modifică roa2web prea mult
|
|
- Flexibilitate pe canale
|
|
|
|
**Contra:**
|
|
- Clawdbot trebuie să știe să ruteze fișiere
|
|
|
|
**Efort:** 8-12 ore
|
|
|
|
### Opțiunea B: Webhook Direct în roa2web
|
|
|
|
**Flux:**
|
|
1. Telegram/WhatsApp webhook direct la roa2web
|
|
2. roa2web procesează și salvează
|
|
3. roa2web trimite răspuns înapoi pe canal
|
|
|
|
**Pro:**
|
|
- Mai direct, fără intermediar
|
|
|
|
**Contra:**
|
|
- Trebuie implementat handler pentru fiecare canal
|
|
- Duplicare logică cu Clawdbot
|
|
|
|
**Efort:** 15-20 ore
|
|
|
|
### Opțiunea C: Shared Folder / Email
|
|
|
|
**Flux:**
|
|
1. User trimite pe canal → Clawdbot salvează în folder
|
|
2. roa2web monitorizează folder, procesează automat
|
|
|
|
**Pro:**
|
|
- Simplu, decuplat
|
|
|
|
**Contra:**
|
|
- Fără feedback instant la user
|
|
- Polling inefficient
|
|
|
|
**Efort:** 4-6 ore
|
|
|
|
---
|
|
|
|
## 5. Recomandare: Opțiunea A (Clawdbot Bridge)
|
|
|
|
### 5.1 Ce trebuie în Clawdbot
|
|
|
|
```python
|
|
# Pseudo-cod: handler pentru fișiere pe Telegram/WhatsApp
|
|
async def on_file_received(channel, file, user):
|
|
# 1. Descarcă fișierul
|
|
local_path = await download_file(file)
|
|
|
|
# 2. Trimite la roa2web
|
|
response = await http_post(
|
|
"https://roa2web.romfast.ro/api/ocr/process",
|
|
files={"file": open(local_path, "rb")},
|
|
data={"user_id": user.id, "source": channel}
|
|
)
|
|
|
|
# 3. Răspuns la user
|
|
if response.ok:
|
|
data = response.json()
|
|
await reply(f"✅ Procesat: {data['furnizor']}, {data['total']} RON")
|
|
else:
|
|
await reply("❌ Eroare procesare. Încearcă din nou.")
|
|
```
|
|
|
|
### 5.2 Ce trebuie în roa2web
|
|
|
|
**Endpoint nou:** `POST /api/ocr/process`
|
|
- Primește fișier (PDF/imagine)
|
|
- Procesează cu Doctr (existent)
|
|
- Salvează în SQLite (existent) + Oracle (NOU)
|
|
- Returnează JSON cu datele extrase
|
|
|
|
**Endpoint nou:** `POST /api/contabilitate/save-draft`
|
|
- Primește datele extrase
|
|
- Creează înregistrare draft în Oracle
|
|
- Status: pending_approval
|
|
|
|
**Endpoint nou:** `POST /api/contabilitate/approve/{id}`
|
|
- Contabil aprobă
|
|
- Status: approved → înregistrare finală
|
|
|
|
### 5.3 UI Contabil (opțional, faza 2)
|
|
|
|
- Lista documente pending
|
|
- Preview date extrase vs. imagine originală
|
|
- Buton Approve / Reject / Edit
|
|
|
|
---
|
|
|
|
## 6. Integrare Oracle - Detalii
|
|
|
|
### Ce tabele în ROA?
|
|
|
|
**Întrebare pentru Marius:**
|
|
- Unde se salvează intrările de marfă/bonuri în Oracle?
|
|
- Ce câmpuri sunt obligatorii?
|
|
- Există API/proceduri Oracle existente pentru insert?
|
|
|
|
### Propunere structură draft
|
|
|
|
```sql
|
|
-- Tabel nou pentru documente OCR pending
|
|
CREATE TABLE roa_ocr_drafts (
|
|
id NUMBER PRIMARY KEY,
|
|
source VARCHAR2(20), -- 'telegram', 'whatsapp'
|
|
user_id VARCHAR2(50),
|
|
file_path VARCHAR2(500),
|
|
extracted_data CLOB, -- JSON cu datele OCR
|
|
status VARCHAR2(20), -- 'pending', 'approved', 'rejected'
|
|
created_at TIMESTAMP,
|
|
approved_by VARCHAR2(50),
|
|
approved_at TIMESTAMP,
|
|
roa_document_id NUMBER -- FK la documentul creat în ROA după aprobare
|
|
);
|
|
```
|
|
|
|
---
|
|
|
|
## 7. Plan Implementare
|
|
|
|
### Faza 1: Conectare canale (3-4 ore)
|
|
- [ ] Clawdbot: handler fișiere Telegram
|
|
- [ ] Clawdbot: handler fișiere WhatsApp
|
|
- [ ] Forward la roa2web API
|
|
|
|
### Faza 2: roa2web API (4-6 ore)
|
|
- [ ] Endpoint `/api/ocr/process` (extinde existent)
|
|
- [ ] Returnare JSON standardizat
|
|
- [ ] Logging și error handling
|
|
|
|
### Faza 3: Salvare Oracle (4-6 ore)
|
|
- [ ] Conexiune Oracle din roa2web (cx_Oracle/oracledb)
|
|
- [ ] Tabel `roa_ocr_drafts`
|
|
- [ ] Endpoint `/api/contabilitate/save-draft`
|
|
|
|
### Faza 4: Aprobare (2-3 ore)
|
|
- [ ] Endpoint `/api/contabilitate/approve`
|
|
- [ ] Notificare user după aprobare
|
|
|
|
### Faza 5: UI Contabil (opțional, 4-8 ore)
|
|
- [ ] Pagină listare drafts
|
|
- [ ] Aprobare/respingere din UI
|
|
|
|
---
|
|
|
|
## 8. Estimare Totală
|
|
|
|
| Fază | Ore | Cine |
|
|
|------|-----|------|
|
|
| Conectare canale | 3-4 | Echo (Clawdbot config) |
|
|
| roa2web API | 4-6 | Marius + Claude |
|
|
| Salvare Oracle | 4-6 | Marius (cunoaște schema) |
|
|
| Aprobare | 2-3 | Marius + Claude |
|
|
| **Total MVP** | **13-19 ore** | |
|
|
| UI Contabil (opț.) | 4-8 | Marius |
|
|
|
|
**Cost:** 0 RON (Doctr local, fără API externe)
|
|
|
|
---
|
|
|
|
## 9. Întrebări pentru Marius
|
|
|
|
1. **Schema Oracle:** În ce tabel/modul se salvează bonurile în contabilitate?
|
|
2. **Câmpuri obligatorii:** Ce date TREBUIE să existe pentru o înregistrare validă?
|
|
3. **Contabil:** Cine aprobă? Un singur user sau mai mulți?
|
|
4. **Notificări:** Contabilul vrea notificare când vine ceva nou? (email/Telegram?)
|
|
5. **roa2web deploy:** Unde rulează? Are acces la Oracle-ul de producție?
|
|
|
|
---
|
|
|
|
## 10. Următorul Pas
|
|
|
|
Când ai 30 min, hai să:
|
|
1. Clarificăm schema Oracle pentru bonuri
|
|
2. Verificăm dacă roa2web poate conecta la Oracle
|
|
3. Facem un test: Telegram → Clawdbot → roa2web → JSON response
|
|
|
|
---
|
|
|
|
*Analiză generată de Echo • 2026-02-03*
|