Reconciliation & Reporting Module¶
Overview¶
The Reconciliation module handles account reconciliation with external systems (banks, gateways), discrepancy detection and resolution, and end-of-day batch reconciliation. The Reporting component provides comprehensive reports on transactions, portfolios, and system activities.
API Prefix: /api/v1/reconciliation
Route Verification Status¶
- Source Router:
app/api/v1/endpoints/reconciliation.py - Live Route Count: 12
- Verification State: Verified (2026-06-28)
- Canonical Tracking:
docs/API_ROUTE_DOCUMENTATION_TODO.md - Verification Method: Route decorators extracted from
@r.<method>(...)inapp/api/v1/endpoints/reconciliation.py.
Key Features¶
1. Transaction Reconciliation¶
- Match internal transactions with bank statements
- Identify pending transactions
- Detect discrepancies
- Reconciliation workflows
- Manual reconciliation review
2. Discrepancy Management¶
- Detect unmatched transactions
- Categorize discrepancies
- Investigation workflow
- Resolution tracking
- Root cause analysis
3. End-of-Day Processing¶
- Daily reconciliation jobs
- Account balance settlement
- Interest calculations
- Fee processing
- Daily reporting
4. Multi-Source Reconciliation¶
- Bank reconciliation
- Payment gateway reconciliation
- Internal ledger reconciliation
- Multi-currency reconciliation
API Endpoints (Verified Against Live Router)¶
For the complete reconciliation endpoint inventory (all 12 routes with method, effective path, and source line), use:
- docs/API_ROUTE_LIVE_REFERENCE.md -> section reconciliation.py (12 routes)
Permission Dependency Notes (Verified)¶
Confirmed explicit permission checks in reconciliation.py include:
- Reporting and visibility: fetch_reconciliation_report, view_reconciliation_legs, view_reconciliation_status, view_reconciliation_report.
- Discrepancy operations: fetch_reconciliation_discrepancy, get_reconciliation_discrepancy, resolve_reconciliation_discrepancy.
- Execution and artifacts: reconcile_transaction, run_reconciliation, download_reconciliation.
Standard Error Response Matrix¶
{
"status_code": 400,
"error_code": "RECONCILIATION_ERROR",
"message": "Human-readable summary",
"details": {}
}
Common mappings:
- 400 invalid reconciliation/discrepancy operation.
- 401 unauthenticated request.
- 403 permission denied.
- 404 reconciliation/discrepancy/report not found.
- 409 conflicting reconciliation state.
- 422 schema validation failure.
- 429 throttled request.
- 500 internal reconciliation processing error.
Database Models¶
Reconciliation Models¶
- ReconciliationRecord: Reconciliation session
- ReconciliationMatch: Matched transaction pairs
- ReconciliationDiscrepancy: Unmatched items
- ReconciliationReport: Generated report
Transaction Legs¶
- TransactionLeg: Individual debit/credit entries
- LedgerEntry: Accounting ledger entries
- SettlementEntry: Settlement records
Reconciliation Types¶
Daily Reconciliation¶
Process:
1. End of day (midnight)
2. Pull all transactions for day
3. Pull bank statement
4. Match transactions by:
- Amount
- Date
- Reference number
5. Identify discrepancies
6. Generate report
7. Notify stakeholders
Typical discrepancies:
- Pending transactions (not yet cleared)
- Timing differences (posted different day)
- Amount mismatches (fee differences)
- Missing transactions (both sides)
Discrepancy Types¶
1. Amount Mismatch
- Transaction amount differs
- Often due to fees
2. Missing Transaction
- In internal ledger but not on statement
- Usually pending or failed
3. Extra on Statement
- On bank statement but not in system
- Usually bank fees or corrections
4. Date Difference
- Transaction date vs posting date
- Normal for batched processing
5. Duplicate
- Transaction recorded twice
- System error or manual entry
Reconciliation Workflow¶
Daily Reconciliation Flow¶
1. Trigger (Automated at midnight)
├─ Fetch all transactions
├─ Fetch bank statement
└─ Start reconciliation job
2. Matching Engine
├─ Try exact match (amount + date)
├─ Try fuzzy match (similar amount, date range)
├─ Try by reference number
└─ Flag unmatched
3. Analysis
├─ Categorize discrepancies
├─ Identify root causes
├─ Calculate impact
└─ Generate analysis
4. Report Generation
├─ Summary statistics
├─ Exception list
├─ Reconciliation rate %
└─ Recommendations
5. Resolution
├─ Manual review of exceptions
├─ Apply corrections
├─ Post adjustments if needed
└─ Close reconciliation
Discrepancy Resolution¶
1. Identify Discrepancy
- Transaction doesn't match
2. Investigate
- Check internal records
- Check bank statement
- Review transaction details
- Determine root cause
3. Categorize
- Timing issue → Defer
- Amount error → Adjust
- Missing → Follow-up with bank
- Duplicate → Reverse
4. Resolution
- Apply correction
- Update records
- Document decision
- Close case
Reporting Examples¶
Daily Summary Report¶
Date: June 20, 2024
========================================
Transactions Processed: 12,450
Total Value: 825,500,000 ZMW
Matched Transactions: 12,400 (99.6%)
Pending Transactions: 30
Discrepancies: 20 (0.2%)
By Transaction Type:
- P2P Transfer: 8,500 (68%)
- Merchant Payment: 2,100 (17%)
- Bill Payment: 1,200 (10%)
- Loan Repayment: 650 (5%)
Reconciliation Status: COMPLETE
Exceptions: 20
Action Required: Yes
Discrepancy Report¶
Top Discrepancies:
1. Missing Transactions: 12
- Amount: 450,000 ZMW
- Pending for 3 days
- Action: Follow-up with bank
2. Amount Mismatches: 5
- Total Variance: 12,500 ZMW
- Usually fee-related
- Action: Investigate fees
3. Duplicates: 2
- Amount: 8,000 ZMW
- Action: Reverse duplicates
4. Timing Issues: 1
- Amount: 5,000 ZMW
- Defer until next day
Controllers & Business Logic¶
Reconciliation Controllers¶
controller/reconciliation.py: Main reconciliationdaily_reconciliation(): Run daily jobmatch_transactions(): Match logicidentify_discrepancies(): Find mismatches-
generate_report(): Create report -
controller/discrepancy.py: Discrepancy management categorize_discrepancy(): Classify issueinvestigate(): Investigation workflowresolve(): Apply resolutionpost_adjustment(): Post correction
Reporting Controllers¶
controller/reporting.py: Report generationgenerate_daily_report(): Daily reportgenerate_portfolio_report(): Portfolio analysisgenerate_exception_report(): Exception listingexport_report(): Export to PDF/Excel
Batch Processing Configuration¶
Daily Job Schedule¶
{
"daily_reconciliation": {
"schedule": "0 0 * * *",
"timeout_minutes": 30,
"retry_on_failure": true,
"max_retries": 3,
"notification_on_completion": true
},
"end_of_day": {
"schedule": "0 1 * * *",
"timeout_minutes": 60,
"tasks": [
"reconcile_transactions",
"calculate_interest",
"process_fees",
"settle_accounts"
]
}
}
Error Handling¶
Reconciliation Errors¶
RECONCILIATION_FAILED: Job failedDISCREPANCY_UNRESOLVED: Can't resolve issueSTATEMENT_UNAVAILABLE: Bank statement not receivedAMOUNT_MISMATCH: Amount doesn't matchTRANSACTION_NOT_FOUND: Transaction missing
Testing¶
Test Categories¶
- Transaction matching logic
- Discrepancy detection
- Reconciliation workflow
- Report generation
- Batch job scheduling
Performance Considerations¶
- Batch Processing: Run during off-peak hours
- Parallel Matching: Process transactions in parallel
- Statement Caching: Cache bank statements
- Report Generation: Async report creation
- Archive Old Data: Archive old reconciliation records
Integration Points¶
External Services¶
- Banking System: Receive statements
- Payment Gateways: Verify transactions
Internal Modules¶
- Transaction Processing: Transaction data
- Wallet System: Balance tracking
- Reporting: Report generation