medium complexity extracted Travel Reimbursement & Expense Handling Confidence: 100%
11
Components
198
Shared
12
User Stories
Yes
Analyzed

Description

Allows peer mentors to log kilometers driven for an activity, with the app calculating the reimbursement amount based on the current national rate. The entry form captures origin, destination (optional for privacy), and distance, with a default value pre-filled based on prior entries to minimize input friction for recurring routes. The total payout is shown in real time as distance is entered. A threshold rule (50 km by default, configurable per organization) determines whether the claim is auto-approved or routed to a coordinator for manual attestation. Claims below the threshold with no additional expenses are submitted silently without requiring any coordinator action, matching HLF's stated requirement that 60–70 % of registrations should be frictionless.

Analysis

Business Value

Directly addresses HLF's observation that a single peer mentor logged 380 individual registrations in one year. Auto-approval below threshold eliminates coordinator bottlenecks for the majority of low-value claims, while preserving oversight for higher-value ones.

Implementation Notes

Store the per-km rate and auto-approval threshold in org-level configuration (Supabase). Real-time calculation in widget layer, not BLoC, to keep UI responsive. On submit, evaluate threshold synchronously and set claim status to 'approved' or 'pending_review' before writing to database. Consider caching the last-used distance per user for the default prefill.

Components (209)

User Interface (4)

Service Layer (4)

Data Layer (1)

Infrastructure (2)

Shared Components

These components are reused across multiple features

User Interface (59)

ui Role Switch Widget medium Shared ui Role-Aware Bottom Navigation medium Shared ui Activity Type Selection Screen low Shared ui Speech-to-Text Field Overlay medium Shared ui Receipt Capture Widget medium Shared ui Peer Mentor Single Selector low Shared ui Proxy Audit Badge Widget low Shared ui Export Period Picker low Shared ui Contact Card Widget low Shared ui Contact Search Bar low Shared ui Peer Mentor Card Widget low Shared ui Activity History List low Shared ui Multi-Chapter Affiliation Chip Widget medium Shared ui Certification Status Badge low Shared ui Duplicate Activity Warning Dialog medium Shared ui Mentor Multi-Select Widget medium Shared ui Map Filter Panel medium Shared ui Claim Status Badge low Shared ui Export Date Range Picker low Shared ui Custom Date Range Picker low Shared ui Duplicate Activity Warning Dialog low Shared ui Proxy Activity Form medium Shared ui Proxy Peer Mentor Selector medium Shared ui Expected Return Date Picker low Shared ui Pause Activation Screen low Shared ui Pause Status Indicator low Shared ui Admin KPI Stat Widget low Shared ui Organisation Hierarchy Navigator high Shared ui Bufdir Period Selector Widget low Shared ui Export History List medium Shared ui Activity Type Donut Chart medium Shared ui Monthly Activity Bar Chart medium Shared ui Statistics Period Filter Bar low Shared ui Statistics Summary Cards low Shared ui Notification Badge Widget low Shared ui Certificate Expiry Status Indicator low Shared ui Animated Stat Card Widget medium Shared ui In-App Notification Banner low Shared ui Accessible Modal Sheet Widget high Shared ui Live Region Announcer medium Shared ui Semantics Wrapper Widget medium Shared ui Sensitive Field Warning Dialog high Shared ui Confirm Before Submit Screen medium Shared ui Inline Contextual Help Widget low Shared ui Labelled Navigation Bar low Shared ui Plain Language Error Display low Shared ui Single-Action Screen Layout medium Shared ui Wizard Progress Indicator low Shared ui Accessible Text Style System medium Shared ui Accessible Touch Target Wrapper low Shared ui Contrast-Safe Color Palette Widget medium Shared ui Accessible Bottom Navigation Bar medium Shared ui Modal Close Button low Shared ui Persistent Back Button low Shared ui Vertical Scroll Container low Shared ui Organization Card Widget low Shared ui Terminology-Aware Text Widget low Shared ui FeatureGate Widget low Shared ui Chapter Switcher medium Shared

Service Layer (52)

