', () => {
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);
-
+
{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 && (
+
);
- }}
-
-
+ })}
+
+ {!readOnly && (
+
+ )}
+
+
+
{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 (
-
+
-
+
-
+ Perioden vil bli slettet
@@ -42,11 +30,11 @@ export const SlettPeriodeModal = ({ showModal = false, periode, closeEvent, canc
-
- {intl.formatMessage({ id: 'TilkjentYtelse.Ok' })}
+
+ Ok
-
- {intl.formatMessage({ id: 'TilkjentYtelse.Avbryt' })}
+
+ Avbryt
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 && (
- <>
-
-
- {[
- ,
- ]}
-
-
- >
- )}
-
-
- >
-);
-
-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) => (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-);
+}: 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 (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
};
-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 => {