Stornierung und Kapazitaet

Wie Stornierungen die freien Plaetze beeinflussen

Stornierung Kapazitaet Technisch

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