Skip to content

Commit 6c64a17

Browse files
committed
Merge
2 parents 6e549d2 + b6db41f commit 6c64a17

File tree

15 files changed

+135
-58
lines changed

15 files changed

+135
-58
lines changed

package.json

+6-6
Original file line numberDiff line numberDiff line change
@@ -24,13 +24,13 @@
2424
"api:notat": "swagger-typescript-api -p http://localhost:8183/v3/api-docs --extract-enums --axios -n BidragDokumentProduksjonApi.ts -o src/api"
2525
},
2626
"dependencies": {
27-
"@babel/runtime": "^7.26.0",
27+
"@babel/runtime": "^7.27.0",
2828
"react-day-picker": "9.6.4",
2929
"@emotion/react": "11.14.0",
3030
"@grafana/faro-react": "^1.12.2",
3131
"@mdx-js/react": "^3.1.0",
3232
"@navikt/aksel-icons": "7.9.0",
33-
"@navikt/bidrag-ui-common": "^1.10.15",
33+
"@navikt/bidrag-ui-common": "^1.12.0",
3434
"@navikt/ds-css": "7.9.0",
3535
"@navikt/ds-css-internal": "3.4.3",
3636
"@navikt/ds-react": "7.18.0",
@@ -104,17 +104,17 @@
104104
"global-jsdom": "^25.0.0",
105105
"html-webpack-plugin": "^5.6.0",
106106
"ignore-styles": "^5.0.1",
107-
"jsdom": "^25.0.1",
107+
"jsdom": "^26.1.0",
108108
"mini-css-extract-plugin": "^2.9.1",
109109
"mocha": "^10.2.0",
110110
"msw": "1.3.2",
111111
"npm-run-all": "^4.1.5",
112112
"postcss": "^8.4.47",
113113
"postcss-import": "16.1.0",
114114
"postcss-loader": "^8.1.1",
115-
"prettier": "^3.5.0",
115+
"prettier": "^3.5.3",
116116
"process": "^0.11.10",
117-
"react-refresh": "^0.14.2",
117+
"react-refresh": "^0.17.0",
118118
"rehype-slug": "6.0.0",
119119
"sinon": "^19.0.2",
120120
"style-loader": "^3.3.3",
@@ -123,7 +123,7 @@
123123
"ts-node": "^10.9.2",
124124
"typescript": "^5.7.3",
125125
"webpack": "^5.94.0",
126-
"webpack-cli": "^5.1.4",
126+
"webpack-cli": "^6.0.1",
127127
"webpack-dev-server": "^5.0.4",
128128
"webpack-manifest-plugin": "^5.0.0",
129129
"webpack-merge": "^5.10.0"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { Stonadstype } from "@api/BidragBehandlingApiV1";
2+
import { expect } from "chai";
3+
import { describe } from "mocha";
4+
5+
import { getFomForPrivatAvtale } from "../../barnebidrag/components/forms/privatAvtale/PrivatAvtale";
6+
7+
describe("PrivatAvtaleFormHelpers", () => {
8+
it("should set fom limit to 1st of next month after birthday if Stonadstype is BIDRAG", () => {
9+
const fødselsdato = "2019-04-01";
10+
const expected = new Date("2019-05-01");
11+
const fom = getFomForPrivatAvtale(Stonadstype.BIDRAG, fødselsdato);
12+
expect(fom.toLocaleDateString()).equals(expected.toLocaleDateString());
13+
});
14+
15+
it("should set fom limit to 1st of January 2012 if Stonadstype is BIDRAG and fødselsdato is before 2012", () => {
16+
const fødselsdato = "2011-04-01";
17+
const expected = new Date("2012-01-01");
18+
const fom = getFomForPrivatAvtale(Stonadstype.BIDRAG, fødselsdato);
19+
expect(fom.toLocaleDateString()).equals(expected.toLocaleDateString());
20+
});
21+
22+
it("should set fom limit to 1st of next month after 18th birthday if Stonadstype is BIDRAG18AAR", () => {
23+
const fødselsdato = "2002-04-01";
24+
const expected = new Date("2020-05-01");
25+
const fom = getFomForPrivatAvtale(Stonadstype.BIDRAG18AAR, fødselsdato);
26+
expect(fom.toLocaleDateString()).equals(expected.toLocaleDateString());
27+
});
28+
29+
it("should set fom limit to 1st of January 2012 if Stonadstype is BIDRAG18AAR and 18th birthday is before 2012", () => {
30+
const fødselsdato = "1980-04-01";
31+
const expected = new Date("2012-01-01");
32+
const fom = getFomForPrivatAvtale(Stonadstype.BIDRAG18AAR, fødselsdato);
33+
expect(fom.toLocaleDateString()).equals(expected.toLocaleDateString());
34+
});
35+
});

src/__tests__/helpers/virkningstidspunktFormHelpers.spec.tsx

+12-2
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ describe("VirkningstidspunktFormHelpers", () => {
8080
const [fom, tom] = getFomAndTomForMonthPicker(virkningsDato);
8181
expect(fom.toLocaleDateString()).equals(firstDayOfMonth(virkningsDato).toLocaleDateString());
8282
expect(tom.toLocaleDateString()).equals(
83-
lastDayOfMonth(deductMonthsIgnoreday(new Date(), 2)).toLocaleDateString()
83+
lastDayOfMonth(deductMonthsIgnoreday(new Date(), 1)).toLocaleDateString()
8484
);
8585
});
8686

@@ -89,7 +89,17 @@ describe("VirkningstidspunktFormHelpers", () => {
8989
const [fom, tom] = getFomAndTomForMonthPicker(virkningsDato);
9090
expect(fom.toLocaleDateString()).equals(firstDayOfMonth(virkningsDato).toLocaleDateString());
9191
expect(tom.toLocaleDateString()).equals(
92-
lastDayOfMonth(deductMonthsIgnoreday(new Date(), 2)).toLocaleDateString()
92+
lastDayOfMonth(deductMonthsIgnoreday(new Date(), 1)).toLocaleDateString()
93+
);
94+
});
95+
96+
it("getFomAndTomForMonthPicker should set tom to the last day of previous month if opphørsdato is in current month ", () => {
97+
const virkningsDato = addMonthsIgnoreDay(new Date(), 3);
98+
const opphørsdato = new Date();
99+
const [fom, tom] = getFomAndTomForMonthPicker(virkningsDato, opphørsdato);
100+
expect(fom.toLocaleDateString()).equals(firstDayOfMonth(virkningsDato).toLocaleDateString());
101+
expect(tom.toLocaleDateString()).equals(
102+
lastDayOfMonth(deductMonthsIgnoreday(new Date(), 1)).toLocaleDateString()
93103
);
94104
});
95105
});

