medium complexity extracted Expense & Reimbursement Confidence: 100%
7
Components
39
Shared
0
User Stories
Yes
Analyzed

Description

Receipt Photo Upload allows peer mentors to photograph paper receipts directly within the expense registration flow and attach them to individual expense items. The feature uses the device camera or photo library, compresses images client-side before upload, and stores them securely server-side linked to the relevant expense item. HLF requires receipt documentation for any expense item exceeding 100 NOK. The feature integrates tightly with the expense form so the upload step appears contextually only when the selected expense type or amount triggers the receipt requirement, avoiding unnecessary friction for simple mileage-only claims.

Analysis

Business Value

Receipt documentation is a legal and organizational compliance requirement for expense reimbursement above defined thresholds. Without a digital capture flow, peer mentors must mail or hand-deliver paper receipts to coordinators, introducing delays of days or weeks and creating risk of loss. Digitizing receipt capture at the point of registration eliminates this lag and creates an auditable paper trail that satisfies both internal finance teams and external Bufdir auditors. For coordinators, having receipts attached directly to claims in the system removes a manual collection step and accelerates the approval queue, reducing administrative overhead across the organization.

Implementation Notes

Receipt capture uses Flutter's image_picker package to access the camera or gallery. Images are compressed client-side using the flutter_image_compress package to a maximum of 1 MB before upload, reducing bandwidth consumption for users on mobile data. The compressed image is uploaded as multipart/form-data to a dedicated backend endpoint that validates file type (JPEG/PNG only), stores the binary in object storage (S3-compatible), and writes a reference record to the expense_receipts table linked by expense_item_id. The mobile UI shows a thumbnail preview with a delete/retake option before the user finalizes the claim. The receipt upload step is conditionally rendered based on the expense type configuration returned by the Expense Validation Service. Offline queuing stores the image bytes in the Drift outbox and uploads on reconnect.

Components (46)

User Interface (2)

Service Layer (3)

Data Layer (1)

Infrastructure (1)

Shared Components

These components are reused across multiple features

User Stories

No user stories have been generated for this feature yet.