+
+
+
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') {
+
+
Record a Recovery Against an NPA Account
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 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) {
+
+ }
+
+ }
+
+
+