@admin @bookings Feature: Admin booking detail — read & edit The admin booking-detail page replaces the spreadsheet — admins must be able to *edit* every column they used to edit, not just look at it. Background: Given "the admin" is logged in When they visit "/admin/bookings/b_yoga_2026_summer" # ── Read ──────────────────────────────────────────────────────────────── Scenario: admin opens the summer retreat detail Then they see "Summer Yoga Retreat 2026" And they see "Yoga Retreat e.V." And they see "Teilnehmende" Scenario: admin sees the seeded participant list When they click "Teilnehmende" Then they see "Anja Weber" And they see "Bernd Krause" # ── Edit booking metadata ─────────────────────────────────────────────── Scenario: admin edits the course name and persists across reload When they fill "courseName" with "Summer Yoga Retreat 2026 — revised" And they click "Änderungen speichern" Then they see "Gespeichert" When they visit "/admin/bookings/b_yoga_2026_summer" Then they see "Summer Yoga Retreat 2026 — revised" Scenario: admin updates expected participants When they fill "expectedPersons" with "32" And they click "Änderungen speichern" Then they see "Gespeichert" Scenario: admin toggles half-house and online listing flags When they select "Ja" from "halfHouse" And they select "Ja" from "onlineAd" And they click "Änderungen speichern" Then they see "Gespeichert" Scenario: admin cannot save when no field changed Then they see "Änderungen speichern" # Save button is disabled until a field is touched — clicking has no effect. # ── Edit organisation ────────────────────────────────────────────────── Scenario: admin edits organisation contact email and phone When they fill "organisation-email" with "ops@yoga-retreat.example" And they fill "organisation-phone" with "+49 30 12345678" And they click "Organisation speichern" Then they see "Organisation gespeichert" When they visit "/admin/bookings/b_yoga_2026_summer" Then the field "organisation-email" has value "ops@yoga-retreat.example" And the field "organisation-phone" has value "+49 30 12345678" Scenario: organisation save rejects an invalid email When they fill "organisation-email" with "not-an-email" And they click "Organisation speichern" Then they do not see "Organisation gespeichert" # ── Booking status transitions ───────────────────────────────────────── Scenario: admin cancels a booking # ConfirmButton: first click arms, second click (testid `-confirm`) fires. When they trigger booking action "action-cancel-booking" Then they see "Storniert" And they do not see "Buchung stornieren" # ── Participants CRUD ────────────────────────────────────────────────── Scenario: admin adds a participant When they click "Teilnehmende" And they fill "new-participant-name" with "Ingrid Vogel" And they click "Hinzufügen" Then they see "Ingrid Vogel" Scenario: admin removes a participant When they click "Teilnehmende" And they accept the next confirmation And they click "remove-participant-p_s_08" Then they do not see "Hans Becker" Scenario: admin changes a participant's diet When they click "Teilnehmende" And they select "Pescetarisch" from "participant-diet-p_s_06" Then the field "participant-diet-p_s_06" has value "Pescetarisch" # ── Allergies CRUD ───────────────────────────────────────────────────── Scenario: admin adds an allergy to a participant When they click "Teilnehmende" And they fill "new-allergy-p_s_02" with "shellfish" And they click "add-allergy-p_s_02" Then they see "Meeresfrüchte" Scenario: admin removes an existing allergy When they click "Teilnehmende" And they click "remove-allergy-p_s_01-nuts" Then they do not see "nuts" # ── Rooms assign / unassign ──────────────────────────────────────────── Scenario: admin assigns and then unassigns a participant to a room When they click "Zimmer" And they select "Anja Weber" from "assign-room-r_1" Then they see "Anja Weber" When they click "Entfernen" Then the field "assign-room-r_1" has value ""