---
title: "Expenses"
description: "Claims and approvals. Employees file expense claims that move through draft, submitted, approved and paid."
canonical: "https://obop-platform.sliplane.app/apps/expenses/"
lang: "en"
---

# Expenses

## What it is for

Employees file expense claims that move through draft, submitted, approved and paid. Paying needs its own permission and a human approval; receipts are referenced by note, not stored.

## What the package does and does not do

Employee expense claims with a draft, submitted, approved and paid flow. Paying is a separate permission and needs a human approval; receipts are referenced by note, not stored.

## Models

### `expenses_expense`

An amount an employee spent for the business and wants reimbursed

Read group: `expenses.user`. Write group: `expenses.user`.

| Field | Kind | Data class | Personal data | Group | Agents see | Description |
|---|---|---|---|---|---|---|
| `description` | text | `none` | no | `expenses.user` | in clear | What the money was spent on |
| `employee` | text | `internal` | yes | `expenses.user` | masked | Name of the person claiming the expense |
| `spent_on` | date | `none` | no | `expenses.user` | in clear | Date of the purchase (YYYY-MM-DD) |
| `category` | select (travel, meals, lodging, supplies, software, other) | `none` | no | `expenses.user` | in clear | Expense category: travel, meals, lodging, supplies, software, other |
| `amount` | money | `financial` | yes | `expenses.user` | withheld | Amount owed to the employee (minor currency units, e.g. cents) |
| `currency` | text | `none` | no | `expenses.user` | in clear | ISO 4217 currency code, for example EUR |
| `receipt_note` | longtext | `none` | no | `expenses.user` | in clear | Where the receipt is kept and what it shows |
| `paid_on` | date | `financial` | yes | `expenses.finance` | withheld | Date the employee was reimbursed (YYYY-MM-DD) |
| `payment_reference` | text | `financial` | yes | `expenses.finance` | withheld | Bank transfer reference of the reimbursement |
| `state` | select (draft, submitted, approved, paid, refused) | `none` | no | `expenses.user` | in clear | Claim status: draft, submitted, approved, paid, refused |

## Workflows

### `expenses_expense`

| Action | Moves | Who may run it | Approval |
|---|---|---|---|
| `expenses_expense.submit` | state: draft → submitted | `expenses.user` | no |
| `expenses_expense.approve` | state: submitted → approved | `expenses.manager` | no |
| `expenses_expense.pay` | state: approved → paid | `expenses.finance` | yes |
| `expenses_expense.refuse` | state: submitted → refused | `expenses.manager` | no |

## Permission groups

Groups used by this app:

- `expenses.finance`
- `expenses.manager`
- `expenses.user`

## Approval steps

Steps an agent can only propose:

- `expenses_expense.pay`

## 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: `expenses_expense.pay`, `expenses_expense.delete`.

Personal data is masked as placeholder tokens: `expenses_expense.employee`.

These fields are withheld from agents entirely: `expenses_expense.amount`, `expenses_expense.paid_on`, `expenses_expense.payment_reference`.

## Dependencies

None.

## Install

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

```bash
obop modules install-from expenses
```

Needs a database and administrator rights.

## Build your own

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