Interest Posting Reports

Each branch gets its own report for each savings product, generated automatically at 12:00 PM on the posting date and open to generating or regenerating at any time. The branch approves it, and its approved interest is posted when the branch closes the day — it cannot close until then. The head office closes last.
@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 (showPreview) {

Interest preview — earned up to {{ previewAsOf }}

What each account 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 }} account(s)
@if (previewLoading) {
Calculating interest up to today…
} @else { @for (g of previewGroups; track g.officeName + g.productName) { } @empty { }
Branch Product Posting date Accounts Interest so far
{{ g.officeName }} {{ g.productName }} {{ g.postingDate }} {{ g.accounts }} ₹{{ g.interest | number: '1.2-2' }}
No savings account has interest accrued in its current cycle.
@if (previewRows.length > 0) { @for (r of previewRows; track r.savingsAccountId) { }
Branch Product Account no Account holder Balance Rate % Cycle Interest so far
{{ r.officeName }} {{ r.productName }} {{ r.accountNo }} {{ r.clientName }} ₹{{ r.balance | number: '1.2-2' }} {{ r.rate | number: '1.2-2' }} {{ r.cycleStart }} → {{ r.postingDate }} ₹{{ r.interest | number: '1.2-2' }}
Total ₹{{ previewTotal | number: '1.2-2' }}
} }
} @if (errorMessage) {
{{ errorMessage }}
} @if (notice) {
{{ notice }}
} @if (pendingCount > 0) {
{{ pendingCount }} report(s) waiting for approval. The day cannot be closed until they are approved.
} @if (due.length > 0) {
Interest is due but no report has been generated yet for:
@for (d of due; track d.productId + '-' + d.officeId) {
{{ d.productName }} · {{ d.officeName }} · {{ d.postingDate }} @if (d.canAct) { } @else if (d.blockedReason) { {{ d.blockedReason }} }
}
}
@for (r of reports; track r.id) { } @empty { }
Branch Product Posting date Accounts Total interest Status Generated Approved
{{ r.officeName }} {{ r.productName }} {{ 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)) { } @if (!r.canAct && r.blockedReason && (r.status === 'GENERATED' || r.status === 'APPROVED')) { {{ r.blockedReason }} }
@if (loading) { Loading… } @else { No interest posting report for {{ postingDate || 'this date' }}. Reports are generated at 12:00 PM on a product's posting date. }
@if (selected) {

{{ selected.officeName }} · {{ selected.productName }} — {{ selected.postingDate }}

Dr {{ selected.expenseGlCode }} {{ selected.expenseGlName }} → Cr {{ selected.payableGlCode }} {{ selected.payableGlName }}; Dr {{ selected.payableGlCode }} → Cr {{ selected.paidGlCode }} {{ selected.paidGlName }}; then Dr {{ selected.paidGlCode }} → Cr each account below
Total interest ₹{{ selected.totalInterest | number: '1.2-2' }} {{ selected.accountCount }} account(s)
@for (l of selected.lines; track l.savingsAccountId) { }
Account no Account holder Interest Balance before posting Balance after posting Posted txn
{{ l.accountNo }} {{ l.clientName }} ₹{{ l.interestAmount | number: '1.2-2' }} ₹{{ l.balanceBefore | number: '1.2-2' }} ₹{{ l.balanceAfter | number: '1.2-2' }} {{ l.savingsTransactionId ? '#' + l.savingsTransactionId : '—' }}
Total ₹{{ selected.totalInterest | number: '1.2-2' }}
}