From d356f0bc781585f24ed1acfafb560a13bd4d2cca Mon Sep 17 00:00:00 2001 From: frodehansen2 Date: Fri, 15 Dec 2023 13:43:07 +0100 Subject: [PATCH] Dine pleiepenger - forenkling og zod justering (#1477) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Justere zod validering på søknader.json * Changeset --- .changeset/wet-sloths-listen.md | 5 ++++ .../S\303\270knadContent.tsx" | 4 ++-- .../S\303\270knadTitle.tsx" | 7 +++--- .../src/pages/api/innsynsdata.api.ts | 10 ++++---- .../server/api-models/ArbeidsgiverSchema.ts | 8 +++++++ .../server/api-models/ArbeidsgivereSchema.ts | 12 ++++++++++ .../server/api-models/OrganisasjonSchema.ts | 10 ++++++++ .../server/api-models/S\303\270knadSchema.ts" | 13 +--------- .../src/types/Arbeidsgiver.ts | 24 +------------------ .../src/types/Arbeidsgivere.ts | 7 +++--- apps/dine-pleiepenger/src/types/InnsynData.ts | 2 +- .../src/types/Organisasjon.ts | 12 ++++------ .../src/utils/s\303\270knadUtils.ts" | 19 ++------------- 13 files changed, 57 insertions(+), 76 deletions(-) create mode 100644 .changeset/wet-sloths-listen.md create mode 100644 apps/dine-pleiepenger/src/server/api-models/ArbeidsgiverSchema.ts create mode 100644 apps/dine-pleiepenger/src/server/api-models/ArbeidsgivereSchema.ts create mode 100644 apps/dine-pleiepenger/src/server/api-models/OrganisasjonSchema.ts diff --git a/.changeset/wet-sloths-listen.md b/.changeset/wet-sloths-listen.md new file mode 100644 index 0000000000..eb6c5e4248 --- /dev/null +++ b/.changeset/wet-sloths-listen.md @@ -0,0 +1,5 @@ +--- +"@navikt/dine-pleiepenger": minor +--- + +Justere ZOD validering og henting av søknadsinformasjon. Gå over til å bruke opprettetDato for visning av mottatt dato. diff --git "a/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadContent.tsx" "b/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadContent.tsx" index 1f1201e760..8f6dd09441 100644 --- "a/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadContent.tsx" +++ "b/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadContent.tsx" @@ -35,8 +35,8 @@ const SøknadContent: React.FunctionComponent = ({ søknad }) => { const intl = useIntl(); const harArbeidsgiver = () => { - if ('arbeidsgivere' in søknad.søknad) { - const arbeidsgivere = søknad.søknad.arbeidsgivere; + if (søknad.søknadstype === Søknadstype.PP_SYKT_BARN) { + const { arbeidsgivere } = søknad.søknad; if (!Array.isArray(arbeidsgivere)) { return arbeidsgivere.organisasjoner && arbeidsgivere.organisasjoner.length > 0; } else { diff --git "a/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadTitle.tsx" "b/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadTitle.tsx" index 0e9ea94e6f..3977f94822 100644 --- "a/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadTitle.tsx" +++ "b/apps/dine-pleiepenger/src/components/s\303\270knad-liste/S\303\270knadTitle.tsx" @@ -3,14 +3,13 @@ import React from 'react'; import { FormattedMessage } from 'react-intl'; import { Task } from '@navikt/ds-icons'; import { Søknad } from '../../types/Søknad'; -import { formatSøknadMottattDato, getSøknadMottattDato } from '../../utils/søknadUtils'; +import { formatSøknadOpprettetDato } from '../../utils/søknadUtils'; interface Props { søknad: Søknad; } const SøknadTitle: React.FunctionComponent = ({ søknad }) => { - const søknadMottattDato = getSøknadMottattDato(søknad); return (
@@ -21,9 +20,9 @@ const SøknadTitle: React.FunctionComponent = ({ søknad }) => {
- {søknadMottattDato ? ( + {søknad.opprettet ? ( - Mottatt {formatSøknadMottattDato(søknadMottattDato)} + Mottatt {formatSøknadOpprettetDato(søknad.opprettet)} ) : null} diff --git a/apps/dine-pleiepenger/src/pages/api/innsynsdata.api.ts b/apps/dine-pleiepenger/src/pages/api/innsynsdata.api.ts index 16aa7a6aed..3e1640ce0f 100644 --- a/apps/dine-pleiepenger/src/pages/api/innsynsdata.api.ts +++ b/apps/dine-pleiepenger/src/pages/api/innsynsdata.api.ts @@ -12,17 +12,16 @@ export const innsynsdataFetcher = async (url: string): Promise => a async function handler(req: NextApiRequest, res: NextApiResponse) { const childLogger = createChildLogger(getXRequestId(req)); + childLogger.info(`Henter innsynsdata`); try { /** Hent søker først for å se om bruker har tilgang */ const søker = await fetchSøker(req); - const hentSvarfrist = Feature.HENT_SVARFRIST; - /** Bruker har tilgang, hent resten av informasjonen */ const [søknader, mellomlagring, svarfrist] = await Promise.allSettled([ fetchSøknader(req), fetchMellomlagringer(req), - hentSvarfrist ? fetchSvarfrist(req) : Promise.resolve({ frist: undefined }), + Feature.HENT_SVARFRIST ? fetchSvarfrist(req) : Promise.resolve({ frist: undefined }), ]); if (søknader.status === 'rejected') { @@ -31,12 +30,13 @@ async function handler(req: NextApiRequest, res: NextApiResponse) { ); } - res.send({ + const innsynsdata: Innsynsdata = { søker, søknader: søknader.status === 'fulfilled' ? søknader.value.sort(sortSøknadEtterOpprettetDato) : [], mellomlagring: mellomlagring.status === 'fulfilled' ? mellomlagring.value : {}, svarfrist: svarfrist.status === 'fulfilled' ? svarfrist.value.frist : undefined, - }); + }; + res.send(innsynsdata); } catch (err) { childLogger.error(`Hent innsynsdata feilet: ${err}`); if (err.response.status === HttpStatusCode.Forbidden) { diff --git a/apps/dine-pleiepenger/src/server/api-models/ArbeidsgiverSchema.ts b/apps/dine-pleiepenger/src/server/api-models/ArbeidsgiverSchema.ts new file mode 100644 index 0000000000..68994739b2 --- /dev/null +++ b/apps/dine-pleiepenger/src/server/api-models/ArbeidsgiverSchema.ts @@ -0,0 +1,8 @@ +import { z } from 'zod'; + +export const ArbeidsgiverSchema = z.object({ + erAnsatt: z.boolean(), + navn: z.string(), + organisasjonsnummer: z.string(), + sluttetFørSøknadsperiode: z.union([z.undefined(), z.boolean()]), +}); diff --git a/apps/dine-pleiepenger/src/server/api-models/ArbeidsgivereSchema.ts b/apps/dine-pleiepenger/src/server/api-models/ArbeidsgivereSchema.ts new file mode 100644 index 0000000000..5b878ecfae --- /dev/null +++ b/apps/dine-pleiepenger/src/server/api-models/ArbeidsgivereSchema.ts @@ -0,0 +1,12 @@ +import { z } from 'zod'; +import { ArbeidsgiverSchema } from './ArbeidsgiverSchema'; +import { OrganisasjonSchema } from './OrganisasjonSchema'; + +export const OrganisasjonerSchema = z.object({ + organisasjoner: z.array(OrganisasjonSchema), +}); + +export const ArbeidsgivereSchema = z.union([z.array(ArbeidsgiverSchema), OrganisasjonerSchema]); + +export type Arbeidsgiver = z.infer; +export type Arbeidsgivere = z.infer; diff --git a/apps/dine-pleiepenger/src/server/api-models/OrganisasjonSchema.ts b/apps/dine-pleiepenger/src/server/api-models/OrganisasjonSchema.ts new file mode 100644 index 0000000000..b87841b8ff --- /dev/null +++ b/apps/dine-pleiepenger/src/server/api-models/OrganisasjonSchema.ts @@ -0,0 +1,10 @@ +import { z } from 'zod'; + +export const OrganisasjonSchema = z.object({ + navn: z.string(), + skalJobbe: z.boolean(), + skalJobbeProsent: z.number(), + vetIkkeEkstrainfo: z.union([z.string(), z.null(), z.undefined()]), + jobberNormaltTimer: z.number(), + organisasjonsnummer: z.string(), +}); diff --git "a/apps/dine-pleiepenger/src/server/api-models/S\303\270knadSchema.ts" "b/apps/dine-pleiepenger/src/server/api-models/S\303\270knadSchema.ts" index 306c34a74b..9768537b7a 100644 --- "a/apps/dine-pleiepenger/src/server/api-models/S\303\270knadSchema.ts" +++ "b/apps/dine-pleiepenger/src/server/api-models/S\303\270knadSchema.ts" @@ -1,6 +1,6 @@ import { z } from 'zod'; import { parseMaybeDateStringToDate } from '../../utils/jsonParseUtils'; -import { ArbeidsgivereSchema } from '../../types/Arbeidsgiver'; +import { ArbeidsgivereSchema } from './ArbeidsgivereSchema'; export enum Søknadsstatus { MOTTATT = 'MOTTATT', @@ -29,18 +29,9 @@ const SøknadDokumentSchema = z.object({ }); const PleiepengerSøknadInfoSchema = z.object({ - fraOgMed: z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()), - tilOgMed: z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()), - mottatt: z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()), arbeidsgivere: ArbeidsgivereSchema, }); -const PleiepengerEndringsmeldingInfoSchema = z.object({}); - -const PleiepengerEttersendelseInfo = z.object({ - mottatt: z.preprocess((val) => parseMaybeDateStringToDate(val), z.date()), -}); - const SøknadBaseSchema = z.object({ søknadId: z.string(), status: z.nativeEnum(Søknadsstatus), @@ -58,12 +49,10 @@ const PleiepengerSøknadSchema = SøknadBaseSchema.extend({ const EndringsmeldingSchema = SøknadBaseSchema.extend({ søknadstype: z.literal(Søknadstype.PP_SYKT_BARN_ENDRINGSMELDING), - søknad: PleiepengerEndringsmeldingInfoSchema, }); const EttersendelseSchema = SøknadBaseSchema.extend({ søknadstype: z.literal(Søknadstype.PP_ETTERSENDELSE), - søknad: PleiepengerEttersendelseInfo, }); const SøknadSchema = z.discriminatedUnion('søknadstype', [ diff --git a/apps/dine-pleiepenger/src/types/Arbeidsgiver.ts b/apps/dine-pleiepenger/src/types/Arbeidsgiver.ts index 9966398322..2dd5f4d44a 100644 --- a/apps/dine-pleiepenger/src/types/Arbeidsgiver.ts +++ b/apps/dine-pleiepenger/src/types/Arbeidsgiver.ts @@ -1,26 +1,4 @@ import { z } from 'zod'; - -export const ArbeidsgiverSchema = z.object({ - erAnsatt: z.boolean(), - navn: z.string(), - organisasjonsnummer: z.string(), - sluttetFørSøknadsperiode: z.union([z.undefined(), z.boolean()]), -}); - -const OrganisasjonSchema = z.object({ - navn: z.string(), - skalJobbe: z.string(), - skalJobbeProsent: z.number(), - vetIkkeEkstrainfo: z.union([z.string(), z.null(), z.undefined()]), - jobberNormaltTimer: z.number(), - organisasjonsnummer: z.string(), -}); - -export const OrganisasjonerSchema = z.object({ - organisasjoner: z.array(OrganisasjonSchema), -}); - -export const ArbeidsgivereSchema = z.union([z.array(ArbeidsgiverSchema), OrganisasjonerSchema, z.any()]); +import { ArbeidsgiverSchema } from '../server/api-models/ArbeidsgiverSchema'; export type Arbeidsgiver = z.infer; -export type Arbeidsgivere = z.infer; diff --git a/apps/dine-pleiepenger/src/types/Arbeidsgivere.ts b/apps/dine-pleiepenger/src/types/Arbeidsgivere.ts index 33ac69c0bc..e6ffd04453 100644 --- a/apps/dine-pleiepenger/src/types/Arbeidsgivere.ts +++ b/apps/dine-pleiepenger/src/types/Arbeidsgivere.ts @@ -1,5 +1,4 @@ -import { Organisasjon } from './Organisasjon'; +import { z } from 'zod'; +import { ArbeidsgivereSchema } from '../server/api-models/ArbeidsgivereSchema'; -export interface Arbeidsgivere { - organisasjoner: Organisasjon[]; -} +export type Arbeidsgivere = z.infer; diff --git a/apps/dine-pleiepenger/src/types/InnsynData.ts b/apps/dine-pleiepenger/src/types/InnsynData.ts index e2c67f83b0..53fe60e33a 100644 --- a/apps/dine-pleiepenger/src/types/InnsynData.ts +++ b/apps/dine-pleiepenger/src/types/InnsynData.ts @@ -6,5 +6,5 @@ export interface Innsynsdata { søker: Søker; søknader: Søknad[]; mellomlagring: Mellomlagringer; - svarfrist: Date; + svarfrist?: Date; } diff --git a/apps/dine-pleiepenger/src/types/Organisasjon.ts b/apps/dine-pleiepenger/src/types/Organisasjon.ts index 2df16be9af..2b59692707 100644 --- a/apps/dine-pleiepenger/src/types/Organisasjon.ts +++ b/apps/dine-pleiepenger/src/types/Organisasjon.ts @@ -1,8 +1,4 @@ -export interface Organisasjon { - navn: string; - skalJobbe: string; - skalJobbeProsent: number; - vetIkkeEkstrainfo?: string | null; - jobberNormaltTimer: number; - organisasjonsnummer: string; -} +import { z } from 'zod'; +import { OrganisasjonSchema } from '../server/api-models/OrganisasjonSchema'; + +export type Organisasjon = z.infer; diff --git "a/apps/dine-pleiepenger/src/utils/s\303\270knadUtils.ts" "b/apps/dine-pleiepenger/src/utils/s\303\270knadUtils.ts" index 1170bfa9b7..cdca13f53e 100644 --- "a/apps/dine-pleiepenger/src/utils/s\303\270knadUtils.ts" +++ "b/apps/dine-pleiepenger/src/utils/s\303\270knadUtils.ts" @@ -1,7 +1,7 @@ import dayjs from 'dayjs'; import timezone from 'dayjs/plugin/timezone'; import utc from 'dayjs/plugin/utc'; -import { Søknad, Søknadstype } from '../types/Søknad'; +import { Søknad } from '../types/Søknad'; require('dayjs/locale/nb'); @@ -9,22 +9,7 @@ dayjs.extend(utc); dayjs.extend(timezone); dayjs.locale('nb'); -export const getSøknadMottattDatoValue = (søknad: Søknad): Date | string => { - switch (søknad.søknadstype) { - case Søknadstype.PP_SYKT_BARN: - case Søknadstype.PP_ETTERSENDELSE: - return søknad.søknad.mottatt; - case Søknadstype.PP_SYKT_BARN_ENDRINGSMELDING: - return søknad.opprettet; - } -}; - -export const getSøknadMottattDato = (søknad: Søknad): Date | undefined => { - const mottattDato = getSøknadMottattDatoValue(søknad); - return dayjs(mottattDato).isValid() ? dayjs(mottattDato).toDate() : undefined; -}; - -export const formatSøknadMottattDato = (date: Date) => { +export const formatSøknadOpprettetDato = (date: Date) => { return dayjs(date).tz('Europe/Oslo').format('dddd D. MMMM YYYY, [kl.] HH:mm'); };