Skip to content

Commit

Permalink
Merge pull request #4664 from navikt/refactor/forenkle-frikoble-konta…
Browse files Browse the repository at this point in the history
…ktperson

Refactor/forenkle frikoble kontaktperson
  • Loading branch information
sondrele authored Nov 21, 2024
2 parents 4b5dab5 + bf01859 commit 9db3faf
Show file tree
Hide file tree
Showing 6 changed files with 96 additions and 116 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package no.nav.mulighetsrommet.domain.dto

import kotlinx.serialization.Serializable
import no.nav.mulighetsrommet.domain.dbo.Avslutningsstatus
import no.nav.mulighetsrommet.domain.serializers.AvbruttAarsakSerializer
import no.nav.mulighetsrommet.domain.serializers.LocalDateTimeSerializer
import java.time.LocalDateTime
Expand All @@ -18,14 +17,7 @@ enum class TiltaksgjennomforingStatus {
data class TiltaksgjennomforingStatusDto(
val status: TiltaksgjennomforingStatus,
val avbrutt: AvbruttDto?,
) {
fun toAvslutningsstatus(): Avslutningsstatus = when (status) {
TiltaksgjennomforingStatus.PLANLAGT, TiltaksgjennomforingStatus.GJENNOMFORES -> Avslutningsstatus.IKKE_AVSLUTTET
TiltaksgjennomforingStatus.AVSLUTTET -> Avslutningsstatus.AVSLUTTET
TiltaksgjennomforingStatus.AVBRUTT -> Avslutningsstatus.AVBRUTT
TiltaksgjennomforingStatus.AVLYST -> Avslutningsstatus.AVLYST
}
}
)

