Skip to main content

Creating bookings

Once a calendar exists you can browse it in the Verkoop → Boekingenkalender view. The calendar grid supports three views:

  • Month — one cell per day. Useful for an at-a-glance overview.
  • Week — seven columns by 24 hours, one cell per hour.
  • Day — vertical 24-hour view for a single day.

Switch views with the buttons in the calendar header.

Picking a slot

Click any empty cell to open the booking form. The form pre-fills the slot's start time and adds a 30-minute window by default. You can adjust the times freely; the form enforces the rules described below.

The booking form

FieldNotes
TitleFree text, max 255 characters. Shown in the calendar cell.
Start timeUTC datetime. The form uses the browser's datetime-local widget.
End timeMust be strictly after the start, and the duration must be ≥15 minutes.
AttendeeFree text (or a Nextcloud contact name) — max 255 characters.
Statuspending (default) or confirmed.

Status: pending vs confirmed

  • Pending — the booking is recorded but flagged as unconfirmed. The calendar UI highlights it in red so an operator can review it. Pending bookings do not block the slot; the conflict check will report them as overlaps until they are either confirmed or cancelled.
  • Confirmed — the booking is live and blocks the slot. Any future booking that overlaps a confirmed window will hit the 409 Conflict branch (see Conflict resolution).

Validation rules

  • Title and attendee are required.
  • End time must be strictly after start time.
  • Duration must be at least 15 minutes.
  • Start and end times are stored in UTC; the UI converts to the calendar's time zone for display.

API equivalents

The calendar UI is a thin layer over the REST API. The same workflow is scriptable:

# List all calendars
curl -u admin:secret http://nc.example/index.php/apps/shillinq/api/v2/calendars

# Read one calendar
curl -u admin:secret http://nc.example/index.php/apps/shillinq/api/v2/calendars/cal-001

# List bookings in a date range
curl -u admin:secret \
"http://nc.example/index.php/apps/shillinq/api/v2/calendars/cal-001/bookings?start=2026-05-21&end=2026-05-31"

# Create a booking
curl -u admin:secret \
-H "Content-Type: application/json" \
-H "OCS-APIRequest: true" \
-X POST \
-d '{
"title": "Klant: Bob Jansen",
"startTime": "2026-05-21T14:00:00Z",
"endTime": "2026-05-21T14:30:00Z",
"attendee": "Bob Jansen",
"status": "confirmed"
}' \
http://nc.example/index.php/apps/shillinq/api/v2/calendars/cal-001/bookings

A successful POST returns HTTP 201 with the saved booking payload. A conflicting POST returns HTTP 409 with the list of overlapping bookings — see Conflict resolution.