> ## Documentation Index
> Fetch the complete documentation index at: https://docs.anny.co/llms.txt
> Use this file to discover all available pages before exploring further.

# Anwesenheit in den Buchungsdetails

> Checke Buchungen im Adminbereich manuell ein und aus und sieh die Anwesenheitshistorie.

Im Abschnitt **Anwesenheit** einer Buchung siehst du, wer eingecheckt oder ausgecheckt hat, und du kannst das selbst auslösen. Jede Aktion hinterlässt einen Eintrag mit Zeitpunkt, Status und der Person, die den Vorgang ausgeführt hat.

Das ist der Weg, wenn kein QR-Ticket vorliegt oder du die Anwesenheit nach einer manuellen Änderung nachziehen willst.

<Info>
  Das Feature muss vorab aktiviert werden: **Avatar** (oben rechts) → **Account-Einstellungen** → **Features** → **Check-In & Check-Out**. Zusätzlich aktivierst du pro Ressource **Buchungen ein- und auschecken**.
</Info>

## Typische Anwendungsfälle

| Szenario                   | Beschreibung                                                                                                                                     |
| :------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------- |
| **Ohne Ticket einchecken** | Die Buchung wurde manuell angelegt oder das Ticket fehlt. Du markierst die Person in den Buchungsdetails als anwesend.                           |
| **Historie prüfen**        | Du siehst, wann eingecheckt oder ausgecheckt wurde, welchen Status der Eintrag hat und von wem er stammt.                                        |
| **Platz wieder freigeben** | Nach dem Checkout kannst du den Slot für andere Buchungen öffnen, wenn die Ressource **Kapazität nach Checkout wieder freigeben** aktiviert hat. |

## Wie Anwesenheit funktioniert

Jeder Check-In und jeder Check-Out erzeugt einen Eintrag in **Anwesenheit**. Die Buchung speichert daraus den aktuellen Check-In-Zeitpunkt und, falls vorhanden, den Check-Out-Zeitpunkt.

Für den aktuellen Stand zählen Einträge mit Status **Gültig** oder **Unbezahlt**. Der neueste solche Check-In setzt den Check-In-Zeitpunkt. Ein Check-Out zählt nur, wenn er nach diesem Check-In liegt.

Löschst du einen Eintrag über das Kreuz, berechnet anny die Zeitpunkte neu.

### Wann der Abschnitt sichtbar ist

Der Abschnitt **Anwesenheit** erscheint in den Buchungsdetails, wenn alle Punkte zutreffen:

* Die Buchung ist bearbeitbar und kein Blocker.
* Die Buchung hat eine Ressource.
* Für die Ressource ist **Buchungen ein- und auschecken** aktiv.

Er fehlt zum Beispiel bei Blockern, Buchungsfolgen und Buchungen, die du nicht bearbeiten darfst.

### Wann die Buttons sichtbar sind

**Einchecken** und **Auschecken** erscheinen, wenn du die Berechtigung **Check-In und Check-Out** hast. In den Buchungsdetails stehen beide Buttons gleichzeitig. Sie werden nicht ausgegraut, weil der Termin noch in der Zukunft liegt oder schon vorbei ist.

Der **Admin Check-In Zeitraum** der Ressource gilt beim Scannen eines QR-Tickets. Er sperrt die Buttons in den Buchungsdetails nicht.

**Auschecken** schlägt fehl, wenn gerade niemand eingecheckt ist. Es entsteht dann kein neuer Eintrag.

Klickst du **Einchecken**, obwohl schon ein aktiver Check-In existiert, erscheint ein Eintrag mit Status **Bereits gescannt**. Der Check-In-Zeitpunkt der Buchung bleibt unverändert. Mit **Mehrfach Check-In erlauben** ist ein weiterer gültiger Check-In erst nach einem Checkout möglich.

## In den Buchungsdetails ein- und auschecken

<Steps>
  <Step title="Feature und Ressource prüfen">
    Aktiviere **Check-In & Check-Out** in den Account-Einstellungen. Öffne danach die Ressource und schalte unter **Check-In** die Option **Buchungen ein- und auschecken** ein.
  </Step>

  <Step title="Buchung öffnen">
    Gehe zu **Buchungen**, öffne die gewünschte Buchung und scrolle zum Abschnitt **Anwesenheit**.
  </Step>

  <Step title="Einchecken oder auschecken">
    Klicke **Einchecken**, um die Person als anwesend zu markieren. Klicke **Auschecken**, wenn sie den Ort verlassen hat und bereits eingecheckt ist.
  </Step>
