Register OrgRateConfigRepository Riverpod provider
epic-mileage-reimbursement-entry-data-layer-task-003 — Expose OrgRateConfigRepository through a Riverpod StreamProvider so the rate config Stream is accessible application-wide. Ensure proper scoping to the active organisation tenant context and handle disposal on org switch.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 2 - 518 tasks
Can start after Tier 1 completes
Implementation Notes
Use `StreamProvider.autoDispose.family
Ensure the provider file exports are included in the barrel export if the project uses one.
Testing Requirements
Write a Riverpod provider test using ProviderContainer: (1) override orgRateConfigRepositoryProvider with a mock repository that emits a known OrgRateConfigLoaded value, (2) await the StreamProvider and assert it returns AsyncData wrapping the expected result, (3) verify that calling container.invalidate(orgRateConfigProvider) followed by re-reading re-subscribes to the mock repository's stream. Use flutter_test with ProviderContainer directly (no widget tree needed). Place tests in test/providers/mileage/org_rate_config_providers_test.dart.
If OrgRateConfigRepository caches the per-km rate aggressively and an admin updates the rate mid-session, ongoing form interactions will show the old rate until the Stream emits. This could result in the UI showing a rate that differs from what is stored when the claim is submitted, causing confusion or disputes.
Mitigation & Contingency
Mitigation: Subscribe to a Supabase Realtime channel for the org_configuration table so config changes propagate within seconds. Document the eventual-consistency window in code comments.
Contingency: If Realtime subscription proves unreliable in test, add a polling fallback with a configurable interval (default 5 minutes) and display a 'rate updated' toast when the stream emits a changed value.
The correction window within which a claim can be deleted or voided is not explicitly specified in the feature documentation. Implementing the wrong window (e.g. 24 hours vs 7 days) could lock users out of corrections or allow inappropriate post-approval modifications.
Mitigation & Contingency
Mitigation: Raise the correction window definition as a blocking question to the HLF product owner before implementing the delete/void path in MileageClaimRepository. Implement the window duration as an org-level configuration value rather than a hardcoded constant.
Contingency: If the question cannot be resolved before implementation, default to 24 hours as the most conservative option and flag the value for review in the first user-acceptance test.