Skip to content
This repository has been archived by the owner on Sep 12, 2023. It is now read-only.

Commit

Permalink
Varsel ved ingen fravær (#1141)
Browse files Browse the repository at this point in the history
  • Loading branch information
frodehansen2 authored Jul 1, 2022
1 parent 212d696 commit b0596ce
Show file tree
Hide file tree
Showing 9 changed files with 406 additions and 154 deletions.
1 change: 1 addition & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ module.exports = {
'react-hooks/exhaustive-deps': 'warn',
'react/display-name': 'off',
'react/prop-types': 'off',
'no-fallthrough': 'error',
},
plugins: ['jsx-a11y', 'react-hooks'],
settings: {
Expand Down
2 changes: 1 addition & 1 deletion e2e/cypress/integration-utils/steps/arbeidIPeriode.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const { selectRadio, selectRadioYes, setInputTime } = require('../utils');
export const fyllUtArbeidIPeriode = () => {
selectRadio('jobberRedusert');
selectRadioYes('er-likt-hver-uke');
setInputTime('arbeidstid-faste-ukedager__monday', '2', '0');
setInputTime('arbeidstid-faste-ukedager__monday', '1', '0');
setInputTime('arbeidstid-faste-ukedager__tuesday', '2', '0');
setInputTime('arbeidstid-faste-ukedager__wednesday', '2', '0');
setInputTime('arbeidstid-faste-ukedager__friday', '0', '0');
Expand Down
23 changes: 22 additions & 1 deletion src/app/hooks/useLogSøknadInfo.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
export enum LogSøknadInfoType {
'arbeidPeriodeRegistrert' = 'arbeidPeriodeRegistrert',
'arbeidEnkeltdagRegistrert' = 'arbeidEnkeltdagRegistrert',
'bekrefterIngenFraværFraArbeid' = 'bekrefterIngenFraværFraArbeid',
'avkrefterIngenFraværFraArbeid' = 'avkrefterIngenFraværFraArbeid',
'senderInnSøknadMedIngenFravær' = 'senderInnSøknadMedIngenFravær',
}

import { useAmplitudeInstance } from '@navikt/sif-common-amplitude/lib';
Expand All @@ -22,7 +25,25 @@ function useLogSøknadInfo() {
});
};

return { logArbeidPeriodeRegistrert, logArbeidEnkeltdagRegistrert };
const logBekreftIngenFraværFraJobb = (bekrefterIngenFravær: boolean) => {
logInfo({
hendelse: bekrefterIngenFravær
? LogSøknadInfoType.bekrefterIngenFraværFraArbeid
: LogSøknadInfoType.avkrefterIngenFraværFraArbeid,
});
};
const logSenderInnSøknadMedIngenFravær = () => {
logInfo({
hendelse: LogSøknadInfoType.senderInnSøknadMedIngenFravær,
});
};

return {
logArbeidPeriodeRegistrert,
logArbeidEnkeltdagRegistrert,
logBekreftIngenFraværFraJobb,
logSenderInnSøknadMedIngenFravær,
};
}

export default useLogSøknadInfo;
339 changes: 190 additions & 149 deletions src/app/søknad/SøknadContent.tsx

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import { ArbeidIPeriodeSøknadsdata, ArbeidIPeriodeType } from '../../../../types/søknadsdata/arbeidIPeriodeSøknadsdata';
import {
NormalarbeidstidSøknadsdata,
NormalarbeidstidType,
} from '../../../../types/søknadsdata/normalarbeidstidSøknadsdata';
import { erArbeidsforholdMedFravær } from '../arbeidstidUtils';

const normalarbeidstid: NormalarbeidstidSøknadsdata = {
type: NormalarbeidstidType.likeUkerOgDager,
erFasteUkedager: true,
erLiktHverUke: true,
timerFasteUkedager: {
friday: { hours: '1', minutes: '0' },
},
};

const arbeiderIkke: ArbeidIPeriodeSøknadsdata = {
type: ArbeidIPeriodeType.arbeiderIkke,
arbeiderIPerioden: false,
};

const arbeiderVanlig: ArbeidIPeriodeSøknadsdata = {
type: ArbeidIPeriodeType.arbeiderVanlig,
arbeiderIPerioden: true,
arbeiderRedusert: false,
};

const arbeiderRedusertEnkeltdager: ArbeidIPeriodeSøknadsdata = {
type: ArbeidIPeriodeType.arbeiderEnkeltdager,
arbeiderIPerioden: true,
arbeiderRedusert: true,
enkeltdager: { '123123': { hours: '1', minutes: '0' } },
};