src/barnebidrag/components/forms/helpers/PrivatAvtaleHelpers.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export const createPrivatAvtaleInitialValues = (privatAvtale: PrivatAvtaleDto):
2929
avtaleId: privatAvtale.id,
3030
skalIndeksreguleres: privatAvtale.skalIndeksreguleres,
3131
avtaleDato: privatAvtale.avtaleDato ?? null,
32-
avtaleType: privatAvtale.avtaleType ?? null,
32+
avtaleType: privatAvtale.avtaleType ?? "",
3333
begrunnelse: privatAvtale.begrunnelse ?? "",
3434
perioder: privatAvtale.perioder.map(transformPrivatAvtalePeriode),
3535
};

src/barnebidrag/components/forms/privatAvtale/PrivatAvtale.tsx

+7-4
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import { useDebounce } from "@common/hooks/useDebounce";
2626
import { TrashIcon } from "@navikt/aksel-icons";
2727
import { ObjectUtils } from "@navikt/bidrag-ui-common";
2828
import { Box, Button, Heading, Tabs } from "@navikt/ds-react";
29-
import { addMonths, firstDayOfMonth } from "@utils/date-utils";
29+
import { addMonths, firstDayOfMonth, isBeforeDate } from "@utils/date-utils";
3030
import React, { useEffect, useMemo, useRef } from "react";
3131
import { FormProvider, useFieldArray, useForm, useFormContext, useWatch } from "react-hook-form";
3232
import { useSearchParams } from "react-router-dom";
@@ -44,10 +44,13 @@ import { BeregnetTabel } from "./BeregnetTabel";
4444
import { Perioder } from "./Perioder";
4545

