diff --git a/src/app/core/i18n/i18n.service.ts b/src/app/core/i18n/i18n.service.ts index 1f784a3bb1..5190a5dd57 100644 --- a/src/app/core/i18n/i18n.service.ts +++ b/src/app/core/i18n/i18n.service.ts @@ -9,7 +9,7 @@ import { Observable } from 'rxjs'; export class I18nService { constructor(private translateService: TranslateService) {} - public translate(key: string): Observable { - return this.translateService.get(key); + public translate(key: string, params?: object): Observable { + return this.translateService.get(key, params); } } 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 2be93cbf73..c1d04dcfb7 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,6 @@ /** Angular Imports */ import { Component, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { I18nService } from 'app/core/i18n/i18n.service'; import { ActivatedRoute, Router } from '@angular/router'; /** Custom Services */ @@ -84,7 +85,8 @@ export class CreateGlimAccountComponent { private loansService: LoansService, private settingsService: SettingsService, private clientService: ClientsService, - private dateUtils: Dates + private dateUtils: Dates, + private i18nService: I18nService ) { this.route.data.subscribe((data: { loansAccountTemplate: any; groupsData: any }) => { this.loansAccountTemplate = data.loansAccountTemplate; @@ -212,7 +214,7 @@ export class CreateGlimAccountComponent { /** Request Body Data */ buildRequestData(): any[] { const requestData = []; - const memberSelected = this.selectedMembers.selectedMembers; + const memberSelected = this.selectedMembers?.selectedMembers ?? []; const totalLoan = this.totalLoanAmount(); for (let index = 0; index < memberSelected.length; index++) { requestData.push({ @@ -227,7 +229,7 @@ export class CreateGlimAccountComponent { totalLoanAmount(): number { let total = 0; - const memberSelected = this.selectedMembers.selectedMembers; + const memberSelected = this.selectedMembers?.selectedMembers ?? []; for (let index = 0; index < memberSelected.length; index++) { total += memberSelected[index].principal; } @@ -238,6 +240,30 @@ export class CreateGlimAccountComponent { * 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); @@ -250,15 +276,17 @@ export class CreateGlimAccountComponent { { relativeTo: this.route } ); } else { - this.notify(body, data); + this.notify(body, { batchSize: data.length }); } }); } - notify(body: any, data: any) { - let message = body.defaultUserMessage + ' '; - while (body.errors?.length > 0) message += body.errors.pop().developerMessage + ' '; - message += 'Data: ' + JSON.stringify(data); - console.error(message); + 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()); } } diff --git a/src/assets/translations/cs-CS.json b/src/assets/translations/cs-CS.json index 72c0e42907..2d66fcb479 100644 --- a/src/assets/translations/cs-CS.json +++ b/src/assets/translations/cs-CS.json @@ -3,6 +3,8 @@ "Logged in as": "Přihlášen jako", "Remember me": "Zapamatuj si mě", "errors": { + "linkedSavingsAccountOwnership": "Propojený spořicí účet nepatří vybranému klientovi.", + "clientNotInGSIM": "Klient s ID {{id}} není přítomen v GSIM.", "Capitalized Income amount adjusted already adjusted": "Výše kapitalizovaného příjmu již upravená", "Capitalized Income Adjustment amount must be lower or equal to": "Částka úpravy kapitalizovaného příjmu musí být nižší nebo rovna", "Buy Down Fee amount already adjusted": "Výše poplatku za odkup již byla upravena", diff --git a/src/assets/translations/de-DE.json b/src/assets/translations/de-DE.json index e3528ac019..4fc34150a8 100644 --- a/src/assets/translations/de-DE.json +++ b/src/assets/translations/de-DE.json @@ -3,6 +3,8 @@ "Logged in as": "Angemeldet als", "Remember me": "Erinnere dich an mich", "errors": { + "linkedSavingsAccountOwnership": "Verknüpftes Sparkonto gehört nicht zum ausgewählten Kunden.", + "clientNotInGSIM": "Kunde mit der ID {{id}} ist nicht in GSIM vorhanden.", "Capitalized Income amount adjusted already adjusted": "Kapitalisiertes Einkommen Betrag angepasst bereits angepasst", "Capitalized Income Adjustment amount must be lower or equal to": "Der Betrag der kapitalisierten Einkommensanpassung muss kleiner oder gleich sein", "Buy Down Fee amount already adjusted": "Kapitalisierte Erträge Betrag angepasst bereits angepasst", diff --git a/src/assets/translations/en-US.json b/src/assets/translations/en-US.json index 2d0a67cbff..1e51bb8c51 100644 --- a/src/assets/translations/en-US.json +++ b/src/assets/translations/en-US.json @@ -3,6 +3,8 @@ "Logged in as": "Logged in as", "Remember me": "Remember me", "errors": { + "linkedSavingsAccountOwnership": "Linked savings account does not belong to the selected client.", + "clientNotInGSIM": "Client with ID {{id}} is not present in GSIM.", "Capitalized Income amount adjusted already adjusted": "Capitalized Income amount already adjusted", "Capitalized Income Adjustment amount must be lower or equal to": "Capitalized Income Adjustment amount must be lower or equal to", "Buy Down Fee amount already adjusted": "Buy Down Fee amount already adjusted", diff --git a/src/assets/translations/es-CL.json b/src/assets/translations/es-CL.json index 57a7c4400c..4044fa60c3 100644 --- a/src/assets/translations/es-CL.json +++ b/src/assets/translations/es-CL.json @@ -3,6 +3,8 @@ "Logged in as": "Conectado como", "Remember me": "Recordar me", "errors": { + "linkedSavingsAccountOwnership": "La cuenta de ahorro vinculada no pertenece al cliente seleccionado.", + "clientNotInGSIM": "El cliente con ID {{id}} no está presente en GSIM.", "Capitalized Income amount adjusted already adjusted": "Monto de Ingreso Capitalizado ajustado ya ajustado", "Capitalized Income Adjustment amount must be lower or equal to": "El monto del Ajuste de Ingreso Capitalizado debe ser menor o igual a", "Buy Down Fee amount already adjusted": "Importe de la comisión de recompra ya ajustado", diff --git a/src/assets/translations/es-MX.json b/src/assets/translations/es-MX.json index 740290fe6e..a5c6c56435 100644 --- a/src/assets/translations/es-MX.json +++ b/src/assets/translations/es-MX.json @@ -3,6 +3,8 @@ "Logged in as": "Conectado como", "Remember me": "Recordar me", "errors": { + "linkedSavingsAccountOwnership": "La cuenta de ahorro vinculada no pertenece al cliente seleccionado.", + "clientNotInGSIM": "El cliente con ID {{id}} no está presente en GSIM.", "Capitalized Income amount adjusted already adjusted": "Monto de Ingreso Capitalizado ajustado ya ajustado", "Capitalized Income Adjustment amount must be lower or equal to": "El monto del Ajuste de Ingreso Capitalizado debe ser menor o igual a", "Buy Down Fee amount already adjusted": "Importe de la comisión de recompra ya ajustado", diff --git a/src/assets/translations/fr-FR.json b/src/assets/translations/fr-FR.json index fb6c19b5ae..3f75faf552 100644 --- a/src/assets/translations/fr-FR.json +++ b/src/assets/translations/fr-FR.json @@ -3,6 +3,8 @@ "Logged in as": "connecté en tant que", "Remember me": "Souviens-toi de moi", "errors": { + "linkedSavingsAccountOwnership": "Le compte d'épargne lié n'appartient pas au client sélectionné.", + "clientNotInGSIM": "Le client avec l'ID {{id}} n'est pas membre du GSIM.", "Capitalized Income amount adjusted already adjusted": "Montant du revenu capitalisé ajusté déjà ajusté", "Capitalized Income Adjustment amount must be lower or equal to": "Le montant de l'ajustement du revenu capitalisé doit être inférieur ou égal à", "Buy Down Fee amount already adjusted": "Montant de la commission de rachat déjà ajusté", diff --git a/src/assets/translations/it-IT.json b/src/assets/translations/it-IT.json index bacccad23f..e581e43855 100644 --- a/src/assets/translations/it-IT.json +++ b/src/assets/translations/it-IT.json @@ -3,6 +3,8 @@ "Logged in as": "Collegato come", "Remember me": "Ricordati di me", "errors": { + "linkedSavingsAccountOwnership": "Il conto di risparmio collegato non appartiene al cliente selezionato.", + "clientNotInGSIM": "Il cliente con ID {{id}} non è presente in GSIM.", "Capitalized Income amount adjusted already adjusted": "Importo del reddito capitalizzato rettificato già rettificato", "Capitalized Income Adjustment amount must be lower or equal to": "L'importo dell'adeguamento del reddito capitalizzato deve essere inferiore o uguale a", "Buy Down Fee amount already adjusted": "Importo della Buy Down Fee già adeguato", diff --git a/src/assets/translations/ko-KO.json b/src/assets/translations/ko-KO.json index 3fd4126bec..3a85acbc5f 100644 --- a/src/assets/translations/ko-KO.json +++ b/src/assets/translations/ko-KO.json @@ -3,6 +3,8 @@ "Logged in as": "다음 계정으로 로그인됨", "Remember me": "날 기억해", "errors": { + "linkedSavingsAccountOwnership": "연결된 저축 계좌가 선택한 클라이언트에 속하지 않습니다.", + "clientNotInGSIM": "ID가 {{id}}인 클라이언트가 GSIM에 없습니다.", "Capitalized Income amount adjusted already adjusted": "자본화된 소득 금액은 이미 조정되었습니다.", "Capitalized Income Adjustment amount must be lower or equal to": "자본화된 소득 조정 금액은 다음보다 낮거나 같아야 합니다.", "Buy Down Fee amount already adjusted": "이미 조정된 바이 다운 수수료 금액", diff --git a/src/assets/translations/lt-LT.json b/src/assets/translations/lt-LT.json index 28b1398389..d43ccf22b2 100644 --- a/src/assets/translations/lt-LT.json +++ b/src/assets/translations/lt-LT.json @@ -3,6 +3,8 @@ "Logged in as": "prisijungęs kaip", "Remember me": "Prisimink mane", "errors": { + "linkedSavingsAccountOwnership": "Susieta taupomoji sąskaita nepriklauso pasirinktam klientui.", + "clientNotInGSIM": "Klientas su ID {{id}} nėra GSIM sistemoje.", "Capitalized Income amount adjusted already adjusted": "Kapitalizuotų pajamų suma pakoreguota jau pakoreguota", "Capitalized Income Adjustment amount must be lower or equal to": "Kapitalizuotų pajamų koregavimo suma turi būti mažesnė arba lygi", "Buy Down Fee amount already adjusted": "Jau pakoreguota išpirkimo mokesčio suma", diff --git a/src/assets/translations/lv-LV.json b/src/assets/translations/lv-LV.json index 1c4c9d7940..e541020a1a 100644 --- a/src/assets/translations/lv-LV.json +++ b/src/assets/translations/lv-LV.json @@ -3,6 +3,8 @@ "Logged in as": "ielogojies Kā", "Remember me": "Atceries mani", "errors": { + "linkedSavingsAccountOwnership": "Saistītais krājkonts nepieder izvēlētajam klientam.", + "clientNotInGSIM": "Klients ar ID {{id}} nav GSIM sistēmā.", "Capitalized Income amount adjusted already adjusted": "Kapitalizēto ienākumu summa jau koriģēta", "Capitalized Income Adjustment amount must be lower or equal to": "Kapitalizēto ienākumu korekcijas summai ir jābūt mazākai vai vienādai ar", "Buy Down Fee amount already adjusted": "Jau koriģētā atpirkšanas maksas summa", diff --git a/src/assets/translations/ne-NE.json b/src/assets/translations/ne-NE.json index e844022f6b..0c36925851 100644 --- a/src/assets/translations/ne-NE.json +++ b/src/assets/translations/ne-NE.json @@ -3,6 +3,8 @@ "Logged in as": "को रूपमा लग इन गरियो", "Remember me": "मलाई सम्झनुहोस्", "errors": { + "linkedSavingsAccountOwnership": "लिंक गरिएको बचत खाता चयनित ग्राहकको होइन।", + "clientNotInGSIM": "आईडी {{id}} भएको ग्राहक GSIM मा उपस्थित छैन।", "Capitalized Income amount adjusted already adjusted": "क्यापिटलाइज्ड आय रकम पहिले नै समायोजन गरिएको छ", "Capitalized Income Adjustment amount must be lower or equal to": "पूंजीकृत आय समायोजन रकम कम वा बराबर हुनुपर्छ", "Buy Down Fee amount already adjusted": "बाइ डाउन शुल्क रकम पहिले नै समायोजन गरिएको छ।", diff --git a/src/assets/translations/pt-PT.json b/src/assets/translations/pt-PT.json index 4a5983dd3c..acbce28f4a 100644 --- a/src/assets/translations/pt-PT.json +++ b/src/assets/translations/pt-PT.json @@ -3,6 +3,8 @@ "Logged in as": "logado como", "Remember me": "Lembre de mim", "errors": { + "linkedSavingsAccountOwnership": "A conta poupança vinculada não pertence ao cliente selecionado.", + "clientNotInGSIM": "O cliente com ID {{id}} não está presente no GSIM.", "Capitalized Income amount adjusted already adjusted": "Valor da Renda Capitalizada ajustado já ajustado", "Capitalized Income Adjustment amount must be lower or equal to": "O valor do ajuste de renda capitalizada deve ser menor ou igual a", "Buy Down Fee amount already adjusted": "Montante da comissão de compra já ajustado", diff --git a/src/assets/translations/sw-SW.json b/src/assets/translations/sw-SW.json index 581362f58f..af7e457e25 100644 --- a/src/assets/translations/sw-SW.json +++ b/src/assets/translations/sw-SW.json @@ -3,6 +3,8 @@ "Logged in as": "Imeingia kama", "Remember me": "Nikumbuke", "errors": { + "linkedSavingsAccountOwnership": "Akaunti ya akiba iliyounganishwa haimilikiwi na mteja aliyechaguliwa.", + "clientNotInGSIM": "Mteja mwenye kitambulisho {{id}} hayupo kwenye GSIM.", "Capitalized Income amount adjusted already adjusted": "Kiasi cha Mapato ya Mtaji kilichorekebishwa tayari kimerekebishwa", "Capitalized Income Adjustment amount must be lower or equal to": "Kiasi cha Marekebisho ya Mapato ya Mtaji lazima kiwe chini au sawa na", "Buy Down Fee amount already adjusted": "Kiasi cha Ada ya Kununua Chini tayari kimerekebishwa",