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

Description

Provides export of approved expense claims in formats compatible with Xledger (Blindeforbundet) and the Dynamics portal (HLF). At minimum, this includes a structured CSV/JSON export that maps claim fields to the target system's chart of accounts. The long-term target is a direct API integration where approved claims are pushed automatically to the accounting system without manual file transfer. The export covers all approved claims in a configurable date range, grouped by peer mentor and expense type. The export record is marked in the database to prevent double-export. Coordinators and org admins can trigger exports from the admin interface; the system confirms how many claims were included and flags any that were skipped due to missing required fields.

Analysis

Business Value

Eliminates manual re-keying of approved claims into accounting systems, which is currently a significant source of errors and coordinator time. A reliable export path is a prerequisite for organizations to trust the app as their system of record for reimbursements.

Implementation Notes

Abstract the export format behind an `AccountingExporter` interface with org-specific implementations (XledgerExporter, DynamicsExporter). For MVP, file-based export (CSV download) is acceptable; API push can follow. Use Supabase Edge Functions for server-side export generation to avoid exposing accounting credentials to the mobile client. Store export run metadata (timestamp, claim IDs included, org, triggered by) for audit.

Components (210)

User Interface (3)

Service Layer (4)

Data Layer (3)

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 (16)

Configure Excluded Expense Types from Accounting Export
medium 3 pts

As a As a Coordinator

I want to specify which expense categories or activity types should be excluded from accounting exports

So that internal honoraria or non-reimbursable items are not incorrectly submitted to the accounting system and cause reconciliation errors

Acceptance Criteria
  • Given a coordinator opens the exclusions configuration panel, when the page loads, then all expense types and activity categories are listed with toggle switches
  • Given a coordinator marks an expense type as excluded, when they save and later run an export, then claims of that type are not included in the export count or file regardless of their approval status
  • Given an excluded expense type has pending claims, when the coordinator views the export preview, then a summary shows how many records are being excluded and why
  • +2 more
View Full Story →
Download Export File for Manual Submission
medium 5 pts

As a As a Coordinator

I want to download a CSV or JSON export file of approved claims when direct API integration is not available or temporarily unavailable

So that I can manually upload reimbursement data to our accounting system and maintain continuity during integration outages or onboarding periods

Acceptance Criteria
  • Given a coordinator selects a date range and chooses Download as CSV, when they confirm, then a correctly formatted CSV file is generated and downloaded containing all approved claims for that period
  • Given a coordinator chooses Download as JSON, when they confirm, then a structured JSON file with the same data is downloaded with field names matching the organization's configured field mappings
  • Given the CSV is opened in a spreadsheet application, when the coordinator reviews it, then column headers correspond to the target accounting system's expected import field names
  • +2 more
View Full Story →
Configure Excluded Expense Types from Accounting Export
medium 3 pts

As a As a Organization Administrator

I want to specify which expense categories or activity types should be excluded from accounting exports

So that internal honoraria or non-reimbursable items are not incorrectly submitted to the accounting system and cause reconciliation errors

Acceptance Criteria
  • Given a coordinator opens the exclusions configuration panel, when the page loads, then all expense types and activity categories are listed with toggle switches
  • Given a coordinator marks an expense type as excluded, when they save and later run an export, then claims of that type are not included in the export count or file regardless of their approval status
  • Given an excluded expense type has pending claims, when the coordinator views the export preview, then a summary shows how many records are being excluded and why
  • +2 more
View Full Story →
Download Export File for Manual Submission
medium 5 pts

As a As a Organization Administrator

I want to download a CSV or JSON export file of approved claims when direct API integration is not available or temporarily unavailable

So that I can manually upload reimbursement data to our accounting system and maintain continuity during integration outages or onboarding periods

Acceptance Criteria
  • Given a coordinator selects a date range and chooses Download as CSV, when they confirm, then a correctly formatted CSV file is generated and downloaded containing all approved claims for that period
  • Given a coordinator chooses Download as JSON, when they confirm, then a structured JSON file with the same data is downloaded with field names matching the organization's configured field mappings
  • Given the CSV is opened in a spreadsheet application, when the coordinator reviews it, then column headers correspond to the target accounting system's expected import field names
  • +2 more
View Full Story →
View and Manage Export History
high 5 pts

As a As a Coordinator

I want to view a full history of past accounting exports including date, period covered, record count, and outcome

So that I can confirm which periods have been submitted, identify failed exports that need retrying, and provide audit evidence when finance queries arise