4646
export const getFomForPrivatAvtale = (stønadstype: Stonadstype, fødselsdato: string) => {
47+
const fomMin = new Date("2012-01-01");
4748
if (stønadstype === Stonadstype.BIDRAG18AAR) {
48-
return getFirstDayOfMonthAfterEighteenYears(new Date(fødselsdato));
49+
const firstMonthAfterEighteenBirthday = getFirstDayOfMonthAfterEighteenYears(new Date(fødselsdato));
50+
return isBeforeDate(firstMonthAfterEighteenBirthday, fomMin) ? fomMin : firstMonthAfterEighteenBirthday;
4951
}
50-
return addMonths(firstDayOfMonth(new Date(fødselsdato)), 1);
52+
const birthMonth = addMonths(firstDayOfMonth(new Date(fødselsdato)), 1);
53+
return isBeforeDate(birthMonth, fomMin) ? fomMin : birthMonth;
5154
};
5255

5356
export const RemoveButton = ({ onDelete }: { onDelete: () => void }) => {
@@ -448,7 +451,7 @@ const PrivatAvtaleForm = () => {
448451
error: !ObjectUtils.isEmpty(useFormMethods.formState.errors),
449452
},
450453
}));
451-
}, [useFormMethods.formState.errors]);
454+
}, [JSON.stringify(useFormMethods.formState.errors)]);
452455

453456
return (
454457
<>

src/barnebidrag/components/forms/virkningstidspunkt/Virkningstidspunkt.tsx

+18-11
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { QueryErrorWrapper } from "@common/components/query-error-boundary/Query
1919
import { SOKNAD_LABELS } from "@common/constants/soknadFraLabels";
2020
import text from "@common/constants/texts";
2121
import { useBehandlingProvider } from "@common/context/BehandlingContext";
22-
import { getFirstDayOfMonthAfterEighteenYears } from "@common/helpers/boforholdFormHelpers";
22+
import { getFirstDayOfMonthAfterEighteenYears, isOver18YearsOld } from "@common/helpers/boforholdFormHelpers";
2323
import {
2424
aarsakToVirkningstidspunktMapper,
2525
getFomAndTomForMonthPicker,
@@ -35,7 +35,6 @@ import React, { useEffect, useMemo, useState } from "react";
3535
import { FormProvider, useForm, useFormContext } from "react-hook-form";
3636

3737
import { CustomTextareaEditor } from "../../../../common/components/CustomEditor";
38-
import useFeatureToogle from "../../../../common/hooks/useFeatureToggle";
3938
import { STEPS } from "../../../constants/steps";
4039
import { BarnebidragStepper } from "../../../enum/BarnebidragStepper";
4140
import { useOnSaveVirkningstidspunkt } from "../../../hooks/useOnSaveVirkningstidspunkt";
@@ -133,8 +132,11 @@ const createPayload = (values: VirkningstidspunktFormValues): OppdatereVirknings
133132
};
134133
};
135134

