Spaces:
Sleeping
Sleeping
| """ | |
| tools/db_tool.py — SQLite Başvuru Yazma Aracı | |
| AGENTIC PATTERN: Tool Use — Least-Privilege | |
| ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ | |
| LLM doğrudan veritabanına erişemez. Orchestrator bu tool'u çağırır. | |
| TCKN ve hassas veriler maskelenmiş haliyle yazılır. | |
| Sadece submission_agent bu tool'a erişebilir (least-privilege). | |
| """ | |
| import sqlite3 | |
| import uuid | |
| from datetime import datetime | |
| from langchain_core.tools import tool | |
| from config import DB_PATH | |
| def init_db(): | |
| """Uygulama başlarken tabloları oluştur (yoksa).""" | |
| conn = sqlite3.connect(DB_PATH) | |
| conn.execute(""" | |
| CREATE TABLE IF NOT EXISTS applications ( | |
| id TEXT PRIMARY KEY, | |
| session_id TEXT, | |
| vehicle_type TEXT, | |
| created_at TEXT, | |
| -- Yeni araç alanları | |
| invoice_amount REAL, | |
| vehicle_model TEXT, | |
| requested_amount_new REAL, | |
| guarantor_tckn_masked TEXT, | |
| -- 2. el alanları | |
| kasko_value REAL, | |
| vehicle_age INTEGER, | |
| requested_amount_used REAL, | |
| seller_tckn_masked TEXT, | |
| -- Meta | |
| status TEXT DEFAULT 'pending' | |
| ) | |
| """) | |
| conn.execute(""" | |
| CREATE TABLE IF NOT EXISTS audit_events ( | |
| id TEXT PRIMARY KEY, | |
| session_id TEXT, | |
| timestamp TEXT, | |
| event_type TEXT, | |
| agent TEXT, | |
| details TEXT, | |
| masked_input TEXT | |
| ) | |
| """) | |
| conn.execute(""" | |
| CREATE TABLE IF NOT EXISTS hgs_registrations ( | |
| id TEXT PRIMARY KEY, | |
| application_id TEXT, | |
| session_id TEXT, | |
| created_at TEXT, | |
| status TEXT DEFAULT 'active' | |
| ) | |
| """) | |
| conn.commit() | |
| conn.close() | |
| def write_application( | |
| session_id: str, | |
| vehicle_type: str, | |
| invoice_amount: float | None = None, | |
| vehicle_model: str | None = None, | |
| requested_amount_new: float | None = None, | |
| guarantor_tckn_masked: str | None = None, | |
| kasko_value: float | None = None, | |
| vehicle_age: int | None = None, | |
| requested_amount_used: float | None = None, | |
| seller_tckn_masked: str | None = None, | |
| ) -> dict: | |
| """ | |
| Onaylanmış başvuruyu veritabanına yazar. | |
| Returns: | |
| {"success": bool, "application_id": str, "error": str | None} | |
| """ | |
| app_id = str(uuid.uuid4())[:8].upper() # Kısa, okunabilir başvuru no | |
| try: | |
| conn = sqlite3.connect(DB_PATH) | |
| conn.execute( | |
| """INSERT INTO applications VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?)""", | |
| ( | |
| app_id, session_id, vehicle_type, | |
| datetime.utcnow().isoformat(), | |
| invoice_amount, vehicle_model, requested_amount_new, guarantor_tckn_masked, | |
| kasko_value, vehicle_age, requested_amount_used, seller_tckn_masked, | |
| "pending", | |
| ), | |
| ) | |
| conn.commit() | |
| conn.close() | |
| return {"success": True, "application_id": app_id, "error": None} | |
| except Exception as e: | |
| return {"success": False, "application_id": None, "error": str(e)} | |
| def get_application_history(session_id: str) -> dict: | |
| """Bir oturumun geçmiş başvurularını listeler.""" | |
| conn = sqlite3.connect(DB_PATH) | |
| rows = conn.execute( | |
| "SELECT id, vehicle_type, created_at, status FROM applications WHERE session_id=? ORDER BY created_at DESC", | |
| (session_id,), | |
| ).fetchall() | |
| conn.close() | |
| return {"applications": [{"id": r[0], "type": r[1], "date": r[2], "status": r[3]} for r in rows]} | |