describe('arbeidstidUtils', () => {
describe('erArbeidsforholdMedFravær', () => {
it('returner true når en ikke arbeiderer i perioden', () => {
expect(
erArbeidsforholdMedFravær({
normalarbeidstid,
arbeidISøknadsperiode: arbeiderIkke,
})
).toBeTruthy();
});
it('returner true når en arbeider redusert i perioden', () => {
expect(
erArbeidsforholdMedFravær({
normalarbeidstid,
arbeidISøknadsperiode: arbeiderRedusertEnkeltdager,
})
).toBeTruthy();
});
it('returner false når en arbeider som vanlig', () => {
expect(
erArbeidsforholdMedFravær({
normalarbeidstid,
arbeidISøknadsperiode: arbeiderVanlig,
})
).toBeFalsy();
});
});
});
86 changes: 86 additions & 0 deletions src/app/søknad/arbeidstid-step/utils/arbeidstidUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,16 @@ import {
getWeekdayFromDate,
getWeekdaysWithDuration,
ISODateToDate,
summarizeDurationInDurationWeekdays,
Weekday,
} from '@navikt/sif-common-utils/lib';
import { ArbeidIPeriodeType } from '../../../types/søknadsdata/arbeidIPeriodeSøknadsdata';
import { ArbeidsforholdSøknadsdata } from '../../../types/søknadsdata/arbeidsforholdSøknadsdata';
import { ArbeidSøknadsdata } from '../../../types/søknadsdata/arbeidSøknadsdata';
import {
NormalarbeidstidSøknadsdata,
NormalarbeidstidType,
} from '../../../types/søknadsdata/normalarbeidstidSøknadsdata';

export const getDurationWeekdaysNotInDurationWeekdays = (
weekdays1: DurationWeekdays,
Expand Down Expand Up @@ -41,3 +49,81 @@ export const arbeiderAndreEnkeltdagerEnnNormalt = (
});
return harDagerPåAndreDager;
};

const getTimerPerUkeFraFasteUkedager = (timerFasteUkedager: DurationWeekdays): number => {
return durationToDecimalDuration(summarizeDurationInDurationWeekdays(timerFasteUkedager));
};

export const arbeiderMindreEnnNormaltISnittPerUke = (
timerISnitt: number,
normalarbeidstid: NormalarbeidstidSøknadsdata
): boolean => {
switch (normalarbeidstid.type) {
case NormalarbeidstidType.ulikeUker:
case NormalarbeidstidType.likeUkerVarierendeDager:
case NormalarbeidstidType.arbeiderHelg:
case NormalarbeidstidType.arbeiderDeltid:
return timerISnitt < normalarbeidstid.timerPerUkeISnitt;
case NormalarbeidstidType.likeUkerOgDager:
return timerISnitt < getTimerPerUkeFraFasteUkedager(normalarbeidstid.timerFasteUkedager);
}
};

export const arbeiderMindreEnnNormaltFasteUkedager = (
timerFasteUkedager: DurationWeekdays,
normalarbeidstidFasteUkedager: DurationWeekdays
): boolean => {
return (
getTimerPerUkeFraFasteUkedager(timerFasteUkedager) <
getTimerPerUkeFraFasteUkedager(normalarbeidstidFasteUkedager)
);
};

export const erArbeidsforholdMedFravær = ({
arbeidISøknadsperiode,
normalarbeidstid,
}: ArbeidsforholdSøknadsdata): boolean => {
if (!arbeidISøknadsperiode) {
return false;
}
switch (arbeidISøknadsperiode.type) {
case ArbeidIPeriodeType.arbeiderIkke:
return true;
case ArbeidIPeriodeType.arbeiderVanlig:
return false;
case ArbeidIPeriodeType.arbeiderProsentAvNormalt:
return arbeidISøknadsperiode.prosentAvNormalt < 100;
case ArbeidIPeriodeType.arbeiderEnkeltdager:
/** Ingen sjekk implementert */
return true;
case ArbeidIPeriodeType.arbeiderFasteUkedager:
if (normalarbeidstid.erFasteUkedager) {
return arbeiderMindreEnnNormaltFasteUkedager(
arbeidISøknadsperiode.fasteDager,
normalarbeidstid.timerFasteUkedager
);
}
/** Skal ikke skje pga validering i søknadsdialogen*/
return false;
case ArbeidIPeriodeType.arbeiderTimerISnittPerUke:
return arbeiderMindreEnnNormaltISnittPerUke(arbeidISøknadsperiode.timerISnittPerUke, normalarbeidstid);
}
};

export const harFraværIPerioden = (arbeidsforhold: ArbeidsforholdSøknadsdata[]): boolean => {
return arbeidsforhold.some(erArbeidsforholdMedFravær);
};

export const getArbeidsforhold = (arbeid: ArbeidSøknadsdata): ArbeidsforholdSøknadsdata[] => {
const arbeidsgivere: ArbeidsforholdSøknadsdata[] = [];
arbeid.arbeidsgivere?.forEach((a) => {
if (a.erAnsattISøknadsperiode) {
arbeidsgivere.push(a.arbeidsforhold);
}
});
const frilans: ArbeidsforholdSøknadsdata[] = arbeid.frilans?.erFrilanser ? [arbeid.frilans.arbeidsforhold] : [];
const selvstendig: ArbeidsforholdSøknadsdata[] = arbeid.selvstendig?.erSN
? [arbeid.selvstendig.arbeidsforhold]
: [];
return [...arbeidsgivere, ...frilans, ...selvstendig];
};
22 changes: 22 additions & 0 deletions src/app/søknad/confirmation-dialogs/ingenFraværConfirmation.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import React from 'react';
import { Undertittel } from 'nav-frontend-typografi';
import { ConfirmationDialog } from '../../types/ConfirmationDialog';

