import sqlite3 import os from datetime import datetime DB_PATH = "./data/tickets.db" def _conn() -> sqlite3.Connection: os.makedirs("./data", exist_ok=True) return sqlite3.connect(DB_PATH) def init_db() -> None: with _conn() as db: db.execute(""" CREATE TABLE IF NOT EXISTS tickets ( id TEXT PRIMARY KEY, user_id INTEGER, username TEXT, chat_id INTEGER, chantier TEXT, description TEXT, produit TEXT, status TEXT DEFAULT 'ouvert', created_at TEXT, resolved_at TEXT, cause TEXT, solution TEXT, duree_min INTEGER ) """) def _next_id() -> str: year = datetime.now().year with _conn() as db: row = db.execute( "SELECT COUNT(*) FROM tickets WHERE id LIKE ?", (f"{year}-%",) ).fetchone() n = (row[0] if row else 0) + 1 return f"{year}-{n:03d}" def creer_ticket(user_id: int, username: str, chat_id: int, chantier: str, description: str, produit: str = "") -> str: ticket_id = _next_id() with _conn() as db: db.execute( "INSERT INTO tickets (id, user_id, username, chat_id, chantier, description, produit, created_at) " "VALUES (?, ?, ?, ?, ?, ?, ?, ?)", (ticket_id, user_id, username, chat_id, chantier, description, produit, datetime.now().isoformat()), ) return ticket_id def get_ticket(ticket_id: str) -> dict | None: with _conn() as db: db.row_factory = sqlite3.Row row = db.execute("SELECT * FROM tickets WHERE id = ?", (ticket_id,)).fetchone() return dict(row) if row else None def resoudre_ticket(ticket_id: str, cause: str, solution: str, duree_min: int) -> bool: with _conn() as db: r = db.execute( "UPDATE tickets SET status='resolu', resolved_at=?, cause=?, solution=?, duree_min=? WHERE id=?", (datetime.now().isoformat(), cause, solution, duree_min, ticket_id), ) return r.rowcount > 0 def tickets_ouverts() -> list[dict]: with _conn() as db: db.row_factory = sqlite3.Row rows = db.execute( "SELECT * FROM tickets WHERE status='ouvert' ORDER BY created_at DESC" ).fetchall() return [dict(r) for r in rows]