WEB-642: Add Originators tab on loan details view

This commit is contained in:
Jose Alberto Hernandez 2026-01-31 12:46:52 -05:00
parent 544990cfd0
commit f1e381346c
21 changed files with 1583 additions and 1326 deletions

View File

@ -0,0 +1,31 @@
/**
* Copyright since 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
import { Injectable, inject } from '@angular/core';
import { ActivatedRouteSnapshot } from '@angular/router';
import { LoansService } from 'app/loans/loans.service';
import { Observable, throwError } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class LoanOriginatorsResolver {
private loansService = inject(LoansService);
/**
* Returns the Loans data.
* @returns {Observable<any>}
*/
resolve(route: ActivatedRouteSnapshot): Observable<any> {
const loanId = route.paramMap.get('loanId') ?? route.parent?.paramMap.get('loanId');
if (!loanId) {
return throwError(() => new Error('Missing loanId route param'));
}
return this.loansService.getLoanOriginators(loanId);
}
}

View File

@ -74,6 +74,8 @@ import { LoanTermVariationsResolver } from './common-resolvers/loan-term-variati
import { LoanDeferredIncomeTabComponent } from './loans-view/loan-deferred-income-tab/loan-deferred-income-tab.component';
import { LoanDeferredIncomeDataResolver } from './common-resolvers/loan-deferred-income-data.resolver';
import { LoanBuyDownFeesDataResolver } from './common-resolvers/loan-buy-down-fees-data.resolver';
import { LoanOriginatorsTabComponent } from './loans-view/loan-originators-tab/loan-originators-tab.component';
import { LoanOriginatorsResolver } from './common-resolvers/loan-originators.resolver';
/** Loans Route. */
const routes: Routes = [
@ -108,10 +110,7 @@ const routes: Routes = [
path: 'general',
component: GeneralTabComponent,
data: { title: 'General', breadcrumb: 'General', routeParamBreadcrumb: false },
resolve: {
loanDetailsData: LoanDetailsResolver,
loanDatatables: LoanDatatablesResolver
}
resolve: {}
},
{
path: 'accountdetail',
@ -271,6 +270,19 @@ const routes: Routes = [
}
]
},
{
path: 'originators',
data: { title: 'Loans Originators', breadcrumb: 'Originators', routeParamBreadcrumb: false },
resolve: {
loanOriginatorsData: LoanOriginatorsResolver
},
children: [
{
path: '',
component: LoanOriginatorsTabComponent
}
]
},
{
path: 'buy-down-fees',
component: LoanBuyDownFeesTabComponent,

View File

@ -0,0 +1,52 @@
<!--
Copyright since 2025 Mifos Initiative
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
-->
<div class="container">
<h3>{{ 'labels.heading.Loan Originators' | translate }}</h3>
<table mat-table [dataSource]="loanOriginatorsData">
<ng-container matColumnDef="id">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Id' | translate }}</th>
<td mat-cell *matCellDef="let item">
{{ item.id }}
</td>
</ng-container>
<ng-container matColumnDef="externalId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.External Id' | translate }}</th>
<td mat-cell *matCellDef="let item">
{{ item.externalId }}
</td>
</ng-container>
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Name' | translate }}</th>
<td mat-cell *matCellDef="let item">
{{ item.name }}
</td>
</ng-container>
<ng-container matColumnDef="status">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Status' | translate }}</th>
<td mat-cell *matCellDef="let item">
{{ item.status }}
</td>
</ng-container>
<ng-container matColumnDef="originatorTypeId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Originator Type' | translate }}</th>
<td mat-cell *matCellDef="let item">
{{ item.originatorTypeId }}
</td>
</ng-container>
<ng-container matColumnDef="channelTypeId">
<th mat-header-cell *matHeaderCellDef>{{ 'labels.inputs.Channel Type' | translate }}</th>
<td mat-cell *matCellDef="let item">
{{ item.channelTypeId }}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="loanoriginatorsColumns"></tr>
<tr mat-row *matRowDef="let row; columns: loanoriginatorsColumns"></tr>
</table>
</div>

View File

@ -0,0 +1,16 @@
/**
* Copyright since 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
table {
width: 100%;
}
.container {
padding-top: 1%;
padding-bottom: 2%;
}

View File

@ -0,0 +1,65 @@
/**
* Copyright since 2025 Mifos Initiative
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
import { Component, inject } from '@angular/core';
import {
MatCell,
MatCellDef,
MatColumnDef,
MatHeaderCell,
MatHeaderCellDef,
MatHeaderRow,
MatHeaderRowDef,
MatRow,
MatRowDef,
MatTable
} from '@angular/material/table';
import { ActivatedRoute } from '@angular/router';
import { LoanOriginator } from 'app/loans/models/loan-account.model';
import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module';
@Component({
selector: 'mifosx-loan-originators-tab',
templateUrl: './loan-originators-tab.component.html',
styleUrl: './loan-originators-tab.component.scss',
imports: [
...STANDALONE_SHARED_IMPORTS,
MatTable,
MatColumnDef,
MatHeaderCellDef,
MatHeaderCell,
MatCellDef,
MatCell,
MatHeaderRowDef,
MatHeaderRow,
MatRowDef,
MatRow
]
})
export class LoanOriginatorsTabComponent {
private route = inject(ActivatedRoute);
loanOriginatorsData: LoanOriginator[] = [];
loanId: number | null = null;
loanoriginatorsColumns: string[] = [
'id',
'externalId',
'name',
'status',
'originatorTypeId',
'channelTypeId'
];
constructor() {
const loanIdParam = this.route.parent?.parent?.snapshot.paramMap.get('loanId');
this.loanId = loanIdParam ? Number(loanIdParam) : null;
this.route.parent.data.subscribe((data: { loanOriginatorsData: any }) => {
this.loanOriginatorsData = data.loanOriginatorsData.originators;
});
}
}

View File

@ -278,6 +278,15 @@
{{ 'labels.inputs.Delinquency Tags' | translate }}
</a>
}
<a
mat-tab-link
[routerLink]="['./originators']"
routerLinkActive
#originators="routerLinkActive"
[active]="originators.isActive"
>
{{ 'labels.inputs.Originators' | translate }}
</a>
@if (loanDetailsData.collateral) {
<a
mat-tab-link

View File

@ -771,4 +771,11 @@ export class LoansService {
getLoanDisbursementDetailsData(): DisbursementData[] {
return JSON.parse(localStorage.getItem('disbursementData'));
}
/**
* Returns the Loan Originators data
*/
getLoanOriginators(loanId: any) {
return this.http.get(`/loans/${loanId}/originators`);
}
}