136-
const getOpphørOptions = (opphør: OpphorsdetaljerRolleDto, stønadstype: Stonadstype) => {
137-
if (stønadstype === Stonadstype.BIDRAG18AAR) {
135+
const getOpphørOptions = (opphør: OpphorsdetaljerRolleDto, stønadstype: Stonadstype, fødselsdato: string) => {
136+
if (
137+
stønadstype === Stonadstype.BIDRAG18AAR ||
138+
(stønadstype === Stonadstype.BIDRAG && isOver18YearsOld(fødselsdato))
139+
) {
138140
if (opphør?.eksisterendeOpphør) {
139141
return [OpphørsVarighet.VELG_OPPHØRSDATO, OpphørsVarighet.FORTSETTE_OPPHØR];
140142
} else {
@@ -213,8 +215,15 @@ const Main = ({ initialValues, previousValues, setPreviousValues, showChangedVir
213215
onSelect={onAarsakSelect}
214216
className="w-max"
215217
>
216-
{erÅrsakAvslagIkkeValgt && <option value="">{text.select.årsakAvslagPlaceholder}</option>}
217-
{!erTypeOpphør && (
218+
{lesemodus && (
219+
<option value={getValues("årsakAvslag")}>
220+
{hentVisningsnavnVedtakstype(getValues("årsakAvslag"), behandling.vedtakstype)}
221+
</option>
222+
)}
223+
{!lesemodus && erÅrsakAvslagIkkeValgt && (
224+
<option value="">{text.select.årsakAvslagPlaceholder}</option>
225+
)}
226+
{!lesemodus && !erTypeOpphør && (
218227
<optgroup label={text.label.årsak}>
219228
{virkningsårsaker
220229
.filter((value) => {
@@ -229,7 +238,7 @@ const Main = ({ initialValues, previousValues, setPreviousValues, showChangedVir
229238
</optgroup>
230239
)}
231240

232-
{er18ÅrsBidrag ? (
241+
{!lesemodus && er18ÅrsBidrag ? (
233242
<optgroup label={erTypeOpphørOrLøpendeBidrag ? text.label.opphør : text.label.avslag}>
234243
{(erTypeOpphørOrLøpendeBidrag ? avslagsListe18ÅrOpphør : avslagsListe18År).map((value) => (
235244
<option key={value} value={value}>
@@ -290,7 +299,6 @@ const Main = ({ initialValues, previousValues, setPreviousValues, showChangedVir
290299
};
291300

292301
const Opphør = ({ initialValues, previousValues, setPreviousValues }) => {
293-
const { isOpphørsdatoEnabled } = useFeatureToogle();
294302
const behandling = useGetBehandlingV2();
295303
//TODO: Dette må tilpasses per barn i V3 av bidrag
296304
const baRolle = behandling.roller.find((rolle) => rolle.rolletype === Rolletype.BA);
@@ -356,7 +364,6 @@ const Opphør = ({ initialValues, previousValues, setPreviousValues }) => {
356364
};
357365

358366
if (behandling.virkningstidspunkt.avslag != null) return null;
359-
if (!isOpphørsdatoEnabled) return null;
360367
return (
361368
<>
362369
{opphør?.eksisterendeOpphør && (
@@ -377,7 +384,7 @@ const Opphør = ({ initialValues, previousValues, setPreviousValues }) => {
377384
className="w-max"
378385
onSelect={(value) => onSelectVarighet(value)}
379386
>
380-
{getOpphørOptions(opphør, behandling.stønadstype).map((value) => (
387+
{getOpphørOptions(opphør, behandling.stønadstype, baRolle.fødselsdato).map((value) => (
381388
<option key={value} value={value}>
382389
{value}
383390
</option>
@@ -454,7 +461,7 @@ const VirkningstidspunktForm = () => {
454461
error: !ObjectUtils.isEmpty(useFormMethods.formState.errors),
455462
},
456463
}));
457-
}, [useFormMethods.formState.errors]);
464+
}, [JSON.stringify(useFormMethods.formState.errors)]);
458465

459466
useEffect(() => {
460467
const subscription = useFormMethods.watch((value, { name, type }) => {

src/common/components/boforhold/Perioder.tsx

+6-5
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
gyldigBostatus18ÅrsBidragSøknadsbarn,
2323
gyldigBostatusOver18År,
2424
isOver18YearsOld,
25+
skalViseOver18Statuser as skalViseOver18BoforholdStatuser,
2526
} from "@common/helpers/boforholdFormHelpers";
2627
import { useGetBehandlingV2 } from "@common/hooks/useApiData";
2728
import { useOnSaveBoforhold } from "@common/hooks/useOnSaveBoforhold";
@@ -119,15 +120,15 @@ const Status = ({
119120
const visningsnavn = hentVisningsnavn(bostsatus);
120121
// Ønsker ikke å vise 18 år prefiks for 18 åring i 18års bidrag
121122
const bosstatus18År = bidrag18ÅrOgSøknadsbarn ? [] : gyldigBostatusOver18År[type];
122-
if (bosstatus18År.includes(bostsatus) && isOver18YearsOld(barn.fødselsdato)) {
123+
if (bosstatus18År.includes(bostsatus) && skalViseOver18BoforholdStatuser(barn)) {
123124
return `18 ${text.år}: ${visningsnavn}`;
124125
}
125126
return visningsnavn;
126127
};
127128

128129
const boforholdStatusOptions = bidrag18ÅrOgSøknadsbarn
129130
? boforholdOptions[type].bidrag18År
130-
: isOver18YearsOld(barn.fødselsdato)
131+
: skalViseOver18BoforholdStatuser(barn)
131132
? boforholdOptions[type].likEllerOver18År
132133
: boforholdOptions[type].under18År;
133134

@@ -200,7 +201,7 @@ export const Perioder = ({ barnIndex }: { barnIndex: number }) => {
200201
},
201202
},
202203
}));
203-
}, [formState.errors, editableRow]);
204+
}, [JSON.stringify(formState.errors), editableRow]);
204205

205206
const onSaveRow = (index: number) => {
206207
const periodeValues = getValues(`husstandsbarn.${barnIndex}.perioder.${index}`);
@@ -218,7 +219,7 @@ export const Perioder = ({ barnIndex }: { barnIndex: number }) => {
218219

219220
const bidrag18ÅrOgSøknadsbarn = behandling.stønadstype === Stonadstype.BIDRAG18AAR && barn.medIBehandling;
220221

221-
if (barnIsOver18) {
222+
if (barnIsOver18 && !barn.medIBehandling) {
222223
const selectedStatusIsOver18 = bidrag18ÅrOgSøknadsbarn
223224
? gyldigBostatus18ÅrsBidragSøknadsbarn[behandling.type]
224225
: gyldigBostatusOver18År[behandling.type].includes(selectedStatus);
@@ -349,7 +350,7 @@ export const Perioder = ({ barnIndex }: { barnIndex: number }) => {
349350
showErrorModal();
350351
} else {
351352
const perioderValues = getValues(`husstandsbarn.${barnIndex}.perioder`);
352-
const bidrag18ÅrOgSøknadsbarn = behandling.stønadstype === Stonadstype.BIDRAG18AAR && barn.medIBehandling;
353+
const bidrag18ÅrOgSøknadsbarn = !skalViseOver18BoforholdStatuser(barn);
353354

354355
barnPerioder.append({
355356
datoFom: null,

src/common/components/boforhold/andrevoksneihusstanden/AndreVoksneIHusstanden.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -215,7 +215,7 @@ export const AndreVoksneIHusstanden = () => {
215215
},
216216
},
217217
}));
218-
}, [formState.errors, editableRow]);
218+
}, [JSON.stringify(formState.errors), editableRow]);
219219

220220
const onSaveRow = (index: number) => {
221221
const periodeValues = getValues(`andreVoksneIHusstanden.${index}`);

src/common/components/inntekt/InntektTable.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,7 @@ export const Periode = ({
180180
defaultValue={item[field]}
181181
fromDate={fom}
182182
customValidation={validateFomOgTom}
183-
toDate={addMonthsIgnoreDay(tom, 1)}
183+
toDate={fieldIsDatoTom || opphørsTomDato ? tom : addMonthsIgnoreDay(tom, 1)}
184184
lastDayOfMonthPicker={fieldIsDatoTom}
185185
required={item.taMed && !fieldIsDatoTom}
186186
hideLabel
@@ -258,7 +258,7 @@ export const InntektTabel = ({
258258
},
259259
},
260260
}));
261-
}, [formState.errors, JSON.stringify(controlledFields)]);
261+
}, [JSON.stringify(formState.errors), JSON.stringify(controlledFields)]);
262262

263263
const handleOnSelect = (taMed: boolean, index: number) => {
264264
const periode = getValues(`${fieldName}.${index}`);

src/common/helpers/boforholdFormHelpers.ts

+3
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,9 @@ export function getFirstDayOfMonthAfterEighteenYears(dateOfBirth: Date): Date {
145145

146146
return eighteenYearsLater;
147147
}
148+
export const skalViseOver18Statuser = (barn: HusstandsmedlemDtoV2): boolean => {
149+
return isOver18YearsOld(barn.fødselsdato) && !barn.medIBehandling;
150+
};
148151
export const isOver18YearsOld = (dateOfBirth: Date | string): boolean => calculateAge(dateOfBirth) >= 18;
149152
export const fillInPeriodGaps = (egneBarnIHusstanden: RelatertPersonGrunnlagDto) => {
150153
const perioder: HusstandOpplysningPeriode[] = [];

src/common/helpers/virkningstidspunktHelpers.ts

+8-5
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,9 @@ import {
44
addMonthsIgnoreDay,
55
dateOrNull,
66
deductMonths,
7-
deductMonthsIgnoreday,
87
firstDayOfMonth,
98
isAfterDate,
10-
isBeforeDate,
9+
isBeforeOrEqualsDate,
1110
minOfDates,
1211
} from "@utils/date-utils";
1312
import { addMonths } from "date-fns";
@@ -42,6 +41,8 @@ export const mapÅrsakTilVirkningstidspunkt = (
4241
: treMaanederTilbakeFraMottatDato;
4342

4443
switch (aarsak) {
44+
case TypeArsakstype.MANEDETTERBETALTFORFALTBIDRAG:
45+
return null;
4546
case TypeArsakstype.FRAMANEDENETTERIPAVENTEAVBIDRAGSSAK:
4647
return firstDayOfMonth(addMonths(mottatOrSoktFraDato, 1));
4748
case TypeArsakstype.FRAMANEDENETTERFYLTE18AR:
@@ -82,11 +83,13 @@ export const getFomAndTomForMonthPicker = (virkningstidspunkt: Date | string, op
8283
const lastDayOfOpphørsdatoMonth = opphørsdato && lastDayOfMonth(deductMonths(firstDayOfMonth(opphørsdato), 1));
8384
const fom = firstDayOfMonth(new Date(virkningstidspunkt));
8485
const tom =
85-
lastDayOfOpphørsdatoMonth && isBeforeDate(lastDayOfOpphørsdatoMonth, lastDayOfPreviousMonth)
86+
lastDayOfOpphørsdatoMonth && isBeforeOrEqualsDate(lastDayOfOpphørsdatoMonth, lastDayOfPreviousMonth)
8687
? lastDayOfOpphørsdatoMonth
87-
: lastDayOfPreviousMonth;
88+
: opphørsdato
89+
? lastDayOfMonth(addMonths(lastDayOfPreviousMonth, 1))
90+
: lastDayOfPreviousMonth;
8891

89-
return [fom, lastDayOfMonth(deductMonthsIgnoreday(tom, 1))];
92+
return [fom, tom];
9093
};
9194

9295
export const getEitherFirstDayOfFoedselsOrVirkingsdatoMonth = (

src/common/hooks/useFeatureToggle.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { useFlag, useUnleashClient } from "@unleash/proxy-client-react";
44
import { useEffect } from "react";
55

66
export default function useFeatureToogle() {
7+
const enhet = new URLSearchParams(window.location.search).get("enhet");
8+
79
const isMockEnabled = process.env.ENABLE_MOCK === "true";
810
const enableFatteVedtak = useFlag("behandling.fattevedtak");
911
const enableAdmin = useFlag("behandling.admin");
@@ -22,6 +24,9 @@ export default function useFeatureToogle() {
2224
useEffect(() => {
2325
client.updateContext({
2426
userId,
27+
properties: {
28+
enhet,
29+
},
2530
});
2631
}, [userId]);
2732

0 commit comments

Comments
 (0)