Merge pull request #200 in TEA/mina-sidor-fa-web from feature/report-changes to develop

Squashed commit of the following:

commit 72a580d3529536bfb118c0a6a45a57ca8f1ef165
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Thu Oct 14 12:18:29 2021 +0200

    Added better error-handling

commit f41eece77e11c325715f93f175e3250630a75382
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Thu Oct 14 07:08:08 2021 +0200

    Updated padding of report-links

commit e37d973707b48d7c351618ba1ec65637ffd3c9cb
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Thu Oct 14 07:02:43 2021 +0200

    Fixed minor issues after PR

commit 6dbf12f71f6ef4ae1dab89c92b2e23725bbce956
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Wed Oct 13 15:36:41 2021 +0200

    Made adjustments to signal to match other reports

commit f2260dd20eb0a7ecf8e42d18db721fe4831ee760
Merge: ec6d6ca9 bdb1d161
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Wed Oct 13 12:06:02 2021 +0200

    Merge branch 'develop' into feature/report-changes

commit ec6d6ca9a177345994f5bab60fe0bbc908634fe3
Author: Erik Tiekstra <erik.tiekstra@arbetsformedlingen.se>
Date:   Wed Oct 13 09:00:03 2021 +0200

    WIP - signal
This commit is contained in:
Erik Tiekstra
2021-10-15 11:43:50 +02:00
parent c68d69be3f
commit 3dfbf4683e
42 changed files with 621 additions and 555 deletions

View File

