---
title: "Fleet"
description: "Vehicles and drivers. Keep a register of company vehicles, who drives them and their service history."
canonical: "https://obop-platform.sliplane.app/apps/fleet/"
lang: "en"
---

# Fleet

## What it is for

Keep a register of company vehicles, who drives them and their service history. It records status and services; it does not compute running costs.

## What the package does and does not do

Vehicles, drivers and service history for a small fleet. Tracks status and service records; it does not compute running costs or fuel use.

## Models

### `fleet_vehicle`

A vehicle the business operates

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

| Field | Kind | Data class | Personal data | Group | Agents see | Description |
|---|---|---|---|---|---|---|
| `plate` | text | `none` | no | `fleet.user` | in clear | Registration plate |
| `model` | text | `none` | no | `fleet.user` | in clear | Make and model, for example Renault Master |
| `vin` | text | `none` | no | `fleet.user` | in clear | Vehicle identification number (chassis number) |
| `fuel` | select (petrol, diesel, hybrid, electric, other) | `none` | no | `fleet.user` | in clear | Fuel or drive type: petrol, diesel, hybrid, electric, other |
| `odometer_km` | number | `none` | no | `fleet.user` | in clear | Last known odometer reading in kilometres |
| `acquired_on` | date | `none` | no | `fleet.user` | in clear | Date the vehicle entered the fleet (YYYY-MM-DD) |
| `driver` | text | `internal` | yes | `fleet.user` | masked | Name of the driver currently using the vehicle, as free text |
| `driver_id` | ref → fleet_vehicle_driver | `none` | no | `fleet.user` | in clear | Driver record currently assigned to the vehicle |
| `state` | select (available, in_service, maintenance, retired) | `none` | no | `fleet.user` | in clear | Availability: available, in_service, maintenance, retired |

### `fleet_vehicle_driver`

A person authorised to drive fleet vehicles

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

| Field | Kind | Data class | Personal data | Group | Agents see | Description |
|---|---|---|---|---|---|---|
| `name` | text | `public_directory` | yes | `fleet.user` | masked | Full name of the driver |
| `phone` | text | `internal` | yes | `fleet.user` | masked | Work phone number of the driver |
| `licence_number` | text | `confidential_hr` | yes | `fleet.manager` | withheld | Driving licence number |
| `licence_expiry` | date | `confidential_hr` | yes | `fleet.manager` | withheld | Date the driving licence expires (YYYY-MM-DD) |
| `state` | select (active, suspended) | `none` | no | `fleet.user` | in clear | Driver status: active, suspended |

### `fleet_vehicle_service`

A maintenance, repair or inspection job on a vehicle

Read group: `fleet.user`. Write group: `fleet.user`.

| Field | Kind | Data class | Personal data | Group | Agents see | Description |
|---|---|---|---|---|---|---|
| `vehicle_id` | ref → fleet_vehicle | `none` | no | `fleet.user` | in clear | The vehicle serviced |
| `kind` | select (maintenance, repair, inspection, tyres, other) | `none` | no | `fleet.user` | in clear | Type of job: maintenance, repair, inspection, tyres, other |
| `service_on` | date | `none` | no | `fleet.user` | in clear | Date of the job (YYYY-MM-DD) |
| `odometer_km` | number | `none` | no | `fleet.user` | in clear | Odometer reading in kilometres when serviced |
| `cost` | money | `none` | no | `fleet.user` | in clear | Total invoiced by the workshop (minor currency units, e.g. cents) |
| `workshop` | text | `none` | no | `fleet.user` | in clear | Name of the workshop or garage |
| `notes` | longtext | `none` | no | `fleet.user` | in clear | What was done or found |
| `state` | select (planned, done, cancelled) | `none` | no | `fleet.user` | in clear | Job status: planned, done, cancelled |

## Workflows

### `fleet_vehicle`

| Action | Moves | Who may run it | Approval |
|---|---|---|---|
| `fleet_vehicle.dispatch` | state: available → in_service | `fleet.manager` | no |
| `fleet_vehicle.return_to_pool` | state: in_service → available | `fleet.manager` | no |
| `fleet_vehicle.retire` | state: available → retired | `fleet.approver` | yes |

### `fleet_vehicle_driver`

| Action | Moves | Who may run it | Approval |
|---|---|---|---|
| `fleet_vehicle_driver.suspend` | state: active → suspended | `fleet.manager` | no |
| `fleet_vehicle_driver.reactivate` | state: suspended → active | `fleet.manager` | no |

### `fleet_vehicle_service`

| Action | Moves | Who may run it | Approval |
|---|---|---|---|
| `fleet_vehicle_service.complete` | state: planned → done | `fleet.user` | no |
| `fleet_vehicle_service.cancel` | state: planned → cancelled | `fleet.user` | no |

## Permission groups

Groups used by this app:

- `fleet.approver`
- `fleet.manager`
- `fleet.user`

## Approval steps

Steps an agent can only propose:

- `fleet_vehicle.retire`

## 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: `fleet_vehicle.retire`, `fleet_vehicle.delete`, `fleet_vehicle_driver.delete`, `fleet_vehicle_service.delete`.

Personal data is masked as placeholder tokens: `fleet_vehicle.driver`, `fleet_vehicle_driver.name`, `fleet_vehicle_driver.phone`.

These fields are withheld from agents entirely: `fleet_vehicle_driver.licence_number`, `fleet_vehicle_driver.licence_expiry`.

## Dependencies

None.

## Install

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

```bash
obop modules install-from fleet
```

Needs a database and administrator rights.

## Build your own

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