Android Client (Field Officer App) — Development Plan 2026
Android Client (Field Officer App) — Development Plan 2026
Repository: openMF/android-client
API Instance: tt.mifos.community (Tenant: dev)
API Docs: Apache Fineract Swagger
Goal: Build complete Client, Loan, and Savings flows with an interactive Field Officer Dashboard
Table of Contents
# | Section | Description |
|---|---|---|
1 | Client Module — Complete Flow | Client lifecycle: list, create, detail, actions, data tables |
2 | Loan Module — Complete Flow | Loan lifecycle: products, application, detail, actions, transactions, charges, guarantors, collateral |
3 | Savings Module — Complete Flow | Savings lifecycle: products, application, detail, actions, transactions, charges |
4 | Interactive Dashboard | Portfolio summary, action items, quick actions, widgets |
5 | Supporting Modules | Groups, documents, maker-checker, standing instructions, reporting |
6 | Screen Inventory — 33 Screens | All screens across Client, Loan, Savings, Dashboard, Supporting |
7 | Deployment — Multi-Platform Release | Android, iOS, Desktop, Web via KMP |
8 | One-Click Deployment — Mifos X Launchpad | Self-hosted Fineract backend for testing |
9 | Development Phases | 5 phases from February to September 2026 |
Current API Inventory
Resource | Count | Details |
|---|---|---|
Clients | 111 | Active, Closed, Transfer in progress, Rejected |
Loan Products | 3 | PERSONAL, BRONZE, Business (USD) |
Savings Products | 2 | WALLET, AHORRO (USD) |
Offices | 5 | Head Office, Branch Office 1, Office Of Doraemon, Mobile Office, Telegraph |
Charges | 10 | Client (4), Loan (2), Savings (1), Share (3) |
Reports | 200+ | Table, Pentaho, SMS, Email types |
1. Client Module — Complete Flow
1.1 Client List and Search
Feature | API Endpoint | Description |
|---|---|---|
List all clients | GET /clients | Paginated list: displayName, accountNo, status, officeId, officeName |
Search clients | GET /clients?sqlSearch={query} | Search by name, account number, external ID |
Filter by office | GET /clients?officeId={id} | Filter by branch |
Filter by status | GET /clients?status={status} | Active (300), Closed (600), Transfer (303,304), Rejected (700) |
Sort clients | GET /clients?orderBy={field}&sortOrder={asc/desc} | Sort by name, account number, date |
1.2 Client Creation
Feature | API Endpoint | Description |
|---|---|---|
Client template | GET /clients/template | officeOptions, staffOptions, savingsProductOptions, genderOptions, clientTypeOptions, clientClassificationOptions, datatables |
Create client | POST /clients | officeId, firstname, lastname, mobileNo, dateOfBirth, genderId, externalId, submittedOnDate, activationDate, savingsProductId, staffId |
Client with address | POST /clients (with address) | addressTypeId, street, city, stateProvinceId, countryId, postalCode |
Client with family | POST /clients (with familyMembers) | familyMembers[]: firstName, relationship, gender, dateOfBirth, profession |
Required Fields:
Field | Type | Description |
|---|---|---|
officeId | Integer | Branch office (e.g. 1 = Head Office) |
firstname | String | Client first name |
lastname | String | Client last name |
active | Boolean | true = activate immediately |
activationDate | String | Date of activation (dd MMMM yyyy) |
dateFormat | String | "dd MMMM yyyy" |
locale | String | "en" |
Optional Fields:
Field | Type | Description |
|---|---|---|
mobileNo | String | Mobile phone number |
dateOfBirth | String | Date of birth |
genderId | Integer | Gender code value ID |
externalId | String | External system ID |
staffId | Integer | Assigned field officer |
savingsProductId | Integer | Default savings product |
clientTypeId | Integer | Client type code value |
clientClassificationId | Integer | Classification code value |
submittedOnDate | String | Application submission date |
1.3 Client Detail View
Feature | API Endpoint | Description |
|---|---|---|
Client details | GET /clients/{clientId} | Full profile: displayName, accountNo, status, timeline, groups, staffName |
Client accounts | GET /clients/{clientId}/accounts | loanAccounts[], savingsAccounts[], shareAccounts[] |
Client image | GET /clients/{clientId}/images | Profile photo (Base64 or URL) |
Upload image | POST /clients/{clientId}/images | Upload profile photo |
Client identifiers | GET /clients/{clientId}/identifiers | ID documents (National ID, Passport, etc.) |
Client documents | GET /clients/{clientId}/documents | Uploaded documents (PDF, images) |
Client notes | GET /clients/{clientId}/notes | Field officer notes |
Client charges | GET /clients/{clientId}/charges | Registration Fee, KYC Penalty, Membership Renewal, Test Charge |
Client Detail Fields:
Field | Example | Description |
|---|---|---|
id | 1 | Client internal ID |
accountNo | "000000001" | Account number |
externalId | null | External system ID |
status.value | "Active" | Current status |
active | true | Is active |
displayName | "John Doe" | Full name |
officeId | 1 | Branch office ID |
officeName | "Head Office" | Branch name |
staffId | 1 | Assigned staff ID |
staffName | "Field Officer" | Assigned staff name |
timeline.activatedOnDate | [2024,1,15] | Activation date |
dateOfBirth | [1990,5,20] | Date of birth |
gender.value | "Male" | Gender |
mobileNo | "1234567890" | Mobile number |
1.4 Client Actions
Action | API Endpoint | Description |
|---|---|---|
Activate client | POST /clients/{clientId}?command=activate | Activate a pending client |
Close client | POST /clients/{clientId}?command=close | Close client (closureReasonId, closureDate) |
Reject client | POST /clients/{clientId}?command=reject | Reject application (rejectionReasonId, rejectionDate) |
Withdraw application | POST /clients/{clientId}?command=withdraw | Withdraw application (withdrawalReasonId, withdrawalDate) |
Reactivate client | POST /clients/{clientId}?command=reactivate | Reactivate closed client (reactivationDate) |
Transfer client | POST /clients/{clientId}?command=proposeTransfer | Propose transfer to another office (destinationOfficeId, transferDate) |
Accept transfer | POST /clients/{clientId}?command=acceptTransfer | Accept incoming transfer |
Reject transfer | POST /clients/{clientId}?command=rejectTransfer | Reject incoming transfer |
Withdraw transfer | POST /clients/{clientId}?command=withdrawTransfer | Withdraw transfer proposal |
Assign staff | POST /clients/{clientId}?command=assignStaff | Assign field officer (staffId) |
Unassign staff | POST /clients/{clientId}?command=unassignStaff | Remove field officer |
Update client | PUT /clients/{clientId} | Update client details |
Delete client | DELETE /clients/{clientId} | Delete pending client |
1.5 Client Data Tables
Feature | API Endpoint | Description |
|---|---|---|
List datatables | GET /datatables?apptable=m_client | Custom data tables for clients |
Read datatable | GET /datatables/{datatableName}/{clientId} | Read custom data for client |
Create entry | POST /datatables/{datatableName}/{clientId} | Add custom data entry |
Update entry | PUT /datatables/{datatableName}/{clientId} | Update custom data |
Delete entry | DELETE /datatables/{datatableName}/{clientId} | Remove custom data |
1.6 Client Identifiers
Feature | API Endpoint | Description |
|---|---|---|
List identifiers | GET /clients/{clientId}/identifiers | All identity documents |
Create identifier | POST /clients/{clientId}/identifiers | documentTypeId, documentKey, description, status |
Update identifier | PUT /clients/{clientId}/identifiers/{identifierId} | Update document details |
Delete identifier |