Skip to content

Commit 4dd5b21

Browse files
committed
TFP-6071: legg til overstyring i fakta-fødsel
1 parent 9b334bf commit 4dd5b21

File tree

17 files changed

+236
-23
lines changed

17 files changed

+236
-23
lines changed

apps/fp-frontend-app/src/behandling/fellesPaneler/fakta/FodselvilkaretFaktaInitPanel.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@ import { useStandardFaktaPanelProps } from '../../felles/fakta/useStandardFaktaP
1616
import { BehandlingDataContext } from '../../felles/utils/behandlingDataContext';
1717

1818
const AKSJONSPUNKT_KODER = [AksjonspunktKode.TERMINBEKREFTELSE, AksjonspunktKode.SJEKK_MANGLENDE_FODSEL];
19+
const OVERSTYRING_KODER = [AksjonspunktKode.OVERSTYRING_AV_FAKTA_OM_FØDSEL];
1920

2021
export const FodselvilkaretFaktaInitPanel = () => {
2122
const intl = useIntl();
2223

23-
const { behandling, fagsak } = use(BehandlingDataContext);
24+
const { behandling, fagsak, rettigheter } = use(BehandlingDataContext);
2425

2526
const skalPanelVisesIMeny = behandling.vilkår.some(v => fodselsvilkarene.some(fv => fv === v.vilkarType));
2627

27-
const standardPanelProps = useStandardFaktaPanelProps(AKSJONSPUNKT_KODER);
28+
const standardPanelProps = useStandardFaktaPanelProps(AKSJONSPUNKT_KODER, OVERSTYRING_KODER);
2829

2930
const api = useBehandlingApi(behandling);
3031
const fagsakApi = useFagsakApi();
@@ -48,6 +49,7 @@ export const FodselvilkaretFaktaInitPanel = () => {
4849
fødsel={faktafødsel}
4950
terminbekreftelseDokument={terminbekreftelseDokument}
5051
submittable={standardPanelProps.submittable}
52+
kanOverstyre={rettigheter.kanOverstyreAccess.isEnabled}
5153
/>
5254
) : (
5355
<LoadingPanel />

packages/fakta/fodsel/i18n/nb_NO.json

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
{
22
"FodselInfoPanel.KontrollerMotTerminbekreftelsen": "Kontroller terminbekreftelse",
33
"FodselInfoPanel.KontrollerMotFodselsdokumentasjon": "Kontroller mot opplysningene fra fødselsdokumentasjonen",
4+
"OverstyringPanel.Tittel": "Fakta om fødsel",
5+
"OverstyringForm.Tittel": "Overstyring av fødselsdetaljer",
6+
"OverstyringForm.Avbryt": "Avbryt",
7+
"OverstyringForm.ErBarnetFødt": "Er barnet født?",
8+
"OverstyringForm.Ja": "Ja",
9+
"OverstyringForm.Nei": "Nei",
410
"TermindatoFaktaForm.Tittel": "Kontroller opplysninger om termin oppgitt i søknaden",
511
"TermindatoFaktaForm.AdvarselForTidligUtstedtdato": "Terminbekreftelsen utstedt før 22. svangerskapsuke. Kontakt søker for en nyere terminbekreftelse og sett saken på vent. Fortsett dersom ny bekreftelse ikke skal hentes inn. Behandlingen vil avslås på grunn av manglende dokumentasjon",
612
"AvklartBarnFieldArray.LeggTilBarn": "Legg til barn",
@@ -11,7 +17,7 @@
1117
"FaktaFødselFraFReg.Tittel": "Opplysninger fra Folkeregisteret",
1218
"FaktaFødselFraFReg.IngenBarn": "Det er ikke registrert noen fødselshendelse i Folkeregisteret",
1319
"FaktaFødselFraSøknad.Tittel": "Opplysninger oppgitt i søknaden",
14-
"FaktaFødselFraSøknad.Terminbekreftelse" : "Terminbekreftelse",
20+
"FaktaFødselFraSøknad.Terminbekreftelse": "Terminbekreftelse",
1521
"FaktaFødselFraSøknad.VisTerminbekreftelse": "Vis terminbekreftelse",
1622
"Situasjon.OpplysningerGjeldende": "Gjeldende opplysninger",
1723
"Label.NummerertBarn": "Barn {nummer}",

packages/fakta/fodsel/src/FodselFaktaIndex.spec.tsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,13 @@ import { expect } from 'vitest';
55

66
import * as stories from './FodselFaktaIndex.stories';
77

8-
const { Default, APTerminbekreftelse, APSjekkManglendeFødselPåEngangstønad, APSjekkManglendeFødselPåForeldrepenger } =
9-
composeStories(stories);
8+
const {
9+
Default,
10+
APTerminbekreftelse,
11+
APSjekkManglendeFødselPåEngangstønad,
12+
APSjekkManglendeFødselPåForeldrepenger,
13+
Overstyring,
14+
} = composeStories(stories);
1015

1116
describe('FodselFaktaIndex', () => {
1217
it('skal bekrefte aksjonspunkt for termin', async () => {
@@ -170,4 +175,13 @@ describe('FodselFaktaIndex', () => {
170175
begrunnelse: 'Dette er en begrunnelse',
171176
});
172177
});
178+
179+
it('skal overstyre termindato og legge til et barn', async () => {
180+
render(<Overstyring />);
181+
182+
expect(screen.getByText('Fakta om fødsel')).toBeInTheDocument();
183+
await userEvent.click(screen.getByText('Overstyr'));
184+
185+
expect(screen.getByText('Overstyring av fødselsdetaljer')).toBeInTheDocument();
186+
});
173187
});

packages/fakta/fodsel/src/FodselFaktaIndex.stories.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ const meta = {
3232
args: {
3333
submittable: true,
3434
isReadOnly: false,
35+
kanOverstyre: false,
3536
aksjonspunkterForPanel: [],
3637
alleMerknaderFraBeslutter: {},
3738
terminbekreftelseDokument: {
@@ -80,6 +81,7 @@ const meta = {
8081
},
8182
render: args => <FodselFaktaIndex {...args} />,
8283
} satisfies Meta<PanelDataArgs & ComponentProps<typeof FodselFaktaIndex>>;
84+
8385
export default meta;
8486

8587
type Story = StoryObj<typeof meta>;
@@ -276,3 +278,23 @@ export const SjekkManglendeFødselVedDødfødselForEnTvilling: Story = {
276278
},
277279
},
278280
};
281+
282+
export const Overstyring: Story = {
283+
args: {
284+
kanOverstyre: true,
285+
},
286+
};
287+
export const Overstyrt: Story = {
288+
args: {
289+
kanOverstyre: true,
290+
isReadOnly: true,
291+
aksjonspunkterForPanel: [
292+
{
293+
definisjon: AksjonspunktKode.OVERSTYRING_AV_FAKTA_OM_FØDSEL,
294+
status: AksjonspunktStatus.UTFORT,
295+
begrunnelse: 'Denne saken har blitt overstyrt',
296+
kanLoses: false,
297+
},
298+
],
299+
},
300+
};

packages/fakta/fodsel/src/FodselFaktaIndex.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ interface Props {
1515
fødsel: Fødsel;
1616
terminbekreftelseDokument: DokumentLinkReferanse | undefined;
1717
submittable: boolean;
18+
kanOverstyre: boolean;
1819
}
1920

2021
export const FodselFaktaIndex = (props: Props) => (

packages/fakta/fodsel/src/components/FodselInfoPanel.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,28 +13,31 @@ import { SjekkTerminbekreftelseForm } from './aksjonspunkt/SjekkTerminbekreftels
1313
import { FaktaFraFReg } from './fakta/FaktaFraFReg';
1414
import { FaktaFraSøknad } from './fakta/FaktaFraSøknad';
1515
import { Situasjon } from './fakta/Situasjon';
16+
import { OverstyringPanel } from './overstyring/OverstyringPanel';
1617

1718
const { TERMINBEKREFTELSE, SJEKK_MANGLENDE_FODSEL } = AksjonspunktKode;
1819

1920
interface Props {
2021
fødsel: Fødsel;
21-
submittable: boolean;
2222
terminbekreftelseDokument: DokumentLinkReferanse | undefined;
23+
submittable: boolean;
24+
kanOverstyre: boolean;
2325
}
2426

2527
/**
2628
* FodselInfoPanel
2729
*
2830
* Har ansvar for å sette opp formen for faktapenelet til Fødselsvilkåret.
2931
*/
30-
export const FodselInfoPanel = ({ submittable, fødsel, terminbekreftelseDokument }: Props) => {
32+
export const FodselInfoPanel = ({ submittable, fødsel, terminbekreftelseDokument, kanOverstyre }: Props) => {
3133
const { aksjonspunkterForPanel, harÅpneAksjonspunkter } = usePanelDataContext();
3234

3335
const terminbekreftelseAp = aksjonspunkterForPanel.find(ap => ap.definisjon === TERMINBEKREFTELSE);
3436
const manglendeFødselAp = aksjonspunkterForPanel.find(ap => ap.definisjon === SJEKK_MANGLENDE_FODSEL);
3537

3638
return (
3739
<VStack gap="4">
40+
<OverstyringPanel kanOverstyre={kanOverstyre} gjeldende={fødsel.gjeldende} submittable={submittable} />
3841
{harÅpneAksjonspunkter && (
3942
<AksjonspunktHelpTextHTML>
4043
<>

packages/fakta/fodsel/src/components/aksjonspunkt/SjekkManglendeFødselForm.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,6 @@ const initialValues = (gjeldende: FødselGjeldende, aksjonspunkt: Aksjonspunkt):
104104
const transformValues = (values: FormValues): SjekkManglendeFodselAp => ({
105105
kode: AksjonspunktKode.SJEKK_MANGLENDE_FODSEL,
106106
dokumentasjonForeligger: values.dokumentasjonForeligger!,
107-
...BarnFieldArray.transformValues(values, !!values.dokumentasjonForeligger),
107+
uidentifiserteBarn: BarnFieldArray.transformValues(values,!!values.dokumentasjonForeligger).barn,
108108
...FaktaBegrunnelseTextField.transformValues(values),
109109
});

packages/fakta/fodsel/src/components/aksjonspunkt/SjekkTerminbekreftelseForm.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import {
1414
} from '@navikt/fp-fakta-felles';
1515
import { AksjonspunktKode } from '@navikt/fp-kodeverk';
1616
import type { Aksjonspunkt, Fødsel, FødselGjeldende } from '@navikt/fp-types';
17-
import type { BekreftTerminbekreftelseAp } from '@navikt/fp-types-avklar-aksjonspunkter';
17+
import type { SjekkTerminbekreftelseAp } from '@navikt/fp-types-avklar-aksjonspunkter';
1818
import { FaktaKort } from '@navikt/fp-ui-komponenter';
1919
import {
2020
maxTerminbekreftelseDato,
@@ -45,7 +45,7 @@ interface Props {
4545
export const SjekkTerminbekreftelseForm = ({ fødsel: { gjeldende, søknad }, submittable, aksjonspunkt }: Props) => {
4646
const intl = useIntl();
4747

48-
const { submitCallback, alleMerknaderFraBeslutter, isReadOnly } = usePanelDataContext<BekreftTerminbekreftelseAp>();
48+
const { submitCallback, alleMerknaderFraBeslutter, isReadOnly } = usePanelDataContext<SjekkTerminbekreftelseAp>();
4949

5050
const { mellomlagretFormData, setMellomlagretFormData } = useMellomlagretFormData<FormValues>();
5151

@@ -133,7 +133,7 @@ const initialValues = (gjeldende: FødselGjeldende, aksjonspunkt: Aksjonspunkt):
133133
...FaktaBegrunnelseTextField.initialValues(aksjonspunkt),
134134
});
135135

136-
const transformValues = (values: FormValues): BekreftTerminbekreftelseAp => ({
136+
const transformValues = (values: FormValues): SjekkTerminbekreftelseAp => ({
137137
kode: AksjonspunktKode.TERMINBEKREFTELSE,
138138
utstedtdato: values.utstedtdato!,
139139
termindato: values.termindato!,

packages/fakta/fodsel/src/components/form/BarnFieldArray.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,12 @@ BarnFieldArray.initialValues = (gjeldende: FødselGjeldende): BarnFormValues =>
150150
});
151151

152152
BarnFieldArray.transformValues = (
153-
values: BarnFormValues,
153+
{ barn }: BarnFormValues,
154154
skalListeBrukes: boolean,
155-
): { uidentifiserteBarn: { fodselsdato: string; dodsdato: string | undefined }[] } => ({
155+
): { barn: { fodselsdato: string; dodsdato: string | undefined }[] } => ({
156156
// @ts-expect-error skal være en tom liste eller null men backend må fikses
157-
uidentifiserteBarn: skalListeBrukes
158-
? values.barn.map(ab => ({
157+
barn: skalListeBrukes
158+
? barn.map(ab => ({
159159
fodselsdato: ab.fodselsdato,
160160
dodsdato: ab.dodsdato === '' || ab.dodsdato === null ? undefined : ab.dodsdato,
161161
}))
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import { useForm } from 'react-hook-form';
2+
import { FormattedMessage } from 'react-intl';
3+
4+
import { Button, HStack, VStack } from '@navikt/ds-react';
5+
import { Form, RadioGroupPanel } from '@navikt/ft-form-hooks';
6+
import { required } from '@navikt/ft-form-validators';
7+
8+
import { type FaktaBegrunnelseFormValues, FaktaBegrunnelseTextField, FaktaSubmitButton } from '@navikt/fp-fakta-felles';
9+
import { AksjonspunktKode } from '@navikt/fp-kodeverk';
10+
import type { Aksjonspunkt, FødselGjeldende } from '@navikt/fp-types';
11+
import type { OverstyringFaktaFødselAp } from '@navikt/fp-types-avklar-aksjonspunkter';
12+
import { usePanelDataContext } from '@navikt/fp-utils';
13+
14+
import { BarnFieldArray, type BarnFormValues } from '../form/BarnFieldArray';
15+
import { Termindato, type TermindatoFormValues } from '../form/Termindato';
16+
17+
interface Props {
18+
gjeldende: FødselGjeldende;
19+
isReadOnly: boolean;
20+
submittable: boolean;
21+
overstyringsAP: Aksjonspunkt | undefined;
22+
avbrytOverstyring: () => void;
23+
}
24+
25+
type FormValues = { erBarnetFødt: boolean } & TermindatoFormValues & BarnFormValues & FaktaBegrunnelseFormValues;
26+
27+
export const OverstyringForm = ({ gjeldende, isReadOnly, submittable, avbrytOverstyring, overstyringsAP }: Props) => {
28+
const { submitCallback } = usePanelDataContext();
29+
30+
const formMethods = useForm<FormValues>({
31+
defaultValues: initialValues(gjeldende, overstyringsAP),
32+
});
33+
34+
return (
35+
<Form formMethods={formMethods} onSubmit={values => submitCallback(transformValues(values))}>
36+
<VStack gap="6">
37+
<Termindato isReadOnly={isReadOnly} />
38+
<RadioGroupPanel
39+
name="erBarnetFødt"
40+
label={<FormattedMessage id="OverstyringForm.ErBarnetFødt" />}
41+
validate={[required]}
42+
isReadOnly={isReadOnly}
43+
isHorizontal
44+
size="medium"
45+
isTrueOrFalseSelection
46+
radios={[
47+
{
48+
label: <FormattedMessage id="OverstyringForm.Ja" />,
49+
value: 'true',
50+
element: <BarnFieldArray isReadOnly={isReadOnly} />,
51+
},
52+
{
53+
label: <FormattedMessage id="OverstyringForm.Nei" />,
54+
value: 'false',
55+
disabled: gjeldende.barn.some(b => b.kilde === 'FOLKEREGISTER'),
56+
},
57+
]}
58+
/>
59+
<FaktaBegrunnelseTextField
60+
isSubmittable={submittable}
61+
isReadOnly={isReadOnly}
62+
hasBegrunnelse={true}
63+
size="medium"
64+
/>
65+
66+
{!isReadOnly && (
67+
<HStack gap="2">
68+
<FaktaSubmitButton
69+
isSubmittable={submittable}
70+
isReadOnly={isReadOnly}
71+
isSubmitting={formMethods.formState.isSubmitting}
72+
isDirty={formMethods.formState.isDirty}
73+
/>
74+
<Button variant="secondary" size="small" type="button" onClick={() => avbrytOverstyring()}>
75+
<FormattedMessage id="OverstyringForm.Avbryt" />
76+
</Button>
77+
</HStack>
78+
)}
79+
</VStack>
80+
</Form>
81+
);
82+
};
83+
84+
const initialValues = (gjeldende: FødselGjeldende, overstyringsAP?: Aksjonspunkt) => ({
85+
termindato: gjeldende.termindato?.termindato ?? '',
86+
erBarnetFødt: gjeldende.barn.length > 0,
87+
...BarnFieldArray.initialValues(gjeldende),
88+
...FaktaBegrunnelseTextField.initialValues(overstyringsAP),
89+
});
90+
91+
const transformValues = (values: FormValues): OverstyringFaktaFødselAp => ({
92+
kode: AksjonspunktKode.OVERSTYRING_AV_FAKTA_OM_FØDSEL,
93+
termindato: values.termindato,
94+
...BarnFieldArray.transformValues(values, values.erBarnetFødt),
95+
...FaktaBegrunnelseTextField.transformValues(values),
96+
});
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { useState } from 'react';
2+
import { FormattedMessage, useIntl } from 'react-intl';
3+
4+
import { Heading, HStack } from '@navikt/ds-react';
5+
import { OverstyringKnapp } from '@navikt/ft-ui-komponenter';
6+
7+
import { AksjonspunktKode } from '@navikt/fp-kodeverk';
8+
import type { FødselGjeldende } from '@navikt/fp-types';
9+
import { FaktaKort } from '@navikt/fp-ui-komponenter';
10+
import { usePanelDataContext } from '@navikt/fp-utils';
11+
12+
import { OverstyringForm } from './OverstyringForm';
13+
14+
interface Props {
15+
kanOverstyre: boolean;
16+
gjeldende: FødselGjeldende;
17+
submittable: boolean;
18+
}
19+
20+
export const OverstyringPanel = ({ kanOverstyre, gjeldende, submittable }: Props) => {
21+
const intl = useIntl();
22+
if (!kanOverstyre) return undefined;
23+
24+
const { aksjonspunkterForPanel, isReadOnly, alleMerknaderFraBeslutter } = usePanelDataContext();
25+
const overstyringsAP = aksjonspunkterForPanel.find(
26+
a => a.definisjon === AksjonspunktKode.OVERSTYRING_AV_FAKTA_OM_FØDSEL,
27+
);
28+
const [erOverstyrt, setErOverstyrt] = useState(!!overstyringsAP);
29+
return (
30+
<>
31+
<HStack gap="4">
32+
<Heading size="small">
33+
<FormattedMessage id="OverstyringPanel.Tittel" />
34+
</Heading>
35+
{!isReadOnly && <OverstyringKnapp onClick={() => setErOverstyrt(true)} erOverstyrt={erOverstyrt} />}
36+
</HStack>
37+
38+
{erOverstyrt && (
39+
<FaktaKort
40+
label={intl.formatMessage({ id: 'OverstyringForm.Tittel' })}
41+
merknaderFraBeslutter={alleMerknaderFraBeslutter[AksjonspunktKode.OVERSTYRING_AV_FAKTA_OM_FØDSEL]}
42+
>
43+
<OverstyringForm
44+
isReadOnly={isReadOnly}
45+
gjeldende={gjeldende}
46+
submittable={submittable}
47+
overstyringsAP={overstyringsAP}
48+
avbrytOverstyring={() => setErOverstyrt(false)}
49+
/>
50+
</FaktaKort>
51+
)}
52+
</>
53+
);
54+
};

packages/kodeverk/src/aksjonspunktCodes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export enum AksjonspunktKode {
3535
VARSEL_REVURDERING_ETTERKONTROLL = '5025', // Utgått, brukes i historikk
3636
VARSEL_REVURDERING_MANUELL = '5026',
3737
SJEKK_MANGLENDE_FODSEL = '5027',
38+
OVERSTYRING_AV_FAKTA_OM_FØDSEL = '6019',
3839
FORESLA_VEDTAK_MANUELT = '5028',
3940
KONTROLLER_STOR_ETTERBETALING_SØKER = '5029',
4041
AVKLAR_VERGE = '5030',

packages/types-avklar-aksjonspunkter/index.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,9 @@ export type { BekreftErMedlemVurderingAp } from './src/fakta/BekreftErMedlemVurd
1313
export type { BekreftOppholdsrettVurderingAp } from './src/fakta/BekreftOppholdsrettVurderingAp';
1414
export type { BekreftLovligOppholdVurderingAp } from './src/fakta/BekreftLovligOppholdVurderingAp';
1515
export type { AvklarFortsattMedlemskapAp } from './src/fakta/AvklarFortsattMedlemskapAp';
16-
export type { BekreftTerminbekreftelseAp } from './src/fakta/BekreftTerminbekreftelseAp';
17-
export type { SjekkManglendeFodselAp } from './src/fakta/SjekkManglendeFodselAp';
16+
export type { SjekkTerminbekreftelseAp } from './src/fakta/fødsel/SjekkTerminbekreftelseAp';
17+
export type { SjekkManglendeFodselAp } from './src/fakta/fødsel/SjekkManglendeFodselAp';
18+
export type { OverstyringFaktaFødselAp } from './src/fakta/fødsel/OverstyringFaktaFødselAp';
1819
export type { AvklarAnnenforelderHarRettAp } from './src/fakta/AvklarAnnenforelderHarRettAp';
1920
export type { BekreftUttaksperioderAp } from './src/fakta/BekreftUttaksperioderAp';
2021
export type { VurderArbeidsforholdPermisjonAp } from './src/fakta/VurderArbeidsforholdPermisjonAp';

0 commit comments

Comments
 (0)