diff --git a/frontend/mr-admin-flate/src/mocks/fixtures/mock_tilsagn.ts b/frontend/mr-admin-flate/src/mocks/fixtures/mock_tilsagn.ts index 835ef36bbd..91c22b06d7 100644 --- a/frontend/mr-admin-flate/src/mocks/fixtures/mock_tilsagn.ts +++ b/frontend/mr-admin-flate/src/mocks/fixtures/mock_tilsagn.ts @@ -90,6 +90,7 @@ export const mockTilsagn: TilsagnDto[] = [ opprettetAv: "F123456", besluttelse: { navIdent: "N12345", + beslutternavn: "Nils Ole Hansen", tidspunkt: "2024-01-10", status: TilsagnBesluttelseStatus.GODKJENT, }, @@ -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], diff --git a/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/tilsagn/AvvistDetaljer.tsx b/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/tilsagn/AvvistDetaljer.tsx index a53d2bbf26..b304ebbc4a 100644 --- a/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/tilsagn/AvvistDetaljer.tsx +++ b/frontend/mr-admin-flate/src/pages/tiltaksgjennomforinger/tilsagn/AvvistDetaljer.tsx @@ -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; @@ -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 ? ( - Tilsagnet er ikke godkjent + Tilsagnet ble returnert av {beslutternavn(besluttelse)} -

Du må fikse følgende før tilsagnet kan godkjennes:

- - - {besluttelse?.aarsaker?.map((aarsak, index) => ( - {tilsagnAarsakTilTekst(aarsak)} - ))} - - } - /> +

+ Tilsagnet ble returnert av {beslutternavn(besluttelse)} den{" "} + {formaterDato(besluttelse.tidspunkt)} med følgende{" "} + {aarsaker.length === 1 ? "årsak" : "årsaker"}:{" "} + {capitalizeFirstLetter(joinWithCommaAndOg(aarsaker))} {besluttelse?.forklaring ? ( - + <> + {" "} + med forklaringen: "{besluttelse?.forklaring}" + ) : null} - + . +

) : 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) { @@ -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(); +} diff --git a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/db/TilsagnRepository.kt b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/db/TilsagnRepository.kt index 4453822879..0ab689942f 100644 --- a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/db/TilsagnRepository.kt +++ b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/db/TilsagnRepository.kt @@ -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"), diff --git a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/model/TilsagnDto.kt b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/model/TilsagnDto.kt index f139233b82..03bf377559 100644 --- a/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/model/TilsagnDto.kt +++ b/mulighetsrommet-api/src/main/kotlin/no/nav/mulighetsrommet/api/tilsagn/model/TilsagnDto.kt @@ -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, diff --git a/mulighetsrommet-api/src/main/resources/db/migration/R__tilsagn_admin_view.sql b/mulighetsrommet-api/src/main/resources/db/migration/R__tilsagn_admin_view.sql index 45ab7ce4c0..3272cbbc95 100644 --- a/mulighetsrommet-api/src/main/resources/db/migration/R__tilsagn_admin_view.sql +++ b/mulighetsrommet-api/src/main/resources/db/migration/R__tilsagn_admin_view.sql @@ -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 diff --git a/mulighetsrommet-api/src/main/resources/web/openapi.yaml b/mulighetsrommet-api/src/main/resources/web/openapi.yaml index 4f0f028597..f75b8965f2 100644 --- a/mulighetsrommet-api/src/main/resources/web/openapi.yaml +++ b/mulighetsrommet-api/src/main/resources/web/openapi.yaml @@ -4836,6 +4836,8 @@ components: properties: navIdent: type: string + beslutternavn: + type: string tidspunkt: type: string format: date-time @@ -4849,6 +4851,7 @@ components: type: string required: - navIdent + - beslutternavn - tidspunkt - status diff --git a/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/tilsagn/TilsagnRepositoryTest.kt b/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/tilsagn/TilsagnRepositoryTest.kt index 507a83c956..5f1bdde51f 100644 --- a/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/tilsagn/TilsagnRepositoryTest.kt +++ b/mulighetsrommet-api/src/test/kotlin/no/nav/mulighetsrommet/api/tilsagn/TilsagnRepositoryTest.kt @@ -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", ) }