Skip to content

Commit

Permalink
Merge pull request #4497 from navikt/feature/tilsagn-detaljer
Browse files Browse the repository at this point in the history
Feature/tilsagn detaljer
  • Loading branch information
fredrikpe authored Oct 17, 2024
2 parents 471f9e5 + 07f3536 commit 75c4d9f
Show file tree
Hide file tree
Showing 10 changed files with 278 additions and 99 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { ArrangorflateTilsagn, TilsagnBeregningAFT } from "@mr/api-client";
import { Definisjonsliste } from "../Definisjonsliste";
import { formaterDato } from "~/utils";
import { formaterTall } from "@mr/frontend-common/utils/utils";

interface Props {
tilsagn: ArrangorflateTilsagn;
}

export function AFTTilsagnDetaljer({ tilsagn }: Props) {
const beregning = tilsagn.beregning as TilsagnBeregningAFT;

return (
<Definisjonsliste
className="mt-4"
definitions={[
{
key: "Tilsagnsperiode",
value: `${formaterDato(tilsagn.periodeStart)} - ${formaterDato(tilsagn.periodeSlutt)}`,
},
{ key: "Tiltakstype", value: tilsagn.tiltakstype.navn },
{ key: "Tiltaksnavn", value: tilsagn.gjennomforing.navn },
{ key: "Antall plasser", value: String(beregning.antallPlasser) },
{ key: "Sats", value: formaterTall(beregning.sats) },
{ key: "Beløp", value: formaterTall(beregning.belop) },
{ key: "Beløp", value: formaterTall(beregning.belop) },
]}
/>
);
}
43 changes: 43 additions & 0 deletions frontend/arrangor-flate/app/components/tilsagn/TilsagnDetaljer.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { ArrangorflateTilsagn, TilsagnBeregningAFT } from "@mr/api-client";
import { Definisjonsliste } from "../Definisjonsliste";
import { formaterDato } from "~/utils";
import { formaterTall } from "@mr/frontend-common/utils/utils";

interface Props {
tilsagn: ArrangorflateTilsagn;
}

export function TilsagnDetaljer({ tilsagn }: Props) {
return (
<>
<Definisjonsliste
className="mt-4"
definitions={[
{
key: "Tilsagnsperiode",
value: `${formaterDato(tilsagn.periodeStart)} - ${formaterDato(tilsagn.periodeSlutt)}`,
},
{ key: "Beløp", value: formaterTall(tilsagn.beregning.belop) },
{ key: "Utbetalt så langt", value: formaterTall(0) },
]}
/>
{tilsagn.beregning.type === "AFT" ? (
<AFTDetaljer beregning={tilsagn.beregning} />
) : (
<div>Feil tilsagnstype</div>
)}
</>
);
}

function AFTDetaljer({ beregning }: { beregning: TilsagnBeregningAFT }) {
return (
<Definisjonsliste
className="mt-4"
definitions={[
{ key: "Antall plasser", value: String(beregning.antallPlasser) },
{ key: "Sats", value: formaterTall(beregning.sats) },
]}
/>
);
}
34 changes: 20 additions & 14 deletions frontend/arrangor-flate/app/routes/deltakerliste.detaljer.$id.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,19 @@
import { Alert, Button, Checkbox, VStack } from "@navikt/ds-react";
import { Alert, Box, Button, Checkbox, VStack } from "@navikt/ds-react";
import { ActionFunction, json, LoaderFunction, redirect } from "@remix-run/node";
import { Form, useActionData, useLoaderData } from "@remix-run/react";
import { DeltakerlisteDetaljer } from "../components/deltakerliste/DeltakerlisteDetaljer";
import { PageHeader } from "../components/PageHeader";
import { Refusjonskrav, type TilsagnDetaljer } from "../domene/domene";
import { Refusjonskrav } from "../domene/domene";
import { checkValidToken } from "../auth/auth.server";
import { RefusjonTilsagnsDetaljer } from "~/components/refusjonskrav/TilsagnsDetaljer";
import { RefusjonDetaljer } from "~/components/refusjonskrav/RefusjonDetaljer";
import { Separator } from "~/components/Separator";
import { loadRefusjonskrav } from "~/loaders/loadRefusjonskrav";
import { ArrangorflateService } from "@mr/api-client";
import { ArrangorflateService, ArrangorflateTilsagn } from "@mr/api-client";
import { TilsagnDetaljer } from "~/components/tilsagn/TilsagnDetaljer";

