Initial commit - SaveTheMoment Atlas Basis-Setup
This commit is contained in:
320
WORKFLOW-KI-BUCHUNG.md
Normal file
320
WORKFLOW-KI-BUCHUNG.md
Normal file
@@ -0,0 +1,320 @@
|
||||
# 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?**
|
||||
Reference in New Issue
Block a user