Receipt Photo Upload
Feature Detail
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
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.
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)
Shared Components
These components are reused across multiple features
Service Layer (11)
Data Layer (23)
Infrastructure (7)
User Stories
No user stories have been generated for this feature yet.