Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Vise generell saksbehandlingstid nå frist er utløpt #1620

Merged
merged 7 commits into from
Feb 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 2 additions & 5 deletions apps/dine-pleiepenger/api-mock-server/api-mock-server.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ const helmet = require('helmet');

const server = express();
const søknader = require('./mockdata/soknader.json');
const saker = require('./mockdata/saker.json');

server.use(express.json());

Expand Down Expand Up @@ -49,11 +50,7 @@ const startServer = () => {
});

server.get('/saker', (req, res) => {
res.send([
{
saksbehandlingsFrist: '2024-02-02',
},
]);
res.send(saker);
});

server.get('/saker/saksbehandlingstid', (req, res) => {
Expand Down
363 changes: 363 additions & 0 deletions apps/dine-pleiepenger/api-mock-server/mockdata/saker.json

Large diffs are not rendered by default.

43 changes: 32 additions & 11 deletions apps/dine-pleiepenger/e2e/playwright/tests/svarfrist.test.ts
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
import { Innsynsdata } from '../../../src/types/InnsynData';
import { søkerMockData } from '../mockdata/søker.mock';
import { søknaderMockData } from '../mockdata/søknader.mock';
import { ISODateToDate } from '@navikt/sif-common-utils';
import { test, expect } from '@playwright/test';
import { setupMockRoutes } from '../utils/setup-mock-routes';
import { Sak } from '../../../src/types/Sak';

const sak: Sak = {
saksbehandlingsFrist: ISODateToDate('2021-01-01'),
};
import dayjs from 'dayjs';

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

test('Mottar svarfrist fra api', async ({ page }) => {
test('Svarfrist er i fremtid', async ({ page }) => {
await page.route('**/innsynsdata', async (route) => {
const response: Innsynsdata = {
...defaultInnsynsdata,
saker: [{ sak: { saksbehandlingsFrist: dayjs().add(1, 'day').toDate() } }],
harSak: true,
};
await route.fulfill({ status: 200, body: JSON.stringify(response) });
});
await page.goto('http://localhost:8080/innsyn');
await expect(page.getByText('Du kan forvente svar innen:')).toBeVisible();
});

test('Svarfrist er i dag', async ({ page }) => {
await page.route('**/innsynsdata', async (route) => {
const response: Innsynsdata = {
...defaultInnsynsdata,
saker: [{ sak: { saksbehandlingsFrist: dayjs().toDate() } }],
harSak: true,
};
await route.fulfill({ status: 200, body: JSON.stringify(response) });
});
await page.goto('http://localhost:8080/innsyn');
await expect(page.getByText('Du kan forvente svar innen:')).toBeVisible();
});

test('Svarfrist er i fortid', async ({ page }) => {
await page.route('**/innsynsdata', async (route) => {
const response: Innsynsdata = {
...defaultInnsynsdata,
saker: [sak],
saker: [{ sak: { saksbehandlingsFrist: dayjs().subtract(1, 'day').toDate() } }],
harSak: true,
};
await route.fulfill({ status: 200, body: JSON.stringify(response) });
});
await page.goto('http://localhost:8080/innsyn');
await expect(page.getByText('Du kan forvente svar innen: fredag 1. januar 2021')).toBeVisible();
await expect(page.getByText('Forventet behandlingstid er')).toBeVisible();
});

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

test('Mottar hverken svarfrist eller behandlingstid fra api', async ({ page }) => {
test('Hverken svarfrist eller behandlingstid', async ({ page }) => {
await page.route('**/innsynsdata', async (route) => {
await route.fulfill({ status: 200, body: JSON.stringify(defaultInnsynsdata) });
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@ import { ISODateToDate } from '@navikt/sif-common-utils';
import { Innsynsdata } from '../../../src/types/InnsynData';
import { søkerMockData } from '../mockdata/søker.mock';
import { søknaderMockData } from '../mockdata/søknader.mock';
import { Sak } from '../../../src/types/Sak';
import { Saker } from '../../../src/types/Saker';

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

await page.route('**/innsynsdata', async (route) => {
const response: Innsynsdata = {
saker: [sak],
saker: [saker],
harSak: true,
søker: søkerMockData as any,
mellomlagring: {},
Expand Down
2 changes: 1 addition & 1 deletion apps/dine-pleiepenger/nais/envs/.env.prod
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,6 @@ NEXT_PUBLIC_SYKDOM_I_FAMILIEN_INFO_URL=https://www.nav.no/familie/sykdom-i-famil
NEXT_PUBLIC_ARBEIDSGIVER_PLEIEPENGER_URL=https://www.nav.no/arbeidsgiver/pleiepenger-barn
NEXT_PUBLIC_MINSIDE_DOKUMENTOVERSIKT_URL=https://person.nav.no/mine-saker
NEXT_PUBLIC_UTBETALINGSOVERSIKT_URL=https://tjenester.nav.no/utbetalingsoversikt
NEXT_PUBLIC_FEATURE_HENT_SAKER=off
NEXT_PUBLIC_FEATURE_HENT_SAKER=on
NEXT_PUBLIC_FEATURE_HENT_BEHANDLINGSTID=on

2 changes: 1 addition & 1 deletion apps/dine-pleiepenger/nais/prod-gcp.json
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@
"NEXT_PUBLIC_ARBEIDSGIVER_PLEIEPENGER_URL": "https://www.nav.no/arbeidsgiver/pleiepenger-barn",
"NEXT_PUBLIC_MINSIDE_DOKUMENTOVERSIKT_URL": "https://person.nav.no/mine-saker",
"NEXT_PUBLIC_UTBETALINGSOVERSIKT_URL": "https://tjenester.nav.no/utbetalingsoversikt",
"NEXT_PUBLIC_FEATURE_HENT_SAKER": "off",
"NEXT_PUBLIC_FEATURE_HENT_SAKER": "on",
"NEXT_PUBLIC_FEATURE_HENT_BEHANDLINGSTID": "on"
}
}
2 changes: 1 addition & 1 deletion apps/dine-pleiepenger/playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ export default defineConfig({
NEXT_PUBLIC_ARBEIDSGIVER_PLEIEPENGER_URL: 'https://www.nav.no/arbeidsgiver/pleiepenger-barn',
NEXT_PUBLIC_MINSIDE_DOKUMENTOVERSIKT_URL: 'https://person.dev.nav.no/mine-saker',
NEXT_PUBLIC_UTBETALINGSOVERSIKT_URL: 'https://tjenester.nav.no/utbetalingsoversikt',
NEXT_PUBLIC_FEATURE_HENT_SAKER: 'off',
NEXT_PUBLIC_FEATURE_HENT_SAKER: 'on',
},
},
});
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import dayjs from 'dayjs';
import { withEmptyPage } from '../../storybook/hooks/withEmptyPage';
import Svarfrist from './Svarfrist';

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

export const Default: Story = {
name: 'Med frist',
args: {
frist: new Date(),
frist: dayjs().add(10, 'day').toDate(),
},
};

export const UtenFristMedBehandlingstid: Story = {
name: 'Med 3 ukers behandlingstid',
name: 'Ingen frist',
args: {
saksbehandlingstidUker: 3,
},
};

export const UtenFrist: Story = {
name: 'Uten frist - default 7 uker behandlingstid',
args: {},
export const FristIGår: Story = {
name: 'Frist i går',
args: {
frist: dayjs().subtract(1, 'day').toDate(),
},
};
export const FristPassert: Story = {
name: 'Frist i dag',
args: {
frist: dayjs().toDate(),
},
};
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,22 @@ import { BodyShort, Box, Heading, Link } from '@navikt/ds-react';
import React from 'react';
import { dateFormatter } from '@navikt/sif-common-utils';
import { browserEnv } from '../../utils/env';
import dayjs from 'dayjs';

interface Props {
frist?: Date;
saksbehandlingstidUker?: number;
}

const Svarfrist: React.FunctionComponent<Props> = ({ frist, saksbehandlingstidUker = 7 }) => {
const fristErPassert = frist && dayjs(frist).isBefore(dayjs(), 'day');
return (
<Box>
<Heading size="medium" level="2" className="text-deepblue-800" spacing={true}>
Saksbehandlingstid
</Heading>
<BodyShort as="div" className="bg-deepblue-100 pt-4 pl-6 pr-6 pb-6 rounded">
{frist ? (
{frist && fristErPassert === false ? (
<p className="mb-2">
Du kan forvente svar innen: <br />
<span className="block font-bold first-letter:uppercase">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
res.write(resBuffer, 'binary');
res.end();
} catch (err) {
res.status(500).json({ error: 'Kunne ikke hente dokument', err });
res.status(500).json({ error: 'Kunne ikke hente dokument' });
}
}

Expand Down
4 changes: 2 additions & 2 deletions apps/dine-pleiepenger/src/pages/api/innsynsdata.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
saker,
harSak: saker.length > 0,
};
res.send(innsynsdata);
res.json(innsynsdata);
} catch (err) {
childLogger.error(`Hent innsynsdata feilet: ${err}`);
if (
Expand All @@ -61,7 +61,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
) {
res.status(403).json({ error: 'Ikke tilgang' });
} else {
res.status(500).json({ error: 'Kunne ikke hente innsynsdata', err });
res.status(500).json({ error: 'Kunne ikke hente innsynsdata' });
}
}
}
Expand Down
2 changes: 1 addition & 1 deletion apps/dine-pleiepenger/src/pages/api/mellomlagring.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
} catch (err) {
const childLogger = createChildLogger(getXRequestId(req));
childLogger.error(`Hent mellomlagring feilet: ${err}`);
res.status(500).json({ error: 'Kunne ikke hente mellomlagring', err });
res.status(500).json({ error: 'Kunne ikke hente mellomlagring' });
}
}

Expand Down
6 changes: 3 additions & 3 deletions apps/dine-pleiepenger/src/pages/api/saker.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { createChildLogger } from '@navikt/next-logger';
import axios from 'axios';
import { withAuthenticatedApi } from '../../auth/withAuthentication';
import { fetchSaker } from '../../server/apiService';
import { Sak } from '../../types/Sak';
import { Saker } from '../../types/Saker';
import { getXRequestId } from '../../utils/apiUtils';

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

async function handler(req: NextApiRequest, res: NextApiResponse) {
try {
Expand All @@ -15,7 +15,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
} catch (err) {
const childLogger = createChildLogger(getXRequestId(req));
childLogger.error(`Hent saker feilet: ${err}`);
res.status(500).json({ error: 'Kunne ikke hente saker', err });
res.status(500).json({ error: 'Kunne ikke hente saker' });
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
} catch (err) {
const childLogger = createChildLogger(getXRequestId(req));
childLogger.error(`Hent saksbehandlingstid feilet: ${err}`);
res.status(500).json({ error: 'Kunne ikke hente saksbehandlingstid', err });
res.status(500).json({ error: 'Kunne ikke hente saksbehandlingstid' });
}
}

Expand Down
2 changes: 1 addition & 1 deletion apps/dine-pleiepenger/src/pages/api/soker.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
} catch (err) {
const childLogger = createChildLogger(getXRequestId(req));
childLogger.error(`Hent søker feilet: ${err}`);
res.status(500).json({ error: 'Kunne ikke hente søker', err });
res.status(500).json({ error: 'Kunne ikke hente søker' });
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ export async function handler(req: NextApiRequest, res: NextApiResponse<any>) {
res.write(resBuffer, 'binary');
res.end();
} catch (err) {
res.status(500).json({ error: 'Kunne ikke hente arbeidsgivermelding', err });
res.status(500).json({ error: 'Kunne ikke hente arbeidsgivermelding' });
}
}

Expand Down
2 changes: 1 addition & 1 deletion apps/dine-pleiepenger/src/pages/api/soknader.api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ async function handler(req: NextApiRequest, res: NextApiResponse) {
} catch (err) {
const childLogger = createChildLogger(getXRequestId(req));
childLogger.error(`Hent søknader feilet: ${err}`);
res.status(500).json({ error: 'Kunne ikke hente søknader', err });
res.status(500).json({ error: 'Kunne ikke hente søknader' });
}
}

Expand Down
19 changes: 18 additions & 1 deletion apps/dine-pleiepenger/src/pages/index.page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,23 @@ import Snarveier from '../components/snarveier/Snarveier';
import Svarfrist from '../components/svarfrist/Svarfrist';
import { useInnsynsdataContext } from '../hooks/useInnsynsdataContext';
import { Feature } from '../utils/features';
import { Søknad, Søknadstype } from '../types/Søknad';
import { Sak } from '../server/api-models/SakSchema';

const harSendtInnSøknadEllerEndringsmelding = (søknader: Søknad[]): boolean => {
return søknader.some(
(søknad) =>
søknad.søknadstype === Søknadstype.PP_SYKT_BARN ||
søknad.søknadstype === Søknadstype.PP_SYKT_BARN_ENDRINGSMELDING,
);
};

const getSaksbehandlingsfrist = (søknader: Søknad[], saker: Sak[]): Date | undefined => {
if (saker.length === 1 && harSendtInnSøknadEllerEndringsmelding(søknader)) {
return saker[0].sak.saksbehandlingsFrist;
}
return undefined;
};

function DinePleiepengerPage(): ReactElement {
const {
Expand Down Expand Up @@ -44,7 +61,7 @@ function DinePleiepengerPage(): ReactElement {
</div>
<div className="md:mb-none shrink-0 md:w-72">
<Svarfrist
frist={saker.length > 0 ? saker[0].saksbehandlingsFrist : undefined}
frist={getSaksbehandlingsfrist(søknader, saker)}
saksbehandlingstidUker={saksbehandlingstidUker}
/>
</div>
Expand Down
7 changes: 6 additions & 1 deletion apps/dine-pleiepenger/src/server/api-models/SakSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,5 +4,10 @@ import { parseMaybeDateStringToDate } from '../../utils/jsonParseUtils';
export type Sak = z.infer<typeof SakSchema>;

export const SakSchema = z.object({
saksbehandlingsFrist: z.union([z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()), z.undefined()]),
sak: z.object({
saksbehandlingsFrist: z.union([
z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()),
z.undefined(),
]),
}),
});
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import dayjs from 'dayjs';
export const withInnsynsdata = (Story) => (
<InnsynsdataContextProvider
innsynsdata={{
saker: [{ saksbehandlingsFrist: dayjs().add(5, 'weeks').toDate() }],
saker: [{ sak: { saksbehandlingsFrist: dayjs().add(5, 'weeks').toDate() } }],
harSak: true,
søker: mockSøker as any as Søker,
mellomlagring: {},
Expand Down
4 changes: 2 additions & 2 deletions apps/dine-pleiepenger/src/types/InnsynData.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import { Søker } from '../server/api-models/SøkerSchema';
import { Mellomlagringer } from './Mellomlagring';
import { Sak } from './Sak';
import { Saker } from './Saker';
import { Søknad } from './Søknad';

export interface Innsynsdata {
søker: Søker;
søknader: Søknad[];
mellomlagring: Mellomlagringer;
saker: Sak[];
saker: Saker[];
saksbehandlingstidUker?: number;
harSak: boolean;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { z } from 'zod';
import { SakSchema } from '../server/api-models/SakSchema';

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