diff --git a/angular.json b/angular.json index 1fe5293cf..341741725 100644 --- a/angular.json +++ b/angular.json @@ -69,8 +69,8 @@ "budgets": [ { "type": "initial", - "maximumWarning": "13mb", - "maximumError": "14mb" + "maximumWarning": "15mb", + "maximumError": "17mb" }, { "type": "anyComponentStyle", diff --git a/src/app/app.module.ts b/src/app/app.module.ts index dfd90efed..d970dca36 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -68,6 +68,7 @@ import { GlReportsModule } from './gl-reports/gl-reports.module'; import { SftModule } from './sft/sft.module'; import { InvestmentModule } from './investment/investment.module'; import { NpaModule } from './npa/npa.module'; +import { ReconciliationModule } from './reconciliation/reconciliation.module'; import { DigitalModule } from './digital/digital.module'; import { LetterMgmtModule } from './letter-mgmt/letter-mgmt.module'; import { AccountsModule } from './accounts/accounts.module'; @@ -178,6 +179,7 @@ export function HttpLoaderFactory(http: HttpClient) { SftModule, InvestmentModule, NpaModule, + ReconciliationModule, DigitalModule, LetterMgmtModule, AccountsModule, diff --git a/src/app/cashier/cash-clearing-transfer-summary/cash-clearing-transfer-summary.component.html b/src/app/cashier/cash-clearing-transfer-summary/cash-clearing-transfer-summary.component.html index b4656e131..f7e1ec982 100644 --- a/src/app/cashier/cash-clearing-transfer-summary/cash-clearing-transfer-summary.component.html +++ b/src/app/cashier/cash-clearing-transfer-summary/cash-clearing-transfer-summary.component.html @@ -31,6 +31,9 @@ + @@ -209,43 +212,61 @@ ? 'Clearing' : 'Digital' }} - — Transaction Details + — Transaction Details (Full Double Entry) @if (glFilter !== null) { · {{ glFilter }} } -
| Date | Voucher / Ref No | -Account No | -Account Name / Reference | -Particulars | +Dr / Cr | +GL / Account | Debit | Credit | +Status | ||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| {{ asOnDate }} | {{ display(t.voucherNo) }} | -{{ display(t.accountNo) }} | -{{ t.accountName }} | -{{ t.particulars }} | -+ | Dr | +@if (t.debit > 0) { - ₹{{ t.debit | number: '1.2-2' }} + {{ t.glCode }} {{ glName(t.glCode) }} — {{ display(t.accountNo) }} ({{ + t.accountName + }}) + } @else { + {{ contraLabel(t) }} } | -+ | ₹{{ legAmount(t) | number: '1.2-2' }} | ++ | + ✓ Balanced + | +||
| + | + | Cr | +@if (t.credit > 0) { - ₹{{ t.credit | number: '1.2-2' }} + {{ t.glCode }} {{ glName(t.glCode) }} — {{ display(t.accountNo) }} ({{ + t.accountName + }}) + } @else { + {{ contraLabel(t) }} } | ++ | ₹{{ legAmount(t) | number: '1.2-2' }} | ||||||||
| Total | -₹{{ txnTotal(filteredTxns, 'debit') | number: '1.2-2' }} | -₹{{ txnTotal(filteredTxns, 'credit') | number: '1.2-2' }} | +Total ({{ filteredTxns.length }} vouchers) | ++ ₹{{ txnTotal(filteredTxns, 'debit') + txnTotal(filteredTxns, 'credit') | number: '1.2-2' }} + | ++ ₹{{ txnTotal(filteredTxns, 'debit') + txnTotal(filteredTxns, 'credit') | number: '1.2-2' }} + | +||||||||
| Instrument Type | +Target % | +Actual % | +Actual Value | +Variance | +Status | +
|---|---|---|---|---|---|
| {{ a.label }} | +{{ a.targetPct }}% | +{{ a.actualPct }}% | +₹{{ a.actualValue | number: '1.2-2' }} | ++ {{ a.variancePct > 0 ? '+' : '' }}{{ a.variancePct }}% + | ++ + {{ a.statusLabel }} + + | +
| Total | +100% | +100% | +₹{{ totalFaceValue | number: '1.2-2' }} | ++ | |
- FD and Govt./Bond interest calculation batch runs, plus the Government Bond Interest, FD Interest and FD - registers. + Interest Receivable, FD and Govt./Bond interest calculation-and-post batch runs, Interest Receive, plus the + Government Bond Interest, FD Interest and FD registers.
+| Cert No | +Script / Party | +Type | +Status | +Interest Posted | +Interest Received | +Receivable Balance | +
|---|---|---|---|---|---|---|
| + {{ h.certNo }} + | +{{ h.scriptName || h.party }} | +{{ instrumentLabel(h.instrumentType) }} | ++ {{ provisionLabel(h) }} + | +₹{{ posted(h) | number: '1.2-2' }} | +₹{{ received(h) | number: '1.2-2' }} | +₹{{ receivableBalance(h) | number: '1.2-2' }} | +
| No outstanding interest receivable. | +||||||
| Total Receivable | +₹{{ totalReceivable | number: '1.2-2' }} | +|||||
+ These holdings are classified Non-Performing (Sub-Standard/Doubtful/Loss). Per RBI income-recognition norms, + interest is not posted as an accrual receivable — it accrues in memo only, and is recognised as income solely + on actual cash receipt via the Interest Receive tab. +
+| Cert No | +Script / Party | +Type | +Status | +Provision Required | +Interest in Suspense | +
|---|---|---|---|---|---|
| + {{ h.certNo }} + | +{{ h.scriptName || h.party }} | +{{ instrumentLabel(h.instrumentType) }} | ++ {{ provisionLabel(h) }} + | +₹{{ provisionRequired(h) | number: '1.2-2' }} | +₹{{ suspense(h) | number: '1.2-2' }} | +
| Total Suspense | +₹{{ totalSuspense | number: '1.2-2' }} | +||||
+ {{ fdCalcExcludedNpi.length }} certificate(s) excluded — classified Non-Performing, interest is not posted on + accrual basis (see Interest Receivable tab for suspense amount). +
+ }+ {{ bondCalcExcludedNpi.length }} holding(s) excluded — classified Non-Performing, interest is not posted on + accrual basis (see Interest Receivable tab for suspense amount). +
+ } +| Cert No | +Script / Party | +Type | +Status | +Outstanding | +Amount to Receive | ++ |
|---|---|---|---|---|---|---|
| + {{ h.certNo }} + | +{{ h.scriptName || h.party }} | +{{ instrumentLabel(h.instrumentType) }} | ++ {{ provisionLabel(h) }} + | +₹{{ outstandingFor(h) | number: '1.2-2' }} | ++ + | +
+ |
+
| No interest outstanding for collection. | +||||||
| Date | +Voucher No | +Cert No | +Particulars | +Amount Received | +
|---|---|---|---|---|
| {{ t.txnDate }} | ++ {{ t.voucherNo }} + | +{{ t.certNo }} | +{{ t.particulars }} | +₹{{ t.amount | number: '1.2-2' }} | +
| No interest received yet. | +||||
| Total Received | +₹{{ receivedLogTotal | number: '1.2-2' }} | +|||
+ 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. +
+| 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' }} | +||||||
+ 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. +
+| 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. +
+| 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' }} + | ++ = 0" + [class.npa-badge--substandard]="recoveryVariance(a) < 0" + > + {{ recoveryVariance(a) >= 0 ? 'Recovered' : 'Shortfall' }} + + | +
| No accounts in this branch. | +|||||||
| Overdue Bucket | +Accounts | +Outstanding | +Overdue Amount | +
|---|---|---|---|
| {{ b.label }} | +{{ b.count }} | +₹{{ b.outstanding | number: '1.0-0' }} | +₹{{ b.overdueAmt | number: '1.0-0' }} | +
| 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. | +|||||||
| 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. | +||||||||
| 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.collateralValue" + [class.col-out]="a.collateralMarketValue < a.collateralValue" + > + ₹{{ a.collateralMarketValue | number: '1.0-0' }} + | +{{ coverageRatio(a) | number: '1.0-0' }}% | ++ + {{ undersecuredOf(a) ? 'Undersecured' : 'Adequate' }} + + | +
| No Agriculture / Gold accounts in this branch. | +||||||||
+ 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. +
+| 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. | +||||||||
{{ e.remarks }}
+ {{ e.channel }} +No collection activity — this account has never gone overdue.
++ {{ meta.sideALabel }} vs {{ meta.sideBLabel }} + @if (meta.extraLabel) { + vs {{ meta.extraLabel }} + } + — as on {{ asOnDate }}. +
++ {{ meta.label }} has no branch-level dimension in real-world banking — it is reconciled centrally by the Head + Office Accounts/Treasury team. Your login ({{ currentOfficeName }}) does not have access to this screen. + Contact Head Office if you need a figure from this reconciliation. +
+| {{ meta.referenceLabel }} | +Description | + @if (meta.scope === 'BRANCH') { +Branch | + } +Date | +{{ meta.sideALabel }} | +{{ meta.sideBLabel }} | + @if (meta.extraLabel) { +{{ meta.extraLabel }} | + } +Difference | +Status | +Remarks / Action | +
|---|---|---|---|---|---|---|---|---|---|
| + {{ item.reference }} + | +{{ item.description }} | + @if (meta.scope === 'BRANCH') { +{{ item.branchName }} | + } +{{ item.date }} | +₹{{ item.sideAAmount | number: '1.0-0' }} | +₹{{ item.sideBAmount | number: '1.0-0' }} | + @if (meta.extraLabel) { +₹{{ item.extraAmount | number: '1.0-0' }} | + } ++ ₹{{ diff(item) | number: '1.0-0' }} + | ++ {{ item.status }} + | +
+ @if (isItemOpen(item)) {
+
+
+
+ } @else if (item.status === 'RESOLVED') {
+ {{ item.remarks }}
+ }
+ |
+
| + No {{ meta.label }} items for this branch. + | +
+ Fill in Prepared / Checked / Approved details if this copy needs them for the record — or leave them blank and + download straight away. +
+