Skip to content

Commit 82f49f8

Browse files
authored
Vise generell saksbehandlingstid nå frist er utløpt (#1620)
* Vise generell saksbehandlingstid nå frist er utløpt * Oppdatere tester + cleanup * Fjerne mock * Fjerne error fra response * Skjule frist ved ingen søknader * Ekstra sjekk på at bruker har søknad
1 parent a47684c commit 82f49f8

22 files changed

+463
-46
lines changed

apps/dine-pleiepenger/api-mock-server/api-mock-server.js

+2-5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ const helmet = require('helmet');
44

55
const server = express();
66
const søknader = require('./mockdata/soknader.json');
7+
const saker = require('./mockdata/saker.json');
78

89
server.use(express.json());
910

@@ -49,11 +50,7 @@ const startServer = () => {
4950
});
5051

5152
server.get('/saker', (req, res) => {
52-
res.send([
53-
{
54-
saksbehandlingsFrist: '2024-02-02',
55-
},
56-
]);
53+
res.send(saker);
5754
});
5855

5956
server.get('/saker/saksbehandlingstid', (req, res) => {

apps/dine-pleiepenger/api-mock-server/mockdata/saker.json

+363
Large diffs are not rendered by default.

apps/dine-pleiepenger/e2e/playwright/tests/svarfrist.test.ts

+32-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,9 @@
11
import { Innsynsdata } from '../../../src/types/InnsynData';
22
import { søkerMockData } from '../mockdata/søker.mock';
33
import { søknaderMockData } from '../mockdata/søknader.mock';
4-
import { ISODateToDate } from '@navikt/sif-common-utils';
54
import { test, expect } from '@playwright/test';
65
import { setupMockRoutes } from '../utils/setup-mock-routes';
7-
import { Sak } from '../../../src/types/Sak';
8-
9-
const sak: Sak = {
10-
saksbehandlingsFrist: ISODateToDate('2021-01-01'),
11-
};
6+
import dayjs from 'dayjs';
127

138
const defaultInnsynsdata: Innsynsdata = {
149
saker: [],
@@ -22,20 +17,46 @@ test.beforeEach(async ({ page }) => {
2217
await setupMockRoutes(page);
2318
});
2419

25-
test('Mottar svarfrist fra api', async ({ page }) => {
20+
test('Svarfrist er i fremtid', async ({ page }) => {
21+
await page.route('**/innsynsdata', async (route) => {
22+
const response: Innsynsdata = {
23+
...defaultInnsynsdata,
24+
saker: [{ sak: { saksbehandlingsFrist: dayjs().add(1, 'day').toDate() } }],
25+
harSak: true,
26+
};
27+
await route.fulfill({ status: 200, body: JSON.stringify(response) });
28+
});
29+
await page.goto('http://localhost:8080/innsyn');
30+
await expect(page.getByText('Du kan forvente svar innen:')).toBeVisible();
31+
});
32+
33+
test('Svarfrist er i dag', async ({ page }) => {
34+
await page.route('**/innsynsdata', async (route) => {
35+
const response: Innsynsdata = {
36+
...defaultInnsynsdata,
37+
saker: [{ sak: { saksbehandlingsFrist: dayjs().toDate() } }],
38+
harSak: true,
39+
};
40+
await route.fulfill({ status: 200, body: JSON.stringify(response) });
41+
});
42+
await page.goto('http://localhost:8080/innsyn');
43+
await expect(page.getByText('Du kan forvente svar innen:')).toBeVisible();
44+
});
45+
46+
test('Svarfrist er i fortid', async ({ page }) => {
2647
await page.route('**/innsynsdata', async (route) => {
2748
const response: Innsynsdata = {
2849
...defaultInnsynsdata,
29-
saker: [sak],
50+
saker: [{ sak: { saksbehandlingsFrist: dayjs().subtract(1, 'day').toDate() } }],
3051
harSak: true,
3152
};
3253
await route.fulfill({ status: 200, body: JSON.stringify(response) });
3354
});
3455
await page.goto('http://localhost:8080/innsyn');
35-
await expect(page.getByText('Du kan forvente svar innen: fredag 1. januar 2021')).toBeVisible();
56+
await expect(page.getByText('Forventet behandlingstid er')).toBeVisible();
3657
});
3758

38-
test('Mottar ikke svarfrist men behandlingstid fra api', async ({ page }) => {
59+
test('Ingen svarfrist, men behandlingstid', async ({ page }) => {
3960
await page.route('**/innsynsdata', async (route) => {
4061
const response: Innsynsdata = {
4162
...defaultInnsynsdata,
@@ -47,7 +68,7 @@ test('Mottar ikke svarfrist men behandlingstid fra api', async ({ page }) => {
4768
await expect(page.getByText('Forventet behandlingstid er 3 uker fra vi fikk søknaden din.')).toBeVisible();
4869
});
4970

50-
test('Mottar hverken svarfrist eller behandlingstid fra api', async ({ page }) => {
71+
test('Hverken svarfrist eller behandlingstid', async ({ page }) => {
5172
await page.route('**/innsynsdata', async (route) => {
5273
await route.fulfill({ status: 200, body: JSON.stringify(defaultInnsynsdata) });
5374
});

apps/dine-pleiepenger/e2e/playwright/utils/setup-mock-routes.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { ISODateToDate } from '@navikt/sif-common-utils';
22
import { Innsynsdata } from '../../../src/types/InnsynData';
33
import { søkerMockData } from '../mockdata/søker.mock';
44
import { søknaderMockData } from '../mockdata/søknader.mock';
5-
import { Sak } from '../../../src/types/Sak';
5+
import { Saker } from '../../../src/types/Saker';
66

7-
const sak: Sak = {
8-
saksbehandlingsFrist: ISODateToDate('2021-01-01'),
7+
const saker: Saker = {
8+
sak: {
9+
saksbehandlingsFrist: ISODateToDate('2021-01-01'),
10+
},
911
};
1012
export const setupMockRoutes = async (page: any) => {
1113
await page.route('https://login.nav.no/**', async (route) => {
@@ -20,7 +22,7 @@ export const setupMockRoutes = async (page: any) => {
2022

2123
await page.route('**/innsynsdata', async (route) => {
2224
const response: Innsynsdata = {
23-
saker: [sak],
25+
saker: [saker],
2426
harSak: true,
2527
søker: søkerMockData as any,
2628
mellomlagring: {},

apps/dine-pleiepenger/nais/envs/.env.prod

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,6 @@ NEXT_PUBLIC_SYKDOM_I_FAMILIEN_INFO_URL=https://www.nav.no/familie/sykdom-i-famil
2626
NEXT_PUBLIC_ARBEIDSGIVER_PLEIEPENGER_URL=https://www.nav.no/arbeidsgiver/pleiepenger-barn
2727
NEXT_PUBLIC_MINSIDE_DOKUMENTOVERSIKT_URL=https://person.nav.no/mine-saker
2828
NEXT_PUBLIC_UTBETALINGSOVERSIKT_URL=https://tjenester.nav.no/utbetalingsoversikt
29-
NEXT_PUBLIC_FEATURE_HENT_SAKER=off
29+
NEXT_PUBLIC_FEATURE_HENT_SAKER=on
3030
NEXT_PUBLIC_FEATURE_HENT_BEHANDLINGSTID=on
3131

apps/dine-pleiepenger/nais/prod-gcp.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
"NEXT_PUBLIC_ARBEIDSGIVER_PLEIEPENGER_URL": "https://www.nav.no/arbeidsgiver/pleiepenger-barn",
4040
"NEXT_PUBLIC_MINSIDE_DOKUMENTOVERSIKT_URL": "https://person.nav.no/mine-saker",
4141
"NEXT_PUBLIC_UTBETALINGSOVERSIKT_URL": "https://tjenester.nav.no/utbetalingsoversikt",
42-
"NEXT_PUBLIC_FEATURE_HENT_SAKER": "off",
42+
"NEXT_PUBLIC_FEATURE_HENT_SAKER": "on",
4343
"NEXT_PUBLIC_FEATURE_HENT_BEHANDLINGSTID": "on"
4444
}
4545
}

apps/dine-pleiepenger/playwright.config.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ export default defineConfig({
5757
NEXT_PUBLIC_ARBEIDSGIVER_PLEIEPENGER_URL: 'https://www.nav.no/arbeidsgiver/pleiepenger-barn',
5858
NEXT_PUBLIC_MINSIDE_DOKUMENTOVERSIKT_URL: 'https://person.dev.nav.no/mine-saker',
5959
NEXT_PUBLIC_UTBETALINGSOVERSIKT_URL: 'https://tjenester.nav.no/utbetalingsoversikt',
60-
NEXT_PUBLIC_FEATURE_HENT_SAKER: 'off',
60+
NEXT_PUBLIC_FEATURE_HENT_SAKER: 'on',
6161
},
6262
},
6363
});

apps/dine-pleiepenger/src/components/svarfrist/Svarfrist.stories.tsx

+15-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import dayjs from 'dayjs';
12
import { withEmptyPage } from '../../storybook/hooks/withEmptyPage';
23
import Svarfrist from './Svarfrist';
34

@@ -15,19 +16,28 @@ export default meta;
1516
type Story = StoryObj<typeof Svarfrist>;
1617

1718
export const Default: Story = {
19+
name: 'Med frist',
1820
args: {
19-
frist: new Date(),
21+
frist: dayjs().add(10, 'day').toDate(),
2022
},
2123
};
2224

2325
export const UtenFristMedBehandlingstid: Story = {
24-
name: 'Med 3 ukers behandlingstid',
26+
name: 'Ingen frist',
2527
args: {
2628
saksbehandlingstidUker: 3,
2729
},
2830
};
2931

30-
export const UtenFrist: Story = {
31-
name: 'Uten frist - default 7 uker behandlingstid',
32-
args: {},
32+
export const FristIGår: Story = {
33+
name: 'Frist i går',
34+
args: {
35+
frist: dayjs().subtract(1, 'day').toDate(),
36+
},
37+
};
38+
export const FristPassert: Story = {
39+
name: 'Frist i dag',
40+
args: {
41+
frist: dayjs().toDate(),
42+
},
3343
};

apps/dine-pleiepenger/src/components/svarfrist/Svarfrist.tsx

+3-1
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,22 @@ import { BodyShort, Box, Heading, Link } from '@navikt/ds-react';
33
import React from 'react';
44
import { dateFormatter } from '@navikt/sif-common-utils';
55
import { browserEnv } from '../../utils/env';
6+
import dayjs from 'dayjs';
67

78
interface Props {
89
frist?: Date;
910
saksbehandlingstidUker?: number;
1011
}
1112

1213
const Svarfrist: React.FunctionComponent<Props> = ({ frist, saksbehandlingstidUker = 7 }) => {
14+
const fristErPassert = frist && dayjs(frist).isBefore(dayjs(), 'day');
1315
return (
1416
<Box>
1517
<Heading size="medium" level="2" className="text-deepblue-800" spacing={true}>
1618
Saksbehandlingstid
1719
</Heading>
1820
<BodyShort as="div" className="bg-deepblue-100 pt-4 pl-6 pr-6 pb-6 rounded">
19-
{frist ? (
21+
{frist && fristErPassert === false ? (
2022
<p className="mb-2">
2123
Du kan forvente svar innen: <br />
2224
<span className="block font-bold first-letter:uppercase">

apps/dine-pleiepenger/src/pages/api/dokument/[...info].api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
3030
res.write(resBuffer, 'binary');
3131
res.end();
3232
} catch (err) {
33-
res.status(500).json({ error: 'Kunne ikke hente dokument', err });
33+
res.status(500).json({ error: 'Kunne ikke hente dokument' });
3434
}
3535
}
3636

apps/dine-pleiepenger/src/pages/api/innsynsdata.api.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
5252
saker,
5353
harSak: saker.length > 0,
5454
};
55-
res.send(innsynsdata);
55+
res.json(innsynsdata);
5656
} catch (err) {
5757
childLogger.error(`Hent innsynsdata feilet: ${err}`);
5858
if (
@@ -61,7 +61,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
6161
) {
6262
res.status(403).json({ error: 'Ikke tilgang' });
6363
} else {
64-
res.status(500).json({ error: 'Kunne ikke hente innsynsdata', err });
64+
res.status(500).json({ error: 'Kunne ikke hente innsynsdata' });
6565
}
6666
}
6767
}

apps/dine-pleiepenger/src/pages/api/mellomlagring.api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
1515
} catch (err) {
1616
const childLogger = createChildLogger(getXRequestId(req));
1717
childLogger.error(`Hent mellomlagring feilet: ${err}`);
18-
res.status(500).json({ error: 'Kunne ikke hente mellomlagring', err });
18+
res.status(500).json({ error: 'Kunne ikke hente mellomlagring' });
1919
}
2020
}
2121

apps/dine-pleiepenger/src/pages/api/saker.api.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ import { createChildLogger } from '@navikt/next-logger';
33
import axios from 'axios';
44
import { withAuthenticatedApi } from '../../auth/withAuthentication';
55
import { fetchSaker } from '../../server/apiService';
6-
import { Sak } from '../../types/Sak';
6+
import { Saker } from '../../types/Saker';
77
import { getXRequestId } from '../../utils/apiUtils';
88

9-
export const sakerFetcher = async (url: string): Promise<Sak[]> => axios.get(url).then((res) => res.data);
9+
export const sakerFetcher = async (url: string): Promise<Saker[]> => axios.get(url).then((res) => res.data);
1010

1111
async function handler(req: NextApiRequest, res: NextApiResponse) {
1212
try {
@@ -15,7 +15,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
1515
} catch (err) {
1616
const childLogger = createChildLogger(getXRequestId(req));
1717
childLogger.error(`Hent saker feilet: ${err}`);
18-
res.status(500).json({ error: 'Kunne ikke hente saker', err });
18+
res.status(500).json({ error: 'Kunne ikke hente saker' });
1919
}
2020
}
2121

apps/dine-pleiepenger/src/pages/api/saksbehandlingstid.api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
1616
} catch (err) {
1717
const childLogger = createChildLogger(getXRequestId(req));
1818
childLogger.error(`Hent saksbehandlingstid feilet: ${err}`);
19-
res.status(500).json({ error: 'Kunne ikke hente saksbehandlingstid', err });
19+
res.status(500).json({ error: 'Kunne ikke hente saksbehandlingstid' });
2020
}
2121
}
2222

apps/dine-pleiepenger/src/pages/api/soker.api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
1414
} catch (err) {
1515
const childLogger = createChildLogger(getXRequestId(req));
1616
childLogger.error(`Hent søker feilet: ${err}`);
17-
res.status(500).json({ error: 'Kunne ikke hente søker', err });
17+
res.status(500).json({ error: 'Kunne ikke hente søker' });
1818
}
1919
}
2020

apps/dine-pleiepenger/src/pages/api/soknad/[id]/arbeidsgivermelding.api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
2929
res.write(resBuffer, 'binary');
3030
res.end();
3131
} catch (err) {
32-
res.status(500).json({ error: 'Kunne ikke hente arbeidsgivermelding', err });
32+
res.status(500).json({ error: 'Kunne ikke hente arbeidsgivermelding' });
3333
}
3434
}
3535

apps/dine-pleiepenger/src/pages/api/soknader.api.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
1616
} catch (err) {
1717
const childLogger = createChildLogger(getXRequestId(req));
1818
childLogger.error(`Hent søknader feilet: ${err}`);
19-
res.status(500).json({ error: 'Kunne ikke hente søknader', err });
19+
res.status(500).json({ error: 'Kunne ikke hente søknader' });
2020
}
2121
}
2222

apps/dine-pleiepenger/src/pages/index.page.tsx

+18-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,23 @@ import Snarveier from '../components/snarveier/Snarveier';
1111
import Svarfrist from '../components/svarfrist/Svarfrist';
1212
import { useInnsynsdataContext } from '../hooks/useInnsynsdataContext';
1313
import { Feature } from '../utils/features';
14+
import { Søknad, Søknadstype } from '../types/Søknad';
15+
import { Sak } from '../server/api-models/SakSchema';
16+
17+
const harSendtInnSøknadEllerEndringsmelding = (søknader: Søknad[]): boolean => {
18+
return søknader.some(
19+
(søknad) =>
20+
søknad.søknadstype === Søknadstype.PP_SYKT_BARN ||
21+
søknad.søknadstype === Søknadstype.PP_SYKT_BARN_ENDRINGSMELDING,
22+
);
23+
};
24+
25+
const getSaksbehandlingsfrist = (søknader: Søknad[], saker: Sak[]): Date | undefined => {
26+
if (saker.length === 1 && harSendtInnSøknadEllerEndringsmelding(søknader)) {
27+
return saker[0].sak.saksbehandlingsFrist;
28+
}
29+
return undefined;
30+
};
1431

1532
function DinePleiepengerPage(): ReactElement {
1633
const {
@@ -44,7 +61,7 @@ function DinePleiepengerPage(): ReactElement {
4461
</div>
4562
<div className="md:mb-none shrink-0 md:w-72">
4663
<Svarfrist
47-
frist={saker.length > 0 ? saker[0].saksbehandlingsFrist : undefined}
64+
frist={getSaksbehandlingsfrist(søknader, saker)}
4865
saksbehandlingstidUker={saksbehandlingstidUker}
4966
/>
5067
</div>

apps/dine-pleiepenger/src/server/api-models/SakSchema.ts

+6-1
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,10 @@ import { parseMaybeDateStringToDate } from '../../utils/jsonParseUtils';
44
export type Sak = z.infer<typeof SakSchema>;
55

66
export const SakSchema = z.object({
7-
saksbehandlingsFrist: z.union([z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()), z.undefined()]),
7+
sak: z.object({
8+
saksbehandlingsFrist: z.union([
9+
z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()),
10+
z.undefined(),
11+
]),
12+
}),
813
});

apps/dine-pleiepenger/src/storybook/hooks/withInnsynsdata.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import dayjs from 'dayjs';
88
export const withInnsynsdata = (Story) => (
99
<InnsynsdataContextProvider
1010
innsynsdata={{
11-
saker: [{ saksbehandlingsFrist: dayjs().add(5, 'weeks').toDate() }],
11+
saker: [{ sak: { saksbehandlingsFrist: dayjs().add(5, 'weeks').toDate() } }],
1212
harSak: true,
1313
søker: mockSøker as any as Søker,
1414
mellomlagring: {},
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
import { Søker } from '../server/api-models/SøkerSchema';
22
import { Mellomlagringer } from './Mellomlagring';
3-
import { Sak } from './Sak';
3+
import { Saker } from './Saker';
44
import { Søknad } from './Søknad';
55

66
export interface Innsynsdata {
77
søker: Søker;
88
søknader: Søknad[];
99
mellomlagring: Mellomlagringer;
10-
saker: Sak[];
10+
saker: Saker[];
1111
saksbehandlingstidUker?: number;
1212
harSak: boolean;
1313
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
import { z } from 'zod';
22
import { SakSchema } from '../server/api-models/SakSchema';
33

4-
export type Sak = z.infer<typeof SakSchema>;
4+
export type Saker = z.infer<typeof SakSchema>;

0 commit comments

Comments
 (0)