diff --git a/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/pages/deltagare-avvikelse/deltagare-avvikelse.component.ts b/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/pages/deltagare-avvikelse/deltagare-avvikelse.component.ts
index 4caaaa5..a7b4ac2 100644
--- a/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/pages/deltagare-avvikelse/deltagare-avvikelse.component.ts
+++ b/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/pages/deltagare-avvikelse/deltagare-avvikelse.component.ts
@@ -17,18 +17,14 @@ import { OrsaksKoderAvvikelse } from '@msfa-models/orsaks-koder-avvikelse.model'
import { KandaAvvikelseKoder, OrsaksKoderFranvaro } from '@msfa-models/orsaks-koder-franvaro.model';
import { DeltagareApiService } from '@msfa-services/api/deltagare.api.service';
import {
- AnnanKandOrsakeIsRequiredCheck,
- DateIsRequiredCheck,
- DayOrPartOfDayIsRequiredCheck,
- DescriptionIsRequiredCheck,
- EndTimeIsRequiredCheck,
- MotiveringIsRequiredCheck,
- OrsakerIsRequiredCheck,
- StartTimeIsRequiredCheck,
+ requiredAnnanKandOrsakValidator, RequiredDateValidator,
+ requiredDayOrPartOfDayValidator, requiredDescriptionValidator, requiredEndTimeValidator,
+ requiredFraga1Validator,
+ requiredfraga2Validator, requiredOrsakerValidator, requiredStartTimeValidator
} from '@msfa-utils/validators/avvikelse-form-validator';
import { RequiredValidator } from '@msfa-utils/validators/required.validator';
import { BehaviorSubject, Observable } from 'rxjs';
-import { first, map, switchMap } from 'rxjs/operators';
+import { map, switchMap } from 'rxjs/operators';
import { DeltagareAvvikelseService } from '../../services/deltagare-avvikelse.service';
import { avvikelseAlternatives, dayOrPartOfDay } from './report-alternatives';
@@ -63,7 +59,6 @@ export class DeltagareAvvikelseComponent implements OnInit {
andraKandaOrsaker$: Observable;
fragor1$: Observable;
fragor2$: Observable;
- contactInformation: ContactInformation;
sizeTextArea: FormTextareaSize.S;
todayDate = new Date().toISOString().slice(0, 10);
avvikelseAlternatives: RadiobuttonModel[] = avvikelseAlternatives;
@@ -84,45 +79,29 @@ export class DeltagareAvvikelseComponent implements OnInit {
) { }
ngOnInit(): void {
- this.contactInformation$.pipe(first()).subscribe(contactInformation => {
- this.contactInformation = contactInformation;
- });
-
this.avvikelseFormGroup = new FormGroup(
{
alternative: new FormControl(null, [RequiredValidator()]),
- description: new FormControl(''),
+ description: new FormControl('', [requiredDescriptionValidator()]),
date: new FormControl(this.todayDate),
- dayOrPartOfDay: new FormControl(null),
+ dayOrPartOfDay: new FormControl(null, [requiredDayOrPartOfDayValidator()]),
orsakerFormGroup: new FormGroup({
- orsaker: new FormControl([]),
- andraKandaOrsaker: new FormControl([]),
+ orsaker: new FormControl([], [requiredOrsakerValidator()]),
+ andraKandaOrsaker: new FormControl([], [requiredAnnanKandOrsakValidator()])
}),
fragorFormGroup: new FormGroup({
- fraga1: new FormControl(''),
- fraga2: new FormControl(''),
+ fraga1: new FormControl('', [requiredFraga1Validator()]),
+ fraga2: new FormControl('', [requiredfraga2Validator()])
}),
timepickerFormGroup: new FormGroup({
- startTime: new FormControl(''),
- endTime: new FormControl(''),
+ startTime: new FormControl('', [requiredStartTimeValidator()]),
+ endTime: new FormControl('', [requiredEndTimeValidator()])
}),
},
{
validators: [
- DescriptionIsRequiredCheck.CheckIfRequired(
- 'description',
- 'orsakerFormGroup',
- 'andraKandaOrsaker',
- KandaOrsakerEnum.AnnanOrsak
- ),
- OrsakerIsRequiredCheck.CheckIfRequired('orsakerFormGroup', 'orsaker'),
- AnnanKandOrsakeIsRequiredCheck.CheckIfRequired('orsakerFormGroup', 'andraKandaOrsaker'),
- DateIsRequiredCheck.CheckIfRequired('date'),
- DayOrPartOfDayIsRequiredCheck.CheckIfRequired('dayOrPartOfDay'),
- StartTimeIsRequiredCheck.CheckIfRequired('timepickerFormGroup', 'startTime'),
- EndTimeIsRequiredCheck.CheckIfRequired('timepickerFormGroup', 'endTime'),
- MotiveringIsRequiredCheck.CheckIfRequired('fraga1'),
- ],
+ RequiredDateValidator.CheckIfRequired()
+ ]
}
);
}
@@ -172,11 +151,6 @@ export class DeltagareAvvikelseComponent implements OnInit {
if (confirm === ConfirmDialog.ACCEPTED) {
const postAvvikelse: Avvikelse = {
datum_for_rapportering: this.todayDate,
- arbetssokande: {
- personnummer: this.contactInformation.ssn,
- fornamn: this.contactInformation.firstName,
- efternamn: this.contactInformation.lastName,
- },
sokandeId: +this.activatedRoute.snapshot.params['genomforandeReferens'],
};
@@ -251,7 +225,6 @@ export class DeltagareAvvikelseComponent implements OnInit {
this.fragor2$ = this.deltagareAvvikelseService.getFragorForAvvikelser$().pipe(
map((fragor: FragorForAvvikelser[]) => {
return fragor.filter((fraga: FragorForAvvikelser) => {
- this.setIfRequiredDescription(fraga);
return fraga.id.includes('_2');
});
})
@@ -261,12 +234,6 @@ export class DeltagareAvvikelseComponent implements OnInit {
this.clearControlOnAlternativeChange();
}
- private setIfRequiredDescription(fraga: FragorForAvvikelser) {
- fraga.id === '19_2' || fraga.id === '20_2'
- ? (fraga.descriptionIsRequired = false)
- : (fraga.descriptionIsRequired = true);
- }
-
setOrsakerChanged(): void {
this.avvikelseFormGroup.markAsUntouched();
if ((this.alternativeFormControl.value as string) === Alternative.AVVIKELSE) {
@@ -283,6 +250,13 @@ export class DeltagareAvvikelseComponent implements OnInit {
});
}
+ setDayOrPartOfDayChanged(): void {
+ if (this.dayOrPartOfDayFormControl.value === DayOrPartOfDay.HELDAG) {
+ this.startTimeFormControl.reset();
+ this.endTimeFormControl.reset();
+ }
+ }
+
get showDescription(): boolean {
return (
(this.alternativeFormControl.value as string) == Alternative.FRANVARO &&
@@ -317,6 +291,8 @@ export class DeltagareAvvikelseComponent implements OnInit {
}
get nextStep(): number {
+ console.log(this.avvikelseFormGroup);
+
this.avvikelseFormGroup.markAllAsTouched();
if (this.avvikelseFormGroup.valid && this.currentStep < this.totalAmountOfSteps) {
return this.currentStep++;
@@ -332,7 +308,9 @@ export class DeltagareAvvikelseComponent implements OnInit {
}
backToDeltagare(): void {
- void this.router.navigate(['./deltagare', this.activatedRoute.snapshot.params['genomforandeReferens']]);
+ this.router.navigate(['./deltagare', this.activatedRoute.snapshot.params['genomforandeReferens']])
+ .catch(error => console.log(error, 'Failed to go back to deltagare')
+ );
}
private clearControlOnAlternativeChange(): void {
diff --git a/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/services/deltagare-avvikelse.service.ts b/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/services/deltagare-avvikelse.service.ts
index 293799e..58fa325 100644
--- a/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/services/deltagare-avvikelse.service.ts
+++ b/apps/mina-sidor-fa/src/app/pages/deltagare/pages/deltagare-report/services/deltagare-avvikelse.service.ts
@@ -18,7 +18,14 @@ export class DeltagareAvvikelseService {
public getOrsaksKoderFranvaro$(): Observable {
return this.avvikelseApiService.getOrsaksKoderFranvaro$()
.pipe(
- map((orsaksKoder: OrsaksKoderFranvaro[]) => this.sortOrsaksKoder(orsaksKoder))
+ map((orsaksKoder: OrsaksKoderFranvaro[]) => {
+ orsaksKoder.find(kod => {
+ if (kod.value === FranvaroOrsaksKodEnum.VAB) {
+ kod.name = 'Vård av barn';
+ }
+ });
+ return this.sortOrsaksKoder(orsaksKoder)
+ })
)
}
diff --git a/apps/mina-sidor-fa/src/app/shared/enums/franvaro-orsak-kod.enum.ts b/apps/mina-sidor-fa/src/app/shared/enums/franvaro-orsak-kod.enum.ts
index 7b2ffe3..052b43a 100644
--- a/apps/mina-sidor-fa/src/app/shared/enums/franvaro-orsak-kod.enum.ts
+++ b/apps/mina-sidor-fa/src/app/shared/enums/franvaro-orsak-kod.enum.ts
@@ -3,6 +3,6 @@ export enum FranvaroOrsaksKodEnum {
Arbete = 16,
OkandOrsak = 17,
AnnanKandOrsak = 18,
- VAB = 23,
- Utbildning = 24,
+ VAB = 26,
+ Utbildning = 27,
}
diff --git a/apps/mina-sidor-fa/src/app/shared/models/arbetssokande.model.ts b/apps/mina-sidor-fa/src/app/shared/models/arbetssokande.model.ts
deleted file mode 100644
index fe5fe23..0000000
--- a/apps/mina-sidor-fa/src/app/shared/models/arbetssokande.model.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export interface Arbetssokande {
- personnummer: string,
- fornamn: string,
- efternamn: string
-}
diff --git a/apps/mina-sidor-fa/src/app/shared/models/avvikelse.model.ts b/apps/mina-sidor-fa/src/app/shared/models/avvikelse.model.ts
index 7035335..1e80bd9 100644
--- a/apps/mina-sidor-fa/src/app/shared/models/avvikelse.model.ts
+++ b/apps/mina-sidor-fa/src/app/shared/models/avvikelse.model.ts
@@ -1,10 +1,8 @@
-import { Arbetssokande } from './arbetssokande.model';
import { AvvikelseAlternativ } from './avvikelse-alternativ.model';
import { FranvaroAlternativ } from './franvaro-alternativ.model';
export interface Avvikelse {
datum_for_rapportering: string,
- arbetssokande: Arbetssokande,
sokandeId: number;
avvikelsealternativ?: AvvikelseAlternativ,
franvaro?: FranvaroAlternativ
@@ -12,24 +10,21 @@ export interface Avvikelse {
export interface AvvikelseRequestData {
datum_for_rapportering: string,
- arbetssokande: Arbetssokande,
sokandeId: number;
avvikelsealternativ: AvvikelseAlternativ,
}
export interface FranvaroRequestData {
datum_for_rapportering: string,
- arbetssokande: Arbetssokande,
sokandeId: number;
franvaro: FranvaroAlternativ
}
export function mapAvvikelseRequestDataToAvvikelse(data: AvvikelseRequestData): Avvikelse {
- const { datum_for_rapportering, arbetssokande, sokandeId, avvikelsealternativ } = data;
+ const { datum_for_rapportering, sokandeId, avvikelsealternativ } = data;
return {
datum_for_rapportering,
- arbetssokande,
sokandeId,
avvikelsealternativ
}
diff --git a/apps/mina-sidor-fa/src/app/shared/utils/validators/avvikelse-form-validator.ts b/apps/mina-sidor-fa/src/app/shared/utils/validators/avvikelse-form-validator.ts
index 8e550e6..359ac3a 100644
--- a/apps/mina-sidor-fa/src/app/shared/utils/validators/avvikelse-form-validator.ts
+++ b/apps/mina-sidor-fa/src/app/shared/utils/validators/avvikelse-form-validator.ts
@@ -3,113 +3,169 @@ import { Alternative } from '@msfa-enums/alternative.enum';
import { DayOrPartOfDay } from '@msfa-enums/day-or-part-of-day.enum';
import { FranvaroOrsaksKodEnum } from '@msfa-enums/franvaro-orsak-kod.enum';
import { KandaOrsakerEnum } from '@msfa-enums/kanda-orsaker-kod.enum';
+import { ValidationError } from '@msfa-models/validation-error.model';
-export class DescriptionIsRequiredCheck {
- static CheckIfRequired(
- controlToValidateName: string,
- nestedFormGroupName: string,
- nestedFormGroupControlName: string,
- valueForWhichTheControlShouldBeRequired: KandaOrsakerEnum
- ): ValidatorFn {
- return (fg: AbstractControl): { [key: string]: boolean } => {
- const valueOfControlToValidate = fg?.get(controlToValidateName)?.value as string;
- const valueOfNestedFormControl = fg?.get(nestedFormGroupName)?.get(nestedFormGroupControlName)?.value as string;
- const isRequired = +valueOfNestedFormControl === valueForWhichTheControlShouldBeRequired && valueOfControlToValidate === '';
-
- return isRequired ? { descriptionIsRequired: true } : null;
- };
- }
+export interface Controls {
+ [key: string]: AbstractControl
}
-export class OrsakerIsRequiredCheck {
- static CheckIfRequired(
- nestedFormGroupName: string,
- controlToValidateName: string,
- ): ValidatorFn {
- return (fg: AbstractControl): { [key: string]: boolean } => {
- const valueOfNestedFormControl = fg?.get(nestedFormGroupName)?.get(controlToValidateName)?.value as string;
- const isRequired = valueOfNestedFormControl === null && fg?.get(nestedFormGroupName)?.get('andraKandaOrsaker')?.value === null;
+export function requiredDescriptionValidator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.controls as Controls;
- return isRequired ? { orsakerIsRequired: true } : null;
- };
- }
-}
+ if (ctrls) {
+ const valueOfNestedFormControl = ctrls['orsakerFormGroup'].get('andraKandaOrsaker').value as string;
+ const valueOfFormControl = control.value as string;
+ const isRequired = !valueOfFormControl && +valueOfNestedFormControl === KandaOrsakerEnum.AnnanOrsak;
-export class DayOrPartOfDayIsRequiredCheck {
- static CheckIfRequired(
- controlToValidateName: string,
- ): ValidatorFn {
- return (fg: AbstractControl): { [key: string]: boolean } => {
- const valueOfControlToValidate = fg?.get(controlToValidateName)?.value as string;
- const isRequired = valueOfControlToValidate === null && fg?.get('alternative').value === Alternative.FRANVARO;
+ if (isRequired) {
+ return { type: 'required', message: 'Beskrivning är obligatoriskt' }
+ }
- return isRequired ? { dayOrPartOfDayIsRequired: true } : null;
- };
- }
-}
-
-export class AnnanKandOrsakeIsRequiredCheck {
- static CheckIfRequired(
- nestedFormGroupName: string,
- controlToValidateName: string,
- ): ValidatorFn {
- return (fg: AbstractControl): { [key: string]: boolean } => {
- const valueOfNestedFormControl = fg?.get(nestedFormGroupName)?.get(controlToValidateName)?.value as string;
- const isRequired = +fg?.get(nestedFormGroupName).get('orsaker').value === FranvaroOrsaksKodEnum.AnnanKandOrsak &&
- valueOfNestedFormControl === null;
-
- return isRequired ? { annanKandorsakIsRequired: true } : null;
- };
- }
-}
-
-export class StartTimeIsRequiredCheck {
- static CheckIfRequired(
- nestedFormGroupName: string,
- startTimeControlToValidateName: string,
- ): ValidatorFn {
- return (fg: AbstractControl): { [key: string]: boolean } => {
- const valueOfStartTimeFormControl = fg?.get(nestedFormGroupName)?.get(startTimeControlToValidateName)?.value as string;
- const isRequired = fg?.get('alternative')?.value as string === Alternative.FRANVARO &&
- fg?.get('dayOrPartOfDay').value === DayOrPartOfDay.DEL_AV_DAG && !valueOfStartTimeFormControl;
-
- return isRequired ? { startTimeIsRequired: true } : null;
+ return null;
}
}
}
-export class EndTimeIsRequiredCheck {
- static CheckIfRequired(
- nestedFormGroupName: string,
- endTimeControlToValidateName: string
- ): ValidatorFn {
- return (fg: AbstractControl): { [key: string]: boolean } => {
- const valueOfEndTimeFormControl = fg?.get(nestedFormGroupName)?.get(endTimeControlToValidateName)?.value as string;
- const isRequired = fg?.get('alternative').value as string === Alternative.FRANVARO &&
- fg?.get('dayOrPartOfDay').value === DayOrPartOfDay.DEL_AV_DAG && !valueOfEndTimeFormControl;
+export function requiredOrsakerValidator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.controls as Controls;
- return isRequired ? { endTimeIsRequired: true } : null;
+ if (ctrls) {
+ const valueOfNestedFormControl = ctrls['orsaker'].value as string;
+ const isRequired = !valueOfNestedFormControl && !ctrls['andraKandaOrsaker'].value;
+
+ if (isRequired) {
+ return { type: 'required', message: `Orsak är obligatoriskt` };
+ }
+
+ return null;
}
}
}
-export class MotiveringIsRequiredCheck {
- static CheckIfRequired(controlToValidateName: string): ValidatorFn {
- return (fg: AbstractControl): { [key: string]: boolean } => {
- const valueOfControlToValidate = fg?.get('fragorFormGroup').get(controlToValidateName)?.value as string;
- const isRequired = fg?.get('alternative').value as string === Alternative.AVVIKELSE && valueOfControlToValidate === '';
+export function requiredAnnanKandOrsakValidator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.controls as Controls;
- return isRequired ? { motiveringIsRequired: true } : null;
- };
+ if (ctrls) {
+ const isAnnanKandOrsak = +ctrls['orsaker'].value === FranvaroOrsaksKodEnum.AnnanKandOrsak;
+ const valueOfNestedFormControl = ctrls['andraKandaOrsaker'].value as string;
+ const isRequired = isAnnanKandOrsak && !valueOfNestedFormControl;
+
+ if (isRequired) {
+ return { type: 'required', message: `Annan orsak är obligatoriskt` };
+ }
+
+ return null;
+ }
}
}
-export class DateIsRequiredCheck {
- static CheckIfRequired(controlToValidateName: string): ValidatorFn {
+
+export class RequiredDateValidator {
+ static CheckIfRequired(): ValidatorFn {
return (fg: AbstractControl): { [key: string]: string } => {
- const valueOfControlToValidate = fg?.get(controlToValidateName).value as string;
- const isRequired = valueOfControlToValidate === '';
+ const valueOfFormControl = fg?.get('date')?.value as string;
+ const isRequired = !valueOfFormControl;
return isRequired ? { dateIsRequired: 'Datum är obligatoriskt' } : null;
- };
+ }
+ }
+}
+
+export function requiredDayOrPartOfDayValidator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.controls as Controls;
+
+ if (ctrls) {
+ const isFranvaro = ctrls['alternative'].value === Alternative.FRANVARO;
+ const valueOfFormControl = control.value as string;
+ const isRequired = isFranvaro && !valueOfFormControl;
+
+ if (isRequired) {
+ return { type: 'required', message: `Hel- eller del av dag är obligatoriskt` };
+ }
+
+ return null;
+ }
+ }
+}
+
+export function requiredStartTimeValidator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.parent?.controls as Controls;
+
+ if (ctrls) {
+ const isFranvaro = ctrls['alternative']?.value as string === Alternative.FRANVARO;
+ const isPartOfDay = ctrls['dayOrPartOfDay']?.value === DayOrPartOfDay.DEL_AV_DAG;
+ const valueOfFormControl = control?.value as string;
+ const isRequired = isFranvaro && isPartOfDay && (valueOfFormControl === '' || valueOfFormControl === null);
+
+ if (isRequired) {
+ return { type: 'required', message: `Starttid är obligatoriskt` };
+ }
+
+ return null;
+ }
+ }
+}
+
+export function requiredEndTimeValidator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.parent?.controls as Controls;
+
+ if (ctrls) {
+ const isFranvaro = ctrls['alternative']?.value as string === Alternative.FRANVARO;
+ const isPartOfDay = ctrls['dayOrPartOfDay']?.value === DayOrPartOfDay.DEL_AV_DAG;
+ const valueOfFormControl = control?.value as string;
+ const isRequired = isFranvaro && isPartOfDay && (valueOfFormControl === '' || valueOfFormControl === null);
+
+ if (isRequired) {
+ return { type: 'required', message: `Sluttid är obligatoriskt` };
+ }
+
+ return null;
+ }
+ }
+}
+
+export function requiredFraga1Validator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.parent?.controls as Controls;
+
+ if (ctrls) {
+ const isAvvikelse = ctrls['alternative']?.value === 'avvikelse';
+ const valueOfFormControl = control.value as string;
+ const isRequired = isAvvikelse && !valueOfFormControl;
+
+ if (isRequired) {
+ return { type: 'required', message: `Beskrivning är obligatoriskt` };
+ }
+
+ return null;
+ }
+ }
+}
+
+export function requiredfraga2Validator(): ValidatorFn {
+ return (control: AbstractControl): ValidationError => {
+ const ctrls = control?.parent?.parent?.controls as Controls;
+
+ if (ctrls) {
+ const isAvvikelse = ctrls['alternative']?.value === 'avvikelse';
+ const valueOfFormControl = control.value as string;
+ const orsaksKodToValidate = ctrls['orsakerFormGroup']?.get('orsaker')?.value as string;
+ const isRequired = isAvvikelse && !valueOfFormControl &&
+ (orsaksKodToValidate !== '19' &&
+ orsaksKodToValidate !== '20' &&
+ orsaksKodToValidate !== '28'
+ )
+
+ if (isRequired) {
+ return { type: 'required', message: `Beskrivning är obligatoriskt` };
+ }
+
+ return null;
+ }
}
}