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

Commit

Permalink
Visning av barn - starter implementering
Browse files Browse the repository at this point in the history
  • Loading branch information
grutkowska committed Mar 16, 2023
1 parent 7511191 commit 9ffffc8
Show file tree
Hide file tree
Showing 11 changed files with 202 additions and 23 deletions.
Empty file.
129 changes: 123 additions & 6 deletions src/app/components/har-saker/HarSaker.tsx
@@ -1,9 +1,12 @@
import { Heading } from '@navikt/ds-react';
import { bemUtils, formatDate, guid } from '@navikt/fp-common';
import { bemUtils, formatDate, guid, intlUtils } from '@navikt/fp-common';
import { useSetBackgroundColor } from 'app/hooks/useBackgroundColor';
import { BarnGruppering } from 'app/types/BarnGruppering';
import { GruppertSak } from 'app/types/GruppertSak';
import EtBarn from 'assets/EtBarn';
import dayjs from 'dayjs';
import React from 'react';
import { IntlShape } from 'react-intl';
import SakLink from '../sak-link/SakLink';

import './har-saker.css';
Expand All @@ -12,8 +15,70 @@ interface Props {
grupperteSaker: GruppertSak[];
}

export const getHeading = (type: 'fødsel' | 'termin' | 'adopsjon', antallBarn: number, familiehendelsedato: string) => {
if (antallBarn === 0) {
export const formaterNavnPåBarn = (
fornavn: string[] | undefined,
fødselsdatoer: Date[] | undefined,
omsorgsovertagelsesdato: Date | undefined,
alleBarnaLever: boolean,
antallBarn: number,
intl: IntlShape
): string => {
if (
fornavn === undefined ||
fornavn.length === 0 ||
!alleBarnaLever
) {
return getTittelBarnNårNavnSkalIkkeVises(omsorgsovertagelsesdato, fødselsdatoer, antallBarn, intl);
}

if (fornavn.length > 1) {
const fornavnene = fornavn.slice(0, -1).join(', ');
const sisteFornavn = fornavn[fornavn.length - 1];
return `${fornavnene} og ${sisteFornavn}`;
}
return `${fornavn[0]}`;
};

export const getTekstForAntallBarn = (antallBarn: number, intl: IntlShape): string => {
if (antallBarn === 1) {
return intlUtils(intl, 'barn');
} else if (antallBarn === 2) {
return intlUtils(intl, 'tvillinger');
} else if (antallBarn === 3) {
return intlUtils(intl, 'trillinger');
}
return intlUtils(intl, 'flerlinger');
};

export const formaterFødselsdatoerPåBarn = (fødselsdatoer: Date[] | undefined): string | undefined => {
if (fødselsdatoer === undefined) {
return undefined;
}
const unikeFødselsdatoer = [] as Date[];
fødselsdatoer.forEach((f) => {
const finnesIUnikeFødselsdatoer = unikeFødselsdatoer.find((dato) => dayjs(dato).isSame(f, 'day'));
if (finnesIUnikeFødselsdatoer === undefined) {
unikeFødselsdatoer.push(f);
}
});

if (unikeFødselsdatoer.length > 1) {
const fødselsdatoerTekst = unikeFødselsdatoer.map((fd) => formatDate(fd));
const førsteFødselsdaoer = fødselsdatoerTekst.slice(0, -1).join(', ');
const sisteFødselsdato = fødselsdatoerTekst[fødselsdatoerTekst.length - 1];
return `${førsteFødselsdaoer} og ${sisteFødselsdato}`;
}
return formatDate(unikeFødselsdatoer[0]);
};

export const getTittelBarnNårNavnSkalIkkeVises = (
omsorgsovertagelsesdato: Date | undefined,
fødselsdatoer: Date[] | undefined,
antallBarn: number,
intl: IntlShape
): string => {
const barnTekst = getTekstForAntallBarn(antallBarn, intl);
if (antallBarn === 0||type === 'termin') {
return `Barn med termin ${formatDate(familiehendelsedato)}`;
}

Expand All @@ -25,7 +90,54 @@ export const getHeading = (type: 'fødsel' | 'termin' | 'adopsjon', antallBarn:
return `Barn med termin ${formatDate(familiehendelsedato)}`;
}

return `Barn med omsorgsovertakelse ${formatDate(familiehendelsedato)}`;

if (type === 'adopsjon') {
return intlUtils(intl, 'velkommen.barnVelger.adoptertBarn', {
adopsjonsdato: formatDate(familiehendelsedato),
});
} else {
const fødselsdatoTekst = formaterFødselsdatoerPåBarn(fødselsdatoer);


return fødselsdatoer !== undefined && fødselsdatoer.length > 0
? intlUtils(intl, 'velkommen.barnVelger.fødtBarn.barn', {
barnTekst,
fødselsdato: fødselsdatoTekst,
})
: '';
}
};

export const getHeading = (
type: 'fødsel' | 'termin' | 'adopsjon',
antallBarn: number,
familiehendelsedato: string,
barn: BarnGruppering | undefined
) => {

export const getHeading = (type: 'fødsel' | 'termin' | 'adopsjon', antallBarn: number, familiehendelsedato: string) => {
if (antallBarn === 0) {
return `Barn med termin ${formatDate(familiehendelsedato)}`;
}

if (type === 'fødsel') {
return `Barn født ${formatDate(familiehendelsedato)}`;
}

if (type === 'termin') {
return `Barn med termin ${formatDate(familiehendelsedato)}`;
}

return `Barn med omsorgsovertakelse ${formatDate(familiehendelsedato)}`;
return formaterNavnPåBarn(
barn.fornavn,
barn.etternavn,
barn.fødselsdatoer,
barn.omsorgsovertagelse,
barn.alleBarnaLever,
gruppering.antallBarn,
intl
);
};

const HarSaker: React.FunctionComponent<Props> = ({ grupperteSaker }) => {
Expand All @@ -38,8 +150,13 @@ const HarSaker: React.FunctionComponent<Props> = ({ grupperteSaker }) => {
return (
<div className={bem.block} key={gruppering.familiehendelsedato}>
<Heading size="medium" level="2" className={bem.element('tittel')}>
<EtBarn />{' '}
{getHeading(gruppering.type, gruppering.antallBarn, gruppering.familiehendelsedato)}
<EtBarn />
{getHeading(
gruppering.type,
gruppering.antallBarn,
gruppering.familiehendelsedato,
gruppering.barn
)}
</Heading>
{gruppering.saker.map((sak) => {
return <SakLink key={guid()} sak={sak} />;
Expand Down
16 changes: 11 additions & 5 deletions src/app/components/header/Header.tsx
Expand Up @@ -3,6 +3,8 @@ import { bemUtils } from '@navikt/fp-common';
import { useGetSelectedRoute } from 'app/hooks/useSelectedRoute';
import { useGetSelectedSak } from 'app/hooks/useSelectedSak';
import OversiktRoutes from 'app/routes/routes';
import { BarnGruppering } from 'app/types/BarnGruppering';
import { GruppertSak } from 'app/types/GruppertSak';
import { Sak } from 'app/types/Sak';
import { Ytelse } from 'app/types/Ytelse';
import { getFamiliehendelseDato, utledFamiliesituasjon } from 'app/utils/sakerUtils';
Expand Down Expand Up @@ -60,7 +62,7 @@ const getSaksoversiktHeading = (ytelse: Ytelse) => {
return 'Foreldrepengesak';
};

const renderHeaderContent = (selectedRoute: OversiktRoutes, sak: Sak | undefined) => {
const renderHeaderContent = (selectedRoute: OversiktRoutes, sak: Sak | undefined, barn: BarnGruppering | undefined) => {
const bem = bemUtils('header');

if (selectedRoute === OversiktRoutes.DOKUMENTER) {
Expand Down Expand Up @@ -100,7 +102,7 @@ const renderHeaderContent = (selectedRoute: OversiktRoutes, sak: Sak | undefined
if (selectedRoute === OversiktRoutes.SAKSOVERSIKT && sak) {
const situasjon = utledFamiliesituasjon(sak.familiehendelse, sak.gjelderAdopsjon);
const familiehendelsedato = getFamiliehendelseDato(sak.familiehendelse);
const beskrivelse = getHeading(situasjon, sak.familiehendelse.antallBarn, familiehendelsedato);
const beskrivelse = getHeading(situasjon, sak.familiehendelse.antallBarn, familiehendelsedato, barn);

return (
<div className={bem.element('content')}>
Expand Down Expand Up @@ -130,23 +132,27 @@ const renderHeaderContent = (selectedRoute: OversiktRoutes, sak: Sak | undefined
};

interface Props {
grupperteSaker: GruppertSak[];
minidialogerIds: string[];
}

const Header: React.FunctionComponent<Props> = ({ minidialogerIds }) => {
const Header: React.FunctionComponent<Props> = ({ minidialogerIds, grupperteSaker }) => {
const bem = bemUtils('header');
const path = location.pathname;
const selectedRoute = useGetSelectedRoute();
const headerRouteInfo = getHeaderRouteInfo(path, minidialogerIds, selectedRoute);
const sak = useGetSelectedSak();

const sakIGrupperteSaker = sak
? grupperteSaker.find((gruppe) => gruppe.saker.map((s) => s.saksnummer).includes(sak.saksnummer))
: undefined;
const barnGrupperingForSak = sakIGrupperteSaker?.barn;
const { route, isExternalURL, label } = headerRouteInfo;

return (
<div className={bem.block}>
<div className={bem.element('wrapper')}>
<PreviousLink route={route} externalURL={isExternalURL} linkLabel={label} />
{renderHeaderContent(selectedRoute, sak)}
{renderHeaderContent(selectedRoute, sak, barnGrupperingForSak)}
</div>
</div>
);
Expand Down
11 changes: 5 additions & 6 deletions src/app/pages/forside/Forside.tsx
@@ -1,22 +1,21 @@
import React from 'react';
import HarIkkeSaker from 'app/components/har-ikke-saker/HarIkkeSaker';
import HarSaker from 'app/components/har-saker/HarSaker';
import { getAlleYtelser, grupperSakerPåBarn } from 'app/utils/sakerUtils';
import { SakOppslag } from 'app/types/SakOppslag';
import { bemUtils } from '@navikt/fp-common';
import { useSetSelectedRoute } from 'app/hooks/useSelectedRoute';
import OversiktRoutes from 'app/routes/routes';

import './forside.css';
import { GruppertSak } from 'app/types/GruppertSak';
import { Sak } from 'app/types/Sak';

interface Props {
saker: SakOppslag;
alleYtelser: Sak[];
grupperteSaker: GruppertSak[];
}

const Forside: React.FunctionComponent<Props> = ({ saker }) => {
const grupperteSaker = grupperSakerPåBarn(saker);
const Forside: React.FunctionComponent<Props> = ({ alleYtelser, grupperteSaker }) => {
const bem = bemUtils('forside');
const alleYtelser = getAlleYtelser(saker);
useSetSelectedRoute(OversiktRoutes.HOVEDSIDE);

return (
Expand Down
9 changes: 5 additions & 4 deletions src/app/routes/ForeldrepengeoversiktRoutes.tsx
Expand Up @@ -13,7 +13,7 @@ import Opplysninger from 'app/pages/opplysninger/Opplysninger';
import { SakOppslag } from 'app/types/SakOppslag';

import './routes-wrapper.css';
import { getAntallSaker } from 'app/utils/sakerUtils';
import { getAlleYtelser, getAntallSaker, grupperSakerPåBarn } from 'app/utils/sakerUtils';
import MinidialogPage from 'app/pages/minidialog-page/MinidialogPage';
import { MinidialogInnslag } from 'app/types/HistorikkInnslag';
import { AxiosError } from 'axios';
Expand Down Expand Up @@ -61,13 +61,14 @@ const ForeldrepengeoversiktRoutes: React.FunctionComponent<Props> = ({
}, [navigate, saker]);

const minidialogerIds = minidialogerData ? minidialogerData.map((oppgave) => oppgave.dialogId) : [];

const grupperteSaker = grupperSakerPåBarn(søkerinfo.søker.barn, saker);
const alleYtelser = getAlleYtelser(saker);
return (
<>
<Header minidialogerIds={minidialogerIds} />
<Header minidialogerIds={minidialogerIds} grupperteSaker={grupperteSaker} />
<div className={bem.block}>
<Routes>
<Route path="/" element={<Forside saker={saker} />} />
<Route path="/" element={<Forside alleYtelser={alleYtelser} grupperteSaker={grupperteSaker} />} />
<Route path="/sak/:saksnummer" element={<SakComponent />}>
<Route
index
Expand Down
5 changes: 5 additions & 0 deletions src/app/types/BarnGruppering.ts
@@ -0,0 +1,5 @@
export interface BarnGruppering {
alleBarnaLever: boolean;
fornavn: string[] | undefined;
fødselsdatoer: string[] | undefined;
}
2 changes: 2 additions & 0 deletions src/app/types/GruppertSak.ts
@@ -1,3 +1,4 @@
import { BarnGruppering } from './BarnGruppering';
import { EngangsstønadSak } from './EngangsstønadSak';
import { Foreldrepengesak } from './Foreldrepengesak';
import { SvangerskapspengeSak } from './SvangerskapspengeSak';
Expand All @@ -9,4 +10,5 @@ export interface GruppertSak {
type: 'fødsel' | 'termin' | 'adopsjon';
saker: Array<Foreldrepengesak | SvangerskapspengeSak | EngangsstønadSak>;
ytelse: Ytelse;
barn: BarnGruppering;
}
2 changes: 2 additions & 0 deletions src/app/types/Person.ts
Expand Up @@ -3,7 +3,9 @@ import { Kjønn } from '@navikt/fp-common';
export interface Person {
etternavn: string;
fornavn: string;
mellomnavn?: string;
fødselsdato: string;
dødsdato?: string;
fnr: string;
kjønn: Kjønn;
}
10 changes: 10 additions & 0 deletions src/app/utils/dateUtils.ts
Expand Up @@ -105,3 +105,13 @@ export const ISOStringToDate = (dateString: string | undefined): Date | undefine
}
return undefined;
};

export const getErDatoInnenEnDagFraAnnenDato = (dato1: Date | undefined, dato2: Date | undefined): boolean => {
if (dato1 === undefined || dato2 === undefined) {
return false;
}
return (
dayjs(dato1).isSameOrAfter(dayjs(dato2).subtract(1, 'day'), 'day') &&
dayjs(dato1).isSameOrBefore(dayjs(dato2).add(1, 'day'), 'day')
);
};
5 changes: 5 additions & 0 deletions src/app/utils/personUtils.ts
@@ -1,4 +1,5 @@
import { Foreldrepengesak } from 'app/types/Foreldrepengesak';
import { Person } from 'app/types/Person';

export interface NavnPåForeldre {
farMedmor: string;
Expand Down Expand Up @@ -31,3 +32,7 @@ export const getNavnPåForeldre = (
mor: søkerErFarEllerMedmor ? navnAnnenForelder : navnPåSøker,
};
};

export const getLeverPerson = (person: Person) => {
return !person.dødsdato;
};
36 changes: 34 additions & 2 deletions src/app/utils/sakerUtils.ts
Expand Up @@ -7,12 +7,43 @@ import { SvangerskapspengeSak, SvangerskapspengeSakDTO } from 'app/types/Svanger
import { Ytelse } from 'app/types/Ytelse';
import dayjs from 'dayjs';
import { SøkerinfoDTO } from 'app/types/SøkerinfoDTO';
import { Sak } from 'app/types/Sak';
import { Person } from 'app/types/Person';
import { getErDatoInnenEnDagFraAnnenDato, ISOStringToDate } from './dateUtils';
import { getLeverPerson } from './personUtils';
import { BarnGruppering } from 'app/types/BarnGruppering';

export const getAlleYtelser = (saker: SakOppslag) => {
export const getAlleYtelser = (saker: SakOppslag): Sak[] => {
return [...saker.engangsstønad, ...saker.foreldrepenger, ...saker.svangerskapspenger];
};

export const grupperSakerPåBarn = (saker: SakOppslag): GruppertSak[] => {
const getBarnGrupperingFraSak = (sak: Sak, registrerteBarn: Person[] | undefined): BarnGruppering => {
const erForeldrepengesak = sak.ytelse === Ytelse.FORELDREPENGER;
const barnFnrFraSaken = erForeldrepengesak && sak.barn !== undefined ? sak.barn.map((b) => b.fnr).flat() : [];
const pdlBarnMedSammeFnr =
erForeldrepengesak && registrerteBarn ? registrerteBarn.filter((b) => barnFnrFraSaken.includes(b.fnr)) : [];
const fødselsdatoFraSak = ISOStringToDate(sak.familiehendelse.fødselsdato);
const pdlBarnMedSammeFødselsdato =
fødselsdatoFraSak !== undefined && registrerteBarn
? registrerteBarn.filter(
(barn) =>
getErDatoInnenEnDagFraAnnenDato(ISOStringToDate(barn.fødselsdato), fødselsdatoFraSak) &&
!pdlBarnMedSammeFnr?.find((pdlBarn) => pdlBarn.fnr === barn.fnr)
)
: [];

const alleBarn = pdlBarnMedSammeFnr.concat(pdlBarnMedSammeFødselsdato);

return {
fornavn: alleBarn
?.filter((b) => b.fornavn !== undefined && b.fornavn.trim() !== '')
.map((b) => [b.fornavn, b.mellomnavn !== undefined ? b.mellomnavn : ''].join(' ')),
//TODO Legg til fødselsdatoer
alleBarnaLever: !!alleBarn?.every((barn) => getLeverPerson(barn)),
};
};

export const grupperSakerPåBarn = (registrerteBarn: Person[] | undefined, saker: SakOppslag): GruppertSak[] => {
const alleSaker = getAlleYtelser(saker);

return alleSaker.reduce((result, sak) => {
Expand All @@ -32,6 +63,7 @@ export const grupperSakerPåBarn = (saker: SakOppslag): GruppertSak[] => {
saker: [sak],
type: utledFamiliesituasjon(sak.familiehendelse, sak.gjelderAdopsjon),
ytelse: sak.ytelse,
barn: getBarnGrupperingFraSak(sak, registrerteBarn),
};

result.push(gruppertSak);
Expand Down

0 comments on commit 9ffffc8

Please sign in to comment.