diff --git a/src/app/reports/run-report/run-report.component.html b/src/app/reports/run-report/run-report.component.html index 07d73a985..a5af0b7e9 100644 --- a/src/app/reports/run-report/run-report.component.html +++ b/src/app/reports/run-report/run-report.component.html @@ -29,6 +29,9 @@ {{ param.label }} {{ 'labels.commons.is' | translate }} {{ 'labels.commons.required' | translate }} + + {{ param.label }} {{ 'labels.commons.must be after or equal to start date' | translate }} + diff --git a/src/app/reports/run-report/run-report.component.ts b/src/app/reports/run-report/run-report.component.ts index d6818b014..5e99afa6a 100644 --- a/src/app/reports/run-report/run-report.component.ts +++ b/src/app/reports/run-report/run-report.component.ts @@ -1,7 +1,14 @@ /** Angular Imports */ import { Component, OnInit } from '@angular/core'; import { ActivatedRoute, RouterLink } from '@angular/router'; -import { UntypedFormControl, UntypedFormGroup, Validators, ReactiveFormsModule } from '@angular/forms'; +import { + AbstractControl, + UntypedFormControl, + UntypedFormGroup, + ValidatorFn, + Validators, + ReactiveFormsModule +} from '@angular/forms'; /** Custom Services */ import { ReportsService } from '../reports.service'; @@ -176,6 +183,7 @@ export class RunReportComponent implements OnInit { } this.decimalChoice.patchValue('0'); this.setChildControls(); + this.addDateRangeValidator(); } /** @@ -206,6 +214,62 @@ export class RunReportComponent implements OnInit { }); } + addDateRangeValidator(): void { + const dateParams = this.paramData.filter((param: ReportParameter) => param.displayType === 'date'); + const startParam = dateParams.find((param: ReportParameter) => this.isStartDateParam(param)); + const endParam = dateParams.find((param: ReportParameter) => this.isEndDateParam(param)); + + if (!startParam || !endParam) { + return; + } + + const startControl = this.reportForm.get(startParam.name); + const endControl = this.reportForm.get(endParam.name); + + if (!startControl || !endControl) { + return; + } + + endControl.addValidators(this.endDateAfterStartValidator(startParam.name)); + endControl.updateValueAndValidity({ emitEvent: false }); + startControl.valueChanges.subscribe(() => endControl.updateValueAndValidity({ emitEvent: false })); + } + + endDateAfterStartValidator(startControlName: string): ValidatorFn { + return (control: AbstractControl) => { + const startControl = control.parent?.get(startControlName); + const startValue = startControl?.value; + const endValue = control.value; + + if (!startValue || !endValue) { + return null; + } + + const startDate = new Date(startValue); + const endDate = new Date(endValue); + + if (isNaN(startDate.getTime()) || isNaN(endDate.getTime())) { + return null; + } + + if (endDate < startDate) { + return { endBeforeStart: true }; + } + + return null; + }; + } + + isStartDateParam(param: ReportParameter): boolean { + const identifier = `${param.name}${param.variable}${param.label}`.toLowerCase(); + return identifier.includes('start') || identifier.includes('from'); + } + + isEndDateParam(param: ReportParameter): boolean { + const identifier = `${param.name}${param.variable}${param.label}`.toLowerCase(); + return identifier.includes('end') || identifier.includes('to'); + } + /** * Subscribes to changes in parent parameters value, builds child parameter vis-a-vis parent's value. */ diff --git a/src/assets/translations/cs-CS.json b/src/assets/translations/cs-CS.json index 48609d943..3cd05107c 100644 --- a/src/assets/translations/cs-CS.json +++ b/src/assets/translations/cs-CS.json @@ -807,7 +807,8 @@ "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.", "Must be at least": "Musí být alespoň", - "Must be less or equal to": "Musí být menší nebo rovno" + "Must be less or equal to": "Musí být menší nebo rovno", + "must be after or equal to start date": "musí být po nebo rovno datu zahájení" }, "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 a7ca9389d..28a55c57d 100644 --- a/src/assets/translations/de-DE.json +++ b/src/assets/translations/de-DE.json @@ -807,7 +807,8 @@ "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", "Must be at least": "Muss mindestens", - "Must be less or equal to": "Muss kleiner oder gleich sein" + "Must be less or equal to": "Muss kleiner oder gleich sein", + "must be after or equal to start date": "muss nach oder gleich dem Startdatum 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 60aca9c82..65dc2d853 100644 --- a/src/assets/translations/en-US.json +++ b/src/assets/translations/en-US.json @@ -811,7 +811,8 @@ "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.", "Must be at least": "Must be at least", - "Must be less or equal to": "Must be less or equal to" + "Must be less or equal to": "Must be less or equal to", + "must be after or equal to start date": "must be after or equal to start date" }, "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 5bf224e09..697e99e75 100644 --- a/src/assets/translations/es-CL.json +++ b/src/assets/translations/es-CL.json @@ -806,7 +806,8 @@ "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.", "Must be at least": "Debe ser al menos", - "Must be less or equal to": "Debe ser menor o igual a" + "Must be less or equal to": "Debe ser menor o igual a", + "must be after or equal to start date": "debe ser posterior o igual a la fecha de inicio" }, "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 6042b8d85..920452187 100644 --- a/src/assets/translations/es-MX.json +++ b/src/assets/translations/es-MX.json @@ -806,7 +806,8 @@ "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.", "Must be at least": "Debe ser al menos", - "Must be less or equal to": "Debe ser menor o igual a" + "Must be less or equal to": "Debe ser menor o igual a", + "must be after or equal to start date": "debe ser posterior o igual a la fecha de inicio" }, "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 1e0b066d7..fb007d5a0 100644 --- a/src/assets/translations/fr-FR.json +++ b/src/assets/translations/fr-FR.json @@ -807,7 +807,8 @@ "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.", "Must be at least": "Doit être au moins", - "Must be less or equal to": "Doit être inférieur ou égal à" + "Must be less or equal to": "Doit être inférieur ou égal à", + "must be after or equal to start date": "doit être postérieure ou égale à la date de début" }, "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 16326cd6f..648cbe8b4 100644 --- a/src/assets/translations/it-IT.json +++ b/src/assets/translations/it-IT.json @@ -807,7 +807,8 @@ "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", "Must be at least": "Deve essere almeno", - "Must be less or equal to": "Deve essere minore o uguale a" + "Must be less or equal to": "Deve essere minore o uguale a", + "must be after or equal to start date": "deve essere successiva o uguale alla data di inizio" }, "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 45991f598..d6246f7fd 100644 --- a/src/assets/translations/ko-KO.json +++ b/src/assets/translations/ko-KO.json @@ -807,7 +807,8 @@ "on": "~에", "Password validation": "비밀번호는 최소 자여야 하며 대문자, 소문자 및 특수 문자 1개가 포함되어야 하며 반복되는 문자나 공백으로 구성되어서는 안 됩니다.", "Must be at least": "최소한이어야 합니다", - "Must be less or equal to": "이보다 작거나 같아야 합니다." + "Must be less or equal to": "이보다 작거나 같아야 합니다.", + "must be after or equal to start date": "시작 날짜 이후이거나 같아야 합니다" }, "heading": { "Account Linked Financial": "다양한 금융 활동과 연결된 계정 목록입니다. 자세한 내용을 보려면 다음을 클릭하세요.", diff --git a/src/assets/translations/lt-LT.json b/src/assets/translations/lt-LT.json index c63d9124e..78e178252 100644 --- a/src/assets/translations/lt-LT.json +++ b/src/assets/translations/lt-LT.json @@ -807,7 +807,8 @@ "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", "Must be at least": "Turi būti bent jau", - "Must be less or equal to": "Turi būti mažesnis arba lygus" + "Must be less or equal to": "Turi būti mažesnis arba lygus", + "must be after or equal to start date": "turi būti po pradžios datos arba jai lygi" }, "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 fcadbccc9..5308f5016 100644 --- a/src/assets/translations/lv-LV.json +++ b/src/assets/translations/lv-LV.json @@ -807,7 +807,8 @@ "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.", "Must be at least": "Jābūt vismaz", - "Must be less or equal to": "Jābūt mazākam vai vienādam ar" + "Must be less or equal to": "Jābūt mazākam vai vienādam ar", + "must be after or equal to start date": "jābūt pēc sākuma datuma vai vienādam ar to" }, "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 6b7ba2cd0..57cd16b0f 100644 --- a/src/assets/translations/ne-NE.json +++ b/src/assets/translations/ne-NE.json @@ -807,7 +807,8 @@ "on": "मा", "Password validation": "पासवर्डमा कम्तिमा १२ क्यारेक्टरहरू हुनुपर्छ, जसमा १ अपरकेस, लोअरकेस र स्पेशल क्यारेक्टरहरू हुनुपर्छ र दोहोरिएका क्यारेक्टरहरू वा सेतो-स्पेसहरू समावेश हुनु हुँदैन।", "Must be at least": "कम्तिमा हुनुपर्छ", - "Must be less or equal to": "कम वा बराबर हुनुपर्छ" + "Must be less or equal to": "कम वा बराबर हुनुपर्छ", + "must be after or equal to start date": "सुरु मिति पछि वा बराबर हुनुपर्छ" }, "heading": { "Account Linked Financial": "विभिन्न वित्तीय गतिविधिहरु संग जोडिएको खाताहरु को सूची। थप जान्नको लागि क्लिक गर्नुहोस्:", diff --git a/src/assets/translations/pt-PT.json b/src/assets/translations/pt-PT.json index f6afd354b..d5b20a0b3 100644 --- a/src/assets/translations/pt-PT.json +++ b/src/assets/translations/pt-PT.json @@ -807,7 +807,8 @@ "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", "Must be at least": "Deve ser pelo menos", - "Must be less or equal to": "Deve ser menor ou igual a" + "Must be less or equal to": "Deve ser menor ou igual a", + "must be after or equal to start date": "deve ser posterior ou igual à data de início" }, "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 0adc95270..64682fd1e 100644 --- a/src/assets/translations/sw-SW.json +++ b/src/assets/translations/sw-SW.json @@ -807,7 +807,8 @@ "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.", "Must be at least": "Lazima iwe angalau", - "Must be less or equal to": "Lazima iwe chini au sawa na" + "Must be less or equal to": "Lazima iwe chini au sawa na", + "must be after or equal to start date": "lazima iwe baada ya au sawa na tarehe ya kuanza" }, "heading": { "Account Linked Financial": "Orodha ya akaunti zilizounganishwa na shughuli tofauti za kifedha. Kujua zaidi bofya:",