Skip to content

Commit

Permalink
Sammenslå like perioder (#1945)
Browse files Browse the repository at this point in the history
* Hvis perioder er like skal de som default sammenslås
* Kan angre sammenslåing

---------

Co-authored-by: Ole Christian Kvernberg <[email protected]>
  • Loading branch information
gunnsteingarmo and olekvernberg authored Nov 1, 2024
1 parent 60ac9ef commit 93f3125
Show file tree
Hide file tree
Showing 9 changed files with 203 additions and 70 deletions.
90 changes: 90 additions & 0 deletions src/frontend/hooks/useSammenslåPerioder.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
import { useHttp } from '@navikt/familie-http';
import { type Ressurs, RessursStatus } from '@navikt/familie-typer';
import { useCallback, useState } from 'react';

export const useSammenslåPerioder = (behandlingId: string) => {
const { request } = useHttp();
const [erPerioderLike, settErPerioderLike] = useState<boolean>(false);
const [feilmelding, settFeilmelding] = useState<string>();
const [laster, settLaster] = useState<boolean>(false);

const hentErPerioderLike = useCallback(async (): Promise<boolean> => {
const response: Ressurs<boolean> = await request<void, boolean>({
method: 'GET',
url: `/familie-tilbake/api/perioder/sjekk-likhet/${behandlingId}`,
});

if (response.status === RessursStatus.SUKSESS) {
settErPerioderLike(response.data);
return response.data;
} else {
settErPerioderLike(false);
return false;
}
}, [behandlingId, request]);

const sammenslåPerioder = async () => {
settLaster(true);
const response: Ressurs<string> = await request<void, string>({
method: 'POST',
url: `/familie-tilbake/api/perioder/sammensla/${behandlingId}`,
});

if (response.status === RessursStatus.SUKSESS) {
settLaster(false);
return response.data;
} else if (
response.status === RessursStatus.FEILET ||
response.status === RessursStatus.FUNKSJONELL_FEIL ||
response.status === RessursStatus.IKKE_TILGANG
) {
settFeilmelding(response.frontendFeilmelding);
settLaster(false);
return false;
}
};

const angreSammenslåingAvPerioder = async () => {
settLaster(true);
const response: Ressurs<string> = await request<void, string>({
method: 'POST',
url: `/familie-tilbake/api/perioder/angre-sammenslaing/${behandlingId}`,
});

if (response.status === RessursStatus.SUKSESS) {
settLaster(false);
return response.data;
} else if (
response.status === RessursStatus.FEILET ||
response.status === RessursStatus.FUNKSJONELL_FEIL ||
response.status === RessursStatus.IKKE_TILGANG
) {
settFeilmelding(response.frontendFeilmelding);
settLaster(false);
return false;
}
};

const hentErPerioderSammenslått = useCallback(async (): Promise<boolean> => {
const response: Ressurs<boolean> = await request<void, boolean>({
method: 'GET',
url: `/familie-tilbake/api/perioder/hent-sammenslatt/${behandlingId}`,
});

if (response.status === RessursStatus.SUKSESS) {
return response.data;
} else {
return false;
}
}, [behandlingId, request]);

return {
hentErPerioderLike,
hentErPerioderSammenslått,
sammenslåPerioder,
angreSammenslåingAvPerioder,
erPerioderLike,
feilmelding,
laster,
};
};
27 changes: 0 additions & 27 deletions src/frontend/hooks/useSjekklikheter.ts

This file was deleted.

1 change: 1 addition & 0 deletions src/frontend/kodeverk/vedtak.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export const vurderinger: Record<Vurdering, string> = {
export enum Avsnittstype {
OPPSUMMERING = 'OPPSUMMERING',
PERIODE = 'PERIODE',
SAMMENSLÅTT_PERIODE = 'SAMMENSLÅTT_PERIODE',
TILLEGGSINFORMASJON = 'TILLEGGSINFORMASJON',
}

Expand Down
48 changes: 44 additions & 4 deletions src/frontend/komponenter/Fagsak/Vedtak/AvsnittSkjema.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import { css, styled } from 'styled-components';
import { BodyLong, ExpansionCard, Heading } from '@navikt/ds-react';
import { ABorderWarning, ASpacing2 } from '@navikt/ds-tokens/dist/tokens';

import { AvsnittSkjemaData } from './typer/feilutbetalingVedtak';
import { AvsnittSkjemaData, UnderavsnittSkjemaData } from './typer/feilutbetalingVedtak';
import VedtakFritekstSkjema from './VedtakFritekstSkjema';
import { Avsnittstype, Underavsnittstype } from '../../../kodeverk';
import { Spacer8 } from '../../Felleskomponenter/Flytelementer';
Expand All @@ -18,7 +18,6 @@ const stylingWarningKantlinje = css`
border-left-color: ${ABorderWarning};
border-left-width: 5px;
`;

const StyledExpansionHeader = styled(ExpansionCard.Header)<{
$visWarningKantlinje: boolean;
}>`
Expand All @@ -45,7 +44,10 @@ const skalVisesÅpen = (avsnitt: AvsnittSkjemaData) => {
underavsnitt.fritekstPåkrevet && (!underavsnitt.fritekst || underavsnitt.harFeil)
);
}
if (avsnitt.avsnittstype === Avsnittstype.PERIODE) {
if (
avsnitt.avsnittstype === Avsnittstype.PERIODE ||
avsnitt.avsnittstype === Avsnittstype.SAMMENSLÅTT_PERIODE
) {
return avsnitt.underavsnittsliste
.filter(
underavsnitt =>
Expand Down Expand Up @@ -85,6 +87,33 @@ const AvsnittSkjema: React.FC<IProps> = ({
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [avsnitt]);

const finnBulletpointsFraListe = (
underavsnittsliste: UnderavsnittSkjemaData[]
): UnderavsnittSkjemaData[] => {
const bulletpoints: UnderavsnittSkjemaData[] = [];
let erBulletpoints = false;

for (const underavsnitt of underavsnittsliste) {
if (erBulletpoints) {
bulletpoints.push(underavsnitt);
}
if (underavsnitt.brødtekst?.startsWith('*-')) {
erBulletpoints = true;
}
if (underavsnitt.brødtekst?.endsWith('-*')) {
erBulletpoints = false;
break;
}
}

return bulletpoints;
};

const bulletpoints = finnBulletpointsFraListe(avsnitt.underavsnittsliste);
const underavsnittUtenBulletpoints = avsnitt.underavsnittsliste
.filter(ul => !bulletpoints?.includes(ul))
.filter(ul => !ul.brødtekst?.includes('*-'));

return (
<StyledExpansionCard
open={erEkspandert}
Expand All @@ -100,7 +129,18 @@ const AvsnittSkjema: React.FC<IProps> = ({
<StyledExpansionContent
$visWarningKantlinje={!erLesevisning && harPåkrevetFritekstMenIkkeUtfylt}
>
{avsnitt.underavsnittsliste.map(underavsnitt => {
{bulletpoints.length > 0 && (
<ul>
{bulletpoints.map(bulletpoint => {
return (
<li key={bulletpoint.index}>
{bulletpoint?.brødtekst?.replace('-*', '')}
</li>
);
})}
</ul>
)}
{underavsnittUtenBulletpoints.map(underavsnitt => {
return (
<React.Fragment
key={
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,11 @@ import { sider } from '../../Felleskomponenter/Venstremeny/sider';
const hentPerioderMedTekst = (skjemaData: AvsnittSkjemaData[]): PeriodeMedTekst[] => {
// @ts-expect-error - klager på periode men er trygt p.g.s. filtreringen
const perioderMedTekst: PeriodeMedTekst[] = skjemaData
.filter(avs => avs.avsnittstype === Avsnittstype.PERIODE)
.filter(
avs =>
avs.avsnittstype === Avsnittstype.PERIODE ||
avs.avsnittstype === Avsnittstype.SAMMENSLÅTT_PERIODE
)
.map(avs => {
const fakta = avs.underavsnittsliste.find(
uavs => uavs.underavsnittstype === Underavsnittstype.FAKTA && uavs.fritekstTillatt
Expand Down Expand Up @@ -353,6 +357,7 @@ const [FeilutbetalingVedtakProvider, useFeilutbetalingVedtak] = createUseContext
foreslåVedtakRespons,
validerAlleAvsnittOk,
lagreUtkast,
hentVedtaksbrevtekster,
};
}
);
Expand Down
11 changes: 6 additions & 5 deletions src/frontend/komponenter/Fagsak/Vedtak/VedtakContainer.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import {
IBeregningsresultat,
VedtaksbrevAvsnitt,
} from '../../../typer/vedtakTyper';
import { useSjekkLikhetPerioder } from '../../../hooks/useSjekklikheter';
import { useSammenslåPerioder } from '../../../hooks/useSammenslåPerioder';

jest.mock('@navikt/familie-http', () => {
return {
Expand All @@ -42,8 +42,8 @@ jest.mock('react-router-dom', () => ({
useNavigate: () => jest.fn(),
}));

jest.mock('../../../hooks/useSjekklikheter', () => ({
useSjekkLikhetPerioder: jest.fn(),
jest.mock('../../../hooks/useSammenslåPerioder', () => ({
useSammenslåPerioder: jest.fn(),
}));

const mockedSettIkkePersistertKomponent = jest.fn();
Expand Down Expand Up @@ -133,8 +133,9 @@ describe('Tester: VedtakContainer', () => {
}));

// @ts-expect-error mock
useSjekkLikhetPerioder.mockImplementation(() => ({
hentSjekkLikhetPerioder: () => Promise.resolve(),
useSammenslåPerioder.mockImplementation(() => ({
hentErPerioderLike: () => Promise.resolve(),
hentErPerioderSammenslått: () => Promise.resolve(),
erPerioderLike: false,
}));

Expand Down
60 changes: 49 additions & 11 deletions src/frontend/komponenter/Fagsak/Vedtak/VedtakContainer.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,8 @@
import * as React from 'react';

import React, { useEffect, useState } from 'react';
import { styled } from 'styled-components';

import { Alert, BodyLong, BodyShort, Button, Detail, Heading, HStack } from '@navikt/ds-react';
import { AFontWeightBold, ASpacing3 } from '@navikt/ds-tokens/dist/tokens';
import { RessursStatus } from '@navikt/familie-typer';

import { BrevmottakereAlert } from './BrevmottakereAlert';
import { useFeilutbetalingVedtak } from './FeilutbetalingVedtakContext';
import ForhåndsvisVedtaksbrev from './ForhåndsvisVedtaksbrev/ForhåndsvisVedtaksbrev';
Expand All @@ -24,9 +21,7 @@ import { HarBrukerUttaltSegValg } from '../../../typer/feilutbetalingtyper';
import { Navigering, Spacer20 } from '../../Felleskomponenter/Flytelementer';
import { sider } from '../../Felleskomponenter/Venstremeny/sider';
import DataLastIkkeSuksess from '../../Felleskomponenter/Datalast/DataLastIkkeSuksess';

import { useEffect } from 'react';
import { useSjekkLikhetPerioder } from '../../../hooks/useSjekklikheter';
import { useSammenslåPerioder } from '../../../hooks/useSammenslåPerioder';

const StyledVedtak = styled.div`
padding: ${ASpacing3};
Expand Down Expand Up @@ -62,6 +57,7 @@ const VedtakContainer: React.FC<IProps> = ({ behandling, fagsak }) => {
sendInnSkjema,
foreslåVedtakRespons,
lagreUtkast,
hentVedtaksbrevtekster,
} = useFeilutbetalingVedtak();
const { behandlingILesemodus, aktivtSteg } = useBehandling();
const erLesevisning = !!behandlingILesemodus;
Expand All @@ -71,14 +67,41 @@ const VedtakContainer: React.FC<IProps> = ({ behandling, fagsak }) => {
behandling.type === Behandlingstype.REVURDERING_TILBAKEKREVING &&
behandling.behandlingsårsakstype ===
Behandlingårsak.REVURDERING_FEILUTBETALT_BELØP_HELT_ELLER_DELVIS_BORTFALT;
const [erPerioderSammenslått, settErPerioderSammenslått] = useState<boolean>(false);

const { hentSjekkLikhetPerioder } = useSjekkLikhetPerioder(behandling.behandlingId);
const {
sammenslåPerioder,
angreSammenslåingAvPerioder,
hentErPerioderSammenslått,
hentErPerioderLike,
erPerioderLike,
laster,
feilmelding,
} = useSammenslåPerioder(behandling.behandlingId);

const handleKnappTrykk = async () => {
const oppdaterErPerioderSammenslått = !erPerioderSammenslått;
settErPerioderSammenslått(oppdaterErPerioderSammenslått);
if (!oppdaterErPerioderSammenslått) {
await angreSammenslåingAvPerioder();
} else {
await sammenslåPerioder();
}
hentVedtaksbrevtekster();
};

useEffect(() => {
hentSjekkLikhetPerioder();
}, [hentSjekkLikhetPerioder]);
const fetch = async () => {
await hentErPerioderLike();

const sammenslåttResponse = await hentErPerioderSammenslått();
settErPerioderSammenslått(!!sammenslåttResponse);
};
fetch();
// eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

React.useEffect(() => {
useEffect(() => {
// Skal trigge re-rendring
}, [nonUsedKey]);

Expand All @@ -87,6 +110,7 @@ const VedtakContainer: React.FC<IProps> = ({ behandling, fagsak }) => {
const harValideringsFeil = skjemaData.some(avs =>
avs.underavsnittsliste.some(uavs => uavs.harFeil)
);

const kanViseForhåndsvisning =
(!erLesevisning ||
(behandling.kanEndres &&
Expand Down Expand Up @@ -172,6 +196,20 @@ const VedtakContainer: React.FC<IProps> = ({ behandling, fagsak }) => {
Lagre utkast
</Button>
)}
{!erLesevisning && erPerioderLike && (
<Button
variant="tertiary"
onClick={handleKnappTrykk}
loading={laster}
disabled={laster}
>
{erPerioderSammenslått
? 'Angre sammenslåing'
: 'Sammenslå perioder'}
</Button>
)}

{feilmelding && <Alert variant="error">{feilmelding}</Alert>}
</HStack>
<Button variant="secondary" onClick={gåTilForrige}>
Forrige
Expand Down
Loading

0 comments on commit 93f3125

Please sign in to comment.