WEB-506 feat: add Remittance Module with 7-step payout wizard (#3200)

WEB-506 fix: address CodeRabbit review (security, validation)

WEB-506 fix: make API gateway header name configurable (MIFOS_REMITTANCE_API_HEADER)

WEB-506 fix: remove duplicate translation keys (Personal Information, Transaction Details)
This commit is contained in:
Shubham Kumar
2026-02-21 23:52:37 -06:00
committed by GitHub
parent e8bfdd435d
commit 4c8f5d8343
50 changed files with 3684 additions and 13 deletions
+8
View File
@@ -90,6 +90,14 @@
window['env']['mifosInterbankTransfersApiVersion'] = '';
window['env']['mifosInterbankTransfersEnabled'] = 'true';
// Remittance Module Environment variables
window['env']['mifosRemittanceApiUrl'] = '';
window['env']['mifosRemittanceApiProvider'] = '/remittance-api';
window['env']['mifosRemittanceApiVersion'] = '/v1';
window['env']['mifosRemittanceEnabled'] = false;
window['env']['mifosRemittanceApiHeader'] = 'X-Gravitee-Api-Key';
window['env']['mifosRemittanceApiKey'] = '';
// Enable Role-Based Access Control (RBAC) for menu/button permissions
// Set to true to enable RBAC, false (default) for backward compatibility
window['env']['productionModeEnableRBAC'] = false;
+8
View File
@@ -102,6 +102,14 @@
window['env']['mifosInterbankTransfersApiVersion'] = '$MIFOS_INTERBANK_TRANSFERS_API_VERSION';
window['env']['mifosInterbankTransfersEnabled'] = '$MIFOS_INTERBANK_TRANSFERS_ENABLED';
// Remittance Module Environment variables
window['env']['mifosRemittanceApiUrl'] = '$MIFOS_REMITTANCE_API_URL';
window['env']['mifosRemittanceApiProvider'] = '$MIFOS_REMITTANCE_API_PROVIDER';
window['env']['mifosRemittanceApiVersion'] = '$MIFOS_REMITTANCE_API_VERSION';
window['env']['mifosRemittanceEnabled'] = '$MIFOS_REMITTANCE_ENABLED';
window['env']['mifosRemittanceApiHeader'] = '$MIFOS_REMITTANCE_API_HEADER';
window['env']['mifosRemittanceApiKey'] = '$MIFOS_REMITTANCE_API_KEY';
// Enable Role-Based Access Control (RBAC) for menu/button permissions
// Set to 'true' to enable RBAC, 'false' (default) for backward compatibility
window['env']['productionModeEnableRBAC'] = '$MIFOS_PRODUCTION_MODE_ENABLE_RBAC';
+111 -4
View File
@@ -502,6 +502,7 @@
"Resend OTP": "Resend OTP",
"Reset": "Reset",
"Reset Password": "Reset Password",
"Retry": "Retry",
"Retrieve": "Retrieve",
"Revert Transaction": "Revert Transaction",
"Run and Download Report": "Run and Download Report",
@@ -561,7 +562,14 @@
"View Active Charges": "View Active Charges",
"View Inactive Charges": "View Inactive Charges",
"Yes": "Yes",
"Is Self Service": "Is Self Service"
"Is Self Service": "Is Self Service",
"Assign Payout": "Assign Payout",
"Confirm Payment": "Confirm Payment",
"New Remittance": "New Remittance",
"Print Receipt": "Print Receipt",
"Validate Recipient": "Validate Recipient",
"View Receipt": "View Receipt",
"Add Entry": "Add Entry"
},
"catalogs": {
"Interest payment waiver": "Interest Payment Waiver",
@@ -1301,7 +1309,31 @@
"Date": "Date",
"Secure & Reliable": "Secure & Reliable",
"Community Driven": "Community Driven",
"Global Impact": "Global Impact"
"Global Impact": "Global Impact",
"Assign Payout": "Assign Payout",
"Assign to Mifos Client": "Assign to Mifos Client",
"Beneficiary Details": "Beneficiary Details",
"Confirm Payment": "Confirm Payment",
"Confirm Payout": "Confirm Payout",
"Confirmation Details": "Confirmation Details",
"Payment Receipt": "Payment Receipt",
"Payment Successful": "Payment Successful",
"Process Remittance": "Process Remittance",
"Recipient Details": "Recipient Details",
"Recipient Summary": "Recipient Summary",
"Remittance Details": "Remittance Details",
"Search Beneficiary": "Search Beneficiary",
"Search Remittance": "Search Remittance",
"Transaction": "Transaction",
"Transaction Status": "Transaction Status",
"Transaction Summary": "Transaction Summary",
"Transactional Profile": "Transactional Profile",
"Validated Recipient Information": "Validated Recipient Information",
"Recipient": "Recipient",
"Payout Assignment": "Payout Assignment",
"Identification": "Identification",
"Professional Information": "Professional Information",
"Add Profile Entry": "Add Profile Entry"
},
"inputs": {
"Floating rate": "Floating Rate",
@@ -1519,6 +1551,7 @@
"Client Details": "Client Details",
"Client ID": "Client ID",
"Client Id": "Client Id",
"Confirmation Number": "Confirmation Number",
"Client Member": "Client Member",
"Client Members": "Client Members",
"Client Name": "Client Name",
@@ -1707,6 +1740,9 @@
"Do not calculate interest on past due principal balances": "Do not calculate interest on past due principal balances",
"Documents": "Documents",
"Document Key": "Document Key",
"Document": "Document",
"Document Number": "Document Number",
"Document number is required": "Document number is required",
"Document Type": "Document Type",
"Dormancy Tracking": "Dormancy Tracking",
"Download": "Download",
@@ -1767,6 +1803,8 @@
"Extend Repayment Period": "Extend Repayment Period",
"External Asset Owner": "External Asset Owner",
"External ID": "External ID",
"Failed to load vendors": "Failed to load vendors",
"External Reference ID": "External Reference ID",
"External Id": "External Id",
"External id": "External id",
"External ID not found": "External ID not found",
@@ -1795,6 +1833,7 @@
"Filter By Version": "Filter By Version",
"Financial Activity": "Financial Activity",
"First Name": "First Name",
"First name is required": "First name is required",
"First repayment on": "First repayment on",
"Fixed Account": "Fixed Account",
"Fixed Deposit": "Fixed Deposit",
@@ -1986,6 +2025,7 @@
"Last Active Transaction Date": "Last Active Transaction Date",
"Last Loan Amount": "Last Loan Amount",
"Last Name": "Last Name",
"Last name is required": "Last name is required",
"Last Repayment": "Last Repayment",
"Last Repayment Date": "Last Repayment Date",
"Late": "Late",
@@ -1995,6 +2035,7 @@
"Liability Account": "Liability Account",
"Liability Account (CR)": "Liability Account (CR)",
"Lifted On": "Lifted On",
"Loading vendors...": "Loading vendors...",
"Link savings": "Link savings",
"Linked Savings Account": "Linked Savings Account",
"Linked Savings Account(Dividend Posting)": "Linked Savings Account(Dividend Posting)",
@@ -2426,6 +2467,7 @@
"Schedule Date": "Schedule Date",
"Score": "Score",
"Screen Report": "Screen Report",
"Search Client": "Search Client",
"Search Journal Entries": "Search Journal Entries",
"Select Action": "Select Action",
"Select Client Members for Transfer": "Select Client Members for Transfer",
@@ -2570,6 +2612,7 @@
"Trigger Type": "Trigger Type",
"Tuesday": "Tuesday",
"Type": "Type",
"Type client name or account number": "Type client name or account number",
"Type/Quality": "Type/Quality",
"Unassigned": "Unassigned",
"Unassignment Date": "Unassignment Date",
@@ -2692,7 +2735,45 @@
"Overdue": "Overdue",
"Overdue Fees": "Overdue Fees",
"Select action": "Select action",
"Select entity": "Select entity"
"Select entity": "Select entity",
"Confirmed At": "Confirmed At",
"Full Name": "Full Name",
"Loading vendors...": "Loading vendors...",
"Minimum 3 characters": "Minimum 3 characters",
"National ID": "National ID",
"Nationality": "Nationality",
"Payout Amount": "Payout Amount",
"Payout Country": "Payout Country",
"Payout Token": "Payout Token",
"Recipient Name": "Recipient Name",
"Reference ID is required": "Reference ID is required",
"Send Amount": "Send Amount",
"Send Country": "Send Country",
"Sender": "Sender",
"Sender Name": "Sender Name",
"Sent By": "Sent By",
"Deposited At": "Deposited At",
"Vendor": "Vendor",
"Vendor is required": "Vendor is required",
"Voter ID": "Voter ID",
"Passport": "Passport",
"Driver's License": "Driver's License",
"Mothers Maiden Name": "Mother's Maiden Name",
"National Identity Card Number": "National Identity Card Number",
"State": "State",
"Municipality": "Municipality",
"Locality": "Locality",
"New Locality": "New Locality",
"Occupation": "Occupation",
"Economic Activity": "Economic Activity",
"Entity Member": "Entity Member",
"Country": "Country",
"# Remittance": "# Remittance",
"Avg Amount/Transaction": "Avg Amount/Transaction",
"# Senders": "# Senders",
"Sender Registry": "Sender Registry",
"Individual": "Individual",
"Legal Entity": "Legal Entity"
},
"links": {
"Community": "Community",
@@ -2782,6 +2863,8 @@
"Interbank Transfer": "Interbank Transfer",
"Interest Payment Waiver": "Interest Payment Waiver",
"Payments": "Payments",
"Remittances": "Remittances",
"Process Remittance": "Process Remittance",
"Payout Refund": "Payout Refund",
"Post Interest": "Post Interest",
"Post Interest As On": "Post Interest As On",
@@ -2833,8 +2916,14 @@
"Reject Additional Shares": "Reject Additional Shares"
},
"placeholders": {
"# Remittance": "# Remittance",
"Add new server": "Add new server",
"Enter document number": "Enter document number",
"Enter first name (include middle name)": "Enter first name (include middle name)",
"Enter last name": "Enter last name",
"Enter remittance reference number": "Enter remittance reference number",
"Search Activity": "Search Activity",
"Sender name": "Sender name",
"Enter your username": "Enter your username",
"Enter your password": "Enter your password"
},
@@ -2949,6 +3038,7 @@
"Business Date functionality is not enabled": "The Business Date functionality is not enabled. If you need that, Go to Global Configurations and enable the configuration",
"Button for accounting department": "This button opens the menu to access the system tools required by the accounting department.",
"Button for individual account": "This button will be used for individual accounts, groups and centers",
"Failed to search clients. Please try again.": "Failed to search clients. Please try again.",
"Cancel Pending Sale": "Cancel Pending Sale",
"Cashier Transactions": "Cashier Transactions",
"Cashiers": "Cashiers",
@@ -3431,6 +3521,7 @@
"Preferences for generating account numbers for client": "Preferences for generating account numbers for client, loan and savings accounts",
"Products": "Products",
"Products Mix": "Products Mix",
"Process Remittance": "Process Remittance",
"Profile": "Profile",
"Provisioning Criteria": "Provisioning Criteria",
"Provisioning Entries": "Provisioning Entries",
@@ -3482,6 +3573,7 @@
"Scheduler Job History": "Scheduler Job History",
"Scheduler Jobs can set batch jobs": "By using Scheduler Jobs, you can set batch jobs to be completed at regular intervals. From this page you can schedule, modify or delete jobs.",
"Search": "Search",
"Search and assign this beneficiary to an existing Mifos client account": "Search and assign this beneficiary to an existing Mifos client account",
"Search by Text": "Search by Text",
"SearchByName": "Search by Name",
"SearchByClient": "Search by client name, external Id, mobile",
@@ -3661,7 +3753,21 @@
"“Maker-Checker” principle requires every tasks": "The “Maker-Checker” principle requires every tasks to be completed by two people to reduce the chance of errors and misuse. One person initiates the process and the second completes it.",
"Buy Down Fees": "Buy Down Fees",
"Undo Write-off Description": "This action will reverse the write-off transaction and restore the loan to its previous active status. Please provide a note explaining the reason for this action.",
"UploadDocumentHint": "Upload a PDF or image to generate a preview."
"UploadDocumentHint": "Upload a PDF or image to generate a preview.",
"This remittance has a terminal status and cannot be processed further.": "This remittance has a terminal status and cannot be processed further.",
"This remittance has already been paid successfully.": "This remittance has already been paid successfully.",
"Review the transaction and recipient details below, then assign the payout.": "Review the transaction and recipient details below, then assign the payout.",
"Please review the details carefully before confirming the payment.": "Please review the details carefully before confirming the payment.",
"Register the transactional profile for the beneficiary. Add entries for individuals or legal entities.": "Register the transactional profile for the beneficiary. Add entries for individuals or legal entities.",
"No transactional profile entries yet. Add one below.": "No transactional profile entries yet. Add one below.",
"Click to remove": "Click to remove",
"Recipient is not valid for this transaction. Please check the details.": "Recipient is not valid for this transaction. Please check the details.",
"Recipient validation failed. Please check the document details and try again.": "Recipient validation failed. Please check the document details and try again.",
"Missing required information. Please try again.": "Missing required information. Please try again.",
"Failed to confirm payment. Please try again or contact support.": "Failed to confirm payment. Please try again or contact support.",
"Failed to assign payout. Please try again.": "Failed to assign payout. Please try again.",
"Remittance not found. Please check the reference number and try again.": "Remittance not found. Please check the reference number and try again.",
"Unable to load vendors. Please check your connection and try again.": "Unable to load vendors. Please check your connection and try again."
},
"auditTrail": {
"actions": {
@@ -3840,6 +3946,7 @@
"Indicates whether to enforce a minimum balance": "Indicates whether to enforce a minimum balance",
"Indicates whether the dividends can be processed even share account of this share product is inactive": "Indicates whether the dividends can be processed even share account of this share product is inactive",
"Individual Collection Sheet": "Individual Collection Sheet",
"Process Remittance": "Process Remittance",
"Input to calculating the repayment schedule for a loan account": "These fields are input to calculating the repayment schedule for a loan account and are used to determine when payments are due.",
"Interest effective from date": "Interest effective from date",
"Interest rate is posted or credited to a saving account": "The period at which interest rate is posted or credited to a saving account",
+95 -4
View File
@@ -560,7 +560,15 @@
"Is Self Service": "Es autoservicio",
"Advanced Search": "Búsqueda avanzada",
"Show advanced search": "Mostrar búsqueda avanzada",
"Hide advanced search": "Ocultar búsqueda avanzada"
"Hide advanced search": "Ocultar búsqueda avanzada",
"Validate Recipient": "Validar Beneficiario",
"Assign Payout": "Asignar Pago",
"Confirm Payment": "Confirmar Pago",
"Print Receipt": "Imprimir Recibo",
"New Remittance": "Nueva Remesa",
"View Receipt": "Ver Recibo",
"Add Entry": "Agregar Entrada",
"Retry": "Reintentar"
},
"catalogs": {
"Interest payment waiver": "Exención de pago de intereses",
@@ -801,6 +809,9 @@
"Passport": "Pasaporte",
"Id": "Identificación",
"Drivers License": "Licencia de conducir",
"Driver's License": "Licencia de Conducir",
"National ID": "Identificación Nacional",
"Voter ID": "Credencial de Elector",
"Any Other Id Type": "Cualquier otro tipo de identificación",
"Check loan repayment overdue": "Verificar pagos vencidos de créditos",
"Update loan arrears aging": "Actualizar antigüedad de atrasos en los créditos",
@@ -1296,7 +1307,30 @@
"Contact Information": "Información de Contacto",
"Classification": "Clasificación",
"Status": "Estado",
"Pending Tasks": "Tareas pendientes"
"Pending Tasks": "Tareas pendientes",
"Process Remittance": "Procesar Remesa",
"Search Remittance": "Buscar Remesa",
"Remittance Details": "Detalles de la Remesa",
"Search Beneficiary": "Buscar Beneficiario",
"Beneficiary Details": "Detalles del Beneficiario",
"Transactional Profile": "Perfil Transaccional",
"Confirm Payout": "Confirmar Pago",
"Confirm Payment": "Confirmar Pago",
"Payment Receipt": "Recibo de Pago",
"Transaction": "Transacción",
"Recipient": "Beneficiario",
"Payout Assignment": "Asignación de Pago",
"Assign Payout": "Asignar Pago",
"Validated Recipient Information": "Información del Beneficiario Validada",
"Identification": "Identificación",
"Professional Information": "Información Profesional",
"Assign to Mifos Client": "Asignar a Cliente Mifos",
"Add Profile Entry": "Agregar Entrada de Perfil",
"Recipient Details": "Detalles del Beneficiario",
"Confirmation Details": "Detalles de Confirmación",
"Payment Successful": "Pago Exitoso",
"Transaction Status": "Estado de la Transacción",
"Transaction Summary": "Resumen de la Transacción"
},
"inputs": {
"Floating rate": "Tasa flotante",
@@ -1986,6 +2020,7 @@
"Liability Account": "Cuenta de responsabilidad",
"Liability Account (CR)": "Cuenta de Pasivo (CR)",
"Lifted On": "levantado",
"Loading vendors...": "Cargando proveedores...",
"Link savings": "Ahorro de enlaces",
"Linked Savings Account": "Cuenta de Ahorros vinculada",
"Linked Savings Account(Dividend Posting)": "Cuenta de Ahorros vinculada (publicación de dividendos)",
@@ -2462,6 +2497,7 @@
"Start Time": "Hora de inicio",
"Started On": "Iniciado en",
"Starting date": "Fecha de inicio",
"State": "Estado",
"State / Province": "Estado o Provincia",
"Status": "Estado",
"Step Name": "Nombre del paso",
@@ -2821,11 +2857,50 @@
"Redeem Shares": "Canjear acciones",
"Approve Additional Shares": "Aprobar acciones adicionales",
"Reject Additional Shares": "Rechazar acciones adicionales",
"Tasks": "Tareas"
"Tasks": "Tareas",
"Vendor": "Proveedor",
"Loading vendors...": "Cargando proveedores...",
"Failed to load vendors": "Error al cargar proveedores",
"External Reference ID": "ID de Referencia Externa",
"Reference ID is required": "Se requiere ID de referencia",
"Minimum 3 characters": "Mínimo 3 caracteres",
"Sent By": "Enviado Por",
"Deposited At": "Depositado En",
"Sender Name": "Nombre del Remitente",
"Payout Amount": "Monto del Pago",
"Recipient Name": "Nombre del Beneficiario",
"Individual": "Individual",
"Legal Entity": "Persona Moral",
"# Remittance": "# Remesa",
"Avg Amount/Transaction": "Monto Promedio/Transacción",
"# Senders": "# Remitentes",
"Sender Registry": "Registro de Remitentes",
"Sender": "Remitente",
"Document": "Documento",
"Document Number": "Número de Documento",
"First name is required": "Se requiere nombre",
"Last name is required": "Se requiere apellido",
"Document number is required": "Se requiere número de documento",
"National Identity Card Number": "Número de Cédula de Identidad Nacional",
"Mothers Maiden Name": "Apellido de Soltera de la Madre",
"Municipality": "Municipio",
"Locality": "Localidad",
"New Locality": "Nueva Localidad",
"Occupation": "Ocupación",
"Economic Activity": "Actividad Económica",
"Entity Member": "Miembro de Entidad",
"Search Client": "Buscar Cliente",
"Type client name or account number": "Escriba nombre del cliente o número de cuenta"
},
"placeholders": {
"# Remittance": "# Remesa",
"Add new server": "Agregar nuevo servidor",
"Enter document number": "Ingrese número de documento",
"Enter first name (include middle name)": "Ingrese nombre (incluya segundo nombre)",
"Enter last name": "Ingrese apellido",
"Enter remittance reference number": "Ingrese número de referencia de remesa",
"Search Activity": "Actividad de búsqueda",
"Sender name": "Nombre del remitente",
"Enter your username": "Ingrese su nombre de usuario",
"Enter your password": "Ingrese su contraseña"
},
@@ -3852,7 +3927,23 @@
"Create Interest Refund": "Crear reembolso de intereses",
"ACTIVE": "ACTIVO",
"PENDING": "PENDIENTE",
"INACTIVE": "INACTIVO"
"INACTIVE": "INACTIVO",
"Unable to load vendors. Please check your connection and try again.": "No se pudieron cargar los proveedores. Verifique su conexión e intente de nuevo.",
"This remittance has a terminal status and cannot be processed further.": "Esta remesa tiene un estado terminal y no puede ser procesada.",
"This remittance has already been paid successfully.": "Esta remesa ya ha sido pagada exitosamente.",
"Register the transactional profile for the beneficiary. Add entries for individuals or legal entities.": "Registre el perfil transaccional del beneficiario. Agregue entradas para individuos o personas morales.",
"Click to remove": "Clic para eliminar",
"No transactional profile entries yet. Add one below.": "Aún no hay entradas en el perfil transaccional. Agregue una a continuación.",
"Please review the details carefully before confirming the payment.": "Revise los detalles cuidadosamente antes de confirmar el pago.",
"Search and assign this beneficiary to an existing Mifos client account": "Buscar y asignar este beneficiario a una cuenta de cliente Mifos existente",
"Failed to search clients. Please try again.": "Error al buscar clientes. Intente de nuevo.",
"Recipient is not valid for this transaction. Please check the details.": "El beneficiario no es válido para esta transacción. Verifique los detalles.",
"Recipient validation failed. Please check the document details and try again.": "La validación del beneficiario falló. Verifique los detalles del documento e intente de nuevo.",
"Missing required information. Please try again.": "Falta información requerida. Intente de nuevo.",
"Failed to confirm payment. Please try again or contact support.": "Error al confirmar el pago. Intente de nuevo o contacte al soporte.",
"Failed to assign payout. Please try again.": "Error al asignar el pago. Intente de nuevo.",
"Remittance not found. Please check the reference number and try again.": "Remesa no encontrada. Verifique el número de referencia e intente de nuevo.",
"Review the transaction and recipient details below, then assign the payout.": "Revise los detalles de la transacción y del beneficiario a continuación, luego asigne el pago."
},
"countries": {
"AF": "Afganistán",