service Authentication Service medium Shared service Authentication Session Manager medium Shared service Biometric Authentication Service medium Shared service Biometric Authentication Service medium Shared service Biometric Authentication Service medium Shared service Permission Checker Service medium Shared service Role State Manager medium Shared service No-Access Route Guard low Shared service Activity Type Metadata Resolver low Shared service Chapter Scope Resolver medium Shared service Organisation Hierarchy Resolver medium Shared service Coordinator Notification Service medium Shared service Duplicate Activity Detection Service high Shared service Mentor Filter Service low Shared service Receipt Threshold Validator low Shared service Approval Status Notification Service medium Shared service Threshold Evaluation Service medium Shared service Declaration Encryption Service high Shared service Organization Feature Flag Service low Shared service Participant Deduplication Service high Shared service Reporting Period Service medium Shared service Activity Attribution Service low Shared service Proxy Duplicate Detection Service medium Shared service Pause Management Service medium Shared service Pause Notification Service medium Shared service Admin Export Service medium Shared service Admin Row-Level Security Guard high Shared service Organisation Hierarchy Service high Shared service User Management Service high Shared service Role Access Validator low Shared service Peer Mentor Stats Aggregator medium Shared service Push Notification Dispatcher medium Shared service Notification Preference Service low Shared service Scenario Deep-Link Router medium Shared service Scenario Notification Content Builder medium Shared service Badge Criteria Integration medium Shared service Activity Summary Aggregator low Shared service Focus Management Service medium Shared service Screen Reader Detection Service medium Shared service Sensitive Field Privacy Guard high Shared service Plain Language Content Service medium Shared service Wizard State Manager medium Shared service Tab State Manager medium Shared service Organization Route Guard medium Shared service Tenant Context Service high Shared service Label Key Resolver Service low Shared service Organization Labels Notifier medium Shared service FeatureFlagProvider (Riverpod) medium Shared service Access Scope Service high Shared service Hierarchy Aggregation Service high Shared service Hierarchy Service high Shared service Unit Assignment Service medium Shared

Data Layer (33)

Infrastructure (54)

infrastructure Keyboard-Aware Layout Utility low Shared infrastructure Supabase Auth Client low Shared infrastructure Deep Link / OAuth Redirect Handler medium Shared infrastructure Secure Storage Adapter low Shared infrastructure Supabase Session Manager medium Shared infrastructure URL Launcher Utility low Shared infrastructure Local Storage Adapter low Shared infrastructure Supabase Activity Client low Shared infrastructure Organization Labels Provider low Shared infrastructure Supabase Client low Shared infrastructure Organisation Field Config Loader medium Shared infrastructure Speech-to-Text Adapter medium Shared infrastructure File Download Handler low Shared infrastructure Duplicate Reviewed Flag Middleware low Shared infrastructure Contact RLS Query Builder low Shared infrastructure Contact Form Validator low Shared infrastructure Design Token Theme low Shared infrastructure Organization Labels Provider low Shared infrastructure Supabase Client Provider low Shared infrastructure Search Debounce Utility low Shared infrastructure Expense Type Analytics Tracker low Shared infrastructure Receipt Image Picker Integration low Shared infrastructure CSV / JSON File Generator medium Shared infrastructure Coordinator Role Guard low Shared infrastructure Nightly Job Scheduler medium Shared infrastructure Supabase RLS Policy Configuration high Shared infrastructure Export File Storage Adapter low Shared infrastructure Supabase Storage Adapter low Shared infrastructure Peer Mentor Pause Management Service medium Shared infrastructure Push Notification Service medium Shared infrastructure fl_chart Adapter medium Shared infrastructure Push Notification Service low Shared infrastructure FCM Push Notification Sender medium Shared infrastructure FCM Notification Dispatcher medium Shared infrastructure Push Notification Dispatcher medium Shared infrastructure Supabase Realtime Subscription Service medium Shared infrastructure Organisation Data Isolation Guard low Shared infrastructure Push Notification Dispatcher medium Shared infrastructure Deep Link Handler medium Shared infrastructure QR Code Generator low Shared infrastructure Share Sheet Bridge low Shared infrastructure Semantics Service Facade medium Shared infrastructure Accessibility Design Token Enforcer medium Shared infrastructure Accessible Theme Builder medium Shared infrastructure Navigation Route Configuration medium Shared infrastructure Accessibility Live Region Announcer low Shared infrastructure Feature Flag Provider low Shared infrastructure Secure Storage Adapter low Shared infrastructure Supabase RLS Tenant Scope Configurator medium Shared infrastructure Label Key Registry low Shared infrastructure Terminology Riverpod Providers low Shared infrastructure WCAG Semantics Label Resolver low Shared infrastructure Feature Flag Key Constants low Shared infrastructure RLS Policy Manager high Shared

User Stories (12)

Use Distance Pre-fill to Reduce Manual Entry Effort
medium 3 pts

As a As a Peer Mentor (Likeperson)

I want the app to suggest a pre-filled distance when I enter a known from/to route that I have used before

So that I can submit recurring mileage claims faster without retyping the same route and distance every time