Acceptance Criteria
  • Given a coordinator opens the export history panel, when the page loads, then all past export runs for their organization are listed in reverse chronological order
  • Given an export run is displayed, when the coordinator taps it, then they see the covered period, record count, target system, initiating user, and individual claim references
  • Given a failed export run exists, when the coordinator views it, then a Retry button is visible and re-triggers the export edge function for that run
  • +2 more
View Full Story →
Monitor Integration Health and Receive Failure Alerts
high 5 pts

As a As a Coordinator

I want to see the current health status of the accounting system integration and receive alerts when the connection breaks or an export fails

So that I am not left unaware of silent failures that could result in missed reimbursements going unnoticed for weeks

Acceptance Criteria
  • Given the accounting integration is configured, when the coordinator opens the integration dashboard, then they see a health indicator showing Connected, Degraded, or Error with a last-checked timestamp
  • Given the accounting system returns an authentication error during a scheduled health check, when the error is detected, then the coordinator receives an in-app notification and the dashboard shows an Error state with guidance to check credentials
  • Given an export edge function call fails due to a network timeout, when the failure is logged, then the export run is marked as failed in the export-run-repository and the coordinator is notified
  • +2 more
View Full Story →
Map App Fields to Accounting System Chart of Accounts
high 8 pts

As a As a Coordinator

I want to define how expense types and cost categories in the app correspond to account codes in our accounting system

So that exported data is correctly classified in our chart of accounts without requiring the finance team to manually recode entries after import

Acceptance Criteria
  • Given a coordinator opens the field mapping editor, when the page loads, then all expense types and activity categories defined in the app are listed with empty mapping fields for the target system
  • Given the coordinator assigns an account code to an expense type, when they save, then the chart-of-accounts-mapper uses this mapping for all future exports
  • Given an expense type has no mapping defined, when a coordinator triggers an export that includes claims of that type, then the system warns about unmapped categories and prevents export until resolved
  • +2 more
View Full Story →
View and Manage Export History
high 5 pts

As a As a Organization Administrator

I want to view a full history of past accounting exports including date, period covered, record count, and outcome

So that I can confirm which periods have been submitted, identify failed exports that need retrying, and provide audit evidence when finance queries arise

Acceptance Criteria
  • Given a coordinator opens the export history panel, when the page loads, then all past export runs for their organization are listed in reverse chronological order
  • Given an export run is displayed, when the coordinator taps it, then they see the covered period, record count, target system, initiating user, and individual claim references
  • Given a failed export run exists, when the coordinator views it, then a Retry button is visible and re-triggers the export edge function for that run
  • +2 more
View Full Story →
Monitor Integration Health and Receive Failure Alerts
high 5 pts

As a As a Organization Administrator

I want to see the current health status of the accounting system integration and receive alerts when the connection breaks or an export fails

So that I am not left unaware of silent failures that could result in missed reimbursements going unnoticed for weeks

Acceptance Criteria
  • Given the accounting integration is configured, when the coordinator opens the integration dashboard, then they see a health indicator showing Connected, Degraded, or Error with a last-checked timestamp
  • Given the accounting system returns an authentication error during a scheduled health check, when the error is detected, then the coordinator receives an in-app notification and the dashboard shows an Error state with guidance to check credentials
  • Given an export edge function call fails due to a network timeout, when the failure is logged, then the export run is marked as failed in the export-run-repository and the coordinator is notified
  • +2 more
View Full Story →
Map App Fields to Accounting System Chart of Accounts
high 8 pts

As a As a Organization Administrator

I want to define how expense types and cost categories in the app correspond to account codes in our accounting system

So that exported data is correctly classified in our chart of accounts without requiring the finance team to manually recode entries after import

Acceptance Criteria
  • Given a coordinator opens the field mapping editor, when the page loads, then all expense types and activity categories defined in the app are listed with empty mapping fields for the target system
  • Given the coordinator assigns an account code to an expense type, when they save, then the chart-of-accounts-mapper uses this mapping for all future exports
  • Given an expense type has no mapping defined, when a coordinator triggers an export that includes claims of that type, then the system warns about unmapped categories and prevents export until resolved
  • +2 more
View Full Story →
Prevent Duplicate Export Submissions for the Same Period
critical 5 pts

As a As a Coordinator

I want to be warned and blocked when I attempt to export a period that has already been submitted to the accounting system

