Skip to content

Commit

Permalink
Vis antall plasser og sorter på periodestart og slutt
Browse files Browse the repository at this point in the history
  • Loading branch information
sndrem committed Nov 1, 2024
1 parent ea713ab commit bfe94c8
Show file tree
Hide file tree
Showing 7 changed files with 117 additions and 33 deletions.
Original file line number Diff line number Diff line change
@@ -1,20 +1,52 @@
import { ClockIcon } from "@navikt/aksel-icons";
import { Alert, Button, HelpText, HStack, Table } from "@navikt/ds-react";
import { NavAnsatt, NavAnsattRolle, TilsagnBesluttelse, TilsagnDto } from "@mr/api-client";
import { Link, useNavigate, useParams } from "react-router-dom";
import { useHentAnsatt } from "@/api/ansatt/useHentAnsatt";
import { formaterDato } from "@/utils/Utils";
import { NavAnsatt, NavAnsattRolle, TilsagnBesluttelse, TilsagnDto } from "@mr/api-client";
import { formaterNOK } from "@mr/frontend-common/utils/utils";
import { ClockIcon } from "@navikt/aksel-icons";
import { Alert, Button, HelpText, HStack, Table, SortState } from "@navikt/ds-react";
import { TableColumnHeader } from "@navikt/ds-react/Table";
import { useState } from "react";
import { Link, useNavigate, useParams } from "react-router-dom";

interface Props {
tilsagn: TilsagnDto[];
}

interface ScopedSortState extends SortState {
orderBy: keyof TilsagnDto;
}

