Files
Atlas/PHASE2-COMPLETE.md
2025-11-12 20:21:32 +01:00

7.0 KiB

Phase 2: Buchungsverwaltung & E-Mail-Integration - ABGESCHLOSSEN

Übersicht

Phase 2 erweitert das SaveTheMoment Atlas System um vollständige Buchungsverwaltung und automatische E-Mail-Integration mit Ninjaforms.

Fertiggestellte Features

1. Manuelle Buchungserstellung

  • Formular unter /dashboard/bookings/new
  • Vollständige Datenerfassung (Kunde, Event, Preise, Optionen)
  • Automatische Buchungsnummer-Generierung (STM-YYMM-XXXX)
  • Verfügbarkeitsprüfung für Fotoboxen
  • Unterscheidung zwischen Privat- und Firmenrechnung

Dateien:

  • app/dashboard/bookings/new/page.tsx
  • components/NewBookingForm.tsx
  • app/api/bookings/create/route.ts

2. Buchungsdetails & Statusverwaltung

  • Detailansicht unter /dashboard/bookings/[id]
  • Status-Änderungen (Reserviert → Bestätigt → Abgeschlossen)
  • Inline-Bearbeitung von Kundendaten
  • Anzeige zugewiesener Fotobox
  • E-Mail-Verlauf
  • Vertragsinfo

Dateien:

  • app/dashboard/bookings/[id]/page.tsx
  • components/BookingDetail.tsx
  • app/api/bookings/[id]/route.ts
  • app/api/bookings/[id]/status/route.ts

3. Buchungsübersicht

  • Tabelle mit Filterung (Status, Standort, Suche)
  • Statistik-Dashboard (Gesamt, Reserviert, Bestätigt, Abgeschlossen)
  • Links zu Detail- und Bearbeitungsseiten
  • Farbcodierte Status-Badges

Dateien:

  • app/dashboard/bookings/page.tsx
  • components/BookingsTable.tsx

4. E-Mail-Parser für Ninjaforms

  • Flexibles Parsing für alle 5 Standorte
  • Extraktion aller Buchungsdaten aus E-Mails
  • HTML und Text-Format Unterstützung
  • Automatische Standort-Erkennung
  • Modell-Mapping (Vintage SMILE, FOTO, Nostalgie, Magic Mirror)

Dateien:

  • lib/email-parser.ts

5. IMAP E-Mail-Synchronisation

  • Abruf ungelesener E-Mails (letzte 30 Tage)
  • Speicherung in Email-Tabelle
  • Duplikat-Erkennung via Message-ID
  • Automatische Buchungserstellung aus geparsten E-Mails
  • Benachrichtigungen für neue Buchungen

Dateien:

  • lib/email-sync.ts
  • app/api/email-sync/route.ts

6. E-Mail-Konfiguration pro Standort

  • IMAP-Einstellungen (Server, Port, Benutzer, Passwort, SSL/TLS)
  • SMTP-Einstellungen (für zukünftige Nutzung)
  • Aktivierung/Deaktivierung pro Standort
  • Timestamp des letzten Syncs

Dateien:

  • components/LocationsManager.tsx
  • app/dashboard/locations/page.tsx
  • app/api/locations/[id]/email-settings/route.ts

7. Manuelle Sync-Funktion

  • Button "E-Mails abrufen" in Standortverwaltung
  • Zeigt Anzahl neuer E-Mails und Buchungen
  • Spinner-Animation während Sync
  • Nur sichtbar für aktivierte Standorte

Dateien:

  • components/LocationsManager.tsx (erweitert)

8. Automatische E-Mail-Synchronisation (Cron)

  • API-Endpoint /api/cron/email-sync
  • Authentifizierung via Bearer Token
  • Synchronisiert alle aktiven Standorte
  • Detaillierte Statistiken und Fehlerprotokoll
  • Vercel Cron Integration

Dateien:

  • app/api/cron/email-sync/route.ts
  • vercel.json
  • CRON-SETUP.md (Dokumentation)

Datenbank-Änderungen

Email-Tabelle

model Email {
  id          String    @id @default(cuid())
  locationSlug String
  from        String
  to          String
  subject     String
  textBody    String    @db.Text
  htmlBody    String?   @db.Text
  messageId   String?   @unique
  inReplyTo   String?
  bookingId   String?
  booking     Booking?  @relation(fields: [bookingId], references: [id])
  parsed      Boolean   @default(false)
  parsedData  Json?
  direction   String    @default("INBOUND")
  receivedAt  DateTime
  createdAt   DateTime  @default(now())
  
  @@index([locationSlug])
  @@index([bookingId])
  @@index([receivedAt])
}

