From 0308a7d444a738c3e5367e71e01a28d865404e04 Mon Sep 17 00:00:00 2001 From: Jose Alberto Hernandez Date: Sat, 29 Nov 2025 14:49:00 -0500 Subject: [PATCH] WEB-446: Validation of re-Age amount during submission --- src/app/directives/format-amount.directive.ts | 3 +++ .../loan-reaging/loan-reaging.component.html | 12 ++++++++++- .../loan-reaging/loan-reaging.component.ts | 21 +++++++++++-------- .../models/loan-transaction-type.model.ts | 17 +++++++++++++++ .../input-amount/input-amount.component.html | 12 +++++++++++ .../input-amount/input-amount.component.ts | 16 +++++--------- src/assets/translations/cs-CS.json | 4 +++- src/assets/translations/de-DE.json | 4 +++- src/assets/translations/en-US.json | 4 +++- src/assets/translations/es-CL.json | 4 +++- src/assets/translations/es-MX.json | 4 +++- src/assets/translations/fr-FR.json | 4 +++- src/assets/translations/it-IT.json | 4 +++- src/assets/translations/ko-KO.json | 4 +++- src/assets/translations/lt-LT.json | 4 +++- src/assets/translations/lv-LV.json | 4 +++- src/assets/translations/ne-NE.json | 4 +++- src/assets/translations/pt-PT.json | 4 +++- src/assets/translations/sw-SW.json | 4 +++- 19 files changed, 99 insertions(+), 34 deletions(-) diff --git a/src/app/directives/format-amount.directive.ts b/src/app/directives/format-amount.directive.ts index 11bd17fa1..6fb65df06 100644 --- a/src/app/directives/format-amount.directive.ts +++ b/src/app/directives/format-amount.directive.ts @@ -42,6 +42,9 @@ export class FormatAmountDirective implements OnInit { ) {} parse(value: any) { + if (value == '') { + return '' + this.sufix; + } return formatCurrency(value, this.locale, this.displaySymbol, this.currencyCode, this.digitsInfo) + this.sufix; } } diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.html b/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.html index 5a6b4209f..8bc3a8d34 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.html +++ b/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.html @@ -1,8 +1,18 @@
-
+
+ + + {{ 'labels.inputs.Number of Installments' | translate }} diff --git a/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts b/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts index 24400c706..feec42f4b 100644 --- a/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts +++ b/src/app/loans/loans-view/loan-account-actions/loan-reaging/loan-reaging.component.ts @@ -9,13 +9,16 @@ import { SettingsService } from 'app/settings/settings.service'; import { OptionData } from 'app/shared/models/option-data.model'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; import { ReAgePreviewDialogComponent } from './re-age-preview-dialog/re-age-preview-dialog.component'; +import { InputAmountComponent } from 'app/shared/input-amount/input-amount.component'; +import { LoanTransactionTemplate } from 'app/loans/models/loan-transaction-type.model'; @Component({ selector: 'mifosx-loan-reaging', templateUrl: './loan-reaging.component.html', styleUrls: ['./loan-reaging.component.scss'], imports: [ - ...STANDALONE_SHARED_IMPORTS + ...STANDALONE_SHARED_IMPORTS, + InputAmountComponent ] }) export class LoanReagingComponent implements OnInit { @@ -34,7 +37,7 @@ export class LoanReagingComponent implements OnInit { /** Maximum Date allowed. */ maxDate = new Date(); - currencyCode: string = ''; + loanTransactionData: LoanTransactionTemplate | null = null; constructor( private formBuilder: UntypedFormBuilder, @@ -49,17 +52,13 @@ export class LoanReagingComponent implements OnInit { } ngOnInit(): void { + this.loanTransactionData = this.dataObject; + this.maxDate = this.settingsService.maxFutureDate; this.reAgeReasonOptions = this.dataObject.reAgeReasonOptions; this.reAgeInterestHandlingOptions = this.dataObject.reAgeInterestHandlingOptions; this.periodFrequencyOptions = this.dataObject.periodFrequencyOptions; - - const loanDetailsData = this.route.parent?.parent?.snapshot.data['loanDetailsData']; - if (loanDetailsData?.currency?.code) { - this.currencyCode = loanDetailsData.currency.code; - } - this.createReagingLoanForm(); } @@ -84,6 +83,10 @@ export class LoanReagingComponent implements OnInit { reAgeInterestHandling: [ this.reAgeInterestHandlingOptions[0] ], + transactionAmount: [ + this.loanTransactionData.amount, + [Validators.max(this.loanTransactionData.amount)] + ], note: '', externalId: '', reasonCodeValueId: null @@ -116,7 +119,7 @@ export class LoanReagingComponent implements OnInit { this.loanService.getReAgePreview(this.loanId, data).subscribe({ next: (response: RepaymentSchedule) => { - const currencyCode = response.currency?.code || this.currencyCode; + const currencyCode = response.currency?.code || this.loanTransactionData.currency.code; if (!currencyCode) { console.error('Currency code is not available in API response or loan details'); diff --git a/src/app/loans/models/loan-transaction-type.model.ts b/src/app/loans/models/loan-transaction-type.model.ts index a72e3ccac..c656aa639 100644 --- a/src/app/loans/models/loan-transaction-type.model.ts +++ b/src/app/loans/models/loan-transaction-type.model.ts @@ -1,3 +1,6 @@ +import { CodeValue, Currency } from 'app/shared/models/general.model'; +import { OptionData } from 'app/shared/models/option-data.model'; + export interface LoanTransactionType { id: number; code: string; @@ -41,3 +44,17 @@ export interface LoanTransactionType { buyDownFeeAdjustment: boolean; buyDownFeeAmortizationAdjustment: boolean; } + +export interface LoanTransactionTemplate { + loanId: number; + externalLoanId: string; + type: LoanTransactionType; + date: number[]; + currency: Currency; + amount: number; + netDisbursalAmount: number; + manuallyReversed: boolean; + reAgeReasonOptions: CodeValue[]; + periodFrequencyOptions: string[]; + reAgeInterestHandlingOptions: OptionData[]; +} diff --git a/src/app/shared/input-amount/input-amount.component.html b/src/app/shared/input-amount/input-amount.component.html index 7e7976002..d379c0b30 100644 --- a/src/app/shared/input-amount/input-amount.component.html +++ b/src/app/shared/input-amount/input-amount.component.html @@ -20,6 +20,12 @@ {{ inputFormControl.value | currency: currency.code : currency.displaySymbol : '1.2-2' }} + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.Must be at least' | translate }} {{ minVal }} + + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.Must be less or equal to' | translate }} {{ maxVal }} + {{ 'labels.inputs.' + inputLabel | translate }} @@ -37,4 +43,10 @@ {{ inputFormControl.value | currency: currency.code : currency.displaySymbol : '1.2-2' }} + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.Must be at least' | translate }} {{ minVal }} + + + {{ 'labels.inputs.Amount' | translate }} {{ 'labels.commons.Must be less or equal to' | translate }} {{ maxVal }} + diff --git a/src/app/shared/input-amount/input-amount.component.ts b/src/app/shared/input-amount/input-amount.component.ts index 3a4eb6881..2dca7613c 100644 --- a/src/app/shared/input-amount/input-amount.component.ts +++ b/src/app/shared/input-amount/input-amount.component.ts @@ -1,8 +1,8 @@ import { Component, Input } from '@angular/core'; import { Currency } from '../models/general.model'; -import { UntypedFormControl, ReactiveFormsModule } from '@angular/forms'; -import { NgIf, CurrencyPipe } from '@angular/common'; -import { MatFormField, MatLabel, MatError, MatHint, MatSuffix } from '@angular/material/form-field'; +import { UntypedFormControl } from '@angular/forms'; +import { CurrencyPipe } from '@angular/common'; +import { MatHint } from '@angular/material/form-field'; import { FormatAmountDirective } from '../../directives/format-amount.directive'; import { STANDALONE_SHARED_IMPORTS } from 'app/standalone-shared.module'; @@ -22,6 +22,8 @@ export class InputAmountComponent { @Input() currency: Currency; @Input() inputLabel: string; @Input() inputFormControl: UntypedFormControl; + @Input() minVal: number; + @Input() maxVal: number; displayHint = false; @@ -39,12 +41,4 @@ export class InputAmountComponent { } return true; } - - inputBlur(): void { - this.displayHint = false; - } - - inputFocus(): void { - this.displayHint = true; - } } diff --git a/src/assets/translations/cs-CS.json b/src/assets/translations/cs-CS.json index de029aa21..12404af48 100644 --- a/src/assets/translations/cs-CS.json +++ b/src/assets/translations/cs-CS.json @@ -803,7 +803,9 @@ "required and cannot be negative": "požadováno a nemůže být záporné", "should": "by měl", "on": "na", - "Password validation": "Heslo by mělo obsahovat minimálně {{minchar}} znaků, které by měly obsahovat 1 velké písmeno, malé písmeno a speciální znak a nemělo by se skládat z opakujících se znaků nebo mezer." + "Password validation": "Heslo by mělo obsahovat minimálně {{minchar}} znaků, které by měly obsahovat 1 velké písmeno, malé písmeno a speciální znak a nemělo by se skládat z opakujících se znaků nebo mezer.", + "Must be at least": "Musí být alespoň", + "Must be less or equal to": "Musí být menší nebo rovno" }, "heading": { "Account Linked Financial": "Seznam účtů spojených s různými finančními aktivitami. Chcete-li vědět více, klikněte:", diff --git a/src/assets/translations/de-DE.json b/src/assets/translations/de-DE.json index 3b6068a50..993c88b8d 100644 --- a/src/assets/translations/de-DE.json +++ b/src/assets/translations/de-DE.json @@ -803,7 +803,9 @@ "required and cannot be negative": "erforderlich und darf nicht negativ sein", "should": "sollen", "on": "An", - "Password validation": "Das Passwort sollte mindestens {{michar}} Zeichen enthalten, aus 1 Großbuchstaben, Kleinbuchstaben und Sonderzeichen bestehen und darf nicht aus wiederholten Zeichen oder Leerzeichen bestehen" + "Password validation": "Das Passwort sollte mindestens {{michar}} Zeichen enthalten, aus 1 Großbuchstaben, Kleinbuchstaben und Sonderzeichen bestehen und darf nicht aus wiederholten Zeichen oder Leerzeichen bestehen", + "Must be at least": "Muss mindestens", + "Must be less or equal to": "Muss kleiner oder gleich sein" }, "heading": { "Account Linked Financial": "Liste der Konten, die mit verschiedenen Finanzaktivitäten verknüpft sind. Um mehr zu erfahren, klicken Sie:", diff --git a/src/assets/translations/en-US.json b/src/assets/translations/en-US.json index e7d7183b7..e4707e146 100644 --- a/src/assets/translations/en-US.json +++ b/src/assets/translations/en-US.json @@ -807,7 +807,9 @@ "required and cannot be negative": "required and cannot be negative", "should": "should", "on": "on", - "Password validation": "The password should contain a minimum of {{minchar}} characters, including 1 uppercase, 1 lowercase and a special character and should not include repeated characters or spaces." + "Password validation": "The password should contain a minimum of {{minchar}} characters, including 1 uppercase, 1 lowercase and a special character and should not include repeated characters or spaces.", + "Must be at least": "Must be at least", + "Must be less or equal to": "Must be less or equal to" }, "heading": { "Account Linked Financial": "List of accounts linked to different financial activities. To know more click:", diff --git a/src/assets/translations/es-CL.json b/src/assets/translations/es-CL.json index 0fe05fd0b..9c5677f2e 100644 --- a/src/assets/translations/es-CL.json +++ b/src/assets/translations/es-CL.json @@ -802,7 +802,9 @@ "required and cannot be negative": "requerido y no puede ser negativo", "should": "debería", "on": "en", - "Password validation": "La contraseña debe contener un mínimo de {{minchar}} caracteres, que deben incluir 1 carácter mayúscula, minúscula y especial y no debe constar de caracteres repetidos ni espacios en blanco." + "Password validation": "La contraseña debe contener un mínimo de {{minchar}} caracteres, que deben incluir 1 carácter mayúscula, minúscula y especial y no debe constar de caracteres repetidos ni espacios en blanco.", + "Must be at least": "Debe ser al menos", + "Must be less or equal to": "Debe ser menor o igual a" }, "heading": { "Account Linked Financial": "Listado de cuentas vinculadas a diferentes actividades financieras. Para saber más haga clic en:", diff --git a/src/assets/translations/es-MX.json b/src/assets/translations/es-MX.json index 39552ee3b..bd52a1b08 100644 --- a/src/assets/translations/es-MX.json +++ b/src/assets/translations/es-MX.json @@ -802,7 +802,9 @@ "required and cannot be negative": "requerido y no puede ser negativo", "should": "debería", "on": "en", - "Password validation": "La contraseña debe contener un mínimo de {{minchar}} caracteres, que deben incluir 1 carácter mayúscula, minúscula y especial y no debe constar de caracteres repetidos ni espacios en blanco." + "Password validation": "La contraseña debe contener un mínimo de {{minchar}} caracteres, que deben incluir 1 carácter mayúscula, minúscula y especial y no debe constar de caracteres repetidos ni espacios en blanco.", + "Must be at least": "Debe ser al menos", + "Must be less or equal to": "Debe ser menor o igual a" }, "heading": { "Account Linked Financial": "Listado de cuentas vinculadas a diferentes actividades financieras. Para saber más haga clic en:", diff --git a/src/assets/translations/fr-FR.json b/src/assets/translations/fr-FR.json index 50f8fe418..3be4a0118 100644 --- a/src/assets/translations/fr-FR.json +++ b/src/assets/translations/fr-FR.json @@ -803,7 +803,9 @@ "required and cannot be negative": "obligatoire et ne peut pas être négatif", "should": "devrait", "on": "sur", - "Password validation": "Le mot de passe doit contenir au minimum {{minchar}} caractères, dont 1 majuscule, 1 minuscule et un caractère spécial et ne doit pas être composé de caractères répétés ou d'espaces blancs." + "Password validation": "Le mot de passe doit contenir au minimum {{minchar}} caractères, dont 1 majuscule, 1 minuscule et un caractère spécial et ne doit pas être composé de caractères répétés ou d'espaces blancs.", + "Must be at least": "Doit être au moins", + "Must be less or equal to": "Doit être inférieur ou égal à" }, "heading": { "Account Linked Financial": "Liste des comptes liés aux différentes activités financières. Pour en savoir plus cliquez :", diff --git a/src/assets/translations/it-IT.json b/src/assets/translations/it-IT.json index cc0c4345a..8391d91f7 100644 --- a/src/assets/translations/it-IT.json +++ b/src/assets/translations/it-IT.json @@ -803,7 +803,9 @@ "required and cannot be negative": "obbligatorio e non può essere negativo", "should": "Dovrebbe", "on": "SU", - "Password validation": "La password deve contenere almeno {{minchar}} caratteri, di cui 1 carattere maiuscolo, minuscolo e speciale e non deve essere composta da caratteri ripetuti o spazi bianchi" + "Password validation": "La password deve contenere almeno {{minchar}} caratteri, di cui 1 carattere maiuscolo, minuscolo e speciale e non deve essere composta da caratteri ripetuti o spazi bianchi", + "Must be at least": "Deve essere almeno", + "Must be less or equal to": "Deve essere minore o uguale a" }, "heading": { "Account Linked Financial": "Elenco dei conti collegati a diverse attività finanziarie. Per saperne di più clicca:", diff --git a/src/assets/translations/ko-KO.json b/src/assets/translations/ko-KO.json index f605bdb68..98ac86902 100644 --- a/src/assets/translations/ko-KO.json +++ b/src/assets/translations/ko-KO.json @@ -803,7 +803,9 @@ "required and cannot be negative": "필수이며 음수일 수 없습니다.", "should": "~해야 한다", "on": "~에", - "Password validation": "비밀번호는 최소 자여야 하며 대문자, 소문자 및 특수 문자 1개가 포함되어야 하며 반복되는 문자나 공백으로 구성되어서는 안 됩니다." + "Password validation": "비밀번호는 최소 자여야 하며 대문자, 소문자 및 특수 문자 1개가 포함되어야 하며 반복되는 문자나 공백으로 구성되어서는 안 됩니다.", + "Must be at least": "최소한이어야 합니다", + "Must be less or equal to": "이보다 작거나 같아야 합니다." }, "heading": { "Account Linked Financial": "다양한 금융 활동과 연결된 계정 목록입니다. 자세한 내용을 보려면 다음을 클릭하세요.", diff --git a/src/assets/translations/lt-LT.json b/src/assets/translations/lt-LT.json index 60b876426..206002cec 100644 --- a/src/assets/translations/lt-LT.json +++ b/src/assets/translations/lt-LT.json @@ -803,7 +803,9 @@ "required and cannot be negative": "privaloma ir negali būti neigiama", "should": "turėtų", "on": "įjungta", - "Password validation": "Slaptažodį turi sudaryti ne mažiau kaip {{minchar}} simbolių, iš kurių turi būti 1 didžioji, mažoji raidė ir specialus simbolis, o jį neturėtų sudaryti pasikartojantys simboliai ar tarpai" + "Password validation": "Slaptažodį turi sudaryti ne mažiau kaip {{minchar}} simbolių, iš kurių turi būti 1 didžioji, mažoji raidė ir specialus simbolis, o jį neturėtų sudaryti pasikartojantys simboliai ar tarpai", + "Must be at least": "Turi būti bent jau", + "Must be less or equal to": "Turi būti mažesnis arba lygus" }, "heading": { "Account Linked Financial": "Sąskaitų, susietų su įvairia finansine veikla, sąrašas. Norėdami sužinoti daugiau, spustelėkite:", diff --git a/src/assets/translations/lv-LV.json b/src/assets/translations/lv-LV.json index 7a942f993..6874446c1 100644 --- a/src/assets/translations/lv-LV.json +++ b/src/assets/translations/lv-LV.json @@ -803,7 +803,9 @@ "required and cannot be negative": "obligāti un nevar būt negatīvs", "should": "vajadzētu", "on": "ieslēgts", - "Password validation": "Parolē jābūt vismaz {{minchar}} rakstzīmēm, tai jābūt 1 lielajam, mazajam un speciālajām rakstzīmēm, un tā nedrīkst sastāvēt no atkārtotām rakstzīmēm vai atstarpēm." + "Password validation": "Parolē jābūt vismaz {{minchar}} rakstzīmēm, tai jābūt 1 lielajam, mazajam un speciālajām rakstzīmēm, un tā nedrīkst sastāvēt no atkārtotām rakstzīmēm vai atstarpēm.", + "Must be at least": "Jābūt vismaz", + "Must be less or equal to": "Jābūt mazākam vai vienādam ar" }, "heading": { "Account Linked Financial": "Ar dažādām finanšu darbībām saistīto kontu saraksts. Lai uzzinātu vairāk, noklikšķiniet:", diff --git a/src/assets/translations/ne-NE.json b/src/assets/translations/ne-NE.json index 4d88bba62..cc1961317 100644 --- a/src/assets/translations/ne-NE.json +++ b/src/assets/translations/ne-NE.json @@ -803,7 +803,9 @@ "required and cannot be negative": "आवश्यक छ र नकारात्मक हुन सक्दैन", "should": "गर्नुपर्छ", "on": "मा", - "Password validation": "पासवर्डमा कम्तिमा १२ क्यारेक्टरहरू हुनुपर्छ, जसमा १ अपरकेस, लोअरकेस र स्पेशल क्यारेक्टरहरू हुनुपर्छ र दोहोरिएका क्यारेक्टरहरू वा सेतो-स्पेसहरू समावेश हुनु हुँदैन।" + "Password validation": "पासवर्डमा कम्तिमा १२ क्यारेक्टरहरू हुनुपर्छ, जसमा १ अपरकेस, लोअरकेस र स्पेशल क्यारेक्टरहरू हुनुपर्छ र दोहोरिएका क्यारेक्टरहरू वा सेतो-स्पेसहरू समावेश हुनु हुँदैन।", + "Must be at least": "कम्तिमा हुनुपर्छ", + "Must be less or equal to": "कम वा बराबर हुनुपर्छ" }, "heading": { "Account Linked Financial": "विभिन्न वित्तीय गतिविधिहरु संग जोडिएको खाताहरु को सूची। थप जान्नको लागि क्लिक गर्नुहोस्:", diff --git a/src/assets/translations/pt-PT.json b/src/assets/translations/pt-PT.json index 6cc8b7fa5..96a093ad1 100644 --- a/src/assets/translations/pt-PT.json +++ b/src/assets/translations/pt-PT.json @@ -803,7 +803,9 @@ "required and cannot be negative": "obrigatório e não pode ser negativo", "should": "deve", "on": "sobre", - "Password validation": "A senha deve conter no mínimo {{minchar}} caracteres, que deve conter 1 letra maiúscula, minúscula e caractere especial e não deve consistir em caracteres repetidos ou espaços em branco" + "Password validation": "A senha deve conter no mínimo {{minchar}} caracteres, que deve conter 1 letra maiúscula, minúscula e caractere especial e não deve consistir em caracteres repetidos ou espaços em branco", + "Must be at least": "Deve ser pelo menos", + "Must be less or equal to": "Deve ser menor ou igual a" }, "heading": { "Account Linked Financial": "Lista de contas vinculadas a diferentes atividades financeiras. Para saber mais clique:", diff --git a/src/assets/translations/sw-SW.json b/src/assets/translations/sw-SW.json index bf135fa54..16924d671 100644 --- a/src/assets/translations/sw-SW.json +++ b/src/assets/translations/sw-SW.json @@ -803,7 +803,9 @@ "required and cannot be negative": "inahitajika na haiwezi kuwa hasi", "should": "lazima", "on": "juu", - "Password validation": "Nenosiri lazima liwe na herufi {{minchar}}, ambazo zinafaa kuingiza herufi 1 kubwa, ndogo na maalum na haipaswi kuwa na herufi zinazorudiwa au nafasi nyeupe." + "Password validation": "Nenosiri lazima liwe na herufi {{minchar}}, ambazo zinafaa kuingiza herufi 1 kubwa, ndogo na maalum na haipaswi kuwa na herufi zinazorudiwa au nafasi nyeupe.", + "Must be at least": "Lazima iwe angalau", + "Must be less or equal to": "Lazima iwe chini au sawa na" }, "heading": { "Account Linked Financial": "Orodha ya akaunti zilizounganishwa na shughuli tofauti za kifedha. Kujua zaidi bofya:",