8.3 KiB
8.3 KiB
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:
- Antwort-Entwurf (zur Freigabe durch Admin)
- Mietvertrag-Entwurf (PDF, mit Platzhaltern)
- 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
- Antwort-Entwurf freigeben/bearbeiten
- Vertrag anpassen (falls nötig)
- 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:
// 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: truecontractSignedAt: DateTimestatus: 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
DriverAvailabilityEintrag: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
// 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
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
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
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)
// app/api/cron/check-contracts/route.ts
// Prüft unterschriebene Verträge → sendet Auftragsbestätigung
Job 2: E-Mail-Synchronisation (alle 5 Min)
// app/api/cron/sync-emails/route.ts
// IMAP → neue Anfragen → KI-Analyse
Job 3: LexOffice-Sync (alle 30 Min)
// 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 triggernGET /api/bookings/[id]/ai-draft- Antwort-Entwurf abrufen
Freigabe-Workflow
POST /api/bookings/[id]/release-to-drivers- Admin gibt freiGET /api/bookings/open-for-drivers- Fahrer-Portal Ansicht
Fahrer-Verfügbarkeit
POST /api/bookings/[id]/availability- Fahrer meldet VerfügbarkeitGET /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 erstellenPOST /api/lexoffice/create-confirmation- AuftragsbestätigungGET /api/lexoffice/invoice/[id]- Rechnung abrufen
UI-Komponenten (benötigt)
Admin-Dashboard
- Neue Anfragen (Status: RESERVED + aiParsed)
- Freizugebende Buchungen (Status: READY_FOR_ASSIGNMENT)
- Offene Zuweisungen (Status: OPEN_FOR_DRIVERS)
- Aktive Touren (Status: ASSIGNED)
Fahrer-Portal
- Verfügbare Events (Status: OPEN_FOR_DRIVERS)
- Meine Verfügbarkeiten (DriverAvailability Liste)
- 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?