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

Description

A structured expense type picker that presents fixed categories — kilometers driven, tolls, parking, and public transit — as discrete choices rather than free-text fields. The system enforces mutual exclusion rules so that logically incompatible combinations (e.g., mileage reimbursement and a bus ticket for the same trip leg) cannot be selected simultaneously, preventing erroneous claims before submission. The fixed-choice model reduces cognitive load for peer mentors, eliminates manual review overhead for coordinators, and produces clean structured data suitable for downstream accounting integration. Each choice maps to a known reimbursement formula, enabling automatic calculation of the expected payout without manual interpretation.

Analysis

Business Value

Eliminates the most common class of reimbursement errors (incompatible expense combinations) at the point of entry rather than during auditing, reducing coordinator review time and rejected claims. Structured data also unblocks reliable API export to accounting systems.

Implementation Notes

Model expense types as an enum with a compatibility matrix. Use a stateful multi-select widget that disables incompatible options reactively when a selection is made. BLoC or Riverpod state for the selection set; validation rule checked on each toggle. Map each type to its calculation logic (per-km rate, flat receipt amount, etc.).

Components (206)

User Interface (2)

Service Layer (4)

Data Layer (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 (10)

Expense Type Selection Tracked for Analytics and Audit
medium 3 pts

As a As a Peer Mentor (Likeperson)

I want my expense type selections and any mutual exclusion conflicts I encounter to be tracked anonymously

So that the organisation can identify which expense types are most used, which combinations are attempted incorrectly, and whether the exclusion rules are configured appropriately

Acceptance Criteria
  • Given a peer mentor selects an expense type, when the selection is confirmed, then an analytics event is recorded with the expense type ID, organisation ID, and a session token (no user ID)
  • Given a mutual exclusion conflict is triggered, when the conflicting type is disabled, then an analytics event records the pair of conflicting type IDs and the triggering type
  • Given a peer mentor abandons the expense flow after a mutual exclusion conflict, when the session ends, then an abandonment event is recorded linked to the conflict event
  • +2 more
View Full Story →
Expense Type Selection Tracked for Analytics and Audit
medium 3 pts

As a As a Coordinator

I want my expense type selections and any mutual exclusion conflicts I encounter to be tracked anonymously

So that the organisation can identify which expense types are most used, which combinations are attempted incorrectly, and whether the exclusion rules are configured appropriately

Acceptance Criteria
  • Given a peer mentor selects an expense type, when the selection is confirmed, then an analytics event is recorded with the expense type ID, organisation ID, and a session token (no user ID)
  • Given a mutual exclusion conflict is triggered, when the conflicting type is disabled, then an analytics event records the pair of conflicting type IDs and the triggering type
  • Given a peer mentor abandons the expense flow after a mutual exclusion conflict, when the session ends, then an abandonment event is recorded linked to the conflict event
  • +2 more
View Full Story →
View Real-Time Expense Calculation Preview Before Submitting
high 5 pts

As a As a Peer Mentor (Likeperson)

I want to see a live calculation of my estimated reimbursement amount as I select expense types and enter details

So that I can verify the claim is correct before submitting and understand exactly how the reimbursement is calculated

Acceptance Criteria
  • Given the peer mentor selects 'mileage' and enters a distance, when the distance field updates, then the preview panel recalculates and displays the reimbursement amount within 300 ms without a full page reload
  • Given the calculated amount is below the auto-approval threshold, when the preview renders, then a green indicator and label 'Auto-approved' are shown
  • Given the calculated amount exceeds the auto-approval threshold, when the preview renders, then an amber indicator and label 'Requires coordinator approval' are shown
  • +3 more
View Full Story →
Accessible Expense Type Selection for Users with Disabilities
high 5 pts

As a As a Peer Mentor (Likeperson)

I want the expense type picker to be fully operable with a screen reader, keyboard navigation, and large touch targets

So that I can register expenses accurately regardless of whether I have visual, motor, or cognitive accessibility needs

Acceptance Criteria
  • Given VoiceOver or TalkBack is active, when the expense type picker renders, then each card's accessibility label reads '[Type Name], [selected/not selected], [unavailable: reason if applicable]'
  • Given the peer mentor navigates with VoiceOver swipe gestures, when focus moves between expense type cards, then focus order follows visual top-to-bottom, left-to-right order
  • Given a mutual exclusion is triggered, when the state changes, then a live region announcement notifies the user without moving focus away from the current element
  • +3 more
View Full Story →
View Real-Time Expense Calculation Preview Before Submitting
high 5 pts

As a As a Coordinator

I want to see a live calculation of my estimated reimbursement amount as I select expense types and enter details

So that I can verify the claim is correct before submitting and understand exactly how the reimbursement is calculated

Acceptance Criteria
  • Given the peer mentor selects 'mileage' and enters a distance, when the distance field updates, then the preview panel recalculates and displays the reimbursement amount within 300 ms without a full page reload
  • Given the calculated amount is below the auto-approval threshold, when the preview renders, then a green indicator and label 'Auto-approved' are shown
  • Given the calculated amount exceeds the auto-approval threshold, when the preview renders, then an amber indicator and label 'Requires coordinator approval' are shown
  • +3 more
View Full Story →
Accessible Expense Type Selection for Users with Disabilities
high 5 pts

As a As a Coordinator

I want the expense type picker to be fully operable with a screen reader, keyboard navigation, and large touch targets

So that I can register expenses accurately regardless of whether I have visual, motor, or cognitive accessibility needs

Acceptance Criteria
  • Given VoiceOver or TalkBack is active, when the expense type picker renders, then each card's accessibility label reads '[Type Name], [selected/not selected], [unavailable: reason if applicable]'
  • Given the peer mentor navigates with VoiceOver swipe gestures, when focus moves between expense type cards, then focus order follows visual top-to-bottom, left-to-right order
  • Given a mutual exclusion is triggered, when the state changes, then a live region announcement notifies the user without moving focus away from the current element
  • +3 more
View Full Story →
Select Expense Type from Predefined Options
critical 5 pts

As a As a Peer Mentor (Likeperson)

I want to select my expense type from a fixed list of options rather than entering free text

So that I can quickly register the correct expense category without making errors or using inconsistent terminology

Acceptance Criteria
  • Given the peer mentor opens the expense registration flow, when the expense type picker renders, then only expense types enabled in the organisation's configuration are displayed
  • Given the expense type picker is visible, when the peer mentor taps an expense type card, then that card is visually highlighted and all other cards are deselected
  • Given an expense type is selected, when the form continues, then the subsequent fields shown are specific to that expense type (e.g., distance fields for mileage, amount field for parking)
  • +2 more
View Full Story →
Mutual Exclusion Prevents Invalid Expense Combinations
critical 8 pts

As a As a Peer Mentor (Likeperson)

I want the app to prevent me from selecting expense types that cannot be claimed together (such as mileage and public transport for the same journey)

So that I cannot accidentally submit an invalid combination that would be rejected during attestation or cause accounting errors

Acceptance Criteria
  • Given the peer mentor has selected 'mileage' as an expense type, when the expense type picker is still visible, then 'public transport' is visually disabled and labelled with a reason such as 'Cannot be combined with mileage'
  • Given a conflicting type is disabled, when the peer mentor taps it, then a tooltip or inline message explains why it cannot be selected without dismissing the picker
  • Given the peer mentor deselects 'mileage', when the picker updates, then 'public transport' becomes enabled again
  • +3 more
View Full Story →
Select Expense Type from Predefined Options
critical 5 pts

As a As a Coordinator

I want to select my expense type from a fixed list of options rather than entering free text

So that I can quickly register the correct expense category without making errors or using inconsistent terminology

Acceptance Criteria
  • Given the peer mentor opens the expense registration flow, when the expense type picker renders, then only expense types enabled in the organisation's configuration are displayed
  • Given the expense type picker is visible, when the peer mentor taps an expense type card, then that card is visually highlighted and all other cards are deselected
  • Given an expense type is selected, when the form continues, then the subsequent fields shown are specific to that expense type (e.g., distance fields for mileage, amount field for parking)
  • +2 more
View Full Story →
Mutual Exclusion Prevents Invalid Expense Combinations
critical 8 pts

As a As a Coordinator

I want the app to prevent me from selecting expense types that cannot be claimed together (such as mileage and public transport for the same journey)

So that I cannot accidentally submit an invalid combination that would be rejected during attestation or cause accounting errors

Acceptance Criteria
  • Given the peer mentor has selected 'mileage' as an expense type, when the expense type picker is still visible, then 'public transport' is visually disabled and labelled with a reason such as 'Cannot be combined with mileage'
  • Given a conflicting type is disabled, when the peer mentor taps it, then a tooltip or inline message explains why it cannot be selected without dismissing the picker
  • Given the peer mentor deselects 'mileage', when the picker updates, then 'public transport' becomes enabled again
  • +3 more
View Full Story →