Layered Architecture

1 · Web / Mobile apps
React / Angular · customer, staff and admin dashboards
2 · API gateway
TLS 1.3 · WAF · rate limiting · JWT validation
3 · Services (Spring Boot)
Auth · Customer · Account · Loan · Deposit · Share · UPI · Notification
4 · Data stores
PostgreSQL (core data) · Redis (cache) · Encrypted document store · Immutable audit store
5 · Integrations
Core banking · UPI / NPCI · CBS · KYC (UIDAI/PAN) · credit bureau · SMS / WhatsApp
This demo is static: the approval queue is held in browser localStorage. In production, the same actions call these APIs.

How Data Is Fetched & Stored

Example: customer views balance, then transfers money

CustomerOpens dashboard
➜
SystemAPI call with JWT
➜
SystemRBAC + branch check
➜
Bank CoreReads balance from DB
➜
SystemMasks fields → JSON
➜
CustomerSees balance
CustomerSubmits transfer
➜
SystemValidates + OTP
➜
Bank CoreDB transaction (debit, credit, ledger)
➜
SystemWrites audit record
➜
SystemNotification queued

Rules

WritesAtomic DB transactions, double-entry ledger
ReadsCached where safe, never for balances
DocumentsEncrypted object storage, signed URLs
AuditAppend-only, tamper-evident

Data Model (core tables)

Tables

TableKey fields
customerscustomer_id, name, dob, mobile, email, kyc_status, branch_id
kyc_documentsdoc_id, customer_id, type, masked_ref, file_url (encrypted), verified_by
accountsaccount_no, customer_id, type, branch_id, status, opened_on
transactionstxn_id, account_no, type, amount, balance_after, channel, utr, created_at
depositsdeposit_id, type (FD/RD), principal, rate, tenure, maturity_date
loansloan_id, customer_id, type, amount, rate, tenure, collateral_ref, status
emi_scheduleloan_id, due_date, principal, interest, status
sharesmember_id, shares, face_value, dividend
upi_handlesvpa, account_no, device_id, status
approvalsrequest_id, type, maker, checker, status, remarks
audit_logid, user, action, entity, ip, timestamp, hash

API Samples

REST / JSON

GET /api/accounts/0124558804

{
 "accountNo":"0124 5588 04",
 "type":"SAVINGS",
 "balance":245820.00,
 "status":"ACTIVE",
 "customerId":"CUS-100482"
}

POST /api/loans

{
 "type":"GOLD",
 "weightGrams":50,
 "purity":22,
 "amount":300000,
 "tenureMonths":12
}
→ 201 {"loanId":"LN-1042",
 "status":"PENDING_APPROVAL"}