/** * Copyright since 2025 Mifos Initiative * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ import { Component, OnInit, Input, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { Router } from '@angular/router'; import { ClerkUiStateService } from '../../cashier/clerk-ui-state.service'; import { ChequeBookService } from '../../chequebook/chequebook.service'; /** Read-only cheque-book view for the account currently loaded on the Clerk Dashboard — * reached via the "Cheque Book" entry in the Account Facilities dropdown. */ @Component({ selector: 'mifosx-clerk-cheque-book', standalone: true, imports: [CommonModule], styleUrl: './cheque-book.component.scss', template: `
Cheque Book
@if (accountLoaded) {
{{ accountNo }} @if (clientName) {  · {{ clientName }} } @if (books.length > 0) {  · {{ books.length }} book{{ books.length === 1 ? '' : 's' }} }
} @else {
View cheque books issued for the loaded account.
}
@if (!embedded) { }
@if (!accountLoaded) {

No Account Loaded

Search an account on the Clerk Dashboard first.

@if (!embedded) { }
} @else { @if (!facilityActive) {
Cheque Book facility is not active for this account.
} @if (loading) {
Loading cheque books…
} @else if (error) {
{{ error }}
} @else if (books.length === 0) {
No cheque book issued for this account
} @else {
@for (b of books; track b.id) { }
Series Books Leaves Status Requested
{{ b.seriesCode }} {{ b.noOfBooks }} {{ b.totalLeaves ?? '—' }} {{ b.status }} {{ b.requestedDate ?? '—' }} View ›
} }
` }) export class ClerkChequeBookComponent implements OnInit { private clerkUiState = inject(ClerkUiStateService); private chequeBookService = inject(ChequeBookService); private router = inject(Router); @Input() embedded = false; accountLoaded = false; accountNo = ''; clientName = ''; facilityActive = true; books: any[] = []; loading = false; error = ''; ngOnInit(): void { const s = this.clerkUiState.snapshot; this.accountLoaded = s.accountLoaded; if (!this.accountLoaded) { return; } this.accountNo = s.savedAccount?.accountDetails?.accountNo ?? s.savedRow?.acNo ?? ''; const clientDetails = s.savedAccount?.clientDetails; this.clientName = clientDetails ? `${clientDetails.firstname ?? ''} ${clientDetails.lastname ?? ''}`.trim() : ''; const facility = s.facilities.find((f) => f.label === 'Cheque Book'); this.facilityActive = facility ? facility.active : true; const accountType = this.toChequeAccountType(s.savedRow?.acTyp); const accountId = s.savedAccount?.accountDetails?.id; if (accountId) { this.loadBooks(accountType, accountId); } else if (this.accountNo) { this.resolveAccountId(accountType, this.accountNo); } } /** Cheque-book series/books are only ever SAVINGS or CURRENT — CA/CB is the clerk's UI code for current accounts. */ private toChequeAccountType(acTyp?: string): string { const t = (acTyp || '').toUpperCase(); return t === 'CA' || t === 'CB' ? 'CURRENT' : 'SAVINGS'; } private resolveAccountId(accountType: string, accountNo: string): void { this.loading = true; this.chequeBookService.searchAccountByNo(accountType, accountNo).subscribe({ next: (res: any) => { const items = res?.pageItems ?? (Array.isArray(res) ? res : []); const match = items.find((i: any) => i.accountNo === accountNo) ?? (items.length === 1 ? items[0] : null); if (match) { this.loadBooks(accountType, match.id); } else { this.loading = false; this.error = 'Could not resolve this account for cheque book lookup'; } }, error: () => { this.loading = false; this.error = 'Could not resolve this account for cheque book lookup'; } }); } private loadBooks(accountType: string, accountId: string | number): void { this.loading = true; this.chequeBookService.getBooks(accountType, accountId, undefined, undefined, 0, 50).subscribe({ next: (res: any) => { this.books = res?.pageItems ?? (Array.isArray(res) ? res : []); this.loading = false; }, error: () => { this.loading = false; this.error = 'Failed to load cheque book details'; } }); } viewBook(book: any): void { this.router.navigate([ '/clerk/account-facilities/cheque-book', book.id ]); } goBack(): void { this.router.navigate(['/clerk/dashboard']); } }