# 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?**