diff --git a/_mocks/featureToggles.ts b/_mocks/featureToggles.ts index b285f04bb7..18aade4f63 100644 --- a/_mocks/featureToggles.ts +++ b/_mocks/featureToggles.ts @@ -106,4 +106,8 @@ export const featureTogglesFactory = () => [ key: 'BRUK_V2_VILKAR_OVERSTYRING', value: process.env.VITE_BRUK_V2_VILKAR_OVERSTYRING, }, + { + key: 'BRUK_V2_VILKAR_OPPTJENING', + value: process.env.VITE_BRUK_V2_VILKAR_OPPTJENING, + }, ]; diff --git a/deploy/dev-fss-k9saksbehandling.yml b/deploy/dev-fss-k9saksbehandling.yml index 5d3e0f0211..8ec589ec32 100644 --- a/deploy/dev-fss-k9saksbehandling.yml +++ b/deploy/dev-fss-k9saksbehandling.yml @@ -121,3 +121,5 @@ spec: value: "true" - name: BRUK_V2_VILKAR_OVERSTYRING value: "true" + - name: BRUK_V2_VILKAR_OPPTJENING + value: "true" diff --git a/deploy/prod-fss-k9saksbehandling.yml b/deploy/prod-fss-k9saksbehandling.yml index a8e0427c94..a749d0a3d7 100644 --- a/deploy/prod-fss-k9saksbehandling.yml +++ b/deploy/prod-fss-k9saksbehandling.yml @@ -118,3 +118,5 @@ spec: value: "false" - name: BRUK_V2_VILKAR_OVERSTYRING value: "false" + - name: BRUK_V2_VILKAR_OPPTJENING + value: "false" diff --git a/envDir/.env.development b/envDir/.env.development index 0bc068ad6c..3488a55164 100644 --- a/envDir/.env.development +++ b/envDir/.env.development @@ -24,4 +24,5 @@ VITE_HISTORIKK_V2_VIS=true VITE_VIS_BEGRUNNELSE_FRA_BRUKER_I_KRONISK_SYK=true VITE_NY_INNTEKT_EGET_PANEL=true VITE_BRUK_V2_FAKTA_INSTITUSJON=true -VITE_BRUK_V2_VILKAR_OVERSTYRING=true \ No newline at end of file +VITE_BRUK_V2_VILKAR_OVERSTYRING=true +VITE_BRUK_V2_VILKAR_OPPTJENING=true \ No newline at end of file diff --git a/feature-toggles.json b/feature-toggles.json index b49c48bad3..30dfcee50c 100644 --- a/feature-toggles.json +++ b/feature-toggles.json @@ -110,5 +110,9 @@ { "key": "BRUK_V2_VILKAR_OVERSTYRING", "value": "${BRUK_V2_VILKAR_OVERSTYRING}" + }, + { + "key": "BRUK_V2_VILKAR_OPPTJENING", + "value": "${BRUK_V2_VILKAR_OPPTJENING}" } ] diff --git a/package.json b/package.json index b38915de6a..87c5b4915e 100644 --- a/package.json +++ b/package.json @@ -85,6 +85,7 @@ "@testing-library/react": "16.2.0", "@testing-library/user-event": "14.6.1", "@types/history": "5.0.0", + "@types/lodash": "^4.17.16", "@types/object-hash": "^3.0.6", "@types/prop-types": "15.7.14", "@types/react": "19.0.8", diff --git a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx index 751d22def2..b00ea6d088 100644 --- a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx +++ b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx @@ -1,15 +1,22 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import OpptjeningVilkarProsessIndex from '@fpsak-frontend/prosess-vilkar-opptjening-oms'; +import { ProsessStegDef, ProsessStegOverstyringPanelDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; import { prosessStegCodes } from '@k9-sak-web/konstanter'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import { ProsessStegDef, ProsessStegPanelDef, ProsessStegOverstyringPanelDef } from '@k9-sak-web/behandling-felles'; +import OpptjeningVilkarProsessIndexV2 from '@k9-sak-web/gui/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.js'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; import { OmsorgspengerBehandlingApiKeys } from '../../data/omsorgspengerBehandlingApi'; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + if (props.featureToggles.BRUK_V2_VILKAR_OPPTJENING) { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + } + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_OPPTJENINGSVILKARET]; diff --git a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/OpptjeningPanelDef.tsx b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/OpptjeningPanelDef.tsx index b6842ddc38..082abbd94a 100644 --- a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/OpptjeningPanelDef.tsx +++ b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarPaneler/OpptjeningPanelDef.tsx @@ -1,8 +1,10 @@ +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import OpptjeningVilkarProsessIndex from '@fpsak-frontend/prosess-vilkar-opptjening-oms'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import { ProsessStegPanelDef, ProsessStegOverstyringPanelDef } from '@k9-sak-web/behandling-felles'; +import { ProsessStegOverstyringPanelDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import OpptjeningVilkarProsessIndexV2 from '@k9-sak-web/gui/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.js'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; import { OmsorgspengerBehandlingApiKeys } from '../../../data/omsorgspengerBehandlingApi'; class OpptjeningPanelDef extends ProsessStegPanelDef { @@ -10,7 +12,14 @@ class OpptjeningPanelDef extends ProsessStegPanelDef { getTekstKode = () => 'Behandlingspunkt.Opptjening'; - getKomponent = props => ; + getKomponent = props => { + if (props.featureToggles.BRUK_V2_VILKAR_OPPTJENING) { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + } + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_OPPTJENINGSVILKARET]; diff --git a/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx b/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx index bf8ac88bb5..287c1853d1 100644 --- a/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx +++ b/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx @@ -1,15 +1,22 @@ -import React from 'react'; - -import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; +import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import OpptjeningVilkarProsessIndex from '@fpsak-frontend/prosess-vilkar-opptjening-oms'; -import { ProsessStegPanelDef, ProsessStegOverstyringPanelDef } from '@k9-sak-web/behandling-felles'; +import { ProsessStegOverstyringPanelDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import OpptjeningVilkarProsessIndexV2 from '@k9-sak-web/gui/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.js'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; import { OpplaeringspengerBehandlingApiKeys } from '../../../data/opplaeringspengerBehandlingApi'; class OpptjeningPanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + if (props.featureToggles.BRUK_V2_VILKAR_OPPTJENING) { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + } + return ; + }; getTekstKode = () => 'Behandlingspunkt.Opptjening'; diff --git a/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx b/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx index 4762f459e3..8af1978547 100644 --- a/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx +++ b/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx @@ -1,10 +1,10 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import OpptjeningVilkarProsessIndex from '@fpsak-frontend/prosess-vilkar-opptjening-oms'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import { ProsessStegPanelDef, ProsessStegOverstyringPanelDef } from '@k9-sak-web/behandling-felles'; +import { ProsessStegOverstyringPanelDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import OpptjeningVilkarProsessIndexV2 from '@k9-sak-web/gui/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.js'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; import { PleiepengerSluttfaseBehandlingApiKeys } from '../../../data/pleiepengerSluttfaseBehandlingApi'; class OpptjeningPanelDef extends ProsessStegPanelDef { @@ -12,7 +12,14 @@ class OpptjeningPanelDef extends ProsessStegPanelDef { getTekstKode = () => 'Behandlingspunkt.Opptjening'; - getKomponent = props => ; + getKomponent = props => { + if (props.featureToggles.BRUK_V2_VILKAR_OPPTJENING) { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + } + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_OPPTJENINGSVILKARET]; diff --git a/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx b/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx index 0550017b81..c2a7348e34 100644 --- a/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx +++ b/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/inngangsvilkarFortsPaneler/OpptjeningPanelDef.tsx @@ -1,15 +1,22 @@ -import React from 'react'; - -import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; +import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import OpptjeningVilkarProsessIndex from '@fpsak-frontend/prosess-vilkar-opptjening-oms'; -import { ProsessStegPanelDef, ProsessStegOverstyringPanelDef } from '@k9-sak-web/behandling-felles'; +import { ProsessStegOverstyringPanelDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import OpptjeningVilkarProsessIndexV2 from '@k9-sak-web/gui/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.js'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; import { PleiepengerBehandlingApiKeys } from '../../../data/pleiepengerBehandlingApi'; class OpptjeningPanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + if (props.featureToggles.BRUK_V2_VILKAR_OPPTJENING) { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + } + return ; + }; getTekstKode = () => 'Behandlingspunkt.Opptjening'; diff --git a/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx b/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx index 2525416002..42173abcc6 100644 --- a/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx +++ b/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/OpptjeningProsessStegPanelDef.tsx @@ -1,15 +1,22 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarType from '@fpsak-frontend/kodeverk/src/vilkarType'; import OpptjeningVilkarProsessIndex from '@fpsak-frontend/prosess-vilkar-opptjening-oms'; +import { ProsessStegDef, ProsessStegOverstyringPanelDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; import { prosessStegCodes } from '@k9-sak-web/konstanter'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import { ProsessStegDef, ProsessStegPanelDef, ProsessStegOverstyringPanelDef } from '@k9-sak-web/behandling-felles'; +import OpptjeningVilkarProsessIndexV2 from '@k9-sak-web/gui/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.js'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; import { UnntakBehandlingApiKeys } from '../../data/unntakBehandlingApi'; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + if (props.featureToggles.BRUK_V2_VILKAR_OPPTJENING) { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + } + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_OPPTJENINGSVILKARET]; diff --git a/packages/v2/gui/package.json b/packages/v2/gui/package.json index 5c3a74ebbd..f5d3ef0d24 100644 --- a/packages/v2/gui/package.json +++ b/packages/v2/gui/package.json @@ -25,6 +25,7 @@ "@tanstack/react-query": "^5.66.11", "@types/object-hash": "^3.0.6", "axios": "1.8.1", + "lodash": "4.17.21", "object-hash": "^3.0.0", "react": "19.0.0", "react-hook-form": "7.54.2", diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndex.stories.tsx b/packages/v2/gui/src/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndex.stories.tsx new file mode 100644 index 0000000000..4e3bd2ad71 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndex.stories.tsx @@ -0,0 +1,343 @@ +import { + AksjonspunktDtoDefinisjon, + AksjonspunktDtoStatus, + FastsattOpptjeningAktivitetDtoKlasse, + FastsattOpptjeningAktivitetDtoType, + VilkårPeriodeDtoMerknad, +} from '@k9-sak-web/backend/k9sak/generated'; +import { fagsakYtelsesType } from '@k9-sak-web/backend/k9sak/kodeverk/FagsakYtelsesType.js'; +import type { Meta, StoryObj } from '@storybook/react'; +import { expect, fn, userEvent } from '@storybook/test'; +import { asyncAction } from '../../storybook/asyncAction'; +import OpptjeningVilkarProsessIndexV2 from './OpptjeningVilkarProsessIndexV2'; + +const opptjening = { + fastsattOpptjening: { + opptjeningperiode: { + måneder: 2, + dager: 3, + }, + vurderesIAksjonspunkt: true, + fastsattOpptjeningAktivitetList: [ + { + id: 1, + fom: '2018-01-01', + tom: '2018-04-04', + klasse: FastsattOpptjeningAktivitetDtoKlasse.BEKREFTET_GODKJENT, + type: FastsattOpptjeningAktivitetDtoType.ARBEID, + }, + ], + opptjeningFom: '2018-01-01', + opptjeningTom: '2018-10-01', + }, +}; + +const opptjening2 = { + fastsattOpptjening: { + opptjeningperiode: { + måneder: 4, + dager: 6, + }, + vurderesIAksjonspunkt: false, + fastsattOpptjeningAktivitetList: [ + { + id: 1, + fom: '2018-05-01', + tom: '2018-09-04', + klasse: FastsattOpptjeningAktivitetDtoKlasse.BEKREFTET_GODKJENT, + type: FastsattOpptjeningAktivitetDtoType.ARBEID, + }, + ], + opptjeningFom: '2018-02-01', + opptjeningTom: '2018-12-01', + }, +}; + +const opptjeningUten847B = { + opptjeningAktivitetList: [ + { + id: 1, + opptjeningFom: '2018-05-01', + opptjeningTom: '2018-11-15', + klasse: FastsattOpptjeningAktivitetDtoKlasse.BEKREFTET_GODKJENT, + type: FastsattOpptjeningAktivitetDtoType.ARBEID, + }, + ], + fastsattOpptjening: { + opptjeningperiode: { + måneder: 0, + dager: 10, + }, + vurderesIAksjonspunkt: false, + fastsattOpptjeningAktivitetList: [ + { + id: 1, + fom: '2018-05-01', + tom: '2018-09-04', + klasse: FastsattOpptjeningAktivitetDtoKlasse.BEKREFTET_GODKJENT, + type: FastsattOpptjeningAktivitetDtoType.ARBEID, + }, + ], + opptjeningFom: '2018-02-01', + opptjeningTom: '2018-12-01', + }, +}; + +const opptjeningMed847B = { + opptjeningAktivitetList: [ + { + id: 1, + opptjeningFom: '2018-05-01', + opptjeningTom: '2018-11-15', + klasse: FastsattOpptjeningAktivitetDtoKlasse.BEKREFTET_GODKJENT, + }, + { + id: 2, + opptjeningFom: '2018-12-02', + opptjeningTom: '2018-12-15', + klasse: FastsattOpptjeningAktivitetDtoKlasse.BEKREFTET_GODKJENT, + type: FastsattOpptjeningAktivitetDtoType.ARBEID, + }, + ], + fastsattOpptjening: { + opptjeningperiode: { + måneder: 0, + dager: 10, + }, + vurderesIAksjonspunkt: false, + fastsattOpptjeningAktivitetList: [ + { + id: 1, + fom: '2018-05-01', + tom: '2018-09-04', + klasse: FastsattOpptjeningAktivitetDtoKlasse.BEKREFTET_GODKJENT, + type: FastsattOpptjeningAktivitetDtoType.ARBEID, + }, + ], + opptjeningFom: '2018-02-01', + opptjeningTom: '2018-12-01', + }, +}; + +const fagsak = { + sakstype: fagsakYtelsesType.PLEIEPENGER_SYKT_BARN, // FAGSAK_YTELSE +}; + +const opptjeninger = { opptjeninger: [opptjening, opptjening2] }; + +const meta = { + title: 'gui/prosess/vilkar-opptjening', + component: OpptjeningVilkarProsessIndexV2, +} satisfies Meta; + +export default meta; + +type Story = StoryObj; + +export const VisPanelForÅpentAksjonspunkt: Story = { + args: { + fagsak: { + ...fagsak, + sakstype: fagsakYtelsesType.OMSORGSPENGER, + }, + behandling: { + id: 1, + versjon: 1, + }, + opptjening: opptjeninger, + vilkar: [ + { + perioder: [ + { + avslagKode: undefined, + merknadParametere: { + antattGodkjentArbeid: 'P10D', + antattOpptjeningAktivitetTidslinje: + 'LocalDateTimeline<2020-04-17, 2020-04-26 [1]> = [[2020-04-17, 2020-04-26]]', + }, + vilkarStatus: 'OPPFYLT', + periode: { + fom: '2020-04-27', + tom: '2020-04-27', + }, + begrunnelse: undefined, + vurderesIBehandlingen: true, + merknad: '7847B' as VilkårPeriodeDtoMerknad, + }, + ], + }, + ], + aksjonspunkter: [ + { + definisjon: AksjonspunktDtoDefinisjon.VURDER_OPPTJENINGSVILKÅRET, + status: AksjonspunktDtoStatus.OPPRETTET, + }, + ], + lovReferanse: '§§Dette er en lovreferanse', + submitCallback: fn(), + isReadOnly: false, + isAksjonspunktOpen: true, + readOnlySubmitButton: false, + visAllePerioder: false, + }, + play: async ({ args, canvas }) => { + await userEvent.type( + canvas.getByLabelText('Vurder om bruker oppfyller opptjening jf § 9-2 eller § 8-47 bokstav B'), + 'Dette er en begrunnelse', + ); + await userEvent.click(canvas.getByText('Bekreft og fortsett')); + await expect(args.submitCallback).toHaveBeenCalledWith([ + { + kode: '5089', + opptjeningPerioder: [ + { + fom: '2018-01-01', + tom: '2018-10-01', + }, + { + fom: '2018-02-01', + tom: '2018-12-01', + }, + ], + vilkårPeriodeVurderinger: [ + { + begrunnelse: 'Dette er en begrunnelse', + erVilkarOk: true, + innvilgelseMerknadKode: '7847B', + kode: '7847B', + periode: { + fom: '2020-04-27', + tom: '2020-04-27', + }, + vurderesIAksjonspunkt: true, + vurderesIBehandlingen: true, + }, + ], + }, + ]); + }, +}; + +export const VisPanelForPSBÅpentAksjonspunktUten847B: Story = { + args: { + fagsak, + behandling: { + id: 1, + versjon: 1, + }, + opptjening: { opptjeninger: [opptjeningUten847B] }, + vilkar: [ + { + perioder: [ + { + avslagKode: undefined, + merknad: '7847A' as VilkårPeriodeDtoMerknad, + merknadParametere: { + antattGodkjentArbeid: 'P10D', + antattOpptjeningAktivitetTidslinje: + 'LocalDateTimeline<2020-04-17, 2020-04-26 [1]> = [[2020-04-17, 2020-04-26]]', + }, + vilkarStatus: 'OPPFYLT', + + periode: { + fom: '2018-12-02', + tom: '2018-12-15', + }, + begrunnelse: undefined, + vurderesIBehandlingen: true, + }, + ], + }, + ], + aksjonspunkter: [ + { + definisjon: AksjonspunktDtoDefinisjon.VURDER_OPPTJENINGSVILKÅRET, + status: AksjonspunktDtoStatus.OPPRETTET, + }, + ], + submitCallback: asyncAction('Send inn skjema'), + isReadOnly: false, + isAksjonspunktOpen: true, + readOnlySubmitButton: false, + visAllePerioder: false, + }, +}; + +export const VisPanelForPSBÅpentAksjonspunktMed847B: Story = { + args: { + fagsak, + behandling: { id: 1, versjon: 1 }, + opptjening: { opptjeninger: [opptjeningMed847B] }, + vilkar: [ + { + perioder: [ + { + avslagKode: undefined, + merknadParametere: { + antattGodkjentArbeid: 'P10D', + antattOpptjeningAktivitetTidslinje: + 'LocalDateTimeline<2020-04-17, 2020-04-26 [1]> = [[2020-04-17, 2020-04-26]]', + }, + merknad: '-' as VilkårPeriodeDtoMerknad, + vilkarStatus: 'OPPFYLT', + periode: { + fom: '2018-12-02', + tom: '2018-12-15', + }, + begrunnelse: undefined, + vurderesIBehandlingen: true, + }, + ], + }, + ], + aksjonspunkter: [ + { + definisjon: AksjonspunktDtoDefinisjon.VURDER_OPPTJENINGSVILKÅRET, + status: AksjonspunktDtoStatus.OPPRETTET, + }, + ], + lovReferanse: '§§Dette er en lovreferanse', + submitCallback: asyncAction('Send inn skjema'), + isReadOnly: false, + isAksjonspunktOpen: true, + readOnlySubmitButton: false, + visAllePerioder: false, + }, +}; + +export const VisPanelForNårEnIkkeHarAksjonspunkt: Story = { + args: { + fagsak: { sakstype: fagsakYtelsesType.OMSORGSPENGER }, + behandling: { id: 1, versjon: 1 }, + opptjening: { opptjeninger: [opptjening] }, + vilkar: [ + { + perioder: [ + { + avslagKode: undefined, + merknadParametere: { + antattGodkjentArbeid: 'P10D', + antattOpptjeningAktivitetTidslinje: + 'LocalDateTimeline<2020-04-17, 2020-04-26 [1]> = [[2020-04-17, 2020-04-26]]', + }, + vilkarStatus: 'OPPFYLT', + periode: { + fom: '2020-04-27', + tom: '2020-04-27', + }, + begrunnelse: undefined, + vurderesIBehandlingen: true, + merknad: '-' as VilkårPeriodeDtoMerknad, + }, + ], + }, + ], + aksjonspunkter: [], + lovReferanse: '§§Dette er en lovreferanse', + submitCallback: asyncAction('Send inn skjema'), + isReadOnly: true, + isAksjonspunktOpen: false, + readOnlySubmitButton: false, + visAllePerioder: false, + }, +}; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.tsx b/packages/v2/gui/src/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.tsx new file mode 100644 index 0000000000..2f67dd4fb8 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/OpptjeningVilkarProsessIndexV2.tsx @@ -0,0 +1,112 @@ +import { VilkårPeriodeDtoVilkarStatus, type OpptjeningDto } from '@k9-sak-web/backend/k9sak/generated'; +import { formatDate } from '@k9-sak-web/lib/dateUtils/dateUtils.js'; +import { ExclamationmarkTriangleFillIcon } from '@navikt/aksel-icons'; +import { SideMenu } from '@navikt/ft-plattform-komponenter'; +import { createIntl } from '@navikt/ft-utils'; +import classNames from 'classnames/bind'; +import { isEqual } from 'lodash'; +import { useEffect, useState } from 'react'; +import { RawIntlProvider } from 'react-intl'; +import { hentAktivePerioderFraVilkar } from '../../utils/hentAktivePerioderFraVilkar'; +import OpptjeningVilkarAksjonspunktPanel from './components/OpptjeningVilkarAksjonspunktPanel'; +import styles from './opptjeningVilkarProsessIndex.module.css'; +import type { Aksjonspunkt } from './types/Aksjonspunkt'; +import type { Behandling } from './types/Behandling'; +import type { Fagsak } from './types/Fagsak'; +import type { SubmitCallback } from './types/SubmitCallback'; +import type { Vilkår } from './types/Vilkår'; + +const cx = classNames.bind(styles); + +const intl = createIntl({ + locale: 'nb-NO', +}); + +interface OpptjeningVilkarProsessIndexProps { + fagsak: Fagsak; + behandling: Behandling; + opptjening: { opptjeninger: OpptjeningDto[] }; + aksjonspunkter: Aksjonspunkt[]; + vilkar: Vilkår[]; + lovReferanse?: string; + submitCallback: (props: SubmitCallback[]) => void; + isReadOnly: boolean; + isAksjonspunktOpen: boolean; + readOnlySubmitButton: boolean; + visAllePerioder: boolean; +} + +const OpptjeningVilkarProsessIndexV2 = ({ + fagsak, + behandling, + opptjening, + aksjonspunkter, + vilkar, + lovReferanse, + submitCallback, + isReadOnly, + isAksjonspunktOpen, + readOnlySubmitButton, + visAllePerioder, +}: OpptjeningVilkarProsessIndexProps) => { + const [activeTab, setActiveTab] = useState(0); + + const [activeVilkår] = vilkar; + const perioder = hentAktivePerioderFraVilkar(vilkar, visAllePerioder); + + useEffect(() => { + if (!visAllePerioder && activeTab >= perioder.length) { + setActiveTab(0); + } + }, [activeTab, visAllePerioder, perioder.length]); + + const activePeriode = perioder.length === 1 ? perioder[0] : perioder[activeTab]; + if (!activePeriode) { + return null; + } + const getIndexBlantAllePerioder = () => + activeVilkår?.perioder?.findIndex(({ periode }) => isEqual(periode, activePeriode?.periode)) ?? 0; + + return ( + +
+
+ ({ + active: activeTab === index, + label: `${formatDate(periode.fom)} - ${formatDate(periode.tom)}`, + icon: + isAksjonspunktOpen && vilkarStatus === VilkårPeriodeDtoVilkarStatus.IKKE_VURDERT ? ( + + ) : null, + }))} + onClick={setActiveTab} + heading="Perioder" + /> +
+
+ +
+
+
+ ); +}; + +export default OpptjeningVilkarProsessIndexV2; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningPanel.tsx b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningPanel.tsx new file mode 100644 index 0000000000..3fe99f00f6 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningPanel.tsx @@ -0,0 +1,100 @@ +import { Lovreferanse } from '@k9-sak-web/gui/shared/lovreferanse/Lovreferanse.js'; +import { CheckmarkCircleFillIcon, XMarkOctagonFillIcon } from '@navikt/aksel-icons'; +import { BodyShort, Button, Detail, Heading, HStack, Label, VStack } from '@navikt/ds-react'; +import { type ReactNode } from 'react'; +import { useFormContext } from 'react-hook-form'; +import AksjonspunktBox from '../../../shared/aksjonspunktBox/AksjonspunktBox'; +import type { VilkårFieldFormValues } from '../types/VilkårFieldFormValues'; +import styles from './opptjeningPanel.module.css'; + +interface OwnProps { + title: string; + behandlingId: number; + behandlingVersjon: number; + lovReferanse?: string; + isAksjonspunktOpen: boolean; + readOnlySubmitButton: boolean; + originalErVilkarOk?: boolean; + readOnly: boolean; + isDirty?: boolean; + children: ReactNode | ReactNode[]; + isPeriodisertFormComplete?: boolean; + skjulAksjonspunktVisning?: boolean; + aksjonspunktErLøst?: boolean; +} + +/* + * OpptjeningPanel + * + * Presentasjonskomponent. + */ +const OpptjeningPanel = ({ + lovReferanse, + title, + originalErVilkarOk, + isAksjonspunktOpen, + readOnly, + children, + skjulAksjonspunktVisning, + aksjonspunktErLøst, +}: OwnProps) => { + const formMethods = useFormContext(); + return ( + <> + + + {aksjonspunktErLøst ? ( + originalErVilkarOk ? ( + + ) : ( + + ) + ) : null} + + {title} + + {lovReferanse && ( + + {lovReferanse} + + )} + + +
+ {aksjonspunktErLøst && ( + <> + {originalErVilkarOk && ( + + )} + {originalErVilkarOk === false && ( + + )} + + )} + {!isAksjonspunktOpen && originalErVilkarOk === undefined && ( + Ikke behandlet + )} +
+
+ {isAksjonspunktOpen &&
} + + {children} + {!readOnly &&
} + {!skjulAksjonspunktVisning && !readOnly && ( + + )} + + + ); +}; + +export default OpptjeningPanel; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.module.css b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.module.css new file mode 100644 index 0000000000..8599483d65 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.module.css @@ -0,0 +1,3 @@ +.titelOgHjelpetekstFlexbox { + display: flex; +} diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.module.d.css.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.module.d.css.ts new file mode 100644 index 0000000000..34a284afc7 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.module.d.css.ts @@ -0,0 +1,5 @@ +declare const styles: { + readonly "titelOgHjelpetekstFlexbox": string; +}; +export = styles; + diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.tsx b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.tsx new file mode 100644 index 0000000000..fd92120a03 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/OpptjeningVilkarAksjonspunktPanel.tsx @@ -0,0 +1,241 @@ +import { + AksjonspunktDtoDefinisjon, + type AksjonspunktDto, + type OpptjeningDto, + type VilkårPeriodeDto, +} from '@k9-sak-web/backend/k9sak/generated'; +import { fagsakYtelsesType, type FagsakYtelsesType } from '@k9-sak-web/backend/k9sak/kodeverk/FagsakYtelsesType.js'; +import FeatureTogglesContext from '@k9-sak-web/gui/utils/featureToggles/FeatureTogglesContext.js'; +import { HelpText, Label } from '@navikt/ds-react'; +import { Form } from '@navikt/ft-form-hooks'; +import dayjs from 'dayjs'; +import isBetween from 'dayjs/plugin/isBetween'; +import { useContext } from 'react'; +import { useForm, useWatch } from 'react-hook-form'; + +import type { FeatureToggles } from '@k9-sak-web/lib/types/FeatureTogglesType.js'; +import type { Aksjonspunkt } from '../types/Aksjonspunkt'; +import type { SubmitCallback } from '../types/SubmitCallback'; +import { type VilkårFieldFormValues } from '../types/VilkårFieldFormValues'; +import OpptjeningPanel from './OpptjeningPanel'; +import styles from './OpptjeningVilkarAksjonspunktPanel.module.css'; +import VilkarField, { erVilkarOk, opptjeningMidlertidigInaktivKoder } from './VilkarField'; + +dayjs.extend(isBetween); + +export const buildInitialValues = ( + vilkårPerioder: VilkårPeriodeDto[], + opptjening: OpptjeningDto[], + featureToggles: FeatureToggles, +): VilkårFieldFormValues => { + const utledKode = (periode: VilkårPeriodeDto) => { + if ( + periode.merknad === opptjeningMidlertidigInaktivKoder.TYPE_A || + periode.merknad === opptjeningMidlertidigInaktivKoder.TYPE_B + ) { + return periode.merknad as '7847A' | '7847B'; + } + return periode.vilkarStatus as 'OPPFYLT' | 'IKKE_OPPFYLT'; + }; + + return { + vilkarFields: Array.isArray(vilkårPerioder) + ? vilkårPerioder.map(periode => { + const skjæringstidspunkt = periode.periode.fom; + const opptjeningForPeriode = opptjening?.find( + o => dayjs(o?.fastsattOpptjening?.opptjeningTom).add(1, 'day').format('YYYY-MM-DD') === skjæringstidspunkt, + ); + + return { + begrunnelse: periode.begrunnelse ?? '', + vurderesIBehandlingen: !!periode.vurderesIBehandlingen, + vurderesIAksjonspunkt: featureToggles?.['OPPTJENING_READ_ONLY_PERIODER'] + ? !!opptjeningForPeriode?.fastsattOpptjening?.vurderesIAksjonspunkt + : true, + kode: utledKode(periode), + }; + }) + : [], + }; +}; + +interface OpptjeningVilkarAksjonspunktPanelImplProps { + aksjonspunkter: Aksjonspunkt[]; + behandlingId: number; + behandlingVersjon: number; + isApOpen: boolean; + lovReferanse?: string; + fagsakType?: FagsakYtelsesType; + readOnly: boolean; + readOnlySubmitButton: boolean; + submitCallback: (props: SubmitCallback[]) => void; + periodeIndex: number; + vilkårPerioder: VilkårPeriodeDto[]; + opptjeninger: OpptjeningDto[]; +} + +/** + * OpptjeningVilkarAksjonspunktPanel + * + * Presentasjonskomponent. Viser panel for å løse aksjonspunkt for avslått opptjeningsvilkår + */ +export const OpptjeningVilkarAksjonspunktPanel = ({ + behandlingId, + behandlingVersjon, + isApOpen, + lovReferanse, + fagsakType, + readOnly, + readOnlySubmitButton, + aksjonspunkter, + periodeIndex, + vilkårPerioder, + opptjeninger, + submitCallback, +}: OpptjeningVilkarAksjonspunktPanelImplProps) => { + const featureToggles = useContext(FeatureTogglesContext); + + const formMethods = useForm({ + defaultValues: buildInitialValues(vilkårPerioder, opptjeninger, featureToggles), + }); + + const vilkarFields = useWatch({ control: formMethods.control, name: 'vilkarFields' }); + + const handleSubmit = async (formvalues: VilkårFieldFormValues) => { + await submitCallback([transformValues(formvalues, aksjonspunkter, vilkårPerioder, opptjeninger)]); + }; + + const vilkarField = vilkarFields?.[periodeIndex]; + const allePerioderHarVurdering = () => { + const isAllTabsCreated = Array.isArray(vilkårPerioder) && vilkårPerioder.length === vilkarFields?.length; + return isAllTabsCreated + ? !vilkarFields.some( + vilkarField => + vilkarField.vurderesIBehandlingen && + vilkarField.vurderesIAksjonspunkt && + (!vilkarField.begrunnelse || !vilkarField.kode), + ) + : false; + }; + + const erOmsorgspenger = + fagsakType === fagsakYtelsesType.OMSORGSPENGER || + fagsakType === fagsakYtelsesType.OMSORGSPENGER_AO || + fagsakType === fagsakYtelsesType.OMSORGSPENGER_KS || + fagsakType === fagsakYtelsesType.OMSORGSPENGER_MA; + + const erPleiepenger = fagsakType === fagsakYtelsesType.PLEIEPENGER_SYKT_BARN; + + const finnesOpptjeningsaktiviteterVidOpptjeningTom: boolean = !erPleiepenger + ? true + : opptjeninger?.some(opptjening => { + const skjæringstidspunkt = dayjs(opptjening.fastsattOpptjening?.opptjeningTom) + .add(1, 'day') + .format('YYYY-MM-DD'); + + const vurderesOpptjeningsaktivitetIBehandling = vilkårPerioder.find( + ({ periode }) => periode.fom === skjæringstidspunkt, + )?.vurderesIBehandlingen; + + if (!vurderesOpptjeningsaktivitetIBehandling) { + return false; + } + + return opptjening.opptjeningAktivitetList?.some(opptjeningAktivitet => + // Siste argument ("[]") til isBetween inkluderer start og sluttdato + dayjs(skjæringstidspunkt).isBetween( + opptjeningAktivitet.opptjeningFom, + opptjeningAktivitet.opptjeningTom, + null, + '[]', + ), + ); + }); + + return ( +
+ AksjonspunktDtoDefinisjon.VURDER_OPPTJENINGSVILKÅRET === ap.definisjon && ap.status === 'UTFO', + )} + lovReferanse={lovReferanse} + behandlingId={behandlingId} + behandlingVersjon={behandlingVersjon} + isPeriodisertFormComplete={allePerioderHarVurdering()} + skjulAksjonspunktVisning={!vilkarField?.vurderesIAksjonspunkt} + > +
+ + + Veiledning for vurdering av opptjent rett +
    +
  • Sjekk Opptjening i Saksopplysninger.
  • +
  • Kontroller opplysningene i Arbeidsforhold.
  • +
  • + Er det perioder uten arbeidsforhold eller med permisjon/permittering i noen av arbeidsforholdene som + varer lengre en 14 dager? +
  • +
  • Sjekk opplysningene i A-inntekt
  • +
  • + Vurder om det kan være mangelfull registrering fra arbeidsgiver i Aa-registret. Hvis så, ta kontakt med + arbeidsgiver for korrigering. +
  • +
  • + Skal ytelse være en del av opptjeningen? Husk at perioder med ytelse før skjæringstidspunktet må være + utbetalt før det blir med i opptjening. +
  • +
+ Vurder om bruker oppfyller opptjeningsvilkåret jf. § 9-2 +
+ Hvis § 9-2 ikke er oppfylt. Vurder om § 8-47 bokstav A eller § 8-47 bokstav B er oppfylt. Bruker må ha + aktivt arbeidsforhold på skjæringstidspunktet for at bokstav B kan være oppfylt. +
+
+
+ {vilkarField && ( + + )} +
+
+ ); +}; + +const transformValues = ( + values: VilkårFieldFormValues, + aksjonspunkter: AksjonspunktDto[], + vilkårPerioder: VilkårPeriodeDto[], + opptjeninger: OpptjeningDto[], +) => ({ + vilkårPeriodeVurderinger: values.vilkarFields.map((vilkarField, index) => ({ + ...vilkarField, + erVilkarOk: erVilkarOk(vilkarField.kode), + innvilgelseMerknadKode: Object.values(opptjeningMidlertidigInaktivKoder).includes(vilkarField.kode) + ? vilkarField.kode + : undefined, + periode: Array.isArray(vilkårPerioder) && vilkårPerioder[index] ? vilkårPerioder[index].periode : {}, + })), + opptjeningPerioder: Array.isArray(opptjeninger) + ? opptjeninger.map(opptjening => ({ + fom: opptjening.fastsattOpptjening?.opptjeningFom, + tom: opptjening.fastsattOpptjening?.opptjeningTom, + })) + : [], + kode: aksjonspunkter?.[0]?.definisjon ?? '', +}); + +export default OpptjeningVilkarAksjonspunktPanel; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarField.tsx b/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarField.tsx new file mode 100644 index 0000000000..8a4c92bd1c --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarField.tsx @@ -0,0 +1,140 @@ +import FeatureTogglesContext from '@k9-sak-web/gui/utils/featureToggles/FeatureTogglesContext.js'; +import { CheckmarkCircleFillIcon, XMarkOctagonFillIcon } from '@navikt/aksel-icons'; +import { BodyShort, Box, HStack } from '@navikt/ds-react'; +import { RadioGroupPanel, TextAreaField } from '@navikt/ft-form-hooks'; +import { maxLength, minLength, required } from '@navikt/ft-form-validators'; +import { useContext } from 'react'; +import type { VilkårFieldFormValues } from '../types/VilkårFieldFormValues'; +import type { VilkårFieldType } from '../types/VilkårFieldType'; + +const validateMinLength3 = minLength(3); +const validateMaxLength1500 = maxLength(1500); + +export const opptjeningMidlertidigInaktivKoder = { + TYPE_A: '7847A', + TYPE_B: '7847B', +}; + +interface VilkarFieldsProps { + erOmsorgspenger?: boolean; + fieldPrefix: string; + readOnly: boolean; + field: VilkårFieldType; + skalValgMidlertidigInaktivTypeBVises: boolean; +} + +export const erVilkarOk = (kode: string) => { + if ( + kode === 'OPPFYLT' || + opptjeningMidlertidigInaktivKoder.TYPE_A === kode || + opptjeningMidlertidigInaktivKoder.TYPE_B === kode + ) { + return true; + } + return false; +}; + +export const hent847Text = (kode: string) => { + const kodeTekster: { [key: string]: string } = { + [opptjeningMidlertidigInaktivKoder.TYPE_A]: 'Vilkåret beregnes jf § 8-47 bokstav A', + [opptjeningMidlertidigInaktivKoder.TYPE_B]: 'Vilkåret beregnes jf § 8-47 bokstav B', + }; + + return kodeTekster[kode] || ''; +}; +export const VilkarField = ({ + erOmsorgspenger, + fieldPrefix, + field, + readOnly, + skalValgMidlertidigInaktivTypeBVises, +}: VilkarFieldsProps & Partial) => { + const featureToggles = useContext(FeatureTogglesContext); + const erIkkeOppfyltText = ( + <> + Søker har ikke oppfylt krav om 28 dagers opptjening, vilkåret er ikke oppfylt. + + ); + const erOppfyltText = 'Søker har oppfylt krav om 28 dagers opptjening, vilkåret er oppfylt.'; + + const vilkarVurderingTekst = () => { + if (erVilkarOk(field?.kode) && Object.values(opptjeningMidlertidigInaktivKoder).includes(field?.kode)) { + return hent847Text(field?.kode); + } + if (erVilkarOk(field?.kode)) { + return erOppfyltText; + } + return erIkkeOppfyltText; + }; + + return ( + <> + + + + {readOnly && ( + + {erVilkarOk(field?.kode) ? ( + + ) : ( + + )} + {vilkarVurderingTekst()} + + )} + {!readOnly && ( + { + if (featureToggles?.['OPPTJENING_READ_ONLY_PERIODER']) { + return v.value !== 'OPPFYLT'; + } + return true; + })} + /> + )} + + + ); +}; + +export default VilkarField; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarFields.module.css b/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarFields.module.css new file mode 100644 index 0000000000..15f0c04cbf --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarFields.module.css @@ -0,0 +1,5 @@ +.image { + height: 16px; + margin-top: -2px; + width: 16px; +} diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarFields.module.d.css.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarFields.module.d.css.ts new file mode 100644 index 0000000000..896211a74d --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/VilkarFields.module.d.css.ts @@ -0,0 +1,5 @@ +declare const styles: { + readonly "image": string; +}; +export = styles; + diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/opptjeningPanel.module.css b/packages/v2/gui/src/prosess/vilkar-opptjening/components/opptjeningPanel.module.css new file mode 100644 index 0000000000..22d132729b --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/opptjeningPanel.module.css @@ -0,0 +1,13 @@ +.vilkar { + margin-top: 3px; +} + +.aksjonspunktMargin { + margin-left: -20px; + min-width: 400px; +} + +.status { + height: 20px; + width: 20px; +} diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/components/opptjeningPanel.module.d.css.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/components/opptjeningPanel.module.d.css.ts new file mode 100644 index 0000000000..80efcf5b34 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/components/opptjeningPanel.module.d.css.ts @@ -0,0 +1,7 @@ +declare const styles: { + readonly "aksjonspunktMargin": string; + readonly "status": string; + readonly "vilkar": string; +}; +export = styles; + diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/opptjeningVilkarProsessIndex.module.css b/packages/v2/gui/src/prosess/vilkar-opptjening/opptjeningVilkarProsessIndex.module.css new file mode 100644 index 0000000000..a565a5f1f1 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/opptjeningVilkarProsessIndex.module.css @@ -0,0 +1,16 @@ +.contentContainer { + flex: 1; +} + +.sideMenuContainer { + margin: 0 32px 0 0; +} + +.mainContainer--withSideMenu { + display: flex; + margin-left: -8px; +} + +.warningIcon { + margin-left: 1rem; +} diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/opptjeningVilkarProsessIndex.module.d.css.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/opptjeningVilkarProsessIndex.module.d.css.ts new file mode 100644 index 0000000000..848399dafa --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/opptjeningVilkarProsessIndex.module.d.css.ts @@ -0,0 +1,8 @@ +declare const styles: { + readonly "contentContainer": string; + readonly "mainContainerWithSideMenu": string; + readonly "sideMenuContainer": string; + readonly "warningIcon": string; +}; +export = styles; + diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/types/Aksjonspunkt.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Aksjonspunkt.ts new file mode 100644 index 0000000000..79d61fdaa7 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Aksjonspunkt.ts @@ -0,0 +1,6 @@ +import type { AksjonspunktDto } from '@k9-sak-web/backend/k9sak/generated'; + +export type Aksjonspunkt = { + definisjon: AksjonspunktDto['definisjon']; + status: AksjonspunktDto['status']; +}; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/types/Behandling.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Behandling.ts new file mode 100644 index 0000000000..d8185aeafa --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Behandling.ts @@ -0,0 +1,4 @@ +export type Behandling = { + id: number; + versjon: number; +}; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/types/Fagsak.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Fagsak.ts new file mode 100644 index 0000000000..ad09be081f --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Fagsak.ts @@ -0,0 +1,5 @@ +import type { FagsakDto } from '@k9-sak-web/backend/k9sak/generated'; + +export type Fagsak = { + sakstype: FagsakDto['sakstype']; +}; diff --git a/packages/v2/gui/src/prosess/vilkar-opptjening/types/SubmitCallback.ts b/packages/v2/gui/src/prosess/vilkar-opptjening/types/SubmitCallback.ts new file mode 100644 index 0000000000..86382e27e0 --- /dev/null +++ b/packages/v2/gui/src/prosess/vilkar-opptjening/types/SubmitCallback.ts @@ -0,0 +1,4 @@ +export type SubmitCallback = Readonly<{ + kode: string; + begrunnelse?: string; +}>; diff --git "a/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245r.ts" "b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245r.ts" new file mode 100644 index 0000000000..23256664fe --- /dev/null +++ "b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245r.ts" @@ -0,0 +1,5 @@ +import type { VilkårPeriodeDto } from '@k9-sak-web/backend/k9sak/generated'; + +export type Vilkår = { + perioder: Array; +}; diff --git "a/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245rFieldFormValues.ts" "b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245rFieldFormValues.ts" new file mode 100644 index 0000000000..c1ca6c708b --- /dev/null +++ "b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245rFieldFormValues.ts" @@ -0,0 +1,5 @@ +import type { VilkårFieldType } from './VilkårFieldType'; + +export type VilkårFieldFormValues = { + vilkarFields: VilkårFieldType[]; +}; diff --git "a/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245rFieldType.ts" "b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245rFieldType.ts" new file mode 100644 index 0000000000..279b4a0842 --- /dev/null +++ "b/packages/v2/gui/src/prosess/vilkar-opptjening/types/Vilk\303\245rFieldType.ts" @@ -0,0 +1,6 @@ +export type VilkårFieldType = { + begrunnelse: string; + vurderesIBehandlingen: boolean; + vurderesIAksjonspunkt: boolean; + kode: '7847A' | '7847B' | 'OPPFYLT' | 'IKKE_OPPFYLT'; +}; diff --git a/packages/v2/gui/src/prosess/vilkar-soknadsfrist/SoknadsfristVilkarProsessIndex.tsx b/packages/v2/gui/src/prosess/vilkar-soknadsfrist/SoknadsfristVilkarProsessIndex.tsx index 2b8e8aa0e2..1f3a5d87a9 100644 --- a/packages/v2/gui/src/prosess/vilkar-soknadsfrist/SoknadsfristVilkarProsessIndex.tsx +++ b/packages/v2/gui/src/prosess/vilkar-soknadsfrist/SoknadsfristVilkarProsessIndex.tsx @@ -6,6 +6,7 @@ import { ExclamationmarkTriangleFillIcon } from '@navikt/aksel-icons'; import { SideMenu } from '@navikt/ft-plattform-komponenter'; import { Dayjs } from 'dayjs'; import { useEffect, useState, type SetStateAction } from 'react'; +import { hentAktivePerioderFraVilkar } from '../../utils/hentAktivePerioderFraVilkar'; import SoknadsfristVilkarForm from './components/SoknadsfristVilkarForm'; import SoknadsfristVilkarHeader from './components/SoknadsfristVilkarHeader'; import styles from './SoknadsfristVilkarProsessIndex.module.css'; @@ -13,7 +14,7 @@ import type { SoknadsfristAksjonspunktType } from './types/SoknadsfristAksjonspu import type { SoknadsfristVilkarType } from './types/SoknadsfristVilkarType'; import type { SubmitData } from './types/submitCallback'; import type { SøknadsfristTilstand } from './types/SøknadsfristTilstand'; -import { formatDate, hentAktivePerioderFraVilkar, utledInnsendtSoknadsfrist } from './utils'; +import { formatDate, utledInnsendtSoknadsfrist } from './utils'; const lovReferanse = '§ 22-13'; diff --git a/packages/v2/gui/src/prosess/vilkar-soknadsfrist/utils.spec.ts b/packages/v2/gui/src/prosess/vilkar-soknadsfrist/utils.spec.ts index 049a834cfc..beb5e3bb05 100644 --- a/packages/v2/gui/src/prosess/vilkar-soknadsfrist/utils.spec.ts +++ b/packages/v2/gui/src/prosess/vilkar-soknadsfrist/utils.spec.ts @@ -1,6 +1,5 @@ -import { vilkårStatus } from '@k9-sak-web/backend/k9sak/kodeverk/behandling/VilkårStatus.js'; import { initializeDate } from '@k9-sak-web/lib/dateUtils/initializeDate.js'; -import { formatDate, hentAktivePerioderFraVilkar, utledInnsendtSoknadsfrist } from './utils'; +import { formatDate, utledInnsendtSoknadsfrist } from './utils'; describe('formatDate', () => { it('should format a valid date string correctly', () => { @@ -35,96 +34,3 @@ describe('utledInnsendtSoknadsfrist', () => { expect(result).toBe('Invalid Date'); }); }); - -describe('hentAktivePerioderFraVilkar', () => { - it('should return an empty array if there are no periods in vilkar', () => { - const vilkar = [{ perioder: [] }]; - const result = hentAktivePerioderFraVilkar(vilkar, true); - expect(result).toEqual([]); - }); - - it('should return filtered and sorted periods when visAllePerioder is true', () => { - const vilkar = [ - { - perioder: [ - { - periode: { fom: '2023-01-01', tom: '' }, - vurderesIBehandlingen: false, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - { - periode: { fom: '2023-02-01', tom: '' }, - vurderesIBehandlingen: true, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - ], - }, - ]; - - const result = hentAktivePerioderFraVilkar(vilkar, true); - expect(result).toEqual([ - { - periode: { fom: '2023-01-01', tom: '' }, - vurderesIBehandlingen: false, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - ]); - }); - - it('should return filtered and sorted periods when visAllePerioder is false', () => { - const vilkar = [ - { - perioder: [ - { - periode: { fom: '2023-01-01', tom: '' }, - vurderesIBehandlingen: false, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - { - periode: { fom: '2023-02-01', tom: '' }, - vurderesIBehandlingen: true, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - ], - }, - ]; - - const result = hentAktivePerioderFraVilkar(vilkar, false); - expect(result).toEqual([ - { periode: { fom: '2023-02-01', tom: '' }, vurderesIBehandlingen: true, vilkarStatus: vilkårStatus.IKKE_VURDERT }, - ]); - }); - - it('should return sorted periods in reverse order', () => { - const vilkar = [ - { - perioder: [ - { - periode: { fom: '2023-01-01', tom: '' }, - vurderesIBehandlingen: false, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - { - periode: { fom: '2023-02-01', tom: '' }, - vurderesIBehandlingen: false, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - ], - }, - ]; - - const result = hentAktivePerioderFraVilkar(vilkar, true); - expect(result).toEqual([ - { - periode: { fom: '2023-02-01', tom: '' }, - vurderesIBehandlingen: false, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - { - periode: { fom: '2023-01-01', tom: '' }, - vurderesIBehandlingen: false, - vilkarStatus: vilkårStatus.IKKE_VURDERT, - }, - ]); - }); -}); diff --git a/packages/v2/gui/src/utils/hentAktivePerioderFraVilkar.spec.ts b/packages/v2/gui/src/utils/hentAktivePerioderFraVilkar.spec.ts new file mode 100644 index 0000000000..fbbb08c123 --- /dev/null +++ b/packages/v2/gui/src/utils/hentAktivePerioderFraVilkar.spec.ts @@ -0,0 +1,95 @@ +import { vilkårStatus } from '@k9-sak-web/backend/k9sak/kodeverk/behandling/VilkårStatus.js'; +import { hentAktivePerioderFraVilkar } from './hentAktivePerioderFraVilkar'; + +describe('hentAktivePerioderFraVilkar', () => { + it('should return an empty array if there are no periods in vilkar', () => { + const vilkar = [{ perioder: [] }]; + const result = hentAktivePerioderFraVilkar(vilkar, true); + expect(result).toEqual([]); + }); + + it('should return filtered and sorted periods when visAllePerioder is true', () => { + const vilkar = [ + { + perioder: [ + { + periode: { fom: '2023-01-01', tom: '' }, + vurderesIBehandlingen: false, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + { + periode: { fom: '2023-02-01', tom: '' }, + vurderesIBehandlingen: true, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + ], + }, + ]; + + const result = hentAktivePerioderFraVilkar(vilkar, true); + expect(result).toEqual([ + { + periode: { fom: '2023-01-01', tom: '' }, + vurderesIBehandlingen: false, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + ]); + }); + + it('should return filtered and sorted periods when visAllePerioder is false', () => { + const vilkar = [ + { + perioder: [ + { + periode: { fom: '2023-01-01', tom: '' }, + vurderesIBehandlingen: false, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + { + periode: { fom: '2023-02-01', tom: '' }, + vurderesIBehandlingen: true, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + ], + }, + ]; + + const result = hentAktivePerioderFraVilkar(vilkar, false); + expect(result).toEqual([ + { periode: { fom: '2023-02-01', tom: '' }, vurderesIBehandlingen: true, vilkarStatus: vilkårStatus.IKKE_VURDERT }, + ]); + }); + + it('should return sorted periods in reverse order', () => { + const vilkar = [ + { + perioder: [ + { + periode: { fom: '2023-01-01', tom: '' }, + vurderesIBehandlingen: false, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + { + periode: { fom: '2023-02-01', tom: '' }, + vurderesIBehandlingen: false, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + ], + }, + ]; + + const result = hentAktivePerioderFraVilkar(vilkar, true); + expect(result).toEqual([ + { + periode: { fom: '2023-02-01', tom: '' }, + vurderesIBehandlingen: false, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + { + periode: { fom: '2023-01-01', tom: '' }, + vurderesIBehandlingen: false, + vilkarStatus: vilkårStatus.IKKE_VURDERT, + }, + ]); + }); +}); diff --git a/packages/v2/gui/src/utils/hentAktivePerioderFraVilkar.ts b/packages/v2/gui/src/utils/hentAktivePerioderFraVilkar.ts new file mode 100644 index 0000000000..969bf34bd0 --- /dev/null +++ b/packages/v2/gui/src/utils/hentAktivePerioderFraVilkar.ts @@ -0,0 +1,20 @@ +import type { VilkårPeriodeDto } from '@k9-sak-web/backend/k9sak/generated'; +import { dateStringSorter } from '@k9-sak-web/lib/dateUtils/dateUtils.js'; + +export type VilkårType = { lovReferanse?: string; perioder?: Array }; + +export const hentAktivePerioderFraVilkar = (vilkar: VilkårType[], visAllePerioder: boolean) => { + const [activeVilkår] = vilkar; + + if (!activeVilkår?.perioder) { + return []; + } + + return activeVilkår.perioder + .filter( + periode => + (visAllePerioder && !periode.vurderesIBehandlingen) || (periode.vurderesIBehandlingen && !visAllePerioder), + ) + .sort((a, b) => (a.periode.fom && b.periode.fom ? dateStringSorter(a.periode.fom, b.periode.fom) : 0)) + .reverse(); +}; diff --git a/yarn.lock b/yarn.lock index 42c7a16556..062dcb12c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4470,6 +4470,7 @@ __metadata: "@tanstack/react-query": "npm:^5.66.11" "@types/object-hash": "npm:^3.0.6" axios: "npm:1.8.1" + lodash: "npm:4.17.21" object-hash: "npm:^3.0.0" react: "npm:19.0.0" react-hook-form: "npm:7.54.2" @@ -6903,6 +6904,13 @@ __metadata: languageName: node linkType: hard +"@types/lodash@npm:^4.17.16": + version: 4.17.16 + resolution: "@types/lodash@npm:4.17.16" + checksum: 10/9a8bb7471a7521bd65d528e1bd14f79819a3eeb6f8a35a8a44649a7d773775c0813e93fd93bd32ccf350bb076c0bf02c6d47877c4625f526f6dd4d283c746aec + languageName: node + linkType: hard + "@types/mdx@npm:^2.0.0": version: 2.0.13 resolution: "@types/mdx@npm:2.0.13" @@ -13536,6 +13544,7 @@ __metadata: "@testing-library/react": "npm:16.2.0" "@testing-library/user-event": "npm:14.6.1" "@types/history": "npm:5.0.0" + "@types/lodash": "npm:^4.17.16" "@types/object-hash": "npm:^3.0.6" "@types/prop-types": "npm:15.7.14" "@types/react": "npm:19.0.8"