Skip to content

Commit

Permalink
Merge pull request #3063 from navikt/frioppslag_skatt
Browse files Browse the repository at this point in the history
Frioppslag skatt
  • Loading branch information
RamziAbuQassim authored Sep 5, 2023
2 parents 89efd72 + 9d61920 commit 79b77a1
Show file tree
Hide file tree
Showing 9 changed files with 163 additions and 9 deletions.
16 changes: 16 additions & 0 deletions src/api/skattApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { FrioppslagSkattRequest } from '~src/types/skatt/Skatt';

import apiClient, { ApiClientResult } from './apiClient';

export async function fetchSkattFor(arg: FrioppslagSkattRequest): Promise<ApiClientResult<Blob>> {
return apiClient({
url: `/skatt/person/${arg.fnr}`,
method: 'POST',
body: {
år: arg.år,
begrunnelse: arg.begrunnelse,
},
request: { headers: new Headers({ Accept: 'application/pdf' }) },
bodyTransformer: (res) => res.blob(),
});
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,11 @@ export default {
'skattegrunnlag.søker': 'Søker',
'skattegrunnlag.eps': 'Ektefelle/Partner/Samboer',
'skattegrunnlag.laster': 'Henter skattegrunnlag',

'frioppslag.fødselsnummer': 'Fødselsnummer',
'frioppslag.år': 'År',
'frioppslag.begrunnelse': 'Begrunnelse',
'frioppslag.begrunnelse.description': 'Begrunnelsen vil bli lagret med pdf-innholdet',
'frioppslag.error.fnr': 'Ugyldig fødselsnummer',
'frioppslag.error.år': 'Ugyldig år',
};
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,19 @@
padding: 0.5rem;
}
}

.frioppslagContainer {
display: flex;
gap: @spacing;

.frioppslagForm {
display: flex;
flex-direction: column;
gap: @spacing-s;
align-items: flex-start;
}

.begrunnelse {
width: 25rem;
}
}
110 changes: 106 additions & 4 deletions src/components/hentOgVisSkattegrunnlag/HentOgVisSkattegrunnlag.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
import * as RemoteData from '@devexperts/remote-data-ts';
import { yupResolver } from '@hookform/resolvers/yup';
import { ArrowsCirclepathIcon } from '@navikt/aksel-icons';
import { Button, Heading } from '@navikt/ds-react';
import { Button, Heading, TextField, Textarea } from '@navikt/ds-react';
import { pipe } from 'fp-ts/lib/function';
import React, { useMemo } from 'react';
import { Controller, useForm } from 'react-hook-form';

import { fetchSkattFor as fetchSkattPdfFor } from '~src/api/skattApi';
import { hentNySkattegrunnlag } from '~src/features/SøknadsbehandlingActions';
import { useAsyncActionCreator } from '~src/lib/hooks';
import { useApiCall, useAsyncActionCreator } from '~src/lib/hooks';
import { useI18n } from '~src/lib/i18n';
import yup from '~src/lib/validering';
import { Søknadsbehandling } from '~src/types/Søknadsbehandling';

import ApiErrorAlert from '../apiErrorAlert/ApiErrorAlert';
Expand All @@ -16,7 +20,105 @@ import OppsummeringAvEksternGrunnlagSkatt from '../oppsummering/oppsummeringAvEk
import messages from './HentOgVisSkattegrunnlag-nb';
import styles from './HentOgVisSkattegrunnlag.module.less';

