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 === 'cc-recovery') {

Cash Credit is a revolving working-capital facility secured against stock / receivables. Unlike a Term Loan, it isn't checked against a fixed instalment — it is checked against its Drawing Power (DP), and tracked by how many continuous Days Overdrawn ("Out of Order") it has run — crossing 90 days turns it NPA.

Drawing Power (DP)

The maximum amount the borrower may actually draw against the sanctioned CC limit — fixed from the value of stock / book-debts declared in the latest stock statement. Can be lower than the sanctioned limit.

Out of Order

A CC account turns "Out of Order" once its outstanding continuously stays above the limit/DP, or adequate credits stop coming in, for 90 days — the CC-specific overdue trigger, in place of a missed EMI.

Days Overdrawn

The running count of continuous days an account has stayed Out of Order — the number a recovery desk actually watches day to day, instead of a classification label. A rising count is the early-warning sign.

NPA (Non-Performing Asset)

Once Out of Order crosses 90 days, the CC account slips to NPA — Sub-Standard, then Doubtful-1/2/3, then Loss Asset as it ages further.

Total CC Accounts {{ ccAccounts.length }} ₹{{ ccTotalSanctioned | number: '1.0-0' }} sanctioned
Overdrawn (1–90 Days) {{ ccOverdrawnCount }} Out of Order, not yet NPA
NPA (90+ Days Overdrawn) {{ ccNpaCount }} ₹{{ ccTotalOutstanding | number: '1.0-0' }} total outstanding
Interest Paid (This Cycle) ₹{{ ccInterestPaidThisCycle | number: '1.0-0' }} of ₹{{ ccInterestDueThisCycle | number: '1.0-0' }} due
Total Recovered ₹{{ ccTotalRecovered | number: '1.0-0' }} {{ ccRecoveryPct | number: '1.1-1' }}% of ₹{{ ccTotalSanctioned | number: '1.0-0' }} sanctioned
@for (a of paged(ccAccounts); track a.accountNo) { } @empty { }
Account No Customer Branch Sanctioned Limit Drawing Power (DP) Outstanding Pending to Recover Excess Over DP Interest Due (This Cycle) Interest Paid (This Cycle) Total Recovered Days Overdrawn Status Recovery Officer
{{ a.accountNo }} {{ a.customerName }} {{ a.branchName }} ₹{{ a.sanctionedAmount | number: '1.0-0' }} ₹{{ a.drawingPower | number: '1.0-0' }} ₹{{ a.outstandingBalance | number: '1.0-0' }} ₹{{ a.overdueAmount | number: '1.0-0' }} ₹{{ excessOverDp(a) | number: '1.0-0' }} ₹{{ expectedThisMonth(a) | number: '1.0-0' }} ₹{{ actualThisMonth(a) | number: '1.0-0' }} ₹{{ recovered(a) | number: '1.0-0' }} {{ isNpaStageOf(a) || overdrawnBreachOf(a) ? a.overdueDays : 0 }} {{ isNpaStageOf(a) ? 'NPA' : overdrawnBreachOf(a) ? 'Overdrawn' : 'Regular' }} {{ a.recoveryOfficer }}
No Cash Credit accounts in this branch.
@if (ccAccounts.length > pageSize) {
Showing {{ rangeStart(ccAccounts) }}–{{ rangeEnd(ccAccounts) }} of {{ ccAccounts.length }}
Page {{ currentPage }} of {{ pageCount(ccAccounts) }}
}
} @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 }}