/** * 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 { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable } from 'rxjs'; export interface AccountListParams { offset?: number; limit?: number; accountNo?: string; clientName?: string; orderBy?: string; sortOrder?: string; status?: string; fromDate?: string; toDate?: string; asOnDate?: string; } @Injectable({ providedIn: 'root' }) export class AccountsService { private http = inject(HttpClient); getSavingsAccounts(params: AccountListParams = {}): Observable { let httpParams = new HttpParams() .set('depositType', '100') .set('offset', (params.offset ?? 0).toString()) .set('limit', (params.limit ?? 20).toString()); if (params.accountNo) httpParams = httpParams.set('accountNo', params.accountNo); if (params.clientName) httpParams = httpParams.set('clientName', params.clientName); if (params.orderBy) httpParams = httpParams.set('orderBy', params.orderBy); if (params.sortOrder) httpParams = httpParams.set('sortOrder', params.sortOrder); if (params.status) httpParams = httpParams.set('status', params.status); if (params.fromDate) httpParams = httpParams.set('fromDate', params.fromDate); if (params.toDate) httpParams = httpParams.set('toDate', params.toDate); if (params.asOnDate) httpParams = httpParams.set('asOnDate', params.asOnDate); return this.http.get('/savingsaccounts', { params: httpParams }); } getCurrentAccounts(params: AccountListParams = {}): Observable { let httpParams = new HttpParams() .set('offset', (params.offset ?? 0).toString()) .set('limit', (params.limit ?? 20).toString()); if (params.accountNo) httpParams = httpParams.set('accountNo', params.accountNo); if (params.clientName) httpParams = httpParams.set('clientName', params.clientName); if (params.orderBy) httpParams = httpParams.set('orderBy', params.orderBy); if (params.sortOrder) httpParams = httpParams.set('sortOrder', params.sortOrder); if (params.status) httpParams = httpParams.set('status', params.status); if (params.fromDate) httpParams = httpParams.set('fromDate', params.fromDate); if (params.toDate) httpParams = httpParams.set('toDate', params.toDate); if (params.asOnDate) httpParams = httpParams.set('asOnDate', params.asOnDate); return this.http.get('/currentaccounts', { params: httpParams }); } getFixedDepositAccounts(params: AccountListParams = {}): Observable { let httpParams = new HttpParams() .set('paged', 'true') .set('offset', (params.offset ?? 0).toString()) .set('limit', (params.limit ?? 20).toString()); if (params.accountNo) httpParams = httpParams.set('accountNo', params.accountNo); if (params.clientName) httpParams = httpParams.set('clientName', params.clientName); if (params.orderBy) httpParams = httpParams.set('orderBy', params.orderBy); if (params.sortOrder) httpParams = httpParams.set('sortOrder', params.sortOrder); if (params.status) httpParams = httpParams.set('status', params.status); if (params.fromDate) httpParams = httpParams.set('fromDate', params.fromDate); if (params.toDate) httpParams = httpParams.set('toDate', params.toDate); if (params.asOnDate) httpParams = httpParams.set('asOnDate', params.asOnDate); return this.http.get('/fixeddepositaccounts', { params: httpParams }); } /** * FD Dashboard's data source: every ACTIVE FD, id/account/client/product identity, maturity date * and deposit/maturity amounts only. Deliberately a separate, narrow endpoint rather than * getFixedDepositAccounts() above -- that one's backend query joins in six more tables (audit * who-did-what-when, currency, tax group) an unbounded dashboard fetch does not need, over columns * that had no index until this feature added one (see backend migration 0571). */ getFixedDepositMaturityDashboard(): Observable { return this.http.get('/fixeddepositaccounts/maturity-dashboard'); } /** RD Dashboard: running RDs with their installment position, closures and penalty income for the month. */ getRecurringDepositDashboard(): Observable { return this.http.get('/recurringdepositaccounts/dashboard'); } getRecurringDepositAccounts(params: AccountListParams = {}): Observable { let httpParams = new HttpParams() .set('paged', 'true') .set('offset', (params.offset ?? 0).toString()) .set('limit', (params.limit ?? 20).toString()); if (params.accountNo) httpParams = httpParams.set('accountNo', params.accountNo); if (params.clientName) httpParams = httpParams.set('clientName', params.clientName); if (params.orderBy) httpParams = httpParams.set('orderBy', params.orderBy); if (params.sortOrder) httpParams = httpParams.set('sortOrder', params.sortOrder); if (params.status) httpParams = httpParams.set('status', params.status); if (params.fromDate) httpParams = httpParams.set('fromDate', params.fromDate); if (params.toDate) httpParams = httpParams.set('toDate', params.toDate); if (params.asOnDate) httpParams = httpParams.set('asOnDate', params.asOnDate); return this.http.get('/recurringdepositaccounts', { params: httpParams }); } terminateAccount(accountId: string, data: any): Observable { return this.http.post(`/v1/accounts/${accountId}/terminate`, data); } }