Location-Tabelle (erweitert)

model Location {
  // ... existing fields
  
  // E-Mail-Konfiguration
  imapHost        String?
  imapPort        Int?
  imapUser        String?
  imapPassword    String?
  imapSecure      Boolean   @default(true)
  
  smtpHost        String?
  smtpPort        Int?
  smtpUser        String?
  smtpPassword    String?
  smtpSecure      Boolean   @default(true)
  
  emailSyncEnabled Boolean  @default(false)
  lastEmailSync   DateTime?
}

Workflow: E-Mail zu Buchung

  1. E-Mail-Eingang: Kunde füllt Ninjaforms-Formular auf WordPress-Site aus
  2. E-Mail-Versand: WordPress sendet E-Mail an info@fotobox-[standort].de
  3. IMAP-Sync:
    • Cron-Job (alle 15 Min.) oder manuelle Auslösung
    • Abruf ungelesener E-Mails
    • Speicherung in Email-Tabelle
  4. Parsing:
    • Erkennung als Ninjaforms-E-Mail
    • Extraktion aller Buchungsdaten
    • Standort-Erkennung
  5. Buchungserstellung:
    • Suche nach verfügbarer Fotobox
    • Generierung Buchungsnummer
    • Erstellung Booking-Record
    • Status: RESERVED
  6. Benachrichtigung:
    • Notification für Admins
    • Verknüpfung E-Mail ↔ Booking

Nächste Schritte (Phase 3)

Noch zu implementieren:

  1. PDF-Vertragsgenerierung

    • Template für Mietvertrag
    • Automatisches Ausfüllen mit Buchungsdaten
    • Download und E-Mail-Versand
  2. Lexoffice-Integration

    • Angebot erstellen
    • Rechnung erstellen
    • Zahlungsstatus synchronisieren
  3. Driver/Tour-Management

    • Tourplanung und Zuweisung
    • Navigation für Fahrer
    • Routenoptimierung (Zeit & Entfernung)
    • Lieferstatus-Updates
  4. E-Mail-Versand (SMTP)

    • Buchungsbestätigung an Kunde
    • Erinnerungen
    • Vertrag per E-Mail
  5. Dashboard-Erweiterungen

    • Kalenderansicht
    • Auslastungsstatistik
    • Umsatzreports

Testing-Checkliste

Bevor IMAP-Zugangsdaten konfiguriert werden:

  • Lokale Entwicklungsumgebung läuft
  • Datenbank migriert und gefüllt
  • Alle Standorte in DB vorhanden
  • Manual Booking Creation funktioniert
  • Booking Detail View funktioniert
  • Status Changes funktionieren
  • Bookings Table mit Filtern funktioniert

Nach IMAP-Konfiguration:

  • E-Mail-Einstellungen speichern
  • Manueller Sync-Button testen
  • Erste echte E-Mail abrufen
  • Parsing prüfen (parsedData in Email-Tabelle)
  • Booking-Erstellung prüfen
  • Notification prüfen
  • Cron-Endpoint testen

Bekannte Einschränkungen

  1. E-Mail-Sicherheit: Passwörter werden derzeit im Klartext in DB gespeichert → Verschlüsselung empfohlen für Produktion
  2. Ninjaforms-Varianten: Parser ist flexibel, aber möglicherweise müssen Feldnamen angepasst werden
  3. Duplicate Detection: Funktioniert nur mit Message-ID (nicht alle Mail-Server setzen diese)
  4. Error Handling: Bei Parsing-Fehlern wird E-Mail gespeichert, aber keine Buchung erstellt (manuell nachbearbeiten)

Umgebungsvariablen

DATABASE_URL="postgresql://..."
NEXTAUTH_SECRET="..."
NEXTAUTH_URL="http://localhost:3000"
CRON_SECRET="..." # Für automatische Sync

Deployment

  1. PostgreSQL-Datenbank bereitstellen
  2. Umgebungsvariablen in Vercel setzen
  3. Projekt deployen
  4. CRON_SECRET in Vercel Environment Variables
  5. Vercel Cron aktiviert sich automatisch durch vercel.json
  6. IMAP-Zugangsdaten pro Standort in UI konfigurieren

Status: Phase 2 abgeschlossen
Datum: 2025-11-11
Nächste Phase: PDF-Vertragsgenerierung & Lexoffice-Integration