const HentOgVisSkattegrunnlag = (props: { søknadsbehandling: Søknadsbehandling }) => {
/**
* Henting og visning av skatt gjøres på 2 forskjellige måter:
* Den ene måten er i konteksten av en søknadsbehandling
* Den andre måten er i konteksten av frioppslag
*
* Props bestemmer hvilken som blir valgt
*/
export const HentOgVisSkattegrunnlag = (props: { søknadsbehandling?: Søknadsbehandling }) => {
if (props.søknadsbehandling) {
return <HentOgVisSkattegrunnlagForSøknadsbehandling søknadsbehandling={props.søknadsbehandling} />;
} else {
return <HentOfVisSkattegrunnlagForFrioppslag />;
}
};

interface FrioppslagFormData {
fnr: string;
år: string;
begrunnelse: string;
}

const frioppslagSchema = yup.object<FrioppslagFormData>({
fnr: yup.string().required().length(11),
år: yup
.string()
.test('Tallet må være lik eller høyere enn 2006', `År må være et tall større eller lik 2006`, function (value) {
return value ? Number.parseInt(value, 10) > 2005 : false;
})
.required(),
begrunnelse: yup.string().required(),
});

export const HentOfVisSkattegrunnlagForFrioppslag = () => {
const { formatMessage } = useI18n({ messages });

const [skattPdfStatus, hentSkattPdfFor] = useApiCall(fetchSkattPdfFor);

const form = useForm<FrioppslagFormData>({
defaultValues: { fnr: '', år: '', begrunnelse: '' },
resolver: yupResolver(frioppslagSchema),
});

return (
<div className={styles.frioppslagContainer}>
<form
className={styles.frioppslagForm}
onSubmit={form.handleSubmit((data) =>
hentSkattPdfFor({ fnr: data.fnr, år: +data.år, begrunnelse: data.begrunnelse }, (b: Blob) =>
window.open(URL.createObjectURL(b)),
),
)}
>
<Controller
control={form.control}
name={'fnr'}
render={({ field, fieldState }) => (
<TextField
label={formatMessage('frioppslag.fødselsnummer')}
{...field}
error={fieldState.error?.message}
/>
)}
/>

<Controller
control={form.control}
name={'år'}
render={({ field, fieldState }) => (
<TextField
label={formatMessage('frioppslag.år')}
{...field}
inputMode="numeric"
error={fieldState.error?.message}
/>
)}
/>

<Controller
control={form.control}
name={'begrunnelse'}
render={({ field, fieldState }) => (
<Textarea
className={styles.begrunnelse}
label={formatMessage('frioppslag.begrunnelse')}
description={formatMessage('frioppslag.begrunnelse.description')}
{...field}
error={fieldState.error?.message}
/>
)}
/>

<Button loading={RemoteData.isPending(skattPdfStatus)}>Søk</Button>
{RemoteData.isFailure(skattPdfStatus) && <ApiErrorAlert error={skattPdfStatus.error} />}
</form>
</div>
);
};

const HentOgVisSkattegrunnlagForSøknadsbehandling = (props: { søknadsbehandling: Søknadsbehandling }) => {
const { formatMessage } = useI18n({ messages });

const [nyStatus, ny] = useAsyncActionCreator(hentNySkattegrunnlag);
Expand Down Expand Up @@ -69,4 +171,4 @@ const HentOgVisSkattegrunnlag = (props: { søknadsbehandling: Søknadsbehandling
);
};

export default HentOgVisSkattegrunnlag;
export default HentOgVisSkattegrunnlagForSøknadsbehandling;
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import * as RemoteData from '@devexperts/remote-data-ts';
import { NumberListIcon, CurrencyExchangeIcon, FileCheckmarkIcon, FileIcon } from '@navikt/aksel-icons';
import { NumberListIcon, CurrencyExchangeIcon, FileCheckmarkIcon, FileIcon, TableIcon } from '@navikt/aksel-icons';
import { Heading, Tabs } from '@navikt/ds-react';
import React, { useEffect } from 'react';
import { useNavigate } from 'react-router-dom';

import { hentReguleringsstatus } from '~src/api/reguleringApi';
import { Person as PersonIkon } from '~src/assets/Icons';
import ApiErrorAlert from '~src/components/apiErrorAlert/ApiErrorAlert';
import { HentOgVisSkattegrunnlag } from '~src/components/hentOgVisSkattegrunnlag/HentOgVisSkattegrunnlag';
import Personsøk from '~src/components/Personsøk/Personsøk';
import * as personSlice from '~src/features/person/person.slice';
import * as sakSlice from '~src/features/saksoversikt/sak.slice';
Expand All @@ -27,6 +28,7 @@ enum Tab {
FERDIGE_BEHANDLINGER = 'FERDIGE_BEHANDLINGER',
NØKKELTALL = 'NØKKELTALL',
REGULERING = 'REGULERING',
SKATT = 'SKATT',
}

const Behandlingsoversikt = () => {
Expand Down Expand Up @@ -102,8 +104,9 @@ const Behandlingsoversikt = () => {
label={formatMessage('regulering')}
icon={<CurrencyExchangeIcon />}
/>
<Tabs.Tab value={Tab.SKATT} label={formatMessage('skatt')} icon={<TableIcon />} />
</Tabs.List>
<div className={styles.tabcontainer}>
<div className={styles.panelContainer}>
<Tabs.Panel value={Tab.ÅPNE_BEHANDLINGER}>
<ÅpneBehandlinger />
</Tabs.Panel>
Expand All @@ -116,6 +119,9 @@ const Behandlingsoversikt = () => {
<Tabs.Panel value={Tab.REGULERING}>
<Reguleringsoversikt reguleringsstatus={gjenståendeManuelleReguleringer} />
</Tabs.Panel>
<Tabs.Panel value={Tab.SKATT}>
<HentOgVisSkattegrunnlag />
</Tabs.Panel>
</div>
</Tabs>
</div>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,5 @@ export default {
finnSak: 'Finn sak',
nøkkeltall: 'Nøkkeltall',
regulering: 'Saker til G-regulering',
skatt: 'Skattegrunnlag',
};
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@
width: fit-content;
}

.tabcontainer {
.panelContainer {
background: white;
display: flex;
flex-wrap: wrap;
Expand Down
4 changes: 2 additions & 2 deletions src/pages/saksbehandling/søknadsbehandling/formue/Formue.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ import {
formueVilkårFormTilRequest,
eqFormueVilkårFormData,
} from '~src/components/forms/vilkårOgGrunnlagForms/formue/FormueFormUtils';
import HentOgVisSkattegrunnlag from '~src/components/hentOgVisSkattegrunnlag/HentOgVisSkattegrunnlag';
import HentOgVisSkattegrunnlagForSøknadsbehandling from '~src/components/hentOgVisSkattegrunnlag/HentOgVisSkattegrunnlag';
import OppsummeringAvFormue from '~src/components/oppsummering/oppsummeringAvSøknadinnhold/OppsummeringAvFormue';
import ToKolonner from '~src/components/toKolonner/ToKolonner';
import { useSøknadsbehandlingDraftContextFor } from '~src/context/søknadsbehandlingDraftContext';
Expand Down Expand Up @@ -117,7 +117,7 @@ const Formue = (props: VilkårsvurderingBaseProps & { søker: Person }) => {
eps: props.behandling.søknad.søknadInnhold.ektefelle?.formue,
}}
/>
<HentOgVisSkattegrunnlag søknadsbehandling={props.behandling} />
<HentOgVisSkattegrunnlagForSøknadsbehandling søknadsbehandling={props.behandling} />
</div>
),
}}
Expand Down
6 changes: 6 additions & 0 deletions src/types/skatt/Skatt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,9 @@ export interface KjøretøySpesifisering {
antattVerdiSomNytt: Nullable<string>;
antattMarkedsverdi: Nullable<string>;
}

export interface FrioppslagSkattRequest {
fnr: string;
år: number;
begrunnelse: string;
}

0 comments on commit 79b77a1

Please sign in to comment.