type Props = Pick<ConfirmationDialog, 'onCancel' | 'onConfirm'>;

export const getIngenFraværConfirmationDialog = (props: Props): ConfirmationDialog => ({
...props,
title: 'Ingen fravær registrert',
okLabel: 'Ja, det stemmer',
cancelLabel: 'Nei, det stemmer ikke',
content: (
<div style={{ maxWidth: '35rem' }}>
<Undertittel>Fravær fra jobb</Undertittel>
<p>
Du har oppgitt at du jobber som normalt og ikke har fravær i perioden du søker for. For å ha rett til
pleiepenger må du ha fravær fra jobb fordi du tar vare på og pleier barn. Stemmer det at du ikke har
fravær fra jobb i perioden du søker for?
</p>
</div>
),
});
17 changes: 14 additions & 3 deletions src/app/søknad/oppsummering-step/OppsummeringStep.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,15 @@ import { SKJEMANAVN } from '../../App';
import LegeerklæringAttachmentList from '../../components/legeerklæring-file-list/LegeerklæringFileList';
import routeConfig from '../../config/routeConfig';
import { SøkerdataContextConsumer } from '../../context/SøkerdataContext';
import useLogSøknadInfo from '../../hooks/useLogSøknadInfo';
import { Søkerdata } from '../../types/Søkerdata';
import { SøknadApiData } from '../../types/søknad-api-data/SøknadApiData';
import { SøknadFormData, SøknadFormField } from '../../types/SøknadFormData';
import appSentryLogger from '../../utils/appSentryLogger';
import { getApiDataFromSøknadsdata } from '../../utils/søknadsdataToApiData/getApiDataFromSøknadsdata';
import { navigateTo, relocateToLoginPage } from '../../utils/navigationUtils';
import { getApiDataFromSøknadsdata } from '../../utils/søknadsdataToApiData/getApiDataFromSøknadsdata';
import { validateApiValues } from '../../validation/apiValuesValidation';
import { getArbeidsforhold, harFraværIPerioden } from '../arbeidstid-step/utils/arbeidstidUtils';
import SøknadFormComponents from '../SøknadFormComponents';
import SøknadFormStep from '../SøknadFormStep';
import { useSøknadsdataContext } from '../SøknadsdataContext';
Expand Down Expand Up @@ -63,12 +65,16 @@ const OppsummeringStep = ({ onApplicationSent, values, søknadsdato }: Props) =>
const søknadStepConfig = getSøknadStepConfig(values);

const { logSoknadSent, logSoknadFailed, logUserLoggedOut } = useAmplitudeInstance();
const { logSenderInnSøknadMedIngenFravær } = useLogSøknadInfo();

const sendSoknad = async (apiValues: SøknadApiData, søkerdata: Søkerdata) => {
const sendSoknad = async (apiValues: SøknadApiData, søkerdata: Søkerdata, harArbeidMenIngenFravær: boolean) => {
setSendingInProgress(true);
try {
await sendApplication(apiValues);
await logSoknadSent(SKJEMANAVN);
if (harArbeidMenIngenFravær) {
await logSenderInnSøknadMedIngenFravær();
}
await purge();
setSoknadSent(true);
onApplicationSent(apiValues, søkerdata);
Expand Down Expand Up @@ -98,6 +104,11 @@ const OppsummeringStep = ({ onApplicationSent, values, søknadsdato }: Props) =>
if (søknadsdata === undefined) {
return <div>Det oppstod en feil - søknadsdata mangler</div>;
}

const harArbeidMenIngenFravær: boolean =
søknadsdata.arbeid !== undefined &&
harFraværIPerioden(getArbeidsforhold(søknadsdata.arbeid)) === false;

const {
søker: { fornavn, mellomnavn, etternavn, fødselsnummer },
barn,
Expand Down Expand Up @@ -130,7 +141,7 @@ const OppsummeringStep = ({ onApplicationSent, values, søknadsdato }: Props) =>
if (apiValuesValidationErrors === undefined) {
setTimeout(() => {
// La view oppdatere seg først
sendSoknad(apiValues, søkerdata);
sendSoknad(apiValues, søkerdata, harArbeidMenIngenFravær);
});
} else {
document.getElementsByClassName('validationErrorSummary');
Expand Down
8 changes: 8 additions & 0 deletions src/app/types/ConfirmationDialog.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
export interface ConfirmationDialog {
onConfirm: () => void;
onCancel: () => void;
title: string;
content: React.ReactNode;
okLabel: string;
cancelLabel: string;
}

0 comments on commit b0596ce

Please sign in to comment.