Files
Atlas/WORKFLOW-KI-BUCHUNG.md
2025-11-12 20:21:32 +01:00

321 lines
8.3 KiB
Markdown

# Automatisierter Buchungs-Workflow mit KI-Unterstützung
## Workflow-Übersicht
```
Kundenanfrage → KI-Analyse → Admin-Bearbeitung → Vertragsunterzeichnung
→ Auto-Bestätigung → Admin-Freigabe → Fahrer-Verfügbarkeit → Admin-Zuteilung → Tour
```
---
## Phase 1: Eingehende Anfrage
### 1.1 Anfrage-Eingang
- **Quelle**: E-Mail (IMAP-Synchronisation)
- **Status**: `RESERVED` (Buchung wird automatisch erstellt)
### 1.2 KI-Analyse (GPT-4)
**Extrahiert aus E-Mail:**
- Kundendaten (Name, E-Mail, Telefon, Adresse)
- Event-Details (Datum, Uhrzeit, Ort, Dauer)
- Fotobox-Modell (falls angegeben)
- Besondere Wünsche
**Generiert automatisch:**
1. **Antwort-Entwurf** (zur Freigabe durch Admin)
2. **Mietvertrag-Entwurf** (PDF, mit Platzhaltern)
3. **Angebot über LexOffice API** (Rechnung-Entwurf)
### 1.3 Status nach KI-Analyse
- Buchung: `RESERVED` + `aiParsed: true`
- E-Mail-Entwurf gespeichert
- Vertrag-Entwurf generiert
- LexOffice-Angebot erstellt (ID gespeichert)
---
## Phase 2: Admin-Bearbeitung
### 2.1 Admin prüft Vorschläge
**Dashboard zeigt:**
- ✅ KI-extrahierte Daten
- ✅ Antwort-Entwurf
- ✅ Vertrag-PDF (Vorschau)
- ✅ LexOffice-Angebot (Link)
### 2.2 Admin-Aktionen
1. **Antwort-Entwurf freigeben/bearbeiten**
2. **Vertrag anpassen** (falls nötig)
3. **Button "Anfrage bestätigen & senden"**
### 2.3 Was passiert beim Senden?
- E-Mail mit Antwort + Vertrag-Link wird versendet
- Vertrag-Status: `contractGenerated: true`
- LexOffice-Angebot: Status "Gesendet"
- Buchung-Status: `RESERVED``CONFIRMED`
---
## Phase 3: Vertragsunterzeichnung
### 3.1 Kunde unterschreibt
**2 Möglichkeiten:**
- **Digital**: Online-Formular mit Signatur-Feld
- **Analog**: PDF herunterladen, unterschreiben, hochladen
### 3.2 Automatische Prüfung (Cron-Job)
**Läuft alle 15 Minuten:**
```javascript
// Prüft alle CONFIRMED Buchungen
if (booking.contractSigned === true && booking.contractSignedAt !== null) {
// 1. Auftragsbestätigung generieren (LexOffice API)
// 2. Auftragsbestätigung per E-Mail senden
// 3. Buchung für Admin freigeben
// 4. Status: CONFIRMED → READY_FOR_ASSIGNMENT
}
```
### 3.3 Status-Update
- `contractSigned: true`
- `contractSignedAt: DateTime`
- `status: READY_FOR_ASSIGNMENT` (neue Status-Option!)
- LexOffice: Auftragsbestätigung generiert & versendet
---
## Phase 4: Admin-Freigabe für Fahrer
### 4.1 Admin sieht neue Buchungen
**Dashboard-Ansicht "Freizugebende Buchungen":**
- Filter: `status === READY_FOR_ASSIGNMENT`
- Anzeige: Event-Details, Datum, Ort, Fotobox
### 4.2 Admin gibt frei
- Button "Für Fahrer freigeben"
- Status: `READY_FOR_ASSIGNMENT``OPEN_FOR_DRIVERS`
- Benachrichtigung an alle verfügbaren Fahrer (optional)
---
## Phase 5: Fahrer-Verfügbarkeit
### 5.1 Fahrer-Portal
**Fahrer sehen:**
- Alle Buchungen mit `status === OPEN_FOR_DRIVERS`
- Filter nach Datum, Ort, Zeitraum
### 5.2 Fahrer meldet Verfügbarkeit
- Button "Ich bin verfügbar für diesen Event"
- Erstellt `DriverAvailability` Eintrag:
```prisma
model DriverAvailability {
id String @id @default(cuid())
bookingId String
booking Booking @relation(...)
driverId String
driver User @relation(...)
available Boolean @default(true)
createdAt DateTime @default(now())
}
```
### 5.3 Status
- Buchung bleibt `OPEN_FOR_DRIVERS`
- Mehrere Fahrer können sich melden
---
## Phase 6: Admin-Zuteilung
### 6.1 Admin sieht verfügbare Fahrer
**Dashboard-Ansicht:**
- Buchung mit Status `OPEN_FOR_DRIVERS`
- Liste aller Fahrer, die sich gemeldet haben
- Fahrer-Info: Name, Bewertung, letzte Touren
### 6.2 Admin weist Fahrer zu
- Dropdown: Fahrer auswählen
- Button "Fahrer zuweisen & Tour erstellen"
### 6.3 Automatische Tour-Erstellung
```javascript
// 1. Tour erstellen
const tour = await prisma.tour.create({
data: {
tourDate: booking.eventDate,
tourNumber: generateTourNumber(),
driverId: selectedDriverId,
status: 'PLANNED',
},
});
// 2. Buchung zu Tour zuordnen
await prisma.booking.update({
where: { id: bookingId },
data: {
tourId: tour.id,
status: 'ASSIGNED',
},
});
// 3. Benachrichtigung an Fahrer
await sendDriverNotification(selectedDriverId, tour);
```
---
## Neue Datenbank-Modelle (benötigt)
### 1. DriverAvailability
```prisma
model DriverAvailability {
id String @id @default(cuid())
bookingId String
booking Booking @relation(fields: [bookingId], references: [id], onDelete: Cascade)
driverId String
driver User @relation(fields: [driverId], references: [id], onDelete: Cascade)
available Boolean @default(true)
createdAt DateTime @default(now())
@@unique([bookingId, driverId])
@@index([bookingId])
@@index([driverId])
}
```
### 2. Erweiterte Booking-Status
```prisma
enum BookingStatus {
RESERVED // Initial (nach E-Mail-Eingang)
CONFIRMED // Admin hat bestätigt & gesendet
READY_FOR_ASSIGNMENT // Vertrag unterschrieben → Admin-Freigabe
OPEN_FOR_DRIVERS // Admin hat freigegeben → Fahrer können sich melden
ASSIGNED // Admin hat Fahrer zugewiesen & Tour erstellt
COMPLETED // Event abgeschlossen
CANCELLED // Storniert
}
```
### 3. Zusätzliche Booking-Felder
```prisma
model Booking {
// ... bestehende Felder
// KI-Analyse
aiParsed Boolean @default(false)
aiResponseDraft String? @db.Text
aiProcessedAt DateTime?
// Freigabe-Status
readyForAssignment Boolean @default(false)
openForDrivers Boolean @default(false)
// Fahrer-Verfügbarkeit
driverAvailability DriverAvailability[]
// LexOffice Auftragsbestätigung
lexofficeConfirmationId String?
confirmationSentAt DateTime?
}
```
---
## Automatisierungs-Jobs (Cron)
### Job 1: Vertragsprüfung (alle 15 Min)
```typescript
// app/api/cron/check-contracts/route.ts
// Prüft unterschriebene Verträge → sendet Auftragsbestätigung
```
### Job 2: E-Mail-Synchronisation (alle 5 Min)
```typescript
// app/api/cron/sync-emails/route.ts
// IMAP → neue Anfragen → KI-Analyse
```
### Job 3: LexOffice-Sync (alle 30 Min)
```typescript
// app/api/cron/sync-lexoffice/route.ts
// Synchronisiert Zahlungsstatus, Rechnungen, etc.
```
---
## API-Endpunkte (benötigt)
### KI-Analyse
- `POST /api/bookings/[id]/ai-analyze` - KI-Analyse triggern
- `GET /api/bookings/[id]/ai-draft` - Antwort-Entwurf abrufen
### Freigabe-Workflow
- `POST /api/bookings/[id]/release-to-drivers` - Admin gibt frei
- `GET /api/bookings/open-for-drivers` - Fahrer-Portal Ansicht
### Fahrer-Verfügbarkeit
- `POST /api/bookings/[id]/availability` - Fahrer meldet Verfügbarkeit
- `GET /api/bookings/[id]/available-drivers` - Liste verfügbarer Fahrer
### Fahrer-Zuteilung
- `POST /api/bookings/[id]/assign-driver` - Admin weist zu & erstellt Tour
### LexOffice-Integration
- `POST /api/lexoffice/create-offer` - Angebot erstellen
- `POST /api/lexoffice/create-confirmation` - Auftragsbestätigung
- `GET /api/lexoffice/invoice/[id]` - Rechnung abrufen
---
## UI-Komponenten (benötigt)
### Admin-Dashboard
1. **Neue Anfragen** (Status: RESERVED + aiParsed)
2. **Freizugebende Buchungen** (Status: READY_FOR_ASSIGNMENT)
3. **Offene Zuweisungen** (Status: OPEN_FOR_DRIVERS)
4. **Aktive Touren** (Status: ASSIGNED)
### Fahrer-Portal
1. **Verfügbare Events** (Status: OPEN_FOR_DRIVERS)
2. **Meine Verfügbarkeiten** (DriverAvailability Liste)
3. **Zugewiesene Touren** (Meine Tours)
---
## Nächste Schritte
### Phase 1: Datenbank erweitern
- [ ] BookingStatus-Enum erweitern
- [ ] DriverAvailability Model hinzufügen
- [ ] Booking-Felder für KI & Freigabe
- [ ] Migration durchführen
### Phase 2: KI-Integration
- [ ] OpenAI API anbinden
- [ ] E-Mail-Parser mit GPT-4
- [ ] Antwort-Generator
- [ ] Vertrag-Generator
### Phase 3: LexOffice-Integration
- [ ] API-Client erstellen
- [ ] Angebots-Erstellung
- [ ] Auftragsbestätigungs-Erstellung
- [ ] Webhook für Zahlungsstatus
### Phase 4: Workflow-UI
- [ ] Admin: KI-Entwürfe prüfen
- [ ] Admin: Freigabe-Dashboard
- [ ] Fahrer: Verfügbarkeits-Portal
- [ ] Admin: Zuweisungs-Interface
### Phase 5: Automatisierung
- [ ] Cron-Job: Vertragsprüfung
- [ ] Cron-Job: E-Mail-Sync
- [ ] Cron-Job: LexOffice-Sync
- [ ] Benachrichtigungs-System
---
**Möchten Sie mit der Implementierung beginnen? Welcher Teil soll zuerst umgesetzt werden?**