type LoaderData = {
krav: Refusjonskrav;
tilsagnsDetaljer: TilsagnDetaljer;
tilsagn: ArrangorflateTilsagn[];
};

export const loader: LoaderFunction = async ({ request, params }): Promise<LoaderData> => {
Expand All @@ -22,16 +22,11 @@ export const loader: LoaderFunction = async ({ request, params }): Promise<Loade
if (params.id === undefined) throw Error("Mangler id");

const krav = await loadRefusjonskrav(params.id);
const tilsagn = await ArrangorflateService.getArrangorflateTilsagnTilRefusjon({ id: krav.id });

return {
krav,
tilsagnsDetaljer: {
antallPlasser: 20,
prisPerPlass: 20205,
tilsagnsBelop: 1308530,
tilsagnsPeriode: "01.06.2024 - 30.06.2024",
sum: 1308530,
},
tilsagn,
};
};

Expand All @@ -56,7 +51,7 @@ export const action: ActionFunction = async ({ request }) => {
};

export default function RefusjonskravDetaljer() {
const { tilsagnsDetaljer, krav } = useLoaderData<LoaderData>();
const { tilsagn, krav } = useLoaderData<LoaderData>();
const data = useActionData<typeof action>();

return (
Expand All @@ -71,7 +66,18 @@ export default function RefusjonskravDetaljer() {
<VStack gap="5">
<DeltakerlisteDetaljer krav={krav} />
<Separator />
<RefusjonTilsagnsDetaljer tilsagnsDetaljer={tilsagnsDetaljer} />
{tilsagn.map((t) => (
<Box
padding="2"
key={t.id}
maxWidth="50%"
borderWidth="1"
borderColor="border-subtle"
borderRadius="medium"
>
<TilsagnDetaljer tilsagn={t} />
</Box>
))}
<Separator />
<RefusjonDetaljer krav={krav} />

Expand Down
16 changes: 11 additions & 5 deletions frontend/arrangor-flate/app/routes/tilsagn.$id.tsx
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { VStack } from "@navikt/ds-react";
import { LoaderFunction } from "@remix-run/node";
import { useLoaderData } from "@remix-run/react";
import { PageHeader } from "../components/PageHeader";
import { checkValidToken } from "../auth/auth.server";
import { ArrangorflateService, ArrangorflateTilsagn } from "@mr/api-client";
import { Definisjonsliste } from "~/components/Definisjonsliste";
import { TilsagnDetaljer } from "~/components/tilsagn/TilsagnDetaljer";

type LoaderData = {
tilsagn: ArrangorflateTilsagn;
Expand All @@ -18,7 +19,7 @@ export const loader: LoaderFunction = async ({ request, params }): Promise<Loade
return { tilsagn };
};

export default function TilsagnDetaljer() {
export default function TilsagnDetaljerPage() {
const { tilsagn } = useLoaderData<LoaderData>();

return (
Expand All @@ -30,9 +31,14 @@ export default function TilsagnDetaljer() {
url: `/`,
}}
/>
<VStack gap="5">
<div>{tilsagn.id}</div>
</VStack>
<Definisjonsliste
className="mt-4"
definitions={[
{ key: "Tiltakstype", value: tilsagn.tiltakstype.navn },
{ key: "Tiltaksnavn", value: tilsagn.gjennomforing.navn },
]}
/>
<TilsagnDetaljer tilsagn={tilsagn} />
</>
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,58 +40,77 @@ fun Route.arrangorflateRoutes() {
val arrangorService: ArrangorService by inject()
val refusjonskrav: RefusjonskravRepository by inject()

route("/refusjon") {
get("/krav") {
val rettigheter = altinnRettigheterService.getRettigheter(getPid())
if (rettigheter.isEmpty()) {
return@get call.respond(HttpStatusCode.Forbidden)
}
route("/arrangorflate") {
route("/refusjonskrav") {
get {
val rettigheter = altinnRettigheterService.getRettigheter(getPid())
if (rettigheter.isEmpty()) {
return@get call.respond(HttpStatusCode.Forbidden)
}

val arrangorer = rettigheter.map {
arrangorService.getOrSyncArrangorFromBrreg(it.organisasjonsnummer.value)
.getOrElse {
throw StatusException(HttpStatusCode.InternalServerError, "Feil ved henting av arrangor_id")
}
}

val arrangorer = rettigheter.map {
arrangorService.getOrSyncArrangorFromBrreg(it.organisasjonsnummer.value)
.getOrElse {
throw StatusException(HttpStatusCode.InternalServerError, "Feil ved henting av arrangor_id")
val krav = refusjonskrav.getByArrangorIds(arrangorer.map { it.id })
.map {
// TODO egen listemodell som er generell på tvers av beregningstype?
toRefusjonKravOppsummering(it)
}
}

val krav = refusjonskrav.getByArrangorIds(arrangorer.map { it.id })
.map {
// TODO egen listemodell som er generell på tvers av beregningstype?
toRefusjonKravOppsummering(it)
}
call.respond(krav)
}

call.respond(krav)
}
get("/{id}") {
val id = call.parameters.getOrFail<UUID>("id")

get("/krav/{id}") {
val id = call.parameters.getOrFail<UUID>("id")
val krav = refusjonskrav.get(id) ?: throw NotFoundException("Fant ikke refusjonskra med id=$id")

val krav = refusjonskrav.get(id)
?: throw NotFoundException("Fant ikke refusjonskra med id=$id")
val oppsummering = toRefusjonKravOppsummering(krav)

val oppsummering = toRefusjonKravOppsummering(krav)
call.respond(oppsummering)
}

call.respond(oppsummering)
}
post("/{id}/godkjenn-refusjon") {
val id = call.parameters.getOrFail<UUID>("id")

post("/krav/{id}/godkjenn-refusjon") {
val id = call.parameters.getOrFail<UUID>("id")
refusjonskrav.setGodkjentAvArrangor(id, LocalDateTime.now())

refusjonskrav.setGodkjentAvArrangor(id, LocalDateTime.now())
call.respond(HttpStatusCode.OK)
}

call.respond(HttpStatusCode.OK)
}
get("/{id}/kvittering") {
val id = call.parameters.getOrFail<UUID>("id")
val html = createHtmlFromTemplateData("refusjon-kvittering", "refusjon").toString()
val pdfBytes: ByteArray = createPDFA(html)

call.response.headers.append(
"Content-Disposition",
"attachment; filename=\"kvittering.pdf\"",
)
call.respondBytes(pdfBytes, contentType = ContentType.Application.Pdf)
}

get("/kvittering/{id}") {
val id = call.parameters.getOrFail<UUID>("id")
val html = createHtmlFromTemplateData("refusjon-kvittering", "refusjon").toString()
val pdfBytes: ByteArray = createPDFA(html)
get("/{id}/tilsagn") {
val id = call.parameters.getOrFail<UUID>("id")

call.response.headers.append(
"Content-Disposition",
"attachment; filename=\"kvittering.pdf\"",
)
call.respondBytes(pdfBytes, contentType = ContentType.Application.Pdf)
val krav = refusjonskrav.get(id)
?: throw NotFoundException("Fant ikke refusjonskrav med id=$id")

when (krav.beregning) {
is RefusjonKravBeregningAft -> {
val tilsagn = tilsagnService.getArrangorflateTilsagnTilRefusjon(
gjennomforingId = krav.gjennomforing.id,
periodeStart = krav.beregning.input.periodeStart.toLocalDate(),
periodeSlutt = krav.beregning.input.periodeSlutt.toLocalDate(),
)
call.respond(tilsagn)
}
}
}
}

route("/tilsagn") {
Expand All @@ -103,7 +122,10 @@ fun Route.arrangorflateRoutes() {
val arrangorer = rettigheter.map {
arrangorService.getOrSyncArrangorFromBrreg(it.organisasjonsnummer.value)
.getOrElse {
throw StatusException(HttpStatusCode.InternalServerError, "Feil ved henting av arrangor_id")
throw StatusException(
HttpStatusCode.InternalServerError,
"Feil ved henting av arrangor_id",
)
}
}

Expand Down
Loading

0 comments on commit 75c4d9f

Please sign in to comment.