From af5a55c7317e289aabd427192ce3e333a06f5839 Mon Sep 17 00:00:00 2001 From: Hallvard Andreas Stark <57254397+hallvardastark@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:43:00 +0200 Subject: [PATCH] =?UTF-8?q?Revert=20"Revert=20"TSFF-743=20-=20refaktorerin?= =?UTF-8?q?g=20av=20prosess-tilkjent-ytelse=20(#6481)"=20=E2=80=A6"=20(#66?= =?UTF-8?q?32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 183343f16aa5d624a063a4a7b95b4426517c7f01. --- .../TilkjentYtelseProsessStegPanelDef.tsx | 11 +- .../TilkjentYtelseProsessStegPanelDef.tsx | 13 +- .../TilkjentYtelseProsessStegPanelDef.tsx | 13 +- .../TilkjentYtelseProsessStegPanelDef.tsx | 13 +- .../TilkjentYtelseProsessStegPanelDef.tsx | 13 +- .../TilkjentYtelseProsessStegPanelDef.tsx | 13 +- .../src/components/BarnInformasjonVisning.tsx | 5 +- .../fakta-barn-oms/src/utils/formaterDato.ts | 4 +- .../src/components/AktivitetTabell.tsx | 8 +- ...ilSaerligeSmittevernhensynMikrofrontend.ts | 9 +- .../src/components/AvregningTable.tsx | 5 +- .../splittePerioder/PeriodeInformasjon.jsx | 11 +- ...sx => TilbakekrevingTimelineData.spec.tsx} | 0 .../splittePerioder/PeriodeInformasjon.tsx | 16 +- .../prosess-tilkjent-ytelse/i18n/index.js | 9 +- .../prosess-tilkjent-ytelse/i18n/nb_NO.json | 184 ------------ .../TilkjentYtelseProsessIndex.stories.tsx | 114 ++++--- .../src/TilkjentYtelseProsessIndex.tsx | 34 +-- .../src/components/TilkjentYteleseUtils.ts | 23 +- .../src/components/TilkjentYtelse.spec.tsx | 46 ++- .../src/components/TilkjentYtelse.tsx | 84 +++--- .../components/TilkjentYtelsePanel.spec.tsx | 46 +-- .../src/components/TilkjentYtelsePanel.tsx | 105 +++---- .../TilkjentYtelseTimeLineData.spec.tsx | 26 +- .../components/TilkjentYtelseTimelineData.tsx | 95 ++---- .../components/manuellePerioder/Andeler.tsx | 70 ++--- .../components/manuellePerioder/FormState.ts | 36 +++ .../components/manuellePerioder/NyAndel.tsx | 183 +++++------ .../manuellePerioder/NyArbeidsgiverModal.tsx | 142 ++++----- .../components/manuellePerioder/NyPeriode.tsx | 189 +++++------- .../manuellePerioder/PeriodeRad.tsx | 82 ++--- .../manuellePerioder/PeriodeTabell.tsx | 284 ++++-------------- .../manuellePerioder/SlettPeriodeModal.tsx | 36 +-- .../manuellePerioder/TilkjentYtelseForm.tsx | 201 ++++--------- .../manuellePerioder/periode.module.css | 35 +++ .../tilbaketrekk/Tilbaketrekkpanel.spec.tsx | 54 ++-- .../tilbaketrekk/Tilbaketrekkpanel.tsx | 270 ++++++++--------- .../src/AntallDagerLivetsSluttfaseIndex.tsx | 5 +- .../src/components/TimeLineControl.tsx | 26 +- .../src/beregningsresultatUtbetaltTsType.ts | 4 +- packages/utils/index.ts | 1 - .../utils/src/date-utils/initialize.test.ts | 43 +++ packages/utils/src/date-utils/initialize.ts | 16 +- packages/utils/src/dateUtils.spec.ts | 164 +++++----- packages/utils/src/dateUtils.ts | 95 +++--- 45 files changed, 1129 insertions(+), 1707 deletions(-) rename packages/prosess-foreldelse/src/components/splittePerioder/{TilbakekrevingTimelineData.spec.jsx => TilbakekrevingTimelineData.spec.tsx} (100%) delete mode 100644 packages/prosess-tilkjent-ytelse/i18n/nb_NO.json create mode 100644 packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/FormState.ts create mode 100644 packages/utils/src/date-utils/initialize.test.ts diff --git a/packages/behandling-frisinn/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx b/packages/behandling-frisinn/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx index 117c440ef7..7c168d0d42 100644 --- a/packages/behandling-frisinn/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx +++ b/packages/behandling-frisinn/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx @@ -1,9 +1,8 @@ -import React from 'react'; - import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import TilkjentYtelseProsessIndex from '@fpsak-frontend/prosess-tilkjent-ytelse'; -import { prosessStegCodes } from '@k9-sak-web/konstanter'; import { ProsessStegDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import { prosessStegCodes } from '@k9-sak-web/konstanter'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; const harKunAvslåtteUttak = beregningsresultatUtbetaling => { const { perioder } = beregningsresultatUtbetaling; @@ -15,7 +14,11 @@ const harKunAvslåtteUttak = beregningsresultatUtbetaling => { }; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + }; getAksjonspunktKoder = () => []; diff --git a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx index 8fa66cb352..e485bd0a41 100644 --- a/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx +++ b/packages/behandling-omsorgspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx @@ -1,10 +1,9 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import TilkjentYtelseProsessIndex from '@fpsak-frontend/prosess-tilkjent-ytelse'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import { prosessStegCodes } from '@k9-sak-web/konstanter'; import { ProsessStegDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import { prosessStegCodes } from '@k9-sak-web/konstanter'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; const harIngenAndeler = perioder => { const alleAndeler = perioder.flatMap(({ andeler }) => [...andeler]); @@ -20,7 +19,11 @@ const harKunAvslåtteUttak = beregningsresultatUtbetaling => { }; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_TILBAKETREKK]; diff --git a/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx b/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx index e0d3bf546d..98b57dc9e6 100644 --- a/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx +++ b/packages/behandling-opplaeringspenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx @@ -1,10 +1,9 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import TilkjentYtelseProsessIndex from '@fpsak-frontend/prosess-tilkjent-ytelse'; -import { prosessStegCodes } from '@k9-sak-web/konstanter'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import { ProsessStegDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import { prosessStegCodes } from '@k9-sak-web/konstanter'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; const harKunAvslåtteUttak = beregningsresultatUtbetaling => { const { perioder } = beregningsresultatUtbetaling; @@ -15,7 +14,11 @@ const harKunAvslåtteUttak = beregningsresultatUtbetaling => { }; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_TILBAKETREKK]; diff --git a/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx b/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx index e0d3bf546d..98b57dc9e6 100644 --- a/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx +++ b/packages/behandling-pleiepenger-sluttfase/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx @@ -1,10 +1,9 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import TilkjentYtelseProsessIndex from '@fpsak-frontend/prosess-tilkjent-ytelse'; -import { prosessStegCodes } from '@k9-sak-web/konstanter'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import { ProsessStegDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import { prosessStegCodes } from '@k9-sak-web/konstanter'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; const harKunAvslåtteUttak = beregningsresultatUtbetaling => { const { perioder } = beregningsresultatUtbetaling; @@ -15,7 +14,11 @@ const harKunAvslåtteUttak = beregningsresultatUtbetaling => { }; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_TILBAKETREKK]; diff --git a/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx b/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx index e0d3bf546d..98b57dc9e6 100644 --- a/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx +++ b/packages/behandling-pleiepenger/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx @@ -1,10 +1,9 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import TilkjentYtelseProsessIndex from '@fpsak-frontend/prosess-tilkjent-ytelse'; -import { prosessStegCodes } from '@k9-sak-web/konstanter'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import { ProsessStegDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import { prosessStegCodes } from '@k9-sak-web/konstanter'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; const harKunAvslåtteUttak = beregningsresultatUtbetaling => { const { perioder } = beregningsresultatUtbetaling; @@ -15,7 +14,11 @@ const harKunAvslåtteUttak = beregningsresultatUtbetaling => { }; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.VURDER_TILBAKETREKK]; diff --git a/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx b/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx index 6ed513a8d7..ead80b8f80 100644 --- a/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx +++ b/packages/behandling-unntak/src/panelDefinisjoner/prosessStegPaneler/TilkjentYtelseProsessStegPanelDef.tsx @@ -1,11 +1,10 @@ -import React from 'react'; - +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import vilkarUtfallType from '@fpsak-frontend/kodeverk/src/vilkarUtfallType'; import TilkjentYtelseProsessIndex from '@fpsak-frontend/prosess-tilkjent-ytelse'; -import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import { prosessStegCodes } from '@k9-sak-web/konstanter'; import { ProsessStegDef, ProsessStegPanelDef } from '@k9-sak-web/behandling-felles'; +import { prosessStegCodes } from '@k9-sak-web/konstanter'; +import { konverterKodeverkTilKode } from '@k9-sak-web/lib/kodeverk/konverterKodeverkTilKode.js'; import { UnntakBehandlingApiKeys } from '../../data/unntakBehandlingApi'; const harIngenAndeler = perioder => { @@ -22,7 +21,11 @@ const harKunAvslåtteUttak = beregningsresultatUtbetaling => { }; class PanelDef extends ProsessStegPanelDef { - getKomponent = props => ; + getKomponent = props => { + const deepCopyProps = JSON.parse(JSON.stringify(props)); + konverterKodeverkTilKode(deepCopyProps, false); + return ; + }; getAksjonspunktKoder = () => [aksjonspunktCodes.MANUELL_TILKJENT_YTELSE]; diff --git a/packages/fakta-barn-oms/src/components/BarnInformasjonVisning.tsx b/packages/fakta-barn-oms/src/components/BarnInformasjonVisning.tsx index 4acda2ed17..4cb2da1b12 100644 --- a/packages/fakta-barn-oms/src/components/BarnInformasjonVisning.tsx +++ b/packages/fakta-barn-oms/src/components/BarnInformasjonVisning.tsx @@ -1,9 +1,8 @@ import { VerticalSpacer } from '@fpsak-frontend/shared-components'; -import { formatereLukketPeriode, visningsdato } from '@fpsak-frontend/utils'; +import { formatDate, formatereLukketPeriode } from '@fpsak-frontend/utils'; import KombinertBarnOgRammevedtak from '@k9-sak-web/fakta-barn-oms/src/dto/KombinertBarnOgRammevedtak'; import { BarnType } from '@k9-sak-web/prosess-aarskvantum-oms/src/dto/BarnDto'; import { BodyShort } from '@navikt/ds-react'; -import React from 'react'; import { FormattedMessage } from 'react-intl'; interface BarnInputProps { @@ -52,7 +51,7 @@ const BarnInformasjonVisning = ({ barnet }: BarnInputProps) => { {dødsdato && ( - + )} {barnType === BarnType.FOSTERBARN && ( diff --git a/packages/fakta-barn-oms/src/utils/formaterDato.ts b/packages/fakta-barn-oms/src/utils/formaterDato.ts index fbd08edb25..89b85c3cd1 100644 --- a/packages/fakta-barn-oms/src/utils/formaterDato.ts +++ b/packages/fakta-barn-oms/src/utils/formaterDato.ts @@ -1,5 +1,5 @@ -import { visningsdato, isValidDate } from '@fpsak-frontend/utils'; +import { formatDate, isValidDate } from '@fpsak-frontend/utils'; -const formaterDato = (dato: string) => (isValidDate(dato) ? visningsdato(dato) : '-'); +const formaterDato = (dato: string) => (isValidDate(dato) ? formatDate(dato) : '-'); export default formaterDato; diff --git a/packages/prosess-aarskvantum-oms/src/components/AktivitetTabell.tsx b/packages/prosess-aarskvantum-oms/src/components/AktivitetTabell.tsx index d9f2ed7c3d..cad150cfc1 100644 --- a/packages/prosess-aarskvantum-oms/src/components/AktivitetTabell.tsx +++ b/packages/prosess-aarskvantum-oms/src/components/AktivitetTabell.tsx @@ -16,7 +16,7 @@ import { FraværÅrsakEnum } from '@k9-sak-web/types/src/omsorgspenger/Uttaksper import { ChevronDownIcon, ChevronUpIcon } from '@navikt/aksel-icons'; import { BodyShort, Box, Button, HelpText, Label, Table, Tabs } from '@navikt/ds-react'; import classNames from 'classnames'; -import React, { ReactNode, useMemo, useState } from 'react'; +import { ReactNode, useMemo, useState } from 'react'; import { FormattedMessage } from 'react-intl'; import Utfall from './Utfall'; import styles from './aktivitetTabell.module.css'; @@ -32,7 +32,7 @@ interface AktivitetTabellProps { aktivitetsstatuser: KodeverkMedNavn[]; } -export const antallDager = (periode: string): string => { +export const antallDager = (periode: string): string | number => { const [fom, tom] = periode.split('/'); return calcDays(fom, tom, false); }; @@ -232,7 +232,9 @@ const AktivitetTabell = ({ 0) { perioderInnvilget.forEach(period => { - dagerDelvisInnvilget += parseInt(antallDager(period.periode), 10); + const daysToAdd = antallDager(period.periode); + if (typeof daysToAdd === 'string') { + dagerDelvisInnvilget += parseInt(daysToAdd, 10); + } else { + dagerDelvisInnvilget += daysToAdd; + } }); } diff --git a/packages/prosess-avregning/src/components/AvregningTable.tsx b/packages/prosess-avregning/src/components/AvregningTable.tsx index 6bd76ce9a6..8705d09ea1 100644 --- a/packages/prosess-avregning/src/components/AvregningTable.tsx +++ b/packages/prosess-avregning/src/components/AvregningTable.tsx @@ -1,10 +1,9 @@ import mottakerTyper from '@fpsak-frontend/kodeverk/src/mottakerTyper'; -import { formatCurrencyNoKr, getRangeOfMonths } from '@fpsak-frontend/utils'; +import { formatCurrencyNoKr, getRangeOfMonths, initializeDate } from '@fpsak-frontend/utils'; import { Kodeverk, Periode, SimuleringMottaker, SimuleringResultatRad } from '@k9-sak-web/types'; import { BodyShort, Table } from '@navikt/ds-react'; import classnames from 'classnames/bind'; import moment from 'moment/moment'; -import React from 'react'; import { FormattedMessage } from 'react-intl'; import CollapseButton from './CollapseButton'; import styles from './avregningTable.module.css'; @@ -125,7 +124,7 @@ const getPeriodeFom = (periodeFom: string, nesteUtbPeriodeFom: string) => period const getPeriod = (ingenPerioderMedAvvik: boolean, periodeFom: string, mottaker: SimuleringMottaker) => getRangeOfMonths( avvikBruker(ingenPerioderMedAvvik, mottaker.mottakerType.kode) - ? moment(mottaker.nesteUtbPeriode.tom).subtract(1, 'months') + ? initializeDate(mottaker.nesteUtbPeriode.tom).subtract(1, 'months').format('YYYY-MM') : getPeriodeFom(periodeFom, mottaker.nesteUtbPeriode.fom), mottaker.nesteUtbPeriode.tom, ); diff --git a/packages/prosess-foreldelse/src/components/splittePerioder/PeriodeInformasjon.jsx b/packages/prosess-foreldelse/src/components/splittePerioder/PeriodeInformasjon.jsx index cec5b2800a..6a9d436694 100644 --- a/packages/prosess-foreldelse/src/components/splittePerioder/PeriodeInformasjon.jsx +++ b/packages/prosess-foreldelse/src/components/splittePerioder/PeriodeInformasjon.jsx @@ -2,7 +2,6 @@ import { DDMMYYYY_DATE_FORMAT, calcDaysAndWeeks, formatCurrencyNoKr } from '@fps import { BodyShort, HGrid, Label } from '@navikt/ds-react'; import moment from 'moment'; import PropTypes from 'prop-types'; -import React from 'react'; import { FormattedMessage } from 'react-intl'; import styles from './periodeInformasjon.module.css'; @@ -23,15 +22,7 @@ const PeriodeInformasjon = ({ fom, tom, feilutbetaling, arsak }) => { - - - + {daysAndWeeks}
diff --git a/packages/prosess-foreldelse/src/components/splittePerioder/TilbakekrevingTimelineData.spec.jsx b/packages/prosess-foreldelse/src/components/splittePerioder/TilbakekrevingTimelineData.spec.tsx similarity index 100% rename from packages/prosess-foreldelse/src/components/splittePerioder/TilbakekrevingTimelineData.spec.jsx rename to packages/prosess-foreldelse/src/components/splittePerioder/TilbakekrevingTimelineData.spec.tsx diff --git a/packages/prosess-tilbakekreving/src/components/splittePerioder/PeriodeInformasjon.tsx b/packages/prosess-tilbakekreving/src/components/splittePerioder/PeriodeInformasjon.tsx index 90aa6f6210..f5216af2b2 100644 --- a/packages/prosess-tilbakekreving/src/components/splittePerioder/PeriodeInformasjon.tsx +++ b/packages/prosess-tilbakekreving/src/components/splittePerioder/PeriodeInformasjon.tsx @@ -1,7 +1,5 @@ -import { DDMMYYYY_DATE_FORMAT, calcDaysAndWeeks, formatCurrencyNoKr } from '@fpsak-frontend/utils'; +import { DDMMYYYY_DATE_FORMAT, calcDaysAndWeeks, formatCurrencyNoKr, initializeDate } from '@fpsak-frontend/utils'; import { BodyShort, HGrid, Label } from '@navikt/ds-react'; -import moment from 'moment'; -import React from 'react'; import { FormattedMessage } from 'react-intl'; import DataForPeriode from '../../types/dataForPeriodeTsType'; @@ -30,19 +28,11 @@ const PeriodeInformasjon = ({ fom, tom, feilutbetaling, arsak }: OwnProps) => {
- - - + {daysAndWeeks}
diff --git a/packages/prosess-tilkjent-ytelse/i18n/index.js b/packages/prosess-tilkjent-ytelse/i18n/index.js index be308474ff..4d6c1664d9 100644 --- a/packages/prosess-tilkjent-ytelse/i18n/index.js +++ b/packages/prosess-tilkjent-ytelse/i18n/index.js @@ -1,8 +1,3 @@ -import { - intlWithMessages -} from '@fpsak-frontend/utils-test/intl-test-helper'; +import { intlWithMessages } from '@fpsak-frontend/utils-test/intl-test-helper'; -import messages from './nb_NO.json'; - - -export const intlMock = intlWithMessages(messages); +export const intlMock = intlWithMessages(); diff --git a/packages/prosess-tilkjent-ytelse/i18n/nb_NO.json b/packages/prosess-tilkjent-ytelse/i18n/nb_NO.json deleted file mode 100644 index 4a279d17e4..0000000000 --- a/packages/prosess-tilkjent-ytelse/i18n/nb_NO.json +++ /dev/null @@ -1,184 +0,0 @@ -{ - "TilkjentYtelse.Title": "Tilkjent ytelse", - "TilkjentYtelse.VurderTilbaketrekk.Aksjonspunkttekst": "Pleiepengene er utbetalt til søker, arbeidsgiver krever nå refusjon fra startdato av pleiepengene. Vurder om beløpet som er feilutbetalt skal tilbakekreves fra søker eller om dette er en sak mellom arbeidstaker og arbeidsgiver.", - "TilkjentYtelse.VurderTilbaketrekk.Utfør": "Tilbakekrev fra søker", - "TilkjentYtelse.VurderTilbaketrekk.Hindre": "Ikke tilbakekrev fra søker", - "TilkjentYtelse.Stonadinfo.Stonadsdager": "Stønadsdager", - "TilkjentYtelse.PeriodeData.Detaljer": "Detaljer for valgt periode", - "TilkjentYtelse.PeriodeData.UkerDager": "{weeks} uker {days} dager", - "TilkjentYtelse.PeriodeData.Godkjent": "Godkjent", - "TilkjentYtelse.PeriodeData.Dagsats": "Utbetalt dagsats: ", - "TilkjentYtelse.PeriodeData.UtbetalingsgradAvBeregningsGrunnlag": "Total utbetalingsgrad av beregningsgrunnlag: ", - "TilkjentYtelse.PeriodeData.GradertMotInntektInfo": "Utbetaling er redusert grunnet inntekt i nye aktiviteter", - "TilkjentYtelse.PeriodeData.UtbetaltRefusjon": "Utbetalt refusjon: ", - "TilkjentYtelse.PeriodeData.UtbetaltTilSoker": "Utbetalt til søker: ", - "TilkjentYtelse.PeriodeData.Utbetalingsgrad": "Utbetalingsgrad: ", - "TilkjentYtelse.PeriodeData.Andel": "Andel", - "TilkjentYtelse.PeriodeData.KontoType": "Stønadskonto", - "TilkjentYtelse.PeriodeData.Gradering": "Gradering", - "TilkjentYtelse.PeriodeData.Column.Uttaksperiode": "Periode", - "TilkjentYtelse.PeriodeData.Column.Utbetalingsgrad": "Uttaksgrad", - "TilkjentYtelse.PeriodeData.Column.Utfall": "Utfall", - "TilkjentYtelse.PeriodeData.Refusjon": "Utbetalt refusjon", - "TilkjentYtelse.PeriodeData.Aktivitetsstatus": "Aktivitetsstatus: ", - "TilkjentYtelse.PeriodeData.TilSoker": "Utbetalt til søker", - "TilkjentYtelse.PeriodeData.SisteUtbDato": "Siste innvilgede utb.dato", - "TilkjentYtelse.PeriodeData.Periode": "{fomVerdi} - {tomVerdi}", - "TilkjentYtelse.PeriodeData.Ja": "Ja", - "TilkjentYtelse.PeriodeData.Nei": "Nei", - "TilkjentYtelse.PeriodeData.SelvstendigNaeringsdrivende": "Selvstendig næringsdrivende", - "TilkjentYtelse.PeriodeData.Frilans": "Frilanser", - "TilkjentYtelse.PeriodeData.Militaer": "Militær", - "TilkjentYtelse.PeriodeData.Dagpenger": "Dagpenger", - "TilkjentYtelse.PeriodeData.AAP": "Arbeidsavklaringspenger", - "TilkjentYtelse.PeriodeData.Arbeidstaker": "Arbeidstaker", - "TilkjentYtelse.PeriodeData.BrukersAndel": "Brukers andel", - "TilkjentYtelse.Opphoersdato": "Opphørsdato: {opphoersdato}", - "HelpText.Aksjonspunkt.BehandletAksjonspunkt": "Behandlet aksjonspunkt: ", - "TilkjentYtelse.AksjonspunktHelpText": "Manuell tilkjent ytelse", - "TilkjentYtelse.NyPeriode.Ubetalingsgrad": "Uttaksgrad", - "TilkjentYtelse.NyPeriode.TilSoker": "Til søker", - "TilkjentYtelse.NyPeriode.Refusjon": "Refusjon", - "TilkjentYtelse.NyPeriode.Arbeidsgiver": "Arbeidsgiver", - "TilkjentYtelse.NyPeriode.ArbeidsgiverPrivatperson": "Arbeidsgiver (privatperson)", - "TilkjentYtelse.NyPeriode.Arbeidsforhold": "Arbeidsforhold", - "TilkjentYtelse.NyPeriode.AktivitetsStatus": "Aktivitetsstatus", - "TilkjentYtelse.NyPeriode.Inntektskategori": "Inntektskategori", - "TilkjentYtelse.NyPeriode.Fom": "Fra", - "TilkjentYtelse.NyPeriode.Tom": "Til", - "TilkjentYtelse.BekreftOgFortsett": "Bekreft og fortsett", - "TilkjentYtelse.LeggTilPeriode": "Legg til ny periode", - "TilkjentYtelse.Avbryt": "Avbryt", - "TilkjentYtelse.NyPeriode": "Ny periode", - "TilkjentYtelse.NyAndel": "Ny andel", - "TilkjentYtelse.Periode": "Periode", - "TilkjentYtelse.Andeler": "Andeler", - "TilkjentYtelse.IngenPerioder": "Ingen perioder", - "TilkjentYtelse.OverlappendePerioder": "Overlappende perioder", - "TilkjentYtelse.Ok": "Ok", - "TilkjentYtelse.ArbeidsgiverNavn": "Navn", - "TilkjentYtelse.ArbeidsgiverOrgnummer": "Organisasjonsnummer", - - "TilkjentYtelse.SlettPerioden": "Slett Perioden", - "TilkjentYtelse.PeriodenSlettes": "Perioden vil bli slettet", - - "HelpText.Aksjonspunkt": "Aksjonspunkt", - "Malform.Beskrivelse": "Foretrukket språk", - "Malform.Bokmal": "Bokmål", - "Malform.Nynorsk": "Nynorsk", - "Malform.Engelsk": "Engelsk", - "Calendar.Day.0": "søndag", - "Calendar.Day.1": "mandag", - "Calendar.Day.2": "tirsdag", - "Calendar.Day.3": "onsdag", - "Calendar.Day.4": "torsdag", - "Calendar.Day.5": "fredag", - "Calendar.Day.6": "lørdag", - "Calendar.Day.Short.0": "søn", - "Calendar.Day.Short.1": "man", - "Calendar.Day.Short.2": "tir", - "Calendar.Day.Short.3": "ons", - "Calendar.Day.Short.4": "tor", - "Calendar.Day.Short.5": "fre", - "Calendar.Day.Short.6": "lør", - "Calendar.Month.0": "Januar", - "Calendar.Month.1": "Februar", - "Calendar.Month.2": "Mars", - "Calendar.Month.3": "April", - "Calendar.Month.4": "Mai", - "Calendar.Month.5": "Juni", - "Calendar.Month.6": "Juli", - "Calendar.Month.7": "August", - "Calendar.Month.8": "September", - "Calendar.Month.9": "Oktober", - "Calendar.Month.10": "November", - "Calendar.Month.11": "Desember", - "PeriodFieldArray.LeggTilPeriode": "Legg til periode", - - "UttakInfoPanel.AntallEnDagOgEnUke": "{weeks} uke {days} dag", - "UttakInfoPanel.AntallEnDagOgFlereUker": "{weeks} uker {days} dag", - "UttakInfoPanel.AntallFlereDagerOgEnUke": "{weeks} uke {days} dager", - "UttakInfoPanel.AntallFlereDagerOgFlereUker": "{weeks} uker {days} dager", - "UttakInfoPanel.AntallFlereDagerOgNullUker": "{days} dager", - "UttakInfoPanel.AntallEnDagOgNullUker": "{days} dag", - "UttakInfoPanel.AntallNullDagerOgFlereUker": "{weeks} uker", - "UttakInfoPanel.AntallNullDagerOgEnUke": "{weeks} uke", - "UttakInfoPanel.TidenesEnde": "Antall uker og dager -", - "Beregningsgrunnlag.Forms.Vurdering": "Vurdering", - "SubmitButton.ConfirmInformation": "Bekreft og fortsett", - "SettBehandlingPaVentModal.ModalDescription": "Behandlingen settes på vent med frist", - "SettBehandlingPaVentModal.PaVent": "På vent", - "SettBehandlingPaVentModal.SettesPaVent": "Behandlingen settes på vent med frist", - "SettBehandlingPaVentModal.ErPaVent": "Behandlingen er satt på vent med frist", - "SettBehandlingPaVentModal.ErPaVentUtenFrist": "Behandlingen er satt på vent", - "SettBehandlingPaVentModal.Ok": "OK", - "SettBehandlingPaVentModal.Arsak": "Årsak", - "SettBehandlingPaVentModal.SelectPlaceholder": "Velg årsak", - "SettBehandlingPaVentModal.Avbryt": "Avbryt", - "SettBehandlingPaVentModal.Lukk": "Lukk", - "ValidationMessage.NotEmpty": "Feltet må fylles ut", - "ValidationMessage.MinLength": "Du må skrive minst {length} tegn", - "ValidationMessage.MaxLength": "Du kan skrive maksimalt {length} tegn", - "ValidationMessage.MinValue": "Feltet må være større eller lik {length}", - "ValidationMessage.MaxValue": "Feltet må være mindre eller lik {length}", - "ValidationMessage.InvalidDate": "Dato må skrives slik : dd.mm.åååå", - "ValidationMessage.DateNotBeforeOrEqual": "Dato må være før eller lik {limit}", - "ValidationMessage.DateNotAfterOrEqual": "Dato må være etter eller lik {limit}", - "ValidationMessage.DateRangesOverlapping": "Perioder kan ikke overlappe i tid", - "ValidationMessage.DateRangesOverlappingPeriodTypes": "Perioder kan ikke overlappe i tid (uttak, utsettelse, gradering, overforing, opphold)", - "ValidationMessage.DatesNotEqual": "Dato må være lik {value}", - "ValidationMessage.InvalidInteger": "Tallet kan ikke ha desimaler", - "ValidationMessage.InvalidDecimal": "Tallet kan ikke inneholde mer enn to desimaler", - "ValidationMessage.InvalidDatesInPeriod": "Periode må skrives slik : dd.mm.åååå - dd.mm.åååå", - "ValidationMessage.InvalidPeriod": "Startdato må være før eller lik sluttdato", - "ValidationMessage.InvalidPeriodRange": "Periode er utenfor opptjeningsperioden", - "ValidationMessage.InvalidNumber": "Feltet kan kun inneholde tall", - "ValidationMessage.utbetalingsgradErMerSamtidigUttaksprosent": "Feltet kan ikke være høyere enn samtidig uttaksprosent", - "ValidationMessage.maxLengthOrFodselsnr": "Du kan skrive maksimalt {length} tegn eller et fødselsnummer (11 siffer)", - "ValidationMessage.Registrering.TerminEllerFoedselMessage": "Fyll ut informasjon om termindato eller fødselsdato", - "ValidationMessage.InvalidFodselsnummerFormat": "Feltet må være et fødselsnummer (11 siffer)", - "ValidationMessage.InvalidFodselsnummer": "Ugyldig fødselsnummer", - "ValidationMessage.SammeFodselsnummerSomSoker": "Fødselsnummer til den andre forelderen kan ikke være det samme som søker.", - "ValidationMessage.InvalidText": "Feltet inneholder ugyldige tegn: {text}", - "ValidationMessage.InvalidValue": "Feltet inneholder en ugyldig verdi: {value}", - "ValidationMessage.ArrayMinLength": "Listen må ha lengde større enn: {length}", - "ValidationMessage.InvalidSaksnummerOrFodselsnummerFormat": "Ugyldig saksnummer eller fødselsnummer", - "ValidationMessage.InvalidTrekkAntallDagerUttakForm": "Antall dager i {periode} kan ikke være høyere enn {maxDays}", - "ValidationMessage.InvalidTrekkDagerFlerbarnsdager": "Antall dager med flerbarnsdager kan ikke være høyere enn {maxDays}", - "ValidationMessage.NegativeSaldo": "Antall dager kan ikke overstige dagene som gjenstår på {periode}. Det er oppgitt {days} dager for mye.", - "ValidationMessage.InvalidStonadskonto": "Stønadskonto {konto} er ikke tilgjengelig", - "ValidationMessage.MinstEnPeriodeRequired": "Minst en av følgende perioder må være utfylt: fullt uttak, overføring av kvote, utsettelse eller gradering", - "ValidationMessage.trekkdagerErMerEnnNullUtsettelse": "Ingen trekkdager for utsettelse", - "ValidationMessage.utbetalingMerEnnNullUtsettelse": "Ingen utbetalingsgrad for utsettelse", - "ValidationMessage.ukerOgDagerVidNullUtbetalningsgradMessage": "Trekk minst en dag når utbetalingsgraden er høyre enn 0%", - "ValidationMessage.UtsettelseUtenFullArbeid": "Søker har ikke 100% stilling, vurder om perioden kan utsettes.", - "ValidationMessage.MerEn100Prosent": "Samlet utbetalingsgrad og andel i arbeid bør ikke overskride 100%.", - "ValidationMessage.MerEn100ProsentOgOgyldigUtsettlse": "Samlet utbetalingsgrad og andel i arbeid bør ikke overskride 100%. Søker har ikke 100% stilling, vurder om perioden kan utsettes.", - "ValidationMessage.InvalidOrganisasjonsnummer": "Ugyldig organisasjonsnummer.", - "Person.ImageText": "Personinformasjon", - "Person.Woman": "Kvinne", - "Person.Man": "Mann", - "Timeline.scrollLeft": "Scrolle venstre", - "Timeline.scrollRight": "Scrolle høyre", - "Timeline.zoomIn": "Zoom inn", - "Timeline.zoomOut": "Zoom ut", - "Timeline.openData": "Åpne info om første periode", - "Timeline.closeData": "Lukke info om periode", - "Timeline.nextPeriod": "Neste periode", - "Timeline.prevPeriod": "Forrige periode", - "Timeline.tooltip.dagsats": "Dagsats: {dagsats}kr", - "Timeline.tooltip.dagsatsPerAndel": "{arbeidsgiver}: {dagsatsPerAndel} kr", - "Timeline.tooltip.start": "Start", - "Timeline.tooltip.slutt": "Slutt", - "Timeline.tooltip.periodetype": "Periodetype", - "Timeline.tooltip.utsettelsePeriode": "Utsettelse", - "Timeline.TidspunktFamiliehendelse": "Tidspunkt for familiehendelse", - "Timeline.OppfyltPeriode": "Oppfylt periode", - "Timeline.IkkeOppfyltPeriode": "Ikke oppfylt periode", - "Timeline.BelopTilbakereves": "Beløp tilbakekreves", - "Timeline.IngenTilbakekreving": "Ingen tilbakekreving", - "Timeline.IkkeAvklartPeriode": "Uavklart periode", - "Timeline.TidspunktRevurdering": "Startpunkt for revurdering", - "Timeline.GradertPeriode": "Gradert periode", - "Timeline.ManueltAvklart": "Manuelt avklart periode" -} diff --git a/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.stories.tsx b/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.stories.tsx index 3a5943be32..8d4e617f78 100644 --- a/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.stories.tsx +++ b/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.stories.tsx @@ -1,24 +1,17 @@ import { action } from '@storybook/addon-actions'; -import React from 'react'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import aksjonspunktStatus from '@fpsak-frontend/kodeverk/src/aksjonspunktStatus'; -import { fagsakYtelsesType } from '@k9-sak-web/backend/k9sak/kodeverk/FagsakYtelsesType.js'; -import { fagsakStatus } from '@k9-sak-web/backend/k9sak/kodeverk/behandling/FagsakStatus.js'; -import { Aksjonspunkt, Behandling, BeregningsresultatUtbetalt, Fagsak } from '@k9-sak-web/types'; +import { behandlingType } from '@k9-sak-web/backend/k9sak/kodeverk/behandling/BehandlingType.js'; +import { KodeverkProvider } from '@k9-sak-web/gui/kodeverk/index.js'; import alleKodeverk from '@k9-sak-web/gui/storybook/mocks/alleKodeverk.json'; +import { AksjonspunktDto, BehandlingDto } from '@navikt/k9-sak-typescript-client'; import TilkjentYtelseProsessIndex from './TilkjentYtelseProsessIndex'; -const fagsak = { - saksnummer: '123456', - sakstype: { kode: fagsakYtelsesType.FP, kodeverk: 'FAGSAK_YTELSE' }, - status: { kode: fagsakStatus.UNDER_BEHANDLING, kodeverk: 'FAGSAK_STATUS' }, -} as Fagsak; - const behandling = { id: 1, versjon: 1, -} as Behandling; +} as BehandlingDto; const beregningsresultat = { opphoersdato: '2021-03-27', @@ -26,20 +19,11 @@ const beregningsresultat = { { andeler: [ { - aktivitetStatus: { - kode: 'AT', - kodeverk: 'AKTIVITET_STATUS', - }, - inntektskategori: { - kode: 'ARBEIDSTAKER', - kodeverk: 'INNTEKTSKATEGORI', - }, + aktivitetStatus: 'AT', // kodeverk: 'AKTIVITET_STATUS' + inntektskategori: 'ARBEIDSTAKER', // kodeverk: 'INNTEKTSKATEGORI' aktørId: null, arbeidsforholdId: null, - arbeidsforholdType: { - kode: '-', - kodeverk: 'OPPTJENING_AKTIVITET_TYPE', - }, + arbeidsforholdType: '-', // kodeverk: 'OPPTJENING_AKTIVITET_TYPE' arbeidsgiverNavn: 'BEDRIFT1 AS', arbeidsgiverOrgnr: '123456789', eksternArbeidsforholdId: null, @@ -55,7 +39,7 @@ const beregningsresultat = { tom: '2021-03-14', }, utbetalingsgrad: 100, - utfall: 'INNVILGET', + utfall: 'INNVILGET', // kodeverk: 'UTTAK_UTFALL' }, { periode: { @@ -63,25 +47,16 @@ const beregningsresultat = { tom: '2021-03-15', }, utbetalingsgrad: 100, - utfall: 'INNVILGET', + utfall: 'INNVILGET', // kodeverk: 'UTTAK_UTFALL' }, ], }, { - aktivitetStatus: { - kode: 'AT', - kodeverk: 'AKTIVITET_STATUS', - }, - inntektskategori: { - kode: 'ARBEIDSTAKER', - kodeverk: 'INNTEKTSKATEGORI', - }, + aktivitetStatus: 'AT', // kodeverk: 'AKTIVITET_STATUS' + inntektskategori: 'ARBEIDSTAKER', // kodeverk: 'INNTEKTSKATEGORI' aktørId: null, arbeidsforholdId: null, - arbeidsforholdType: { - kode: '-', - kodeverk: 'OPPTJENING_AKTIVITET_TYPE', - }, + arbeidsforholdType: '-', // kodeverk: 'OPPTJENING_AKTIVITET_TYPE' arbeidsgiverNavn: 'BEDRIFT2 AS', arbeidsgiverOrgnr: '234567890', eksternArbeidsforholdId: null, @@ -109,20 +84,11 @@ const beregningsresultat = { { andeler: [ { - aktivitetStatus: { - kode: 'AT', - kodeverk: 'AKTIVITET_STATUS', - }, - inntektskategori: { - kode: 'ARBEIDSTAKER', - kodeverk: 'INNTEKTSKATEGORI', - }, + aktivitetStatus: 'AT', // kodeverk: 'AKTIVITET_STATUS' + inntektskategori: 'ARBEIDSTAKER', // kodeverk: 'INNTEKTSKATEGORI' aktørId: null, arbeidsforholdId: null, - arbeidsforholdType: { - kode: '-', - kodeverk: 'OPPTJENING_AKTIVITET_TYPE', - }, + arbeidsforholdType: '-', // kodeverk: 'OPPTJENING_AKTIVITET_TYPE' arbeidsgiverNavn: 'BEDRIFT1 AS', arbeidsgiverOrgnr: '123456789', eksternArbeidsforholdId: null, @@ -166,7 +132,7 @@ const beregningsresultat = { ], skalHindreTilbaketrekk: false, utbetaltePerioder: [], -} as BeregningsresultatUtbetalt; +}; const arbeidsgiverOpplysningerPerId = { 12345678: { @@ -190,7 +156,6 @@ export default { export const visUtenAksjonspunkt = args => ( ( +export const visÅpentAksjonspunktTilbaketrekk = args => ( ( /> ); -visÅpentAksjonspunkt.args = { +visÅpentAksjonspunktTilbaketrekk.args = { + behandling, + isReadOnly: false, + readOnlySubmitButton: true, +}; + +export const visÅpentAksjonspunktManuellTilkjentYtelse = args => ( + + + +); + +visÅpentAksjonspunktManuellTilkjentYtelse.args = { behandling, isReadOnly: false, readOnlySubmitButton: true, diff --git a/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.tsx b/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.tsx index 848e395aff..f2cd8bc631 100644 --- a/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.tsx +++ b/packages/prosess-tilkjent-ytelse/src/TilkjentYtelseProsessIndex.tsx @@ -1,25 +1,21 @@ -import React from 'react'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; import { - ArbeidsgiverOpplysningerPerId, - Behandling, - BeregningsresultatUtbetalt, - Aksjonspunkt, - KodeverkMedNavn, - Fagsak, -} from '@k9-sak-web/types'; + AksjonspunktDto, + BehandlingDto, + BeregningsresultatMedUtbetaltePeriodeDto, + FagsakDto, +} from '@navikt/k9-sak-typescript-client'; import { createIntl, createIntlCache, RawIntlProvider } from 'react-intl'; import TilkjentYtelsePanel from './components/TilkjentYtelsePanel'; -import messages from '../i18n/nb_NO.json'; interface OwnProps { arbeidsgiverOpplysningerPerId: ArbeidsgiverOpplysningerPerId; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; - behandling: Behandling; - beregningsresultat: BeregningsresultatUtbetalt; - fagsak: Fagsak; - aksjonspunkter: Aksjonspunkt[]; + behandling: BehandlingDto; + beregningsresultat: BeregningsresultatMedUtbetaltePeriodeDto; + fagsak: FagsakDto; + aksjonspunkter: AksjonspunktDto[]; isReadOnly: boolean; - submitCallback: () => void; + submitCallback: (data: any) => Promise; readOnlySubmitButton: boolean; } @@ -28,17 +24,13 @@ const cache = createIntlCache(); const intl = createIntl( { locale: 'nb-NO', - messages, }, cache, ); const TilkjentYtelseProsessIndex = ({ - behandling, beregningsresultat, - fagsak, aksjonspunkter, - alleKodeverk, isReadOnly, submitCallback, readOnlySubmitButton, @@ -46,12 +38,8 @@ const TilkjentYtelseProsessIndex = ({ }: OwnProps) => ( +export const getAktivitet = ( + aktivitetStatus: BeregningsresultatPeriodeAndelDto['aktivitetStatus'], + kodeverkNavnFraKode, +) => // hvis valgtAndel ikke satt ennå return tom string. - aktivitetStatus === undefined ? '' : getKodeverknavn(aktivitetStatus); + aktivitetStatus === undefined ? '' : kodeverkNavnFraKode(aktivitetStatus, KodeverkType.AKTIVITET_STATUS); -export const getInntektskategori = (inntektkategori, getKodeverknavn) => +export const getInntektskategori = ( + inntektkategori: NyPeriodeFormAndeler['inntektskategori'], + kodeverkNavnFraKode, +): string => // hvis valgtAndel ikke satt ennå return tom string. - inntektkategori === undefined ? '' : getKodeverknavn(inntektkategori); + inntektkategori === undefined ? '' : kodeverkNavnFraKode(inntektkategori, KodeverkType.INNTEKTSKATEGORI); -const getEndCharFromId = id => (id ? `...${id.substring(id.length - 4, id.length)}` : ''); +const getEndCharFromId = (id: string) => (id ? `...${id.substring(id.length - 4, id.length)}` : ''); -export const createArbeidsgiverVisningsnavnForAndel = (andel, getKodeverknavn, arbeidsgiverOpplysningerPerId) => { +export const createArbeidsgiverVisningsnavnForAndel = (andel, kodeverkNavnFraKode, arbeidsgiverOpplysningerPerId) => { if (!andel) return ''; let identifikator; @@ -21,7 +30,7 @@ export const createArbeidsgiverVisningsnavnForAndel = (andel, getKodeverknavn, a } if (!identifikator) { - return andel.aktivitetStatus ? getKodeverknavn(andel.aktivitetStatus) : ''; + return andel.aktivitetStatus ? kodeverkNavnFraKode(andel.aktivitetStatus, KodeverkType.AKTIVITET_STATUS) : ''; } const navn = diff --git a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.spec.tsx b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.spec.tsx index 02d922501f..06dc372972 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.spec.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.spec.tsx @@ -1,12 +1,21 @@ import { renderWithIntl } from '@fpsak-frontend/utils-test/test-utils'; -import { BeregningsresultatPeriodeAndel } from '@k9-sak-web/types'; +import { BeregningsresultatPeriodeAndelDto } from '@navikt/k9-sak-typescript-client'; import { screen } from '@testing-library/react'; -import React from 'react'; -import { intlMock } from '../../i18n'; -import messages from '../../i18n/nb_NO.json'; import { PeriodeMedId, TilkjentYtelse } from './TilkjentYtelse'; describe('', () => { + const kodeverkNavnFraKode = (kodeverk: string) => { + if (kodeverk === 'AT') { + return 'Arbeidstaker'; + } + if (kodeverk === 'SN') { + return 'Selvstendig næringsdrivende'; + } + if (kodeverk === 'FL') { + return 'Frilans'; + } + return ''; + }; it('skall innehålla korrekt antal felter', () => { renderWithIntl( ', () => { dagsats: 10000, andeler: [ { - inntektskategori: { - kode: 'ARBEIDSTAKER', - kodeverk: 'INNTEKTSKATEGORI', - }, + inntektskategori: 'ARBEIDSTAKER', // INNTEKTSKATEGORI aktørId: '', - arbeidsforholdType: { - kode: '', - kodeverk: '', - }, + arbeidsforholdType: 'ARBEID', stillingsprosent: 100, arbeidsgiver: '973861778', arbeidsgiverOrgnr: '', arbeidsgiverPersonIdent: '', - aktivitetStatus: { - kode: '', - kodeverk: '', - }, + aktivitetStatus: 'AT', arbeidsforholdId: '', eksternArbeidsforholdId: '', arbeidsgiverNavn: '', refusjon: 0, sisteUtbetalingsdato: '2018-03-31', tilSoker: 1846, - uttak: [ - { - stonadskontoType: '', - periodeResultatType: 'INNVILGET', - gradering: false, - }, - ], + uttak: [], utbetalingsgrad: 100, - } as BeregningsresultatPeriodeAndel, + } as BeregningsresultatPeriodeAndelDto, ], }, ] as PeriodeMedId[] } groups={[]} - intl={intlMock} - alleKodeverk={{}} + kodeverkNavnFraKode={kodeverkNavnFraKode} arbeidsgiverOpplysningerPerId={{}} />, - { messages }, ); expect(screen.getByText('Forrige periode')).toBeInTheDocument(); diff --git a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.tsx b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.tsx index b12fd3a591..b683b33072 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelse.tsx @@ -1,24 +1,23 @@ -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; import { VerticalSpacer } from '@fpsak-frontend/shared-components'; import { TimeLineControl, Timeline } from '@fpsak-frontend/tidslinje'; import { DDMMYY_DATE_FORMAT, ISO_DATE_FORMAT, calcDaysAndWeeksWithWeekends, - getKodeverknavnFn, + initializeDate, } from '@fpsak-frontend/utils'; -import { ArbeidsgiverOpplysningerPerId, BeregningsresultatPeriode, KodeverkMedNavn } from '@k9-sak-web/types'; +import { KodeverkType } from '@k9-sak-web/lib/kodeverk/types.js'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; +import { BeregningsresultatPeriodeDto } from '@navikt/k9-sak-typescript-client'; import moment from 'moment'; import React, { Component, RefObject } from 'react'; -import { WrappedComponentProps, injectIntl } from 'react-intl'; import { createArbeidsgiverVisningsnavnForAndel } from './TilkjentYteleseUtils'; import TilkjentYtelseTimelineData from './TilkjentYtelseTimelineData'; - import styles from './tilkjentYtelse.module.css'; -export type PeriodeMedId = BeregningsresultatPeriode & { id: number }; +export type PeriodeMedId = BeregningsresultatPeriodeDto & { id: number }; -const parseDateString = dateString => moment(dateString, ISO_DATE_FORMAT).toDate(); +const parseDateString = (dateString: string) => initializeDate(dateString, ISO_DATE_FORMAT).toDate(); const getOptions = (nyePerioder: PeriodeMedId[]) => { const firstPeriod = nyePerioder[0]; @@ -40,43 +39,25 @@ const getOptions = (nyePerioder: PeriodeMedId[]) => { }; }; -const createTooltipContent = (intl, item, getKodeverknavn, arbeidsgiverOpplysningerPerId) => { - const { formatMessage } = intl; - const periodeDato = `${moment(item.fom).format(DDMMYY_DATE_FORMAT)} - ${moment(item.tom).format(DDMMYY_DATE_FORMAT)}`; +const createTooltipContent = ( + item: PeriodeMedId, + getKodeverknavn, + arbeidsgiverOpplysningerPerId: ArbeidsgiverOpplysningerPerId, +) => { + const periodeDato = `${initializeDate(item.fom).format(DDMMYY_DATE_FORMAT)} - ${initializeDate(item.tom).format(DDMMYY_DATE_FORMAT)}`; return `

${periodeDato} - ${formatMessage( - { id: calcDaysAndWeeksWithWeekends(moment(item.fom), moment(item.tom)).id }, - { - weeks: calcDaysAndWeeksWithWeekends(moment(item.fom), moment(item.tom)).weeks, - days: calcDaysAndWeeksWithWeekends(moment(item.fom), moment(item.tom)).days, - }, - )} + ${calcDaysAndWeeksWithWeekends(initializeDate(item.fom), initializeDate(item.tom))}
- ${formatMessage( - { id: 'Timeline.tooltip.dagsats' }, - { - dagsats: item.dagsats, - }, - )} + ${`Dagsats: ${item.dagsats}kr`}
${ (item.andeler || []).length > 1 ? item.andeler - .map(andel => - formatMessage( - { id: 'Timeline.tooltip.dagsatsPerAndel' }, - { - arbeidsgiver: createArbeidsgiverVisningsnavnForAndel( - andel, - getKodeverknavn, - arbeidsgiverOpplysningerPerId, - ), - dagsatsPerAndel: Number(andel.refusjon) + Number(andel.tilSoker), - }, - ), - ) + .map(andel => { + `${createArbeidsgiverVisningsnavnForAndel(andel, getKodeverknavn, arbeidsgiverOpplysningerPerId)}: ${Number(andel.refusjon) + Number(andel.tilSoker)} kr`; + }) .join('
') : '' } @@ -84,9 +65,10 @@ const createTooltipContent = (intl, item, getKodeverknavn, arbeidsgiverOpplysnin `; }; -const sumUtBetalingsgrad = (andeler: any) => andeler.reduce((sum, andel) => sum + andel.utbetalingsgrad, 0); +const sumUtBetalingsgrad = (andeler: PeriodeMedId['andeler']) => + andeler.reduce((sum, andel) => sum + andel.utbetalingsgrad, 0); -const erTotalUtbetalingsgradOver100 = periode => { +const erTotalUtbetalingsgradOver100 = (periode: PeriodeMedId) => { const values = [ periode.totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt, periode.totalUtbetalingsgradFraUttak, @@ -106,14 +88,20 @@ const erTotalUtbetalingsgradOver100 = periode => { return false; }; -const prepareTimelineData = (periode, index, intl, getKodeverknavn, arbeidsgiverOpplysningerPerId) => ({ +const prepareTimelineData = ( + periode: PeriodeMedId, + index: number, + getKodeverknavn, + arbeidsgiverOpplysningerPerId: ArbeidsgiverOpplysningerPerId, +) => ({ ...periode, className: erTotalUtbetalingsgradOver100(periode) ? 'innvilget' : 'gradert', group: 1, id: index, start: parseDateString(periode.fom), - end: moment(parseDateString(periode.tom)).add(1, 'day'), - title: createTooltipContent(intl, periode, getKodeverknavn, arbeidsgiverOpplysningerPerId), + end: moment(parseDateString(periode.tom)).add(1, 'day').toDate(), + title: createTooltipContent(periode, getKodeverknavn, arbeidsgiverOpplysningerPerId), + content: '', }); interface OwnProps { @@ -122,7 +110,7 @@ interface OwnProps { id: number; content: string; }[]; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; + kodeverkNavnFraKode: (kode: string, kodeverkType: KodeverkType) => string; arbeidsgiverOpplysningerPerId: ArbeidsgiverOpplysningerPerId; } @@ -136,10 +124,10 @@ interface OwnState { * Presentationskomponent. Masserer data og populerer felten samt formatterar tidslinjen for tilkjent ytelse */ -export class TilkjentYtelse extends Component { +export class TilkjentYtelse extends Component { timelineRef: RefObject; - constructor(props: OwnProps & WrappedComponentProps) { + constructor(props: OwnProps) { super(props); this.state = { @@ -249,16 +237,15 @@ export class TilkjentYtelse extends Component - prepareTimelineData(periode, index, intl, getKodeverknavn, arbeidsgiverOpplysningerPerId), + prepareTimelineData(periode, index, kodeverkNavnFraKode, arbeidsgiverOpplysningerPerId), ); return (

@@ -284,7 +271,6 @@ export class TilkjentYtelse extends Component {selectedItem && ( ', () => { it('skall innehålla rätt undertekst', () => { - renderWithIntl( + render( , - { messages }, ); expect(screen.getByRole('heading', { name: 'Tilkjent ytelse' })).toBeInTheDocument(); }); it('Skal vise tilbaketrekkpanel gitt tilbaketrekkaksjonspunkt', () => { - renderWithIntlAndReduxForm( + render( , - { messages }, ); expect(screen.getByRole('heading', { name: 'Tilkjent ytelse' })).toBeInTheDocument(); expect( diff --git a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelsePanel.tsx b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelsePanel.tsx index 275e91e695..87f4d883c0 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelsePanel.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelsePanel.tsx @@ -1,28 +1,21 @@ -import { DDMMYYYY_DATE_FORMAT } from '@fpsak-frontend/utils'; -import { - Aksjonspunkt, - ArbeidsgiverOpplysningerPerId, - BeregningsresultatPeriode, - BeregningsresultatUtbetalt, - FamilieHendelse, - KodeverkMedNavn, - Personopplysninger, - Soknad, -} from '@k9-sak-web/types'; -import moment from 'moment'; -import React from 'react'; -import { FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; +import { DDMMYYYY_DATE_FORMAT, initializeDate } from '@fpsak-frontend/utils'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; -import aksjonspunktCodes, { hasAksjonspunkt } from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; +import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; +import { useKodeverkContext } from '@k9-sak-web/gui/kodeverk/index.js'; import { Heading } from '@navikt/ds-react'; +import { + AksjonspunktDto, + BeregningsresultatMedUtbetaltePeriodeDto, + BeregningsresultatPeriodeDto, +} from '@navikt/k9-sak-typescript-client'; import TilkjentYtelse, { PeriodeMedId } from './TilkjentYtelse'; import TilkjentYtelseForm from './manuellePerioder/TilkjentYtelseForm'; import Tilbaketrekkpanel from './tilbaketrekk/Tilbaketrekkpanel'; const perioderMedClassName = []; -const formatPerioder = (perioder: BeregningsresultatPeriode[]): PeriodeMedId[] => { +const formatPerioder = (perioder: BeregningsresultatPeriodeDto[]): PeriodeMedId[] => { perioderMedClassName.length = 0; perioder.forEach(item => { if (item.andeler[0] && item.dagsats >= 0) { @@ -39,99 +32,73 @@ const groups = [ const { MANUELL_TILKJENT_YTELSE } = aksjonspunktCodes; +const finnTilbaketrekkAksjonspunkt = (alleAksjonspunkter: AksjonspunktDto[]): AksjonspunktDto | undefined => + alleAksjonspunkter + ? alleAksjonspunkter.find(ap => ap.definisjon === aksjonspunktCodes.VURDER_TILBAKETREKK) + : undefined; + +export const hasAksjonspunkt = (aksjonspunktCode: string, aksjonspunkter: AksjonspunktDto[]): boolean => + aksjonspunkter.some(ap => ap.definisjon === aksjonspunktCode); + interface PureOwnProps { - behandlingId: number; - behandlingVersjon: number; - beregningresultat: BeregningsresultatUtbetalt; - gjeldendeFamiliehendelse: FamilieHendelse; - personopplysninger: Personopplysninger; - soknad: Soknad; - fagsakYtelseTypeKode: string; - aksjonspunkter: Aksjonspunkt[]; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; + beregningsresultat: BeregningsresultatMedUtbetaltePeriodeDto; + aksjonspunkter: AksjonspunktDto[]; readOnly: boolean; submitCallback: (data: any) => Promise; readOnlySubmitButton: boolean; arbeidsgiverOpplysningerPerId: ArbeidsgiverOpplysningerPerId; } -interface MappedOwnProps { - vurderTilbaketrekkAP?: Aksjonspunkt; -} - -export const TilkjentYtelsePanelImpl = ({ - beregningresultat, - vurderTilbaketrekkAP, +const TilkjentYtelsePanelImpl = ({ + beregningsresultat, submitCallback, readOnlySubmitButton, - behandlingId, - behandlingVersjon, aksjonspunkter, readOnly, - alleKodeverk, arbeidsgiverOpplysningerPerId, -}: Partial & MappedOwnProps) => { - const opphoersdato = beregningresultat?.opphoersdato; +}: Partial) => { + const { getKodeverkNavnFraKodeFn } = useKodeverkContext(); + const kodeverkNavnFraKode = getKodeverkNavnFraKodeFn(); + const vurderTilbaketrekkAP = finnTilbaketrekkAksjonspunkt(aksjonspunkter); + const opphoersdato = beregningsresultat?.opphoersdato; return ( <> - + Tilkjent ytelse - {opphoersdato && ( - - )} - {beregningresultat && ( + {opphoersdato && `Opphørsdato: ${initializeDate(opphoersdato).format(DDMMYYYY_DATE_FORMAT).toString()}`} + {beregningsresultat && ( )} {hasAksjonspunkt(MANUELL_TILKJENT_YTELSE, aksjonspunkter) && ( )} {vurderTilbaketrekkAP && ( )} ); }; -const finnTilbaketrekkAksjonspunkt = (alleAksjonspunkter: Aksjonspunkt[]): Aksjonspunkt | undefined => - alleAksjonspunkter - ? alleAksjonspunkter.find(ap => ap.definisjon?.kode === aksjonspunktCodes.VURDER_TILBAKETREKK) - : undefined; - -const mapStateToProps = (state, ownProps) => ({ - beregningresultat: ownProps.beregningsresultat, - - vurderTilbaketrekkAP: finnTilbaketrekkAksjonspunkt(ownProps.aksjonspunkter), -}); - -export default connect(mapStateToProps)(TilkjentYtelsePanelImpl); +export default TilkjentYtelsePanelImpl; diff --git a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimeLineData.spec.tsx b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimeLineData.spec.tsx index 80e637b2d3..923cdde490 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimeLineData.spec.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimeLineData.spec.tsx @@ -1,7 +1,5 @@ import { renderWithIntl } from '@fpsak-frontend/utils-test/test-utils'; import { screen } from '@testing-library/react'; -import React from 'react'; -import messages from '../../i18n/nb_NO.json'; import { createArbeidsgiverVisningsnavnForAndel } from './TilkjentYteleseUtils'; import { PeriodeMedId } from './TilkjentYtelse'; import TilkjentYtelseTimeLineData from './TilkjentYtelseTimelineData'; @@ -9,16 +7,10 @@ import TilkjentYtelseTimeLineData from './TilkjentYtelseTimelineData'; const selectedItemDataFL = { andeler: [ { - aktivitetStatus: { - kode: 'FL', - kodeverk: 'AKTIVITET_STATUS', - }, + aktivitetStatus: 'FL', // AKTIIVITET_STATUS aktørId: null, arbeidsforholdId: null, - arbeidsforholdType: { - kode: '-', - kodeverk: 'OPPTJENING_AKTIVITET_TYPE', - }, + arbeidsforholdType: '-', // OPPTJENING_AKTIVITET_TYPE arbeidsgiverNavn: null, arbeidsgiverOrgnr: '', eksternArbeidsforholdId: null, @@ -51,14 +43,14 @@ const selectedItemEndDate = '2020-04-24'; const callbackForward = vi.fn(); const callbackBackward = vi.fn(); -const getKodeverknavn = kodeverk => { - if (kodeverk.kode === 'AT') { +const kodeverkNavnFraKode = (kodeverk: string) => { + if (kodeverk === 'AT') { return 'Arbeidstaker'; } - if (kodeverk.kode === 'SN') { + if (kodeverk === 'SN') { return 'Selvstendig næringsdrivende'; } - if (kodeverk.kode === 'FL') { + if (kodeverk === 'FL') { return 'Frilans'; } return ''; @@ -73,13 +65,13 @@ describe('', () => { selectedItemData={selectedItemDataFL} selectedItemStartDate={selectedItemStartDate} selectedItemEndDate={selectedItemEndDate} - alleKodeverk={{}} arbeidsgiverOpplysningerPerId={{}} />, - { messages }, ); expect(screen.getByText('Aktivitetsstatus:')).toBeInTheDocument(); - expect(createArbeidsgiverVisningsnavnForAndel(selectedItemDataFL.andeler[0], getKodeverknavn, {})).toBe('Frilans'); + expect(createArbeidsgiverVisningsnavnForAndel(selectedItemDataFL.andeler[0], kodeverkNavnFraKode, {})).toBe( + 'Frilans', + ); }); }); diff --git a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimelineData.tsx b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimelineData.tsx index 8688edca1f..3be1f03cb4 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimelineData.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/TilkjentYtelseTimelineData.tsx @@ -1,13 +1,11 @@ -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; import { FloatRight, VerticalSpacer } from '@fpsak-frontend/shared-components'; import { TimeLineButton, TimeLineDataContainer } from '@fpsak-frontend/tidslinje'; -import { calcDaysAndWeeksWithWeekends, DDMMYYYY_DATE_FORMAT, getKodeverknavnFn } from '@fpsak-frontend/utils'; -import { ArbeidsgiverOpplysningerPerId, KodeverkMedNavn } from '@k9-sak-web/types'; +import { calcDaysAndWeeksWithWeekends, DDMMYYYY_DATE_FORMAT, initializeDate } from '@fpsak-frontend/utils'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; import { BodyShort, HGrid, Label, Tabs, Tag } from '@navikt/ds-react'; -import moment from 'moment'; import React, { useEffect } from 'react'; -import { FormattedMessage, useIntl } from 'react-intl'; +import { useKodeverkContext } from '@k9-sak-web/gui/kodeverk/index.js'; import { createArbeidsgiverVisningsnavnForAndel, getAktivitet } from './TilkjentYteleseUtils'; import { PeriodeMedId } from './TilkjentYtelse'; import styles from './tilkjentYtelse.module.css'; @@ -19,7 +17,6 @@ interface OwnProps { selectedItemData?: PeriodeMedId; callbackForward: (...args: any[]) => any; callbackBackward: (...args: any[]) => any; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; arbeidsgiverOpplysningerPerId: ArbeidsgiverOpplysningerPerId; } @@ -40,9 +37,9 @@ const TilkjentYtelseTimeLineData = ({ selectedItemData, callbackForward, callbackBackward, - alleKodeverk, arbeidsgiverOpplysningerPerId, }: OwnProps) => { + const { kodeverkNavnFraKode } = useKodeverkContext(); const { andeler } = selectedItemData; const [selectedAndelIndex, setSelectedAndelIndex] = React.useState('0'); const utbetalingsgradFraUttak = desimalerTilProsent(selectedItemData.totalUtbetalingsgradFraUttak); @@ -70,28 +67,18 @@ const TilkjentYtelseTimeLineData = ({ }; const numberOfDaysAndWeeks = calcDaysAndWeeksWithWeekends(selectedItemStartDate, selectedItemEndDate); - const intl = useIntl(); - const getKodeverknavn = getKodeverknavnFn(alleKodeverk, kodeverkTyper); return (
- - + +
@@ -100,31 +87,15 @@ const TilkjentYtelseTimeLineData = ({
- - - - ( - - ) + {`${initializeDate(selectedItemStartDate).format(DDMMYYYY_DATE_FORMAT).toString()} - ${initializeDate(selectedItemEndDate).format(DDMMYYYY_DATE_FORMAT).toString()}`} + {numberOfDaysAndWeeks}
{harUtbetalingsgradFraUttak && (
- + {`Total utbetalingsgrad av beregningsgrunnlag: `} {utbetalingsgradVedTilkommetInntektErMinst() ? utbetalingsgradEtterReduksjonVedTilkommetInntekt @@ -144,7 +115,7 @@ const TilkjentYtelseTimeLineData = ({ )}
- + {`Utbetalt dagsats: `} {selectedItemData.dagsats} kr
@@ -154,18 +125,7 @@ const TilkjentYtelseTimeLineData = ({ {!!andel.refusjon && (
- + {`${createArbeidsgiverVisningsnavnForAndel(andel, kodeverkNavnFraKode, arbeidsgiverOpplysningerPerId)}: ${Number(andel.refusjon)} kr`} Refusjon @@ -175,18 +135,7 @@ const TilkjentYtelseTimeLineData = ({ {!!andel.tilSoker && (
- + {`${createArbeidsgiverVisningsnavnForAndel(andel, kodeverkNavnFraKode, arbeidsgiverOpplysningerPerId)}: ${Number(andel.tilSoker)} kr`} Til bruker @@ -199,32 +148,36 @@ const TilkjentYtelseTimeLineData = ({ {andeler.map((andel, index) => { - const label = createArbeidsgiverVisningsnavnForAndel(andel, getKodeverknavn, arbeidsgiverOpplysningerPerId); + const label = createArbeidsgiverVisningsnavnForAndel( + andel, + kodeverkNavnFraKode, + arbeidsgiverOpplysningerPerId, + ); return ; })} {andeler.map((andel, index) => (
- + {`Utbetalt refusjon: `} {andel?.refusjon} kr - + {`Utbetalt til søker: `} {andel?.tilSoker} kr - + {`Utbetalingsgrad: `} {andel?.utbetalingsgrad} % - + {`Aktivitetsstatus: `} - {getAktivitet(andel?.aktivitetStatus, getKodeverknavn)} + {getAktivitet(andel?.aktivitetStatus, kodeverkNavnFraKode)}
diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/Andeler.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/Andeler.tsx index 4fdef59685..7bf7060554 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/Andeler.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/Andeler.tsx @@ -1,56 +1,43 @@ -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; -import { getKodeverknavnFn } from '@fpsak-frontend/utils'; -import { ArbeidsgiverOpplysningerPerId, Kodeverk, KodeverkMedNavn } from '@k9-sak-web/types'; +import { useKodeverkContext } from '@k9-sak-web/gui/kodeverk/index.js'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; import { Alert, BodyShort, Table } from '@navikt/ds-react'; -import React from 'react'; -import { WrappedComponentProps, useIntl } from 'react-intl'; -import { FieldArrayFieldsProps, FieldArrayMetaProps } from 'redux-form'; +import { useFormContext } from 'react-hook-form'; import { createArbeidsgiverVisningsnavnForAndel, createPrivatarbeidsgiverVisningsnavnForAndel, getInntektskategori, } from '../TilkjentYteleseUtils'; +import { TilkjentYtelseFormState } from './FormState'; interface OwnProps { - fields: FieldArrayFieldsProps; - meta: FieldArrayMetaProps; - openSlettPeriodeModalCallback: (...args: any[]) => any; - updatePeriode: (...args: any[]) => any; - editPeriode: (...args: any[]) => any; - cancelEditPeriode: (...args: any[]) => any; - readOnly: boolean; - perioder: any[]; - isNyPeriodeFormOpen: boolean; - behandlingVersjon: number; - behandlingId: number; - behandlingStatus: Kodeverk; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; + name: string; arbeidsgivere: ArbeidsgiverOpplysningerPerId; } const headerTextCodes = [ - 'TilkjentYtelse.NyPeriode.Inntektskategori', - 'TilkjentYtelse.NyPeriode.Arbeidsgiver', - 'TilkjentYtelse.NyPeriode.ArbeidsgiverPrivatperson', - 'TilkjentYtelse.NyPeriode.TilSoker', - 'TilkjentYtelse.NyPeriode.Refusjon', - 'TilkjentYtelse.NyPeriode.Ubetalingsgrad', + 'Inntektskategori', + 'Arbeidsgiver', + 'Arbeidsgiver (privatperson)', + 'Til søker', + 'Refusjon', + 'Uttaksgrad', ]; -const Andeler = ({ fields, meta, alleKodeverk, arbeidsgivere }: Partial & WrappedComponentProps) => { - const intl = useIntl(); - const getKodeverknavn = getKodeverknavnFn(alleKodeverk, kodeverkTyper); +const Andeler = ({ name, arbeidsgivere }: Partial) => { + const { kodeverkNavnFraKode } = useKodeverkContext(); + const { + formState: { errors }, + watch, + } = useFormContext(); + const error = errors?.[name]; + + const andeler = watch(name as 'perioder.0.andeler'); return (
- {meta.error && ( + {error && ( - {meta.error} - - )} - {meta.warning && ( - - {meta.warning} + {error} )} @@ -59,24 +46,23 @@ const Andeler = ({ fields, meta, alleKodeverk, arbeidsgivere }: Partial {headerTextCodes.map(textCode => ( - {intl.formatMessage({ id: textCode })} + {textCode} ))} - {fields.map((fieldId: string, index: number, field: FieldArrayFieldsProps) => { - const andel = field.get(index); - const inntektskategori = getInntektskategori(andel.inntektskategori, getKodeverknavn); - const arbeidsgiver = createArbeidsgiverVisningsnavnForAndel(andel, getKodeverknavn, arbeidsgivere); + {andeler.map(andel => { + const inntektskategori = getInntektskategori(andel.inntektskategori, kodeverkNavnFraKode); + const arbeidsgiver = createArbeidsgiverVisningsnavnForAndel(andel, kodeverkNavnFraKode, arbeidsgivere); const arbeidsgiverPrivatperson = createPrivatarbeidsgiverVisningsnavnForAndel( andel, - getKodeverknavn, + kodeverkNavnFraKode, arbeidsgivere, ); return ( - + {inntektskategori} diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/FormState.ts b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/FormState.ts new file mode 100644 index 0000000000..8b68a58ffa --- /dev/null +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/FormState.ts @@ -0,0 +1,36 @@ +import { ArbeidsgiverOpplysninger, ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; +import { BeregningsresultatPeriodeAndelDto, BeregningsresultatPeriodeDto } from '@navikt/k9-sak-typescript-client'; + +export interface BeriketBeregningsresultatPeriode extends Omit { + id: string; + andeler: Array | null; + openForm?: boolean; +} + +export interface SlettetPeriode extends BeregningsresultatPeriodeDto { + begrunnelse: string; + updated?: boolean; +} + +export type TilkjentYtelseFormState = { + arbeidsgivere: ArbeidsgiverOpplysningerPerId; + perioder: BeriketBeregningsresultatPeriode[]; + slettedePerioder?: SlettetPeriode[]; + nyPeriodeForm?: NyPeriodeFormState; + nyArbeidsgiverForm?: NyArbeidsgiverFormState; +}; + +export type NyPeriodeFormAndeler = Omit & { + inntektskategori: string; + arbeidsgiverPersonIdent?: string; +}; + +export type NyPeriodeFormState = { + fom: string; + tom: string; + andeler?: NyPeriodeFormAndeler[]; +}; + +export type NyArbeidsgiverFormState = ArbeidsgiverOpplysninger & { + orgNr: string; +}; diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyAndel.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyAndel.tsx index 623ac2252f..c19015ec5c 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyAndel.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyAndel.tsx @@ -1,17 +1,18 @@ import addCircleIcon from '@fpsak-frontend/assets/images/add-circle.svg'; -import { InputField, SelectField } from '@fpsak-frontend/form'; import inntektskategorier from '@fpsak-frontend/kodeverk/src/inntektskategorier'; -import kodeverkTyper from '@fpsak-frontend/kodeverk/src/kodeverkTyper'; -import { FlexColumn, FlexRow, Image, PeriodFieldArray, useFeatureToggles } from '@fpsak-frontend/shared-components'; +import { FlexColumn, FlexRow, Image, useFeatureToggles, VerticalSpacer } from '@fpsak-frontend/shared-components'; import { hasValidDecimal, maxValue, minValue, required } from '@fpsak-frontend/utils'; -import { ArbeidsgiverOpplysningerPerId, KodeverkMedNavn } from '@k9-sak-web/types'; -import React, { useState } from 'react'; -import { WrappedComponentProps } from 'react-intl'; -import { FieldArrayFieldsProps, FieldArrayMetaProps } from 'redux-form'; +import { atLeastOneRequired } from '@fpsak-frontend/utils/src/validation/validators'; +import { useKodeverkContext } from '@k9-sak-web/gui/kodeverk/index.js'; +import { KodeverkObject, KodeverkType } from '@k9-sak-web/lib/kodeverk/types.js'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; +import { Button, Detail, Fieldset, HGrid } from '@navikt/ds-react'; +import { InputField, SelectField } from '@navikt/ft-form-hooks'; +import { useEffect, useState } from 'react'; +import { useFieldArray, useFormContext } from 'react-hook-form'; +import { NyArbeidsgiverFormState, NyPeriodeFormAndeler, TilkjentYtelseFormState } from './FormState'; import NyArbeidsgiverModal from './NyArbeidsgiverModal'; - import styles from './periode.module.css'; -import { atLeastOneRequired } from '@fpsak-frontend/utils/src/validation/validators'; const minValue0 = minValue(0); const maxValue100 = maxValue(100); @@ -48,9 +49,8 @@ const mapArbeidsgiverePrivatperson = (arbeidsgivere: ArbeidsgiverOpplysningerPer )) : []; -const getInntektskategori = alleKodeverk => { - const aktivitetsstatuser = alleKodeverk[kodeverkTyper.INNTEKTSKATEGORI]; - return aktivitetsstatuser.map(ik => ( +const getInntektskategori = (inntektskategorier: KodeverkObject[]) => { + return inntektskategorier.map(ik => ( @@ -67,107 +67,104 @@ const erSelvstendigNæringsdrivende = inntektskategori => const erFrilans = inntektskategori => inntektskategori === inntektskategorier.FRILANSER; -const defaultAndel = { - fom: '', - tom: '', +const defaultAndel: NyPeriodeFormAndeler = { + aktivitetStatus: undefined, + aktørId: '', + arbeidsforholdId: '', + arbeidsforholdType: undefined, + arbeidsgiverNavn: '', + arbeidsgiverOrgnr: '', + arbeidsgiverPersonIdent: '', + eksternArbeidsforholdId: '', + inntektskategori: undefined, + refusjon: 0, + sisteUtbetalingsdato: '', + stillingsprosent: 0, + tilSoker: 0, + utbetalingsgrad: 0, + uttak: [], }; interface OwnProps { - meta: FieldArrayMetaProps; readOnly: boolean; - fields: FieldArrayFieldsProps; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; arbeidsgivere: ArbeidsgiverOpplysningerPerId; - newArbeidsgiverCallback: (values: any) => void; - behandlingId: number; - behandlingVersjon: number; + newArbeidsgiverCallback: (values: NyArbeidsgiverFormState) => void; } -export const NyAndel = ({ - fields, - meta, - newArbeidsgiverCallback, - alleKodeverk, - readOnly, - arbeidsgivere, - behandlingId, - behandlingVersjon, -}: OwnProps & WrappedComponentProps) => { +export const NyAndel = ({ newArbeidsgiverCallback, readOnly, arbeidsgivere }: OwnProps) => { const [isOpen, setOpen] = useState(false); + const { control } = useFormContext(); + const { hentKodeverkForKode } = useKodeverkContext(); + const inntektskategorier = hentKodeverkForKode(KodeverkType.INNTEKTSKATEGORI) as KodeverkObject[]; + const { fields, append, remove } = useFieldArray({ + control, + name: 'nyPeriodeForm.andeler', + keyName: 'fieldId', + }); const [featureToggles] = useFeatureToggles(); const skillUtPrivatperson = featureToggles?.SKILL_UT_PRIVATPERSON; - const allFields = fields.getAll(); + useEffect(() => { + if (fields.length === 0) { + append(defaultAndel); + } + }, []); return ( <> - - {(periodeElementFieldId, index, getRemoveButton) => { - const values = allFields[index]; - - const erSN = erSelvstendigNæringsdrivende(values.inntektskategori); - const erFL = erFrilans(values.inntektskategori); - +
+ {fields.map((field, index) => { + const erSN = erSelvstendigNæringsdrivende(field.inntektskategori); + const erFL = erFrilans(field.inntektskategori); return ( - + {!erSN && !erFL && ( <> - +
atLeastOneRequired(value, values.arbeidsgiverPersonIdent)] + ? [value => atLeastOneRequired(value, field.arbeidsgiverPersonIdent)] : [required] } selectValues={ skillUtPrivatperson ? mapArbeidsgivereOrg(arbeidsgivere) : mapArbeidsgivere(arbeidsgivere) } /> -
} onClick={() => setOpen(true)} - onKeyDown={() => setOpen(true)} - className={styles.addArbeidsforhold} - role="button" - tabIndex={0} - > - Ny arbeidsgiver -
- + aria-label="Ny arbeidsgiver" + type="button" + /> +
{skillUtPrivatperson && ( - +
atLeastOneRequired(value, values.arbeidsgiverOrgnr)]} + label="Arbeidsgiver (privatperson)" + name={`nyPeriodeForm.andeler.${index}.arbeidsgiverPersonIdent`} + validate={[value => atLeastOneRequired(value, field.arbeidsgiverOrgnr)]} selectValues={mapArbeidsgiverePrivatperson(arbeidsgivere)} /> - +
)} )} value} /> @@ -175,8 +172,8 @@ export const NyAndel = ({ {!erSN && !erFL && ( value} /> @@ -185,30 +182,46 @@ export const NyAndel = ({ {!erSN && ( value} /> )} - {getRemoveButton()} + + {index > 0 && ( + + )} + + +
{isOpen && ( { + closeEvent={(values: NyArbeidsgiverFormState) => { newArbeidsgiverCallback(values); setOpen(false); }} cancelEvent={() => setOpen(false)} - behandlingId={behandlingId} - behandlingVersjon={behandlingVersjon} /> )} diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyArbeidsgiverModal.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyArbeidsgiverModal.tsx index ee748deb79..cf34762957 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyArbeidsgiverModal.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyArbeidsgiverModal.tsx @@ -1,95 +1,73 @@ -import { behandlingForm, InputField } from '@fpsak-frontend/form'; import { FlexColumn, FlexContainer, FlexRow, VerticalSpacer } from '@fpsak-frontend/shared-components'; import { hasValidOrgNumber, required } from '@fpsak-frontend/utils'; import { Button, Modal } from '@navikt/ds-react'; -import React from 'react'; -import { injectIntl, WrappedComponentProps } from 'react-intl'; -import { connect } from 'react-redux'; -import { InjectedFormProps } from 'redux-form'; +import { InputField } from '@navikt/ft-form-hooks'; +import { useFormContext } from 'react-hook-form'; +import { NyArbeidsgiverFormState, TilkjentYtelseFormState } from './FormState'; import styles from './periode.module.css'; -const defaultArbeidsgiver = { - navn: '', - orgNr: '', -}; - interface OwnProps { showModal?: boolean; - closeEvent: (...args: any[]) => any; - cancelEvent: (...args: any[]) => any; + closeEvent: (values: NyArbeidsgiverFormState) => void; + cancelEvent: () => void; } -export const NyArbeidsgiverModal = ({ - showModal = false, - closeEvent, - cancelEvent, - intl, - ...formProps -}: OwnProps & WrappedComponentProps & InjectedFormProps) => ( - - - - - - value} - /> - - value} - /> - - - - - - - - - - - - -); - -interface PureOwnProps { - closeEvent: (...args: any[]) => any; -} +const NyArbeidsgiverModal = ({ showModal = false, closeEvent, cancelEvent }: OwnProps) => { + const formMethods = useFormContext(); + const nyArbeidsgiverFormState = formMethods.watch('nyArbeidsgiverForm'); -const mapStateToPropsFactory = (_initialState: any, ownProps: PureOwnProps) => { - const onSubmit = (values: any) => ownProps.closeEvent(values); + const handleSubmit = () => { + formMethods.trigger('nyArbeidsgiverForm').then(valid => { + if (valid) { + closeEvent(nyArbeidsgiverFormState); + } + }); + }; - return () => ({ - initialValues: defaultArbeidsgiver, - onSubmit, - }); + return ( + + + + + + value} /> + value} + /> + + + + + + + + + + + + + ); }; -export default connect(mapStateToPropsFactory)( - behandlingForm({ - form: 'nyArbeidsgiverForm', - })(injectIntl(NyArbeidsgiverModal)), -); +export default NyArbeidsgiverModal; diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyPeriode.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyPeriode.tsx index 0dc06aeaa1..b58ca6188c 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyPeriode.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/NyPeriode.tsx @@ -1,47 +1,85 @@ -import { DatepickerField, behandlingForm, behandlingFormValueSelector } from '@fpsak-frontend/form'; import { FlexColumn, FlexContainer, FlexRow, VerticalSpacer } from '@fpsak-frontend/shared-components'; -import { calcDaysAndWeeks, guid, hasValidPeriod, required } from '@fpsak-frontend/utils'; -import { ArbeidsgiverOpplysningerPerId, KodeverkMedNavn, Periode } from '@k9-sak-web/types'; -import { Button, Label } from '@navikt/ds-react'; -import React from 'react'; -import { FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; -import { FieldArray, InjectedFormProps } from 'redux-form'; +import { calcDaysAndWeeks, guid, initializeDate } from '@fpsak-frontend/utils'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; +import { Button, ErrorMessage, Label } from '@navikt/ds-react'; +import { Datepicker } from '@navikt/ft-form-hooks'; +import { dateAfterOrEqual, hasValidDate, required } from '@navikt/ft-form-validators'; +import { useFormContext } from 'react-hook-form'; +import { + BeriketBeregningsresultatPeriode, + NyArbeidsgiverFormState, + NyPeriodeFormState, + TilkjentYtelseFormState, +} from './FormState'; import NyAndel from './NyAndel'; import styles from './periode.module.css'; +interface Periode { + fom: string; + tom: string; +} + +export const sjekkOverlappendePerioder = (index: number, nestePeriode: Periode, forrigePeriode: Periode) => + index !== 0 && initializeDate(nestePeriode.fom).isSameOrBefore(initializeDate(forrigePeriode.tom)); + +const validateForm = (perioder: BeriketBeregningsresultatPeriode[], nyPeriodeFom: string, nyPeriodeTom: string) => { + let feilmelding = ''; + + if (!nyPeriodeFom || !nyPeriodeTom) { + return feilmelding; + } + + const kombinertePerioder = [...perioder, { fom: nyPeriodeFom, tom: nyPeriodeTom }]; + + kombinertePerioder.forEach((periode, index: number) => { + const forrigePeriode = perioder[index - 1]; + const nestePeriode = periode; + + if (sjekkOverlappendePerioder(index, nestePeriode, forrigePeriode)) { + feilmelding = 'Perioden overlapper med en annen periode'; + } + }); + + return feilmelding; +}; + interface OwnProps { newPeriodeResetCallback: (values: any) => any; - newArbeidsgiverCallback: (values: any) => void; - andeler: any[]; - nyPeriode: Periode; - nyPeriodeDisabledDaysFom: string; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; + newArbeidsgiverCallback: (values: NyArbeidsgiverFormState) => void; arbeidsgivere: ArbeidsgiverOpplysningerPerId; readOnly: boolean; - behandlingId: number; - behandlingVersjon: number; + newPeriodeCallback: (nyPeriode: Partial) => void; } export const TilkjentYtelseNyPeriode = ({ newPeriodeResetCallback, newArbeidsgiverCallback, - nyPeriode, + newPeriodeCallback, readOnly, - andeler, - alleKodeverk, - behandlingId, - behandlingVersjon, arbeidsgivere, - ...formProps -}: OwnProps & InjectedFormProps) => { - const numberOfDaysAndWeeks = calcDaysAndWeeks(nyPeriode.fom, nyPeriode.tom); +}: OwnProps) => { + const formMethods = useFormContext(); + const formState = formMethods.watch('nyPeriodeForm'); + const numberOfDaysAndWeeks = calcDaysAndWeeks(formState.fom, formState.tom); + + const perioder = formMethods.watch('perioder'); + + const feilmelding = validateForm(perioder, formState.fom, formState.fom); + + const handleSubmit = () => { + formMethods.trigger(['nyPeriodeForm']).then(valid => { + if (valid && !feilmelding) { + newPeriodeCallback(transformValues(formState)); + } + }); + }; + return (
@@ -52,40 +90,26 @@ export const TilkjentYtelseNyPeriode = ({ - + - + -
- {nyPeriode.fom && ( - - )} -
+
{formState.fom && numberOfDaysAndWeeks}
- @@ -93,34 +117,33 @@ export const TilkjentYtelseNyPeriode = ({ - + {feilmelding && {feilmelding}}
); }; -const transformValues = (values: any) => ({ +const transformValues = (values: NyPeriodeFormState): BeriketBeregningsresultatPeriode => ({ id: guid(), fom: values.fom, tom: values.tom, + dagsats: null, andeler: values.andeler.map(andel => ({ - inntektskategori: { - kode: andel.inntektskategori, - kodeverk: 'INNTEKTSKATEGORI', - }, + ...andel, + inntektskategori: andel.inntektskategori, arbeidsgiverOrgnr: andel.arbeidsgiverOrgnr, arbeidsgiverPersonIdent: andel.arbeidsgiverPersonIdent, tilSoker: andel.tilSoker, @@ -129,56 +152,4 @@ const transformValues = (values: any) => ({ })), }); -const validateNyPeriodeForm = (values: any) => { - const errors = {}; - if (!values) { - return errors; - } - - const invalid = required(values.fom) || hasValidPeriod(values.fom, values.tom); - - if (invalid) { - return { - fom: invalid, - }; - } - - return errors; -}; - -interface PureOwnProps { - newPeriodeCallback: (values: any) => void; - behandlingId: number; - behandlingVersjon: number; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; -} - -const mapStateToPropsFactory = (_initialState: any, ownProps: PureOwnProps) => { - const { newPeriodeCallback, behandlingId, behandlingVersjon } = ownProps; - const onSubmit = (values: any) => newPeriodeCallback(transformValues(values)); - - return (state: any) => ({ - initialValues: { - fom: null, - tom: null, - }, - nyPeriode: behandlingFormValueSelector('nyPeriodeForm', behandlingId, behandlingVersjon)(state, 'fom', 'tom'), - andeler: behandlingFormValueSelector('andeler', behandlingId, behandlingVersjon)( - state, - 'tilSoker', - 'refusjon', - 'arbeidsgiver', - 'inntektskategori', - 'utbetalingsgrad', - ), - onSubmit, - }); -}; - -export default connect(mapStateToPropsFactory)( - behandlingForm({ - form: 'nyPeriodeForm', - validate: values => validateNyPeriodeForm(values), - enableReinitialize: true, - })(TilkjentYtelseNyPeriode), -); +export default TilkjentYtelseNyPeriode; diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeRad.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeRad.tsx index 73546c640e..8d93d8df96 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeRad.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeRad.tsx @@ -1,57 +1,44 @@ import removePeriod from '@fpsak-frontend/assets/images/remove.svg'; import removePeriodDisabled from '@fpsak-frontend/assets/images/remove_disabled.svg'; -import { DatepickerField } from '@fpsak-frontend/form'; import { FlexColumn, FlexRow, Image } from '@fpsak-frontend/shared-components'; -import { ArbeidsgiverOpplysningerPerId, Kodeverk, KodeverkMedNavn } from '@k9-sak-web/types'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; import { Alert, Table } from '@navikt/ds-react'; -import React from 'react'; -import { WrappedComponentProps, injectIntl } from 'react-intl'; -import { FieldArray, FieldArrayFieldsProps, FieldArrayMetaProps } from 'redux-form'; +import { Datepicker } from '@navikt/ft-form-hooks'; +import { useFieldArray, useFormContext } from 'react-hook-form'; import Andeler from './Andeler'; +import { TilkjentYtelseFormState } from './FormState'; import styles from './periode.module.css'; interface OwnProps { - fields: FieldArrayFieldsProps; - meta: FieldArrayMetaProps; openSlettPeriodeModalCallback: (...args: any[]) => any; - updatePeriode: (...args: any[]) => any; - editPeriode: (...args: any[]) => any; - cancelEditPeriode: (...args: any[]) => any; readOnly: boolean; - perioder: any[]; isNyPeriodeFormOpen: boolean; - behandlingVersjon: number; - behandlingId: number; - behandlingStatus: Kodeverk; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; - isAnyFormOpen: (...args: any[]) => any; + isAnyFormOpen: () => boolean; arbeidsgivere: ArbeidsgiverOpplysningerPerId; } -const headerTextCodes = ['TilkjentYtelse.Periode', 'TilkjentYtelse.Andeler']; +const headerTextCodes = ['Periode', 'Andeler']; const PeriodeRad = ({ - fields, - meta, openSlettPeriodeModalCallback, - alleKodeverk, - intl, isNyPeriodeFormOpen, readOnly, arbeidsgivere, isAnyFormOpen, -}: Partial & WrappedComponentProps) => { +}: Partial) => { + const { control, formState } = useFormContext(); + const { fields } = useFieldArray({ + control, + name: 'perioder', + keyName: 'fieldId', + }); const isAnyFormOrNyPeriodeOpen = isAnyFormOpen() || isNyPeriodeFormOpen; + const error = formState.errors?.perioder; return (
- {meta.error && ( + {error && ( - {meta.error} - - )} - {meta.warning && ( - - {meta.warning} + {error} )} @@ -60,46 +47,27 @@ const PeriodeRad = ({ {headerTextCodes.map(text => ( - {intl.formatMessage({ id: text })} + {text} ))} - {fields.map((fieldId: string, index: number, field: FieldArrayFieldsProps) => { - const periode = field.get(index); + {fields.map((item, index) => { return ( - + - + - + - + {!readOnly && ( @@ -108,9 +76,9 @@ const PeriodeRad = ({ className={styles.removeIcon} src={isAnyFormOrNyPeriodeOpen ? removePeriodDisabled : removePeriod} onClick={ - isAnyFormOrNyPeriodeOpen ? () => undefined : () => openSlettPeriodeModalCallback(periode.id) + isAnyFormOrNyPeriodeOpen ? () => undefined : () => openSlettPeriodeModalCallback(item.id) } - alt={intl.formatMessage({ id: 'TilkjentYtelse.SlettPerioden' })} + alt="Slett Perioden" />
)} @@ -124,4 +92,4 @@ const PeriodeRad = ({ ); }; -export default injectIntl(PeriodeRad); +export default PeriodeRad; diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeTabell.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeTabell.tsx index 9024a2d10e..42ff3da1e7 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeTabell.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/PeriodeTabell.tsx @@ -1,245 +1,109 @@ -import { behandlingFormValueSelector, getBehandlingFormPrefix } from '@fpsak-frontend/form'; import { FlexColumn, FlexContainer, FlexRow, VerticalSpacer } from '@fpsak-frontend/shared-components'; import { ariaCheck } from '@fpsak-frontend/utils'; -import { ArbeidsgiverOpplysningerPerId, KodeverkMedNavn } from '@k9-sak-web/types'; -import React, { useCallback, useState } from 'react'; -import { FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; -import { bindActionCreators } from 'redux'; -import { FieldArray, getFormInitialValues, change as reduxFormChange, reset as reduxFormReset } from 'redux-form'; - import { Button } from '@navikt/ds-react'; +import { useCallback, useState } from 'react'; +import { useFormContext } from 'react-hook-form'; +import { BeriketBeregningsresultatPeriode, NyArbeidsgiverFormState, TilkjentYtelseFormState } from './FormState'; import NyPeriode from './NyPeriode'; import PeriodeRad from './PeriodeRad'; import SlettPeriodeModal from './SlettPeriodeModal'; -const FORM_NAME = 'TilkjentYtelseForm'; - -const createNewPerioder = (perioder, id: string, values: any) => { - const updatedIndex = perioder.findIndex(p => p.id === id); - const updatedPeriode = perioder.find(p => p.id === id); - - return [ - ...perioder.slice(0, updatedIndex), - { - ...updatedPeriode, - ...values, - }, - ...perioder.slice(updatedIndex + 1), - ]; -}; - -interface PureOwnProps { - behandlingId: number; - behandlingVersjon: number; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; -} - interface OwnProps { readOnly: boolean; - behandlingFormPrefix: string; - perioder?: any[]; - openForms: boolean; - reduxFormChange: (...args: any[]) => any; - reduxFormReset: (...args: any[]) => any; - submitting: boolean; - initialValues: { - perioder?: any[]; - }; - behandlingId: number; - behandlingVersjon: number; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; - slettedePerioder?: any[]; - arbeidsgivere?: ArbeidsgiverOpplysningerPerId; } -export const PeriodeTabell = ({ - behandlingFormPrefix, - behandlingId, - behandlingVersjon, - alleKodeverk, - perioder, - slettedePerioder, - initialValues, - arbeidsgivere, - readOnly, - openForms, - submitting, - reduxFormChange: formChange, - reduxFormReset: formReset, -}: OwnProps) => { - const [{ isNyPeriodeFormOpen, showModalSlettPeriode, periodeSlett }, setState] = useState({ - isNyPeriodeFormOpen: false, - showModalSlettPeriode: false, - periodeSlett: undefined, - }); - +export const PeriodeTabell = ({ readOnly }: OwnProps) => { + const { + watch, + setValue, + formState: { isSubmitting }, + resetField, + } = useFormContext(); + const { perioder, arbeidsgivere } = watch(); + const [isNyPeriodeFormOpen, setIsNyPeriodeFormOpen] = useState(false); + const [showModalSlettPeriode, setShowModalSlettPeriode] = useState(false); + const [periodeSlett, setPeriodeSlett] = useState(undefined); + + const hasOpenForm = perioder.some(periode => periode.openForm === true); const newPeriodeResetCallback = useCallback(() => { - formReset(`${behandlingFormPrefix}.nyPeriodeForm`); - setState(state => ({ ...state, isNyPeriodeFormOpen: !state.isNyPeriodeFormOpen })); + resetField('nyPeriodeForm', { defaultValue: { fom: '', tom: '', andeler: [] } }); + setIsNyPeriodeFormOpen(state => !state); }, []); const hideModal = useCallback(() => { - setState(state => ({ - ...state, - showModalSlettPeriode: false, - })); + setShowModalSlettPeriode(false); }, []); const newPeriodeCallback = useCallback( - (nyPeriode: any) => { - const newPerioder = perioder.concat(nyPeriode).sort((a: any, b: any) => a.fom.localeCompare(b.fom)); - - formChange(`${behandlingFormPrefix}.${FORM_NAME}`, 'perioder', newPerioder); - - setState(state => ({ ...state, isNyPeriodeFormOpen: !state.isNyPeriodeFormOpen })); + (nyPeriode: BeriketBeregningsresultatPeriode) => { + const newPerioder = perioder.concat(nyPeriode).sort((a, b) => a.fom.localeCompare(b.fom)); + setValue('perioder', newPerioder); + setIsNyPeriodeFormOpen(state => !state); }, [perioder], ); const newArbeidsgiverCallback = useCallback( - (nyArbeidsgivere: any) => { - formChange(`${behandlingFormPrefix}.${FORM_NAME}`, 'arbeidsgivere', { + (nyArbeidsgivere: NyArbeidsgiverFormState) => { + setValue('arbeidsgivere', { ...(arbeidsgivere || {}), - [nyArbeidsgivere.orgNr]: { identifikator: nyArbeidsgivere.orgNr, navn: nyArbeidsgivere.navn }, + [nyArbeidsgivere.orgNr]: { + identifikator: nyArbeidsgivere.orgNr, + navn: nyArbeidsgivere.navn, + erPrivatPerson: nyArbeidsgivere.erPrivatPerson, + arbeidsforholdreferanser: nyArbeidsgivere.arbeidsforholdreferanser, + }, + }); + resetField('nyArbeidsgiverForm', { + defaultValue: { + navn: '', + orgNr: '', + erPrivatPerson: false, + arbeidsforholdreferanser: [], + identifikator: '', + }, }); - formReset(`${behandlingFormPrefix}.nyArbeidsgiverForm`); }, [arbeidsgivere], ); const openSlettPeriodeModalCallback = useCallback( (id: string) => { - setState(state => ({ - ...state, - showModalSlettPeriode: !state.showModalSlettPeriode, - periodeSlett: perioder.find((periode: any) => periode.id === id), - })); - }, - [perioder], - ); - - const removePeriode = useCallback( - (values: any) => { - const hasOriginalPeriode = initialValues.perioder.find((p: any) => p.id === periodeSlett?.id); - - if (hasOriginalPeriode) { - formChange( - `${behandlingFormPrefix}.${FORM_NAME}`, - 'slettedePerioder', - slettedePerioder.concat([ - { - ...(periodeSlett || {}), - begrunnelse: values.begrunnelse, - }, - ]), - ); - } - - formChange( - `${behandlingFormPrefix}.${FORM_NAME}`, - 'perioder', - perioder.filter((periode: any) => periode.id !== periodeSlett?.id), - ); - - hideModal(); - }, - [initialValues, periodeSlett, perioder], - ); - - const cleaningUpForm = useCallback( - (id: string) => { - formChange( - `${behandlingFormPrefix}.${FORM_NAME}`, - 'perioder', - perioder - .map((periode: any) => { - if (periode.id === id) { - return { - ...periode, - begrunnelse: undefined, - resultat: undefined, - }; - } - return { ...periode }; - }) - .sort((a: any, b: any) => a.fom.localeCompare(b.fom)), - ); + setShowModalSlettPeriode(state => !state); + setPeriodeSlett(perioder.find(periode => periode.id === id)); }, [perioder], ); - const editPeriode = useCallback( - (id: string) => { - const newPerioder = createNewPerioder(perioder, id, { openForm: true }); - - formChange(`${behandlingFormPrefix}.${FORM_NAME}`, 'perioder', newPerioder); - }, - [perioder], - ); + const removePeriode = useCallback(() => { + setValue( + 'perioder', + perioder.filter(periode => periode.id !== periodeSlett?.id), + ); - const cancelEditPeriode = useCallback( - (id: string) => { - const newPerioder = createNewPerioder(perioder, id, { openForm: false }); + hideModal(); + }, [periodeSlett, perioder]); - formChange(`${behandlingFormPrefix}.${FORM_NAME}`, 'perioder', newPerioder); - }, - [perioder], - ); + const isAnyFormOpen = useCallback(() => perioder.some(p => p.openForm), [perioder]); - const updatePeriode = useCallback( - ({ id, begrunnelse, nyFom, nyTom }: any) => { - const updatedPeriode = perioder.find((p: any) => p.id === id); - const newPerioder = createNewPerioder(perioder, id, { - id, - tom: nyTom || updatedPeriode.tom, - fom: nyFom || updatedPeriode.fom, - begrunnelse, - openForm: !updatedPeriode.openForm, - isFromSøknad: updatedPeriode.isFromSøknad, - updated: true, - }); - - formChange( - `${behandlingFormPrefix}.${FORM_NAME}`, - 'perioder', - newPerioder.sort((a, b) => a.fom.localeCompare(b.fom)), - ); - }, - [perioder], - ); - - const isAnyFormOpen = useCallback(() => perioder.some((p: any) => p.openForm), [perioder]); - - const disableButtons = submitting || openForms || isNyPeriodeFormOpen || readOnly; + const disableButtons = isSubmitting || hasOpenForm || isNyPeriodeFormOpen || readOnly; return ( <> - - @@ -250,7 +114,7 @@ export const PeriodeTabell = ({ onClick={newPeriodeResetCallback} disabled={disableButtons} > - + Legg til ny periode @@ -262,9 +126,6 @@ export const PeriodeTabell = ({ newPeriodeCallback={newPeriodeCallback} newArbeidsgiverCallback={newArbeidsgiverCallback} newPeriodeResetCallback={newPeriodeResetCallback} - behandlingId={behandlingId} - behandlingVersjon={behandlingVersjon} - alleKodeverk={alleKodeverk} arbeidsgivere={arbeidsgivere} readOnly={readOnly} /> @@ -282,37 +143,4 @@ export const PeriodeTabell = ({ ); }; -const getSlettedePerioder = (state: any, behandlingId: number, behandlingVersjon: number) => - behandlingFormValueSelector(FORM_NAME, behandlingId, behandlingVersjon)(state, 'slettedePerioder'); -const getPerioder = (state: any, behandlingId: number, behandlingVersjon: number) => - behandlingFormValueSelector(FORM_NAME, behandlingId, behandlingVersjon)(state, 'perioder'); -const getArbeidsgivere = (state: any, behandlingId: number, behandlingVersjon: number) => - behandlingFormValueSelector(FORM_NAME, behandlingId, behandlingVersjon)(state, 'arbeidsgivere'); - -const mapStateToProps = (state: any, props: PureOwnProps) => { - const { behandlingId, behandlingVersjon } = props; - const behandlingFormPrefix = getBehandlingFormPrefix(behandlingId, behandlingVersjon); - - const perioder = getPerioder(state, behandlingId, behandlingVersjon) || []; - - return { - behandlingFormPrefix, - openForms: !!perioder.find(periode => periode.openForm === true), - initialValues: getFormInitialValues(`${behandlingFormPrefix}.${FORM_NAME}`)(state), - slettedePerioder: getSlettedePerioder(state, behandlingId, behandlingVersjon) || [], - perioder, - arbeidsgivere: getArbeidsgivere(state, behandlingId, behandlingVersjon) || {}, - }; -}; - -const mapDispatchToProps = (dispatch: any) => ({ - ...bindActionCreators( - { - reduxFormChange, - reduxFormReset, - }, - dispatch, - ), -}); - -export default connect(mapStateToProps, mapDispatchToProps)(PeriodeTabell); +export default PeriodeTabell; diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/SlettPeriodeModal.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/SlettPeriodeModal.tsx index de39204490..a36f2721e6 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/SlettPeriodeModal.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/SlettPeriodeModal.tsx @@ -1,40 +1,28 @@ import innvilgetImageUrl from '@fpsak-frontend/assets/images/innvilget_valgt.svg'; import { FlexColumn, FlexContainer, FlexRow, Image, VerticalSpacer } from '@fpsak-frontend/shared-components'; -import { DDMMYYYY_DATE_FORMAT } from '@fpsak-frontend/utils'; import { BodyShort, Button, Modal } from '@navikt/ds-react'; -import moment from 'moment'; -import React from 'react'; -import { FormattedMessage, useIntl } from 'react-intl'; +import { BeriketBeregningsresultatPeriode } from './FormState'; import styles from './periode.module.css'; interface OwnProps { showModal?: boolean; - periode: any; - closeEvent: (...args: any[]) => any; - cancelEvent: (...args: any[]) => any; + periode: BeriketBeregningsresultatPeriode; + closeEvent: () => void; + cancelEvent: () => void; } -export const SlettPeriodeModal = ({ showModal = false, periode, closeEvent, cancelEvent }: OwnProps) => { - const intl = useIntl(); - - const fom = moment(periode.fom).format(DDMMYYYY_DATE_FORMAT); - const tom = moment(periode.tom).format(DDMMYYYY_DATE_FORMAT); - +const SlettPeriodeModal = ({ showModal = false, closeEvent, cancelEvent }: OwnProps) => { return ( - + - {intl.formatMessage({ + Ok - + Perioden vil bli slettet @@ -42,11 +30,11 @@ export const SlettPeriodeModal = ({ showModal = false, periode, closeEvent, canc - - diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/TilkjentYtelseForm.tsx b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/TilkjentYtelseForm.tsx index 931397e4fe..9ca52295be 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/TilkjentYtelseForm.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/TilkjentYtelseForm.tsx @@ -1,176 +1,85 @@ -import { behandlingForm, getBehandlingFormPrefix } from '@fpsak-frontend/form'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import { AksjonspunktHelpText, VerticalSpacer } from '@fpsak-frontend/shared-components'; import { guid } from '@fpsak-frontend/utils'; -import { - Aksjonspunkt, - ArbeidsgiverOpplysningerPerId, - BeregningsresultatUtbetalt, - Kodeverk, - KodeverkMedNavn, -} from '@k9-sak-web/types'; -import moment from 'moment'; -import React from 'react'; -import { FormattedMessage } from 'react-intl'; -import { connect } from 'react-redux'; -import { InjectedFormProps } from 'redux-form'; -import { createSelector } from 'reselect'; +import { KodeverkType } from '@k9-sak-web/lib/kodeverk/types.js'; +import { ArbeidsgiverOpplysningerPerId } from '@k9-sak-web/types'; +import { Form } from '@navikt/ft-form-hooks'; +import { AksjonspunktDto, BeregningsresultatMedUtbetaltePeriodeDto } from '@navikt/k9-sak-typescript-client'; +import { useForm } from 'react-hook-form'; +import { TilkjentYtelseFormState } from './FormState'; import PeriodeTabell from './PeriodeTabell'; interface OwnProps { readOnly: boolean; readOnlySubmitButton: boolean; - behandlingFormPrefix: string; - submitting: boolean; - aksjonspunkter: Aksjonspunkt[]; - behandlingId: number; - behandlingVersjon: number; - alleKodeverk: { [key: string]: KodeverkMedNavn[] }; - behandlingStatus: Kodeverk; + aksjonspunkter: AksjonspunktDto[]; arbeidsgiverOpplysningerPerId: ArbeidsgiverOpplysningerPerId; - vilkarForSykdomExists: boolean; - beregningsresultat: BeregningsresultatUtbetalt[]; + beregningsresultat: BeregningsresultatMedUtbetaltePeriodeDto; submitCallback: (...args: any[]) => any; + kodeverkNavnFraKode: (kode: string, kodeverkType: KodeverkType) => string; } -const FORM_NAME = 'TilkjentYtelseForm'; - export const TilkjentYtelseForm = ({ readOnly, readOnlySubmitButton, aksjonspunkter, - behandlingId, - behandlingVersjon, - alleKodeverk, - ...formProps -}: Partial & InjectedFormProps) => ( - <> - {aksjonspunkter.length > 0 && ( - <> - - - {[ - , - ]} - - - - )} - -
- {formProps.warning && {formProps.warning}} - - {formProps.error && {formProps.error}} - - -); - -export const sjekkOverlappendePerioder = (index: number, nestePeriode: any, forrigePeriode: any) => - index !== 0 && moment(nestePeriode.fom) <= moment(forrigePeriode.tom); - -const validateForm = (values: any) => { - // NOSONAR må ha disse sjekkene - const errors = {}; - if (!values.perioder) { - return errors; - } - - if (values.perioder.length === 0) { - return { - perioder: { - _error: , - }, - }; - } + beregningsresultat, + arbeidsgiverOpplysningerPerId, + submitCallback, +}: OwnProps) => { + const handleSubmit = formState => { + submitCallback(transformValues(formState)); + }; - values.perioder.forEach((periode: any, index: number) => { - const forrigePeriode = values.perioder[index - 1]; - const nestePeriode = periode; + const buildInitialValues = (): TilkjentYtelseFormState => ({ + arbeidsgivere: arbeidsgiverOpplysningerPerId, + perioder: + beregningsresultat?.perioder.map(periode => ({ + ...periode, + id: guid(), + openForm: false, + })) ?? [], + nyArbeidsgiverForm: { + navn: '', + orgNr: '', + erPrivatPerson: false, + arbeidsforholdreferanser: [], + identifikator: '', + }, + nyPeriodeForm: { fom: null, tom: null, andeler: [] }, + }); - if (sjekkOverlappendePerioder(index, nestePeriode, forrigePeriode)) { - return { - perioder: { - _error: , - }, - }; - } - return {}; + const formMethods = useForm({ + defaultValues: buildInitialValues(), }); - return errors; + return ( + <> + {aksjonspunkter.length > 0 && ( + <> + + + {['Manuell tilkjent ytelse']} + + + + )} + +
+ + + + ); }; -const buildInitialValues = createSelector( - [ - // @ts-expect-error Migrert frå ts-ignore, uvisst kvifor denne trengs - (props: OwnProps) => props.beregningsresultat?.perioder, - (props: OwnProps) => props.arbeidsgiverOpplysningerPerId, - ], - (perioder = [], arbeidsgiverOpplysningerPerId = {}) => { - if (perioder) { - return { - arbeidsgivere: arbeidsgiverOpplysningerPerId, - perioder: perioder.map((periode: any) => ({ - ...periode, - id: guid(), - openForm: false, - // updated: false, - })), - }; - } - - return { - arbeidsgivere: arbeidsgiverOpplysningerPerId, - perioder, - }; - }, -); - -export const transformValues = (values: any) => [ +export const transformValues = (values: TilkjentYtelseFormState) => [ { kode: aksjonspunktCodes.MANUELL_TILKJENT_YTELSE, tilkjentYtelse: { perioder: values.perioder, }, - // begrunnelse: '', + begrunnelse: '', }, ]; -const lagSubmitFn = createSelector( - [(ownProps: OwnProps) => ownProps.submitCallback, buildInitialValues], - submitCallback => (values: any) => submitCallback(transformValues(values)), -); - -const mapStateToPropsFactory = (_initialState: any, props: OwnProps) => { - const initialValues = buildInitialValues(props); - const { behandlingId, behandlingVersjon } = props; - - const validate = (values: any) => validateForm(values); - - return (_state, ownProps) => { - const behandlingFormPrefix = getBehandlingFormPrefix(behandlingId, behandlingVersjon); - return { - initialValues, - behandlingFormPrefix, - validate, - onSubmit: lagSubmitFn(ownProps), - }; - }; -}; - -export default connect(mapStateToPropsFactory)( - behandlingForm({ - form: FORM_NAME, - enableReinitialize: true, - })(TilkjentYtelseForm), -); +export default TilkjentYtelseForm; diff --git a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/periode.module.css b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/periode.module.css index f29c2d4ee3..2b9f23b851 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/periode.module.css +++ b/packages/prosess-tilkjent-ytelse/src/components/manuellePerioder/periode.module.css @@ -90,3 +90,38 @@ button.button { padding-left: 36px; padding-right: 36px; } + +.buttonRemove { + background: var(--a-white) url('@fpsak-frontend/assets/images/remove.svg') no-repeat; + background-size: 100% 100%; + border: 0; + cursor: pointer; + display: inline-block; + height: 17px; + margin-top: 20px; + padding: 0; + vertical-align: top; + width: 17px; +} + +.buttonAdd { + background: var(--a-white) url('@fpsak-frontend/assets/images/add-circle.svg') no-repeat; + background-size: contain; + border: 0; + cursor: pointer; + display: inline-block; + height: 23px; + padding-left: 7px; + width: 100px; +} + +.addCircleIcon, +.imageText { + display: inline-block; + margin-right: 1ex; + vertical-align: text-bottom; +} + +.addPeriode { + cursor: pointer; +} diff --git a/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.spec.tsx b/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.spec.tsx index be22ad9103..60777593ad 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.spec.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.spec.tsx @@ -1,38 +1,25 @@ import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; -import { reduxFormPropsMock } from '@fpsak-frontend/utils-test/redux-form-test-helper'; -import { renderWithIntlAndReduxForm } from '@fpsak-frontend/utils-test/test-utils'; -import { Aksjonspunkt } from '@k9-sak-web/types'; -import { screen } from '@testing-library/react'; -import React from 'react'; -import { intlMock } from '../../../i18n'; -import messages from '../../../i18n/nb_NO.json'; -import { Tilbaketrekkpanel as UnwrappedForm, buildInitialValues, transformValues } from './Tilbaketrekkpanel'; +import { AksjonspunktDto, BeregningsresultatMedUtbetaltePeriodeDto } from '@navikt/k9-sak-typescript-client'; +import { render, screen } from '@testing-library/react'; +import { Tilbaketrekkpanel, buildInitialValues, transformValues } from './Tilbaketrekkpanel'; -const lagAksjonspunktTilbaketrekk = begrunnelse => - ({ - definisjon: { - kode: aksjonspunktCodes.VURDER_TILBAKETREKK, - }, - status: { - kode: 'OPPR', - }, - begrunnelse, - }) as Aksjonspunkt; +const lagAksjonspunktTilbaketrekk = (begrunnelse: string): AksjonspunktDto => ({ + definisjon: '5090', + status: 'OPPR', + begrunnelse, + kanLoses: false, + erAktivt: false, +}); describe('', () => { it('skal teste at komponent vises korrekt', () => { - renderWithIntlAndReduxForm( - , - { messages }, ); expect(screen.getAllByRole('radio').length).toBe(2); @@ -48,7 +35,7 @@ describe('', () => { it('skal teste at komponent bygger korrekte initial values dersom alle data mangler', () => { const expectedInitialValues = undefined; - const actualInitialValues = buildInitialValues.resultFunc({}, {}); + const actualInitialValues = buildInitialValues(); expect(actualInitialValues).toEqual(expectedInitialValues); }); @@ -60,7 +47,10 @@ describe('', () => { const tilkjentYtelse = { skalHindreTilbaketrekk: null, }; - const actualInitialValues = buildInitialValues.resultFunc(ownProps, tilkjentYtelse); + const actualInitialValues = buildInitialValues( + ownProps.vurderTilbaketrekkAP, + tilkjentYtelse as BeregningsresultatMedUtbetaltePeriodeDto, + ); expect(actualInitialValues).toEqual(expectedInitialValues); }); @@ -75,7 +65,10 @@ describe('', () => { const tilkjentYtelse = { skalHindreTilbaketrekk: false, }; - const actualInitialValues = buildInitialValues.resultFunc(ownProps.vurderTilbaketrekkAP, tilkjentYtelse); + const actualInitialValues = buildInitialValues( + ownProps.vurderTilbaketrekkAP, + tilkjentYtelse as BeregningsresultatMedUtbetaltePeriodeDto, + ); expect(actualInitialValues).toEqual(expectedInitialValues); }); @@ -90,7 +83,10 @@ describe('', () => { const tilkjentYtelse = { skalHindreTilbaketrekk: true, }; - const actualInitialValues = buildInitialValues.resultFunc(ownProps.vurderTilbaketrekkAP, tilkjentYtelse); + const actualInitialValues = buildInitialValues( + ownProps.vurderTilbaketrekkAP, + tilkjentYtelse as BeregningsresultatMedUtbetaltePeriodeDto, + ); expect(actualInitialValues).toEqual(expectedInitialValues); }); diff --git a/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.tsx b/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.tsx index a13f15dd1c..f0292c3066 100644 --- a/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.tsx +++ b/packages/prosess-tilkjent-ytelse/src/components/tilbaketrekk/Tilbaketrekkpanel.tsx @@ -1,168 +1,160 @@ import behandleImageURL from '@fpsak-frontend/assets/images/advarsel.svg'; -import { - RadioGroupField, - TextAreaField, - behandlingForm, - hasBehandlingFormErrorsOfType, - isBehandlingFormDirty, - isBehandlingFormSubmitting, -} from '@fpsak-frontend/form'; import aksjonspunktCodes from '@fpsak-frontend/kodeverk/src/aksjonspunktCodes'; import { isAksjonspunktOpen } from '@fpsak-frontend/kodeverk/src/aksjonspunktStatus'; import { FlexColumn, FlexContainer, FlexRow, Image, VerticalSpacer } from '@fpsak-frontend/shared-components'; -import { hasValidText, maxLength, minLength, required } from '@fpsak-frontend/utils'; -import { ProsessStegSubmitButton } from '@k9-sak-web/prosess-felles'; -import { Aksjonspunkt, BeregningsresultatFp, BeregningsresultatUtbetalt } from '@k9-sak-web/types'; -import { HGrid, Label } from '@navikt/ds-react'; -import React from 'react'; -import { FormattedMessage, WrappedComponentProps, injectIntl } from 'react-intl'; -import { connect } from 'react-redux'; -import { InjectedFormProps } from 'redux-form'; -import { createSelector } from 'reselect'; - +import { BeregningsresultatFp } from '@k9-sak-web/types'; +import { Button, HGrid, Label } from '@navikt/ds-react'; +import { Form, RadioGroupPanel, TextAreaField } from '@navikt/ft-form-hooks'; +import { hasValidText, maxLength, minLength, required } from '@navikt/ft-form-validators'; +import { AksjonspunktDto, BeregningsresultatMedUtbetaltePeriodeDto } from '@navikt/k9-sak-typescript-client'; +import { useForm } from 'react-hook-form'; import styles from './tilbaketrekkpanel.module.css'; const radioFieldName = 'radioVurderTilbaketrekk'; const begrunnelseFieldName = 'begrunnelseVurderTilbaketrekk'; -const formName = 'vurderTilbaketrekkForm'; const maxLength1500 = maxLength(1500); const minLength3 = minLength(3); -type FormValues = { +export const transformValues = (values: TilbaketrekkpanelFormState): TransformValues => { + const hindreTilbaketrekk = values[radioFieldName]; + const begrunnelse = values[begrunnelseFieldName]; + return { + kode: aksjonspunktCodes.VURDER_TILBAKETREKK, + begrunnelse, + hindreTilbaketrekk, + }; +}; + +export const buildInitialValues = ( + vurderTilbaketrekkAP?: AksjonspunktDto, + beregningsresultat?: BeregningsresultatFp | BeregningsresultatMedUtbetaltePeriodeDto, +) => { + let tidligereValgt: boolean | undefined = undefined; + if (beregningsresultat && 'skalHindreTilbaketrekk' in beregningsresultat) { + tidligereValgt = beregningsresultat.skalHindreTilbaketrekk; + } + if ( + tidligereValgt === undefined || + tidligereValgt === null || + !vurderTilbaketrekkAP || + !vurderTilbaketrekkAP.begrunnelse + ) { + return undefined; + } + return { + radioVurderTilbaketrekk: tidligereValgt, + begrunnelseVurderTilbaketrekk: vurderTilbaketrekkAP.begrunnelse, + }; +}; + +type TilbaketrekkpanelFormState = { radioVurderTilbaketrekk: boolean; begrunnelseVurderTilbaketrekk: string; }; +type TransformValues = { + kode: string; + begrunnelse: string; + hindreTilbaketrekk: boolean; +}; + interface PureOwnProps { - behandlingId: number; - behandlingVersjon: number; readOnly: boolean; - vurderTilbaketrekkAP?: Aksjonspunkt; - submitCallback: (data: any) => Promise; + vurderTilbaketrekkAP?: AksjonspunktDto; + submitCallback: (data: TransformValues) => Promise; readOnlySubmitButton: boolean; - beregningsresultat?: BeregningsresultatFp | BeregningsresultatUtbetalt; -} - -interface MappedOwnProps { - onSubmit: (formValues: FormValues) => any; - initialValues: FormValues; + beregningsresultat?: BeregningsresultatFp | BeregningsresultatMedUtbetaltePeriodeDto; } export const Tilbaketrekkpanel = ({ - intl, readOnly, vurderTilbaketrekkAP, + beregningsresultat, + submitCallback, readOnlySubmitButton, - behandlingId, - behandlingVersjon, - ...formProps -}: PureOwnProps & WrappedComponentProps & InjectedFormProps) => ( -
-
- - - - {intl.formatMessage({ - - -
- - -
- -
-
- - -
- -
- - , - }, - { - value: true, - label: , - }, - ]} - /> - - - } - validate={[required, maxLength1500, minLength3, hasValidText]} - maxLength={1500} - readOnly={readOnly} - /> - - -
- - -
-
-
-
-); +}: PureOwnProps) => { + const formMethods = useForm({ + defaultValues: buildInitialValues(vurderTilbaketrekkAP, beregningsresultat), + }); -export const transformValues = values => { - const hindreTilbaketrekk = values[radioFieldName]; - const begrunnelse = values[begrunnelseFieldName]; - return { - kode: aksjonspunktCodes.VURDER_TILBAKETREKK, - begrunnelse, - hindreTilbaketrekk, + const handleSubmit = (values: TilbaketrekkpanelFormState) => { + submitCallback(transformValues(values)); }; + return ( +
+
+ + + + Aksjonspunkt + + +
+ + +
+ +
+
+ + +
+ +
+ + + + + + + +
+ + +
+
+
+
+ ); }; -export const buildInitialValues = createSelector( - [(state, ownProps) => ownProps.vurderTilbaketrekkAP, (state, ownProps) => ownProps.beregningsresultat], - (ap, tilkjentYtelse) => { - const tidligereValgt = tilkjentYtelse?.skalHindreTilbaketrekk; - if (tidligereValgt === undefined || tidligereValgt === null || !ap || !ap.begrunnelse) { - return undefined; - } - return { - radioVurderTilbaketrekk: tidligereValgt, - begrunnelseVurderTilbaketrekk: ap.begrunnelse, - }; - }, -); - -const lagSubmitFn = createSelector( - [(ownProps: PureOwnProps) => ownProps.submitCallback], - submitCallback => (values: FormValues) => submitCallback(transformValues(values)), -); - -const mapStateToProps = (state: any, ownProps: PureOwnProps): MappedOwnProps => ({ - onSubmit: lagSubmitFn(ownProps), - initialValues: buildInitialValues(state, ownProps), -}); - -export default connect(mapStateToProps)(behandlingForm({ form: formName })(injectIntl(Tilbaketrekkpanel))); +export default Tilbaketrekkpanel; diff --git a/packages/prosess-uttak-antall-dager-sluttfase/src/AntallDagerLivetsSluttfaseIndex.tsx b/packages/prosess-uttak-antall-dager-sluttfase/src/AntallDagerLivetsSluttfaseIndex.tsx index 3cc06c0dd2..34ac6212a8 100644 --- a/packages/prosess-uttak-antall-dager-sluttfase/src/AntallDagerLivetsSluttfaseIndex.tsx +++ b/packages/prosess-uttak-antall-dager-sluttfase/src/AntallDagerLivetsSluttfaseIndex.tsx @@ -1,8 +1,7 @@ import { VerticalSpacer } from '@fpsak-frontend/shared-components'; -import { visningsdato } from '@fpsak-frontend/utils'; +import { formatDate } from '@fpsak-frontend/utils'; import KvoteInfo from '@k9-sak-web/behandling-pleiepenger-sluttfase/src/types/KvoteInfo'; import Fremdriftslinje from '@k9-sak-web/fremdriftslinje'; -import React from 'react'; import { createIntl, createIntlCache, RawIntlProvider } from 'react-intl'; import messages from '../i18n/nb_NO.json'; @@ -49,7 +48,7 @@ const AntallDagerLivetsSluttfaseIndex = ({ kvoteInfo }: OwnProps) => { {intl.formatMessage( { id: 'Underskrift.SistePleiedag' }, { - sistePleiedag: visningsdato(kvoteInfo.maxDato), + sistePleiedag: formatDate(kvoteInfo.maxDato), b: (...chunks) => {chunks}, }, )} diff --git a/packages/tidslinje/src/components/TimeLineControl.tsx b/packages/tidslinje/src/components/TimeLineControl.tsx index 00a6047e08..2d2c0e63ea 100644 --- a/packages/tidslinje/src/components/TimeLineControl.tsx +++ b/packages/tidslinje/src/components/TimeLineControl.tsx @@ -1,6 +1,5 @@ import { HGrid } from '@navikt/ds-react'; -import React, { MouseEvent, ReactNode } from 'react'; -import { useIntl } from 'react-intl'; +import { MouseEvent, ReactNode } from 'react'; import TimeLineButton from './TimeLineButton'; import styles from './timeLineControl.module.css'; @@ -28,7 +27,6 @@ const TimeLineControl = ({ zoomInCallback, zoomOutCallback, }: TimeLineControlProps) => { - const { formatMessage } = useIntl(); return (
@@ -36,28 +34,16 @@ const TimeLineControl = ({ {children} - - + + - - + +
diff --git a/packages/types/src/beregningsresultatUtbetaltTsType.ts b/packages/types/src/beregningsresultatUtbetaltTsType.ts index a38c65532c..2f9bb39cde 100644 --- a/packages/types/src/beregningsresultatUtbetaltTsType.ts +++ b/packages/types/src/beregningsresultatUtbetaltTsType.ts @@ -21,9 +21,9 @@ export type BeregningsresultatPeriodeAndel = Readonly<{ export type BeregningsresultatPeriode = Readonly<{ fom: string; tom: string; - dagsats: number; + dagsats?: number; andeler?: BeregningsresultatPeriodeAndel[]; - totalUtbetalingsgradFraUttak: number; + totalUtbetalingsgradFraUttak?: number; totalUtbetalingsgradEtterReduksjonVedTilkommetInntekt?: number; }>; diff --git a/packages/utils/index.ts b/packages/utils/index.ts index 9f7e8ce661..b6094239ed 100644 --- a/packages/utils/index.ts +++ b/packages/utils/index.ts @@ -25,7 +25,6 @@ export { TIDENES_ENDE, timeFormat, getRangeOfMonths, - visningsdato, isValidDate, convertHoursToDays, formatereLukketPeriode, diff --git a/packages/utils/src/date-utils/initialize.test.ts b/packages/utils/src/date-utils/initialize.test.ts new file mode 100644 index 0000000000..09a009d1de --- /dev/null +++ b/packages/utils/src/date-utils/initialize.test.ts @@ -0,0 +1,43 @@ +import dayjs from 'dayjs'; +import { describe, expect, it } from 'vitest'; +import initializeDate, { dateToday } from './initialize'; + +describe('initializeDate', () => { + it('should initialize date with default format and start of day', () => { + const dateString = '2023-10-05'; + const result = initializeDate(dateString); + expect(result.isSame(dayjs(dateString).utc(true).startOf('day'))).toBe(true); + }); + + it('should initialize date with custom format and start of day', () => { + const dateString = '05.10.2023'; + const customFormat = 'DD.MM.YYYY'; + const result = initializeDate(dateString, customFormat); + expect(result.isSame(dayjs(dateString, customFormat).utc(true).startOf('day'))).toBe(true); + }); + + it('should initialize date with strict parsing', () => { + const dateString = '2023-10-05'; + const result = initializeDate(dateString, undefined, true); + expect(result.isValid()).toBe(true); + }); + + it('should initialize date and keep hours and minutes', () => { + const dateString = '2023-10-05T15:30:00Z'; + const result = initializeDate(dateString, undefined, false, true); + expect(result.isSame(dayjs(dateString).utc(true))).toBe(true); + }); + + it('should return invalid date for incorrect format with strict parsing', () => { + const dateString = '05-10-2023'; + const result = initializeDate(dateString, undefined, true); + expect(result.isValid()).toBe(false); + }); +}); + +describe('dateToday', () => { + it("should return today's date at start of day", () => { + const result = dateToday(); + expect(result.isSame(dayjs().utc(true).startOf('day'))).toBe(true); + }); +}); diff --git a/packages/utils/src/date-utils/initialize.ts b/packages/utils/src/date-utils/initialize.ts index 5b8ee81500..84cc83b94d 100644 --- a/packages/utils/src/date-utils/initialize.ts +++ b/packages/utils/src/date-utils/initialize.ts @@ -1,14 +1,26 @@ import dayjs, { Dayjs } from 'dayjs'; import customParseFormat from 'dayjs/plugin/customParseFormat'; +import isoWeek from 'dayjs/plugin/isoWeek'; import utc from 'dayjs/plugin/utc'; dayjs.extend(customParseFormat); dayjs.extend(utc); +dayjs.extend(isoWeek); const supportedFormats = ['YYYY-MM-DD', 'DD.MM.YYYY']; -export default function initializeDate(date: string | Dayjs) { - return dayjs(date, supportedFormats).utc(true).startOf('day'); +export default function initializeDate( + date: string | Dayjs, + customFormat?: string, + strict?: boolean, + keepHoursAndMinutes?: boolean, +) { + if (keepHoursAndMinutes) { + return dayjs(date).utc(true); + } + return dayjs(date, customFormat || supportedFormats, strict) + .utc(true) + .startOf('day'); } export const dateToday = () => dayjs().utc(true).startOf('day'); diff --git a/packages/utils/src/dateUtils.spec.ts b/packages/utils/src/dateUtils.spec.ts index 3e24da018c..a4e9e0db74 100644 --- a/packages/utils/src/dateUtils.spec.ts +++ b/packages/utils/src/dateUtils.spec.ts @@ -1,104 +1,120 @@ +import dayjs from 'dayjs'; +import { describe, expect, it } from 'vitest'; import { + TIDENES_ENDE, addDaysToDate, + calcDays, calcDaysAndWeeks, calcDaysAndWeeksWithWeekends, + convertHoursToDays, dateFormat, findDifferenceInMonthsAndDays, + formatereLukketPeriode, + getRangeOfMonths, + isValidDate, splitWeeksAndDays, timeFormat, - visningsdato, } from './dateUtils'; -describe('dateutils', () => { - describe('calcDaysAndWeeksWithWeekends', () => { - it('Skal kalkulere antall dager mellom to datoer inkludert helger og skrive det ut som uker og dager', () => { - const fom = '2018-04-17'; - const tom = '2018-06-02'; - const formatedMessage = { - id: 'UttakInfoPanel.AntallFlereDagerOgFlereUker', - weeks: 6, - days: 5, - }; - expect(calcDaysAndWeeksWithWeekends(fom, tom)).toEqual(formatedMessage); - }); +describe('dateUtils', () => { + it('Skal kalkulere antall dager mellom to datoer inkludert helger og skrive det ut som uker og dager', () => { + const fom = '2018-04-17'; + const tom = '2018-06-02'; + const message = '6 uker 5 dager'; + expect(calcDaysAndWeeksWithWeekends(fom, tom)).toEqual(message); }); - describe('calcDaysAndWeeks', () => { - it('Skal kalkulere antall dager mellom to datoer uten helger og skrive det ut som uker og dager', () => { - const fom = '2018-04-17'; - const tom = '2018-06-02'; - const formatedMessage = { - id: 'UttakInfoPanel.AntallFlereDagerOgFlereUker', - weeks: 6, - days: 4, - }; - expect(calcDaysAndWeeks(fom, tom)).toEqual(formatedMessage); - }); + it('Skal kalkulere antall dager mellom to datoer uten helger og skrive det ut som uker og dager', () => { + const fom = '2018-04-17'; + const tom = '2018-06-02'; + const message = '6 uker 4 dager'; + expect(calcDaysAndWeeks(fom, tom)).toEqual(message); }); - describe('splitWeeksAndDays', () => { - it('Skal kalkulere antall dager mellom to datoer inkludert helger og skrive det ut som uker og dager', () => { - const days = 33; - const weeks = 2; - expect(splitWeeksAndDays(weeks, days)).toEqual([ - { weeks: 4, days: 1 }, - { weeks: 4, days: 2 }, - ]); - }); + it('Skal splitte et sett med uker og dager i to', () => { + const days = 33; + const weeks = 2; + expect(splitWeeksAndDays(weeks, days)).toEqual([ + { weeks: 4, days: 1 }, + { weeks: 4, days: 2 }, + ]); + }); + it('Skal formatere en dato til ISO', () => { + const dateTime = '2017-08-02T01:54:25.455'; + expect(dateFormat(dateTime)).toEqual('02.08.2017'); }); - describe('dateFormat', () => { - it('Skal formatere en dato til ISO', () => { - const dateTime = '2017-08-02T01:54:25.455'; - expect(dateFormat(dateTime)).toEqual('02.08.2017'); - }); + it('Skal formatere et dato til å vise kun klokkeslett', () => { + const dateTime = '2017-08-02T01:54:25.455'; + expect(timeFormat(dateTime)).toEqual('01:54'); }); - describe('timeFormat', () => { - it('Skal formatere et dato til å vise kun klokkeslett', () => { - const dateTime = '2017-08-02T01:54:25.455'; - expect(timeFormat(dateTime)).toEqual('01:54'); - }); + it('Skal legge til dager på et timestamp og returnere dato', () => { + const dateTime = '2017-08-02T01:54:25.455'; + const daysToAdd = 6; + expect(addDaysToDate(dateTime, daysToAdd)).toEqual('2017-08-08'); + expect(addDaysToDate(TIDENES_ENDE, 10)).toBe(TIDENES_ENDE); }); - describe('addDaysToDate', () => { - it('Skal legge til dager på et timestamp og returnere dato', () => { - const dateTime = '2017-08-02T01:54:25.455'; - const daysToAdd = 6; - expect(addDaysToDate(dateTime, daysToAdd)).toEqual('2017-08-08'); + it('skal vise at perioden mellom to datoer er på 5 måneder og 0 dager', () => { + const fomDate = '2017-12-01'; + const tomDate = '2018-04-30'; + expect(findDifferenceInMonthsAndDays(fomDate, tomDate)).toEqual({ + months: 5, + days: 0, }); }); - describe('findDifferenceInMonthsAndDays', () => { - it('skal vise at perioden mellom to datoer er på 5 måneder og 0 dager', () => { - const fomDate = '2017-12-01'; - const tomDate = '2018-04-30'; - expect(findDifferenceInMonthsAndDays(fomDate, tomDate)).toEqual({ - months: 5, - days: 0, - }); + it('skal vise at perioden mellom to datoer er på 11 dager', () => { + const fomDate = '2018-04-20'; + const tomDate = '2018-04-30'; + expect(findDifferenceInMonthsAndDays(fomDate, tomDate)).toEqual({ + months: 0, + days: 11, }); + }); - it('skal vise at perioden mellom to datoer er på 11 dager', () => { - const fomDate = '2018-04-20'; - const tomDate = '2018-04-30'; - expect(findDifferenceInMonthsAndDays(fomDate, tomDate)).toEqual({ - months: 0, - days: 11, - }); - }); + it('skal returnere undefined når periode ikke er gyldig fordi fomDato er etter tomDato', () => { + const fomDate = '2018-04-30'; + const tomDate = '2018-04-10'; + expect(findDifferenceInMonthsAndDays(fomDate, tomDate)).toBeUndefined(); + }); - it('skal returnere undefined når periode ikke er gyldig fordi fomDato er etter tomDato', () => { - const fomDate = '2018-04-30'; - const tomDate = '2018-04-10'; - expect(findDifferenceInMonthsAndDays(fomDate, tomDate)).toBeUndefined(); - }); + it('skal kalkulere dager uten å regne med helger', () => { + const start = dayjs('2023-01-01'); + const end = dayjs('2023-01-10'); + expect(calcDays(start, end)).toBe(7); }); - describe('visningsdato', () => { - it('formaterer en ISO-dato til visningsdato', () => { - const isoDato = '2020-11-25'; - expect(visningsdato(isoDato)).toEqual('25.11.2020'); - }); + it('skal kalkulere dager inkludert helger', () => { + const start = dayjs('2023-01-01'); + const end = dayjs('2023-01-10'); + expect(calcDays(start, end, false)).toBe(10); + }); + + it('skal konvertere timer til dager og timer', () => { + expect(convertHoursToDays(15)).toEqual({ days: 2, hours: 0 }); + expect(convertHoursToDays(16)).toEqual({ days: 2, hours: 1 }); + }); + + it('skal formatere dato korrekt', () => { + expect(dateFormat('2023-01-01')).toBe('01.01.2023'); + }); + + it('skal dele opp en periode i måneder', () => { + expect(getRangeOfMonths('2023-01', '2023-03')).toEqual([ + { month: 'January', year: '23' }, + { month: 'February', year: '23' }, + { month: 'March', year: '23' }, + ]); + }); + + it('skal validere en dato', () => { + expect(isValidDate('2023-01-01')).toBe(true); + expect(isValidDate('invalid-date')).toBe(false); + }); + + it('skal formatere en lukket periode', () => { + expect(formatereLukketPeriode('2023-01-01/2023-01-10')).toBe('01.01.2023 - 10.01.2023'); }); }); diff --git a/packages/utils/src/dateUtils.ts b/packages/utils/src/dateUtils.ts index 5febdbd9cb..11ff25761d 100644 --- a/packages/utils/src/dateUtils.ts +++ b/packages/utils/src/dateUtils.ts @@ -1,67 +1,60 @@ -import moment from 'moment/moment'; +import { Dayjs } from 'dayjs'; import 'moment/locale/nb'; +import initializeDate from './date-utils/initialize'; import { DDMMYYYY_DATE_FORMAT, HHMM_TIME_FORMAT, ISO_DATE_FORMAT, YYYY_MM_FORMAT } from './formats'; export const TIDENES_ENDE = '9999-12-31'; export const TIMER_PER_DAG = 7.5; // TODO Denne funksjonen må ut ifrå utils. Dette er uttakslogikk -const checkDays = (weeks, days) => { - const weeksDaysObj = { - weeks, - days, - }; - - let id = 'UttakInfoPanel.AntallFlereDagerOgFlereUker'; +const checkDays = (weeks: number, days: number): string => { + let tekst = `${weeks} uker ${days} dager`; if (weeks === undefined && days === undefined) { - id = 'UttakInfoPanel.TidenesEnde'; + tekst = 'Antall uker og dager -'; } if (days === 0) { - id = weeks === 1 ? 'UttakInfoPanel.AntallNullDagerOgEnUke' : 'UttakInfoPanel.AntallNullDagerOgFlereUker'; + tekst = weeks === 1 ? `${weeks} uke` : `${weeks} uker`; } if (weeks === 0) { - id = days === 1 ? 'UttakInfoPanel.AntallEnDagOgNullUker' : 'UttakInfoPanel.AntallFlereDagerOgNullUker'; + tekst = days === 1 ? `${days} dag` : `${days} dager`; } if (days === 1) { - id = weeks === 1 ? 'UttakInfoPanel.AntallEnDagOgEnUke' : 'UttakInfoPanel.AntallEnDagOgFlereUker'; + tekst = weeks === 1 ? `${weeks} uke ${days} dag` : `${weeks} uker ${days} dag`; if (weeks === 0) { - id = 'UttakInfoPanel.AntallEnDagOgNullUker'; + tekst = `${days} dag`; } } if (weeks === 1) { - id = 'UttakInfoPanel.AntallFlereDagerOgEnUke'; + tekst = `${weeks} uke ${days} dager`; } - return { - id, - ...weeksDaysObj, - }; + return tekst; }; -export const calcDays = (fraDatoPeriode, tilDatoPeriode, notWeekends = true) => { +export const calcDays = (fraDatoPeriode: Dayjs | string, tilDatoPeriode: Dayjs | string, notWeekends = true) => { if (tilDatoPeriode === TIDENES_ENDE) { return checkDays(undefined, undefined); } - const fraDato = moment(fraDatoPeriode, ISO_DATE_FORMAT); - const tilDato = moment(tilDatoPeriode, ISO_DATE_FORMAT); - let numOfDays; + const fraDato = typeof fraDatoPeriode === 'string' ? initializeDate(fraDatoPeriode, ISO_DATE_FORMAT) : fraDatoPeriode; + const tilDato = typeof tilDatoPeriode === 'string' ? initializeDate(tilDatoPeriode, ISO_DATE_FORMAT) : tilDatoPeriode; + let numOfDays: number; if (notWeekends) { let count = tilDato.diff(fraDato, 'days'); - let date = moment(fraDatoPeriode, ISO_DATE_FORMAT); - numOfDays = date.isoWeekday() !== 6 && date.isoWeekday() !== 7 ? 1 : 0; + let nyFraDato = fraDato.clone(); + numOfDays = fraDato.isoWeekday() !== 6 && fraDato.isoWeekday() !== 7 ? 1 : 0; while (count > 0) { - date = date.add(1, 'days'); + nyFraDato = nyFraDato.add(1, 'days'); - if (date.isoWeekday() !== 6 && date.isoWeekday() !== 7) { + if (nyFraDato.isoWeekday() !== 6 && nyFraDato.isoWeekday() !== 7) { numOfDays += 1; } @@ -75,33 +68,43 @@ export const calcDays = (fraDatoPeriode, tilDatoPeriode, notWeekends = true) => return numOfDays; }; -export const convertHoursToDays = hoursToConvert => { +export const convertHoursToDays = (hoursToConvert: number) => { const days = Math.floor(hoursToConvert / TIMER_PER_DAG); const hours = hoursToConvert % TIMER_PER_DAG; return { days, hours }; }; -export const calcDaysAndWeeks = (fraDatoPeriode, tilDatoPeriode) => { +export const calcDaysAndWeeks = (fraDatoPeriode: string, tilDatoPeriode: string) => { + if (!fraDatoPeriode || !tilDatoPeriode) { + return 'Antall uker og dager -'; + } const numOfDays = calcDays(fraDatoPeriode, tilDatoPeriode); + if (typeof numOfDays === 'string') { + return numOfDays; + } + const weeks = Math.floor(numOfDays / 5); const days = numOfDays % 5; - return checkDays(weeks, days); }; -export const calcDaysAndWeeksWithWeekends = (fraDatoPeriode, tilDatoPeriode) => { +export const calcDaysAndWeeksWithWeekends = (fraDatoPeriode: Dayjs | string, tilDatoPeriode: Dayjs | string) => { const notWeekends = false; const numOfDays = calcDays(fraDatoPeriode, tilDatoPeriode, notWeekends); + if (typeof numOfDays === 'string') { + return numOfDays; + } + const weeks = Math.floor(numOfDays / 7); const days = numOfDays % 7; return checkDays(weeks, days); }; -export const splitWeeksAndDays = (weeks, days) => { +export const splitWeeksAndDays = (weeks: number, days: number) => { const returnArray = []; const allDays = weeks ? weeks * 5 + days : days; const firstPeriodDays = allDays % 2 === 0 ? allDays / 2 : allDays / 2 + 0.5; @@ -112,36 +115,35 @@ export const splitWeeksAndDays = (weeks, days) => { return returnArray; }; -export const dateFormat = date => moment(date).format(DDMMYYYY_DATE_FORMAT); +export const dateFormat = (date: string) => initializeDate(date).format(DDMMYYYY_DATE_FORMAT); -export const timeFormat = date => moment(date).format(HHMM_TIME_FORMAT); +export const timeFormat = (date: string) => initializeDate(date, '', false, true).format(HHMM_TIME_FORMAT); // Skal ikke legge til dag når dato er tidenes ende -export const addDaysToDate = (dateString, nrOfDays) => +export const addDaysToDate = (dateString: string, nrOfDays: number) => dateString === TIDENES_ENDE ? dateString - : moment(dateString, ISO_DATE_FORMAT).add(nrOfDays, 'days').format(ISO_DATE_FORMAT); + : initializeDate(dateString, ISO_DATE_FORMAT).add(nrOfDays, 'days').format(ISO_DATE_FORMAT); -export const findDifferenceInMonthsAndDays = (fomDate, tomDate) => { - const fDate = moment(fomDate, ISO_DATE_FORMAT, true); - const tDate = moment(tomDate, ISO_DATE_FORMAT, true).add(1, 'days'); +export const findDifferenceInMonthsAndDays = (fomDate: string, tomDate: string) => { + const fDate = initializeDate(fomDate, ISO_DATE_FORMAT, true); + const tDate = initializeDate(tomDate, ISO_DATE_FORMAT, true).add(1, 'days'); if (!fDate.isValid() || !tDate.isValid() || fDate.isAfter(tDate)) { return undefined; } const months = tDate.diff(fDate, 'months'); - fDate.add(months, 'months'); + const updatedFDate = fDate.add(months, 'months'); return { months, - days: tDate.diff(fDate, 'days'), + days: tDate.diff(updatedFDate, 'days'), }; }; -export const getRangeOfMonths = (fom, tom) => { - moment.locale('nb'); - const fraMåned = moment(fom, YYYY_MM_FORMAT); - const tilMåned = moment(tom, YYYY_MM_FORMAT); +export const getRangeOfMonths = (fom: string, tom: string) => { + const fraMåned = initializeDate(fom, YYYY_MM_FORMAT); + const tilMåned = initializeDate(tom, YYYY_MM_FORMAT); let currentMonth = fraMåned; const range = [ { @@ -161,10 +163,9 @@ export const getRangeOfMonths = (fom, tom) => { return range; }; -export const isValidDate = date => moment(date, ISO_DATE_FORMAT).isValid(); -export const visningsdato = date => moment(date, ISO_DATE_FORMAT).format(DDMMYYYY_DATE_FORMAT); +export const isValidDate = (date: string) => initializeDate(date, ISO_DATE_FORMAT, true).isValid(); -export const formatDate = (date: string): string => moment(date, ISO_DATE_FORMAT).format(DDMMYYYY_DATE_FORMAT); +export const formatDate = (date: string): string => initializeDate(date, ISO_DATE_FORMAT).format(DDMMYYYY_DATE_FORMAT); // Eksempel på lukket periode fra Årskvantum: 2022-02-07/2022-02-08 export const formatereLukketPeriode = (periode: string): string => {