Skip to content

Commit

Permalink
Lagt endepunkt for å hente sykefraværsstatistikk næring
Browse files Browse the repository at this point in the history
Co-authored-by: Per-Christian Nielsen <per-christian.nielsen@nav.no>
Co-authored-by: Christian Klem <christian.klem@nav.no>
  • Loading branch information
3 people committed Sep 14, 2023
1 parent e8afc08 commit bfe59a2
Show file tree
Hide file tree
Showing 7 changed files with 144 additions and 43 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder
import com.google.gson.reflect.TypeToken
import kotliquery.*
import no.nav.lydia.sykefraversstatistikk.api.Periode
import no.nav.lydia.sykefraversstatistikk.domene.BransjeSykefraværsstatistikk
import no.nav.lydia.sykefraversstatistikk.domene.NæringSykefraværsstatistikk
import no.nav.lydia.sykefraversstatistikk.import.*
import no.nav.lydia.sykefraversstatistikk.import.SykefraversstatistikkPerKategoriImportDto.Companion.tilBehandletBransjeSykefraværsstatistikk
Expand All @@ -18,6 +19,42 @@ import javax.sql.DataSource
class SykefraversstatistikkRepository(val dataSource: DataSource) {
private val gson: Gson = GsonBuilder().create()

private fun felterTilSykefraværsprosent(prefix: String) = """
${prefix}.tapte_dagsverk as ${prefix}_tapte_dagsverk,
${prefix}.mulige_dagsverk as ${prefix}_mulige_dagsverk,
${prefix}.prosent as ${prefix}_prosent,
${prefix}.maskert as ${prefix}_maskert,
""".trimIndent()

fun hentBransjeSykefraværsstatistikk(
bransje: String,
gjeldendePeriode: Periode
): BransjeSykefraværsstatistikk? =
using(sessionOf(dataSource)) { session ->
val query = queryOf(
statement = """
SELECT
siste_kvartal.bransje as siste_kvartal_bransje,
siste_kvartal.arstall as siste_kvartal_arstall,
siste_kvartal.kvartal as siste_kvartal_kvartal,
siste_kvartal.antall_personer as siste_kvartal_antall_personer,
${felterTilSykefraværsprosent("siste_kvartal")}
${felterTilSykefraværsprosent("siste4")}
siste4.kvartaler as siste4_kvartaler
FROM sykefravar_statistikk_bransje AS siste_kvartal
JOIN sykefravar_statistikk_kategori_siste_4_kvartal AS siste4
ON (siste4.kategori = 'BRANSJE' AND kode = siste_kvartal.bransje )
WHERE siste_kvartal.bransje = :bransje
AND siste_kvartal.arstall = ${gjeldendePeriode.årstall}
AND siste_kvartal.kvartal = ${gjeldendePeriode.kvartal}
""".trimIndent(),
paramMap = mapOf(
"bransje" to bransje
)
).map { mapRowToBransjeSykefraværsstatistikk(it) }.asSingle
session.run(query)
}

fun hentNæringSykefraværsstatistikk(
ringskode: String,
gjeldendePeriode: Periode
Expand All @@ -30,14 +67,10 @@ class SykefraversstatistikkRepository(val dataSource: DataSource) {
siste_kvartal.arstall as siste_kvartal_arstall,
siste_kvartal.kvartal as siste_kvartal_kvartal,
siste_kvartal.antall_personer as siste_kvartal_antall_personer,
siste_kvartal.tapte_dagsverk as siste_kvartal_tapte_dagsverk,
siste_kvartal.mulige_dagsverk as siste_kvartal_mulige_dagsverk,
siste_kvartal.prosent as siste_kvartal_prosent,
siste_kvartal.maskert as siste_kvartal_maskert,
siste4.prosent as siste4_prosent,
siste4.tapte_dagsverk as siste4_tapte_dagsverk,
siste4.mulige_dagsverk as siste4_mulige_dagsverk,
siste4.maskert as siste4_maskert,
${felterTilSykefraværsprosent("siste_kvartal")}
${felterTilSykefraværsprosent("siste4")}
${felterTilSykefraværsprosent("siste_kvartal")}
${felterTilSykefraværsprosent("siste4")}
siste4.kvartaler as siste4_kvartaler
FROM sykefravar_statistikk_naring AS siste_kvartal
JOIN sykefravar_statistikk_kategori_siste_4_kvartal AS siste4
Expand All @@ -53,27 +86,6 @@ class SykefraversstatistikkRepository(val dataSource: DataSource) {
session.run(query)
}

private val kvartalListeType = object : TypeToken<List<Kvartal>>() {}.type
private fun mapRowToNæringSykefraværsstatistikk(row: Row) = NæringSykefraværsstatistikk(
næring = row.string("siste_kvartal_naring"),
sistegjeldendekvartal = SistePubliserteKvartal(
årstall = row.int("siste_kvartal_arstall"),
kvartal = row.int("siste_kvartal_kvartal"),
prosent = row.double("siste_kvartal_prosent"),
tapteDagsverk = row.double("siste_kvartal_tapte_dagsverk"),
muligeDagsverk = row.double("siste_kvartal_mulige_dagsverk"),
antallPersoner = row.int("siste_kvartal_antall_personer"),
erMaskert = row.boolean("siste_kvartal_maskert")
),
siste4Kvartal = Siste4Kvartal(
prosent = row.double("siste4_prosent"),
tapteDagsverk = row.double("siste4_tapte_dagsverk"),
muligeDagsverk = row.double("siste4_mulige_dagsverk"),
erMaskert = row.boolean("siste4_maskert"),
kvartaler = gson.fromJson(row.string("siste4_kvartaler"), kvartalListeType),
)
)

fun insertSykefraværsstatistikkForSisteGjelendeKvartalForLand(
sykefraværsstatistikk: List<SykefraversstatistikkPerKategoriImportDto>
) {
Expand Down Expand Up @@ -419,4 +431,35 @@ class SykefraversstatistikkRepository(val dataSource: DataSource) {
).asUpdate
)
}

private val kvartalListeType = object : TypeToken<List<Kvartal>>() {}.type
private fun mapRowToSiste4Kvartal(row: Row) = Siste4Kvartal(
prosent = row.double("siste4_prosent"),
tapteDagsverk = row.double("siste4_tapte_dagsverk"),
muligeDagsverk = row.double("siste4_mulige_dagsverk"),
erMaskert = row.boolean("siste4_maskert"),
kvartaler = gson.fromJson(row.string("siste4_kvartaler"), kvartalListeType)
)

private fun mapRowToSistePubliserteKvartal(row: Row) = SistePubliserteKvartal(
årstall = row.int("siste_kvartal_arstall"),
kvartal = row.int("siste_kvartal_kvartal"),
prosent = row.double("siste_kvartal_prosent"),
tapteDagsverk = row.double("siste_kvartal_tapte_dagsverk"),
muligeDagsverk = row.double("siste_kvartal_mulige_dagsverk"),
antallPersoner = row.int("siste_kvartal_antall_personer"),
erMaskert = row.boolean("siste_kvartal_maskert")
)

private fun mapRowToNæringSykefraværsstatistikk(row: Row) = NæringSykefraværsstatistikk(
næring = row.string("siste_kvartal_naring"),
sisteGjeldendeKvartal = mapRowToSistePubliserteKvartal(row),
siste4Kvartal = mapRowToSiste4Kvartal(row)
)

private fun mapRowToBransjeSykefraværsstatistikk(row: Row) = BransjeSykefraværsstatistikk(
bransje = row.string("siste_kvartal_bransje"),
sisteGjeldendeKvartal = mapRowToSistePubliserteKvartal(row),
siste4Kvartal = mapRowToSiste4Kvartal(row)
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import no.nav.lydia.sykefraversstatistikk.api.KvartalDto.Companion.toDto
import no.nav.lydia.sykefraversstatistikk.api.KvartalerFraTilDto
import no.nav.lydia.sykefraversstatistikk.api.Periode
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere
import no.nav.lydia.sykefraversstatistikk.domene.BransjeSykefraværsstatistikk
import no.nav.lydia.sykefraversstatistikk.domene.NæringSykefraværsstatistikk
import no.nav.lydia.sykefraversstatistikk.domene.VirksomhetsstatistikkSiste4Kvartal
import no.nav.lydia.sykefraversstatistikk.domene.Virksomhetsoversikt
Expand Down Expand Up @@ -163,6 +164,13 @@ class SykefraværsstatistikkService(
return hentNæringSykefraværsstatistikk?.right()
?: SykefraværsstatistikkError.`ingen sykefraværsstatistikk`.left()
}

fun hentBransjestatistikk(bransje: String): Either<Feil, BransjeSykefraværsstatistikk> {
val gjeldendePeriode = sistePubliseringService.hentGjelendePeriode()
val hentBransjeSykefraværsstatistikk = sykefraversstatistikkRepository.hentBransjeSykefraværsstatistikk(bransje, gjeldendePeriode)
return hentBransjeSykefraværsstatistikk?.right()
?: SykefraværsstatistikkError.`ingen sykefraværsstatistikk`.left()
}
}

object SykefraværsstatistikkError {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,17 @@ fun Route.sykefraversstatistikk(
}
}

get("$SYKEFRAVERSSTATISTIKK_PATH/bransje/{bransje}") {
val bransje = call.parameters["bransje"] ?: return@get call.respond(SykefraværsstatistikkError.`ugyldig bransje`)
call.somLesebruker(adGrupper = adGrupper) { _ ->
sykefraværsstatistikkService.hentBransjestatistikk(bransje)
}.map { sykefraværsstatistikk ->
call.respond(sykefraværsstatistikk)
}.mapLeft { feil ->
call.respond(status = feil.httpStatusCode, message = feil.feilmelding)
}
}

get ("$SYKEFRAVERSSTATISTIKK_PATH/$PUBLISERINGSINFO") {
call.somLesebruker(adGrupper = adGrupper) { _ ->
sistePubliseringService.hentPubliseringsinfo()
Expand Down Expand Up @@ -146,4 +157,5 @@ suspend fun hentEiere(azureService: AzureService) =
object SykefraværsstatistikkError {
val `ugyldig orgnummer` = Feil("Ugyldig orgnummer", HttpStatusCode.BadRequest)
val `ugyldig næring` = Feil("Ugyldig næring", HttpStatusCode.BadRequest)
val `ugyldig bransje` = Feil("Ugyldig bransje", HttpStatusCode.BadRequest)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package no.nav.lydia.sykefraversstatistikk.domene

import kotlinx.serialization.Serializable
import no.nav.lydia.sykefraversstatistikk.import.Siste4Kvartal
import no.nav.lydia.sykefraversstatistikk.import.SistePubliserteKvartal

@Serializable
data class BransjeSykefraværsstatistikk (
val bransje: String,
val sisteGjeldendeKvartal: SistePubliserteKvartal,
val siste4Kvartal: Siste4Kvartal,
)
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ import no.nav.lydia.sykefraversstatistikk.import.SistePubliserteKvartal
@Serializable
data class NæringSykefraværsstatistikk (
valring: String,
val sistegjeldendekvartal: SistePubliserteKvartal,
val sisteGjeldendeKvartal: SistePubliserteKvartal,
val siste4Kvartal: Siste4Kvartal,
)
Original file line number Diff line number Diff line change
Expand Up @@ -1146,13 +1146,17 @@ class SykefraversstatistikkApiTest {
Kafka.statistikkVirksomhetGroupId
)
}
fun settSykefraværsprosentNæring(næring: String, prosent: Double) {
fun settSykefraværsprosentNæring(
ring: String,
prosentSiste4Kvartal: Double,
prosentSistePubliserteKvartal: Double = 2.0
) {
val kafkaMelding = SykefraversstatistikkImportTestUtils.JsonMelding(
kategori = Kategori.NÆRING,
kode = næring,
kvartal = gjeldendePeriode.tilKvartal(),
sistePubliserteKvartal = sistePubliserteKvartal.copy(prosent = 2.0),
siste4Kvartal = siste4Kvartal.copy(prosent = prosent)
sistePubliserteKvartal = sistePubliserteKvartal.copy(prosent = prosentSistePubliserteKvartal),
siste4Kvartal = siste4Kvartal.copy(prosent = prosentSiste4Kvartal)
)

TestContainerHelper.kafkaContainerHelper.sendOgVentTilKonsumert(
Expand All @@ -1163,13 +1167,17 @@ class SykefraversstatistikkApiTest {
)
}

fun settSykefraværsprosentBransje(bransje: Bransjer, prosent: Double) {
fun settSykefraværsprosentBransje(
bransje: Bransjer,
prosentSiste4Kvartal: Double,
prosentSistePubliserteKvartal: Double = 2.0
) {
val kafkaMelding = SykefraversstatistikkImportTestUtils.JsonMelding(
kategori = Kategori.BRANSJE,
kode = bransje.name.uppercase(),
kvartal = SykefraversstatistikkImportTestUtils.KVARTAL_2023_1,
sistePubliserteKvartal = sistePubliserteKvartal.copy(prosent = 2.0),
siste4Kvartal = siste4Kvartal.copy(prosent = prosent)
kvartal = gjeldendePeriode.tilKvartal(),
sistePubliserteKvartal = sistePubliserteKvartal.copy(prosent = prosentSistePubliserteKvartal),
siste4Kvartal = siste4Kvartal.copy(prosent = prosentSiste4Kvartal)
)

TestContainerHelper.kafkaContainerHelper.sendOgVentTilKonsumert(
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package no.nav.lydia.container.sykefraversstatistikk

import com.github.kittinunf.fuel.core.extensions.authentication
import ia.felles.definisjoner.bransjer.Bransjer.TRANSPORT
import io.kotest.matchers.shouldBe
import no.nav.lydia.helper.StatistikkHelper
import no.nav.lydia.helper.TestContainerHelper
Expand All @@ -12,6 +13,7 @@ import no.nav.lydia.helper.VirksomhetHelper
import no.nav.lydia.helper.tilSingelRespons
import no.nav.lydia.sykefraversstatistikk.api.Periode
import no.nav.lydia.sykefraversstatistikk.api.SYKEFRAVERSSTATISTIKK_PATH
import no.nav.lydia.sykefraversstatistikk.domene.BransjeSykefraværsstatistikk
import no.nav.lydia.sykefraversstatistikk.domene.NæringSykefraværsstatistikk
import kotlin.test.Test
import kotlin.test.fail
Expand All @@ -20,25 +22,41 @@ class SykefraversstatistikkVirksomhetApiTest {

@Test
fun `skal hente sykefraværsstatistikk for næring`(){
// lager statistikk til en næring .....
SykefraversstatistikkApiTest.settSykefraværsprosentNæring(NÆRING_JORDBRUK, 4.5)

// kalle nytt endepunkt
val result = TestContainerHelper.lydiaApiContainer.performGet("$SYKEFRAVERSSTATISTIKK_PATH/naring/${NÆRING_JORDBRUK}")
.authentication().bearer(TestContainerHelper.oauth2ServerContainer.saksbehandler1.token)
.tilSingelRespons<NæringSykefraværsstatistikk>()

// sjekk at vi får de statistikkene som forventet
result.second.statusCode shouldBe 200
val næringstatistikk: NæringSykefraværsstatistikk = result.third
.fold(success = { response -> response }, failure = { fail(it.message) })
næringstatistikk.næring shouldBe NÆRING_JORDBRUK
næringstatistikk.siste4Kvartal.prosent shouldBe 4.5
næringstatistikk.siste4Kvartal.kvartaler.size shouldBe 1
næringstatistikk.siste4Kvartal.erMaskert shouldBe false
næringstatistikk.siste4Kvartal.prosent shouldBe 4.5
næringstatistikk.sistegjeldendekvartal.erMaskert shouldBe false
næringstatistikk.sistegjeldendekvartal.prosent shouldBe 2.0
næringstatistikk.sisteGjeldendeKvartal.erMaskert shouldBe false
næringstatistikk.sisteGjeldendeKvartal.prosent shouldBe 2.0
}

@Test
fun `skal hente sykefraværsstatistikk for bransje`(){
SykefraversstatistikkApiTest.settSykefraværsprosentBransje(TRANSPORT, 9.9, 8.7)

val url = "$SYKEFRAVERSSTATISTIKK_PATH/bransje/${TRANSPORT.name}"
val result = TestContainerHelper.lydiaApiContainer.performGet(url)
.authentication().bearer(TestContainerHelper.oauth2ServerContainer.saksbehandler1.token)
.tilSingelRespons<BransjeSykefraværsstatistikk>()

result.second.statusCode shouldBe 200
val bransjestatistikk: BransjeSykefraværsstatistikk = result.third
.fold(success = { response -> response }, failure = { fail(it.message) })
bransjestatistikk.bransje shouldBe TRANSPORT.name
bransjestatistikk.siste4Kvartal.prosent shouldBe 9.9
bransjestatistikk.siste4Kvartal.kvartaler.size shouldBe 1
bransjestatistikk.siste4Kvartal.erMaskert shouldBe false
bransjestatistikk.sisteGjeldendeKvartal.prosent shouldBe 8.7
bransjestatistikk.sisteGjeldendeKvartal.erMaskert shouldBe false
}

@Test
Expand Down

0 comments on commit bfe59a2

Please sign in to comment.