View File

@ -172,3 +172,12 @@ export interface ScheduleChangeRecord {
dueDate: string;
installmentAmount: number;
}
export interface LoanOriginator {
id: number;
externalId: string;
name: string;
status: string;
originatorTypeId: number;
channelTypeId: number;
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1100,6 +1100,7 @@
"Loan Delinquency Installment Tags": "Loan Delinquency Installment Tags",
"Loan Details": "Loan Details",
"Loan Disbursal": "Loan Disbursal",
"Loan Originators": "Loan Originators",
"Loan Product": "Loan Product",
"Loan Products": "Loan Products",
"Loan Provisioning Criteria": "Loan Provisioning Criteria",
@ -1452,6 +1453,7 @@
"Calculation": "Calculation",
"Center Name": "Center Name",
"Center": "Center",
"Channel Type": "Channel Type",
"Change Repayment Date": "Change Repayment Date",
"Changes Affection Date": "Changes Affection Date",
"Charge": "Charge",
@ -2141,6 +2143,8 @@
"Option": "Option",
"Order": "Order",
"Original": "Original",
"Originator Type": "Originator Type",
"Originators": "Originators",
"Original Loan": "Original Loan",
"Original Schedule": "Original Schedule",
"Output Type": "Output Type",

View File

@ -1087,6 +1087,7 @@
"Loan Delinquency Installment Tags": "Etiquetas de morosidad de cuotas",
"Loan Details": "Detalles del Crédito",
"Loan Disbursal": "Curso de préstamos",
"Loan Originators": "Originadores de préstamos",
"Loan Product": "Producto de Crédito",
"Loan Products": "Productos de Crédito",
"Loan Provisioning Criteria": "Criterios de concesión de Créditos",
@ -1448,6 +1449,7 @@
"Calculation": "Cálculo",
"Center Name": "Nombre del centro",
"Center": "Centro",
"Channel Type": "Tipo de canal",
"Change Repayment Date": "Cambiar fecha de pago",
"Changes Affection Date": "Cambia la fecha de cariño",
"Charge": "Comisión",
@ -2135,6 +2137,8 @@
"Option": "Opción",
"Order": "Orden",
"Original": "Original",
"Originator Type": "Tipo de originador",
"Originators": "Originadores",
"Original Loan": "Crédito original",
"Original Schedule": "Calendario original",
"Output Type": "Tipo de salida",

View File

@ -1086,6 +1086,7 @@
"Loan Delinquency Installment Tags": "Etiquetas de morosidad de cuotas",
"Loan Details": "Detalles del Crédito",
"Loan Disbursal": "Desembolso de préstamos",
"Loan Originators": "Originadores de préstamos",
"Loan Product": "Producto de Crédito",
"Loan Products": "Productos de Crédito",
"Loan Provisioning Criteria": "Criterios de concesión de Créditos",
@ -1447,6 +1448,7 @@
"Calculation": "Cálculo",
"Center Name": "Nombre del centro",
"Center": "Centro",
"Channel Type": "Tipo de canal",
"Change Repayment Date": "Cambiar fecha de pago",
"Changes Affection Date": "Cambia la fecha de cariño",
"Charge": "Comisión",
@ -2135,6 +2137,8 @@
"Option": "Opción",
"Order": "Orden",
"Original": "Original",
"Originator Type": "Tipo de originador",
"Originators": "Originadores",
"Original Loan": "Crédito original",
"Original Schedule": "Calendario original",
"Output Type": "Tipo de salida",

View File

@ -1087,6 +1087,7 @@
"Loan Delinquency Installment Tags": "Étiquettes de versement de délinquance de prêt",
"Loan Details": "Détails du prêt",
"Loan Disbursal": "Disquations du prêt",
"Loan Originators": "Les courtiers en prêts",
"Loan Product": "Produit de prêt",
"Loan Products": "Produits de prêt",
"Loan Provisioning Criteria": "Critères de provisionnement du prêt",
@ -1448,6 +1449,7 @@
"Calculation": "Calcul",
"Center Name": "Nom du centre",
"Center": "Centre",
"Channel Type": "Type de canal",
"Change Repayment Date": "Modifier la date de remboursement",
"Changes Affection Date": "Modifications Date d'Affectation",
"Charge": "Charge",
@ -2134,6 +2136,8 @@
"Option": "Option",
"Order": "Commande",
"Original": "Original",
"Originator Type": "Type d'initiateur",
"Originators": "Créateurs",
"Original Loan": "Prêt initial",
"Original Schedule": "Calendrier original",
"Output Type": "Le type de sortie",

View File

@ -1086,6 +1086,7 @@
"Loan Delinquency Installment Tags": "Prestito tag di rata delinquenza",
"Loan Details": "Dettagli del prestito",
"Loan Disbursal": "Prestito erogato",
"Loan Originators": "Originatori di prestiti",
"Loan Product": "Prodotto di prestito",
"Loan Products": "Prodotti di prestito",
"Loan Provisioning Criteria": "Criteri di erogazione del prestito",
@ -1447,6 +1448,7 @@
"Calculation": "Calcolo",
"Center Name": "Nome del centro",
"Center": "Centro",
"Channel Type": "Tipo di canale",
"Change Repayment Date": "Modifica data di rimborso",
"Changes Affection Date": "Modifica la data di affetto",
"Charge": "Carica",
@ -2133,6 +2135,8 @@
"Option": "Opzione",
"Order": "Ordine",
"Original": "Originale",
"Originator Type": "Tipo di originatore",
"Originators": "Originatori",
"Original Loan": "Prestito originale",
"Original Schedule": "Programma originale",
"Output Type": "Tipo di uscita",

View File

@ -1087,6 +1087,7 @@
"Loan Delinquency Installment Tags": "대출 연체 설치 태그",
"Loan Details": "대출내역",
"Loan Disbursal": "대출 지시",
"Loan Originators": "대출 담당자",
"Loan Product": "대출상품",
"Loan Products": "대출상품",
"Loan Provisioning Criteria": "대출 준비 기준",
@ -1449,6 +1450,7 @@
"Calculation": "계산",
"Center Name": "센터명",
"Center": "센터",
"Channel Type": "채널 유형",
"Change Repayment Date": "상환일 변경",
"Changes Affection Date": "애정 날짜 변경",
"Charge": "요금",
@ -2135,6 +2137,8 @@
"Option": "옵션",
"Order": "주문하다",
"Original": "원래의",
"Originator Type": "발신자 유형",
"Originators": "창시자",
"Original Loan": "원대출",
"Original Schedule": "원래 일정",
"Output Type": "출력 유형",

View File

@ -1085,6 +1085,7 @@
"Loan Delinquency Installment Tags": "Paskolos nusikalstamumo įmokos žymos",
"Loan Details": "Paskolos informacija",
"Loan Disbursal": "Paskolos išmokimas",
"Loan Originators": "Paskolų teikėjai",
"Loan Product": "Paskolos produktas",
"Loan Products": "Paskolos produktai",
"Loan Provisioning Criteria": "Paskolos suteikimo kriterijai",
@ -1446,6 +1447,7 @@
"Calculation": "Skaičiavimas",
"Center Name": "Centro pavadinimas",
"Center": "centras",
"Channel Type": "Kanalo tipas",
"Change Repayment Date": "Keisti grąžinimo datą",
"Changes Affection Date": "Keičia prisirišimo datą",
"Charge": "Įkrauti",
@ -2132,6 +2134,8 @@
"Option": "Parinktis",
"Order": "Įsakymas",
"Original": "Originalus",
"Originator Type": "Iniciatoriaus tipas",
"Originators": "Kūrėjai",
"Original Loan": "Originali paskola",
"Original Schedule": "Originalus tvarkaraštis",
"Output Type": "Išvesties tipas",

View File

@ -1087,6 +1087,7 @@
"Loan Delinquency Installment Tags": "Aizdevuma likumpārkāpumu iemaksas tagi",
"Loan Details": "Aizdevuma detaļas",
"Loan Disbursal": "Aizdevuma izmaksa",
"Loan Originators": "Aizdevumu izsniedzēji",
"Loan Product": "Aizdevuma produkts",
"Loan Products": "Aizdevuma produkti",
"Loan Provisioning Criteria": "Aizdevuma piešķiršanas kritēriji",
@ -1448,6 +1449,7 @@
"Calculation": "Aprēķins",
"Center Name": "Centra nosaukums",
"Center": "Centrs",
"Channel Type": "Kanāla veids",
"Change Repayment Date": "Mainīt atmaksas datumu",
"Changes Affection Date": "Maina pieķeršanās datumu",
"Charge": "Uzlādē",
@ -2134,6 +2136,8 @@
"Option": "Opcija",
"Order": "Pasūtiet",
"Original": "Oriģināls",
"Originator Type": "Izcelsmes veids",
"Originators": "Izcelsmes",
"Original Loan": "Sākotnējais aizdevums",
"Original Schedule": "Sākotnējais grafiks",
"Output Type": "Izvades veids",

View File

@ -1086,6 +1086,7 @@
"Loan Delinquency Installment Tags": "ण दिक्विर्याज किग ट्यागहरू",
"Loan Details": "ऋण विवरण",
"Loan Disbursal": "Loan ण विभेदत्मक",
"Loan Originators": "ऋण सुरुवातकर्ताहरू",
"Loan Product": "ऋण उत्पादन",
"Loan Products": "ऋण उत्पादनहरू",
"Loan Provisioning Criteria": "ऋण प्रावधान मापदण्ड",
@ -1447,6 +1448,7 @@
"Calculation": "हिसाब",
"Center Name": "केन्द्रको नाम",
"Center": "केन्द्र",
"Channel Type": "च्यानल प्रकार",
"Change Repayment Date": "पुन: भुक्तानी मिति परिवर्तन गर्नुहोस्",
"Changes Affection Date": "स्नेह मिति परिवर्तन गर्दछ",
"Charge": "चार्ज",
@ -2133,6 +2135,8 @@
"Option": "विकल्प",
"Order": "अर्डर",
"Original": "मौलिक",
"Originator Type": "सुरुवातकर्ताको प्रकार",
"Originators": "सुरुवातकर्ताहरू",
"Original Loan": "मूल ऋण",
"Original Schedule": "मूल तालिका",
"Output Type": "आउटपुट प्रकार",

View File

@ -1087,6 +1087,7 @@
"Loan Delinquency Installment Tags": "Tags de parcelamento de inadimplência de empréstimo",
"Loan Details": "Detalhes do empréstimo",
"Loan Disbursal": "Desembolso do empréstimo",
"Loan Originators": "Agentes de Crédito",
"Loan Product": "Produto de empréstimo",
"Loan Products": "Produtos de empréstimo",
"Loan Provisioning Criteria": "Critérios de provisionamento de empréstimos",
@ -1448,6 +1449,7 @@
"Calculation": "Cálculo",
"Center Name": "Nome do centro",
"Center": "Centro",
"Channel Type": "Tipo de canal",
"Change Repayment Date": "Alterar data de reembolso",
"Changes Affection Date": "Altera a data do afeto",
"Charge": "Cobrar",
@ -2134,6 +2136,8 @@
"Option": "Opção",
"Order": "Ordem",
"Original": "Original",
"Originator Type": "Tipo de origem",
"Originators": "Criadores",
"Original Loan": "Empréstimo Original",
"Original Schedule": "Cronograma Original",
"Output Type": "Tipo de saída",

View File

@ -1084,6 +1084,7 @@
"Loan Delinquency Installment Tags": "Vitambulisho vya Usanidi wa Mikopo ya Mkopo",
"Loan Details": "Maelezo ya Mkopo",
"Loan Disbursal": "Utoaji wa mkopo",
"Loan Originators": "Waanzilishi wa Mikopo",
"Loan Product": "Bidhaa ya Mkopo",
"Loan Products": "Bidhaa za Mkopo",
"Loan Provisioning Criteria": "Vigezo vya Utoaji wa Mkopo",
@ -1444,6 +1445,7 @@
"Calculation": "Hesabu",
"Center Name": "Jina la Kituo",
"Center": "Kituo",
"Channel Type": "Aina ya Kituo",
"Change Repayment Date": "Badilisha Tarehe ya Kulipa",
"Changes Affection Date": "Mabadiliko Tarehe ya Mapenzi",
"Charge": "Malipo",
@ -2130,6 +2132,8 @@
"Option": "Chaguo",
"Order": "Agizo",
"Original": "Asili",
"Originator Type": "Aina ya Mwanzilishi",
"Originators": "Waanzilishi",
"Original Loan": "Mkopo Asili",
"Original Schedule": "Ratiba ya Asili",
"Output Type": "Aina ya Pato",