Skip to content

Wallet Analytics & Reporting - Complete Implementation Summary

📋 Overview

This document summarizes the complete wallet analytics and reporting implementation for the Bank USSD platform. The implementation includes backend analytics functions, API endpoints, and frontend dashboard pages with charts, KPI cards, and detailed reporting capabilities.


✅ Phase 1: Backend Analytics Functions

Location: backend/controller/wallet.py

1. get_wallet_analytics()

Purpose: Generate KPI metrics dashboard data
Features: - Active wallet count - Total balance across all wallets - Transaction volume (count + amount) - Fee revenue aggregation - Period comparison with trend indicators - KYC and status distributions - Default: today's data with optional date range

Key Metrics: - Active Wallets: Count of wallets with status = 'active' - Total Balance: Sum of current_balance from WalletBalance table - Transaction Volume: Count and sum of POSTED debit/credit entries - Fee Revenue: Sum of fee_amount from Charge records with tag='bank_charges' - Trends: % change vs previous period


Purpose: Time-series transaction data for trend charting
Features: - Daily, weekly, or monthly aggregation levels - Debit and credit metrics separately - Transaction count and amount tracking - Period-based grouping

Output Format:

{
  "period": { "from": "2024-01-01", "to": "2024-01-31", "aggregation": "daily" },
  "data": [
    { "date": "2024-01-01", "debits_count": 45, "debits_amount": 12500.50, "credits_count": 32, "credits_amount": 8900.00 },
    ...
  ]
}


3. get_wallet_distribution()

Purpose: Wallet distribution across categories
Features: - Status distribution (active, suspended, frozen, etc.) - KYC level distribution (none, basic, full, etc.) - Top currencies by transaction volume - Used for pie/donut chart visualization

Output Categories: - By Status: active, inactive, suspended, frozen - By KYC Level: none, basic, full, kyc_approved - By Currency: Top 5 currencies with transaction counts and amounts


4. get_wallet_top_performers()

Purpose: Leaderboard of high-activity wallets
Features: - Sort by transaction_volume, transaction_count, or balance - Configurable limit (1-100 wallets) - Customer name and KYC level included - Date range filtering - Default: 30 days, sorted by volume


5. get_wallet_fee_report()

Purpose: Fee collection analytics and breakdown
Features: - Breakdown by fee type (bank_charges, service_charges, etc.) - Count and total amount per fee type - Average fee calculation - Optional wallet-specific filtering - Date range filtering (default: 30 days)


6. get_reconciliation_summary()

Purpose: Reconciliation status and metrics
Features: - Reconciled vs pending entry counts - Reconciliation completion percentage - Discrepancy count (reversed entries) - Recent reconciliation history (last 10 records) - Activity timeline


✅ Phase 2: Backend API Endpoints

Location: backend/routers/wallet.py

Endpoint 1: POST /wallet/analytics/dashboard

Permission: view_wallet_analytics
Query Parameters: - date_from (optional): ISO format date (default: today) - date_to (optional): ISO format date (default: today) - currency_code (optional): Filter by currency (default: ALL)

Response: Complete analytics KPI data with trends and distributions


Endpoint 2: POST /wallet/analytics/trends

Permission: view_wallet_analytics
Query Parameters: - date_from (optional): Start date (default: 30 days ago) - date_to (optional): End date (default: today) - currency_code (optional): Currency filter - aggregation (optional): daily/weekly/monthly (default: daily)

Response: Time-series transaction data for charting


Endpoint 3: POST /wallet/analytics/distribution

Permission: view_wallet_analytics
Query Parameters: - currency_code (optional): Currency filter

Response: Distribution breakdowns by status, KYC, and currency


Endpoint 4: POST /wallet/analytics/top-performers

Permission: view_wallet_analytics
Query Parameters: - date_from (optional): Start date (default: 30 days ago) - date_to (optional): End date (default: today) - limit (optional): Top N wallets (default: 10, max: 100) - sort_by (optional): transaction_volume/count/balance (default: transaction_volume)

Response: Ranked list of top-performing wallets with metrics


Endpoint 5: POST /wallet/fee-report

Permission: view_fee_reports
Query Parameters: - wallet_id (optional): Specific wallet ID - date_from (optional): Start date (default: 30 days ago) - date_to (optional): End date (default: today)

Response: Fee breakdown by type with wallet info and summary


Endpoint 6: POST /wallet/reconciliation/summary

Permission: view_reconciliation_reports
Query Parameters: - date_from (optional): Start date (default: 30 days ago) - date_to (optional): End date (default: today)

Response: Reconciliation metrics, completion %, and activity history


