diff --git a/src/app/core/i18n/i18n.service.ts b/src/app/core/i18n/i18n.service.ts
index 5190a5dd57..27d4d0e062 100644
--- a/src/app/core/i18n/i18n.service.ts
+++ b/src/app/core/i18n/i18n.service.ts
@@ -5,7 +5,7 @@ import { Injectable } from '@angular/core';
import { TranslateService } from '@ngx-translate/core';
import { Observable } from 'rxjs';
-@Injectable()
+@Injectable({ providedIn: 'root' })
export class I18nService {
constructor(private translateService: TranslateService) {}
diff --git a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts
index c1d04dcfb7..90556cb826 100644
--- a/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts
+++ b/src/app/loans/glim-account/create-glim-account/create-glim-account.component.ts
@@ -1,5 +1,28 @@
+interface GLIMClient {
+ id: number;
+ principal: number;
+}
+
+interface GLIMRequestData {
+ charges: Array<{ chargeId: number; amount: number; currency: any }>;
+ clientId: number;
+ totalLoan: number;
+ loanType: string;
+ applicationId: number;
+ amortizationType: number;
+ principal: number;
+ syncDisbursementWithMeeting: boolean;
+ expectedDisbursementDate: string;
+ submittedOnDate: string;
+ dateFormat: string;
+ locale: string;
+ groupId: number;
+ isParentAccount?: boolean;
+ lastApplication?: boolean;
+}
/** Angular Imports */
import { Component, QueryList, ViewChild, ViewChildren } from '@angular/core';
+import { Currency } from 'app/shared/models/general.model';
import { I18nService } from 'app/core/i18n/i18n.service';
import { ActivatedRoute, Router } from '@angular/router';
@@ -177,51 +200,61 @@ export class CreateGlimAccountComponent {
};
}
- setData(client: any, totalLoan: number): any {
+ setData(applicationId: number, client: GLIMClient, totalLoan: number, isFirst: boolean, isLast: boolean): string {
const locale = this.settingsService.language.code;
const dateFormat = this.settingsService.dateFormat;
// const monthDayFormat = 'dd MMMM';
- const data = {
+ const data: GLIMRequestData = {
...this.loansAccount,
charges: this.loansAccount.charges.map((charge: any) => ({
chargeId: charge.id,
- amount: charge.amount
+ amount: charge.amount,
+ currency: charge.currency as Currency
})),
clientId: client.id,
totalLoan: totalLoan,
loanType: 'glim',
+ applicationId: applicationId,
amortizationType: 1,
- isParentAccount: true,
principal: client.principal,
syncDisbursementWithMeeting: false,
expectedDisbursementDate: this.dateUtils.formatDate(this.loansAccount.expectedDisbursementDate, dateFormat),
submittedOnDate: this.dateUtils.formatDate(this.loansAccount.submittedOnDate, dateFormat),
- dateFormat,
- // monthDayFormat,
- locale
+ dateFormat: dateFormat,
+ locale: locale,
+ groupId: this.loansAccountTemplate.group.id
};
- data.groupId = this.loansAccountTemplate.group.id;
-
- delete data.principalAmount;
- // TODO: 2025-03-17: Apparently (?!) unsupported for GLIM
- delete data.allowPartialPeriodInterestCalculation;
- delete data.multiDisburseLoan;
- delete data.isFloatingInterestRate;
-
+ if (isFirst) {
+ data.isParentAccount = true;
+ }
+ if (isLast) {
+ data.lastApplication = true;
+ }
return JSON.stringify(data);
}
/** Request Body Data */
- buildRequestData(): any[] {
+ buildRequestData(): Array<{
+ requestId: string;
+ reference: string | null;
+ method: string;
+ relativeUrl: string;
+ body: string;
+ }> {
const requestData = [];
const memberSelected = this.selectedMembers?.selectedMembers ?? [];
const totalLoan = this.totalLoanAmount();
+ const applicationId = Math.floor(1000000000 + Math.random() * 9000000000);
+
for (let index = 0; index < memberSelected.length; index++) {
+ const isFirst = index === 0;
+ const isLast = index === memberSelected.length - 1;
requestData.push({
requestId: index.toString(),
+ reference: index === 0 ? null : (index - 1).toString(),
method: 'POST',
relativeUrl: 'loans',
- body: this.setData(memberSelected[index], totalLoan)
+ body: this.setData(applicationId, memberSelected[index] as GLIMClient, totalLoan, isFirst, isLast)
});
}
return requestData;
@@ -236,57 +269,10 @@ export class CreateGlimAccountComponent {
return total;
}
- /**
- * Creates a new GLIM account.
- */
- submit() {
- this.selectedMembers = this.loansActiveClientMembers?.selectedClientMembers;
- const memberSelected = this.loansActiveClientMembers?.selectedClientMembers?.selectedMembers ?? [];
- if (!memberSelected.length) return;
- const gsimMemberIds = new Set(this.dataSource.map((m: any) => Number(m.id)));
- for (const member of memberSelected) {
- const memberId = Number(member.id);
- // Validate savings account ownership
- const ownerId = Number(member.linkAccountOwnerId);
- if (member.linkAccountId && member.linkAccountOwnerId && ownerId !== memberId) {
- this.i18nService.translate('errors.linkedSavingsAccountOwnership').subscribe((msg: string) => {
- this.notify({ defaultUserMessage: msg, errors: [] }, { memberId });
- });
- return;
- }
- // Validate GSIM membership
- if (!gsimMemberIds.has(memberId)) {
- this.i18nService.translate('errors.clientNotInGSIM', { id: memberId }).subscribe((msg: string) => {
- this.notify({ defaultUserMessage: msg, errors: [] }, { memberId });
- });
- return;
- }
- }
-
- // Use date format from settingsService for interestChargedFromDate
- const data = this.buildRequestData();
- this.loansService.createGlimAccount(data).subscribe((response: any) => {
- const body = JSON.parse(response[0].body);
- if (body.glimId) {
- this.router.navigate(
- [
- '../',
- body.glimId
- ],
- { relativeTo: this.route }
- );
- } else {
- this.notify(body, { batchSize: data.length });
- }
- });
- }
-
- notify(body: any, context?: { [k: string]: unknown }) {
- const parts: string[] = [String(body?.defaultUserMessage ?? '')];
- if (Array.isArray(body?.errors)) {
- for (const e of body.errors) parts.push(String(e?.developerMessage ?? ''));
- }
- if (context) parts.push(`Context: ${JSON.stringify(context)}`);
- console.error(parts.join(' ').trim());
+ notify(body: any, data: any) {
+ let message = body.defaultUserMessage + ' ';
+ body.errors?.forEach((error: any) => (message += error.developerMessage + ' '));
+ message += 'Data: ' + JSON.stringify(data);
+ console.error(message);
}
}
diff --git a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html
index bec25484fa..bd323915a2 100644
--- a/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html
+++ b/src/app/loans/loans-account-stepper/loans-account-charges-step/loans-account-charges-step.component.html
@@ -24,7 +24,7 @@
{{ 'labels.inputs.name' | translate }}
- {{ charge.name + ', ' + charge.currency.displaySymbol }}
+ {{ charge.name }}, {{ charge.currency.displaySymbol }}