Expense Types & Requirements
Feature Detail
Description
Expense Types & Requirements manages the configurable catalogue of reimbursable cost categories and the business rules that govern their use. Each expense type specifies which other types it is mutually exclusive with, whether a receipt is mandatory, and which approval path applies. Organisation admins can extend or restrict the default type catalogue from the admin portal. The mobile app fetches the active type list per organisation and enforces all rules at the form level, preventing invalid combinations before data reaches the API.
User Flow
Analysis
Uncontrolled free-text expense entry leads to duplicate categories, misclassification, and audit failures. A structured type catalogue enforced at the UI layer eliminates the most common data quality issues in expense reporting, reducing the manual correction workload for coordinators and accountants. For HLF specifically, preventing invalid combinations (e.g. simultaneously claiming km allowance and a bus ticket for the same journey) is a hard compliance requirement. A shared type catalogue also enables consistent Bufdir reporting across peer mentors and simplifies accounting system export mapping.
Expense types and their mutual-exclusion rules are stored in the expense_types table and served through a REST endpoint scoped to the authenticated user's organisation. The Flutter Expense Type Selector component fetches this list on screen load and applies exclusion logic reactively - selecting one type disables incompatible options. Receipt requirements are enforced by the form validator before allowing submission. The admin portal provides a CRUD interface for managing types per organisation. Default types are seeded during organisation onboarding and can be customised without affecting other tenants, supporting multi-tenancy isolation in the database layer.
Components (35)
Shared Components
These components are reused across multiple features
Service Layer (9)
Data Layer (12)
Infrastructure (7)
User Stories
No user stories have been generated for this feature yet.