Skip to content

eventVIA -- Event-Management

In Entwicklung

eventVIA ist geplant, läuft aber noch nicht produktiv. Diese Seite beschreibt das Soll-Bild des Moduls. Verfügbarkeit: TBA. Bei Interesse: Kontakt aufnehmen.

eventVIA ist das Event-Management-Modul von VIA. Es ermöglicht dir, Kurse, Veranstaltungen und Termine zu verwalten, inklusive Buchungen, Wartelisten und Zahlungsabwicklung über Stripe.

API Endpoints

Alle Endpoints erfordern Authentifizierung (authMiddleware). Basis-Pfad: /api/events.

MethodPfadFunktionBeschreibung
POST/api/eventscreateEventEvent erstellen
GET/api/eventslistEventsEvents auflisten (mit Filtern)
GET/api/events/:idgetEventEvent-Detail mit Live-Stats
PUT/api/events/:idupdateEventEvent aktualisieren
DELETE/api/events/:iddeleteEventEvent löschen (nur draft/cancelled)
PATCH/api/events/:id/statuschangeStatusEvent-Status ändern
GET/api/events/:id/bookingslistBookingsBuchungen eines Events auflisten
POST/api/events/:id/bookingscreateBookingBuchung erstellen
DELETE/api/events/:eventId/bookings/:bookingIdcancelBookingBuchung stornieren
PATCH/api/events/:eventId/bookings/:bookingId/statusupdateBookingStatusBooking-Status ändern

Filter für GET /api/events

ParameterTypBeschreibung
statusstringFiltert nach Event-Status (draft, selling, waitlist, completed, cancelled)
from_datedateEvents ab diesem Datum
to_datedateEvents bis zu diesem Datum
bot_iduuidEvents eines bestimmten Bots

Pflichtfelder für POST /api/events

  • title (string, max 200 Zeichen)
  • event_date (date)
  • capacity_total (integer)

Pflichtfelder für POST /api/events/:id/bookings

  • contact_id (uuid)

Optional: channel (default: manual), metadata (object).

Datenbank-Schema

Tabelle: events

26 Spalten mit CHECK Constraints für status und payment_model.

SpalteTypNullableDefaultBeschreibung
iduuidNOT NULLgen_random_uuid()Primaerschlüssel
tenant_iduuidNOT NULL--Mandanten-ID (FK tenants)
bot_iduuidNULL--Zugeordneter Bot (FK bots, ON DELETE SET NULL)
created_byuuidNULL--Ersteller (FK users, ON DELETE SET NULL)
titlevarchar(200)NOT NULL--Event-Titel
descriptiontextNULL--Beschreibung
locationvarchar(500)NULL--Veranstaltungsort
image_urlvarchar(1000)NULL--Bild-URL
event_datedateNOT NULL--Veranstaltungsdatum
event_time_starttimeNULL--Startzeit
event_time_endtimeNULL--Endzeit
booking_deadlinetimestamptzNULL--Buchungsschluss
capacity_totalintegerNOT NULL0Gesamtkapazitaet
capacity_bookedintegerNOT NULL0Aktuell gebucht
capacity_waitlistintegerNOT NULL0Aktuell auf Warteliste
waitlist_maxintegerNULL--Maximale Wartelisten-Plaetze
pricenumeric(10,2)NOT NULL0Preis
currencyvarchar(3)NOT NULL'EUR'Waehrung
payment_modeltextNOT NULL'free'Zahlungsmodell (CHECK)
deposit_amountnumeric(10,2)NULL--Anzahlungsbetrag
stripe_payment_linkvarchar(500)NULL--Stripe Payment Link
external_payment_urlvarchar(1000)NULL--Externer Zahlungslink
statustextNOT NULL'draft'Event-Status (CHECK)
metadatajsonbNULL'{}'Zusaetzliche Metadaten
created_attimestamptzNOT NULLCURRENT_TIMESTAMPErstellungszeitpunkt
updated_attimestamptzNOT NULLCURRENT_TIMESTAMPLetztes Update

CHECK Constraint events_status_check:status IN ('draft', 'selling', 'waitlist', 'completed', 'cancelled')

CHECK Constraint events_payment_model_check:payment_model IN ('free', 'full_payment', 'deposit', 'external_link')

Indizes:

  • events_pkey -- PRIMARY KEY (id)
  • idx_events_tenant_status -- btree (tenant_id, status)
  • idx_events_date -- btree (event_date)
  • idx_events_bot -- btree (bot_id)

Foreign Keys:

  • tenant_id -> tenants(id) ON DELETE CASCADE
  • bot_id -> bots(id) ON DELETE SET NULL
  • created_by -> users(id) ON DELETE SET NULL

Referenced by:

  • event_bookings.event_id -> events(id) ON DELETE CASCADE
  • campaigns.event_id -> events(id) ON DELETE SET NULL
  • newsletter_campaigns.event_id -> events(id) ON DELETE SET NULL

Tabelle: event_bookings

15 Spalten mit CHECK Constraints für status, payment_status und booking_channel.

