County Lending
The DCP Management System is a custom Frappe/ERPNext app that extends the Lending module to create a CBK-compliant loan origination system for digital credit providers in Kenya
- Author: francis450
- Repository: https://github.com/francis450/county-lending
- GitHub stars: 0
- Forks: 0
- License: MIT
- Category: Localization
- Maintenance: Minimally Maintained
- Frappe versions: develop
Install County Lending
bench get-app https://github.com/francis450/county-lending
Add the Frappe Gems badge to your README
Maintain County Lending? Paste this into your README:
[](https://frappegems.com/gems/apps/francis450/county-lending)
About County Lending
DCP Management System
Digital Credit Provider - Kenya CBK Compliant Loan Origination System
A Central Bank of Kenya (CBK) compliant Digital Credit Provider system built on ERPNext and Frappe Framework.
📋 Table of Contents
- Overview
- Architecture
- Features
- Compliance Status
- Installation
- Development
- API Documentation
- Roadmap
- Contributing
- License
🎯 Overview
The DCP Management System is a custom Frappe/ERPNext app that extends the Lending module to create a CBK-compliant loan origination system for digital credit providers in Kenya. It provides:
- Customer-facing portal: Vue 3 SPA for self-service loan applications
- KYC compliance: Secure document management per Data Protection Act
- Consent management: Immutable audit trails for CRB checks and data processing
- Regulatory reporting: CBK data submission framework (in development)
Current Status: 72% Demo-Ready MVP
🏗️ Architecture
System Components
┌─────────────────────────────────────────────────────────┐
│ Vue 3 SPA Frontend │
│ (TailwindCSS, Pinia, Vue Router, SDK) │
└─────────────────────┬───────────────────────────────────┘
│ REST API
┌─────────────────────▼───────────────────────────────────┐
│ DCP Management (Custom App) │
│ • Customer Onboarding • KYC Management │
│ • Consent Logging • Loan Application API │
└─────────────────────┬───────────────────────────────────┘
│ DocType Extension
┌─────────────────────▼───────────────────────────────────┐
│ ERPNext Core + Frappe Lending Module │
│ • Customer Management • Loan Products │
│ • Accounting • Payment Entries │
└─────────────────────────────────────────────────────────┘
Key Principles
- ✅ No Core Modifications: Extends ERPNext via custom app
- ✅ API-First Design: Clean separation of frontend and backend
- ✅ Compliance by Design: Privacy and audit trails built-in
- ✅ Mobile-First: Responsive TailwindCSS UI
✨ Features
Implemented (Ready for Demo)
1. Self-Registration & Authentication
- ✅ Guest-accessible registration form
- ✅ Auto-creates User + DCP Customer records
- ✅ Email-based password setup
- ✅ Role-based redirect (Customer → Portal)
API: POST /api/method/dcp_management.api.onboard_customer
2. KYC Verification System
- ✅ 3-step wizard (Personal Info → Address → Documents)
- ✅ Secure document upload (National ID, KRA PIN, Passport Photo)
- ✅ Privacy-compliant storage (all attachments marked
is_private) - ✅ Status tracking: Incomplete → Pending → Verified → Rejected
- ✅ User ownership validation
DocType: DCP Customer with secure attachment fields
API: POST /api/method/dcp_management.api.upload_kyc_documents
3. Consent Management (CBK Stage 4 Compliant)
- ✅ Immutable audit log via Child Table
- ✅ Captures: Consent Type, IP Address, Timestamp, Policy Version
- ✅ Integrated in loan application flow
- ✅ Types: CRB Check, Terms & Conditions, Privacy Policy, Data Processing
DocType: Consent Log (istable: 1, track_changes: 1)
API: POST /api/method/dcp_management.api.log_consent
4. Loan Application Interface
- ✅ KYC pre-check validation
- ✅ Loan calculator with tenure selection
- ✅ Creates Loan Application in Lending module
- ✅ Auto-creates ERPNext Customer if missing
- ✅ Consent logging before submission
API: POST /api/method/dcp_management.api.apply_for_loan
5. Customer Dashboard
- ✅ Loan summary statistics
- ✅ Active loan details
- ✅ Quick actions (Apply, Pay, Support)
- ⚠️ Currently displays mock data (Lending integration incomplete)
Frontend: dcp_management/public/frontend/src/views/DashboardView.vue
In Development (Priority Roadmap)
Priority 1: Mock Services Layer (4 hours)
- [ ]
services/crb_mock.py- Credit score simulation - [ ] Loan decisioning logic (Score-based approval)
- [ ] Replace mock loan data with real Lending queries
Priority 2: CBK Reporting (6 hours)
- [ ]
CBK ReportDocType - [ ]
services/cbk_reporting.py- Daily/monthly report generation - [ ] Scheduled tasks for automatic submission
- [ ] JSON schema per CBK specifications
Priority 3: Consumer Protection (5 hours)
- [ ]
Customer IssueDocType for complaints - [ ] Support ticket logging API
- [ ] Resolution tracking workflow
- [ ] Frontend support widget
🏛️ Compliance Status
CBK Digital Credit Provider Licensing Requirements
| Stage | Requirement | Status | Notes |
|---|---|---|---|
| Stage 2: Customer Onboarding | |||
| Identity Verification (National ID) | ✅ Complete | 8-digit validation | |
| KRA PIN Verification | ✅ Complete | 11-char validation | |
| Secure Document Storage | ✅ Complete | is_private=1 flag |
|
| Data Protection Policy | ✅ Complete | Privacy by design | |
| Stage 3: Loan Origination | |||
| Loan Application Interface | ✅ Complete | Web form + API | |
| CRB Check Consent | ✅ Complete | Logged with IP/timestamp | |
| Credit Scoring | ⚠️ Partial | Mock not implemented | |
| Disbursement Tracking | ⚠️ Partial | Lending module integration needed | |
| Stage 4: Data Protection | |||
| Consent Management | ✅ Complete | Immutable audit trail | |
| Right to Access | ⚠️ Partial | API exists, UI needed | |
| Right to Erasure | ❌ Missing | GDPR compliance TODO | |
| Stage 5: Reporting | |||
| Daily Loan Reports | ❌ Missing | CBK Report DocType needed | |
| Monthly Outstanding | ❌ Missing | Scheduled task needed | |
| Consumer Redress Logs | ❌ Missing | Issue tracking TODO |
Overall Compliance: 65% (Stage 2 & 4 complete, Stage 3 & 5 in progress)
🚀 Installation
Prerequisites
- Frappe Framework v15+
- ERPNext v15+
- Frappe Lending module installed
- Node.js 18+ (for frontend build)
- Python 3.10+
Setup
- Install the app:
cd frappe-bench
bench get-app https://github.com/your-repo/dcp_management.git
bench --site your-site install-app dcp_management
- Build frontend:
cd apps/dcp_management/dcp_management/public/frontend
npm install
npm run build
- Migrate database:
bench --site your-site migrate
- Clear cache & restart:
bench clear-cache
bench restart
- Access the portal:
https://your-site/portal
🛠️ Development
Backend Development
Location: dcp_management/dcp_management/
# Watch Python files (auto-reload on save)
bench start
# Apply schema changes
bench --site your-site migrate
# Create new DocType
bench new-doctype
Conventions:
- Tabs for indentation (strict Frappe requirement)
- Linting: ruff (config in pyproject.toml)
- Whitelisted endpoints: @frappe.whitelist() in api.py
Frontend Development
Location: dcp_management/public/frontend/
cd apps/dcp_management/dcp_management/public/frontend
# Development server (hot reload)
npm run dev
# Production build
npm run build
# Build + deploy (run from bench root)
./apps/dcp_management/build_frontend.sh
bench clear-cache
bench restart
Tech Stack: - Vue 3 (Composition API) - TailwindCSS - Pinia (state management) - frappe-js-sdk - Vite
Project Structure
apps/dcp_management/
├── dcp_management/
│ ├── api.py # Whitelisted API endpoints
│ ├── auth.py # Authentication hooks
│ ├── hooks.py # Frappe app hooks
│ ├── utils.py # Helper functions
│ ├── dcp_management/
│ │ └── doctype/
│ │ ├── dcp_customer/ # Main customer DocType
│ │ └── consent_log/ # Audit trail
│ ├── public/frontend/ # Vue 3 SPA
│ │ ├── src/
│ │ │ ├── components/
│ │ │ ├── views/
│ │ │ ├── stores/ # Pinia stores
│ │ │ └── router/
│ │ └── dist/ # Built files
│ └── www/
│ ├── portal.html # SPA entry point
│ └── portal.py
├── build_frontend.sh # Build script
├── pyproject.toml # Python config
└── README.md # This file
📚 API Documentation
Authentication
Most endpoints require authentication. Guest-accessible endpoints are marked with allow_guest=True.
Base URL: /api/method/dcp_management.api
Endpoints
POST /onboard_customer (Guest)
Register a new customer.
Request:
{
"email": "user@example.com",
"first_name": "John",
"last_name": "Doe",
"phone": "+254712345678"
}
Response:
{
"message": "Success",
"user_id": "user@example.com",
"customer_id": "DCP-CUST-00001"
}
POST /upload_kyc_documents (Authenticated)
Upload KYC documents for verification.
Request:
{
"customer_id": "DCP-CUST-00001",
"national_id": "12345678",
"kra_pin": "A123456789Z",
"residential_address": "123 Main St",
"county": "Nairobi",
"city": "Nairobi",
"files_data": {
"id_front": "/files/id_front.jpg",
"id_back": "/files/id_back.jpg",
"kra_certificate": "/files/kra.pdf",
"passport_photo": "/files/photo.jpg"
}
}
POST /apply_for_loan (Authenticated)
Submit a loan application.
Request:
{
"customer_id": "DCP-CUST-00001",
"amount": 50000,
"tenure": 3,
"purpose": "Business",
"consent_data": {
"ip_address": "192.168.1.1",
"policy_version": "v1.0"
}
}
Response:
{
"status": "Submitted",
"name": "LOAN-APP-00001",
"message": "Your loan application has been submitted successfully"
}
GET /get_customer_loans (Authenticated)
Fetch customer's loan history.
Parameters: customer_id
Response:
{
"loans": [...],
"active_loan": {...},
"kyc_status": "Verified"
}
🗺️ Roadmap
Q1 2026 - MVP Completion
- [x] Core architecture setup
- [x] Self-registration & KYC
- [x] Consent management
- [ ] CRB mock integration
- [ ] Loan decisioning logic
- [ ] CBK reporting foundation
Q2 2026 - Production Ready
- [ ] AML screening integration
- [ ] Real CRB API integration (e.g., Metropol, TransUnion)
- [ ] M-Pesa payment gateway
- [ ] SMS notifications
- [ ] Email templates
- [ ] Admin dashboard
Q3 2026 - CBK Licensing
- [ ] Complete CBK Stage 5 requirements
- [ ] Penetration testing
- [ ] Data protection audit
- [ ] CBK submission documentation
- [ ] Live pilot with 100 customers
Q4 2026 - Scale
- [ ] Multi-tenant support
- [ ] WhatsApp integration
- [ ] AI-powered credit scoring
- [ ] Alternative data sources
🔒 Security Considerations
Implemented
- ✅ User ownership validation on all customer endpoints
- ✅ Private file storage for KYC documents
- ✅ CSRF protection via frappe-js-sdk
- ✅ Role-based access control (Customer, Loan Officer, System Manager)
- ✅ Audit trails on consent logs
TODO
- [ ] Rate limiting on API endpoints
- [ ] Password complexity enforcement
- [ ] 2FA for high-value transactions
- [ ] Encryption at rest for PII fields
- [ ] Regular security audits
🐛 Known Issues
- Dashboard displays mock data - Lending module integration incomplete
- No CRB integration - Loan decisioning is manual
- Payment endpoint logs only - No actual payment entry creation
- **IP addre
Related Localization apps for Frappe & ERPNext
- Wiki — Free and Open Source Wiki built on top of Frappe
- India Compliance — Simple, yet powerful compliance solutions for Indian businesses
- Nepal Compliance — Open source ERP for Nepal with HR, Payroll & Accounting compliance, based on ERPNext by Frappe Technologies.
- Erpnextswiss — ERPNext application for Switzerland-specific use cases
- Erpnext Germany — ERPNext customizations for German companies
- Ksa Compliance — KSA Compliance App for KSA E-invoice
- Kamra Pms — Free open-source hotel & short-term rental PMS (AGPL). Front desk, folios, POS, housekeeping, booking engine + governed MCP so Claude can run the property. Built on Frappe v16.
- Zatca Erpgulf — Implementation of Zatca Phase-2 E-Invoicing - for FrappeCLoud