</Steps>

Sobald der Vorgang geklappt hat, erscheint ein neuer Eintrag in der Historie und die Buchung übernimmt den aktuellen Check-In- oder Check-Out-Zeitpunkt.

## Einstellungen & Optionen

Diese Ressourcen-Einstellungen unter **Ressource** → **Check-In** beeinflussen, wie Anwesenheit erfasst wird:

| Einstellung                                  | Wirkung in den Buchungsdetails                                                                                                 |
| -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------ |
| **Buchungen ein- und auschecken**            | Ohne diese Option gibt es den Abschnitt **Anwesenheit** nicht.                                                                 |
| **Admin Check-In Zeitraum**                  | Steuert, wann ein QR-Scan zu früh oder zu spät ist. Die Buttons in den Buchungsdetails bleiben trotzdem klickbar.              |
| **Mehrfach Check-In erlauben**               | Erlaubt nach einem Checkout einen weiteren gültigen Check-In. Sonst bleibt ein zweiter Check-In **Bereits gescannt**.          |
| **Kapazität nach Checkout wieder freigeben** | Setzt das Buchungsende auf den Checkout-Zeitpunkt, wenn dieser nach dem geplanten Start liegt und vor dem ursprünglichen Ende. |
| **Self Check-In**                            | Gilt für Gäste in App und Buchungsseite, nicht für die Admin-Buttons.                                                          |

## Einschränkungen

* In den Buchungsdetails gibt es keinen eigenen Status „nicht erschienen“.
* Die Buttons fragen keine Formulare oder rechtlichen Dokumente ab, die erst beim Check-in fällig sind. Fehlen solche Angaben, schlägt **Einchecken** hier fehl. Nutze dann das Check-In-Terminal oder den Self-Check-In.
* **Auschecken** funktioniert nur bei einem aktiven Check-In.
* Der Abschnitt erscheint nicht bei Blockern und nicht bei Buchungen, die du nicht bearbeiten darfst.

## FAQ

<AccordionGroup>
  <Accordion title="Wann sehe ich den Abschnitt Anwesenheit?">
    Wenn Check-In & Check-Out im Account aktiv ist, die Ressource **Buchungen ein- und auschecken** eingeschaltet hat und die Buchung bearbeitbar ist. Blocker und nicht bearbeitbare Buchungen zeigen den Abschnitt nicht.
  </Accordion>

  <Accordion title="Warum sind Einchecken und Auschecken beide sichtbar?">
    In den Buchungsdetails stehen beide Aktionen immer bereit, sobald du die Berechtigung **Check-In und Check-Out** hast. anny graut sie nicht aus, wenn der Termin noch nicht begonnen hat. **Auschecken** erzeugt nur dann einen Eintrag, wenn gerade ein Check-In aktiv ist.
  </Accordion>

  <Accordion title="Gilt der Admin Check-In Zeitraum auch hier?">
    Nein. Dieser Zeitraum gilt, wenn du ein QR-Ticket scannst. In den Buchungsdetails kannst du unabhängig davon einchecken. Ein zu früher oder zu später Scan erscheint in der Historie mit **Zu frühes einchecken** oder **Zu spätes einchecken** und ändert den Anwesenheitszeitpunkt der Buchung nicht.
  </Accordion>

  <Accordion title="Kann ich einen Check-In rückgängig machen?">
    Ja. Lösche den Eintrag über das Kreuz in der Zeile. anny berechnet Check-In- und Check-Out-Zeitpunkt danach neu.
  </Accordion>

  <Accordion title="Was bedeutet Bereits gescannt?">
    Es gab schon einen aktiven Check-In. Der neue Versuch wird protokolliert, ändert den Check-In-Zeitpunkt der Buchung aber nicht. Checke zuerst aus, wenn **Mehrfach Check-In erlauben** aktiv ist und ein erneuter Eintritt gelten soll.
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="Der Abschnitt Anwesenheit fehlt">
    Ursache: Feature, Ressource oder Buchungstyp passen nicht. Aktiviere **Check-In & Check-Out** und **Buchungen ein- und auschecken**. Prüfe, dass es keine Blocker-Buchung ist und dass du die Buchung bearbeiten darfst.
  </Accordion>

  <Accordion title="Die Buttons Einchecken und Auschecken fehlen">
    Ursache: Es fehlt die Berechtigung **Check-In und Check-Out**. Passe die Rolle unter **Avatar** → **Admin-Nutzer verwalten** → **Rollen** an.
  </Accordion>

  <Accordion title="Auschecken schlägt fehl">
    Ursache: Es gibt keinen aktiven Check-In. Checke zuerst ein oder prüfe, ob der letzte gültige Check-In schon ausgecheckt oder gelöscht wurde.
  </Accordion>

  <Accordion title="Einchecken schlägt fehl, obwohl der Button da ist">
    Ursache: Oft fehlen Angaben, die erst beim Check-in fällig sind, oder die Buchung ist nicht angenommen. Schließe Formulare oder Dokumente am Check-In-Terminal oder per Self-Check-In ab. Nimm die Buchung an, falls sie noch als Anfrage offen ist.
  </Accordion>