✅ Phase 3: Frontend React Components

1. Wallet Analytics Dashboard

Location: ui/src/modules/wallet/pages/Wallet/Analytics/Dashboard.tsx

Components: - KPI Cards (4 columns): - Active Wallets (count) - Total Balance (amount + currency) - Transaction Volume (amount + count + trend %) - Fee Revenue (amount)

  • Tabs:
  • Trends Tab:

    • Line chart showing debits/credits amount and count
    • Supports daily/weekly/monthly views
    • Dual Y-axes for amount and count
  • Distributions Tab:

    • Pie chart: Wallet Status Distribution
    • Pie chart: KYC Level Distribution
    • Bar chart: Top Currencies by Volume
  • Top Performers Tab:

    • Leaderboard table with 10 top wallets
    • Columns: Rank, Wallet #, Customer Name, KYC Level, Volume, Txn Count
  • Filter Panel:

  • Date range picker (from/to)
  • Currency selector
  • Aggregation level selector (for trends)
  • Refresh button

  • Export:

  • Print report functionality
  • Browser print dialog

State Management: - Redux actions: getWalletAnalytics(), getWalletTrends(), getWalletDistribution(), getWalletTopPerformers() - Local state for date filters and aggregation

Charts: - Recharts library for all visualizations - Responsive containers with proper sizing - Color scheme: Blue (#3b82f6), Red (#ef4444), Green (#10b981), Amber (#f59e0b)


2. Fee Collection Report

Location: ui/src/modules/wallet/pages/Wallet/Reports/FeeCollectionReport.tsx

Components: - Summary Cards (3 columns): - Total Fees Collected - Transactions Charged - Average Fee per Transaction

  • Wallet Info Card (displayed when wallet-specific)
  • Wallet Number
  • Customer Name
  • KYC Level
  • Wallet ID

  • Fee Breakdown Table:

  • Columns: Fee Type, Count, Total Amount, Average, % of Total
  • Sorting support
  • Totals row

  • Fee Distribution Chart:

  • Bar chart by fee type
  • Amount values on Y-axis

  • Filter Panel:

  • Date range picker
  • Wallet ID input (optional)
  • Generate Report button

  • Export Functions:

  • CSV export with formatted rows
  • Print functionality

Redux Actions: - getFeeReport(walletId, dateFrom, dateTo)


3. Reconciliation Summary Dashboard

Location: ui/src/modules/wallet/pages/Wallet/Reports/ReconciliationSummary.tsx

Components: - Metric Cards (4 columns): - Total Entries (RefreshCw icon) - Reconciled Count (CheckCircle icon, green) - Pending Count (Clock icon, yellow) - Discrepancies (AlertCircle icon, red)

  • Status Overview Card:
  • Progress bar showing completion %
  • Reconciled/Pending breakdown
  • Color-coded metrics

  • Distribution Pie Chart:

  • Reconciled vs Pending visualization
  • Percentage labels

  • Summary Statistics Grid:

  • Period info
  • Total entries
  • Completion %
  • Issues found

  • Recent Activity Table:

  • Columns: Date, Reference ID, Wallet ID, Narration, Amount
  • Last 10 reconciliation records
  • Sortable by date

  • Action Buttons:

  • Print Report
  • Run Reconciliation (placeholder for future implementation)

Redux Actions: - getReconciliationSummary(dateFrom, dateTo)


✅ Phase 4: Redux Integration

Location: ui/src/modules/wallet/redux/actions.ts

New Actions Added:

export const getWalletAnalytics = (dateFrom?, dateTo?, currencyCode?)
export const getWalletTrends = (dateFrom?, dateTo?, currencyCode?, aggregation)
export const getWalletDistribution = (currencyCode?)
export const getWalletTopPerformers = (dateFrom?, dateTo?, limit, sortBy)
export const getFeeReport = (walletId?, dateFrom?, dateTo?)
export const getReconciliationSummary = (dateFrom?, dateTo?)

Action Pattern: - Type-based naming: GET_WALLET_ANALYTICS, GET_FEE_REPORT, etc. - API integration with path, permission, and data - Permission-based access control


🔐 Required Backend Permissions

Add these permissions to your permission system:

INSERT INTO permissions (code, name, description) VALUES
('view_wallet_analytics', 'View Wallet Analytics', 'View wallet KPIs, trends, distributions'),
('view_fee_reports', 'View Fee Reports', 'View fee collection reports'),
('view_reconciliation_reports', 'View Reconciliation Reports', 'View reconciliation summaries');

📊 Default Date Ranges

  • Analytics Dashboard: Today's date
  • Trends: Last 30 days
  • Top Performers: Last 30 days
  • Fee Report: Last 30 days
  • Reconciliation: Last 30 days

🎨 UI Component Dependencies

External Libraries: - Recharts: Charts and visualizations - Shadcn/ui: UI components (Card, Button, Select, Input, Tabs, etc.) - Lucide-react: Icons - date-fns: Date formatting and manipulation - React Redux: State management


📈 Data Query Performance Considerations

  1. Analytics Queries: Use aggregation functions (COUNT, SUM, AVG) with GROUP BY for efficiency
  2. Time-Series Data: Pre-aggregate at database level before JSON serialization
  3. Top Performers: LIMIT 100 enforced to prevent excessive data transfer
  4. Reconciliation History: Limited to last 10 records

🚀 Testing Checklist

  • [ ] Backend analytics functions return correct data format
  • [ ] API endpoints respond with proper permissions
  • [ ] Frontend components load and display data correctly
  • [ ] Charts render properly with sample data
  • [ ] Date range filtering works as expected
  • [ ] Currency selector filters data correctly
  • [ ] Trend aggregation (daily/weekly/monthly) works
  • [ ] Export functionality generates correct format
  • [ ] Print functionality displays correctly
  • [ ] Redux actions properly dispatched
  • [ ] API calls include proper authentication
  • [ ] Permissions are enforced on endpoints

🔧 Integration Steps

  1. Database Setup:
  2. Ensure permissions table has view_wallet_analytics, view_fee_reports, view_reconciliation_reports

  3. Backend Deployment:

  4. Deploy analytics functions to controller/wallet.py
  5. Deploy endpoints to routers/wallet.py
  6. Verify permissions are checked

  7. Frontend Deployment:

  8. Copy Dashboard.tsx to Analytics directory
  9. Copy FeeCollectionReport.tsx to Reports directory
  10. Copy ReconciliationSummary.tsx to Reports directory
  11. Update Redux actions.ts with new analytics actions

  12. Routing:

  13. Analytics: /dashboard/wallet/analytics or /dashboard/wallet/analytics/dashboard
  14. Fee Report: /dashboard/wallet/reports/fees or /dashboard/wallet/fee-report
  15. Reconciliation: /dashboard/wallet/reports/reconciliation or /dashboard/wallet/reconciliation/summary

  16. Navigation:

  17. Add menu items or tabs linking to new report pages
  18. Include permission checks in navigation

📝 Future Enhancements (P2/P3 Priority)

  1. Customer Segmentation Analytics:
  2. Segment wallets by activity level, balance range, transaction frequency
  3. Endpoint: /wallet/analytics/customer-segments

  4. Scheduled Reports:

  5. Daily/weekly/monthly email delivery of reports
  6. Background job scheduling via Celery

  7. Compliance Reporting:

  8. AML status dashboard
  9. KYC compliance metrics
  10. Transaction monitoring alerts

  11. Advanced Exports:

  12. PDF reports with branding
  13. Excel workbooks with multiple sheets
  14. Scheduled automated exports

  15. Real-time Dashboards:

  16. WebSocket connections for live metrics
  17. Push notifications for anomalies

📌 Known Limitations & Assumptions

  1. Date Ranges: All dates treated as UTC
  2. Decimal Precision: Financial amounts stored as Decimal for accuracy
  3. Pagination: Analytics queries not paginated (assumes reasonable dataset sizes)
  4. Caching: No built-in caching; each request hits database
  5. Time Zones: System uses UTC; no user-specific timezone conversions

🎯 Success Metrics

  • Dashboard loads in < 3 seconds
  • Charts render smoothly with 30+ days of data
  • All filters update data correctly
  • Export functions complete within 5 seconds
  • No console errors or warnings
  • Permission checks enforced on all endpoints

📞 Support & Troubleshooting

Common Issues:

  1. Permission Denied on Analytics Endpoints:
  2. Verify user has view_wallet_analytics permission
  3. Check permission system integration

  4. Charts Not Displaying:

  5. Verify Recharts is properly installed
  6. Check browser console for JavaScript errors
  7. Verify API response data format

  8. Slow Dashboard Load:

  9. Check database query performance
  10. Consider adding database indexes on created_on, status, kyc_level columns
  11. Monitor Celery task queue for bottlenecks

  12. Incorrect Date Calculations:

  13. Verify system timezone is UTC
  14. Check date-fns format strings
  15. Verify backend returns ISO format dates

Implementation Date: January 2025
Status: ✅ Complete - Ready for Testing & Deployment
Version: 1.0
Priority: P0 (Core Analytics Infrastructure)