Transaction History Flow Flow: Transaction History Document: LLD-003 Version: 1.0 Date: 2026-02-21 Author: Frontend Architect (AI Agent) Status: Draft Scope: Transaction list rendering, filtering, pagination, transaction detail view, receipt download, and dispute initiation 1. Overview The transaction history view provides users with a chronological list of all their financial transactions (remittances and QR payments). The list supports filtering by type and status, date-based grouping, infinite scroll pagination, and drill-down to transaction detail with receipt download. Key capabilities: Paginated transaction list (20 per page, max 50) Filter by type: All, Remittance, QR Payment Filter by status: Processing, Completed, Failed Date grouping: I dag, I gar, Denne uken, Eldre Transaction detail view with exchange rate info Receipt download (JSON receipt) Complaint/dispute initiation via /complaints 2. Transaction List Load + Filter + Detail View 2.1 Sequence Diagram sequenceDiagram actor User participant App as Drop App
(/transactions) participant API as Drop API participant DB as Database User->>App: Navigate to /transactions App->>App: useAuth() — verify authenticated App->>API: GET /api/transactions?page=1&limit=20 API->>API: JWT verification (cookie/Bearer) API->>DB: SELECT transactions WHERE user_id = ?
ORDER BY created_at DESC LIMIT 20 API-->>App: { data: [...], pagination: { page: 1, limit: 20, total: N } } App->>App: groupByDate(transactions)
→ "I dag", "I gar", "Denne uken", "Eldre" App->>App: Render grouped transaction list User->>App: Tap filter "Overforinger" App->>API: GET /api/transactions?type=remittance&limit=50 API->>DB: SELECT WHERE type = 'remittance' API-->>App: { data: [...filtered...] } App->>App: Re-group and render User->>App: Scroll to bottom (infinite scroll) App->>API: GET /api/transactions?page=2&limit=20&type=remittance API-->>App: { data: [...more...], pagination: { page: 2 } } App->>App: Append to list, re-group User->>App: Tap transaction row App->>API: GET /api/transactions/{id} API->>DB: SELECT transaction with exchange_rate info API-->>App: { data: { ...fullDetails } } App->>App: Show transaction detail modal/page User->>App: Tap "Last ned kvittering" App->>API: GET /api/transactions/{id}/receipt API-->>App: { data: { receipt } } App->>App: Download/display receipt User->>App: Tap "Klag" (dispute) App->>App: Navigate to /complaints
with transaction context 3. Transaction List Components 3.1 Component Diagram graph TD subgraph "Transaction History Page" PageHeader["PageHeader
Back button + 'Transaksjonshistorikk' title"] FilterTabs["FilterTabs
(Tabs component)"] TransactionList["TransactionList
(scrollable area)"] LoadMore["LoadMore Trigger
(infinite scroll sentinel)"] end subgraph "Filter Tabs" TabAll["Alle
(all types)"] TabRemittance["Overforinger
(type=remittance)"] TabQR["QR-betalinger
(type=qr_payment)"] end subgraph "Transaction List Items" DateGroup["DateGroupHeader
('I DAG', 'I GAR', etc.)"] TransactionCard["TransactionCard"] end subgraph "Transaction Card" TxIcon["TypeIcon
(ArrowUpRight, ScanLine, Clock)"] TxInfo["TxInfo
(name, type label)"] TxAmount["TxAmount
(amount + status badge)"] end subgraph "Transaction Detail" DetailHeader["DetailHeader
(back + title)"] DetailSummary["DetailSummary
(type, status, date)"] AmountBreakdown["AmountBreakdown
(send, receive, rate, fee)"] RecipientInfo["RecipientInfo
(name, country, bank)"] ReceiptButton["ReceiptButton
('Last ned kvittering')"] DisputeButton["DisputeButton
('Klag')"] end FilterTabs --> TabAll FilterTabs --> TabRemittance FilterTabs --> TabQR TransactionList --> DateGroup DateGroup --> TransactionCard TransactionCard --> TxIcon TransactionCard --> TxInfo TransactionCard --> TxAmount TransactionCard -->|tap| DetailHeader DetailHeader --> DetailSummary DetailSummary --> AmountBreakdown AmountBreakdown --> RecipientInfo RecipientInfo --> ReceiptButton RecipientInfo --> DisputeButton 4. Filter Options 4.1 Filter Options Table Filter API Parameter Value Label (Norwegian) Default All transactions (none) — Alle Yes Remittances only type remittance Overforinger No QR payments only type qr_payment QR-betalinger No Processing status status processing Behandles No Completed status status completed Fulfort No Failed status status failed Mislykket No 4.2 Pagination Parameters Parameter Type Default Min Max Description page int 1 1 — Page number limit int 20 1 50 Items per page 5. Transaction Status Display Mapping Status Label (Norwegian) Color Icon Background completed Fulfort #0B6E35 (green) ArrowUpRight / ScanLine #F8FAFC processing Behandles #D4A017 (gold) Clock #FEF3C7 failed Mislykket #EF4444 (red) X #FEF2F2 5.1 Transaction Type Icons Type Icon Color Description remittance (sent) ArrowUpRight #0B6E35 Outgoing international transfer qr_payment ScanLine #0B6E35 QR code payment to merchant remittance (processing) Clock #D4A017 Transfer in progress 5.2 Amount Display Condition Format Color Example Outgoing (sent) -{amount} kr #0F172A (dark) -2 000 kr Incoming (received) +{amount} kr #10B981 (green) +5 000 kr Processing -{amount} kr #0F172A (dark) -3 000 kr 6. Date Grouping Logic The groupByDate() function categorizes transactions into temporal groups: Group Label Condition Today I DAG createdAt is today Yesterday I GAR createdAt is yesterday This Week DENNE UKEN createdAt is within current week (Mon-Sun) Older Date string (e.g., "12. OKT") All older transactions, grouped by date 7. Transaction Detail View 7.1 Remittance Detail Fields Field Source Example Transaction ID data.id tx_rem_a1b2c3d4e5f6g7h8 Type data.type Overforing Status data.status Fullfort Send Amount data.sendAmount + data.sendCurrency 2 000 NOK Receive Amount data.receiveAmount + data.receiveCurrency 23 400 RSD Exchange Rate data.exchangeRate 1 NOK = 11.70 RSD Fee data.fee 10.00 NOK (0.5%) Total Cost data.total 2 010 NOK Recipient data.recipientName Mama Jasmina Destination data.recipientCountry Serbia Created data.createdAt 21. feb 2026 kl. 14:32 Completed data.completedAt 21. feb 2026 kl. 14:35 7.2 QR Payment Detail Fields Field Source Example Transaction ID data.id tx_qr_a1b2c3d4e5f6g7h8 Type data.type QR-betaling Status data.status Fullfort Amount data.amount 129 NOK Fee data.fee 1.29 NOK (1%) Merchant data.merchantName Ahmetov Kebab Source Account data.fromAccount DNB Created data.createdAt 21. feb 2026 kl. 12:15 7.3 Receipt Endpoint GET /api/transactions/{id}/receipt returns a structured receipt: { "data": { "transactionId": "tx_rem_1", "date": "2026-02-21T14:32:00.000Z", "type": "remittance", "amount": 2000, "currency": "NOK", "fee": 10, "exchangeRate": 11.7, "receiveAmount": 23400, "receiveCurrency": "RSD", "recipient": { "name": "Mama Jasmina", "country": "RS" }, "reference": "tx_rem_1", "status": "completed", "completedAt": "2026-02-21T14:35:00.000Z" } } 8. Dispute Initiation Users can initiate a dispute from the transaction detail view by navigating to the complaints page: Step Action 1 User taps "Klag" on transaction detail 2 Navigate to /complaints with pre-filled category = "transaction" 3 User fills subject and description 4 POST /api/complaints { category: "transaction", subject, description } 5 Confirmation: "Vi behandler klagen din innen 15 virkedager" (Finansavtaleloven 3-53) 9. Platform Differences Feature Web ( /transactions ) Mobile ( history.js ) Filter tabs Tabs component (Alle, Overforinger, QR-betalinger) Custom buttons (Alle, Sendinger, QR) Pagination Infinite scroll with limit=50 FlatList with pull-to-refresh Transaction detail Inline expansion or modal Separate screen (not yet implemented) Receipt download API call + browser download Not implemented Dispute link Navigate to /complaints Not implemented Date grouping groupByDate() utility Same pattern Refresh Re-fetch on filter change Pull-to-refresh via RefreshControl 10. Accessibility Considerations (WCAG 2.1 AA) Requirement Implementation List semantics Transaction list uses semantic list markup Filter announcement Active filter tab announced to screen readers Amount polarity Positive/negative amounts use text prefix (+/-) in addition to color Status indication Status uses both color AND text label (not color alone) Tap targets Transaction cards are full-width, min 48px height Loading state Skeleton placeholders shown during initial load Empty state "Ingen transaksjoner" message when list is empty Keyboard nav Tab cycles through filters, then transaction items 11. Cross-References Transaction list API: GET /api/transactions — See API Reference Transaction detail API: GET /api/transactions/{id} — See API Reference Receipt API: GET /api/transactions/{id}/receipt — See API Reference Complaints API: POST /api/complaints — See API Reference Transaction schema: transactions table — See Database Schema Component overview: See component-overview.md Figma transaction history: mockups/figma-make-export/src/app/screens/TransactionHistory.tsx Web page: src/drop-app/src/app/transactions/page.tsx — See PAGES.md Mobile screen: src/drop-mobile/app/history.js — See MOBILE-APP.md QR payment flow: See flow-qr-payment.md