321 lines
8.3 KiB
Markdown
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?**
|