POST/api/v1/reservations/{id}/line-items/{itemId}/settle
Eine vorbestellte Position (Set-Menü, Torte) genau einmal als abgerechnet markieren, mit der Beleg- oder Bonnummer der Kasse.
Rechte
reservations:writePlan-Merkmal reservations — fehlt es dem Betrieb, antwortet die Route mit 402 plan_upgrade_required.
Pfad
| Name | Typ | Bedeutung |
|---|---|---|
{id}Pflicht | UUID | Kennung der Reservierung. Eine fremde Kennung ergibt 404. |
{itemId}Pflicht | UUID | Kennung der Position aus `lineItems[].id`. Gehört sie nicht zu dieser Reservierung, ist das 404. |
Kopfzeilen
| Name | Typ | Bedeutung |
|---|---|---|
Idempotency-Key | string bis 255 Zeichen | Freiwillig. Eine Wiederholung mit demselben Schlüssel bekommt dieselbe Antwort; dieselbe `settlementRef` ist ohnehin harmlos. |
X-TacticTable-Dry-Run | 1 | Prüft, ohne zu schreiben. Die Antwort nennt unter `would` den Übergang (`from` → `to: SETTLED`). |
Felder im Rumpf
| Name | Typ | Bedeutung |
|---|---|---|
settlementRefPflicht | string, 1–128 druckbare ASCII-Zeichen | Beleg- oder Bonnummer der Kasse, unter der die Position bezahlt wurde. Sie macht den Vorgang wiederholbar: dieselbe Nummer noch einmal ist ein Erfolg ohne Änderung, eine andere ein Konflikt. |
Mögliche Fehler
- validation — Rumpf fehlt, unbekanntes Feld, oder `settlementRef` leer, zu lang bzw. mit nicht druckbaren Zeichen.
- not_found — Reservierung oder Position gehört nicht zu diesem Betrieb – oder der Telefon-Agent ist auf dieser Umgebung nicht freigeschaltet; dann gibt es die Route nicht.
- conflict — Die Position ist storniert (`reason: canceled`) oder schon mit einer anderen Nummer abgerechnet (`reason: other_reference`).
- forbidden — Dem Schlüssel fehlt `reservations:write`.
- plan_upgrade_required — Der Plan des Betriebs enthält Reservierungen nicht.
- idempotency_key_reuse — Derselbe `Idempotency-Key` wurde bereits für eine andere Anfrage benutzt.
- Antwortet mit 200 und `{ "lineItem": { … }, "changed": true }`; war die Position mit derselben Nummer schon abgerechnet, mit `changed: false`.
- Die Abrechnung bewegt kein Geld – sie hält fest, dass die Kasse es getan hat. Deshalb genügt `reservations:write`.
- Nur mit freigeschaltetem Telefon-Agenten; ohne ihn antwortet die Route mit 404 und Reservierungen tragen kein `lineItems`.