Acceptance Criteria
  • Given I have previously submitted a claim for a route from address A to address B, When I next enter the same from/to combination in the route input fields, Then the distance field is pre-populated with the previously used distance
  • Given the distance field is pre-populated from cache, When I review the value, Then it is clearly indicated as a suggestion (e.g., prefilled label) and I can edit it freely
  • Given no cached route exists for my input, When the prefill service finds no match, Then the distance field remains empty and no incorrect suggestion is displayed
  • +2 more
View Full Story →
Track the Status of a Submitted Mileage Claim
medium 5 pts

As a As a Peer Mentor (Likeperson)

I want to see the current status of my submitted mileage claims (pending, approved, rejected) and a timeline of status changes

So that I know whether my reimbursement has been processed and do not need to contact my coordinator for status updates

Acceptance Criteria
  • Given I have submitted a mileage claim, When I view my claims list, Then each claim displays a claim status badge reflecting its current state (pending, auto-approved, approved, rejected)
  • Given a claim has been manually reviewed, When I open the claim detail, Then a claim status timeline shows each status transition with timestamps and, if applicable, the coordinator's comment
  • Given a claim was auto-approved, When I view its detail, Then the timeline shows a single 'Auto-approved' entry with the timestamp and the threshold rule that triggered it
  • +2 more
View Full Story →
Use Distance Pre-fill to Reduce Manual Entry Effort
medium 3 pts

As a As a Coordinator

I want the app to suggest a pre-filled distance when I enter a known from/to route that I have used before

So that I can submit recurring mileage claims faster without retyping the same route and distance every time

Acceptance Criteria
  • Given I have previously submitted a claim for a route from address A to address B, When I next enter the same from/to combination in the route input fields, Then the distance field is pre-populated with the previously used distance
  • Given the distance field is pre-populated from cache, When I review the value, Then it is clearly indicated as a suggestion (e.g., prefilled label) and I can edit it freely
  • Given no cached route exists for my input, When the prefill service finds no match, Then the distance field remains empty and no incorrect suggestion is displayed
  • +2 more
View Full Story →
Track the Status of a Submitted Mileage Claim
medium 5 pts

As a As a Coordinator

I want to see the current status of my submitted mileage claims (pending, approved, rejected) and a timeline of status changes

So that I know whether my reimbursement has been processed and do not need to contact my coordinator for status updates

Acceptance Criteria
  • Given I have submitted a mileage claim, When I view my claims list, Then each claim displays a claim status badge reflecting its current state (pending, auto-approved, approved, rejected)
  • Given a claim has been manually reviewed, When I open the claim detail, Then a claim status timeline shows each status transition with timestamps and, if applicable, the coordinator's comment
  • Given a claim was auto-approved, When I view its detail, Then the timeline shows a single 'Auto-approved' entry with the timestamp and the threshold rule that triggered it
  • +2 more
View Full Story →
View Real-Time Reimbursement Amount Before Submitting
high 3 pts

As a As a Peer Mentor (Likeperson)

I want to see the calculated reimbursement amount update live as I type in the distance or route

So that I can verify the claim is correct before submitting and avoid disputes or correction requests later

Acceptance Criteria
  • Given I am on the mileage entry form and the org rate has been loaded, When I type or adjust the distance value, Then the reimbursement amount updates in real time without requiring a separate action
  • Given the organization uses a custom per-km rate configured in the org rate config repository, When the calculation runs, Then the displayed amount reflects that organization's specific rate, not a hardcoded default
  • Given the distance field is empty or contains an invalid value, When the calculation would produce NaN or a negative result, Then the reimbursement display shows zero or a clear placeholder rather than an error
  • +2 more
View Full Story →
Attach a Receipt to a Mileage Claim When Required
high 5 pts

As a As a Peer Mentor (Likeperson)

I want to attach a photo of a receipt to my mileage or travel expense claim when the amount exceeds the organization's receipt threshold

So that my claim meets compliance requirements and is not rejected due to missing documentation

Acceptance Criteria
  • Given my mileage claim amount exceeds the configured receipt threshold for my organization, When I attempt to proceed to submission, Then I am prompted to attach a receipt before I can submit
  • Given I am prompted to attach a receipt, When I tap the attachment button, Then the receipt camera sheet opens and I can photograph the receipt or select from my gallery
  • Given I have captured a receipt image, When the image is processed, Then it is compressed by the receipt image compressor before being uploaded to the receipt storage repository
  • +3 more
View Full Story →
Select Expense Types That Are Mutually Exclusive With Mileage
high 5 pts

As a As a Peer Mentor (Likeperson)

I want to be prevented from selecting incompatible expense types together (e.g., mileage reimbursement and a public transit ticket for the same trip)

So that I cannot accidentally submit a fraudulent or inconsistent claim that would be rejected or require coordinator correction