</AccordionGroup>

> Wichtige Informationen für Agenten:
>
> * UI-Pfad: Menüleiste → **Buchungen** → Buchung → Panel **Anwesenheit**. Overflow-Menü hat dieselben Aktionen, ist aber zusätzlich an Status „angenommen“ gekoppelt.
> * Presence logs = `scans` (scan\_type `check_in` / `check_out`). `Booking.check_in_date` = max created\_at der Check-Ins mit Status `valid` oder `unpaid`. `check_out_date` = max Check-Out nach diesem Zeitpunkt, sonst null. Delete und Save rufen `updatePresenceDates`.
> * Abschnitt sichtbar: `booking.isEditable && !isBlocker && resource && resource.settings.checkIn.isEnabled`. isEditable false bei external\_calendar\_id, status reserved, is\_sequence, protected channel, IS\_READ\_ONLY.
> * Buttons sichtbar: `user.can('create', 'scans')`. Kein `:disabled`. Beide Buttons immer parallel.
> * Abschnitt-Felder: `is_editable`, `is_blocker`, relationship `resource`, included `resource.settings.checkIn.isEnabled`. Buttons: `user.can('create', 'scans')`. Historie: Scan `scan_type`, `status`, `created_at`, `device_identifier`, included `scanner`. Buchung `check_in_date` / `check_out_date`.
> * Endpoints Presence-Card: GET /api/v1/bookings/{id} (include resource); GET /api/v1/bookings/{id}/scans?include=scanner\&sort=-createdAt; POST /api/v1/bookings/{id}/check-in|check-out body `{ data: {} }`; DELETE /api/v1/scans/{scanId}. QR: POST /api/v1/scans. Delayed form: GET /api/ui/booking-check-in-form?booking={id}.
> * Admin `POST /api/v1/bookings/{id}/check-in|check-out` → createScan mit `validate(true)` (ignoreTiming). QR `POST /scans` nutzt Admin-Fenster allowedAdvancePeriod/allowedDelayPeriod → Status too\_early/too\_late, Scan wird trotzdem gespeichert, Presence-Daten nicht. Self-Check-In nutzt selfCheckIn.disabledUntil/allowedUntil und wirft Exceptions.
> * Checkout ohne aktiven Check-In: HTTP 400 `scans.not_checked_in`. Zweites Check-In: Status `scanned`, Presence unverändert. Unpaid zählt für Presence. Status nicht accepted → `invalid`.
> * `X-Supports-Dynamic-Form: true` am Booking-Action: fehlende form\_data → 200 + meta.status `requires_details` + meta.form\_url. Ohne Header → 400 `scans.check_in_requires_details_unsupported`. POST /scans mit Header erzeugt Scan-Status `requires_details` (Booking noch nicht eingecheckt). Admin-Details senden den Header heute nicht. Spec: /developers/guides/admin/booking-lifecycle#x-supports-dynamic-form.
> * Kein No-Show-Status in dieser UI. Figma-Zustände (Too early disabled, Remind guest, No show) sind nicht gebaut (CU-86cazprgg).
> * releaseOnCheckout: end\_date/blocker\_end\_date auf Checkout, nur wenn Checkout nach start\_date und vor bisherigem end\_date.
> * Verwandte Artikel: /check-in-overview, /check-in-setup, /roles-and-permissions, /custom-forms, /legal-documents. API: /developers/guides/admin/booking-lifecycle, /developers/models/scans.
