---
title: "Appointments"
description: "Bookable resources. Describe bookable people, rooms and equipment and record appointments with a date, start and end."
canonical: "https://obop.dev/apps/appointments/"
lang: "en"
---

# Appointments

## What it is for

Describe bookable people, rooms and equipment and record appointments with a date, start and end. Overlaps are not prevented automatically.

## What the package does and does not do

Bookable resources (people, rooms, equipment) and appointments with a date, start and end time and a status flow. Overlaps are not prevented automatically.

## Models

### `appointments_resource`

Something or someone that can be booked

Read group: `appointments.user`. Write group: `appointments.manager`.

| Field | Kind | Data class | Personal data | Group | Agents see | Description |
|---|---|---|---|---|---|---|
| `name` | text | `none` | no | `appointments.user` | in clear | Name of the resource, for example Meeting room 2 |
| `kind` | select (person, room, equipment) | `none` | no | `appointments.user` | in clear | What kind of resource it is: person, room, equipment |
| `capacity` | number | `none` | no | `appointments.user` | in clear | How many people it can serve at once |
| `active` | bool | `none` | no | `appointments.user` | in clear | Whether the resource can be booked |

### `appointments_appointment`

A booking of a resource at a time

Read group: `appointments.user`. Write group: `appointments.user`.

| Field | Kind | Data class | Personal data | Group | Agents see | Description |
|---|---|---|---|---|---|---|
| `resource_id` | ref → appointments_resource | `none` | no | `appointments.user` | in clear | The resource booked |
| `title` | text | `none` | no | `appointments.user` | in clear | What the appointment is for |
| `day` | date | `none` | no | `appointments.user` | in clear | Date of the appointment (YYYY-MM-DD) |
| `start_minute` | number | `none` | no | `appointments.user` | in clear | Start time as minutes since midnight, for example 540 for 09:00 |
| `end_minute` | number | `none` | no | `appointments.user` | in clear | End time as minutes since midnight, for example 600 for 10:00 |
| `attendee_name` | text | `internal` | yes | `appointments.user` | masked | Name of the person attending |
| `attendee_email` | text | `internal` | yes | `appointments.user` | masked | Email address of the attendee |
| `attendee_phone` | text | `internal` | yes | `appointments.user` | masked | Phone number of the attendee |
| `notes` | longtext | `none` | no | `appointments.user` | in clear | Anything the host should know beforehand |
| `state` | select (scheduled, confirmed, done, cancelled, no_show) | `none` | no | `appointments.user` | in clear | Booking status: scheduled, confirmed, done, cancelled, no_show |

## Workflows

### `appointments_appointment`

| Action | Moves | Who may run it | Approval |
|---|---|---|---|
| `appointments_appointment.confirm` | state: scheduled → confirmed | `appointments.user` | no |
| `appointments_appointment.complete` | state: confirmed → done | `appointments.user` | no |
| `appointments_appointment.cancel` | state: scheduled → cancelled | `appointments.user` | no |
| `appointments_appointment.mark_no_show` | state: confirmed → no_show | `appointments.user` | no |

## Permission groups

Groups used by this app:

- `appointments.manager`
- `appointments.user`

## Approval steps

No step in this app needs an approval, apart from deleting records.

## What agents can and cannot do

An agent can read, search, create and update records of this app, and run the actions that need no approval, within the permission groups of its token.

It can only propose these steps, and a person must approve them: `appointments_resource.delete`, `appointments_appointment.delete`.

Personal data is masked as placeholder tokens: `appointments_appointment.attendee_name`, `appointments_appointment.attendee_email`, `appointments_appointment.attendee_phone`.

## Dependencies

None.

## Install

Install it from the Customize app (Marketplace), or from the command line:

```bash
obop modules install-from appointments
```

Needs a database and administrator rights.

## Build your own

[The module guide shows how apps like this one are written](/docs/reference/module-manifest/)