@Serializable
data class AvbruttDto(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,10 @@
package no.nav.mulighetsrommet.api.gjennomforing

import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
import io.ktor.server.util.*
import io.ktor.util.pipeline.*
import kotlinx.serialization.Serializable
import no.nav.mulighetsrommet.api.domain.dto.FrikobleKontaktpersonRequest
import no.nav.mulighetsrommet.api.gjennomforing.db.TiltaksgjennomforingDbo
Expand All @@ -17,7 +15,9 @@ import no.nav.mulighetsrommet.api.plugins.authenticate
import no.nav.mulighetsrommet.api.plugins.getNavIdent
import no.nav.mulighetsrommet.api.refusjon.db.DeltakerRepository
import no.nav.mulighetsrommet.api.responses.BadRequest
import no.nav.mulighetsrommet.api.responses.ServerError
import no.nav.mulighetsrommet.api.responses.respondWithStatusResponse
import no.nav.mulighetsrommet.api.responses.respondWithStatusResponseError
import no.nav.mulighetsrommet.api.services.ExcelService
import no.nav.mulighetsrommet.domain.dbo.TiltaksgjennomforingOppstartstype
import no.nav.mulighetsrommet.domain.dto.*
Expand Down Expand Up @@ -88,13 +88,21 @@ fun Route.tiltaksgjennomforingRoutes() {
delete("kontaktperson") {
val request = call.receive<FrikobleKontaktpersonRequest>()
val navIdent = getNavIdent()
call.respondWithStatusResponse(
try {
service.frikobleKontaktpersonFraGjennomforing(
kontaktpersonId = request.kontaktpersonId,
gjennomforingId = request.dokumentId,
navIdent = navIdent,
),
)
)
} catch (e: Throwable) {
application.environment.log.error(
"Klarte ikke fjerne kontaktperson fra gjennomføring: $request",
e,
)
call.respondWithStatusResponseError(
ServerError("Klarte ikke fjerne kontaktperson fra gjennomføringen"),
)
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ import no.nav.mulighetsrommet.domain.dto.TiltaksgjennomforingEksternV1Dto
import no.nav.mulighetsrommet.notifications.NotificationRepository
import no.nav.mulighetsrommet.notifications.NotificationType
import no.nav.mulighetsrommet.notifications.ScheduledNotification
import org.slf4j.LoggerFactory
import java.time.Instant
import java.time.LocalDate
import java.time.LocalDateTime
Expand All @@ -44,8 +43,6 @@ class TiltaksgjennomforingService(
private val navAnsattService: NavAnsattService,
private val db: Database,
) {
private val logger = LoggerFactory.getLogger(javaClass)

suspend fun upsert(
request: TiltaksgjennomforingRequest,
navIdent: NavIdent,
Expand Down Expand Up @@ -224,6 +221,26 @@ class TiltaksgjennomforingService(
return documentHistoryService.getEndringshistorikk(DocumentClass.TILTAKSGJENNOMFORING, id)
}

fun frikobleKontaktpersonFraGjennomforing(
kontaktpersonId: UUID,
gjennomforingId: UUID,
navIdent: NavIdent,
): Unit = db.transaction { tx ->
tiltaksgjennomforinger.frikobleKontaktpersonFraGjennomforing(
tx = tx,
kontaktpersonId = kontaktpersonId,
gjennomforingId = gjennomforingId,
)

val gjennomforing = getOrError(gjennomforingId, tx)
logEndring(
"Kontaktperson ble fjernet fra gjennomføringen via arrangørsidene",
gjennomforing,
EndretAv.NavAnsatt(navIdent),
tx,
)
}

private fun getOrError(id: UUID, tx: TransactionalSession): TiltaksgjennomforingDto {
val gjennomforing = tiltaksgjennomforinger.get(id, tx)
return requireNotNull(gjennomforing) { "Gjennomføringen med id=$id finnes ikke" }
Expand Down Expand Up @@ -266,33 +283,4 @@ class TiltaksgjennomforingService(
Json.encodeToJsonElement(dto)
}
}

fun frikobleKontaktpersonFraGjennomforing(
kontaktpersonId: UUID,
gjennomforingId: UUID,
navIdent: NavIdent,
): Either<StatusResponseError, String> {
val gjennomforing =
tiltaksgjennomforinger.get(gjennomforingId)
?: return Either.Left(NotFound("Gjennomføringen finnes ikke"))

return db.transaction { tx ->
tiltaksgjennomforinger.frikobleKontaktpersonFraGjennomforing(
kontaktpersonId = kontaktpersonId,
gjennomforingId = gjennomforingId,
tx = tx,
).map {
logEndring(
"Kontaktperson ble fjernet fra gjennomføringen via arrangørsidene",
gjennomforing,
EndretAv.NavAnsatt(navIdent),
tx,
)
it
}.mapLeft {
logger.error("Klarte ikke fjerne kontaktperson fra gjennomføring: KontaktpersonId = '$kontaktpersonId', gjennomforingId = '$gjennomforingId'")
ServerError("Klarte ikke fjerne kontaktperson fra gjennomføringen")
}
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package no.nav.mulighetsrommet.api.gjennomforing.db

import arrow.core.Either
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotliquery.Row
Expand All @@ -17,7 +16,6 @@ import no.nav.mulighetsrommet.api.navenhet.db.ArenaNavEnhet
import no.nav.mulighetsrommet.api.navenhet.db.NavEnhetDbo
import no.nav.mulighetsrommet.api.navenhet.db.NavEnhetStatus
import no.nav.mulighetsrommet.api.refusjon.model.RefusjonskravPeriode
import no.nav.mulighetsrommet.api.responses.StatusResponseError
import no.nav.mulighetsrommet.database.Database
import no.nav.mulighetsrommet.database.utils.DatabaseUtils.toFTSPrefixQuery
import no.nav.mulighetsrommet.database.utils.PaginatedResult
Expand Down Expand Up @@ -568,6 +566,21 @@ class TiltaksgjennomforingRepository(private val db: Database) {
return tx.run(queryOf(query, mapOf("id" to id, "tidspunkt" to tidspunkt, "aarsak" to aarsak.name)).asUpdate)
}

fun frikobleKontaktpersonFraGjennomforing(
kontaktpersonId: UUID,
gjennomforingId: UUID,
tx: Session,
) {
@Language("PostgreSQL")
val query = """
delete
from tiltaksgjennomforing_arrangor_kontaktperson
where arrangor_kontaktperson_id = ?::uuid and tiltaksgjennomforing_id = ?::uuid
""".trimIndent()

queryOf(query, kontaktpersonId, gjennomforingId).asUpdate.runWithSession(tx)
}

private fun TiltaksgjennomforingDbo.toSqlParameters() = mapOf(
"opphav" to ArenaMigrering.Opphav.MR_ADMIN_FLATE.name,
"id" to id,
Expand Down Expand Up @@ -682,22 +695,4 @@ class TiltaksgjennomforingRepository(private val db: Database) {
utdanningslop = utdanningslop,
)
}

fun frikobleKontaktpersonFraGjennomforing(
kontaktpersonId: UUID,
gjennomforingId: UUID,
tx: Session,
): Either<StatusResponseError, String> {
@Language("PostgreSQL")
val query = """
delete from tiltaksgjennomforing_arrangor_kontaktperson
where arrangor_kontaktperson_id = ?::uuid and tiltaksgjennomforing_id = ?::uuid
""".trimIndent()

queryOf(query, kontaktpersonId, gjennomforingId)
.asUpdate
.let { tx.run(it) }

return Either.Right(kontaktpersonId.toString())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package no.nav.mulighetsrommet.api.fixtures
import io.kotest.assertions.arrow.core.shouldBeRight
import no.nav.mulighetsrommet.api.arrangor.db.ArrangorRepository
import no.nav.mulighetsrommet.api.arrangor.model.ArrangorDto
import no.nav.mulighetsrommet.api.arrangor.model.ArrangorKontaktperson
import no.nav.mulighetsrommet.api.avtale.db.AvtaleDbo
import no.nav.mulighetsrommet.api.avtale.db.AvtaleRepository
import no.nav.mulighetsrommet.api.gjennomforing.db.TiltaksgjennomforingDbo
Expand All @@ -27,6 +28,7 @@ data class MulighetsrommetTestDomain(
ArrangorFixtures.underenhet1,
ArrangorFixtures.underenhet2,
),
val arrangorKontaktpersoner: List<ArrangorKontaktperson> = listOf(),
val tiltakstyper: List<TiltakstypeDbo> = listOf(
TiltakstypeFixtures.Oppfolging,
TiltakstypeFixtures.Arbeidstrening,
Expand Down Expand Up @@ -58,6 +60,7 @@ data class MulighetsrommetTestDomain(

ArrangorRepository(database).also { repository ->
arrangorer.forEach { repository.upsert(it) }
arrangorKontaktpersoner.forEach { repository.upsertKontaktperson(it) }
}

TiltakstypeRepository(database).also { repository ->
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import io.kotest.matchers.shouldBe
import io.kotest.matchers.shouldNotBe
import kotlinx.serialization.json.Json
import kotliquery.Query
import kotliquery.queryOf
import no.nav.mulighetsrommet.api.arrangor.db.ArrangorRepository
import no.nav.mulighetsrommet.api.arrangor.model.ArrangorKontaktperson
import no.nav.mulighetsrommet.api.clients.norg2.Norg2Type
Expand All @@ -38,7 +37,6 @@ import no.nav.mulighetsrommet.domain.Tiltakskode
import no.nav.mulighetsrommet.domain.constants.ArenaMigrering
import no.nav.mulighetsrommet.domain.dbo.TiltaksgjennomforingOppstartstype
import no.nav.mulighetsrommet.domain.dto.*
import org.intellij.lang.annotations.Language
import java.time.LocalDate
import java.time.LocalDateTime
import java.util.*
Expand Down Expand Up @@ -757,64 +755,60 @@ class TiltaksgjennomforingRepositoryTest : FunSpec({
}

context("Frikoble kontaktperson fra arrangør") {
// Add some data to tiltaksgjennomforing_arrangor_kontaktperson-table
val kontaktperson1 = ArrangorKontaktperson(
id = UUID.randomUUID(),
arrangorId = ArrangorFixtures.underenhet1.id,
navn = "Aran Goran",
telefon = "",
epost = "[email protected]",
beskrivelse = "",
)

val kontaktperson2 = ArrangorKontaktperson(
id = UUID.randomUUID(),
arrangorId = ArrangorFixtures.underenhet1.id,
navn = "Gibli Bobli",
telefon = "",
epost = "[email protected]",
beskrivelse = "",
)

val testDomain = MulighetsrommetTestDomain(
arrangorKontaktpersoner = listOf(kontaktperson1, kontaktperson2),
tiltakstyper = listOf(TiltakstypeFixtures.Oppfolging),
avtaler = listOf(AvtaleFixtures.oppfolging),
gjennomforinger = listOf(
Oppfolging1.copy(arrangorKontaktpersoner = listOf(kontaktperson1.id)),
Oppfolging2.copy(arrangorKontaktpersoner = listOf(kontaktperson2.id)),
),
)

val tiltaksgjennomforinger = TiltaksgjennomforingRepository(database.db)
test("Skal fjerne kontaktperson fra koblingstabell") {
tiltaksgjennomforinger.upsert(Oppfolging1)
tiltaksgjennomforinger.upsert(Oppfolging2)

val arrangorKontaktperson = ArrangorKontaktperson(
id = UUID.randomUUID(),
arrangorId = ArrangorFixtures.underenhet1.id,
navn = "Aran Goran",
telefon = "",
epost = "[email protected]",
beskrivelse = "",
)
test("Skal fjerne kontaktperson fra koblingstabell") {
testDomain.initialize(database.db)

val arrangorKontaktperson2 = ArrangorKontaktperson(
id = UUID.randomUUID(),
arrangorId = ArrangorFixtures.underenhet1.id,
navn = "Gibli Bobli",
telefon = "",
epost = "[email protected]",
beskrivelse = "",
)
tiltaksgjennomforinger.get(testDomain.gjennomforinger[0].id).shouldNotBeNull().should {
it.arrangor.kontaktpersoner.first().id.shouldBe(kontaktperson1.id)
}
tiltaksgjennomforinger.get(testDomain.gjennomforinger[1].id).shouldNotBeNull().should {
it.arrangor.kontaktpersoner.first().id.shouldBe(kontaktperson2.id)
}

@Language("PostgreSQL")
val upsertKontaktpersonerQuery = """
insert into arrangor_kontaktperson(id, navn, telefon, epost, beskrivelse, arrangor_id) values
('${arrangorKontaktperson.id}', '${arrangorKontaktperson.navn}', '${arrangorKontaktperson.telefon}', '${arrangorKontaktperson.epost}', '${arrangorKontaktperson.beskrivelse}', '${arrangorKontaktperson.arrangorId}'),
('${arrangorKontaktperson2.id}', '${arrangorKontaktperson2.navn}', '${arrangorKontaktperson2.telefon}', '${arrangorKontaktperson2.epost}', '${arrangorKontaktperson2.beskrivelse}', '${arrangorKontaktperson2.arrangorId}')
""".trimIndent()
queryOf(upsertKontaktpersonerQuery).asExecute.let { database.db.run(it) }

@Language("PostgreSQL")
val upsertQuery = """
insert into tiltaksgjennomforing_arrangor_kontaktperson(arrangor_kontaktperson_id, tiltaksgjennomforing_id) values
('${arrangorKontaktperson.id}', '${Oppfolging1.id}'),
('${arrangorKontaktperson2.id}', '${Oppfolging2.id}')
""".trimIndent()
queryOf(upsertQuery).asExecute.let { database.db.run(it) }

@Language("PostgreSQL")
val selectQuery = """
select arrangor_kontaktperson_id from tiltaksgjennomforing_arrangor_kontaktperson
""".trimIndent()

val results =
queryOf(selectQuery).map { it.uuid("arrangor_kontaktperson_id") }.asList.let { database.db.run(it) }
results.size shouldBe 2
database.db.transaction { tx ->
tiltaksgjennomforinger.frikobleKontaktpersonFraGjennomforing(
arrangorKontaktperson.id,
kontaktperson1.id,
Oppfolging1.id,
tx,
)
}
val resultsAfterFrikobling =
queryOf(selectQuery).map { it.uuid("arrangor_kontaktperson_id") }.asList.let { database.db.run(it) }
resultsAfterFrikobling.size shouldBe 1

tiltaksgjennomforinger.get(testDomain.gjennomforinger[0].id).shouldNotBeNull().should {
it.arrangor.kontaktpersoner.shouldBeEmpty()
}
tiltaksgjennomforinger.get(testDomain.gjennomforinger[1].id).shouldNotBeNull().should {
it.arrangor.kontaktpersoner.first().id.shouldBe(kontaktperson2.id)
}
}
}
})

0 comments on commit 9db3faf

Please sign in to comment.