@@ -3,6 +3,7 @@ export const DELTAGARE_REPORTING_ROUTES = {
'periodisk-redovisning': 'Periodisk redovisning',
franvarorapport: 'Avvikelserapport (frånvaro)',
avvikelserapport: 'Avvikelserapport (avvikelse)',
signal: 'Signal om arbete eller studier',
};
export const NAVIGATION = {

View File

@@ -1,19 +0,0 @@
export enum ErsattningsGrundTypKod {
ARBETE_HELTID = 1,
ARBETE_DELTID = 2,
UTBILDNING_HELTID = 3,
UTBILDNING_DELTID = 4,
}
export function getErsattningsGrundTyp(kod: number): string {
switch (kod) {
case 1:
return 'Arbete heltid';
case 2:
return 'Arbete deltid';
case 3:
return 'Utbildning heltid';
case 4:
return 'Utbildning deltid'
}
}

View File

@@ -2,7 +2,7 @@ import { ErrorHandler, Injectable } from '@angular/core';
import { ApmErrorHandler } from '@elastic/apm-rum-angular';
import { Feature } from '@msfa-enums/feature.enum';
import { environment } from '@msfa-environment';
import { CustomError, errorToCustomError } from '@msfa-models/error/custom-error';
import { CustomError } from '@msfa-models/error/custom-error';
import { ErrorService } from '@msfa-services/error.service';
@Injectable()
@@ -11,9 +11,10 @@ export class CustomErrorHandler implements ErrorHandler {
private _activeFeatures = environment.activeFeatures;
constructor(private errorService: ErrorService, public apmErrorHandler: ApmErrorHandler) {}
handleError(error: Error & { ngDebugContext: unknown }): void {
const customError: CustomError = errorToCustomError(error);
this.errorService.add(customError);
handleError(customError: CustomError & { ngDebugContext: unknown }): void {
if (!customError.avoidToast) {
this.errorService.add(customError);
}
if (this._elasticConfig && this._activeFeatures.includes(Feature.LOGGING)) {
this.apmErrorHandler.handleError(customError);

View File

@@ -0,0 +1,7 @@
export interface SignalRequest {
genomforandeReferens: number;
typ: 'arbete' | 'utbildning';
omfattning: 'heltid' | 'deltid';
omfattning_procent: number;
startdatum: string;
}

View File

@@ -0,0 +1,6 @@
export interface SignalResponse {
typ: 'arbete' | 'utbildning';
omfattning: 'heltid' | 'deltid';
omfattning_procent: number;
startdatum: string;
}

View File

@@ -11,15 +11,24 @@ export class CustomError implements Error {
timestamp: Date;
error: Error;
removeAfter: number;
avoidToast?: boolean;
constructor(args: { error: Error; type?: ErrorType; message?: string; severity?: ErrorSeverity; stack?: string }) {
constructor(args: {
error: Error;
type?: ErrorType;
message?: string;
severity?: ErrorSeverity;
stack?: string;
avoidToast?: boolean;
}) {
this.timestamp = new Date();
this.id = this.timestamp.getTime().toString();
this.type = this.name = args.type || ErrorType.UNKNOWN;
this.type = this.name = args.type || CustomError.getErrorType(args.error);
this.message = args.message || args.error.message;
this.severity = args.severity || ErrorSeverity.HIGH;
this.stack = args.stack || CustomError.getStack(args.error);
this.error = args.error;
this.avoidToast = args.avoidToast || false;
this.removeAfter =
this.severity === ErrorSeverity.LOW ? 5000 : this.severity === ErrorSeverity.MEDIUM ? 10000 : 20000;
}

View File

@@ -1,26 +0,0 @@
import { ErsattningsGrundTypKod } from '../enums/ersattning-grund-typ-kod.enum';
export interface SignalArbeteStudier {
sokandeId: number;
ersattningsgrund: ErsattningsGrundTypKod;
antalProcent?: number;
startDatum: Date;
}
export interface SignalArbeteStudierRequestData {
sokandeId: number;
ersattningsgrund: ErsattningsGrundTypKod;
antalProcent?: number;
startDatum: Date;
}
export function mapSignalArbeteStudierRequestDataToReport(data: SignalArbeteStudierRequestData): SignalArbeteStudier {
const { sokandeId, ersattningsgrund, antalProcent, startDatum } = data;
return {
sokandeId,
ersattningsgrund,
antalProcent,
startDatum,
};
}

View File

@@ -0,0 +1,19 @@
import { SignalResponse } from './api/signal.response.model';
export interface Signal {
type: 'arbete' | 'utbildning';
omfattning: 'heltid' | 'deltid';
percent: number;
startDate: Date;
}
export function mapResponseToSignal(data: SignalResponse): Signal {
const { typ, startdatum, omfattning, omfattning_procent } = data;
return {
type: typ,
omfattning,
percent: omfattning_procent,
startDate: new Date(startdatum),
};
}

View File

@@ -38,7 +38,7 @@ export class AvvikelseApiService {
catchError((error: Error) => {
throw new CustomError({
error,
message: 'Det gick inte att skicka avvikelse \n\n' + error.message,
message: `Kunde inte spara Avvikelserapport (avvikelse).\n\n${error.message}`,
type: ErrorType.API,
});
})

View File

@@ -1,14 +0,0 @@
import { Injectable } from '@angular/core';
import { SignalArbeteStudier } from '@msfa-models/signal-arbete-studier.model';
import { SignalArbeteStudierApiService } from '@msfa-services/api/signal-arbete-studier-api.service';
@Injectable({
providedIn: 'root',
})
export class DeltagareSignalArbeteStudierService {
constructor(private signalArbeteStudierApiService: SignalArbeteStudierApiService) { }
public createSignalArbeteStudier$(signalArbeteStudier: SignalArbeteStudier): Promise<void> {
return this.signalArbeteStudierApiService.createSignalArbeteStudier$(signalArbeteStudier);
}
}

View File

@@ -1,5 +1,6 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ErrorType } from '@msfa-enums/error-type.enum';
import { environment } from '@msfa-environment';
import { FranvaroReasonResponse } from '@msfa-models/api/franvaro-reason.response.model';
import { FranvaroReportRequest } from '@msfa-models/api/franvaro-request.model';
@@ -47,7 +48,15 @@ export class FranvaroReportApiService {
return this.deltagareApiService.fetchAvropInformation$(genomforandeReferens);
}
public async postFranvaroReport$(requestData: FranvaroReportRequest): Promise<void> {
return this.httpClient.post<void>(`${this._apiBaseUrl}/franvaro`, requestData).toPromise();
public postFranvaroReport$(requestData: FranvaroReportRequest): Observable<void> {
return this.httpClient.post<void>(`${this._apiBaseUrl}/franvaro`, requestData).pipe(
catchError((error: Error) => {
throw new CustomError({
error,
message: `Kunde inte spara Avvikelserapport (frånvaro).\n\n${error.message}`,
type: ErrorType.API,
});
})
);
}
}

View File

@@ -1,5 +1,6 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ErrorType } from '@msfa-enums/error-type.enum';
import { environment } from '@msfa-environment';
import { Activity, mapResponseToActivity } from '@msfa-models/activity.model';
import { ActivityResponse } from '@msfa-models/api/activity.response.model';
@@ -53,8 +54,16 @@ export class GemensamPlaneringApiService {
);
}
public async postGemensamPlanering$(requestData: GemensamPlaneringPostRequest): Promise<void> {
return this.httpClient.post<void>(`${this._apiBaseUrl}`, requestData).toPromise();
public postGemensamPlanering$(requestData: GemensamPlaneringPostRequest): Observable<void> {
return this.httpClient.post<void>(`${this._apiBaseUrl}`, requestData).pipe(
catchError((error: Error) => {
throw new CustomError({
error,
message: `Kunde inte spara Gemensam planering.\n\n${error.message}`,
type: ErrorType.API,
});
})
);
}
constructor(private httpClient: HttpClient, private deltagareApiService: DeltagareApiService) {}

View File

@@ -1,18 +0,0 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { environment } from '@msfa-environment';
import { SignalArbeteStudier } from '@msfa-models/signal-arbete-studier.model';
@Injectable({
providedIn: 'root',
})
export class SignalArbeteStudierApiService {
private _apiBaseUrl = `${environment.api.url}`;
public createSignalArbeteStudier$(signalArbeteStudier: SignalArbeteStudier): Promise<void> {
return this.httpClient.post<void>(`${this._apiBaseUrl}/signal`, signalArbeteStudier).toPromise();
}
constructor(private httpClient: HttpClient) { }
}

View File

@@ -0,0 +1,29 @@
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { ErrorType } from '@msfa-enums/error-type.enum';
import { environment } from '@msfa-environment';
import { SignalRequest } from '@msfa-models/api/signal.request.model';
import { CustomError } from '@msfa-models/error/custom-error';
import { Observable } from 'rxjs';
import { catchError } from 'rxjs/operators';
@Injectable({
providedIn: 'root',
})
export class SignalApiService {
private _apiBaseUrl = `${environment.api.url}/rapporter/signal`;
public postSignal$(requestData: SignalRequest): Observable<void> {
return this.httpClient.post<void>(this._apiBaseUrl, requestData).pipe(
catchError((error: Error) => {
throw new CustomError({
error,
message: `Kunde inte spara Signal om arbete eller studier.\n\n${error.message}`,
type: ErrorType.API,
});
})
);
}
constructor(private httpClient: HttpClient) {}
}