Stornierung und Kapazitaet
Wie Stornierungen die freien Plaetze beeinflussen
Stornierung und Kapazitaet
Diese Dokumentation erklaert, wie das System bei einer Stornierung die freien Plaetze automatisch freigibt.
Kernprinzip: Kein Zaehler, sondern Live-Berechnung
WICHTIG: Es gibt keinen Zaehler der bei Stornierung +1 gerechnet wird!
Stattdessen werden die freien Plaetze bei jeder Abfrage live berechnet:
Freie Plaetze = max_participants - Anzahl bestaetigter Buchungen
Warum kein Zaehler?
| Problem mit Zaehler | Live-Berechnung |
|---|---|
| Race Conditions bei gleichzeitigen Buchungen | Immer korrekt |
| Sync-Probleme wenn nicht aktualisiert | Keine Sync noetig |
| Manuelle Korrekturen noetig | Automatisch richtig |
Ablauf bei Stornierung
1. VORHER
└── Buchung Status: 'confirmed'
└── count_confirmed_bookings() zaehlt sie MIT
└── Freie Plaetze = max - gebuchte_anzahl
2. STORNIERUNG
└── Status wechselt: 'confirmed' → 'cancelled'
└── update_post_meta( buchung_id, '_buchung_status', 'cancelled' )
3. NACHHER
└── count_confirmed_bookings() zaehlt sie NICHT MEHR
└── Freie Plaetze = max - (gebuchte_anzahl - stornierte)
└── PLAETZE SIND AUTOMATISCH FREI!
Beispiel
| Zeitpunkt | max | confirmed Buchungen | Freie Plaetze |
|---|---|---|---|
| Kurs erstellt | 10 | 0 | 10 |
| 3 Personen buchen | 10 | 3 | 7 |
| 2 weitere buchen | 10 | 5 | 5 |
| 1 Person storniert | 10 | 4 | 6 (automatisch!) |
Technische Details
Berechnung freier Plaetze
Datei: includes/class-kurs.php
Funktion: get_available_spots() (Zeile 1803)
public static function get_available_spots( int $post_id ): int {
$max = (int) self::get_meta( $post_id, 'max_participants', 0 );
if ( 0 === $max ) {
return -1; // Unbegrenzt
}
// Zaehlt NUR confirmed Buchungen
$booked = Kurs_Booking_Buchung::count_confirmed_bookings( $post_id );
return max( 0, $max - $booked );
}
SQL-Query fuer bestaetigte Buchungen
Datei: includes/class-buchung.php
Funktion: count_confirmed_bookings() (Zeile 1585)
SELECT COALESCE(SUM(pm2.meta_value), 0)
FROM wp_posts p
INNER JOIN wp_postmeta pm1 ON p.ID = pm1.post_id
INNER JOIN wp_postmeta pm2 ON p.ID = pm2.post_id
INNER JOIN wp_postmeta pm3 ON p.ID = pm3.post_id
WHERE p.post_type = 'kurs-buchung'
AND p.post_status = 'publish'
AND pm1.meta_key = '_buchung_kurs_id'
AND pm1.meta_value = [KURS_ID]
AND pm2.meta_key = '_buchung_anzahl'
AND pm3.meta_key = '_buchung_status'
AND pm3.meta_value = 'confirmed' -- NUR confirmed!
Entscheidend: Die WHERE-Klausel filtert auf status = 'confirmed'. Stornierte Buchungen (status = 'cancelled') werden nicht mitgezaehlt.
Status bei Stornierung setzen
Datei: includes/class-buchung.php
Funktion: cancel_booking() (Zeile 2276)
// Status auf 'cancelled' setzen
update_post_meta(
$buchung_id,
self::META_PREFIX . 'status',
self::STATUS_CANCELLED
);
// Hook fuer weitere Module (sevDesk, Video-Zugriff, etc.)
do_action( 'kurs_booking_cancelled', $buchung_id, ... );
Buchungs-Status Uebersicht
| Status | Wert | Wird gezaehlt? |
|---|---|---|
| Ausstehend | pending |
NEIN |
| Bestaetigt | confirmed |
JA |
| Storniert | cancelled |
NEIN |
| Anfrage | anfrage |
NEIN |
| Storno angefragt | cancel_requested |
JA (noch bestaetigt) |
| Abgeschlossen | completed |
JA |
Nur confirmed und completed belegen Kapazitaet!
Wichtige Code-Stellen
| Was | Datei | Funktion | Zeile |
|---|---|---|---|
| Freie Plaetze berechnen | class-kurs.php | get_available_spots() |
1803 |
| Bestaetigte Buchungen zaehlen | class-buchung.php | count_confirmed_bookings() |
1585 |
| Buchung stornieren | class-buchung.php | cancel_booking() |
2276 |
| Status-Konstanten | class-buchung.php | Konstanten | 40-46 |
FAQ
Muss ich die Kapazitaet manuell aktualisieren?
Nein. Die Kapazitaet wird live berechnet. Sobald der Buchungs-Status zu cancelled wechselt, wird die Buchung nicht mehr gezaehlt.
Was passiert bei Teilstornierung?
Bei Reduzierung der Ticketanzahl wird das Meta-Feld _buchung_anzahl angepasst. Die naechste Kapazitaetsabfrage beruecksichtigt automatisch den neuen Wert.
Gibt es ein Meta-Feld _booked_count?
Ja, aber es wird nicht fuer die Berechnung verwendet. Es existiert nur fuer Logging/Debugging in class-sevdesk-storno.php. Die echte Berechnung erfolgt immer live ueber count_confirmed_bookings().
Letzte Aktualisierung: 24.01.2026