Skip to content

Commit

Permalink
Merge pull request #4530 from navikt/betalingsinformasjon-refusjonkrav
Browse files Browse the repository at this point in the history
Betalingsinformasjon refusjonkrav
  • Loading branch information
sondrele authored Oct 29, 2024
2 parents 27f7d94 + 2072d7f commit ec292f0
Show file tree
Hide file tree
Showing 19 changed files with 217 additions and 5 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package no.nav.mulighetsrommet.domain.dto

import kotlinx.serialization.Serializable

private val KID_REGEX = "^\\d{0,25}$".toRegex()

@Serializable
@JvmInline
value class Kid(val value: String) {
init {
require(KID_REGEX.matches(value)) {
"'Kid' må være på formatet '$KID_REGEX'"
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package no.nav.mulighetsrommet.domain.dto

import kotlinx.serialization.Serializable

private val KONTONUMMER_REGEX = "^\\d{11}$".toRegex()

@Serializable
@JvmInline
value class Kontonummer(val value: String) {
init {
require(KONTONUMMER_REGEX.matches(value)) {
"'Kontonummer' må være på formatet '${KONTONUMMER_REGEX}'"
}
}
}
19 changes: 19 additions & 0 deletions frontend/arrangor-flate/app/components/Definisjon.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import React from "react";

export function Definisjon({
label,
children,
className,
}: {
label: string;
className?: string;
children: React.ReactNode;
}) {
const styles = "flex justify-between";
return (
<div className={className ? `${styles} ${className}` : styles} key={label}>
<dt>{label}:</dt>
<dd className="font-bold text-right">{children}</dd>
</div>
);
}
2 changes: 2 additions & 0 deletions frontend/arrangor-flate/app/domene/domene.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import {
Betalingsinformasjon,
RefusjonKravAftBeregning,
RefusjonKravDeltakelsePeriode,
RefusjonKravDeltakelsePerson,
Expand Down Expand Up @@ -27,6 +28,7 @@ export interface Refusjonskrav {
};
beregning: RefusjonKravAftBeregning;
deltakere: Deltaker[];
betalingsinformasjon: Betalingsinformasjon;
}

export type TilsagnDetaljer = {
Expand Down
1 change: 1 addition & 0 deletions frontend/arrangor-flate/app/loaders/loadRefusjonskrav.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ export async function loadRefusjonskrav(id: string): Promise<Refusjonskrav> {
refusjonskravperiode: `${formaterDato(beregning.periodeStart)} - ${formaterDato(beregning.periodeSlutt)}`,
},
beregning,
betalingsinformasjon: krav.betalingsinformasjon,
deltakere,
};
}
12 changes: 12 additions & 0 deletions frontend/arrangor-flate/app/mocks/arrangorflateMocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,10 @@ const mockKrav: RefusjonKravAft[] = [
tiltakstype: {
navn: "Arbeidsforberedende trening",
},
betalingsinformasjon: {
kontonummer: "12345678901",
kid: "123456789",
},
gjennomforing: {
id: uuid(),
navn: "AFT tiltak Moss",
Expand Down Expand Up @@ -68,6 +72,10 @@ const mockKrav: RefusjonKravAft[] = [
tiltakstype: {
navn: "Arbeidsforberedende trening",
},
betalingsinformasjon: {
kontonummer: "12345678901",
kid: "123456789",
},
gjennomforing: {
id: uuid(),
navn: "AFT tiltak Moss",
Expand Down Expand Up @@ -129,6 +137,10 @@ const mockKrav: RefusjonKravAft[] = [
id: uuid(),
navn: "Amo tiltak Halden",
},
betalingsinformasjon: {
kontonummer: "12345678901",
kid: "123456789",
},
arrangor: {
id: uuid(),
organisasjonsnummer: "123456789",
Expand Down
33 changes: 33 additions & 0 deletions frontend/arrangor-flate/app/routes/refusjonskrav.$id.bekreft.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import { checkValidToken } from "~/auth/auth.server";
import { loadRefusjonskrav } from "~/loaders/loadRefusjonskrav";
import { ArrangorflateService, ArrangorflateTilsagn } from "@mr/api-client";
import { RefusjonskravDetaljer } from "~/components/refusjonskrav/RefusjonskravDetaljer";
import React from "react";
import { Definisjon } from "~/components/Definisjon";

type BekreftRefusjonskravData = {
krav: Refusjonskrav;
Expand Down Expand Up @@ -35,6 +37,8 @@ export const action: ActionFunction = async ({ request }) => {
const formdata = await request.formData();
const bekreftelse = formdata.get("bekreftelse");
const refusjonskravId = formdata.get("refusjonskravId");
const kontonummer = formdata.get("kontonummer");
const kid = formdata.get("kid");

if (!bekreftelse) {
return json({ error: "Du må bekrefte at opplysningene er korrekte" }, { status: 400 });
Expand All @@ -44,8 +48,16 @@ export const action: ActionFunction = async ({ request }) => {
return json({ error: "Mangler refusjonskravId" }, { status: 400 });
}

if (!kontonummer) {
return json({ error: "Mangler kontonummer" }, { status: 400 });
}

await ArrangorflateService.godkjennRefusjonskrav({
id: refusjonskravId as string,
requestBody: {
kontonummer: kontonummer as string,
kid: kid as string,
},
});

return redirect(`/refusjonskrav/${refusjonskravId}/kvittering`);
Expand All @@ -68,6 +80,27 @@ export default function BekreftRefusjonskrav() {
<RefusjonskravDetaljer krav={krav} tilsagn={tilsagn} />

<Form method="post">
<Definisjon label="Kontonummer">
<input
type="text"
name="kontonummer"
className="border border-[#0214317D] rounded-md"
defaultValue={krav.betalingsinformasjon?.kontonummer}
maxLength={11}
/>
</Definisjon>
<Definisjon label="Evt KID nr for refusjonskrav" className="my-4 flex">
<div className="flex">
<span>{krav.betalingsinformasjon.kid}</span>
<input
type="text"
name="kid"
className="border border-[#0214317D] rounded-md"
defaultValue={krav.betalingsinformasjon?.kid}
maxLength={25}
/>
</div>
</Definisjon>
<VStack gap="2" justify={"start"} align={"start"}>
<Checkbox name="bekreftelse" value="bekreftet">
Det erklæres herved at alle opplysninger er gitt i henhold til de faktiske forhold
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { Separator } from "~/components/Separator";
import { Refusjonskrav } from "~/domene/domene";
import { checkValidToken } from "~/auth/auth.server";
import { loadRefusjonskrav } from "~/loaders/loadRefusjonskrav";
import { formaterKontoNummer } from "@mr/frontend-common/utils/utils";
import { ArrangorflateService, ArrangorflateTilsagn } from "@mr/api-client";
import { RefusjonskravDetaljer } from "~/components/refusjonskrav/RefusjonskravDetaljer";

Expand Down Expand Up @@ -64,8 +65,14 @@ export default function RefusjonskravKvittering() {
<Definisjonsliste
title="Betalingsinformasjon"
definitions={[
{ key: "Kontonummer", value: "1234.56.78901" },
{ key: "KID-nummer", value: "123456701123453" },
{
key: "Kontonummer",
value: formaterKontoNummer(krav.betalingsinformasjon.kontonummer),
},
{
key: "KID-nummer",
value: krav.betalingsinformasjon.kid!,
},
{ key: "Refusjonskravansvarlig", value: "Ingvild Pettersen" },
{ key: "E-postadresse", value: "[email protected]" },
]}
Expand Down
4 changes: 4 additions & 0 deletions frontend/frontend-common/utils/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,3 +50,7 @@ export function isKursTiltak(tiltakskode?: Tiltakskode, arenaKode?: TiltakskodeA

return false;
}

export function formaterKontoNummer(kontoNummer: string): string {
return `${kontoNummer.substring(0, 4)} ${kontoNummer.substring(4, 6)} ${kontoNummer.substring(6, 11)}`;
}
Binary file removed kls_database.db
Binary file not shown.
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@ package no.nav.mulighetsrommet.api.okonomi.models

import kotlinx.serialization.Serializable
import no.nav.mulighetsrommet.api.okonomi.refusjon.RefusjonskravStatus
import no.nav.mulighetsrommet.domain.dto.Kid
import no.nav.mulighetsrommet.domain.dto.Kontonummer
import no.nav.mulighetsrommet.domain.dto.Organisasjonsnummer
import no.nav.mulighetsrommet.domain.serializers.LocalDateTimeSerializer
import no.nav.mulighetsrommet.domain.serializers.UUIDSerializer
Expand All @@ -19,6 +21,7 @@ data class RefusjonskravDto(
val gjennomforing: Gjennomforing,
val arrangor: Arrangor,
val beregning: RefusjonKravBeregning,
val betalingsinformasjon: Betalingsinformasjon,
) {
@Serializable
data class Gjennomforing(
Expand All @@ -40,4 +43,11 @@ data class RefusjonskravDto(
data class Tiltakstype(
val navn: String,
)

@Serializable
data class Betalingsinformasjon(
val kontonummer: Kontonummer?,
val kid: Kid?,

)
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.auth.*
import io.ktor.server.plugins.*
import io.ktor.server.request.receive
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.util.*
Expand All @@ -17,6 +18,8 @@ import no.nav.mulighetsrommet.api.okonomi.tilsagn.TilsagnService
import no.nav.mulighetsrommet.api.plugins.ArrangorflatePrincipal
import no.nav.mulighetsrommet.api.repositories.DeltakerRepository
import no.nav.mulighetsrommet.api.services.ArrangorService
import no.nav.mulighetsrommet.domain.dto.Kid
import no.nav.mulighetsrommet.domain.dto.Kontonummer
import no.nav.mulighetsrommet.domain.dto.NorskIdent
import no.nav.mulighetsrommet.domain.dto.Organisasjonsnummer
import no.nav.mulighetsrommet.domain.serializers.LocalDateSerializer
Expand Down Expand Up @@ -93,8 +96,14 @@ fun Route.arrangorflateRoutes() {
val krav = refusjonskrav.get(id)
?: throw NotFoundException("Fant ikke refusjonskrav med id=$id")
requireTilgangHosArrangor(krav.arrangor.organisasjonsnummer)
val request = call.receive<SetRefusjonKravBetalingsinformasjonRequest>()

refusjonskrav.setGodkjentAvArrangor(id, LocalDateTime.now())
refusjonskrav.setBetalingsInformasjon(
id,
request.kontonummer,
request.kid,
)

call.respond(HttpStatusCode.OK)
}
Expand Down Expand Up @@ -198,6 +207,7 @@ fun toRefusjonKravOppsummering(
antallManedsverk = antallManedsverk,
belop = beregning.output.belop,
),
betalingsinformasjon = krav.betalingsinformasjon,
)
}
}
Expand All @@ -214,6 +224,7 @@ data class RefusjonKravAft(
val arrangor: RefusjonskravDto.Arrangor,
val deltakelser: List<RefusjonKravDeltakelse>,
val beregning: Beregning,
val betalingsinformasjon: RefusjonskravDto.Betalingsinformasjon,
) {
@Serializable
data class Beregning(
Expand Down Expand Up @@ -245,3 +256,9 @@ data class RefusjonKravDeltakelse(
val navn: String,
)
}

@Serializable
data class SetRefusjonKravBetalingsinformasjonRequest(
val kontonummer: Kontonummer,
val kid: Kid?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,8 @@ class RefusjonService(
fristForGodkjenning = frist,
gjennomforingId = gjennomforingId,
beregning = beregning,
kontonummer = null,
kid = null,
)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package no.nav.mulighetsrommet.api.okonomi.refusjon

import no.nav.mulighetsrommet.api.okonomi.models.RefusjonKravBeregning
import no.nav.mulighetsrommet.domain.dto.Kid
import no.nav.mulighetsrommet.domain.dto.Kontonummer
import java.time.LocalDateTime
import java.util.*

Expand All @@ -9,4 +11,6 @@ data class RefusjonskravDbo(
val gjennomforingId: UUID,
val fristForGodkjenning: LocalDateTime,
val beregning: RefusjonKravBeregning,
val kontonummer: Kontonummer?,
val kid: Kid?,
)
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import no.nav.mulighetsrommet.api.okonomi.models.RefusjonKravBeregning
import no.nav.mulighetsrommet.api.okonomi.models.RefusjonKravBeregningAft
import no.nav.mulighetsrommet.api.okonomi.models.RefusjonskravDto
import no.nav.mulighetsrommet.database.Database
import no.nav.mulighetsrommet.domain.dto.Kid
import no.nav.mulighetsrommet.domain.dto.Kontonummer
import no.nav.mulighetsrommet.domain.dto.Organisasjonsnummer
import org.intellij.lang.annotations.Language
import java.time.LocalDateTime
Expand All @@ -22,17 +24,21 @@ class RefusjonskravRepository(private val db: Database) {
fun upsert(dbo: RefusjonskravDbo, tx: TransactionalSession) {
@Language("PostgreSQL")
val refusjonskravQuery = """
insert into refusjonskrav (id, gjennomforing_id, frist_for_godkjenning)
values (:id::uuid, :gjennomforing_id::uuid, :frist_for_godkjenning)
insert into refusjonskrav (id, gjennomforing_id, frist_for_godkjenning, kontonummer, kid)
values (:id::uuid, :gjennomforing_id::uuid, :frist_for_godkjenning, :kontonummer, :kid)
on conflict (id) do update set
gjennomforing_id = excluded.gjennomforing_id,
frist_for_godkjenning = excluded.frist_for_godkjenning
frist_for_godkjenning = excluded.frist_for_godkjenning,
kontonummer = excluded.kontonummer,
kid = excluded.kid
""".trimIndent()

val params = mapOf(
"id" to dbo.id,
"gjennomforing_id" to dbo.gjennomforingId,
"frist_for_godkjenning" to dbo.fristForGodkjenning,
"kontonummer" to dbo.kontonummer?.value,
"kid" to dbo.kid?.value,
)

queryOf(refusjonskravQuery, params).asExecute.runWithSession(tx)
Expand Down Expand Up @@ -132,6 +138,26 @@ class RefusjonskravRepository(private val db: Database) {
.let { db.run(it) }
}

fun setBetalingsInformasjon(id: UUID, kontonummer: Kontonummer, kid: Kid?) {
@Language("PostgreSQL")
val query = """
update refusjonskrav
set kontonummer = :kontonummer, kid = :kid
where id = :id::uuid
""".trimIndent()

queryOf(
query,
mapOf(
"id" to id,
"kontonummer" to kontonummer.value,
"kid" to kid?.value,
),
)
.asUpdate
.let { db.run(it) }
}

fun get(id: UUID) = db.transaction { get(id, it) }

fun get(id: UUID, tx: Session): RefusjonskravDto? {
Expand Down Expand Up @@ -219,6 +245,10 @@ class RefusjonskravRepository(private val db: Database) {
navn = string("tiltakstype_navn"),
),
beregning = beregning,
betalingsinformasjon = RefusjonskravDto.Betalingsinformasjon(
kontonummer = stringOrNull("kontonummer")?.let { Kontonummer(it) },
kid = stringOrNull("kid")?.let { Kid(it) },
),
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ select refusjonskrav.id,
else 'KLAR_FOR_GODKJENNING'
end::refusjonskrav_status as status,
refusjonskrav.frist_for_godkjenning,
refusjonskrav.kontonummer,
refusjonskrav.kid,
gjennomforing.id as gjennomforing_id,
gjennomforing.navn as gjennomforing_navn,
arrangor.id as arrangor_id,
Expand Down
Loading

0 comments on commit ec292f0

Please sign in to comment.