Skip to content

Commit 1f68381

Browse files
committed
IS-1801: Innstilling om stans vurdering aktivitetskrav
1 parent 520e9b0 commit 1f68381

File tree

9 files changed

+113
-51
lines changed

9 files changed

+113
-51
lines changed

src/data/aktivitetskrav/aktivitetskravTypes.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ export type VurderingArsak =
8888
| OppfyltVurderingArsak
8989
| IkkeAktuellArsak;
9090

91-
export interface CreateAktivitetskravVurderingDTO {
91+
export interface NewVurderingDTO {}
92+
93+
export interface CreateAktivitetskravVurderingDTO extends NewVurderingDTO {
9294
status: AktivitetskravStatus;
9395
beskrivelse?: string;
9496
arsaker: VurderingArsak[];
@@ -102,6 +104,13 @@ export interface SendForhandsvarselDTO {
102104
frist: Date;
103105
}
104106

107+
export interface InnstillingOmStansVurderingDTO extends NewVurderingDTO {
108+
status: AktivitetskravStatus.STANS;
109+
stansFom: Date;
110+
beskrivelse?: string;
111+
document?: DocumentComponentDto[];
112+
}
113+
105114
export interface NewAktivitetskravDTO {
106115
previousAktivitetskravUuid: string;
107116
}

src/data/aktivitetskrav/useVurderAktivitetskrav.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useMutation, useQueryClient } from "@tanstack/react-query";
22
import { ISAKTIVITETSKRAV_ROOT } from "@/apiConstants";
3-
import { CreateAktivitetskravVurderingDTO } from "@/data/aktivitetskrav/aktivitetskravTypes";
3+
import { NewVurderingDTO } from "@/data/aktivitetskrav/aktivitetskravTypes";
44
import { post } from "@/api/axios";
55
import { aktivitetskravQueryKeys } from "@/data/aktivitetskrav/aktivitetskravQueryHooks";
66
import { useValgtPersonident } from "@/hooks/useValgtBruker";
@@ -9,9 +9,8 @@ export const useVurderAktivitetskrav = (aktivitetskravUuid: string) => {
99
const personident = useValgtPersonident();
1010
const queryClient = useQueryClient();
1111
const path = `${ISAKTIVITETSKRAV_ROOT}/aktivitetskrav/${aktivitetskravUuid}/vurder`;
12-
const postVurderAktivitetskrav = (
13-
vurdering: CreateAktivitetskravVurderingDTO
14-
) => post(path, vurdering, personident);
12+
const postVurderAktivitetskrav = (vurdering: NewVurderingDTO) =>
13+
post(path, vurdering, personident);
1514

1615
return useMutation({
1716
mutationFn: postVurderAktivitetskrav,

src/mocks/isaktivitetskrav/aktivitetskravMock.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,17 +194,11 @@ const aktivitetskravForhandsvarsel: AktivitetskravDTO = {
194194
varsel: {
195195
uuid: varselUuid,
196196
createdAt: daysFromToday(-2),
197-
svarfrist: daysFromToday(19),
197+
svarfrist: daysFromToday(-2),
198198
document: getForhandsvarselDocument(begrunnelse, daysFromToday(1)),
199199
},
200200
},
201201
],
202202
};
203203

204-
export const aktivitetskravMock = [
205-
aktivitetskravNy,
206-
aktivitetskravAutomatiskOppfylt,
207-
aktivitetskravOppfylt,
208-
aktivitetskravUnntak,
209-
aktivitetskravForhandsvarsel,
210-
];
204+
export const aktivitetskravMock = [aktivitetskravForhandsvarsel];

src/sider/aktivitetskrav/useAktivitetskravNotificationAlert.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ type AktivitetskravStatusSuccess =
77
| AktivitetskravStatus.OPPFYLT
88
| AktivitetskravStatus.UNNTAK
99
| AktivitetskravStatus.IKKE_OPPFYLT
10+
| AktivitetskravStatus.STANS
1011
| AktivitetskravStatus.IKKE_AKTUELL;
1112

1213
export const useAktivitetskravNotificationAlert = () => {

src/sider/aktivitetskrav/vurdering/ForhandsvarselOppsummering.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,15 @@ const texts = {
1010
merInfo: "Husk å sjekke Gosys og Modia for mer informasjon før du vurderer. ",
1111
};
1212

13-
interface ForhandsvarselOppsummeringProps {
13+
interface Props {
1414
varsel: AktivitetskravVarselDTO;
1515
beskrivelse: string | undefined;
1616
}
1717

18-
export const ForhandsvarselOppsummering = ({
18+
export default function ForhandsvarselOppsummering({
1919
varsel,
2020
beskrivelse,
21-
}: ForhandsvarselOppsummeringProps) => {
21+
}: Props) {
2222
const fristDato = tilLesbarDatoMedArUtenManedNavn(varsel.svarfrist);
2323

2424
return (
@@ -38,4 +38,4 @@ export const ForhandsvarselOppsummering = ({
3838
<BodyShort>{texts.merInfo}</BodyShort>
3939
</Panel>
4040
);
41-
};
41+
}
Lines changed: 83 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,116 @@
11
import {
22
AktivitetskravStatus,
3-
CreateAktivitetskravVurderingDTO,
3+
InnstillingOmStansVurderingDTO,
44
} from "@/data/aktivitetskrav/aktivitetskravTypes";
55
import React from "react";
66
import { useVurderAktivitetskrav } from "@/data/aktivitetskrav/useVurderAktivitetskrav";
77
import { SkjemaHeading } from "@/sider/aktivitetskrav/vurdering/SkjemaHeading";
88
import { SkjemaInnsendingFeil } from "@/components/SkjemaInnsendingFeil";
9-
import { VurderAktivitetskravSkjemaProps } from "@/sider/aktivitetskrav/vurdering/vurderAktivitetskravSkjemaTypes";
10-
import { Button } from "@navikt/ds-react";
11-
import { ButtonRow } from "@/components/Layout";
9+
import { Button, DatePicker, Textarea, useDatepicker } from "@navikt/ds-react";
1210
import { useAktivitetskravNotificationAlert } from "@/sider/aktivitetskrav/useAktivitetskravNotificationAlert";
11+
import { useForm } from "react-hook-form";
1312

1413
const texts = {
1514
lagre: "Lagre",
1615
avbryt: "Avbryt",
1716
title: "Ikke oppfylt",
17+
form: {
18+
stansDatoLabel: "Stans gjelder fra (obligatorisk)",
19+
missingStansDato: "Vennligst angi stansdato",
20+
begrunnelseLabel: "Begrunnelse (obligatorisk)",
21+
missingBegrunnelse: "Vennligst angi begrunnelse",
22+
},
1823
subtitle1:
1924
"Innstilling må skrives og sendes til NAY i Gosys. Ved å lagre fjerner du hendelsen fra oversikten.",
2025
};
2126

22-
export const IkkeOppfyltAktivitetskravSkjema = ({
27+
const begrunnelseMaxLength = 5000;
28+
29+
interface FormValues {
30+
stansFom: Date;
31+
begrunnelse: string;
32+
}
33+
34+
interface Props {
35+
aktivitetskravUuid: string;
36+
varselSvarfrist: Date;
37+
}
38+
39+
export default function IkkeOppfyltAktivitetskravSkjema({
2340
aktivitetskravUuid,
24-
}: VurderAktivitetskravSkjemaProps) => {
41+
varselSvarfrist,
42+
}: Props) {
43+
const formMethods = useForm<FormValues>();
44+
const {
45+
register,
46+
watch,
47+
formState: { errors },
48+
handleSubmit,
49+
setValue,
50+
clearErrors,
51+
} = formMethods;
2552
const vurderAktivitetskrav = useVurderAktivitetskrav(aktivitetskravUuid);
2653
const { displayNotification } = useAktivitetskravNotificationAlert();
2754

28-
const submit = () => {
29-
const status = AktivitetskravStatus.IKKE_OPPFYLT;
30-
const createAktivitetskravVurderingDTO: CreateAktivitetskravVurderingDTO = {
31-
status,
32-
arsaker: [],
55+
function submit(values: FormValues) {
56+
const createAktivitetskravVurderingDTO: InnstillingOmStansVurderingDTO = {
57+
status: AktivitetskravStatus.STANS,
58+
stansFom: values.stansFom,
59+
beskrivelse: values.begrunnelse,
3360
};
3461
vurderAktivitetskrav.mutate(createAktivitetskravVurderingDTO, {
3562
onSuccess: () => {
36-
displayNotification(status);
63+
displayNotification(AktivitetskravStatus.STANS);
3764
},
3865
});
39-
};
66+
}
67+
68+
const { datepickerProps, inputProps } = useDatepicker({
69+
fromDate: varselSvarfrist,
70+
onDateChange: (date: Date | undefined) => {
71+
if (!!date) {
72+
setValue("stansFom", date);
73+
clearErrors("stansFom");
74+
}
75+
},
76+
});
4077

4178
return (
42-
<>
79+
<form onSubmit={handleSubmit(submit)}>
4380
<SkjemaHeading title={texts.title} subtitles={[texts.subtitle1]} />
4481
{vurderAktivitetskrav.isError && (
4582
<SkjemaInnsendingFeil error={vurderAktivitetskrav.error} />
4683
)}
47-
<ButtonRow>
48-
<Button loading={vurderAktivitetskrav.isPending} onClick={submit}>
49-
{texts.lagre}
50-
</Button>
51-
</ButtonRow>
52-
</>
84+
<DatePicker {...datepickerProps} strategy="fixed">
85+
<DatePicker.Input
86+
{...inputProps}
87+
size="small"
88+
label={texts.form.stansDatoLabel}
89+
{...register("stansFom", {
90+
required: texts.form.missingStansDato,
91+
})}
92+
error={errors.stansFom?.message}
93+
className="mb-4"
94+
/>
95+
</DatePicker>
96+
97+
<Textarea
98+
{...register("begrunnelse", {
99+
maxLength: begrunnelseMaxLength,
100+
required: texts.form.missingBegrunnelse,
101+
})}
102+
value={watch("begrunnelse")}
103+
label={texts.form.begrunnelseLabel}
104+
error={errors.begrunnelse?.message}
105+
size="small"
106+
minRows={6}
107+
maxLength={begrunnelseMaxLength}
108+
className="mb-4"
109+
/>
110+
111+
<Button loading={vurderAktivitetskrav.isPending} type="submit">
112+
{texts.lagre}
113+
</Button>
114+
</form>
53115
);
54-
};
116+
}

src/sider/aktivitetskrav/vurdering/VurderAktivitetskrav.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { VurderAktivitetskravButtons } from "@/sider/aktivitetskrav/vurdering/Vu
99
import { GjelderOppfolgingstilfelle } from "@/sider/aktivitetskrav/GjelderOppfolgingstilfelle";
1010
import { useOppfolgingstilfellePersonQuery } from "@/data/oppfolgingstilfelle/person/oppfolgingstilfellePersonQueryHooks";
1111
import { AktivitetskravVurderingAlert } from "@/sider/aktivitetskrav/vurdering/AktivitetskravVurderingAlert";
12-
import { ForhandsvarselOppsummering } from "@/sider/aktivitetskrav/vurdering/ForhandsvarselOppsummering";
12+
import ForhandsvarselOppsummering from "@/sider/aktivitetskrav/vurdering/ForhandsvarselOppsummering";
1313
import {
1414
isDateInOppfolgingstilfelle,
1515
OppfolgingstilfelleDTO,

src/sider/aktivitetskrav/vurdering/VurderAktivitetskravTabs.tsx

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { Tabs } from "@navikt/ds-react";
77
import { UnntakAktivitetskravSkjema } from "@/sider/aktivitetskrav/vurdering/UnntakAktivitetskravSkjema";
88
import { OppfyltAktivitetskravSkjema } from "@/sider/aktivitetskrav/vurdering/OppfyltAktivitetskravSkjema";
99
import { SendForhandsvarselSkjema } from "@/sider/aktivitetskrav/vurdering/SendForhandsvarselSkjema";
10-
import { IkkeOppfyltAktivitetskravSkjema } from "@/sider/aktivitetskrav/vurdering/IkkeOppfyltAktivitetskravSkjema";
10+
import IkkeOppfyltAktivitetskravSkjema from "@/sider/aktivitetskrav/vurdering/IkkeOppfyltAktivitetskravSkjema";
1111
import styled from "styled-components";
1212
import { isExpiredForhandsvarsel } from "@/utils/datoUtils";
1313

@@ -44,13 +44,11 @@ const isValidStateForForhandsvarsel = (
4444
);
4545
};
4646

47-
interface VurderAktivitetskravTabsProps {
47+
interface Props {
4848
aktivitetskrav: AktivitetskravDTO;
4949
}
5050

51-
export const VurderAktivitetskravTabs = ({
52-
aktivitetskrav,
53-
}: VurderAktivitetskravTabsProps) => {
51+
export const VurderAktivitetskravTabs = ({ aktivitetskrav }: Props) => {
5452
const latestVurdering = aktivitetskrav.vurderinger[0];
5553
const isIkkeOppfyltTabVisible =
5654
latestVurdering &&
@@ -84,10 +82,11 @@ export const VurderAktivitetskravTabs = ({
8482
<SendForhandsvarselSkjema aktivitetskravUuid={aktivitetskravUuid} />
8583
</Tabs.Panel>
8684
)}
87-
{isIkkeOppfyltTabVisible && (
85+
{isIkkeOppfyltTabVisible && !!latestVurdering.varsel?.svarfrist && (
8886
<Tabs.Panel value={Tab.IKKE_OPPFYLT}>
8987
<IkkeOppfyltAktivitetskravSkjema
9088
aktivitetskravUuid={aktivitetskravUuid}
89+
varselSvarfrist={latestVurdering.varsel?.svarfrist}
9190
/>
9291
</Tabs.Panel>
9392
)}

src/utils/datoUtils.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -298,14 +298,12 @@ export const getWeeksBetween = (date1, date2): number => {
298298
return Math.abs(dayjs(date1).diff(date2, "week"));
299299
};
300300

301-
export const isExpiredForhandsvarsel = (
302-
svarfrist: Date | undefined
303-
): boolean => {
301+
export function isExpiredForhandsvarsel(svarfrist: Date | undefined): boolean {
304302
if (svarfrist) {
305303
const frist = dayjs(svarfrist);
306304
const today = dayjs(new Date());
307305
return frist.isBefore(today, "date");
306+
} else {
307+
return false;
308308
}
309-
310-
return false;
311-
};
309+
}

0 commit comments

Comments
 (0)