Acceptance Criteria
  • Given I select 'mileage reimbursement' as my expense type, When the mutual exclusion rule engine evaluates the selection, Then all public transit ticket options are disabled and visually indicated as unavailable for that trip
  • Given I have mileage selected and attempt to also select a transit expense, When the UI renders, Then the conflicting option is either greyed out with an explanatory tooltip or automatically deselected with a notification
  • Given I switch from mileage to a public transit expense type, When the selection changes, Then the mileage-specific fields (route input, distance field) are hidden or cleared and replaced with transit-relevant fields
  • +2 more
View Full Story →
View Real-Time Reimbursement Amount Before Submitting
high 3 pts

As a As a Coordinator

I want to see the calculated reimbursement amount update live as I type in the distance or route

So that I can verify the claim is correct before submitting and avoid disputes or correction requests later

Acceptance Criteria
  • Given I am on the mileage entry form and the org rate has been loaded, When I type or adjust the distance value, Then the reimbursement amount updates in real time without requiring a separate action
  • Given the organization uses a custom per-km rate configured in the org rate config repository, When the calculation runs, Then the displayed amount reflects that organization's specific rate, not a hardcoded default
  • Given the distance field is empty or contains an invalid value, When the calculation would produce NaN or a negative result, Then the reimbursement display shows zero or a clear placeholder rather than an error
  • +2 more
View Full Story →
Attach a Receipt to a Mileage Claim When Required
high 5 pts

As a As a Coordinator

I want to attach a photo of a receipt to my mileage or travel expense claim when the amount exceeds the organization's receipt threshold

So that my claim meets compliance requirements and is not rejected due to missing documentation

Acceptance Criteria
  • Given my mileage claim amount exceeds the configured receipt threshold for my organization, When I attempt to proceed to submission, Then I am prompted to attach a receipt before I can submit
  • Given I am prompted to attach a receipt, When I tap the attachment button, Then the receipt camera sheet opens and I can photograph the receipt or select from my gallery
  • Given I have captured a receipt image, When the image is processed, Then it is compressed by the receipt image compressor before being uploaded to the receipt storage repository
  • +3 more
View Full Story →
Select Expense Types That Are Mutually Exclusive With Mileage
high 5 pts

As a As a Coordinator

I want to be prevented from selecting incompatible expense types together (e.g., mileage reimbursement and a public transit ticket for the same trip)

So that I cannot accidentally submit a fraudulent or inconsistent claim that would be rejected or require coordinator correction

Acceptance Criteria
  • Given I select 'mileage reimbursement' as my expense type, When the mutual exclusion rule engine evaluates the selection, Then all public transit ticket options are disabled and visually indicated as unavailable for that trip
  • Given I have mileage selected and attempt to also select a transit expense, When the UI renders, Then the conflicting option is either greyed out with an explanatory tooltip or automatically deselected with a notification
  • Given I switch from mileage to a public transit expense type, When the selection changes, Then the mileage-specific fields (route input, distance field) are hidden or cleared and replaced with transit-relevant fields
  • +2 more
View Full Story →
Submit a Mileage Reimbursement Claim for a Peer Support Visit
critical 8 pts

As a As a Peer Mentor (Likeperson)

I want to enter my travel distance and route when submitting a mileage reimbursement claim after a peer support visit

So that I can be reimbursed for my travel expenses accurately and without needing to calculate the amount myself

Acceptance Criteria
  • Given I open the mileage entry form, When the form loads, Then today's date is pre-filled and the distance field is focused
  • Given I enter a from-address and a to-address in the route input fields, When both fields are populated, Then the system attempts to prefill the distance using the distance prefill service and displays an estimated km value
  • Given I have entered or confirmed a distance in kilometers, When I view the reimbursement display, Then the calculated reimbursement amount updates in real time based on the organization's configured rate per km
  • +4 more
View Full Story →
Submit a Mileage Reimbursement Claim for a Peer Support Visit
critical 8 pts

As a As a Coordinator

I want to enter my travel distance and route when submitting a mileage reimbursement claim after a peer support visit

So that I can be reimbursed for my travel expenses accurately and without needing to calculate the amount myself

Acceptance Criteria
  • Given I open the mileage entry form, When the form loads, Then today's date is pre-filled and the distance field is focused
  • Given I enter a from-address and a to-address in the route input fields, When both fields are populated, Then the system attempts to prefill the distance using the distance prefill service and displays an estimated km value
  • Given I have entered or confirmed a distance in kilometers, When I view the reimbursement display, Then the calculated reimbursement amount updates in real time based on the organization's configured rate per km
  • +4 more
View Full Story →