Initial commit - SaveTheMoment Atlas Basis-Setup
This commit is contained in:
359
WORKFLOW-AUTOMATION-PLAN.md
Normal file
359
WORKFLOW-AUTOMATION-PLAN.md
Normal file
@@ -0,0 +1,359 @@
|
||||
# 🚀 Automatisierter Buchungs-Workflow - Implementierungsplan
|
||||
|
||||
**Datum**: 2025-11-12
|
||||
**Ziel**: Vollautomatischer Workflow von E-Mail-Eingang bis Kalender-Reservierung
|
||||
|
||||
---
|
||||
|
||||
## 🔄 GEWÜNSCHTER WORKFLOW
|
||||
|
||||
### Phase 1: E-Mail-Eingang → KI-Analyse
|
||||
```
|
||||
E-Mail kommt rein
|
||||
↓
|
||||
KI extrahiert automatisch:
|
||||
- Kundendaten
|
||||
- Event-Details
|
||||
- Gewünschtes Datum
|
||||
↓
|
||||
System erstellt:
|
||||
- Angebot-Entwurf (LexOffice)
|
||||
- Mietvertrag-Entwurf (PDF)
|
||||
- E-Mail-Antwort-Entwurf (GPT-4)
|
||||
↓
|
||||
Status: PENDING_REVIEW (Wartet auf Admin-Freigabe)
|
||||
```
|
||||
|
||||
### Phase 2: Admin-Review im Dashboard
|
||||
```
|
||||
Dashboard zeigt: "Offene Anfragen" (Queue)
|
||||
↓
|
||||
Admin öffnet Anfrage und sieht:
|
||||
- ✅ KI-generierte E-Mail (Vorschau)
|
||||
- ✅ Angebot-PDF (Vorschau)
|
||||
- ✅ Mietvertrag-PDF (Vorschau)
|
||||
- ✅ Extrahierte Daten
|
||||
↓
|
||||
Admin prüft und klickt:
|
||||
- [✓ Korrektur vornehmen] (optional)
|
||||
- [✓ Senden] (alles in einem Rutsch)
|
||||
```
|
||||
|
||||
### Phase 3: Automatischer Versand
|
||||
```
|
||||
System sendet gleichzeitig:
|
||||
1. E-Mail an Kunden (mit Anhängen):
|
||||
- Angebot (PDF)
|
||||
- Mietvertrag (PDF)
|
||||
- Personalisierte Nachricht
|
||||
2. Erstellt Kalender-Eintrag:
|
||||
- Reservierung im Format: "[KUNDE] - [ORT] - [PHOTOBOX]"
|
||||
- Synchronisiert mit Plesk-Kalender
|
||||
3. Status-Update:
|
||||
- RESERVED (Warte auf Vertrag)
|
||||
```
|
||||
|
||||
### Phase 4: Vertragsrücklauf & Bestätigung
|
||||
```
|
||||
Kunde unterschreibt Vertrag
|
||||
↓
|
||||
Cron-Job prüft:
|
||||
- Hochgeladenen Vertrag (signiert)
|
||||
- Oder Online-Signatur
|
||||
↓
|
||||
System erstellt automatisch:
|
||||
- LexOffice Auftragsbestätigung
|
||||
- Bestätigungs-E-Mail an Kunden
|
||||
- Kalender-Update: RESERVED → CONFIRMED
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📅 KALENDER-INTEGRATION
|
||||
|
||||
### Option 1: CalDAV-Synchronisation (Empfohlen)
|
||||
```
|
||||
SaveTheMoment Atlas (DB)
|
||||
↓
|
||||
CalDAV Server (z.B. ownCloud/Nextcloud)
|
||||
↓
|
||||
Plesk Kalender (liest über CalDAV)
|
||||
```
|
||||
|
||||
**Vorteile**:
|
||||
- Bidirektionale Sync
|
||||
- Standard-Protokoll
|
||||
- Konflikt-Erkennung
|
||||
|
||||
**Implementierung**:
|
||||
```typescript
|
||||
// lib/calendar-sync.ts
|
||||
import { CalDAVClient } from 'tsdav';
|
||||
|
||||
class CalendarService {
|
||||
async createReservation(booking: Booking) {
|
||||
const event = {
|
||||
summary: `${booking.customerName} - ${booking.eventCity} - ${booking.photobox.model}`,
|
||||
dtstart: booking.eventDate,
|
||||
dtend: booking.setupTimeLatest,
|
||||
location: `${booking.eventAddress}, ${booking.eventZip} ${booking.eventCity}`,
|
||||
description: `Buchungsnr: ${booking.bookingNumber}\\nFotobox: ${booking.photobox.serialNumber}`,
|
||||
};
|
||||
|
||||
await caldavClient.createCalendarObject({
|
||||
calendar: this.calendar,
|
||||
filename: `${booking.bookingNumber}.ics`,
|
||||
data: this.generateICS(event),
|
||||
});
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Option 2: iCal-Export (Einfacher, aber manuell)
|
||||
```
|
||||
SaveTheMoment Atlas
|
||||
↓
|
||||
Generiert .ics Datei
|
||||
↓
|
||||
Download-Link für Admin
|
||||
↓
|
||||
Manueller Import in Plesk-Kalender
|
||||
```
|
||||
|
||||
**Vorteile**:
|
||||
- Einfache Implementierung
|
||||
- Keine Extra-Software
|
||||
|
||||
**Nachteile**:
|
||||
- Kein automatischer Sync
|
||||
- Manueller Schritt notwendig
|
||||
|
||||
### Option 3: Google Calendar API (Flexibel)
|
||||
```
|
||||
SaveTheMoment Atlas
|
||||
↓
|
||||
Google Calendar API
|
||||
↓
|
||||
Shared Calendar (von Plesk abrufbar)
|
||||
```
|
||||
|
||||
**Vorteile**:
|
||||
- API vorhanden
|
||||
- Echtzeit-Updates
|
||||
- Kann mit Plesk synchronisiert werden
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ BENÖTIGTE ÄNDERUNGEN
|
||||
|
||||
### 1. Neuer Booking-Status-Flow
|
||||
```typescript
|
||||
// Aktuell:
|
||||
RESERVED → CONFIRMED → COMPLETED
|
||||
|
||||
// Neu:
|
||||
AI_PENDING → REVIEW_PENDING → RESERVED → CONTRACT_PENDING → CONFIRMED → COMPLETED
|
||||
|
||||
// Zusätzliche Stati:
|
||||
- AI_PENDING: KI analysiert gerade
|
||||
- REVIEW_PENDING: Wartet auf Admin-Freigabe
|
||||
- CONTRACT_PENDING: Wartet auf unterschriebenen Vertrag
|
||||
```
|
||||
|
||||
### 2. Neue Datenbank-Felder
|
||||
```prisma
|
||||
model Booking {
|
||||
// ... existing fields
|
||||
|
||||
// Workflow-Status
|
||||
aiDraftReady Boolean @default(false)
|
||||
adminReviewedAt DateTime?
|
||||
adminReviewedBy String?
|
||||
|
||||
// E-Mail-Entwurf
|
||||
emailDraft String? // GPT-4 generierter Text
|
||||
emailDraftApproved Boolean @default(false)
|
||||
|
||||
// Dokument-Entwürfe
|
||||
quotationDraftUrl String? // LexOffice PDF Preview
|
||||
contractDraftUrl String? // Mietvertrag PDF Preview
|
||||
|
||||
// Versand-Status
|
||||
documentsSentAt DateTime?
|
||||
documentsSentTo String?
|
||||
|
||||
// Kalender-Sync
|
||||
calendarEventId String? // CalDAV Event ID
|
||||
calendarSynced Boolean @default(false)
|
||||
calendarSyncedAt DateTime?
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Neue API-Endpunkte
|
||||
```
|
||||
POST /api/bookings/[id]/approve-and-send
|
||||
→ Admin klickt "Senden"
|
||||
→ Sendet E-Mail + PDFs
|
||||
→ Erstellt Kalender-Eintrag
|
||||
→ Update Status
|
||||
|
||||
GET /api/admin/pending-reviews
|
||||
→ Liste aller Anfragen mit aiDraftReady=true
|
||||
→ Für Dashboard-Queue
|
||||
|
||||
POST /api/bookings/[id]/calendar-sync
|
||||
→ Synchronisiert Buchung mit Kalender
|
||||
→ Nutzt CalDAV oder Google Calendar API
|
||||
|
||||
POST /api/cron/process-pending-bookings
|
||||
→ Neue Cron-Job
|
||||
→ Prüft E-Mails
|
||||
→ Startet KI-Analyse
|
||||
→ Erstellt Entwürfe
|
||||
```
|
||||
|
||||
### 4. Neues Dashboard-Widget: "Offene Anfragen"
|
||||
```tsx
|
||||
// components/PendingReviewsQueue.tsx
|
||||
export default function PendingReviewsQueue() {
|
||||
const [pendingBookings, setPendingBookings] = useState([]);
|
||||
|
||||
return (
|
||||
<div className="bg-gray-800 p-6 rounded-xl">
|
||||
<h2>📋 Offene Anfragen ({pendingBookings.length})</h2>
|
||||
|
||||
{pendingBookings.map(booking => (
|
||||
<div key={booking.id} className="border-b py-4">
|
||||
<div className="flex justify-between">
|
||||
<div>
|
||||
<h3>{booking.customerName}</h3>
|
||||
<p>{booking.eventCity} · {formatDate(booking.eventDate)}</p>
|
||||
</div>
|
||||
<button onClick={() => openReview(booking.id)}>
|
||||
Prüfen →
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
```
|
||||
|
||||
### 5. Review-Modal (Admin-Prüfung)
|
||||
```tsx
|
||||
// components/BookingReviewModal.tsx
|
||||
<Modal open={showReview}>
|
||||
<h2>Anfrage prüfen: {booking.customerName}</h2>
|
||||
|
||||
<Tabs>
|
||||
<Tab label="E-Mail-Entwurf">
|
||||
<EmailPreview content={booking.emailDraft} />
|
||||
<button onClick={editEmail}>Bearbeiten</button>
|
||||
</Tab>
|
||||
|
||||
<Tab label="Angebot">
|
||||
<PDFPreview url={booking.quotationDraftUrl} />
|
||||
</Tab>
|
||||
|
||||
<Tab label="Mietvertrag">
|
||||
<PDFPreview url={booking.contractDraftUrl} />
|
||||
</Tab>
|
||||
|
||||
<Tab label="Kundendaten">
|
||||
<CustomerDataForm data={booking} onEdit={handleEdit} />
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<div className="flex gap-4">
|
||||
<button onClick={handleReject}>Ablehnen</button>
|
||||
<button onClick={handleEdit}>Korrigieren</button>
|
||||
<button onClick={handleApproveAndSend} className="bg-green-600">
|
||||
✓ Prüfen & Senden
|
||||
</button>
|
||||
</div>
|
||||
</Modal>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⏱️ IMPLEMENTIERUNGS-ZEITPLAN
|
||||
|
||||
### Sprint 1: Workflow-Basis (2-3 Tage)
|
||||
- [ ] Neue Booking-Stati hinzufügen
|
||||
- [ ] DB-Migration für neue Felder
|
||||
- [ ] API: `/api/admin/pending-reviews`
|
||||
- [ ] Dashboard-Widget: "Offene Anfragen"
|
||||
|
||||
### Sprint 2: Auto-Generierung (3-4 Tage)
|
||||
- [ ] Cron-Job: E-Mail-Prüfung + KI-Analyse
|
||||
- [ ] Auto-Generierung: Angebot-Entwurf (LexOffice)
|
||||
- [ ] Auto-Generierung: Vertrag-Entwurf (PDF)
|
||||
- [ ] Auto-Generierung: E-Mail-Antwort (GPT-4)
|
||||
|
||||
### Sprint 3: Admin-Review-UI (2-3 Tage)
|
||||
- [ ] Review-Modal mit Tabs
|
||||
- [ ] PDF-Preview-Komponenten
|
||||
- [ ] E-Mail-Editor (falls Korrektur nötig)
|
||||
- [ ] "Approve & Send" Funktion
|
||||
|
||||
### Sprint 4: Automatischer Versand (2 Tage)
|
||||
- [ ] API: `/api/bookings/[id]/approve-and-send`
|
||||
- [ ] E-Mail-Versand mit Anhängen (Angebot + Vertrag)
|
||||
- [ ] Status-Update nach Versand
|
||||
|
||||
### Sprint 5: Kalender-Integration (3-4 Tage)
|
||||
- [ ] CalDAV-Client implementieren
|
||||
- [ ] Oder: Google Calendar API
|
||||
- [ ] Oder: iCal-Export
|
||||
- [ ] Plesk-Kalender-Anbindung konfigurieren
|
||||
- [ ] Bidirektionale Synchronisation
|
||||
|
||||
### Sprint 6: Testing & Optimierung (2 Tage)
|
||||
- [ ] End-to-End-Tests
|
||||
- [ ] Performance-Optimierung
|
||||
- [ ] Fehlerbehandlung
|
||||
- [ ] Admin-Schulung
|
||||
|
||||
**Gesamt-Aufwand**: ~14-19 Tage (3-4 Wochen)
|
||||
|
||||
---
|
||||
|
||||
## 🔐 KALENDER-OPTIONEN: ENTSCHEIDUNGSMATRIX
|
||||
|
||||
| Kriterium | CalDAV | iCal Export | Google Calendar |
|
||||
|-----------|--------|-------------|-----------------|
|
||||
| **Auto-Sync** | ✅ Ja | ❌ Nein | ✅ Ja |
|
||||
| **Plesk-kompatibel** | ✅ Ja | ✅ Ja | ⚠️ Indirekt |
|
||||
| **Implementierungs-Aufwand** | 🟡 Mittel | 🟢 Gering | 🟡 Mittel |
|
||||
| **Konflikt-Erkennung** | ✅ Ja | ❌ Nein | ✅ Ja |
|
||||
| **Kosten** | 🟢 Kostenlos | 🟢 Kostenlos | 🟢 Kostenlos |
|
||||
| **Empfehlung** | ⭐⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
|
||||
|
||||
**Empfehlung**: **CalDAV**, falls Plesk CalDAV unterstützt. Sonst: **Google Calendar API**.
|
||||
|
||||
---
|
||||
|
||||
## ❓ NÄCHSTE SCHRITTE
|
||||
|
||||
### Fragen an dich:
|
||||
|
||||
1. **Kalender-System**:
|
||||
- Welches Kalender-System nutzt ihr aktuell in Plesk?
|
||||
- Unterstützt es CalDAV?
|
||||
- Oder soll ich Google Calendar API nutzen?
|
||||
|
||||
2. **E-Mail-Versand**:
|
||||
- Über welchen SMTP-Server sollen die Entwürfe versendet werden?
|
||||
- Sind die SMTP-Einstellungen schon in den Locations hinterlegt?
|
||||
|
||||
3. **Priorität**:
|
||||
- Was ist wichtiger: Kalender-Sync oder Auto-Workflow?
|
||||
- Soll ich mit dem Auto-Workflow (Sprint 1-4) starten?
|
||||
|
||||
4. **Testing**:
|
||||
- Soll ich zuerst einen kleinen Prototyp bauen zum Testen?
|
||||
|
||||
---
|
||||
|
||||
**Status**: Planung abgeschlossen, warte auf deine Entscheidungen! 🎯
|
||||
Reference in New Issue
Block a user