export function Tilsagnstabell({ tilsagn }: Props) {
const { tiltaksgjennomforingId } = useParams();
const { data: ansatt } = useHentAnsatt();
const navigate = useNavigate();

const [sort, setSort] = useState<ScopedSortState>();

const handleSort = (sortKey: ScopedSortState["orderBy"]) => {
setSort(
sort && sortKey === sort.orderBy && sort.direction === "descending"
? undefined
: {
orderBy: sortKey,
direction:
sort && sortKey === sort.orderBy && sort.direction === "ascending"
? "descending"
: "ascending",
},
);
};

function comparator<T>(a: T, b: T, orderBy: keyof T): number {
if (b[orderBy] == null || b[orderBy] < a[orderBy]) {
return -1;
}
if (b[orderBy] > a[orderBy]) {
return 1;
}
return 0;
}

function besluttTilsagn(id: string) {
navigate(id);
}
Expand All @@ -23,10 +55,6 @@ export function Tilsagnstabell({ tilsagn }: Props) {
navigate(`/tiltaksgjennomforinger/${tiltaksgjennomforingId}/tilsagn/${id}/rediger-tilsagn`);
}

function totalSum(tilsagn: TilsagnDto[]): number {
return tilsagn.reduce((acc, tilsagn) => acc + tilsagn.beregning.belop, 0);
}

function TilsagnStatus(props: { tilsagn: TilsagnDto; ansatt?: NavAnsatt }) {
const { tilsagn, ansatt } = props;

Expand Down Expand Up @@ -78,31 +106,57 @@ export function Tilsagnstabell({ tilsagn }: Props) {
}
}

const sortedData = tilsagn.slice().sort((a, b) => {
if (sort) {
return sort.direction === "ascending"
? comparator(b, a, sort.orderBy)
: comparator(a, b, sort.orderBy);
}
return 1;
});

return (
<Table>
<Table
sort={sort}
onSortChange={(sortKey) => handleSort(sortKey as ScopedSortState["orderBy"])}
>
<Table.Header>
<Table.Row>
<Table.HeaderCell>Periodestart</Table.HeaderCell>
<Table.HeaderCell>Periodeslutt</Table.HeaderCell>
<Table.HeaderCell>Kostnadssted</Table.HeaderCell>
<Table.HeaderCell>
Beløp <small>(totalt {formaterNOK(totalSum(tilsagn))})</small>
</Table.HeaderCell>
<Table.HeaderCell></Table.HeaderCell>
<Table.HeaderCell></Table.HeaderCell>
<Table.HeaderCell></Table.HeaderCell>
<Table.ColumnHeader title="Tilsagnsnummer">Tilsagnsnr.</Table.ColumnHeader>
<TableColumnHeader sortKey="periodeStart" sortable>
Periodestart
</TableColumnHeader>
<TableColumnHeader sortKey="periodeSlutt" sortable>
Periodeslutt
</TableColumnHeader>
<TableColumnHeader>Kostnadssted</TableColumnHeader>
<TableColumnHeader>Antall plasser</TableColumnHeader>
<TableColumnHeader>Beløp</TableColumnHeader>
<TableColumnHeader>Status</TableColumnHeader>
<TableColumnHeader></TableColumnHeader>
<TableColumnHeader></TableColumnHeader>
</Table.Row>
</Table.Header>
<Table.Body>
{tilsagn.map((tilsagn) => {
const { periodeStart, periodeSlutt, kostnadssted, beregning, id, besluttelse } = tilsagn;
{sortedData.map((tilsagn) => {
const {
periodeStart,
periodeSlutt,
kostnadssted,
beregning,
id,
besluttelse,
tiltaksgjennomforing,
} = tilsagn;
return (
<Table.Row key={id}>
<Table.DataCell>{formaterDato(periodeStart)}</Table.DataCell>
<Table.DataCell>{formaterDato(periodeSlutt)}</Table.DataCell>
<Table.DataCell>
{kostnadssted.navn} {kostnadssted.enhetsnummer}
{tiltaksgjennomforing.tiltaksnummer}/{tilsagn.lopenummer}
</Table.DataCell>
<Table.DataCell>{formaterDato(periodeStart)}</Table.DataCell>
<Table.DataCell>{formaterDato(periodeSlutt)}</Table.DataCell>
<Table.DataCell>{kostnadssted.navn}</Table.DataCell>
<Table.DataCell>{tiltaksgjennomforing.antallPlasser}</Table.DataCell>
<Table.DataCell>{formaterNOK(beregning.belop)}</Table.DataCell>
<Table.DataCell>
<TilsagnStatus tilsagn={tilsagn} ansatt={ansatt} />
Expand All @@ -122,7 +176,7 @@ export function Tilsagnstabell({ tilsagn }: Props) {
</Table.DataCell>
<Table.DataCell>
<Link to={`/tiltaksgjennomforinger/${tiltaksgjennomforingId}/tilsagn/${id}`}>
Se tilsagn
Detaljer
</Link>
</Table.DataCell>
</Table.Row>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ import java.util.*
data class TilsagnDto(
@Serializable(with = UUIDSerializer::class)
val id: UUID,
@Serializable(with = UUIDSerializer::class)
val tiltaksgjennomforingId: UUID,
@Serializable(with = LocalDateSerializer::class)
val periodeStart: LocalDate,
@Serializable(with = LocalDateSerializer::class)
Expand All @@ -30,6 +28,7 @@ data class TilsagnDto(
val lopenummer: Int,
val arrangor: Arrangor,
val besluttelse: Besluttelse?,
val tiltaksgjennomforing: Tiltaksgjennomforing,
) {
@Serializable
data class Arrangor(
Expand All @@ -47,4 +46,12 @@ data class TilsagnDto(
val tidspunkt: LocalDateTime?,
val utfall: TilsagnBesluttelse,
)

@Serializable
data class Tiltaksgjennomforing(
@Serializable(with = UUIDSerializer::class)
val id: UUID,
val antallPlasser: Int,
val tiltaksnummer: String,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,11 @@ class TilsagnRepository(private val db: Database) {
private fun Row.toTilsagnDto(): TilsagnDto {
return TilsagnDto(
id = uuid("id"),
tiltaksgjennomforingId = uuid("tiltaksgjennomforing_id"),
tiltaksgjennomforing = TilsagnDto.Tiltaksgjennomforing(
id = uuid("tiltaksgjennomforing_id"),
antallPlasser = int("antall_plasser"),
tiltaksnummer = string("tiltaksnummer"),
),
periodeSlutt = localDate("periode_slutt"),
periodeStart = localDate("periode_start"),
opprettetAv = NavIdent(string("opprettet_av")),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ class TilsagnService(
}

private suspend fun lagOgSendBestilling(tilsagn: TilsagnDto) {
val gjennomforing = tiltaksgjennomforingRepository.get(tilsagn.tiltaksgjennomforingId)
val gjennomforing = tiltaksgjennomforingRepository.get(tilsagn.tiltaksgjennomforing.id)
requireNotNull(gjennomforing) { "Fant ikke gjennomforing til tilsagn" }
requireNotNull(gjennomforing.avtaleId) { "Fant ikke avtale til gjennomforingen" }

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,10 @@ select
arrangor.id as arrangor_id,
arrangor.organisasjonsnummer as arrangor_organisasjonsnummer,
arrangor.navn as arrangor_navn,
arrangor.slettet_dato is not null as arrangor_slettet
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
18 changes: 15 additions & 3 deletions mulighetsrommet-api/src/main/resources/web/openapi.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -4715,9 +4715,6 @@ components:
id:
type: string
format: uuid
tiltaksgjennomforingId:
type: string
format: uuid
periodeStart:
type: string
format: date
Expand Down Expand Up @@ -4755,6 +4752,20 @@ components:
- organisasjonsnummer
- navn
- overordnetEnhet
tiltaksgjennomforing:
type: object
properties:
id:
type: string
format: uuid
antallPlasser:
type: number
tiltaksnummer:
type: string
required:
- id
- antallPlasser
- tiltaksnummer
required:
- id
- tiltaksgjennomforingId
Expand All @@ -4766,6 +4777,7 @@ components:
- arrangor
- lopenummer
- opprettetAv
- tiltaksgjennomforing

TilsagnBesluttelseDto:
type: object
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,11 @@ class TilsagnRepositoryTest : FunSpec({
repository.upsert(tilsagn)
repository.get(tilsagn.id) shouldBe TilsagnDto(
id = tilsagn.id,
tiltaksgjennomforingId = AFT1.id,
tiltaksgjennomforing = TilsagnDto.Tiltaksgjennomforing(
id = AFT1.id,
antallPlasser = 10,
tiltaksnummer = "2024#123",
),
periodeStart = LocalDate.of(2023, 1, 1),
periodeSlutt = LocalDate.of(2023, 2, 1),
kostnadssted = Gjovik,
Expand Down

0 comments on commit bfe94c8

Please sign in to comment.