CREDIT · NON-PERFORMING ASSETS · {{ scopeName | uppercase }}
{{ reportLabel(activeReport) }}
RBI IRAC-norm classification (Standard → SMA-0/1/2 → Sub-Standard → Doubtful-1/2/3 → Loss) across
{{ allAccounts.length }} of the bank's {{ bankWideTotalAccounts }} loan accounts, as on {{ asOnDate }}.
@if (isHeadOffice) {
Branch
-- All Branches --
@for (b of branches; track b.code) {
{{ b.name }}
}
} @else {
Branch
{{ scopeName }}
}
As On
Generate
{{ generating ? 'Exporting…' : 'Export to Excel' }}
Total Advances
₹{{ totalAdvances | number: '1.0-0' }}
{{ allAccounts.length }} accounts
Gross NPA (GNPA)
₹{{ gnpaAmount | number: '1.0-0' }}
{{ npaAccounts.length }} accounts · {{ gnpaRatio | number: '1.2-2' }}% of advances
Net NPA (NNPA)
₹{{ netNpaAmount | number: '1.0-0' }}
{{ nnpaRatio | number: '1.2-2' }}% of advances
Provision Held (NPA)
₹{{ totalNpaProvisionHeld | number: '1.0-0' }}
Recovered to date ₹{{ totalRecoveredAmount | number: '1.0-0' }}
Restructured Accounts
{{ restructuredAccounts.length }}
₹{{ restructuredOutstanding | number: '1.0-0' }} outstanding
@for (g of ['reports', 'analysis', 'classification', 'recovery-mgmt']; track g) {
{{ groupLabels[g] }}
}
@for (m of groupOf(activeGroup); track m.id) {
{{ m.label }}
}
@if (activeReport === 'interest') {
NPA Report — Income Reversed on Non-Performing Accounts
Account No
Customer
Branch
Product
Stage
Outstanding
Rate
Overdue Days
Interest Reversed
@for (a of paged(npaAccounts); track a.accountNo) {
{{ a.accountNo }}
{{ a.customerName }}
{{ a.branchName }}
{{ a.productName }}
{{ stageLabel(stage(a)) }}
₹{{ a.outstandingBalance | number: '1.0-0' }}
{{ a.interestRate }}%
{{ a.overdueDays }}
₹{{ interestRev(a) | number: '1.0-0' }}
} @empty {
No NPA accounts in this branch.
}
Total Interest Reversed ({{ npaAccounts.length }} accounts)
₹{{ sumInterest(npaAccounts) | number: '1.0-0' }}
@if (npaAccounts.length > pageSize) {
}
}
@if (activeReport === 'status') {
NPA Status Report — Full Non-Performing Book
@if (npaAccounts.length > pageSize) {
}
}
@if (activeReport === 'recovery') {
NPA Recovery Register — ₹{{ totalRecoveredAmount | number: '1.0-0' }} recovered against ₹{{
gnpaAmount | number: '1.0-0'
}}
GNPA outstanding
@if (recoveryProductFilter) {
Filtered: {{ recoveryProductFilter }}
}
Target Recovery is the account's contractual due this month (EMI / interest-servicing / bullet amount) — same
basis as the Recovery Management Dashboard.
Date
Account Type
NPA Category
Account No
Customer
Branch
Mode
Target Recovery
Recovered Amount (Actual)
@for (r of paged(recoveryRows); track r.accountNo + r.date + r.amount) {
{{ r.date }}
{{ r.productName }}
{{ r.npaCategory }}
{{ r.accountNo }}
{{ r.customerName }}
{{ r.branchName }}
{{ r.mode }}
₹{{ r.targetRecovery | number: '1.0-0' }}
₹{{ r.amount | number: '1.0-0' }}
} @empty {
No recoveries recorded yet.
}
Total (Target once per account · Actual across all entries shown)
₹{{ recoveryTargetTotal | number: '1.0-0' }}
₹{{ recoveryActualTotal | number: '1.0-0' }}
@if (recoveryRows.length > pageSize) {
}
}
@if (activeReport === 'summary') {
Stage-wise Summary — {{ scopeName }}
Classification
Accounts
Outstanding
Provision Required
@for (row of stageSummary; track row.stage) {
{{ row.label }}
{{ row.count }}
₹{{ row.outstanding | number: '1.0-0' }}
₹{{ row.provisionReq | number: '1.0-0' }}
}
Total
{{ grandTotalAccounts }}
₹{{ grandTotalOutstanding | number: '1.0-0' }}
₹{{ grandTotalProvision | number: '1.0-0' }}
@if (isHeadOffice && !branchFilter) {
Branch-wise NPA Summary — All Branches
Branch
Total Accounts
Total Advances
NPA Accounts
GNPA Outstanding
Provision Required
GNPA %
@for (row of branchSummary; track row.branchCode) {
{{ row.branchName }}
{{ row.totalAccounts }}
₹{{ row.totalAdvances | number: '1.0-0' }}
{{ row.npaCount }}
₹{{ row.npaOutstanding | number: '1.0-0' }}
₹{{ row.provisionReq | number: '1.0-0' }}
{{ row.gnpaRatio | number: '1.2-2' }}%
}
}
}
@if (activeReport === 'account-detail') {
Search NPA Account
Account No / Customer
@for (a of npaAccounts; track a.accountNo) {
{{ a.accountNo }} — {{ a.customerName }} ({{ a.branchName }})
}
View Details
@if (selectedAccount; as a) {
Branch
{{ a.branchName }}
Product
{{ a.productName }}
Secured
{{ a.secured ? 'Yes' : 'No' }}
Guarantor
{{ a.guarantorName }}
Sanctioned Amount
₹{{ a.sanctionedAmount | number: '1.0-0' }}
Disbursement Date
{{ a.disbursementDate }}
Interest Rate
{{ a.interestRate }}%
Outstanding Balance
₹{{ a.outstandingBalance | number: '1.0-0' }}
Overdue Amount
₹{{ a.overdueAmount | number: '1.0-0' }}
Overdue Days
{{ a.overdueDays }}
NPA Since
{{ npaSince(a) }}
Restructured
{{ a.isRestructured ? 'Yes' : 'No' }}
Last Payment Date
{{ a.lastPaymentDate }}
Collateral Value
₹{{ a.collateralValue | number: '1.0-0' }}
Provisioning Rate
{{ provisionRate(a) }}%
Provision Required
₹{{ provisionReq(a) | number: '1.0-0' }}
Provision Held
₹{{ provisionHeldAmt(a) | number: '1.0-0' }}
Interest Reversed
₹{{ interestRev(a) | number: '1.0-0' }}
Total Recovered
₹{{ recovered(a) | number: '1.0-0' }}
Movement (vs Last Quarter)
{{ movement(a) }}
NPA Reason
{{ a.npaReason }}
Recovery Officer
{{ a.recoveryOfficer }}
Legal Action Status
{{ legalActionLabel(a.legalActionStatus) }}
@if (isNpaStageOf(a)) {
Recovery Action — Update Legal Action Status
Issue Demand Notice
Initiate SARFAESI Action
File Recovery Suit
Mark OTS Negotiation
Reset to No Action
}
Recovery History
Date
Mode
Amount
@for (r of a.recoveries; track r.date + r.amount) {
{{ r.date }}
{{ r.mode }}
₹{{ r.amount | number: '1.0-0' }}
} @empty {
No recoveries recorded against this account.
}
}
}
@if (activeReport === 'movement') {
Classification Movement — Current Quarter vs Previous Quarter
Account No
Customer
Branch
Previous Stage
Current Stage
Movement
Outstanding
@for (a of paged(movedAccounts); track a.accountNo) {
{{ a.accountNo }}
{{ a.customerName }}
{{ a.branchName }}
{{ stageLabel(prevStage(a)) }}
{{ stageLabel(stage(a)) }}
{{ movement(a) }}
₹{{ a.outstandingBalance | number: '1.0-0' }}
} @empty {
No classification movement in this branch.
}
@if (movedAccounts.length > pageSize) {
}
}
@if (activeReport === 'provision') {
Provision Held vs Required — Full Loan Book
Account No
Customer
Branch
Stage
Outstanding
Rate
Provision Required
Provision Held
Shortfall / (Excess)
@for (a of paged(provisionRows); track a.accountNo) {
{{ a.accountNo }}
{{ a.customerName }}
{{ a.branchName }}
{{ stageLabel(stage(a)) }}
₹{{ a.outstandingBalance | number: '1.0-0' }}
{{ provisionRate(a) }}%
₹{{ provisionReq(a) | number: '1.0-0' }}
₹{{ provisionHeldAmt(a) | number: '1.0-0' }}
0" [class.col-in]="shortfall(a) < 0">
₹{{ shortfall(a) | number: '1.0-0' }}
}
Total ({{ provisionRows.length }} accounts)
₹{{ provisionRequiredTotal | number: '1.0-0' }}
₹{{ provisionHeldTotal | number: '1.0-0' }}
₹{{ provisionShortfallTotal | number: '1.0-0' }}
@if (provisionRows.length > pageSize) {
}
}
@if (activeReport === 'undebited-interest') {
Undebited Interest Recovery Report — Memorandum Interest Held Outside the Loan Account (IRAC Norms)
Once an account turns NPA, interest is no longer debited to the borrower's loan account or recognised as income
— it is tracked here as memorandum "undebited interest" and recognised only when actually recovered in cash.
Cash recovered is appropriated to this bucket first; any balance beyond it reduces principal.
@if (npaAccounts.length > pageSize) {
}
}
@if (activeReport === 'probable') {
Probable NPA — SMA-2 Accounts Likely to Slip Next Quarter (61–90 Days Overdue)
Account No
Customer
Branch
Product
Outstanding
Overdue Amount
Overdue Days
Last Payment
Follow-up
@for (a of paged(probableNpaAccounts); track a.accountNo) {
{{ a.accountNo }}
{{ a.customerName }}
{{ a.branchName }}
{{ a.productName }}
₹{{ a.outstandingBalance | number: '1.0-0' }}
₹{{ a.overdueAmount | number: '1.0-0' }}
{{ a.overdueDays }}
{{ a.lastPaymentDate }}
75"
[class.npa-badge--sma0]="a.overdueDays <= 75"
>
{{ a.overdueDays > 75 ? 'Urgent' : 'Monitor' }}
} @empty {
No SMA-2 accounts in this branch.
}
Total ({{ probableNpaAccounts.length }} accounts)
₹{{ sumOutstanding(probableNpaAccounts) | number: '1.0-0' }}
@if (probableNpaAccounts.length > pageSize) {
}
}
@if (activeReport === 'sma') {
Special Mention Accounts — SMA-0 (1–30d) / SMA-1 (31–60d) / SMA-2 (61–90d)
Account No
Customer
Branch
Product
Stage
Outstanding
Overdue Amount
Overdue Days
@for (a of paged(smaAccounts); track a.accountNo) {
{{ a.accountNo }}
{{ a.customerName }}
{{ a.branchName }}
{{ a.productName }}
{{ stageLabel(stage(a)) }}
₹{{ a.outstandingBalance | number: '1.0-0' }}
₹{{ a.overdueAmount | number: '1.0-0' }}
{{ a.overdueDays }}
} @empty {
No SMA accounts in this branch.
}
Total ({{ smaAccounts.length }} accounts)
₹{{ sumOutstanding(smaAccounts) | number: '1.0-0' }}
₹{{ sumOverdue(smaAccounts) | number: '1.0-0' }}
@if (smaAccounts.length > pageSize) {
}
}
@if (activeReport === 'recovery-dashboard') {
Recovery Management Dashboard — Loan-Type Overdue Check
Every loan is checked for "is this cycle's dues fully recovered" the way it's actually due — a Term Loan (EMI)
is checked against its instalment, an Overdrawn (CC/OD/KCC) account against its drawing power and interest
servicing, and a Bullet loan (Gold) is checked once past maturity.
@for (row of recoveryTypeSummary; track row.type) {
{{ row.label }}
{{ row.accounts }} accounts
0"
>{{ row.overdueCount }} overdue this cycle
}
Expected vs Actual Recovery — This Cycle, by Loan Type
Loan Type
Accounts
Overdue Now
Expected Recovery
Actual Recovery
Variance
@for (row of recoveryTypeSummary; track row.type) {
{{ row.label }}
{{ row.accounts }}
{{ row.overdueCount }}
₹{{ row.expected | number: '1.0-0' }}
₹{{ row.actual | number: '1.0-0' }}
₹{{ row.actual - row.expected | number: '1.0-0' }}
}
Total
{{ allAccounts.length }}
{{
recoveryTypeSummary[0].overdueCount +
recoveryTypeSummary[1].overdueCount +
recoveryTypeSummary[2].overdueCount
}}
₹{{ expectedRecoveryTotal | number: '1.0-0' }}
₹{{ actualRecoveryTotal | number: '1.0-0' }}
₹{{ recoveryVarianceTotal | number: '1.0-0' }}
Overall recovery rate: {{ recoveryPctTotal | number: '1.1-1' }}% of this cycle's expected dues.
Loan-wise Expected vs Actual Recovery
@if (loanWiseRecoveryAccounts.length > pageSize) {
}
}
@if (activeReport === 'daywise-overdue') {
Day-wise Overdue Report — Ageing Buckets
Overdue Bucket
Accounts
Outstanding
Overdue Amount
@for (b of overdueAgeingBuckets; track b.label) {
{{ b.label }}
{{ b.count }}
₹{{ b.outstanding | number: '1.0-0' }}
₹{{ b.overdueAmt | number: '1.0-0' }}
}
Overdue Accounts — Day-wise, Marked by SMA Stage
@if (overdueDaysAccounts.length > pageSize) {
}
}
@if (activeReport === 'daywise-overdrawn') {
Day-wise Overdrawn Report — Cash Credit / Overdraft / KCC Accounts ({{ overdrawnBreachCount }} of
{{ overdrawnAccounts.length }} breaching Drawing Power)
@if (overdrawnAccounts.length > pageSize) {
}
}
@if (activeReport === 'agri-gold-value') {
Agriculture / Gold Market Value Report — Current Security Value vs Loan
@if (agriGoldAccounts.length > pageSize) {
}
}
@if (activeReport === 'exception-check') {
Exception Check — Security Value vs Loan ({{ exceptionAccounts.length }} accounts undersecured)
Every secured loan's current security market value is expected to stay above its outstanding balance. This lists
the exceptions — where it doesn't — so recovery/credit can review before the next classification review.
@if (exceptionAccounts.length > pageSize) {
}
}
@if (showTimelineModal && selectedAccount; as a) {