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) { } @else { }
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) { }
@for (m of groupOf(activeGroup); track m.id) { }
@if (activeReport === 'interest') {
@for (a of paged(npaAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Stage Outstanding Rate Overdue Days Interest Reversed
{{ 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' }}
No NPA accounts in this branch.
Total Interest Reversed ({{ npaAccounts.length }} accounts) ₹{{ sumInterest(npaAccounts) | number: '1.0-0' }}
@if (npaAccounts.length > pageSize) {
Showing {{ rangeStart(npaAccounts) }}–{{ rangeEnd(npaAccounts) }} of {{ npaAccounts.length }}
Page {{ currentPage }} of {{ pageCount(npaAccounts) }}
}
} @if (activeReport === 'status') {
@for (a of paged(npaAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Secured Outstanding Overdue Amount Overdue Days NPA Since Stage Restructured Legal Action Provision Required
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ a.productName }} {{ a.secured ? 'Yes' : 'No' }} ₹{{ a.outstandingBalance | number: '1.0-0' }} ₹{{ a.overdueAmount | number: '1.0-0' }} {{ a.overdueDays }} {{ npaSince(a) }} {{ stageLabel(stage(a)) }} {{ a.isRestructured ? 'Yes' : 'No' }} {{ legalActionLabel(a.legalActionStatus) }} ₹{{ provisionReq(a) | number: '1.0-0' }}
No NPA accounts in this branch.
@if (npaAccounts.length > pageSize) {
Showing {{ rangeStart(npaAccounts) }}–{{ rangeEnd(npaAccounts) }} of {{ npaAccounts.length }}
Page {{ currentPage }} of {{ pageCount(npaAccounts) }}
}
} @if (activeReport === 'recovery') {

Target Recovery is the account's contractual due this month (EMI / interest-servicing / bullet amount) — same basis as the Recovery Management Dashboard.

@for (r of paged(recoveryRows); track r.accountNo + r.date + r.amount) { } @empty { }
Date Account Type NPA Category Account No Customer Branch Mode Target Recovery Recovered Amount (Actual)
{{ 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' }}
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) {
Showing {{ rangeStart(recoveryRows) }}–{{ rangeEnd(recoveryRows) }} of {{ recoveryRows.length }}
Page {{ currentPage }} of {{ pageCount(recoveryRows) }}
}
} @if (activeReport === 'summary') {
@for (row of stageSummary; track row.stage) { }
Classification Accounts Outstanding Provision Required
{{ 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) {
@for (row of branchSummary; track row.branchCode) { }
Branch Total Accounts Total Advances NPA Accounts GNPA Outstanding Provision Required GNPA %
{{ 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') {
@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)) {
}
@for (r of a.recoveries; track r.date + r.amount) { } @empty { }
Date Mode Amount
{{ r.date }} {{ r.mode }} ₹{{ r.amount | number: '1.0-0' }}
No recoveries recorded against this account.
} } @if (activeReport === 'movement') {
@for (a of paged(movedAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Previous Stage Current Stage Movement Outstanding
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ stageLabel(prevStage(a)) }} {{ stageLabel(stage(a)) }} {{ movement(a) }} ₹{{ a.outstandingBalance | number: '1.0-0' }}
No classification movement in this branch.
@if (movedAccounts.length > pageSize) {
Showing {{ rangeStart(movedAccounts) }}–{{ rangeEnd(movedAccounts) }} of {{ movedAccounts.length }}
Page {{ currentPage }} of {{ pageCount(movedAccounts) }}
}
} @if (activeReport === 'provision') {
@for (a of paged(provisionRows); track a.accountNo) { }
Account No Customer Branch Stage Outstanding Rate Provision Required Provision Held Shortfall / (Excess)
{{ 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' }} ₹{{ 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) {
Showing {{ rangeStart(provisionRows) }}–{{ rangeEnd(provisionRows) }} of {{ provisionRows.length }}
Page {{ currentPage }} of {{ pageCount(provisionRows) }}
}
} @if (activeReport === 'undebited-interest') {

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.

@for (a of paged(npaAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Stage NPA Since Days NPA Rate Undebited Interest Accrued Interest Recovered (Cash) Undebited Interest Balance
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ stageLabel(stage(a)) }} {{ npaSince(a) }} {{ daysSinceNpaOf(a) }} {{ a.interestRate }}% ₹{{ interestRev(a) | number: '1.0-0' }} ₹{{ interestRecoveredCashOf(a) | number: '1.0-0' }} ₹{{ undebitedInterestBalanceOf(a) | number: '1.0-0' }}
No NPA accounts in this branch.
Total ({{ npaAccounts.length }} accounts) ₹{{ undebitedInterestAccruedTotal | number: '1.0-0' }} ₹{{ interestRecoveredCashTotal | number: '1.0-0' }} ₹{{ undebitedInterestBalanceTotal | number: '1.0-0' }}
@if (npaAccounts.length > pageSize) {
Showing {{ rangeStart(npaAccounts) }}–{{ rangeEnd(npaAccounts) }} of {{ npaAccounts.length }}
Page {{ currentPage }} of {{ pageCount(npaAccounts) }}
}
} @if (activeReport === 'probable') {
@for (a of paged(probableNpaAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Outstanding Overdue Amount Overdue Days Last Payment Follow-up
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ a.productName }} ₹{{ a.outstandingBalance | number: '1.0-0' }} ₹{{ a.overdueAmount | number: '1.0-0' }} {{ a.overdueDays }} {{ a.lastPaymentDate }} {{ a.overdueDays > 75 ? 'Urgent' : 'Monitor' }}
No SMA-2 accounts in this branch.
Total ({{ probableNpaAccounts.length }} accounts) ₹{{ sumOutstanding(probableNpaAccounts) | number: '1.0-0' }}
@if (probableNpaAccounts.length > pageSize) {
Showing {{ rangeStart(probableNpaAccounts) }}–{{ rangeEnd(probableNpaAccounts) }} of {{ probableNpaAccounts.length }}
Page {{ currentPage }} of {{ pageCount(probableNpaAccounts) }}
}
} @if (activeReport === 'sma') {
@for (a of paged(smaAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Stage Outstanding Overdue Amount Overdue Days
{{ 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 }}
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) {
Showing {{ rangeStart(smaAccounts) }}–{{ rangeEnd(smaAccounts) }} of {{ smaAccounts.length }}
Page {{ currentPage }} of {{ pageCount(smaAccounts) }}
}
} @if (activeReport === 'recovery-dashboard') {

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 {{ row.overdueCount }} overdue this cycle
}
@for (row of recoveryTypeSummary; track row.type) { }
Loan Type Accounts Overdue Now Expected Recovery Actual Recovery Variance
{{ 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.

@for (a of paged(loanWiseRecoveryAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Loan Type Expected Actual Variance Status
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ repaymentTypeLabel(a.repaymentType) }} ₹{{ expectedThisMonth(a) | number: '1.0-0' }} ₹{{ actualThisMonth(a) | number: '1.0-0' }} ₹{{ recoveryVariance(a) | number: '1.0-0' }} {{ recoveryVariance(a) >= 0 ? 'Recovered' : 'Shortfall' }}
No accounts in this branch.
@if (loanWiseRecoveryAccounts.length > pageSize) {
Showing {{ rangeStart(loanWiseRecoveryAccounts) }}–{{ rangeEnd(loanWiseRecoveryAccounts) }} of {{ loanWiseRecoveryAccounts.length }}
Page {{ currentPage }} of {{ pageCount(loanWiseRecoveryAccounts) }}
}
} @if (activeReport === 'daywise-overdue') {
@for (b of overdueAgeingBuckets; track b.label) { }
Overdue Bucket Accounts Outstanding Overdue Amount
{{ b.label }} {{ b.count }} ₹{{ b.outstanding | number: '1.0-0' }} ₹{{ b.overdueAmt | number: '1.0-0' }}
@for (a of paged(overdueDaysAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Stage Overdue Days Outstanding Overdue Amount
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ a.productName }} {{ stageLabel(stage(a)) }} {{ a.overdueDays }} ₹{{ a.outstandingBalance | number: '1.0-0' }} ₹{{ a.overdueAmount | number: '1.0-0' }}
No overdue accounts in this branch.
@if (overdueDaysAccounts.length > pageSize) {
Showing {{ rangeStart(overdueDaysAccounts) }}–{{ rangeEnd(overdueDaysAccounts) }} of {{ overdueDaysAccounts.length }}
Page {{ currentPage }} of {{ pageCount(overdueDaysAccounts) }}
}
} @if (activeReport === 'daywise-overdrawn') {
@for (a of paged(overdrawnAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Drawing Power Outstanding Excess Over DP Days Overdrawn Status
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ a.productName }} ₹{{ a.drawingPower | number: '1.0-0' }} ₹{{ a.outstandingBalance | number: '1.0-0' }} ₹{{ excessOverDp(a) | number: '1.0-0' }} {{ overdrawnBreachOf(a) ? a.overdueDays : 0 }} {{ overdrawnBreachOf(a) ? 'DP Breached' : 'Within Limit' }}
No Overdrawn accounts in this branch.
@if (overdrawnAccounts.length > pageSize) {
Showing {{ rangeStart(overdrawnAccounts) }}–{{ rangeEnd(overdrawnAccounts) }} of {{ overdrawnAccounts.length }}
Page {{ currentPage }} of {{ pageCount(overdrawnAccounts) }}
}
} @if (activeReport === 'agri-gold-value') {
@for (a of paged(agriGoldAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Outstanding Collateral Value (At Sanction) Market Value (Now) Coverage % Status
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ a.productName }} ₹{{ a.outstandingBalance | number: '1.0-0' }} ₹{{ a.collateralValue | number: '1.0-0' }} ₹{{ a.collateralMarketValue | number: '1.0-0' }} {{ coverageRatio(a) | number: '1.0-0' }}% {{ undersecuredOf(a) ? 'Undersecured' : 'Adequate' }}
No Agriculture / Gold accounts in this branch.
@if (agriGoldAccounts.length > pageSize) {
Showing {{ rangeStart(agriGoldAccounts) }}–{{ rangeEnd(agriGoldAccounts) }} of {{ agriGoldAccounts.length }}
Page {{ currentPage }} of {{ pageCount(agriGoldAccounts) }}
}
} @if (activeReport === 'exception-check') {

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.

@for (a of paged(exceptionAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Product Stage Outstanding Market Value Shortfall Coverage %
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} {{ a.productName }} {{ stageLabel(stage(a)) }} ₹{{ a.outstandingBalance | number: '1.0-0' }} ₹{{ a.collateralMarketValue | number: '1.0-0' }} ₹{{ securityShortfall(a) | number: '1.0-0' }} {{ coverageRatio(a) | number: '1.0-0' }}%
No undersecured accounts in this branch.
@if (exceptionAccounts.length > pageSize) {
Showing {{ rangeStart(exceptionAccounts) }}–{{ rangeEnd(exceptionAccounts) }} of {{ exceptionAccounts.length }}
Page {{ currentPage }} of {{ pageCount(exceptionAccounts) }}
}
}
@if (showTimelineModal && selectedAccount; as a) {
Recovery / Collection Journey

{{ a.accountNo }} — {{ a.customerName }}

{{ stageLabel(stage(a)) }} {{ a.branchName }} {{ a.collectionTimeline.length }} touchpoints
@if (a.collectionTimeline.length) {
    @for (e of a.collectionTimeline; track e.date + e.type) {
  1. {{ e.type }} {{ e.date }}

    {{ e.remarks }}

    {{ e.channel }}
  2. }
} @else {

No collection activity — this account has never gone overdue.

}
}
{{ toastMsg }}