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']; track g) {
}
@for (m of groupOf(activeGroup); track m.id) {
}
@if (activeReport === 'interest') {
NPA Interest — 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
| Date |
Account No |
Customer |
Branch |
Mode |
Recovered Amount |
@for (r of paged(recoveryRows); track r.accountNo + r.date + r.amount) {
| {{ r.date }} |
{{ r.accountNo }}
|
{{ r.customerName }} |
{{ r.branchName }} |
{{ r.mode }} |
₹{{ r.amount | number: '1.0-0' }} |
} @empty {
| No recoveries recorded yet. |
}
| Total Recovered |
₹{{ totalRecoveredAmount | 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
@if (selectedAccount; as a) {
{{ a.accountNo }} — {{ a.customerName }}
{{ stageLabel(stage(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
}
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 === '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) {
}
}