> ## Documentation Index
> Fetch the complete documentation index at: https://docs.hr-easy.nlead.ch/llms.txt
> Use this file to discover all available pages before exploring further.

# Expenses

> Receipt capture with OCR, Swiss categories and per-diem rates, two-level approval, and payroll reimbursement.

Expense reports run from the photo of a receipt to a line on a payslip without anyone
retyping an amount.

## Capturing an expense

<Steps>
  <Step title="Photograph the receipt">From the portal or the mobile app.</Step>

  <Step title="OCR reads it">
    Claude extracts the merchant, date, amount, currency and VAT from the image. The extraction is a
    **draft**: it is shown to the employee to confirm or correct, never submitted silently.
  </Step>

  <Step title="Categorise">
    Swiss expense categories, with per-diem rates where they apply — meals, accommodation, mileage.
  </Step>

  <Step title="Add to a report">
    Individual items are grouped into a report for a trip, a month, or a project.
  </Step>
</Steps>

## Currencies

Items can be in any currency; each is converted to **CHF** at the applicable rate, and
both the original and the converted amount are kept. An expense in EUR stays visibly an
expense in EUR while reporting and reimbursement work in CHF.

## Policy

Categories carry a code (`MEALS`, `TRAVEL`, `ACCOMMODATION`, …), an optional per-item
policy limit, and whether a receipt is required at all.

An **expense policy** sets the numbers, with defaults matching Swiss practice:

| Setting            |     Default | Meaning                            |
| ------------------ | ----------: | ---------------------------------- |
| Mileage rate       | CHF 0.70/km | The Swiss federal rate.            |
| Per diem, full day |     CHF 120 | Full-day subsistence.              |
| Per diem, half day |      CHF 60 | Half-day subsistence.              |
| Receipt threshold  |      CHF 75 | Above this, a receipt is required. |
| Max single expense |    optional | Cap per item.                      |
| Max monthly total  |    optional | Cap per employee per month.        |

Per-category rules refine the policy where one category needs different treatment.

## Two-level approval

A report moves through an explicit status chain:

| Status             | Meaning                         |
| ------------------ | ------------------------------- |
| `DRAFT`            | Being composed by the employee. |
| `SUBMITTED`        | Awaiting the line manager.      |
| `MANAGER_APPROVED` | Awaiting finance.               |
| `FINANCE_APPROVED` | Approved, awaiting payment.     |
| `PAID`             | Reimbursed.                     |
| `REJECTED`         | Rejected, with a reason.        |

The manager asks whether the expense was incurred for the work and is reasonable;
finance asks whether it is correctly categorised, within policy, and within budget.
A rejection always carries a reason — the common case is a missing receipt, not a
disputed expense.

## Budget integration

An approved report deducts from the relevant department budget automatically, so budget
holders see committed spend as it happens rather than at period close. See
[Budgeting](/guides/finance/budgeting).

## Reimbursement

Approved expenses are reimbursed through payroll: they become a Lohnart on the next
run. Expense reimbursements are generally not salary and route through Lohnarten that
are outside the AHV base — which is a
[master-data](/guides/payroll/master-data#lohnarten) configuration, not a per-report
decision.

On installations syncing with [bexio](/guides/payroll/bexio), reimbursements flow there
instead.

## Receipts and retention

Receipt images are stored in Azure Blob Storage alongside the expense item. Swiss
retention rules for accounting documents apply, so receipts outlive the employment
relationship and are not removed by an employee deletion.

<Note>
  OCR is an assistance feature. The employee confirms what was extracted and the approvers see the
  original image next to the figures — the model's reading is never the sole record. See [AI
  transparency](/guides/ai/transparency).
</Note>

## Turning it off

`FEATURE_EXPENSES=false`.
