After a guest checks out, the room enters needs-cleaning state until housekeeping marks it cleaned. Cleaning gets the room back into the bookable pool — without it, the calendar still shows 🧹 on the room name and the room can't be re-allocated to a new guest.
Where the state comes from
When a guest checks out, the most-recent checked-out billing row is flagged dirty automatically. The system reads that flag (along with the other room states — occupied, blocked, vacant) to derive the room's calendar status. The flag clears when you (or another operator) mark the room cleaned.
Where to mark a room cleaned
You can do it from two places:
1) The dedicated Housekeeping page
Front Office → Housekeeping.
The page lists every room currently needing cleaning, grouped by floor. For each row:
- Room — the room number (sortable inside its floor group)
- Type — room type
- Last guest — who just left
- Checked out — exact timestamp
- Aged — colour-coded (green ≤ 3h, amber 3–6h, red ≥ 6h or yesterday)
- Mark cleaned — one-click flip
The page also shows three at-a-glance tiles at the top: total rooms to clean, rooms aged > 6 hours, and how many floors have work outstanding.
Print the page for the cleaning supervisor — the toolbar and Mark buttons hide; the floor-by-floor list prints clean.
2) The Booking Calendar
On any vacant room cell that's currently marked CleanUp (you'll see 🧹 by the room name), right-click → Mark cleaned 🧹. Same action, just closer to where you already are.
What "marking cleaned" actually does
- Flips
HasBeenCleaned = trueon the room's most-recent checked-out billing row. - If the room had its persistent SpaceStatus = CleanUp flag set (legacy state), that flips back to Vacant.
- The room shows up immediately in the calendar without 🧹, and is bookable for any-of-type lookups again.
- The room moves to the Awaiting inspection queue on this page — the supervisor confirms it's ready by clicking Mark inspected.
Inspect step (soft gate)
After a room is marked cleaned, it appears in the Awaiting inspection queue. This is a soft gate — the room is already bookable; inspection is a separate workflow step that lets the supervisor walk the room and confirm it's truly ready.
Clicking Mark inspected flips HasBeenInspected = true and the
room drops off the queue entirely.
Tiles at the top of the page show the split:
- Dirty — cleaner hasn't worked the room yet.
- Awaiting inspection — cleaner finished, supervisor hasn't signed off.
- Occupied + dirty — guest still in the room, but the prior stay's flag is still showing as dirty (coordinate access with the front desk).
What it doesn't do
- It doesn't post a charge.
- It doesn't notify anyone (no SMS / email integration in v1).
- It doesn't track who cleaned the room (assignment / accountability is on the v2 backlog).
- It doesn't have a separate Inspected state — the room is either dirty or clean. A supervisor-inspection step would be a future addition.
Common problems
- The room isn't in the list → the most-recent billing row may
already have
HasBeenCleaned = true. If you re-cleaned the room (or cleaned it before this page was built), it's already showing as Vacant on the calendar. - The room is in the list but I just cleaned it → click Mark cleaned. If you've been on the page for a while, hit Refresh first — the page caches for 30 seconds.
- "Could not mark room as cleaned" → the API returns this when the room has no prior checkout row (brand-new room never used). Safe to ignore.