# Phase 6 Checklist — Restaurant Reservations / Availability / Holds

Implemented additively on top of Phase 5.

- [x] `010_reservations.sql` additive MySQL migration
- [x] restaurant-specific reservation settings
- [x] `restaurant_reservations`
- [x] `reservation_holds`
- [x] `reservation_hold_tables`
- [x] `reservation_tables`
- [x] `reservation_status_history`
- [x] order-to-reservation foreign-key relationship
- [x] room-QR restaurant reservation entry point
- [x] active room guest session requirement
- [x] restaurant discovery excludes room-service channel
- [x] restaurant opening-hours validation
- [x] dining duration + turnover conflict window
- [x] configurable booking slot size
- [x] configurable advance-booking horizon
- [x] configurable party-size limits
- [x] configurable temporary hold duration (default 5 minutes)
- [x] best-fit single-table allocation
- [x] combined-table allocation where needed
- [x] same-section compatibility for combined tables
- [x] current `OUT_OF_SERVICE` exclusion
- [x] active table-session occupancy conflict checks
- [x] confirmed/pending/seated reservation overlap checks
- [x] active hold overlap checks
- [x] MySQL `FOR UPDATE` table locking during allocation
- [x] confirmation copies held tables into reservation tables transactionally
- [x] hold retry/confirmation idempotence
- [x] only one active hold per guest session
- [x] request-time hold expiry cleanup
- [x] cPanel cron hold expiry cleanup
- [x] guest reservation history/detail/cancellation
- [x] admin reservation list/filter/status workflow
- [x] admin reservation settings UI
- [x] REST availability/hold/confirm/show/cancel endpoints
- [x] guest API internal-ID filtering
- [x] reservation confirmation notifications
- [x] reservation audit logging
- [x] DB-driven `reservations.view`, `reservations.manage`, `reservations.settings` RBAC
- [x] Phase 6 dashboard metrics
- [x] no Redis/Node/worker dependency

## Upgrade commands

```bash
composer install --no-dev --optimize-autoloader
php bin/migrate.php
php bin/check.php
php tests/smoke.php
```

Then configure restaurant-specific reservation rules at `/admin/reservations/settings` before production use.
