/** * 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/. */ /** Angular Imports */ import { Injectable, inject } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable, map } from 'rxjs'; /** Custom Helpers */ import { toIsoDate } from '../core/utils/api-date'; /** One share account and the board resolution that authorised it. */ export interface BorRegisterRow { shareAccountId: number; accountNo: string; clientId: number; cifNumber: string; clientName: string; officeId: number | null; officeName: string; productName: string; currencyCode: string; statusEnum: number; approvedShares: number; pendingShares: number; unitPrice: number; shareValue: number; resolutionNumber: string; /** ISO date, or '' where no meeting date was ever recorded against the allotment. */ resolutionDate: string; /** How many purchase tranches make up the holding. */ trancheCount: number; submittedDate: string; approvedDate: string; activatedDate: string; closedDate: string; } /** * The BOR register. * * One call returns every account with its resolution. The share allotment report next door fetches * each account separately and stops at two hundred, which is a limit on a register rather than on a * page of one. */ @Injectable({ providedIn: 'root' }) export class BorReportService { private http = inject(HttpClient); getRegister(status?: number, officeId?: number): Observable { let params = new HttpParams(); if (status != null) { params = params.set('status', String(status)); } if (officeId != null) { params = params.set('officeId', String(officeId)); } return this.http .get('/shareaccounts/bor-register', { params }) .pipe(map((rows) => (rows || []).map((r) => this.toRow(r)))); } /** Dates arrive as [y, M, d] arrays; flattened to ISO so they sort and filter as strings. */ private toRow(r: any): BorRegisterRow { return { shareAccountId: r.shareAccountId, accountNo: r.accountNo || '', clientId: r.clientId, cifNumber: r.cifNumber || '', clientName: r.clientName || '', officeId: r.officeId ?? null, officeName: r.officeName || '', productName: r.productName || '', currencyCode: r.currencyCode || 'INR', statusEnum: Number(r.statusEnum) || 0, approvedShares: Number(r.approvedShares) || 0, pendingShares: Number(r.pendingShares) || 0, unitPrice: Number(r.unitPrice) || 0, shareValue: Number(r.shareValue) || 0, resolutionNumber: (r.resolutionNumber || '').trim(), resolutionDate: toIsoDate(r.resolutionDate), trancheCount: Number(r.trancheCount) || 0, submittedDate: toIsoDate(r.submittedDate), approvedDate: toIsoDate(r.approvedDate), activatedDate: toIsoDate(r.activatedDate), closedDate: toIsoDate(r.closedDate) }; } }