FD Interest Posting Reports

Each branch gets its own report for each fixed deposit scheme, generated automatically at 12:00 noon on the posting date. One user puts the figures up and a second approves them — whoever generated a report cannot approve it. Approved interest posts when the branch closes its day, and it cannot close until then.
@if (isHeadOffice) { }
@if (!approvalEnabled) {
Fixed deposit interest is currently posted directly by the nightly job, so there is nothing to approve here. Turn on fd-interest-posting-approval under System → Configurations to put deposits behind this report.
} @if (isHeadOffice) {
@if (tab === 'others') {
Each branch generates and approves its own reports. The head office can act here only for a branch that has not opened the day, and only once every other open branch has closed. Anything it approves is marked (HO).
} } @if (errorMessage) {
{{ errorMessage }}
} @if (notice) {
{{ notice }}
} @if (pendingCount > 0) {
{{ pendingCount }} report(s) waiting for approval. The day cannot be closed until they are approved, and the user who generated a report cannot be the one to approve it.
} @if (due.length > 0) {
Fixed deposit interest is due but no report has been generated yet for:
@for (d of due; track d.productId + '-' + d.officeId) {
{{ d.productName }} {{ fdTypeShort(d.fdType) }} · {{ d.officeName }} · {{ d.postingDate }} · {{ d.accountCount }} deposit(s) · ₹{{ d.totalInterest | number: '1.2-2' }} @if (d.canAct) { } @else if (d.blockedReason) { {{ d.blockedReason }} }
}
}
Interest due, no report
₹{{ dueTotal | number: '1.2-2' }}
{{ dueAccountTotal }} deposit(s) · {{ due.length }} product(s)
Awaiting approval
₹{{ awaitingTotal | number: '1.2-2' }}
{{ awaitingReports.length }} report(s) · blocking day close
Approved — posts at close
₹{{ approvedTotal | number: '1.2-2' }}
{{ approvedReports.length }} report(s)
Posted today
₹{{ postedTotal | number: '1.2-2' }}
{{ postedReports.length }} report(s)
@if (showPreview) {

FD interest preview — earned up to {{ previewAsOf }}

What each deposit would be paid if interest were posted today. View only — nothing is saved, approved or posted.
Total so far ₹{{ previewTotal | number: '1.2-2' }} {{ previewRows.length }} deposit(s)
@if (previewLoading) {
Working out what each deposit has earned up to today…
} @else {
@for (g of previewGroups; track g.officeName + g.productName) { } @empty { }
Branch Product Scheme Deposits Interest so far
{{ g.officeName }} {{ g.productName }} {{ fdTypeShort(g.fdType) }} {{ g.accounts }} ₹{{ g.interest | number: '1.2-2' }}
No fixed deposit has interest waiting to be posted.
@for (r of previewRows; track r.fdAccountId + '-' + r.interestPostingDate) { }
Account no Customer Scheme Interest for Deposit Rate % Maturity Pays into Interest so far
{{ r.accountNo }} {{ r.clientName }} {{ fdTypeShort(r.fdType) }} {{ r.interestPeriodFrom || '—' }} → {{ r.interestPostingDate }} ₹{{ r.depositAmount | number: '1.2-2' }} {{ r.interestRate | number: '1.2-2' }} {{ r.maturityDate || '—' }} {{ r.payoutAccountNo || 'Stays in the deposit' }} ₹{{ r.interest | number: '1.2-2' }}
Total ₹{{ previewTotal | number: '1.2-2' }}
}
} @if (showOutsideApproval) {

Fixed deposit interest posted outside this report

A deposit that matured before its own posting cycle completed has its last period settled directly, the moment it matures — before any report here could be generated or approved for it. Listed here so nothing paid to a customer is invisible, approved or not.
Total ₹{{ outsideApprovalTotal | number: '1.2-2' }} {{ outsideApprovalRows.length }} posting(s)
@if (outsideApprovalLoading) {
Looking for deposit interest posted outside this report…
} @else {
@for (g of outsideApprovalGroups; track g.productName) { } @empty { }
Product Scheme Deposits Interest
{{ g.productName }} {{ fdTypeShort(g.fdType) }} {{ g.accounts }} ₹{{ g.interest | number: '1.2-2' }}
No fixed deposit interest was posted outside this report in this period.
@if (outsideApprovalRows.length > 0) {
@for (r of outsideApprovalRows; track r.transactionId) { }
Account no Customer Product Scheme Interest for Interest Posted at
{{ r.accountNo }} {{ r.clientName }} {{ r.productName }} {{ fdTypeShort(r.fdType) }} {{ r.interestFor }} ₹{{ r.interestAmount | number: '1.2-2' }} {{ r.postedAt | date: 'dd MMM yyyy, HH:mm' }}
Total ₹{{ outsideApprovalTotal | number: '1.2-2' }}
} }
} @if (showProductSummary) {

Interest by product

Posted through this report, still awaiting approval or posting, and posted directly at maturity instead — added up to what the product has paid out in total over the period.
Total, all products ₹{{ productSummaryGrandTotal.total | number: '1.2-2' }}
@if (productSummaryLoading) {
Adding up interest by product…
} @else {
@for (row of productSummaryRows; track row.productId) { } @empty { }
Product Scheme Posting period Posted (report) Pending approval Posted at maturity Total
{{ row.productName }} {{ fdTypeShort(row.fdType) }} {{ row.postingPeriodLabel || '—' }} ₹{{ row.posted | number: '1.2-2' }} ₹{{ row.pending | number: '1.2-2' }} ₹{{ row.maturityPosted | number: '1.2-2' }} ₹{{ row.total | number: '1.2-2' }}
No fixed deposit interest in this period.
Total ₹{{ productSummaryGrandTotal.posted | number: '1.2-2' }} ₹{{ productSummaryGrandTotal.pending | number: '1.2-2' }} ₹{{ productSummaryGrandTotal.maturityPosted | number: '1.2-2' }} ₹{{ productSummaryGrandTotal.total | number: '1.2-2' }}
}
}

