medium complexity v1.0 extracted Expense & Reimbursement Confidence: 100%
4
Components
43
Shared
0
User Stories
Yes
Analyzed

Description

Receipt Photo Upload enables peer mentors to photograph physical receipts and attach them to expense claims within the mobile app. HLF mandates receipt documentation for all expenses exceeding 100 kr, making photo capture a required step in the expense flow for those claims. The feature integrates with the device camera and photo library, compresses images before upload, and stores them as structured attachments on the `expense_receipts` table. This creates an auditable trail for reimbursement approval and accounting export without requiring manual scanning or email attachments.

Sources & reasoning

Section 2.1 explicitly states HLF requires receipt photos for expenses over 100 kr. The expense-reimbursement area sits in Phase 2 (SHOULD HAVE) of the priority matrix, giving target_release v1.0 per the ordinal phase mapping rule.

No source references — this artifact was included based on reasoning alone (see above).

Analysis

Business Value

Without embedded receipt capture, peer mentors must post or scan physical receipts separately - a process that routinely results in lost documentation, delayed reimbursement, and failed audit trails. Capturing the receipt at the moment of expense registration, linked directly to the claim, eliminates this gap and reduces coordinator follow-up effort significantly. For HLF this is a compliance requirement for claims above 100 kr. For other organisations it provides optional evidentiary support that strengthens reimbursement credibility and simplifies accounting integration with Xledger and Dynamics, where receipt references are expected in imported transaction records.

Implementation Notes

Uses Flutter's `image_picker` package for camera and gallery access. Images are compressed client-side (target ≤ 500 KB) before upload to a managed object store (S3-compatible). The `expense_receipts` table stores the storage URL, upload timestamp, file size, and a SHA-256 content hash for deduplication and integrity checking. The receipt step is conditionally required in the expense registration flow: mandatory when the selected expense type or amount exceeds the organisation-configured threshold, optional otherwise. Offline support stores image blobs in Drift until the mutation outbox syncs. Receipts are surfaced to coordinators in the Admin Web Portal approval queue.

Components (47)

User Interface (1)

Service Layer (1)

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.