/** * 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, inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { catchError } from 'rxjs/operators'; import { of } from 'rxjs'; import { ClerkClosureRequestService } from '../../cashier/clerk-closure-request.service'; /** Clerk Dashboard "My Closure Requests" — lists the Cash account-closure requests this clerk has * submitted (from the account's own Transaction Entry screen) and their approval/disbursement * status. Mirrors MyShareWithdrawalRequestsComponent. There is no "New Closure Request" button * here -- submission happens in-context on the account's own screen, not from this list. */ @Component({ selector: 'mifosx-my-closure-requests', templateUrl: './my-closure-requests.component.html', styleUrls: [ '../../cashier/cashier-shared.scss', '../clerk-shared.scss' ], standalone: true, imports: [ CommonModule, FormsModule, RouterModule ] }) export class MyClosureRequestsComponent implements OnInit { private service = inject(ClerkClosureRequestService); requests: any[] = []; totalRecords = 0; loading = false; loaded = false; filterStatus = ''; get statusOptions(): { value: string; label: string }[] { return [ { value: '', label: 'All' }, { value: 'PENDING', label: 'Pending' }, { value: 'APPROVED', label: 'Approved — awaiting cashier' }, { value: 'REJECTED', label: 'Rejected' }, { value: 'CLOSED', label: 'Closed' } ]; } ngOnInit(): void { this.load(); } load(): void { this.loading = true; this.service .getMyRequests(this.filterStatus || undefined, 0, 50) .pipe(catchError(() => of({ pageItems: [], totalFilteredRecords: 0 }))) .subscribe((res: any) => { this.requests = res?.pageItems ?? []; this.totalRecords = Number(res?.totalFilteredRecords ?? 0); this.loading = false; this.loaded = true; }); } onFilterChange(): void { this.load(); } statusClass(status: string): string { const map: Record = { PENDING: 'inv-badge--active', APPROVED: 'inv-badge--matured', REJECTED: 'inv-badge--written_off', CLOSED: 'inv-badge--matured' }; return `inv-badge ${map[status] ?? ''}`; } statusLabel(status: string): string { const map: Record = { PENDING: 'Pending Approval', APPROVED: 'Awaiting Cashier', REJECTED: 'Rejected', CLOSED: 'Closed' }; return map[status] ?? status; } formatDateTime(val: any): string { if (!val) return '—'; try { const d = new Date(val); return d.toLocaleString('en-IN', { day: '2-digit', month: 'short', year: 'numeric', hour: '2-digit', minute: '2-digit' }); } catch { return String(val); } } }