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:
2026-08-02 08:34:03 +05:30
parent 90beea64cb
commit 27cdaf7fc2
5 changed files with 220 additions and 10 deletions
@@ -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 [
{