So that we avoid duplicate entries in our accounting ledger that would require manual correction and create financial discrepancies

Acceptance Criteria
  • Given a period has been successfully exported, when a coordinator selects the same date range and triggers export, then the double-export guard intercepts before any claims are queried and shows a warning with the original export run details
  • Given the coordinator sees the duplicate warning, when they tap Cancel, then no export is executed and the screen returns to the date range picker
  • Given the coordinator sees the duplicate warning, when they tap Override and Confirm, then the export proceeds and the new run is logged as a deliberate re-export with the override noted
  • +2 more
View Full Story →
Configure Accounting System Integration Credentials
critical 8 pts

As a As a Coordinator

I want to securely configure and test the connection between the app and our organization's accounting system

So that exported claims reach the correct Xledger or Dynamics environment without manual IT involvement for each export

Acceptance Criteria
  • Given a coordinator opens the integration setup wizard, when they select an integration type (Xledger or Dynamics), then the wizard presents the appropriate credential fields for that system
  • Given credentials are entered, when the coordinator taps Test Connection, then the system performs a lightweight authenticated call to the accounting system and reports success or failure with a human-readable message
  • Given a successful test, when the coordinator saves the configuration, then credentials are encrypted and stored in the accounting-credentials-vault and are never displayed in plaintext again
  • +2 more
View Full Story →
Export Approved Expense Claims to Accounting System
critical 13 pts

As a As a Coordinator

I want to export all approved expense claims for a selected date range directly to our connected accounting system (Xledger or Dynamics)

So that the finance team receives accurate, structured reimbursement data without manual re-entry or risk of transcription errors

Acceptance Criteria
  • Given a coordinator opens the accounting export screen, when they select a date range and tap Export, then the system queries all approved claims in that period and displays a count before confirmation
  • Given a coordinator confirms the export, when the export runs, then approved claims are mapped to the correct accounts via chart-of-accounts-mapper and sent to the configured system (Xledger or Dynamics)
  • Given a period has already been exported, when a coordinator attempts to re-export the same period, then the double-export guard warns them and requires explicit override before proceeding
  • +2 more
View Full Story →
Prevent Duplicate Export Submissions for the Same Period
critical 5 pts

As a As a Organization Administrator

I want to be warned and blocked when I attempt to export a period that has already been submitted to the accounting system

So that we avoid duplicate entries in our accounting ledger that would require manual correction and create financial discrepancies

Acceptance Criteria
  • Given a period has been successfully exported, when a coordinator selects the same date range and triggers export, then the double-export guard intercepts before any claims are queried and shows a warning with the original export run details
  • Given the coordinator sees the duplicate warning, when they tap Cancel, then no export is executed and the screen returns to the date range picker
  • Given the coordinator sees the duplicate warning, when they tap Override and Confirm, then the export proceeds and the new run is logged as a deliberate re-export with the override noted
  • +2 more
View Full Story →
Configure Accounting System Integration Credentials
critical 8 pts

As a As a Organization Administrator

I want to securely configure and test the connection between the app and our organization's accounting system

So that exported claims reach the correct Xledger or Dynamics environment without manual IT involvement for each export

Acceptance Criteria
  • Given a coordinator opens the integration setup wizard, when they select an integration type (Xledger or Dynamics), then the wizard presents the appropriate credential fields for that system
  • Given credentials are entered, when the coordinator taps Test Connection, then the system performs a lightweight authenticated call to the accounting system and reports success or failure with a human-readable message
  • Given a successful test, when the coordinator saves the configuration, then credentials are encrypted and stored in the accounting-credentials-vault and are never displayed in plaintext again
  • +2 more
View Full Story →
Export Approved Expense Claims to Accounting System
critical 13 pts

As a As a Organization Administrator

I want to export all approved expense claims for a selected date range directly to our connected accounting system (Xledger or Dynamics)

So that the finance team receives accurate, structured reimbursement data without manual re-entry or risk of transcription errors

Acceptance Criteria
  • Given a coordinator opens the accounting export screen, when they select a date range and tap Export, then the system queries all approved claims in that period and displays a count before confirmation
  • Given a coordinator confirms the export, when the export runs, then approved claims are mapped to the correct accounts via chart-of-accounts-mapper and sent to the configured system (Xledger or Dynamics)
  • Given a period has already been exported, when a coordinator attempts to re-export the same period, then the double-export guard warns them and requires explicit override before proceeding
  • +2 more
View Full Story →