Receipt Photo Upload
Feature Detail
Description
Allows peer mentors to photograph and attach receipts to expense entries using the device camera or photo library. Receipt attachment is required for claims above the org-configured monetary threshold (100 kr per HLF requirements) and the form blocks submission until a qualifying receipt is attached. Uploaded images are stored securely in cloud object storage, linked to the expense record in the database, and accessible to coordinators and org admins in the Admin Web Portal approval queue. Offline capture stores the compressed image locally and uploads it when connectivity is restored, before the expense record syncs.
Sources & reasoning
Line 68 states a hard receipt photo requirement for claims over 100 kr (HLF). Line 69 confirms that claims without receipts qualify for auto-approval, establishing the conditional enforcement logic. The Phase 2 roadmap (line 343) groups this under Reiserefusjonshåndtering, placing it at v1.0.
-
docs/source/likeperson.md · line 68Kvitteringsbilde for utlegg over 100 kr (HLF).
-
docs/source/likeperson.md · line 69Automatisk godkjenning under 50 km / uten utlegg, manuell attestering ellers (HLF).
Analysis
HLF explicitly requires receipt photos for expense claims over 100 kr, necessary for internal compliance and external audit trails including Bufdir accountability. Without a digital capture mechanism, peer mentors must mail or scan paper receipts, introducing delays, loss risk, and manual coordinator effort to match receipts to claims. A camera-based upload integrated into the expense flow increases compliance: peer mentors capture the receipt at the moment of purchase rather than managing paper later. Coordinators gain instant access to supporting documentation in the approval queue, accelerating decision-making and reducing back-and-forth communication. The feature also supports Blindeforbundet's broader digitization strategy for volunteer workflows.
Use the Flutter image_picker package to access the device camera and photo library. Images are compressed client-side before upload to reduce bandwidth and storage costs. Upload targets a signed URL endpoint, storing files in cloud object storage with references saved to the expense_receipts table. The expense form conditionally requires a receipt attachment based on the claim amount and the org-configured threshold fetched at runtime. The Riverpod expense provider tracks upload state (pending, uploading, complete, error) and blocks form submission until a required receipt is attached. Offline queuing stores compressed image bytes in the Drift mutation outbox alongside the expense record; the image uploads when connectivity is restored before the expense syncs.
Components (7)
Shared Components
These components are reused across multiple features
User Stories
No user stories have been generated for this feature yet.