# Datenmodell (Phase 1 — Definition, keine Migration)

An Vento (`Customer`/`Case`/`Message`, SQLAlchemy) und Case Intake (`cases.db`)
angelehnt, damit spätere Zusammenführung ohne Umbau möglich ist.
Speicherung in Phase 1: eigene SQLite-Datei im Projektverzeichnis (nur Text).

| Entität | Kernfelder |
|---|---|
| **CallSession** | id, caller_id→Caller, started_at, ended_at, duration_s, channel (`phone`/`test`), state (CallState), language, escalation_status, consent_status |
| **Caller** | id, phone_number (E.164, unique), name, salutation, location, known_customer (bool), created_at, last_contact |
| **Intent** | id, session_id, label (`neue_anfrage`, `feuchte_schimmel`, `lueftung`, `klima`, `wartung`, `rueckruf`, `bestandskunde`, `reklamation`, `spam`, `unklar`), confidence, classified_at |
| **Language** | code (`de`/`es`/`en`), source (`dtmf`/`detected`), confidence |
| **CapturedInfo** | session_id, slot (`name`/`callback_number`/`ort`/`thema`/`dauer`/`zeitfenster`), value, confirmed (bool) |
| **RiskFlag** | session_id, type (RiskFlagType, s. src/telefon_agent/states.py), raised_at, agent_response (`standardsatz`/`handoff`) |
| **CallbackRequest** | session_id, preferred_time_window, urgency (`akut`/`normal`/`unklar`), status (`offen`/`erledigt`) |
| **HumanSummary** | session_id, text (3–6 Sätze für den Rückrufer), created_at, delivered_to (`case_intake`/`queue`/`test`) |
| **Transcript** | session_id, turn_no, speaker (`caller`/`agent`), text, timestamp — **nur Text, kein Audio** |
| **ConsentStatus** | session_id, announced (bool), objected (bool), timestamp |
| **EscalationStatus** | session_id, level (`none`/`callback`/`sofort_handoff`), reason |

## Mapping für spätere Integration

| Telefon-Agent | Vento | Case Intake |
|---|---|---|
| Caller | Customer (phone_number, consent_given) | — |
| CallbackRequest + HumanSummary | Case (category, urgency, report) | cases.db (Fall) |
| Transcript | Message | — |
| ConsentStatus | Customer.consent_given/-timestamp | — |

## Aufbewahrung (Vorschlag)

Transcript: 30 Tage, danach nur HumanSummary. RiskFlags/Statistik: aggregiert.
Kein Audio in keiner Phase.
