Skip to content

Commit

Permalink
Merge pull request #4680 from navikt/formater-tilbakemelding-beslutter
Browse files Browse the repository at this point in the history
Formater returnert besluttelse
  • Loading branch information
sndrem authored Nov 25, 2024
2 parents 0d72114 + 6e2c558 commit c92ceb6
Show file tree
Hide file tree
Showing 7 changed files with 76 additions and 47 deletions.
2 changes: 2 additions & 0 deletions frontend/mr-admin-flate/src/mocks/fixtures/mock_tilsagn.ts
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ export const mockTilsagn: TilsagnDto[] = [
opprettetAv: "F123456",
besluttelse: {
navIdent: "N12345",
beslutternavn: "Nils Ole Hansen",
tidspunkt: "2024-01-10",
status: TilsagnBesluttelseStatus.GODKJENT,
},
Expand Down Expand Up @@ -136,6 +137,7 @@ export const mockTilsagn: TilsagnDto[] = [
opprettetAv: "B123456",
besluttelse: {
navIdent: "N12345",
beslutternavn: "Nils Ole Hansen",
tidspunkt: "2024-01-10",
status: TilsagnBesluttelseStatus.AVVIST,
aarsaker: [TilsagnAvvisningAarsak.FEIL_ANTALL_PLASSER, TilsagnAvvisningAarsak.FEIL_ANNET],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
import { TilsagnAvvisningAarsak, TilsagnBesluttelseStatus, TilsagnDto } from "@mr/api-client";
import { Alert, Heading, HGrid, List } from "@navikt/ds-react";
import { Metadata } from "../../../components/detaljside/Metadata";
import {
TilsagnAvvisningAarsak,
TilsagnBesluttelseDto,
TilsagnBesluttelseStatus,
TilsagnDto,
} from "@mr/api-client";
import { Alert, Heading } from "@navikt/ds-react";
import { DetaljerInfoContainer } from "../../DetaljerInfoContainer";
import { formaterDato } from "../../../utils/Utils";

interface Props {
tilsagn: TilsagnDto;
Expand All @@ -10,38 +15,42 @@ interface Props {
export function AvvistDetaljer({ tilsagn }: Props) {
const { besluttelse } = tilsagn;

const aarsaker = besluttelse?.aarsaker?.map((aarsak) => tilsagnAarsakTilTekst(aarsak)) || [];

return besluttelse?.status === TilsagnBesluttelseStatus.AVVIST && besluttelse?.aarsaker ? (
<DetaljerInfoContainer withBorderRight={false}>
<Alert variant="warning">
<Heading size="xsmall" level="3">
Tilsagnet er ikke godkjent
Tilsagnet ble returnert av {beslutternavn(besluttelse)}
</Heading>
<p>Du må fikse følgende før tilsagnet kan godkjennes:</p>
<HGrid columns={2} style={{ marginTop: "1rem" }}>
<Metadata
header={besluttelse?.aarsaker?.length === 1 ? "Årsak" : "Årsaker"}
verdi={
<List>
{besluttelse?.aarsaker?.map((aarsak, index) => (
<List.Item key={index}>{tilsagnAarsakTilTekst(aarsak)}</List.Item>
))}
</List>
}
/>
<p>
Tilsagnet ble returnert av {beslutternavn(besluttelse)} den{" "}
{formaterDato(besluttelse.tidspunkt)} med følgende{" "}
{aarsaker.length === 1 ? "årsak" : "årsaker"}:{" "}
<b>{capitalizeFirstLetter(joinWithCommaAndOg(aarsaker))}</b>
{besluttelse?.forklaring ? (
<Metadata header="Forklaring" verdi={besluttelse?.forklaring} />
<>
{" "}
med forklaringen: <b>"{besluttelse?.forklaring}"</b>
</>
) : null}
</HGrid>
.
</p>
</Alert>
</DetaljerInfoContainer>
) : null;
}

function beslutternavn(besluttelse: TilsagnBesluttelseDto): string {
return `${besluttelse.beslutternavn} ${besluttelse.navIdent}`;
}

type TilsagnAarsak =
| "Feil periode"
| "Feil antall plasser"
| "Feil kostnadssted"
| "Feil beløp"
| "Annet - Se forklaring";
| "Annet";

function tilsagnAarsakTilTekst(aarsak: TilsagnAvvisningAarsak): TilsagnAarsak {
switch (aarsak) {
Expand All @@ -54,6 +63,17 @@ function tilsagnAarsakTilTekst(aarsak: TilsagnAvvisningAarsak): TilsagnAarsak {
case TilsagnAvvisningAarsak.FEIL_BELOP:
return "Feil beløp";
case TilsagnAvvisningAarsak.FEIL_ANNET:
return "Annet - Se forklaring";
return "Annet";
}
}

function joinWithCommaAndOg(aarsaker: string[]): string {
if (aarsaker.length === 0) return "";
if (aarsaker.length === 1) return aarsaker[0];
return `${aarsaker.slice(0, -1).join(", ")} og ${aarsaker[aarsaker.length - 1]}`;
}

function capitalizeFirstLetter(text: string): string {
if (!text) return "";
return text.charAt(0).toUpperCase() + text.slice(1).toLowerCase();
}
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,7 @@ class TilsagnRepository(private val db: Database) {
aarsaker = avvisteAarsaker,
forklaring = avvistForklaring,
tidspunkt = localDateTime("besluttet_tidspunkt"),
beslutternavn = string("beslutternavn"),
)
},
annullertTidspunkt = localDateTimeOrNull("annullert_tidspunkt"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ data class TilsagnDto(
@Serializable
data class Besluttelse(
val navIdent: NavIdent,
val beslutternavn: String,
@Serializable(with = LocalDateTimeSerializer::class)
val tidspunkt: LocalDateTime?,
val status: TilsagnBesluttelseStatus,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,32 +1,33 @@
drop view if exists tilsagn_admin_dto_view;

create view tilsagn_admin_dto_view as
select
tilsagn.id,
tilsagn.tiltaksgjennomforing_id,
tilsagn.periode_start,
tilsagn.periode_slutt,
tilsagn.beregning,
tilsagn.annullert_tidspunkt,
tilsagn.lopenummer,
tilsagn.kostnadssted,
tilsagn.opprettet_av,
tilsagn.besluttelse,
tilsagn.besluttet_tidspunkt,
tilsagn.besluttet_av,
tilsagn.avvist_aarsaker,
tilsagn.avvist_forklaring,
nav_enhet.navn as kostnadssted_navn,
nav_enhet.overordnet_enhet as kostnadssted_overordnet_enhet,
nav_enhet.type as kostnadssted_type,
nav_enhet.status as kostnadssted_status,
arrangor.id as arrangor_id,
arrangor.organisasjonsnummer as arrangor_organisasjonsnummer,
arrangor.navn as arrangor_navn,
arrangor.slettet_dato is not null as arrangor_slettet,
t.antall_plasser as antall_plasser,
t.tiltaksnummer as tiltaksnummer
select tilsagn.id,
tilsagn.tiltaksgjennomforing_id,
tilsagn.periode_start,
tilsagn.periode_slutt,
tilsagn.beregning,
tilsagn.annullert_tidspunkt,
tilsagn.lopenummer,
tilsagn.kostnadssted,
tilsagn.opprettet_av,
tilsagn.besluttelse,
tilsagn.besluttet_tidspunkt,
tilsagn.besluttet_av,
concat(nav_ansatt.fornavn, ' ', nav_ansatt.etternavn) as beslutternavn,
tilsagn.avvist_aarsaker,
tilsagn.avvist_forklaring,
nav_enhet.navn as kostnadssted_navn,
nav_enhet.overordnet_enhet as kostnadssted_overordnet_enhet,
nav_enhet.type as kostnadssted_type,
nav_enhet.status as kostnadssted_status,
arrangor.id as arrangor_id,
arrangor.organisasjonsnummer as arrangor_organisasjonsnummer,
arrangor.navn as arrangor_navn,
arrangor.slettet_dato is not null as arrangor_slettet,
t.antall_plasser as antall_plasser,
t.tiltaksnummer as tiltaksnummer
from tilsagn
inner join nav_enhet on nav_enhet.enhetsnummer = tilsagn.kostnadssted
inner join arrangor on arrangor.id = tilsagn.arrangor_id
inner join tiltaksgjennomforing t on t.id = tilsagn.tiltaksgjennomforing_id
left join nav_ansatt on nav_ansatt.nav_ident = tilsagn.besluttet_av
3 changes: 3 additions & 0 deletions mulighetsrommet-api/src/main/resources/web/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4836,6 +4836,8 @@ components:
properties:
navIdent:
type: string
beslutternavn:
type: string
tidspunkt:
type: string
format: date-time
Expand All @@ -4849,6 +4851,7 @@ components:
type: string
required:
- navIdent
- beslutternavn
- tidspunkt
- status

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,16 +88,17 @@ class TilsagnRepositoryTest : FunSpec({
aarsaker = listOf(AvvistTilsagnAarsak.FEIL_ANNET),
forklaring = "Forklaring",
),
navIdent = NavIdent("Z123456"),
navIdent = NavAnsattFixture.ansatt1.navIdent,
tidspunkt = LocalDateTime.of(2023, 2, 2, 0, 0, 0),
)

repository.get(tilsagn.id)?.besluttelse shouldBe TilsagnDto.Besluttelse(
navIdent = NavIdent("Z123456"),
navIdent = NavAnsattFixture.ansatt1.navIdent,
tidspunkt = LocalDateTime.of(2023, 2, 2, 0, 0, 0),
status = TilsagnBesluttelseStatus.AVVIST,
aarsaker = listOf(AvvistTilsagnAarsak.FEIL_ANNET),
forklaring = "Forklaring",
beslutternavn = "Donald Duck",
)
}

Expand Down

0 comments on commit c92ceb6

Please sign in to comment.