SpalteTypNullableDefaultBeschreibung
iduuidNOT NULLgen_random_uuid()Primaerschlüssel
event_iduuidNOT NULL--Event (FK events)
contact_iduuidNOT NULL--Kontakt (FK contacts)
tenant_iduuidNOT NULL--Mandanten-ID (FK tenants)
statustextNOT NULL'confirmed'Buchungsstatus (CHECK)
waitlist_positionintegerNULL--Position auf Warteliste
payment_statustextNOT NULL'not_required'Zahlungsstatus (CHECK)
payment_amountnumeric(10,2)NULL--Bezahlter Betrag
stripe_payment_intent_idvarchar(255)NULL--Stripe PaymentIntent ID
booking_channeltextNOT NULL'manual'Buchungskanal (CHECK)
booked_attimestamptzNULLCURRENT_TIMESTAMPBuchungszeitpunkt
cancelled_attimestamptzNULL--Stornierungszeitpunkt
metadatajsonbNULL'{}'Zusaetzliche Metadaten
created_attimestamptzNOT NULLCURRENT_TIMESTAMPErstellungszeitpunkt
updated_attimestamptzNOT NULLCURRENT_TIMESTAMPLetztes Update

CHECK Constraint event_bookings_status_check:status IN ('confirmed', 'waitlist', 'cancelled', 'attended', 'no_show')

CHECK Constraint event_bookings_payment_status_check:payment_status IN ('not_required', 'pending', 'paid', 'refunded')

CHECK Constraint event_bookings_booking_channel_check:booking_channel IN ('whatsapp', 'voice', 'email', 'manual', 'api')

Indizes:

  • event_bookings_pkey -- PRIMARY KEY (id)
  • idx_event_bookings_event_status -- btree (event_id, status)
  • idx_event_bookings_contact -- btree (contact_id)
  • idx_event_bookings_tenant -- btree (tenant_id)
  • idx_event_bookings_unique_contact -- UNIQUE (event_id, contact_id) WHERE status != 'cancelled'
  • idx_event_bookings_waitlist -- btree (event_id, waitlist_position) WHERE status = 'waitlist'

Foreign Keys:

  • event_id -> events(id) ON DELETE CASCADE
  • contact_id -> contacts(id) ON DELETE CASCADE
  • tenant_id -> tenants(id) ON DELETE CASCADE

Event-Status-Übergaenge

Events durchlaufen einen definierten Lebenszyklus. Nur bestimmte Übergaenge sind erlaubt:

draft ──────> selling ──────> completed
  │              │
  │              ├────> waitlist ──> completed
  │              │         │
  │              │         └──> selling (Plaetze frei geworden)
  │              │
  └──> cancelled <──────────────────┘
VonErlaubte Übergaenge
draftselling, cancelled
sellingwaitlist, completed, cancelled
waitlistselling (Plaetze frei), completed, cancelled
completed-- (Endstatus)
cancelled-- (Endstatus)

Booking-Status-Übergaenge

VonErlaubte Übergaenge
confirmedattended, no_show, cancelled
waitlistconfirmed, cancelled
cancelled-- (Endstatus)
attended-- (Endstatus)
no_show-- (Endstatus)

Warteliste-Logik

Die Warteliste wird über vier Spalten in der events-Tabelle gesteuert:

SpalteBeschreibung
capacity_totalGesamtkapazitaet des Events
capacity_bookedAnzahl bestaetigter Buchungen
capacity_waitlistAnzahl Personen auf der Warteliste
waitlist_maxMaximale Wartelisten-Plaetze (NULL = unbegrenzt)
  • Verfügbare Plaetze = capacity_total - capacity_booked
  • Wenn keine Plaetze mehr frei sind und waitlist_max noch nicht erreicht ist, wird die Buchung auf die Warteliste gesetzt
  • Nach einer Stornierung rückt der nächste Wartelisten-Kontakt automatisch nach (basierend auf waitlist_position)
  • Der Event-Status wechselt automatisch zwischen selling und waitlist je nach Kapazitaet

Delete-Schutz

Events können nur gelöscht werden, wenn sie den Status draft oder cancelled haben. Events mit dem Status selling, waitlist oder completed sind geschuetzt und müssen zuerst storniert werden.

Fehlermeldung bei geschuetztem Status:

Event im Status 'selling' kann nicht gelöscht werden

Stripe Integration

eventVIA unterstützt vier Zahlungsmodelle über das Feld payment_model:

ModellBeschreibung
freeKeine Zahlung erforderlich
full_paymentVoller Preis wird über Stripe abgewickelt
depositAnzahlung über Stripe (deposit_amount), Rest vor Ort
external_linkExterner Zahlungslink (external_payment_url)

Wenn ein Event in den Status selling wechselt und das Zahlungsmodell full_payment oder deposit ist, wird automatisch ein Stripe Payment Link erstellt (via EventPaymentService). Der Link wird in stripe_payment_link gespeichert.

AI Booking Intent Tags

Bots können Buchungsabsichten per Intent-Tags erkennen und automatisch verarbeiten:

TagBeschreibung
[BOOK:event_id]Buchung für ein Event auslösen
[WAITLIST:event_id]Wartelisten-Eintrag für ein Event auslösen

Diese Tags werden vom Bot im AI-Response generiert und vom System als Buchungs-Aktionen interpretiert.

Quellcode-Referenz

DateiBeschreibung
src/routes/eventRoutes.jsRoute-Definitionen (10 Endpoints)
src/controllers/eventController.jsRequest-Handler
src/services/EventService.jsCore-Logik (CRUD, Status, Kapazitaet)
src/services/EventPaymentService.jsStripe Payment Links
src/services/EventNotificationService.jsBenachrichtigungen
src/services/EventWebhookService.jsWebhook bei Status-Änderungen

Zuletzt aktualisiert: