BRANCH OPERATIONS · {{ missedOnly ? 'MISSED CLOSE' : 'DAY REGISTER' }}

{{ missedOnly ? 'Missed Close Register' : 'Day Open / Day Close' }}

@if (missedOnly) { Business days that were opened and never closed. While a day stays open its closing balance never carries forward, a back-dated entry can still be posted into it, and any cash difference on that date goes unnoticed. } @else { The branch's business day, opened each morning and closed each evening. A day left open never carries its closing balance forward, and any cash difference on that date goes unnoticed — so the ones still hanging are listed first. }

@if (canOpenToday && !missedOnly) { }
@if (errorMsg) {
{{ errorMsg }}
} @if (successMsg) {
{{ successMsg }}
} @if (!canOperate && loaded) {
info You can see the register but not open or close a day — a Clerk, Head Cashier or Bank Manager does that, since a cashier works inside the day and cannot declare it closed.
} @if (firstOpenNeedsCashMigration && !missedOnly) {
lock This branch has never opened a business day, and its Cash at Vault GL account has no opening balance yet. Count the vault and open the first business day together from Migrate Cash Denomination — Open Day here is locked until that is done, so today's cash tracking never starts out of step with the ledger.
} @if (missed.length > 0) {
warning {{ missed.length }} business day{{ missed.length === 1 ? '' : 's' }} never closed
@for (m of missed; track m.id) {
{{ m.businessDate }} open {{ m.daysOpen }} day{{ m.daysOpen === 1 ? '' : 's' }} opened {{ timeOnly(m.openedAt) }} by {{ m.openedByName }} · opening ₹{{ m.openingCash | number: '1.2-2' }} @if (canOperate) { }
}
} @if (missedOnly && loaded && missed.length === 0) {
check_circle

No missed closes. Every business day opened for this branch has been closed.

} @if (!missedOnly && openDay) {
DAY OPEN {{ openDay.businessDate }} opened {{ timeOnly(openDay.openedAt) }} by {{ openDay.openedByName }} · opening cash ₹{{ openDay.openingCash | number: '1.2-2' }}
@if (canOperate) { }
@if (interestPending.length > 0) {
warning Savings interest posting report is not approved for {{ interestPending.join(', ') }}. Approve it in Reports → Interest Posting Reports before closing the day.
} } @else if (loaded && canOperate) {
NO DAY OPEN Open the business day before any cash transaction is accepted.
} @if (showOpenForm) {
Open business day

@if (hasAutoFilledOpenCounts) { Auto-filled below from yesterday's own closing count (₹{{ carriedForwardTotal | number: '1.2-2' }}) — correct only the rows where today's physical count differs before opening. } @else { Left blank with no notes/coins counted below, yesterday's closing figure carries forward automatically — which is what keeps the opening balance from drifting. Counting the drawer below is what actually records the note/coin stock the branch can check a vault handout against later. }

@if (hasAutoFilledOpenCounts && openLiveDifference !== null) { @if (openLiveDifference === 0) {
vs. yesterday's close Tallied
} @else {
vs. yesterday's close {{ openLiveDifference > 0 ? 'Excess' : 'Short' }} ₹{{ absValue(openLiveDifference) | number: '1.2-2' }}
} }
@if (notes.length) { } @for (d of notes; track d.id) { } @if (coins.length) { } @for (d of coins; track d.id) { }
Denomination Count Amount
Bank Notes
{{ d.label }}
@if (hasAutoFilledOpenCounts && countFor(openCounts, d) !== autoOpenCountFor(d)) { yesterday closed {{ autoOpenCountFor(d) }} }
₹{{ subtotalFor(openCounts, d) | number: '1.2-2' }}
Coins
{{ d.label }}
@if (hasAutoFilledOpenCounts && countFor(openCounts, d) !== autoOpenCountFor(d)) { yesterday closed {{ autoOpenCountFor(d) }} }
₹{{ subtotalFor(openCounts, d) | number: '1.2-2' }}
@if (openDenomTotal > 0) {

Denomination total: ₹{{ openDenomTotal | number: '1.2-2' }} @if (hasAutoFilledOpenCounts) { }

} @if (openLiveDifference !== null && openLiveDifference !== 0) { }
} @if (closeTarget) {
Close business day — {{ closeTarget.businessDate }}
@if (needsForceReason) {

This day is being closed after its own date. It will be recorded as a force close, with the reason below kept permanently against it.

} @if (previewLoading) {

Working out the day's figure…

} @if (preview) {
Opening cash (carried forward) ₹{{ preview.openingCash | number: '1.2-2' }}
+ Cash deposits taken (approved) ₹{{ preview.deposits | number: '1.2-2' }}
− Cash paid out (approved withdrawals) ₹{{ preview.withdrawals | number: '1.2-2' }}
Cash the branch should be holding ₹{{ preview.expectedCash | number: '1.2-2' }}
@if (preview.vaultIn > 0 || preview.settledOut > 0) {
Vault activity today — moves cash within the branch, not counted in the total above: ₹{{ preview.vaultIn | number: '1.2-2' }} handed to a cashier, ₹{{ preview.settledOut | number: '1.2-2' }} settled back to the vault.
}
} @if (preview?.fdInterestDue?.length) {
savings Fixed deposit interest due today
@for (d of preview.fdInterestDue; track d.productId) {
{{ d.productName }} · {{ d.fdType }} · {{ d.accountCount }} deposit(s) @if (d.reportStatus === 'APPROVED' || d.reportStatus === 'POSTED') { {{ d.reportStatus }} } @else { {{ d.reportStatus === 'NONE' ? 'NO REPORT' : d.reportStatus }} } ₹{{ d.totalInterest | number: '1.2-2' }}
}
} @if (preview?.fdInterestPending?.length) {
warning
The day cannot be closed yet. Fixed deposit interest is not approved for: {{ preview.fdInterestPending.join(', ') }}. Approve it under Reports → FD Interest Posting Reports, then close the day. The user who generated a report cannot approve it.
} @if (preview?.savingsInterestPending?.length) {
warning
The day cannot be closed yet. Savings interest is not approved for: {{ preview.savingsInterestPending.join(', ') }}. Approve it under Reports → Interest Posting Reports, then close the day.
} @if (eodLoading) {

Fetching vault and cashier positions…

} @if (branchTotalSummary; as bt) {
account_balance_wallet Branch Total (Vault + All Cashiers)
Vault ₹{{ bt.vaultTotal | number: '1.2-2' }} + Cashiers ₹{{ bt.cashierTotal | number: '1.2-2' }} = ₹{{ bt.grandTotal | number: '1.2-2' }} vs. book ₹{{ bt.expected | number: '1.2-2' }}
@if (bt.difference === 0) { Branch Tallied } @else { {{ bt.difference > 0 ? 'Excess' : 'Short' }} ₹{{ absValue(bt.difference) | number: '1.2-2' }} }
} @for (t of eodTellers; track t.tellerId) {
account_balance {{ t.tellerName }} vault holds {{ t.vault?.hasBreakdown ? '₹' + (t.vault.totalAmount | number: '1.2-2') : 'no breakdown recorded' }}
@if (t.vault?.hasBreakdown && t.vault.denominations.length > 0) {
@for (d of t.vault.denominations; track d.denominationId) { ₹{{ d.denominationValue }} × {{ d.count }} }
} @if (t.cashiers.length === 0) {

No cashiers allocated under this vault.

} @for (c of t.cashiers; track c.cashierId) {
{{ c.cashierName }} morning ₹{{ c.morningTotal | number: '1.2-2' }} → current ₹{{ c.currentTotal | number: '1.2-2' }} · {{ c.txnCount ?? '—' }} txn{{ c.txnCount === 1 ? '' : 's' }} today
@if (c.reconciled === true) { Reconciled } @else if (c.reconciled === false) { Not Reconciled } @if (c.alreadySettled === true) { Settled to Vault } @else if (c.alreadySettled === false) { Not Settled }
@if (c.denominations.length > 0) {
@for (d of c.denominations; track d.denominationId) { ₹{{ d.denominationValue }}: {{ d.morningCount }} → {{ d.count }} @if (d.delta !== 0) { ({{ d.delta > 0 ? '+' : '' }}{{ d.delta }}) } }
} @else { No balance. }
}
}
@if (preview && liveDifference !== null) { @if (liveDifference === 0) {
Difference Tallied
} @else {
Difference {{ liveDifference > 0 ? 'Excess' : 'Short' }} ₹{{ liveDifference < 0 ? -liveDifference : (liveDifference | number: '1.2-2') }}
} } @if (preview && liveDifference !== 0) { }

@if (hasAutoFilledCounts) { Auto-filled below from the vault and every cashier's position shown above — correct only the rows where the physical count differs, note by note. } @else { Pre-filled with what the books expect — change it only if the drawer counted something different, and that difference is then recorded against the day. Counting the denominations below overrides the typed figure with what was actually counted, note by note. }

@if (notes.length) { } @for (d of notes; track d.id) { } @if (coins.length) { } @for (d of coins; track d.id) { }
Denomination Count Amount
Bank Notes
{{ d.label }}
@if (hasAutoFilledCounts && countFor(closeCounts, d) !== autoCountFor(d)) { system counted {{ autoCountFor(d) }} }
₹{{ subtotalFor(closeCounts, d) | number: '1.2-2' }}
Coins
{{ d.label }}
@if (hasAutoFilledCounts && countFor(closeCounts, d) !== autoCountFor(d)) { system counted {{ autoCountFor(d) }} }
₹{{ subtotalFor(closeCounts, d) | number: '1.2-2' }}
@if (closeDenomTotal > 0) {

Denomination total: ₹{{ closeDenomTotal | number: '1.2-2' }} @if (hasAutoFilledCounts) { }

} @if (isLateClose || hasUnreconciledOrUnsettledCashiers) { }

The figure above is stored against the record, so a difference stays readable later even if a transaction is reversed afterwards.

@if (hasUnreconciledOrUnsettledCashiers) {
{{ blocksSameDayClose ? 'block' : 'warning' }}
@if (blocksSameDayClose) { Cannot close today — cashiers still holding cash have not been reconciled or settled. } @else { This day's cash was never reconciled or settled. }
    @for (detail of unreconciledOrUnsettledCashierDetails; track detail.name) {
  • {{ detail.name }} — @if (detail.notReconciled && detail.notSettled) { Not Reconciled, Not Settled } @else if (detail.notReconciled) { Not Reconciled } @else { Not Settled }
  • }
@if (blocksSameDayClose) { Each cashier must count their drawer, reconcile it, and settle the cash back to the vault. Then this day can be closed. } @else { The cash cannot be counted for a date that has passed. Record why above — their names are kept against the record. }
}
} @if (loading) {
Loading…
} @if (!loading && loaded && days.length === 0 && !missedOnly) {
event_note

No business day has been opened for this branch yet.

} @if (days.length > 0 && !missedOnly) {
@for (d of days; track d.id) { }
Business Date Status Opened By Opening ₹ Closed By Closing ₹ Book ₹ Difference Note
{{ d.businessDate }} @if (d.status === 'OPEN') { OPEN } @else if (d.forceClosed) { FORCE CLOSED } @else { CLOSED } {{ d.openedByName ?? '—' }} · {{ timeOnly(d.openedAt) }} ₹{{ d.openingCash | number: '1.2-2' }} {{ d.closedByName ?? '—' }} @if (d.closedAt) { · {{ timeOnly(d.closedAt) }} } {{ hasValue(d.closingCash) ? '₹' + (d.closingCash | number: '1.2-2') : '—' }} {{ hasValue(d.bookCash) ? '₹' + (d.bookCash | number: '1.2-2') : '—' }} @if (!hasValue(d.cashDifference)) { — } @else if (d.cashDifference === 0) { Tallied } @else { {{ differenceLabel(d.cashDifference) }} } @if (d.forceCloseReason) { Left open: {{ d.forceCloseReason }} } @if (d.remarks) { {{ d.remarks }} }
}