Skip to content

Commit

Permalink
Merge pull request #3154 from navikt/tilbakekrevingsbehandling
Browse files Browse the repository at this point in the history
Tilbakekrevingsbehandling
  • Loading branch information
hestad authored Oct 16, 2023
2 parents 398bab0 + 6bdae2e commit 597f96c
Show file tree
Hide file tree
Showing 40 changed files with 1,821 additions and 50 deletions.
3 changes: 3 additions & 0 deletions src/Root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ const ManuellReguleringPage = React.lazy(() => import('~src/pages/saksbehandling
const Stans = React.lazy(() => import('~src/pages/saksbehandling/stans/Stans'));
const Gjenoppta = React.lazy(() => import('~src/pages/saksbehandling/gjenoppta/Gjenoppta'));
const Utenlandsopphold = React.lazy(() => import('~src/pages/saksbehandling/utenlandsopphold/Utenlandsopphold'));
const Tilbakekreving = React.lazy(() => import('~src/pages/saksbehandling/tilbakekreving/Tilbakekreving'));

const ScrollToTop = () => {
const { pathname } = useLocation();
Expand Down Expand Up @@ -110,6 +111,8 @@ const AppRoutes = () => (
<Route path={routes.manuellRegulering.path} element={<ManuellReguleringPage />} />
<Route path={routes.utenlandsopphold.path} element={<Utenlandsopphold />} />
<Route path={routes.brevPage.path} element={<BrevPage />} />

<Route path={routes.tilbakekrevingRoot.path} element={<Tilbakekreving />} />
</Route>
<Route
path={routes.saksoversiktIndex.path}
Expand Down
16 changes: 16 additions & 0 deletions src/api/pdfApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -99,3 +99,19 @@ export async function brevutkastForAvslagPgaManglendeDokumentasjon(arg: {
bodyTransformer: (res) => res.blob(),
});
}

export async function fetchBrevutkastForForhåndsvarselTilbakekreving(arg: {
sakId: string;
behandlingId: string;
fritekst: string;
}): Promise<ApiClientResult<Blob>> {
return apiClient({
url: `/saker/${arg.sakId}/tilbakekreving/${arg.behandlingId}/brevutkastForForhandsvarsel`,
method: 'POST',
request: { headers: new Headers({ Accept: 'application/pdf' }) },
body: {
brevtekst: arg.fritekst,
},
bodyTransformer: (res) => res.blob(),
});
}
60 changes: 60 additions & 0 deletions src/api/tilbakekrevingApi.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import {
BrevtekstTilbakekrevingsbehandlingRequest,
ForhåndsvarsleTilbakekrevingRequest,
ManuellTilbakekrevingsbehandling,
OpprettNyTilbakekrevingsbehandlingRequest,
VurderTilbakekrevingsbehandlingRequest,
} from '~src/types/ManuellTilbakekrevingsbehandling';

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

export async function opprettNyTilbakekrevingsbehandling(
arg: OpprettNyTilbakekrevingsbehandlingRequest,
): Promise<ApiClientResult<ManuellTilbakekrevingsbehandling>> {
return apiClient({
url: `/saker/${arg.sakId}/tilbakekreving/ny`,
method: 'POST',
body: {
saksversjon: arg.saksversjon,
},
});
}

export async function vurderTilbakekrevingsbehandling(
arg: VurderTilbakekrevingsbehandlingRequest,
): Promise<ApiClientResult<ManuellTilbakekrevingsbehandling>> {
return apiClient({
url: `/saker/${arg.sakId}/tilbakekreving/${arg.behandlingId}/manedsvurder`,
method: 'POST',
body: {
versjon: arg.saksversjon,
måneder: arg.måneder,
},
});
}

export async function sendForhåndsvarsel(
arg: ForhåndsvarsleTilbakekrevingRequest,
): Promise<ApiClientResult<ManuellTilbakekrevingsbehandling>> {
return apiClient({
url: `/saker/${arg.sakId}/tilbakekreving/${arg.behandlingId}/forhandsvarsel`,
method: 'POST',
body: {
versjon: arg.saksversjon,
fritekst: arg.fritekst,
},
});
}

export async function brevtekstTilbakekrevingsbehandling(
arg: BrevtekstTilbakekrevingsbehandlingRequest,
): Promise<ApiClientResult<ManuellTilbakekrevingsbehandling>> {
return apiClient({
url: `/saker/${arg.sakId}/tilbakekreving/${arg.behandlingId}/brevtekst`,
method: 'POST',
body: {
versjon: arg.saksversjon,
brevtekst: arg.brevtekst,
},
});
}
11 changes: 7 additions & 4 deletions src/components/forms/attesteringForm/AttesteringsForm.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import * as RemoteData from '@devexperts/remote-data-ts';
import { yupResolver } from '@hookform/resolvers/yup';
import { Button, Loader, Radio, RadioGroup } from '@navikt/ds-react';
import { Button, Radio, RadioGroup } from '@navikt/ds-react';
import React from 'react';
import { Controller, useForm } from 'react-hook-form';

Expand Down Expand Up @@ -111,10 +111,13 @@ export const AttesteringsForm = (props: Props) => {
>
{formatMessage('knapp.tilbake')}
</LinkAsButton>
<Button>
<Button
loading={
RemoteData.isPending(props.iverksett.status) ||
RemoteData.isPending(props.underkjenn.status)
}
>
{formatMessage('knapp.bekreft')}
{(RemoteData.isPending(props.iverksett.status) ||
RemoteData.isPending(props.underkjenn.status)) && <Loader />}
</Button>
</div>
<div className={styles.apiErrorContainer}>
Expand Down
2 changes: 1 addition & 1 deletion src/components/navigasjonsknapper/Navigasjonsknapper.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ const Navigasjonsknapper = (props: {
variant="secondary"
onClick={() => {
setKnappTrykket('avslutt');
props.fortsettSenere!.onClick!();
props.fortsettSenere?.onClick?.();
}}
type="button"
loading={props.fortsettSenere?.loading ?? (knappTrykket === 'avslutt' && props.neste?.loading)}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
export default {
'kravgrunnlag.tittel': 'Oppsummering av kravgrunnlag',
'kravgrunnlag.id': 'OS kravgrunnlags-id',
'kravgrunnlag.vedtakId': 'OS vedtak-id',
'kravgrunnlag.status': 'Status',
'kravgrunnlag.kontrollfelt': 'Kontrollfelt',

'kravgrunnlag.grunnlagsperiode.tittel': 'Grunnlagsperioder',
'kravgrunnlag.grunnlagsperiode.periode': 'Periode',
'kravgrunnlag.grunnlagsperiode.beløpSkattMnd': 'Skatt per måned',
'kravgrunnlag.grunnlagsperiode.beløp.kode': 'Kode',
'kravgrunnlag.grunnlagsperiode.beløp.type': 'Type',
'kravgrunnlag.grunnlagsperiode.beløp.skatteProsent': 'Skatteprosent',
'kravgrunnlag.grunnlagsperiode.beløp.beløpTidligereUtbetaling': 'Tidligere utbetalt',
'kravgrunnlag.grunnlagsperiode.beløp.beløpNyUtbetaling': 'Ny utbetaling',
'kravgrunnlag.grunnlagsperiode.beløp.beløpSkalTilbakekreves': 'Skal tilbakekreves',
'kravgrunnlag.grunnlagsperiode.beløp.beløpSkalIkkeTilbakekreves': 'Skal ikke tilbakekreves',
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
@import '~/src/styles/variables.less';

.kravgrunnlagOppsummeringContainer {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: @spacing-s;
margin-bottom: @spacing;
}

.grunnlagsbeløperContainer {
list-style-type: none;
margin-bottom: @spacing-s;

.grunnlagsbeløpContainer {
display: grid;
grid-template-columns: repeat(2, 1fr);
margin-bottom: @spacing-xxs;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
import { Heading, Accordion } from '@navikt/ds-react';
import AccordionItem from '@navikt/ds-react/esm/accordion/AccordionItem';
import React from 'react';

import Oppsummeringspanel, {
Oppsummeringsikon,
Oppsummeringsfarge,
} from '~src/components/oppsummeringspanel/Oppsummeringspanel';
import { useI18n } from '~src/lib/i18n';
import { Kravgrunnlag, Grunnlagsperiode } from '~src/types/Kravgrunnlag';
import { formatMonthYear } from '~src/utils/date/dateUtils';

import { OppsummeringPar } from '../oppsummeringpar/OppsummeringPar';

import messages from './OppsummeringAvKravgrunnlag-nb';
import styles from './OppsummeringAvKravgrunnlag.module.less';

const OppsummeringAvKravgrunnlag = (props: {
kravgrunnlag: Kravgrunnlag;
visSomEnkeltPanel?: boolean;
bareOppsummerMetaInfo?: boolean;
}) => {
const { formatMessage } = useI18n({ messages });

if (props.bareOppsummerMetaInfo) {
return <OppsummeringAvKravgrunnlagMetaInfo kravgrunnlag={props.kravgrunnlag} />;
} else if (props.visSomEnkeltPanel) {
return (
<div>
<OppsummeringAvKravgrunnlagMetaInfo kravgrunnlag={props.kravgrunnlag} />
<OppsummeringAvGrunnlagsPerioder grunnlagsperiode={props.kravgrunnlag.grunnlagsperiode} />
</div>
);
} else {
return (
<Oppsummeringspanel
ikon={Oppsummeringsikon.Liste}
farge={Oppsummeringsfarge.Lilla}
tittel={formatMessage('kravgrunnlag.tittel')}
>
<OppsummeringAvKravgrunnlagMetaInfo kravgrunnlag={props.kravgrunnlag} />
<OppsummeringAvGrunnlagsPerioder grunnlagsperiode={props.kravgrunnlag.grunnlagsperiode} />
</Oppsummeringspanel>
);
}
};

const OppsummeringAvKravgrunnlagMetaInfo = (props: { kravgrunnlag: Kravgrunnlag }) => {
const { formatMessage } = useI18n({ messages });
return (
<div className={styles.kravgrunnlagOppsummeringContainer}>
<OppsummeringPar
label={formatMessage('kravgrunnlag.id')}
verdi={props.kravgrunnlag.eksternKravgrunnlagsId}
retning="vertikal"
/>

<OppsummeringPar
label={formatMessage('kravgrunnlag.vedtakId')}
verdi={props.kravgrunnlag.eksternVedtakId}
retning="vertikal"
/>
<OppsummeringPar
label={formatMessage('kravgrunnlag.status')}
verdi={props.kravgrunnlag.status}
retning="vertikal"
/>
<OppsummeringPar
label={formatMessage('kravgrunnlag.kontrollfelt')}
verdi={props.kravgrunnlag.kontrollfelt}
retning="vertikal"
/>
</div>
);
};

const OppsummeringAvGrunnlagsPerioder = (props: { grunnlagsperiode: Grunnlagsperiode[] }) => {
const { formatMessage } = useI18n({ messages });
return (
<div>
<Heading size="small">{formatMessage('kravgrunnlag.grunnlagsperiode.tittel')}</Heading>

<Accordion variant="neutral">
{props.grunnlagsperiode.map((periode) => (
<AccordionItem key={`${periode.periode.fraOgMed}-${periode.periode.tilOgMed}`}>
<Accordion.Header className={styles.accordionHeader}>
{`${formatMonthYear(periode.periode.fraOgMed)} - ${formatMonthYear(
periode.periode.tilOgMed,
)}`}
</Accordion.Header>

<Accordion.Content>
<div>
<OppsummeringPar
label={formatMessage('kravgrunnlag.grunnlagsperiode.beløpSkattMnd')}
verdi={periode.beløpSkattMnd}
retning="vertikal"
/>
</div>
<hr></hr>
<div className={styles.grunnlagsbeløperContainer}>
<div className={styles.grunnlagsbeløpContainer}>
<OppsummeringPar
label={formatMessage('kravgrunnlag.grunnlagsperiode.beløp.skatteProsent')}
verdi={periode.ytelse.skatteProsent}
retning="vertikal"
/>
</div>

<div className={styles.grunnlagsbeløpContainer}>
<OppsummeringPar
label={formatMessage('kravgrunnlag.grunnlagsperiode.beløp.beløpNyUtbetaling')}
verdi={periode.ytelse.beløpNyUtbetaling}
retning="vertikal"
/>
<OppsummeringPar
label={formatMessage(
'kravgrunnlag.grunnlagsperiode.beløp.beløpTidligereUtbetaling',
)}
verdi={periode.ytelse.beløpTidligereUtbetaling}
retning="vertikal"
/>
</div>
<div className={styles.grunnlagsbeløpContainer}>
<OppsummeringPar
label={formatMessage(
'kravgrunnlag.grunnlagsperiode.beløp.beløpSkalTilbakekreves',
)}
verdi={periode.ytelse.beløpSkalTilbakekreves}
retning="vertikal"
/>
<OppsummeringPar
label={formatMessage(
'kravgrunnlag.grunnlagsperiode.beløp.beløpSkalIkkeTilbakekreves',
)}
verdi={periode.ytelse.beløpSkalIkkeTilbakekreves}
retning="vertikal"
/>
</div>
</div>
</Accordion.Content>
</AccordionItem>
))}
</Accordion>
</div>
);
};

export default OppsummeringAvKravgrunnlag;
41 changes: 38 additions & 3 deletions src/components/tabell/SuTabellUtils.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Nullable } from '~src/lib/types';
import { Klage } from '~src/types/Klage';
import { ManuellTilbakekrevingsbehandling } from '~src/types/ManuellTilbakekrevingsbehandling';
import { Regulering } from '~src/types/Regulering';
import { Revurdering } from '~src/types/Revurdering';
import { Søknad } from '~src/types/Søknad';
Expand All @@ -20,9 +21,16 @@ export const isRegulering = (b: TabellBehandling): b is Regulering => 'regulerin
export const isSøknadMedEllerUtenBehandling = (b: TabellBehandling): b is SøknadMedEllerUtenBehandling => 'søknad' in b;
export const isRevurdering = (b: TabellBehandling): b is Revurdering => 'årsak' in b;
export const isKlage = (b: TabellBehandling): b is Klage => 'klagevedtakshistorikk' in b;
export const isManuellTilbakekrevingsbehandling = (b: TabellBehandling): b is ManuellTilbakekrevingsbehandling =>
'kravgrunnlag' in b;

export type SøknadMedEllerUtenBehandling = { søknad: Søknad; søknadsbehandling?: Søknadsbehandling };
export type TabellBehandling = SøknadMedEllerUtenBehandling | Revurdering | Klage | Regulering;
export type TabellBehandling =
| SøknadMedEllerUtenBehandling
| Revurdering
| Klage
| Regulering
| ManuellTilbakekrevingsbehandling;
export type TabellBehandlinger = TabellBehandling[];

export type DatacellStatus =
Expand All @@ -36,12 +44,13 @@ export type DatacellStatus =
| 'Underkjent'
| 'Iverksatt'
| 'Avsluttet'
| 'Oversendt';
| 'Oversendt'
| 'Vurdert';

export type DataCellResultat = '-' | 'Avslag' | 'Innvilget' | 'Avvist' | 'Til vurdering' | 'Opphør' | 'Endring';

export interface DataCellInfo {
type: 'søknad' | 'regulering' | 'revurdering' | 'klage' | 'stans' | 'gjenopptak';
type: 'søknad' | 'regulering' | 'revurdering' | 'klage' | 'stans' | 'gjenopptak' | 'tilbakekreving';
status: DatacellStatus;
resultat: DataCellResultat;
periode: string;
Expand Down Expand Up @@ -101,5 +110,31 @@ export const getDataCellInfo = (b: TabellBehandling): DataCellInfo => {
avsluttetTidspunkt: b.avsluttetTidspunkt,
};
}

if (isManuellTilbakekrevingsbehandling(b)) {
return {
type: 'tilbakekreving',
status: (() => {
switch (b.status) {
case 'OPPRETTET':
return 'Opprettet';
case 'VURDERT_UTEN_BREV':
return 'Vurdert';
case 'VURDERT_MED_BREV':
return 'Vurdert';
case 'TIL_ATTESTERING':
return 'Til attestering';
case 'IVERKSATT':
return 'Iverksatt';
}
throw new Error('Ukjent status for tilbakekreving');
})(),
resultat: '-',
periode: '-',
mottattOpprettetTidspunkt: b.opprettet,
avsluttetTidspunkt: null,
};
}

throw new Error('Feil ved mapping av behandling til dataCellInfo');
};
Loading

0 comments on commit 597f96c

Please sign in to comment.