Skip to content

Zones and Assets

c0dewhacker edited this page Apr 22, 2026 · 2 revisions

Zones and Assets

A floor is just a container — the zones colour-group the plan and the assets are the actual bookable things. This page walks through both.

Zones

A zone is a coloured region on a floor plan. Every bookable asset belongs to exactly one primary zone and may optionally appear in additional zones. Zones have no geometry of their own — they exist only as a label + colour that groups assets visually on the plan.

Creating a zone

From the floor editor (Admin → Buildings → building → floor → Manage):

  1. Click Add Zone.
  2. Fill in:
    • Name (required) — e.g. Window Row, Team A, Phone Booths.
    • Colour — 6-digit hex (#6366f1 by default). The colour picker shows the current palette and tints the markers for every asset in the zone.
    • Zone Group (optional) — see below.
  3. Save.

Zones can be renamed or recoloured at any time (PUT /api/v1/zones/:id). Deleting a zone is blocked if it's still the primary zone of any asset — move or delete those assets first.

Floor managers (see Users Groups and Permissions) can create, edit and delete zones on the floors they manage. SUPER_ADMINs can do it anywhere.

Zone groups — preventing double-booking across zones

By default Roomer stops a user from holding two overlapping bookings on the same zone. Use a zone group when you want the same rule to apply across multiple zones on a floor.

Common case: you have two zones Hot Desks — East and Hot Desks — West and you want a user to have at most one hot desk booked at any time. Put both zones in the same zone group and the booking API will reject a second, overlapping booking.

To create a group:

  1. From the floor editor, click Add Zone Group (or the "Manage groups" button in the zones panel).
  2. Give it a name — only for your own reference.
  3. Edit each zone and set its Zone Group dropdown to the new group.

Zone groups are floor-scoped — they don't span buildings or floors.

Assets

"Asset" in Roomer covers two distinct concepts that share the same record:

Type isBookable Lives where Examples
Bookable asset true Placed on a floor plan at (x, y) with width/height Desks, meeting rooms, phone booths, parking bays
Inventory asset false Unplaced, managed from Admin → Assets Laptops, phones, keyboards, adapters

Both live in the same Asset table — the isBookable flag just controls whether they appear on a floor plan and go through the booking flow, or sit in the inventory registry. This page focuses on the bookable side; the inventory side is in Reports and Leases (assignment tracking is the same primitive).

Asset categories

Every asset belongs to an asset category. Categories define a default icon, a default colour, and whether assets in that category are bookable by default.

Categories are managed in Admin → Assets → Categories. Fields:

Field Notes
Name (required, unique) e.g. Desk, Meeting Room, Laptop, Phone Booth
Description Free text
Default Is Bookable New assets in this category are created as bookable by default
Default Icon One of the Lucide icons supported by the canvas
Colour Hex #rrggbb, default #6366f1 (used when no zone colour applies)

Categories can be created directly, or auto-created by CSV import — the importer creates a category named after the category cell if none exists.

Bookable asset fields

When you add a bookable asset you set:

Field Required Description
Category ✓ One of the asset categories above.
Name ✓ Displayed on the marker. Convention: short codes like A-01, MR-Jupiter.
Booking Label "Desk", "Room", "Bay". Shown in emails and on the booking dialog. Defaults to Desk.
Amenities Free-text tags shown on the marker tooltip. CSV import accepts a semicolon-separated list (e.g. monitor;docking-station;adjustable-desk).
Serial Number / Asset Tag Optional free-text identifiers. Asset tag must be unique across the whole system.
Primary Zone Which zone the marker is coloured by. Must be on the same floor as the asset.
Floor, x, y, width, height, rotation Position on the plan (grid units). New placements default to x=50, y=50, w=3, h=2.
Booking Status See below. Defaults to OPEN.

Booking status (BookableStatus)

This governs who — if anyone — can book the asset. It's independent of the inventory status (AVAILABLE, ASSIGNED, MAINTENANCE, RETIRED, DISABLED), which applies to physical tracking of the asset:

Value Meaning Who can book
OPEN Default. Anyone with access to the floor can book. Every user with floor access.
RESTRICTED Allow-list only. Only users explicitly added to the asset's allow list.
ASSIGNED Permanently assigned to one or more specific users. The assigned users — plus anyone the assigned user has "offered" time to, via an availability window.
DISABLED Temporarily or permanently withdrawn from booking. Nobody. Marker renders greyed out with a "disabled" badge.

See Booking and Queue for how statuses surface in the UI.

Adding a bookable asset

There are three ways to create bookable assets and place them on a plan:

  1. One-by-one, on the plan. Open the floor editor and use the Add Asset toolbar button. Pick a category, pick a zone, give it a name — it drops at x=50, y=50 with a default 3 × 2 footprint. Drag it to the right spot, resize by dragging the corner handles, rotate with the top handle. Positions are persisted via PATCH /api/v1/assets/positions.

  2. Per-floor CSV bulk import (covered in depth in Bulk CSV Import). The floor editor has a Bulk Import button that accepts a CSV with these columns:

    name,category,bookingStatus,bookingLabel,amenities,serialNumber,assetTag,notes,zoneName
    A-01,Desk,OPEN,Desk,monitor;docking-station,,,,Window Row
    A-02,Desk,OPEN,Desk,,,,,Window Row
    MR-Jupiter,Meeting Room,OPEN,Room,whiteboard;tv,,,,Rooms
    
    • bookingStatus accepts OPEN, RESTRICTED, ASSIGNED, or DISABLED (uppercase). Empty cell defaults to OPEN.
    • amenities is a semicolon-separated list (, is already the column separator). Empty cell = no amenities.
    • zoneName is matched case-insensitively against existing zones on the floor. If no match, the asset is placed in the floor's first zone (create your zones first for predictable placement).
    • Assets are all dropped at (50, 50) with a 3 × 2 footprint — after import, rearrange them on the plan.
    • Maximum 500 rows per import.
  3. Global CSV import (Admin → Import). Creates buildings, floors, zones and assets from one sheet — useful for initial seeding. See Bulk CSV Import.

Placing an asset that already exists

If an inventory asset was created via Admin → Assets → New with isBookable = true but no floor, it shows up under the floor editor's Unplaced Assets list. Click Place on plan to drop it at the default position in the selected zone.

Editing an asset

From the floor editor, click a marker → Edit to update name, amenities, status, primary zone or booking status. Amenities in the inline form are entered as a comma-separated list — the form splits and trims. Floor managers can edit any asset on their floors.

Restricting who can book an asset

There are two distinct mechanisms; pick whichever matches your intent.

RESTRICTED + allow list

"Only these specific users can book this asset."

  1. Set Booking Status → Restricted.
  2. In the asset's Allow List tab, add users one at a time.
  3. Save.

The asset renders with a lock icon for users not on the list (and status: restricted in GET /floors/:id/availability). Only allow-listed users (and SUPER_ADMINs) can call POST /bookings.

ASSIGNED + permanent user assignments

"This desk belongs to Alice." or "This desk is shared between Alice and Bob."

  1. Set Booking Status → Assigned.
  2. In the asset's Assigned Users tab, add one or more users. One can be marked primary.
  3. Save.

The assigned users see the asset under My Assets and can book it any time (it still goes through the normal booking flow — bookings can be for an hour, for a day, or ongoing).

Setting bookingStatus = ASSIGNED via the API when no user is assigned yet is legal; the asset will simply be unbookable by anyone until a user is added. Removing the last assigned user automatically resets the booking status to OPEN.

Availability windows ("offering" the desk to others)

An assigned user can let the wider team book "their" desk for a period when they'll be away. From My Assets:

  1. Click the asset.
  2. Add availability window — start/end datetime + optional note.
  3. Save.

While a window is active, any user with floor access can book the asset as if it were OPEN. Outside the window, only the assigned user(s) can. Windows can be deleted by the owner or by a SUPER_ADMIN.

Inventory assets (non-bookable)

Create these in Admin → Assets → New with Is Bookable = false. They don't appear on floor plans — they exist for inventory tracking:

  • Serial number / asset tag for scans and audits.
  • Purchase date / warranty expiry — free fields, shown on the asset page.
  • Assign / unassign: Admin → Assets → select asset → Assign to record that a laptop is currently with a specific user. The assigned user sees the asset under My Assets. Unassigning returns it to AVAILABLE.
  • History: the assignment ledger is preserved (returnedAt marks the end of each loan).

The same Asset record can be both bookable and tracked — for example a portable monitor that is permanently assigned to a desk on a floor plan still has a serial number and warranty fields.

Bulk-assigning users to assets

When you have many assets to assign at once, use the Bulk assign users button rather than adding each user one at a time.

Where to find it:

  • Admin → Buildings → [a building] — Bulk assign users button in the page header.
  • Admin → Assets — Bulk assign users button above the asset table (SUPER_ADMIN only).

CSV format

ASSET_ID,USER_EMAIL,IS_PRIMARY
<asset-uuid>,jane.smith@example.com,true
<asset-uuid>,john.doe@example.com,false
Column Required Notes
ASSET_ID ✓ The Roomer asset UUID.
USER_EMAIL ✓ Must match an existing Roomer user account.
IS_PRIMARY true or false. Defaults to false. Only one user per asset can hold the primary flag — setting a new primary clears any existing one.

Getting asset IDs

In the Bulk assign users dialog on a building page, click Download [building] assets. This exports a pre-populated CSV of all assets in the building with their current USER_EMAIL assignments (blank for unassigned assets). Fill in or update the emails and re-upload.

On the Assets page (no building context), download the blank template and fill in asset IDs manually, or retrieve them via GET /api/v1/assets/user-assignments/export?buildingId=<id>.

Preview and errors

The dialog shows a row-by-row preview before importing. Rows with missing or invalid fields are flagged as errors and skipped — valid rows still import. After import, a result screen shows the success count and lists any failures by row with an error reason (e.g. User not found, Asset not found).

Clearing all assignments on a floor

On the building detail page, each floor card has a Clear assignments button (user-minus icon). After confirmation, this removes every permanent user assignment from every asset on that floor and resets their booking status to OPEN. The action cannot be undone.

What's next

Clone this wiki locally