Special Mention Accounts — SMA-0 (1–30d) / SMA-1 (31–60d) / SMA-2 (61–90d)
diff --git a/src/app/npa/npa-reports/npa-reports.component.ts b/src/app/npa/npa-reports/npa-reports.component.ts
index 887737dda..5f0402336 100644
--- a/src/app/npa/npa-reports/npa-reports.component.ts
+++ b/src/app/npa/npa-reports/npa-reports.component.ts
@@ -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 [
{
diff --git a/src/app/npa/npa-shared.scss b/src/app/npa/npa-shared.scss
index 64e3d6cfe..9a911491b 100644
--- a/src/app/npa/npa-shared.scss
+++ b/src/app/npa/npa-shared.scss
@@ -10,6 +10,10 @@
// and ../investment/investment-shared.scss (inv-kpis, inv-form-*, inv-toast — reused as-is since
// they are the same generic "KPI tile / entry form / toast" primitives, not Investment-specific).
+.npa-report-note {
+ max-width: none;
+}
+
.npa-badge {
display: inline-flex;
align-items: center;