WHAT THIS CHANGES
==================
Frontend counterpart to the backend FD in-place renewal, senior-citizen
rate, and Payment action work.
1. RENEWAL HISTORY TAB (new) -- fixed-deposit-account-view/renewal-history-tab/.
A vertical timeline, one card per term of the FD, oldest first. Backend
data arrives as a list of lowercase-keyed maps (Postgres unquoted SQL
aliases), which the component normalises. Includes term-rate-chart-dialog,
a popup showing one term's full rate-by-tenure chart, including the
senior-citizen column, with an "Applied" badge on the rate that was
actually used. Route added in fixed-deposits-routing.module.ts, tab
link added in fixed-deposit-account-view.component.html (shown only
when the account has renewal history).
2. PAYMENT DIALOG (new) -- fixed-deposit-account-view/custom-dialogs/payment-dialog/.
Card-based picker for the four supported closure types (Transfer to
Savings, Re-Invest Principal and Interest, Re-Invest Principal Only,
Partial Re-Invest), with Withdraw Deposit filtered out client-side.
Fetches its own template via a new fixedDepositsService method
(getFixedDepositsAccountPaymentTemplate, command=payment) rather than
reusing the Close template, since the Payment template is the only one
the backend includes PARTIAL_REINVEST in.
The Partial Re-Invest amount cap is date-dependent: the backend bounds
it against the account balance AFTER posting interest to the chosen
closed-on date, which lands on the maturity amount on or after
maturity and on the current balance before it. The dialog mirrors this
(reinvestCap / processingOnOrAfterMaturity) so the shown split actually
adds up and the client-side validator agrees with the server. This was
wrong in an earlier pass of this work (compared against a fixed figure
regardless of date) and was caught and fixed via a real reconciliation
check (77000 + 23000 did not equal the displayed total) before this
commit.
Added: a loading-failure state (previously the spinner ran forever on
a failed template fetch), an inline submit-error message (previously a
failed POST left the dialog open with no feedback), an empty-savings-
accounts hint, and accessibility attributes on the option cards
(role="radio", aria-checked, a visible check icon, focus-visible
outline) since selection was previously colour-only.
3. TRANSACTIONS TAB -- merges synthetic "FD Renewed" marker rows into the
real transaction list, since an in-place renewal posts no actual
ledger transaction and would otherwise look like the balance changed
for no reason.
4. INTEREST RATE CHART TAB -- added the senior-citizen rate column.
5. DEPOSIT CERTIFICATE DIALOG -- lists the full renewal history on FD
certificates. renewalCount is renewalHistory.length - 1 (the first
row is the original term, not a renewal); an earlier version of this
used the raw row count and overstated the renewal count by one on a
customer-facing document, caught and fixed before this commit.
6. CLIENTS GENERAL TAB -- fixedDepositAccountsForDisplay folds a renewed
FD's superseded terms out of the account list (each renewal used to
show as two unrelated accounts, one Closed and one Active). Memoised
on the source array's identity so it does not rebuild, and rebind the
table, on every change-detection tick. Only rewrites FD rows; Savings,
RD, Current, and Share account rows pass through this getter
untouched, and the RD/Savings sections of the template were left
bound directly to the original savingAccounts array.
KNOWN CAVEATS
=============
- This depends on the paired backend commit (same date, "feat(deposits):
FD in-place renewal, senior-citizen rate persistence, and Payment
action"). Deploying this frontend without that backend change means
the Payment dialog and Renewal History tab will call endpoints that
do not exist yet.
- Renewal-history rows rely on the backend returning lowercase column
keys (a Postgres-specific behaviour of unquoted SQL aliases via
JdbcTemplate). Confirmed correct against this project's Postgres
dev database; if this project ever runs on a different database
engine, that assumption would need re-checking.
- src/environments/.env.ts is intentionally excluded from this commit;
it is a local build-version stamp file that should never be
committed.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Mifos® X Web App 
Overview
Mifos® X Web App is a modern single-page application (SPA) built on top of the Mifos® X platform for financial inclusion. It serves as the default web interface for the Mifos® user community.
Technologies Used:
- HTML5, SCSS, and TypeScript
- Angular framework
- Angular Material components
Quick Links
- Live Demo (Updated nightly — sandbox data is reset every 6 hours; test data and transient state may be cleared.)
- GitHub Repository
- Slack Channel
- Jira Board of Mifos
- Jira Board of Mifos Web App Project
Installation Guide
Prerequisites for All Methods
- Git: Download here
- Mifos® X Backend (Apache Fineract®) - Required before running the web app
Backend Setup (REQUIRED FIRST)
Before installing the web app, you need to set up the Apache Fineract® backend server:
-
Choose ONE of these backend options:
-
Option A: Use existing remote server
-
Use the demo (MariaDB) — sandbox data is reset every 6 hours; test data and transient state may be cleared.
-
Use the demo (Keycloak)
-
Use the demo (2FA)
-
Use the demo (Oidc)
-
Use the demo (Postgres)
-
Configure to your server by updating API URLs in environment files
-
Option B: Install local Fineract server
-
Option C: Docker Compose for full stack
- See Docker Compose section below for one-step backend+frontend setup
-
-
Configure environment files to point to your backend:
- Update
environments/environment.ts(development) - Update
environments/environment.prod.ts(production) - Change OAuth2 settings if needed (disabled by default)
- Update
Frontend Setup (Web App)
Choose ONE of the following methods to install the web app:
Method 1: Manual Installation
- Install Node.js: Download here
- Install Angular CLI:
npm install -g @angular/cli@16.0.2 - Clone the repository:
For Windows:
git clone https://github.com/openMF/web-app.gitgit clone https://github.com/openMF/web-app.git --config core.autocrlf=input - Navigate to the project directory:
cd web-app - Install dependencies:
npm install - Start the development server:
ng serve - Access the application at
http://localhost:4200/
Method 2: Docker Container Only
- Build the Docker image:
docker build -t openmf/web-app:latest . - Run the container:
docker run -d -p 4200:80 openmf/web-app:latest - Access the application at
http://localhost:4200/
Method 3: Docker Compose (Frontend + Backend)
This sets up both the Mifos® X Web App and Apache Fineract® backend:
- Clone the repository:
For Windows:
git clone https://github.com/openMF/web-app.git cd web-appgit clone https://github.com/openMF/web-app.git --config core.autocrlf=input cd web-app - Start Docker Compose:
docker compose up -d - Access the application at
http://localhost:4200/
Default Login Credentials
When using the development server with basic authentication:
- Username: mifos
- Password: password
Important: Do not alter these credentials.
Development Commands
- Serve application:
ng serve - Generate new component:
ng generate component component-name - Build for production:
ng build --configuration productionornpm run build:prod - Get Angular CLI help:
ng help
Proxy Configuration
The web app includes a proxy configuration (proxy.conf.js) that allows you to forward API requests to a remote Fineract backend during local development. This helps avoid CORS issues and enables you to work against production-like environments.
Using the Sandbox Proxy (Default)
By default, the proxy forwards /fineract-provider requests to the Mifos sandbox environment:
- Target:
https://demo.mifos.community - API Endpoint:
https://apis.mifos.community(exposed in the demo environment) - System Reset: Demo test data and transient state are reset every 6 hours (expect data to be periodically cleared).
Sandbox Environment Variables:
FINERACT_API_URLS=https://apis.mifos.community
FINERACT_API_URL=https://apis.mifos.community
FINERACT_API_PROVIDER=/fineract-provider/api
FINERACT_API_ACTUATOR=/fineract-provider
FINERACT_API_VERSION=/v1
FINERACT_PLATFORM_TENANT_IDENTIFIER=default
MIFOS_DEFAULT_LANGUAGE=en-US
MIFOS_SUPPORTED_LANGUAGES=cs-CS,de-DE,en-US,es-MX,fr-FR,it-IT,ko-KO,lt-LT,lv-LV,ne-NE,pt-PT,sw-SW
MIFOS_PRELOAD_CLIENTS=true
MIFOS_DEFAULT_CHAR_DELIMITER=,
Using a Local Fineract Instance
To proxy to a local Fineract server instead:
Use the provided localhost proxy file (recommended for ng serve):
-
Start the dev server with the localhost proxy:
ng serve --proxy-config proxy.localhost.conf.js -
Ensure your local Fineract instance is running on
http://localhost:8443.
Notes:
proxy.localhost.conf.jsforwards/fineract-providerto your local backend to avoid CORS during development.- The
HttpsProxyAgent/setupForProxylogic (present inproxy.conf.js) is only necessary when an upstream corporate/HTTP proxy must be used (set viaHTTP_PROXY/http_proxy). It is not required for a directlocalhostbackend.
Proxy Features
- CORS Avoidance: Eliminates cross-origin issues during local development
- Error Handling: Gracefully handles proxy failures with detailed logging
- Corporate Proxy Support: Maintains support for corporate proxy agents via
HTTP_PROXYenvironment variable - Debug Logging: All proxy requests are logged for troubleshooting
The proxy is configured to work with Fineract endpoints as described in this section.
Testing the Proxy
To verify the proxy is working correctly, start the development server (ng serve) and test with curl:
Successful proxy request:
curl -i "http://localhost:4200/fineract-provider/api/v1/runreports/FullClientReport?R_officeId=1&output-type=HTML&R_loanOfficerId=-1"
Expected: HTTP 200 response with proxied data from the demo environment. Server console shows:
[Proxy] Proxying: GET /fineract-provider/api/v1/runreports/... -> https://demo.mifos.community/api/v1/runreports/...
Simulated proxy error (backend unreachable):
If the backend is unreachable or returns an error, the proxy returns HTTP 502:
# Stop your Fineract backend (if using localhost) or test with an invalid target
# The proxy will log the error and return:
Server console (example):
[Proxy] Error while proxying request: GET /fineract-provider/... -> https://demo.mifos.community - ECONNREFUSED
HTTP response:
HTTP/1.1 502 Bad Gateway
Content-Type: text/plain
Proxy error: connect ECONNREFUSED
Configuration Options
Environment Variables for Docker
All these environment variables can be set when using Docker or Docker Compose:
Fineract Backend Settings
| Variable | Description | Default Value |
|---|---|---|
| FINERACT_API_URLS | Fineract server list | https://demo.mifos.community,https://localhost:8443 |
| FINERACT_API_URL | Default Fineract server | https://localhost:8443 |
| FINERACT_API_ACTUATOR | Default Fineract Actuator endpoint | /fineract-provider |
| FINERACT_PLATFORM_TENANT_IDENTIFIER | Default tenant identifier (must align with Fineract tenants table) |
default |
| FINERACT_PLATFORM_TENANTS_IDENTIFIER | Tenant identifier list (must align with Fineract tenants table) |
- |
Language Settings (i18n)
| Variable | Description | Default Value |
|---|---|---|
| MIFOS_DEFAULT_LANGUAGE | Default language | en-US |
| MIFOS_SUPPORTED_LANGUAGES | List of supported languages | cs-CS,de-DE,en-US,es-MX,fr-FR,it-IT,ko-KO,lt-LT,lv-LV,ne-NE,pt-PT,sw-SW |
Date and Datetime Format Settings
| Variable | Description | Default Value |
|---|---|---|
| MIFOS_DEFAULT_FORMAT_DATE | Default date format for the application | dd MMMM yyyy |
| MIFOS_DEFAULT_FORMAT_DATETIME | Default datetime format for the application | dd MMMM yyyy HH:mm:ss |
These environment variables control the default date and datetime formats used throughout the Mifos® X Web App. They can be set in your Docker environment, in the env.js/env.template.js files, or in your deployment environment.
MIFOS_DEFAULT_FORMAT_DATEsets the default format for displaying dates (e.g.,15 February 2026).MIFOS_DEFAULT_FORMAT_DATETIMEsets the default format for displaying date and time (e.g.,15 February 2026 14:30:00).
If a user does not select a custom format in the UI, these values are used as the fallback. You can override them per user in the Settings screen.
How to set:
In Docker Compose or Docker:
MIFOS_DEFAULT_FORMAT_DATE=yyyy-MM-dd
MIFOS_DEFAULT_FORMAT_DATETIME=yyyy-MM-dd HH:mm
In src/assets/env.template.js:
window['env']['defaultFormatDate'] = '$MIFOS_DEFAULT_FORMAT_DATE';
window['env']['defaultFormatDatetime'] = '$MIFOS_DEFAULT_FORMAT_DATETIME';
Where used:
These values are read by the application when it starts and are used as the default for date and datetime display in forms, tables, and reports.
Available languages:
| Language | Code | File |
|---|---|---|
| Czech | cs | cs-CS.json |
| German | de | de-DE.json |
| English | en | en-US.json |
| Spanish | es | es-MX.json |
| French | fr | fr-FR.json |
| Italian | it | it-IT.json |
| Korean | ko | ko-KO.json |
| Lithuanian | lt | lt-LT.json |
| Latvian | lv | lv-LV.json |
| Nepali | ne | ne-NE.json |
| Portuguese | pt | pt-PT.json |
| Swahili | sw | sw-SW.json |
Session & Performance Settings
| Variable | Description | Default Value |
|---|---|---|
| MIFOS_SESSION_IDLE_TIMEOUT | Session timeout in milliseconds | 300000 |
| MIFOS_PRELOAD_CLIENTS | Whether to preload clients in Clients view | true |
| MIFOS_DEFAULT_CHAR_DELIMITER | Character delimiter for CSV exports | , |
| MIFOS_WAIT_TIME_FOR_NOTIFICATIONS | Wait time in seconds for reading notifications | 60 |
| MIFOS_WAIT_TIME_FOR_CATCHUP | Wait time in seconds for reading COB Catch-Up status | 30 |
| MIFOS_MIN_PASSWORD_LENGTH | Minimum length for user passwords | 12 |
| MIFOS_HTTP_CACHE_ENABLED | whether to use HTTP Get calls with cache | false |
UI Display Settings
| Variable | Description | Default Value |
|---|---|---|
| MIFOS_DISPLAY_TENANT_SELECTOR | Display tenant selector in Login view | true |
| MIFOS_DISPLAY_BACKEND_INFO | Display backend info in footer | true |
| MIFOS_PRODUCTION_MODE | Show minimal production hero on login page | false |
| MIFOS_ALLOW_SERVER_SWITCH_SELECTOR | Display DNS server list | true |
| MIFOS_COMPLIANCE_HIDE_CLIENT_DATA | Hide client names in UI (mask with *) | false |
| MIFOS_PRODUCTION_MODE_ENABLE_RBAC | Enable Role-Based Access Control for menus/buttons | false |
OAUTH Settings
| Variable | Description | Default Value |
|---|---|---|
| MIFOS_OAUTH_SERVER_ENABLED | Enable the use of OAuth2 server | false |
| MIFOS_OAUTH_SERVER_URL | Set the OAuth2 server URL (issuer) | |
| MIFOS_OAUTH_SERVER_LOGOUT_URL | Set the OAuth2 server logout URL | |
| MIFOS_OAUTH_CLIENT_ID | Set the OAuth2 Client Id | |
| MIFOS_OAUTH_AUTHORIZE_URL | Set the OAuth2 authorization endpoint URL | |
| MIFOS_OAUTH_TOKEN_URL | Set the OAuth2 token endpoint URL | |
| MIFOS_OAUTH_REDIRECT_URI | Set the OAuth2 redirect URI after authentication | |
| MIFOS_OAUTH_SCOPE | Set the OAuth2 scopes (e.g., openid profile) |
OIDC Settings
| Variable | Description | Default Value |
|---|---|---|
| FINERACT_PLUGIN_OIDC_ENABLED | Enable the use of Oidc server | false |
| FINERACT_PLUGIN_OIDC_BASE_URL | Set the Oidc server URL | |
| FINERACT_PLUGIN_OIDC_CLIENT_ID | Set the Client Id | |
| FINERACT_PLUGIN_OIDC_API_URL | Set the Client API URL | |
| FINERACT_PLUGIN_OIDC_FRONTEND_URL | Set the Front End URL callback |
External National ID System Integration
These variables enable automatic lookup and auto-fill of client data from an external National ID system (e.g., Mexico's CURP) during client creation and editing.
| Variable | Description | Default Value |
|---|---|---|
| ENABLE_EXTERNAL_NATIONAL_ID_SYSTEM | Set to true to enable External National ID lookup |
false |
| EXTERNAL_NATIONAL_ID_SYSTEM_URL | URL of the external National ID API | |
| EXTERNAL_NATIONAL_ID_SYSTEM_API_HEADER | Header name for the external API key (e.g., X-Gravitee-Api-Key) |
|
| EXTERNAL_NATIONAL_ID_SYSTEM_API_KEY | API key value (injected server-side via nginx; keep empty in source control) | |
| EXTERNAL_NATIONAL_ID_REGEX | Regex pattern to validate the external ID format (e.g., CURP) | |
| EXTERNAL_NATIONALID_API_URL | Full upstream URL for nginx proxy_pass |
When ENABLE_EXTERNAL_NATIONAL_ID_SYSTEM is set to true, the following fields are auto-filled and disabled during client creation/editing after a successful lookup:
- First Name
- Middle Name
- Last Name
- Date of Birth
- Gender
The user types the External ID value, and if it matches the configured regex, the system calls the external API to retrieve and auto-fill client information.
Docker Compose with External National ID:
docker-compose -f docker-compose.yml -f docker-compose.external-nationalid.yml up -d
For more detailed configuration options, refer to the env.sample file in the root directory of the project.
Interbank Transfers Settings
| Variable | Description | Default Value |
|---|---|---|
| MIFOS_INTERBANK_TRANSFERS_API_URL | The Interbank server url | https://apis.mifos.community |
| MIFOS_INTERBANK_TRANSFERS_API_PROVIDER | The Interbank server endpoint | /vnext2 |
| MIFOS_INTERBANK_TRANSFERS_API_VERSION | The Interbank server api version | /v1.0 |
| MIFOS_INTERBANK_TRANSFERS_ENABLED | If the Interbank feature is enabled | true |
Remittance Module Settings
These variables configure the Remittance Module, which provides a 7-step wizard for processing remittance payouts (search, validate recipient, assign payout, confirm payment, and generate receipt).
| Variable | Description | Default Value |
|---|---|---|
| MIFOS_REMITTANCE_API_URL | The Remittance Microservice server URL | https://apis.mifos.community |
| MIFOS_REMITTANCE_API_PROVIDER | The Remittance server endpoint | /1.0/remittance |
| MIFOS_REMITTANCE_API_VERSION | The Remittance server API version | /v1 |
| MIFOS_REMITTANCE_ENABLED | If the Remittance feature is enabled | false |
| MIFOS_REMITTANCE_API_HEADER | API gateway auth header name | X-Gravitee-Api-Key |
| MIFOS_REMITTANCE_API_KEY | API key for the Remittance gateway |
When MIFOS_REMITTANCE_ENABLED is set to true, a "Remittances" menu item appears in the sidenav and the /remittances route becomes accessible. The module supports the following workflow:
- Search Remittance — Look up a transaction by vendor and external reference ID
- Remittance Details — Review transaction details and status
- Search Beneficiary — Validate the recipient's identity documents
- Beneficiary Details — Review validated recipient info and assign to a Mifos client
- Transactional Profile — Register the transactional profile and assign payout
- Confirm Payment — Final confirmation before payout
- Payment Receipt — View and print the payment receipt
Client Data Masking Example
When MIFOS_COMPLIANCE_HIDE_CLIENT_DATA=false (default):
EMANUEL CASTILLO MIGUEL TECO
When MIFOS_COMPLIANCE_HIDE_CLIENT_DATA=true:
E***** C******* M***** T***
This applies to client name display, e.g. in Institution/Clients list.
Interbank Transfer Menu
By default, the “Interbank Transfer” menu will be displayed in the hamburger menu of the Savings account.
Role-Based Access Control (RBAC)
What is RBAC? Role-Based Access Control restricts system access and functionality based on user roles and permissions. When enabled, menus and buttons in the WebApp are shown/hidden based on the user's assigned permissions.
When to enable RBAC:
- Production environments where strict access control is required
- Multi-tenant systems with different user roles (Teller, Field Officer, Loan Reviewer, etc.)
- Compliance requirements that mandate role-based permissions
Default Behavior (RBAC Disabled):
By default, MIFOS_PRODUCTION_MODE_ENABLE_RBAC=false maintains backward compatibility:
- All menus and buttons are visible to all logged-in users
- Existing deployments continue to work without configuration changes
- Suitable for development, testing, or single-user scenarios
When RBAC is Enabled:
Set MIFOS_PRODUCTION_MODE_ENABLE_RBAC=true to activate permission-based UI control:
- Menus (Institution, Admin, Reports, Accounting) require specific READ permissions
- Buttons (Create, Edit, Delete, Approve, etc.) require corresponding permissions
- Users see only features they have permissions for
- Important: You must configure roles in Apache Fineract® before enabling RBAC
How to enable RBAC:
-
Configure environment variable:
MIFOS_PRODUCTION_MODE_ENABLE_RBAC=true -
Create roles in Fineract Admin Panel:
- Navigate to: Admin → System → Manage Roles
- Create roles (e.g., Teller, Field Officer, Loan Reviewer, etc.)
- Assign appropriate permissions to each role
-
Assign roles to users:
- Navigate to: Admin → Users → Edit User
- Select appropriate role for each user
Common role examples include:
- Teller: Cash operations (deposits, withdrawals, repayments)
- Field Officer: Client onboarding, loan origination
- Loan Reviewer: Credit analysis, loan approval/rejection
- Treasurer: Disbursement, accounting, fund movements
- KYC Officer: Client identity verification
- PLD Officer (AML): Anti-money laundering monitoring
- Product Owner: Product and system configuration
Releases
1.0.0 (Tag: 1.0.0-fineract1.11)
This is the first official release of the Mifos® X web application:
- Developed for Apache Fineract® 1.11
- No Self Service area
- GLIM support limited
- JLG not yet supported
- Surveys not yet supported
Contributing
We welcome contributions! Please read our contribution guidelines before submitting pull requests.
Related Projects
Apache Fineract - Apache Fineract® provides open APIs and affordable core banking solution for financial institutions and is the backend for all UIs of the Mifos®.