feat(npa): add Undebited Interest Recovery Report, fix note text width
Adds a 10th NPA report tracking memorandum "undebited interest" per IRAC norms (accrued vs cash-recovered vs balance), wired into Export to Excel and the NPA mega-menu. Also fixes a narrow-width text wrap on the report's description note (new .npa-report-note class overriding pg-sub's 560px cap).
This commit is contained in:
@@ -36,6 +36,9 @@ import {
|
||||
movementLabel,
|
||||
stageBadgeClass,
|
||||
npaSinceDate,
|
||||
daysSinceNpa,
|
||||
interestRecoveredCash,
|
||||
undebitedInterestBalance,
|
||||
todayDDMMYYYY,
|
||||
LegalActionStatus,
|
||||
LEGAL_ACTION_LABELS
|
||||
@@ -268,6 +271,18 @@ export class NpaReportsComponent implements OnInit, OnDestroy {
|
||||
return npaSinceDate(a);
|
||||
}
|
||||
|
||||
daysSinceNpaOf(a: LoanAccount): number {
|
||||
return daysSinceNpa(a);
|
||||
}
|
||||
|
||||
interestRecoveredCashOf(a: LoanAccount): number {
|
||||
return interestRecoveredCash(a);
|
||||
}
|
||||
|
||||
undebitedInterestBalanceOf(a: LoanAccount): number {
|
||||
return undebitedInterestBalance(a);
|
||||
}
|
||||
|
||||
legalActionLabel(status: LegalActionStatus): string {
|
||||
return LEGAL_ACTION_LABELS[status];
|
||||
}
|
||||
@@ -359,6 +374,19 @@ export class NpaReportsComponent implements OnInit, OnDestroy {
|
||||
return this.npaAccounts.reduce((s, a) => s + this.recovered(a), 0);
|
||||
}
|
||||
|
||||
// -------------------- Undebited Interest Recovery Report --------------------
|
||||
get undebitedInterestAccruedTotal(): number {
|
||||
return this.npaAccounts.reduce((s, a) => s + this.interestRev(a), 0);
|
||||
}
|
||||
|
||||
get interestRecoveredCashTotal(): number {
|
||||
return this.npaAccounts.reduce((s, a) => s + this.interestRecoveredCashOf(a), 0);
|
||||
}
|
||||
|
||||
get undebitedInterestBalanceTotal(): number {
|
||||
return this.npaAccounts.reduce((s, a) => s + this.undebitedInterestBalanceOf(a), 0);
|
||||
}
|
||||
|
||||
get restructuredAccounts(): LoanAccount[] {
|
||||
return this.allAccounts.filter((a) => a.isRestructured);
|
||||
}
|
||||
@@ -964,6 +992,65 @@ export class NpaReportsComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
];
|
||||
|
||||
case 'undebited-interest':
|
||||
return [
|
||||
{
|
||||
sheetName: 'Undebited Interest',
|
||||
title: 'Undebited Interest Recovery Report — Memorandum Interest (IRAC Norms)',
|
||||
subtitle,
|
||||
headers: [
|
||||
'Account No',
|
||||
'Customer',
|
||||
'Branch',
|
||||
'Stage',
|
||||
'NPA Since',
|
||||
'Days NPA',
|
||||
'Rate %',
|
||||
'Undebited Interest Accrued',
|
||||
'Interest Recovered (Cash)',
|
||||
'Undebited Interest Balance'
|
||||
],
|
||||
widths: [
|
||||
16,
|
||||
22,
|
||||
16,
|
||||
14,
|
||||
12,
|
||||
10,
|
||||
10,
|
||||
22,
|
||||
20,
|
||||
22
|
||||
],
|
||||
rows: [
|
||||
...this.npaAccounts.map((a) => [
|
||||
a.accountNo,
|
||||
a.customerName,
|
||||
a.branchName,
|
||||
this.stageLabel(this.stage(a)),
|
||||
this.npaSince(a),
|
||||
this.daysSinceNpaOf(a),
|
||||
a.interestRate,
|
||||
this.interestRev(a),
|
||||
this.interestRecoveredCashOf(a),
|
||||
this.undebitedInterestBalanceOf(a)
|
||||
]),
|
||||
[
|
||||
`Total (${this.npaAccounts.length} accounts)`,
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
'',
|
||||
this.undebitedInterestAccruedTotal,
|
||||
this.interestRecoveredCashTotal,
|
||||
this.undebitedInterestBalanceTotal
|
||||
]
|
||||
]
|
||||
}
|
||||
];
|
||||
|
||||
case 'probable':
|
||||
return [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user