Skip to content

Commit cc9f1ed

Browse files
Bruker nytt endepunkt for data til arbeid og inntekt
1 parent 84c6cea commit cc9f1ed

File tree

8 files changed

+124
-67
lines changed

8 files changed

+124
-67
lines changed

packages/v2/backend/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@
2222
"dependencies": {
2323
"@navikt/k9-klage-typescript-client": "2.0.20250218125133",
2424
"@navikt/k9-sak-typescript-client": "2.0.20250306092710",
25-
"@navikt/ung-sak-typescript-client": "0.2.20250221104339"
25+
"@navikt/ung-sak-typescript-client": "0.2.20250320091618"
2626
},
2727
"devDependencies": {
2828
"@tanstack/eslint-plugin-query": "^5.68.0"

packages/v2/gui/src/prosess/ung-beregning/ArbeidOgInntekt.tsx

+58-54
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,54 @@
1+
import {
2+
KontrollerInntektPeriodeDtoStatus,
3+
KontrollerInntektPeriodeDtoValg,
4+
type KontrollerInntektDto,
5+
type RapportertInntektDto,
6+
} from '@k9-sak-web/backend/ungsak/generated';
17
import { CheckmarkCircleFillIcon, ExclamationmarkTriangleFillIcon, PersonIcon } from '@navikt/aksel-icons';
28
import { Bleed, BodyLong, Box, Button, Heading, HStack, Table, VStack } from '@navikt/ds-react';
39
import { Form, InputField, RadioGroupPanel, TextAreaField } from '@navikt/ft-form-hooks';
410
import { minLength, required } from '@navikt/ft-form-validators';
511
import { useForm } from 'react-hook-form';
12+
import PeriodLabel from '../../shared/periodLabel/PeriodLabel';
13+
import { formatCurrencyWithKr } from '../../utils/formatters';
614
import styles from './arbeidOgInntekt.module.css';
715

8-
const dummyData = [
9-
{
10-
status: 'Ingen avvik',
11-
arbeidsforhold: 'Bedrift AS',
12-
periode: `${new Date().toLocaleDateString('no')} - ${new Date().toLocaleDateString('no')}`,
13-
rapportertDeltager: '0 kr',
14-
rapportertInntekt: '0 kr',
15-
},
16-
{
17-
status: 'Avvik',
18-
arbeidsforhold: 'Bedrift 2 AS',
19-
periode: `${new Date().toLocaleDateString('no')} - ${new Date().toLocaleDateString('no')}`,
20-
rapportertDeltager: '0 kr',
21-
rapportertInntekt: '0 kr',
22-
},
23-
];
16+
const formaterInntekt = (inntekt: RapportertInntektDto) => {
17+
return formatCurrencyWithKr((inntekt.arbeidsinntekt ?? 0) + (inntekt.ytelse ?? 0));
18+
};
2419

2520
type Formvalues = {
26-
inntektArbeid: string;
27-
inntektYtelse: string;
28-
inntektRadio: 'deltager' | 'a-inntekt' | 'fastsett-belop' | '';
21+
fastsattArbeidsinntekt: string;
22+
fastsattYtelse: string;
23+
inntektRadio: KontrollerInntektPeriodeDtoValg | '';
2924
begrunnelse: string;
3025
};
3126

3227
interface ArbeidOgInntektProps {
3328
submitCallback: (data: unknown) => void;
29+
inntektKontrollperioder: KontrollerInntektDto['kontrollperioder'];
3430
}
3531

36-
export const ArbeidOgInntekt = ({ submitCallback }: ArbeidOgInntektProps) => {
32+
export const ArbeidOgInntekt = ({ submitCallback, inntektKontrollperioder }: ArbeidOgInntektProps) => {
3733
const formMethods = useForm<Formvalues>({
3834
defaultValues: {
39-
inntektArbeid: '',
40-
inntektYtelse: '',
35+
fastsattArbeidsinntekt: '',
36+
fastsattYtelse: '',
4137
inntektRadio: '',
4238
begrunnelse: '',
4339
},
4440
});
4541
const inntektRadio = formMethods.watch('inntektRadio');
4642

4743
const onSubmit = (values: Formvalues) => {
48-
let payload;
49-
if (values.inntektRadio === 'fastsett-belop') {
50-
payload = {
51-
inntektArbeid: values.inntektArbeid,
52-
inntektYtelse: values.inntektYtelse,
53-
begrunnelse: values.begrunnelse,
54-
};
55-
} else {
56-
payload = {
57-
inntektRadio: values.inntektRadio,
58-
begrunnelse: values.begrunnelse,
59-
};
60-
}
44+
const payload = {
45+
inntektRadio: values.inntektRadio,
46+
begrunnelse: values.begrunnelse,
47+
...(values.inntektRadio === KontrollerInntektPeriodeDtoValg.MANUELT_FASTSATT && {
48+
fastsattArbeidsinntekt: values.fastsattArbeidsinntekt,
49+
fastsattYtelse: values.fastsattYtelse,
50+
}),
51+
};
6152
submitCallback(payload);
6253
};
6354

@@ -94,23 +85,29 @@ export const ArbeidOgInntekt = ({ submitCallback }: ArbeidOgInntektProps) => {
9485
label="Hvilken inntekt skal benyttes?"
9586
validate={[required]}
9687
radios={[
97-
{ value: 'deltager', label: 'Rapportert inntekt fra deltager' },
98-
{ value: 'a-inntekt', label: 'Rapportert inntekt fra A-inntekt' },
99-
{ value: 'fastsett-belop', label: 'Fastsett beløp' },
88+
{
89+
value: KontrollerInntektPeriodeDtoValg.BRUK_BRUKERS_INNTEKT,
90+
label: 'Rapportert inntekt fra deltager',
91+
},
92+
{
93+
value: KontrollerInntektPeriodeDtoValg.BRUK_REGISTER_INNTEKT,
94+
label: 'Rapportert inntekt fra A-inntekt',
95+
},
96+
{ value: KontrollerInntektPeriodeDtoValg.MANUELT_FASTSATT, label: 'Fastsett beløp' },
10097
]}
10198
/>
102-
{inntektRadio === 'fastsett-belop' && (
99+
{inntektRadio === KontrollerInntektPeriodeDtoValg.MANUELT_FASTSATT && (
103100
<VStack gap="4">
104101
<InputField
105-
name="inntektArbeid"
102+
name="fastsattArbeidsinntekt"
106103
label="Inntekt fra arbeid"
107104
type="text"
108105
validate={[required]}
109106
htmlSize={7}
110107
size="small"
111108
/>
112109
<InputField
113-
name="inntektYtelse"
110+
name="fastsattYtelse"
114111
label="Inntekt fra ytelse"
115112
type="text"
116113
validate={[required]}
@@ -150,7 +147,6 @@ export const ArbeidOgInntekt = ({ submitCallback }: ArbeidOgInntektProps) => {
150147
<Table.HeaderCell scope="col" className={styles.firstHeaderCell}>
151148
Status
152149
</Table.HeaderCell>
153-
<Table.HeaderCell scope="col">Arbeidsforhold</Table.HeaderCell>
154150
<Table.HeaderCell scope="col">Periode</Table.HeaderCell>
155151
<Table.HeaderCell scope="col" align="right">
156152
Rapportert av deltager
@@ -162,32 +158,40 @@ export const ArbeidOgInntekt = ({ submitCallback }: ArbeidOgInntektProps) => {
162158
</Table.Row>
163159
</Table.Header>
164160
<Table.Body>
165-
{dummyData.map((data, index) => {
166-
const isLastRow = index === dummyData.length - 1;
167-
const hasAvvik = data.status === 'Avvik';
161+
{inntektKontrollperioder?.map((inntekt, index) => {
162+
const isLastRow = index === inntektKontrollperioder.length - 1;
163+
const harAksjonspunkt = inntekt.erTilVurdering;
164+
const harAvvik = inntekt.status === KontrollerInntektPeriodeDtoStatus.AVVIK;
168165
return (
169166
<Table.ExpandableRow
170-
key={index}
171-
content={hasAvvik ? getAksjonspunkt() : null}
167+
key={`${inntekt.periode?.fom}_${inntekt.periode?.tom}`}
168+
content={harAksjonspunkt ? getAksjonspunkt() : null}
172169
togglePlacement="right"
173170
className={isLastRow ? styles.lastRow : ''}
174171
expandOnRowClick
175-
expansionDisabled={!hasAvvik}
172+
expansionDisabled={!harAksjonspunkt}
176173
>
177174
<Table.DataCell className={styles.firstDataCell}>
178175
<HStack gap="2">
179-
{hasAvvik ? (
176+
{harAvvik ? (
180177
<ExclamationmarkTriangleFillIcon fontSize="1.5rem" className={styles.exclamationmarkIcon} />
181178
) : (
182179
<CheckmarkCircleFillIcon fontSize={24} className={styles.checkmarkIcon} />
183180
)}
184-
{data.status}
181+
{inntekt.status}
185182
</HStack>
186183
</Table.DataCell>
187-
<Table.DataCell>{data.arbeidsforhold}</Table.DataCell>
188-
<Table.DataCell>{data.periode}</Table.DataCell>
189-
<Table.DataCell align="right">{data.rapportertDeltager}</Table.DataCell>
190-
<Table.DataCell align="right">{data.rapportertInntekt}</Table.DataCell>
184+
<Table.DataCell>
185+
{inntekt.periode && (
186+
<PeriodLabel dateStringFom={inntekt.periode?.fom} dateStringTom={inntekt.periode?.tom} />
187+
)}
188+
</Table.DataCell>
189+
<Table.DataCell align="right">
190+
{inntekt.rapporterteInntekter?.bruker && formaterInntekt(inntekt.rapporterteInntekter?.bruker)}
191+
</Table.DataCell>
192+
<Table.DataCell align="right">
193+
{inntekt.rapporterteInntekter?.register && formaterInntekt(inntekt.rapporterteInntekter?.register)}
194+
</Table.DataCell>
191195
</Table.ExpandableRow>
192196
);
193197
})}

packages/v2/gui/src/prosess/ung-beregning/UngBeregning.tsx

+9-5
Original file line numberDiff line numberDiff line change
@@ -11,14 +11,13 @@ interface Props {
1111
behandling: { uuid: string };
1212
api: UngBeregningBackendApiType;
1313
barn: Barn[];
14-
inntekt?: unknown[];
1514
submitCallback: (data: unknown) => void;
1615
}
1716

1817
const sortSatser = (data: UngdomsytelseSatsPeriodeDto[]) =>
1918
data?.toSorted((a, b) => new Date(a.fom).getTime() - new Date(b.fom).getTime()).toReversed();
2019

21-
const UngBeregning = ({ api, behandling, barn, inntekt, submitCallback }: Props) => {
20+
const UngBeregning = ({ api, behandling, barn, submitCallback }: Props) => {
2221
const {
2322
data: satser,
2423
isLoading: satserIsLoading,
@@ -30,7 +29,12 @@ const UngBeregning = ({ api, behandling, barn, inntekt, submitCallback }: Props)
3029
select: sortSatser,
3130
});
3231

33-
if (satserIsLoading) {
32+
const { data: inntekt, isLoading: kontrollInntektIsLoading } = useQuery({
33+
queryKey: ['kontrollInntekt', behandling.uuid],
34+
queryFn: () => api.getKontrollerInntekt(behandling.uuid),
35+
});
36+
37+
if (satserIsLoading || kontrollInntektIsLoading) {
3438
return <Loader size="large" />;
3539
}
3640

@@ -39,7 +43,7 @@ const UngBeregning = ({ api, behandling, barn, inntekt, submitCallback }: Props)
3943
}
4044

4145
const harBarn = barn.length > 0;
42-
const harInntekt = inntekt && inntekt.length > 0;
46+
const harInntekt = inntekt?.kontrollperioder && inntekt.kontrollperioder.length > 0;
4347

4448
return (
4549
<Box paddingInline="4 8" paddingBlock="2">
@@ -56,7 +60,7 @@ const UngBeregning = ({ api, behandling, barn, inntekt, submitCallback }: Props)
5660
{/* <Tabs.Tab value="dagsats" label="Dagsats og utbetaling" /> */}
5761
</Tabs.List>
5862
<Tabs.Panel value="arbeid">
59-
<ArbeidOgInntekt submitCallback={submitCallback} />
63+
<ArbeidOgInntekt submitCallback={submitCallback} inntektKontrollperioder={inntekt?.kontrollperioder} />
6064
</Tabs.Panel>
6165
<Tabs.Panel value="dagsats">{satserSuccess && <DagsatsOgUtbetaling satser={satser} />}</Tabs.Panel>
6266
<Tabs.Panel value="barn">
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1-
import type { UngdomsytelseSatsPeriodeDto } from '@k9-sak-web/backend/ungsak/generated';
1+
import type { KontrollerInntektDto, UngdomsytelseSatsPeriodeDto } from '@k9-sak-web/backend/ungsak/generated';
22

33
export type UngBeregningBackendApiType = {
44
getSatser(behandlingUuid: string): Promise<UngdomsytelseSatsPeriodeDto[]>;
5+
getKontrollerInntekt(behandlingUuid: string): Promise<KontrollerInntektDto>;
56
};

packages/v2/gui/src/prosess/ung-beregning/UngBeregningBackendClient.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
import type { UngSakClient, UngdomsytelseSatsPeriodeDto } from '@k9-sak-web/backend/ungsak/generated';
1+
import type {
2+
KontrollerInntektDto,
3+
UngSakClient,
4+
UngdomsytelseSatsPeriodeDto,
5+
} from '@k9-sak-web/backend/ungsak/generated';
26

37
export default class UngBeregningBackendClient {
48
#ungsak: UngSakClient;
@@ -10,4 +14,8 @@ export default class UngBeregningBackendClient {
1014
async getSatser(behandlingUuid: string): Promise<UngdomsytelseSatsPeriodeDto[]> {
1115
return this.#ungsak.ung.getUngdomsytelseInnvilgetSats(behandlingUuid);
1216
}
17+
18+
async getKontrollerInntekt(behandlingUuid: string): Promise<KontrollerInntektDto> {
19+
return this.#ungsak.kontroll.hentKontrollerInntekt(behandlingUuid);
20+
}
1321
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
interface OwnProps {
2+
dateStringFom: string;
3+
dateStringTom?: string;
4+
showTodayString?: boolean;
5+
}
6+
7+
const formatDate = (date: Date) => {
8+
const options: Intl.DateTimeFormatOptions = { day: '2-digit', month: '2-digit', year: 'numeric' };
9+
return new Intl.DateTimeFormat('nb-NO', options).format(date);
10+
};
11+
12+
/**
13+
* PeriodLabel
14+
*
15+
* Presentasjonskomponent. Formaterer til og fra dato til en periode på formatet dd.mm.yyyy - dd.mm.yyyy.
16+
*
17+
* Eksempel:
18+
* ```html
19+
* <PeriodLabel dateStringFom="2017-08-25" dateStringTom="2017-08-31" />
20+
* ```
21+
*/
22+
const PeriodLabel = ({ dateStringFom, dateStringTom, showTodayString = false }: OwnProps) => (
23+
<span>
24+
{formatDate(new Date(dateStringFom))}
25+
{dateStringTom && (
26+
<>
27+
{' - '}
28+
{formatDate(new Date(dateStringTom))}
29+
</>
30+
)}
31+
{showTodayString && !dateStringTom && <span>d.d.</span>}
32+
</span>
33+
);
34+
35+
export default PeriodLabel;

packages/v2/gui/src/utils/formatters.ts

+5
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,8 @@ export const tilNOK = Intl.NumberFormat('no-NO', { style: 'currency', currency:
55
export const stdDato = (input: dayjs.Dayjs | string | Date) => dayjs(input).format('YYYY-MM-DD');
66

77
export const visnDato = (input: dayjs.Dayjs | string | Date) => dayjs(input).format('DD.MM.YYYY');
8+
9+
export const formatCurrencyWithKr = (value: string | number) => {
10+
const formattedValue = Number(value).toLocaleString('nb-NO').replace(/,|\s/g, ' ');
11+
return `${formattedValue} kr`;
12+
};

yarn.lock

+5-5
Original file line numberDiff line numberDiff line change
@@ -3903,7 +3903,7 @@ __metadata:
39033903
dependencies:
39043904
"@navikt/k9-klage-typescript-client": "npm:2.0.20250218125133"
39053905
"@navikt/k9-sak-typescript-client": "npm:2.0.20250306092710"
3906-
"@navikt/ung-sak-typescript-client": "npm:0.2.20250221104339"
3906+
"@navikt/ung-sak-typescript-client": "npm:0.2.20250320091618"
39073907
"@tanstack/eslint-plugin-query": "npm:^5.68.0"
39083908
languageName: unknown
39093909
linkType: soft
@@ -5334,10 +5334,10 @@ __metadata:
53345334
languageName: node
53355335
linkType: hard
53365336

5337-
"@navikt/ung-sak-typescript-client@npm:0.2.20250221104339":
5338-
version: 0.2.20250221104339
5339-
resolution: "@navikt/ung-sak-typescript-client@npm:0.2.20250221104339::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fung-sak-typescript-client%2F0.2.20250221104339%2F6d5a1d86cf5f69b9fe82e90be8bab02d18f46cf3"
5340-
checksum: 10/c999af5284aa43d6a98ebf4582fa54407bb0ba88bb2ae08ba66708f2ff05d7ed20bb2b9bd0166215c384d8a8fe36544817e28685a6467dcd99588f8b48bc639e
5337+
"@navikt/ung-sak-typescript-client@npm:0.2.20250320091618":
5338+
version: 0.2.20250320091618
5339+
resolution: "@navikt/ung-sak-typescript-client@npm:0.2.20250320091618::__archiveUrl=https%3A%2F%2Fnpm.pkg.github.com%2Fdownload%2F%40navikt%2Fung-sak-typescript-client%2F0.2.20250320091618%2F3ddd9866a18f38e7d06a071382fa7afe544c65ee"
5340+
checksum: 10/4c8292ead715e468d45df11c10b9845663a3e5ad5fd2871b350b25ee44d0a58fc674958f7719cba141276ed374ae3b67e5a975370d3cfdd9865fc773a00b2cc7
53415341
languageName: node
53425342
linkType: hard
53435343

0 commit comments

Comments
 (0)