Expense Approval Queue
Feature Detail
Description
The Expense Approval Queue gives organization administrators a centralized interface for reviewing, approving, and rejecting expense reimbursement claims submitted by peer mentors via the mobile app. Each entry shows expense type, amount, date, submitter, and any attached receipt, with actions to approve, reject, or request clarification. All decisions are timestamped and linked to the acting administrator for audit purposes. Claims that do not meet the auto-approval threshold are routed here automatically, ensuring manual review is focused only on higher-risk submissions. The queue supports filtering by status, date, and expense type, and triggers a push notification to the peer mentor on each decision.
Sources & reasoning
Line 70 states directly that claims above the threshold require manual attestation, implying a queue for those cases. Line 342 places reimbursement handling in Phase 2 of the roadmap, which maps to v1.0. The feature is the admin-side counterpart to the mobile expense registration flow and is required for HLF compliance.
-
docs/source/likeperson.md · line 70Automatisk godkjenning under 50 km / uten utlegg, manuell attestering ellers (HLF).
-
docs/source/likeperson.md · line 342Reiserefusjonshåndtering (faste valg, terskelbasert godkjenning)
Analysis
HLF explicitly requires manual attestation for expense claims above a defined threshold, making a dedicated approval queue a hard requirement for that organization rather than a convenience. Centralizing all pending claims in one view replaces email-and-spreadsheet approval chains that are error-prone and opaque, reducing processing time and improving auditability. Faster reimbursement cycles are a direct driver of volunteer retention - peer mentors who wait weeks for repayment are more likely to reduce activity. The queue also provides the financial data trail that underpins Bufdir compliance reporting, ensuring that every approved claim is traceable from submission through approval to export. This positions the queue as a foundation piece for the admin portal's oversight value proposition.
Implemented as a server-rendered Next.js page fetching paginated expense records from the REST API with organization-scoped queries enforced at the API layer. Each claim row expands to a detail view with receipt thumbnails loaded lazily. Approve and reject actions POST to a status-change endpoint; the backend validates the acting user's role and organization scope before committing. Status transitions are written to the audit_log_entries table. Notifications on approval or rejection are dispatched via the existing notification service. The queue page shares the same filtering component pattern used across the admin portal. Pagination uses cursor-based navigation to handle organizations with high claim volumes without offset drift.
Quality Assurance
Organization Administrator (primary)Organization Administrator
Quick UAT
- Logg inn i Admin-portalen som Organisasjonsadministrator. Naviger til Utgifter → Godkjenningskø.
- Bekreft at køen viser ventende krav med utleggstype, beløp, dato, innsender og eventuelt kvitteringsbilde.
- Bruk filteret til å snevre inn listen på status «Venter», og velg et enkelt krav for gjennomgang.
- Åpne kravdetaljsiden og verifiser at kvitteringsbildet kan forstørres og at all informasjon stemmer.
- Trykk «Godkjenn». Bekreft at kravet flyttes ut av køen og at statusen oppdateres til «Godkjent».
- Trykk tilbake til køen og velg et annet krav. Trykk «Avvis» og oppgi en begrunnelse. Bekreft at kravet får status «Avvist».
- Sjekk at likepersonen mottar en push-varsling om beslutningen (godkjent eller avvist) på mobilenheten.
- Åpne revisjonsloggen og bekreft at begge beslutningene er registrert med administratorens identitet og tidsstempel.
Quick UAT — Accessibility
-
Logg inn i Admin-portalen som Organisasjonsadministrator. Naviger til Utgifter → Godkjenningskø.
- Screen reader Sideoverskrift 'Godkjenningskø' annonseres ved lasting; navigasjonslenker er merket med lesbare etiketter.
- Keyboard / focus Tab-rekkefølge: toppnavigasjon → sidepanel → innholdsområde. Alle menypunkter nås med Tab og aktiveres med Enter.
-
Bekreft at køen viser ventende krav med utleggstype, beløp, dato, innsender og eventuelt kvitteringsbilde.
- Screen reader Tabellkolonner annonseres med kolonneoverskrift og celleinnhold for hvert krav. Status-ikonet har tekstlig alternativ, ikke bare farge.
- Contrast Statusetiketter formidler informasjon via tekst i tillegg til farge; kontrast minst 4,5:1 for all tekst.
-
Bruk filteret til å snevre inn listen på status «Venter», og velg et enkelt krav for gjennomgang.
- Keyboard / focus Filterdropdown nås med Tab; piltaster navigerer alternativer; Enter velger. Rader i tabellen nås med Tab og aktiveres med Enter.
- Focus visibility Synlig fokusring på filterkomponent og hver tabellrad; ingen fokusfelle i dropdown.
-
Åpne kravdetaljsiden og verifiser at kvitteringsbildet kan forstørres og at all informasjon stemmer.
- Screen reader Kvitteringsbilde har alt-tekst som beskriver innholdet (f.eks. 'Kvitteringsbilde — taxikvittering 15. april 2026').
- Touch target Knapper for forstørring av kvittering er minst 24×24 CSS-piksler.
- Zoom Siden er fullt lesbar og funksjonell ved 200 % zoom uten horisontal scrolling.
-
Trykk «Godkjenn». Bekreft at kravet flyttes ut av køen og at statusen oppdateres til «Godkjent».
- Keyboard / focus «Godkjenn»-knapp aktiveres med Enter eller mellomrom.
- Focus visibility Etter handlingen flyttes fokus til neste element i køen eller tilbake til kølisten; ingen fokustap.
- Live region 'Kravet er godkjent og fjernet fra køen.' meldes via polite live-region.
-
Trykk tilbake til køen og velg et annet krav. Trykk «Avvis» og oppgi en begrunnelse. Bekreft at kravet får status «Avvist».
- Keyboard / focus Dialog nås med Tab; Escape lukker uten å lagre; Tab sirkler mellom felt og knapper inne i dialogen.
- Focus visibility Begrunnelsesfelt merkes 'Obligatorisk' og får automatisk fokus når avvis-dialogen åpnes.
- Live region 'Kravet er avvist.' meldes via polite live-region etter bekreftelse.
-
Sjekk at likepersonen mottar en push-varsling om beslutningen (godkjent eller avvist) på mobilenheten.
- Screen reader Varslingsteksten i mobilappen annonseres av skjermleser med innhold og avsender (ingen informasjon kun via lyd eller farge).
- Contrast Varslingstoast på mobil har kontrast minst 4,5:1 mellom tekst og bakgrunn.
-
Åpne revisjonsloggen og bekreft at begge beslutningene er registrert med administratorens identitet og tidsstempel.
- Screen reader Tidsstempel og administratornavn annonseres som del av radinnholdet uten at informasjon utelates.
- Keyboard / focus Revisjonslogg-tabell nås med Tab; rader kan gjennomgås med piltaster; kolonneoverskrifter er sortérbare via Enter.
Role Boundaries
3 role(s) must NOT access this feature-
Peer Mentor
Admin-portalen er ikke tilgjengelig for Peer Mentors; innlogging omdirigeres til mobilappen. Deep-link til godkjenningskøen returnerer 403.
-
Coordinator
Koordinatorer logger kun inn på mobilappen og har ingen tilgang til Admin-portalen. Deep-link til godkjenningskøen returnerer 403.
-
Prospective Organization Representative
Ingen autentisert tilgang til Admin-portalen. Alle forsøk returnerer 401.
Expected End State
Kravet er behandlet og har fått status «Godkjent» eller «Avvist» i godkjenningskøen. Beslutningen er registrert i revisjonsloggen med administratorens identitet og eksakt tidsstempel. Likepersonen har mottatt en push-varsling om utfallet.
Components (21)
Shared Components
These components are reused across multiple features
User Stories
No user stories have been generated for this feature yet.