Reports{{ postingDate ? ' for ' + postingDate : '' }}

One report per scheme, per branch
@for (r of reports; track r.id) { } @empty { }
Branch Scheme Type Posting date Deposits Total interest Status Maker Checker
{{ r.officeName }} {{ r.productName }} {{ fdTypeShort(r.fdType) }} {{ r.postingDate }} {{ r.accountCount }} ₹{{ r.totalInterest | number: '1.2-2' }} {{ r.status }} @if (r.failureReason) {
Posting failed: {{ r.failureReason }}
}
{{ r.generatedBy || 'System' }} · {{ r.generationMode }}
{{ r.generatedAt | date: 'dd MMM, HH:mm' }}
@if (r.approvedAt) { {{ r.approvedBy }} @if (r.approvedOnBehalf) { (HO) }
{{ r.approvedAt | date: 'dd MMM, HH:mm' }} } @else { — }
@if (canRegenerate(r)) { } @if (canApprove(r)) { } @else if (r.status === 'GENERATED' && r.approveBlockedReason) { {{ r.approveBlockedReason }} }
@if (loading) { Loading… } @else { No fixed deposit interest posting report for {{ postingDate || 'this date' }}. Reports are generated at 12:00 noon on a product's posting date. }
@if (selected) {

{{ selected.officeName }} · {{ selected.productName }} — {{ selected.postingDate }} {{ fdTypeShort(selected.fdType) }} {{ selected.postingPeriodLabel }} {{ selected.status }}

{{ fdTypeLabel(selected.fdType) }}
Dr Interest Expense → Cr {{ selected.payableGlCode }} {{ selected.payableGlName }}; Dr {{ selected.payableGlCode }} → Cr {{ selected.paidGlCode }} {{ selected.paidGlName }}; then Dr {{ selected.paidGlCode }} → Cr each deposit below
Total interest ₹{{ selected.totalInterest | number: '1.2-2' }} {{ selected.accountCount }} deposit(s)
@for (l of selected.lines; track l.fdAccountId + '-' + l.interestPostingDate) { }
Account no Account holder Interest for Deposit Rate % Maturity Interest Balance before Balance after Pays into Posted txn
{{ l.accountNo }} {{ l.clientName }} {{ l.interestPeriodFrom || '—' }} → {{ l.interestPostingDate }} ₹{{ l.depositAmount | number: '1.2-2' }} {{ l.interestRate | number: '1.2-2' }} {{ l.maturityDate || '—' }} ₹{{ l.interestAmount | number: '1.2-2' }} ₹{{ l.balanceBefore | number: '1.2-2' }} ₹{{ l.balanceAfter | number: '1.2-2' }} {{ l.payoutAccountNo || 'Stays in the deposit' }} {{ l.fdTransactionId ? '#' + l.fdTransactionId : '—' }}
Total ₹{{ selected.totalInterest | number: '1.2-2' }}
}