Skip to content

Commit

Permalink
Flytt oppgaveinspisering fra hm-soknadsbehandling
Browse files Browse the repository at this point in the history
  • Loading branch information
olesls committed Feb 19, 2024
1 parent ced73bb commit d008a69
Show file tree
Hide file tree
Showing 7 changed files with 89 additions and 40 deletions.
2 changes: 2 additions & 0 deletions src/main/kotlin/no/nav/hjelpemidler/soknad/db/Application.kt
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,8 @@ fun Application.module() {
val tokendingsService = TokendingsServiceBuilder.buildTokendingsService()
val rolleService = RolleService(RolleClient(tokendingsService))

Oppgaveinspektør(søknadStore)

authentication {
azure { }
tokenX { }
Expand Down
83 changes: 83 additions & 0 deletions src/main/kotlin/no/nav/hjelpemidler/soknad/db/Oppgaveinspektør.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package no.nav.hjelpemidler.soknad.db

import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import mu.KLogger
import mu.KotlinLogging
import no.nav.hjelpemidler.http.slack.slack
import no.nav.hjelpemidler.http.slack.slackIconEmoji
import no.nav.hjelpemidler.soknad.db.db.SøknadStore
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZoneId
import java.util.Date
import java.util.Timer
import java.util.concurrent.TimeUnit
import kotlin.concurrent.timerTask

private val logger: KLogger = KotlinLogging.logger {}

private val MINIMUM_DAGER = 2

internal class Oppgaveinspektør(
private valknadStore: SøknadStore,
startTime: Date = midnatt(),
) {

init {
Timer("SaksflytInspektør", true).schedule(
timerTask {
runBlocking {
launch {
rapporterBehovsmeldingerSomManglerOppgave(søknadStore)
}
}
},
startTime,
TimeUnit.DAYS.toMillis(1)
)
}

/*
Dette er saker som har stoppet opp pga manglende verdier i innsendingen.
Feilen skal ha blitt rettet, og formidler har blitt informert om at de må sende inn på nytt.
Det må vurderes konsekvens av å slette disse fra systemet dersom vi evt. skal gjøre det.
F.eks.: Er sakene synlig for bruker?
*/
private val ignoreList = listOf("bdd3b385-9add-4317-bf82-d8df0e6974e0", "ae15f3a2-f74b-4465-a636-7f527c98d0a0")

private suspend fun rapporterBehovsmeldingerSomManglerOppgave(søknadStore: SøknadStore) {
logger.info { "Sjekk om det finnes behovsmeldinger som mangler oppgave..." }
try {
val godkjenteSøknaderUtenOppgave = søknadStore.hentGodkjenteSoknaderUtenOppgaveEldreEnn(MINIMUM_DAGER)
.filter { it !in ignoreList }

if (godkjenteSøknaderUtenOppgave.isEmpty()) return

val message = """
Det finnes ${godkjenteSøknaderUtenOppgave.size} godkjente søknader uten oppgave som er eldre enn $MINIMUM_DAGER dager.
Undersøk hvorfor disse har stoppet opp i systemet.
søknads-IDer (max 10): ${godkjenteSøknaderUtenOppgave.take(10).joinToString()}
""".trimIndent()

if (Configuration.application.profile == Profile.PROD) {
slack().sendMessage(
username = "hm-soknadsbehandling-db",
icon = slackIconEmoji(":this-is-fine-fire:"),
channel = "#digihot-alerts",
message = message,
)
}

logger.error { message }
} catch (e: Exception) {
logger.error(e) { "Feil under rapportering av godkjente søknader som mangler oppgave." }
}
}
}

private fun midnatt() = LocalDate.now().plusDays(1).atStartOfDay().toDate()

private fun LocalDateTime.toDate(): Date {
return Date.from(this.atZone(ZoneId.systemDefault()).toInstant())
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ object HjelpemiddeldatabaseClient {
old.produktbeskrivelse != new.attributes.text ||
old.isotittel != new.isoCategoryTitle ||
old.blobUrlLite != null &&
new.media.find { it.type == MediaType.IMAGE && it.priority == 1 } == null
new.media.find { it.type == MediaType.IMAGE && it.priority == 1 } == null
) {
unexpectedDataHmsnrs[old.hmsnr] = Pair(old.toString(), new.toString())
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -624,9 +624,9 @@ internal class SøknadStorePostgres(private val ds: DataSource) : SøknadStore {
SELECT ID FROM V1_STATUS WHERE SOKNADS_ID = soknad.SOKNADS_ID ORDER BY created DESC LIMIT 1
)
WHERE status.STATUS IN (?, ?, ?)
AND (soknad.CREATED + interval '$dager day') < now()
AND soknad.oppgaveid IS NULL
AND soknad.created > '2021-04-13' -- OPPGAVEID kolonnen ble lagt til 2021-04-12. Alt før dette har OPPGAVEID == NULL
AND soknad.CREATED < now() - INTERVAL '$dager DAYS' -- Buffer for saksbehanling etc.
AND soknad.created > now() - INTERVAL '90 DAYS' -- OPPGAVEID kolonnen ble lagt til 2021-04-12. Alt før dette har OPPGAVEID == NULL
"""

return time("godkjente_soknader_uten_oppgave") {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,4 +151,4 @@ private fun midnatt() = LocalDate.now().plusDays(1).atStartOfDay().toDate()

private fun LocalDateTime.toDate(): Date {
return Date.from(this.atZone(ZoneId.systemDefault()).toInstant())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -491,21 +491,6 @@ internal fun Route.azureAdRoutes(
}
}

get("/soknad/godkjentUtenOppgave/{dager}") {
val dager = call.parameters["dager"]?.toInt() ?: throw RuntimeException("Parameter 'dager' var ugyldig")

try {
val godkjenteSoknaderUtenOppgave = søknadStore.hentGodkjenteSoknaderUtenOppgaveEldreEnn(dager)
call.respond(godkjenteSoknaderUtenOppgave)
} catch (e: Exception) {
logger.error(e) { "Error on fetching godkjente søknader uten oppgave" }
call.respond(
HttpStatusCode.InternalServerError,
"Feil ved henting av godkjente søknader uten oppgave: ${e.message}"
)
}
}

put("/soknad/journalpost-id/{soknadsId}") {
try {
val soknadsId = UUID.fromString(soknadsId())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -369,27 +369,6 @@ internal class SøknadStorePostgresTest {
}
}

@Test
fun `hentGodkjenteSoknaderUtenOppgaveEldreEnn() skal ikke returnere søknader opprettet før 2021-04-12`() {
withMigratedDb {

val id = UUID.randomUUID()

SøknadStorePostgres(DataSource.instance).apply {
this.save(mockSøknad(id, Status.GODKJENT))

val session = sessionOf(DataSource.instance)
session.run(queryOf("UPDATE V1_SOKNAD SET CREATED = '2021-04-14' WHERE SOKNADS_ID = '$id' ").asExecute)
this.hentGodkjenteSoknaderUtenOppgaveEldreEnn(2)
.also { it.size shouldBe 1 }

session.run(queryOf("UPDATE V1_SOKNAD SET CREATED = '2021-04-12' WHERE SOKNADS_ID = '$id' ").asExecute)
this.hentGodkjenteSoknaderUtenOppgaveEldreEnn(2)
.also { it.size shouldBe 0 }
}
}
}

@Test
fun `Oppdater oppgaveId og ikke overskriv eksisterende oppgaveId`() {
val id = UUID.randomUUID()
Expand Down

0 comments on commit d008a69

Please sign in to comment.