Skip to content

Commit

Permalink
Legg til historisk statistikk for næring
Browse files Browse the repository at this point in the history
Co-authored-by: Per-Christian Nielsen <per-christian.nielsen@nav.no>
  • Loading branch information
klechr and perchrnie committed Sep 27, 2023
1 parent f328743 commit beadee0
Show file tree
Hide file tree
Showing 9 changed files with 120 additions and 95 deletions.
11 changes: 7 additions & 4 deletions src/main/kotlin/no/nav/lydia/App.kt
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,9 @@ fun startLydiaBackend() {
),
virksomhetsinformasjonRepository = VirksomhetsinformasjonRepository(
dataSource = dataSource,
), sistePubliseringService = sistePubliseringService
),
sistePubliseringService = sistePubliseringService,
virksomhetRepository = VirksomhetRepository(dataSource = dataSource),
)

brregConsumer(naisEnv = naisEnv, dataSource = dataSource)
Expand Down Expand Up @@ -166,15 +168,16 @@ fun Application.lydiaRestApi(
naisEnvironment: NaisEnvironment,
dataSource: DataSource,
) {
val virksomhetService = VirksomhetService(virksomhetRepository = VirksomhetRepository(dataSource = dataSource))
val næringsRepository = NæringsRepository(dataSource = dataSource)
val virksomhetRepository = VirksomhetRepository(dataSource = dataSource)
val næringsRepository = NæringsRepository(dataSource = dataSource)
val iaSakRepository = IASakRepository(dataSource = dataSource)
val virksomhetService = VirksomhetService(virksomhetRepository = virksomhetRepository)
val sykefraværsstatistikkService =
SykefraværsstatistikkService(
sykefraversstatistikkRepository = SykefraversstatistikkRepository(dataSource = dataSource),
virksomhetsinformasjonRepository = VirksomhetsinformasjonRepository(dataSource = dataSource),
sistePubliseringService = SistePubliseringService(SistePubliseringRepository(dataSource = dataSource))
sistePubliseringService = SistePubliseringService(SistePubliseringRepository(dataSource = dataSource)),
virksomhetRepository = virksomhetRepository,
)
val årsakRepository = ÅrsakRepository(dataSource = dataSource)
val auditLog = AuditLog(naisEnvironment.miljø)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,16 @@ import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere
import no.nav.lydia.sykefraversstatistikk.domene.*
import no.nav.lydia.sykefraversstatistikk.import.*
import no.nav.lydia.sykefraversstatistikk.import.Kategori.*
import no.nav.lydia.virksomhet.VirksomhetRepository
import org.slf4j.LoggerFactory
import java.time.LocalDate.now
import kotlin.system.measureTimeMillis

class SykefraværsstatistikkService(
val sykefraversstatistikkRepository: SykefraversstatistikkRepository,
val virksomhetsinformasjonRepository: VirksomhetsinformasjonRepository,
val sistePubliseringService: SistePubliseringService
val sistePubliseringService: SistePubliseringService,
val virksomhetRepository: VirksomhetRepository,
) {
val log = LoggerFactory.getLogger(this.javaClass)

Expand Down Expand Up @@ -158,16 +160,23 @@ class SykefraværsstatistikkService(
fun hentHistoriskStatistikk(orgnummer: String) : Either<Feil, HistoriskStatistikk> {
var virksomhetsstatistikk : HistoriskStatistikk
val tidsbruk = measureTimeMillis {
val næring = virksomhetRepository.hentVirksomhet(orgnr = orgnummer)?.næringsundergruppe1?.tilTosifret()
?: return SykefraværsstatistikkError.`feil under uthenting av sykefraværsstatistikk`.left()
virksomhetsstatistikk = HistoriskStatistikk (
virksomhetsstatistikk =
KategoriStatistikk(
kategori = VIRKSOMHET,
kode = orgnummer,
statistikk = virksomhetsinformasjonRepository.hentVirksomhetsstatistikkPerKvartal(orgnr = orgnummer)
),
næringsstatistikk = KategoriStatistikk(
kategori = NÆRING,
kode = næring,
statistikk = virksomhetsinformasjonRepository.hentNæringstatistikkPerKvartal(næring = næring)
)
)
}
log.info("Brukte ${tidsbruk} ms på å hente statistikk for en virksomhet")
log.info("Brukte $tidsbruk ms på å hente statistikk for en virksomhet")
return virksomhetsstatistikk.right()
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import no.nav.lydia.sykefraversstatistikk.domene.Statistikkdata
import no.nav.lydia.sykefraversstatistikk.domene.Virksomhetsoversikt
import no.nav.lydia.sykefraversstatistikk.domene.VirksomhetsstatistikkSiste4Kvartal
import no.nav.lydia.sykefraversstatistikk.domene.VirksomhetsstatistikkSisteKvartal
import no.nav.lydia.sykefraversstatistikk.import.Kategori
import no.nav.lydia.sykefraversstatistikk.import.Kvartal
import javax.sql.DataSource

Expand Down Expand Up @@ -183,6 +184,31 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {
session.run(query)
}


fun hentNæringstatistikkPerKvartal(næring: String) =
hentKategoristatistikkPerKvartal(Kategori.NÆRING, næring)

private fun hentKategoristatistikkPerKvartal(kategori: Kategori, kode: String) =
using(sessionOf(dataSource)) { session ->
val query = queryOf(
statement = """
SELECT
${kategori.kodenavn()},
arstall,
kvartal,
prosent,
maskert
FROM ${kategori.tabellnavn()}
WHERE ${kategori.kodenavn()} = :kode
ORDER BY arstall DESC, kvartal DESC
""".trimIndent(),
paramMap = mapOf(
"kode" to kode
)
).map { mapKategoriRowToStatistikkdata(it) }.asList
session.run(query)
}

fun hentVirksomhetsstatistikkPerKvartal(orgnr: String) =
using(sessionOf(dataSource)) { session ->
val query = queryOf(
Expand All @@ -200,11 +226,18 @@ class VirksomhetsinformasjonRepository(val dataSource: DataSource) {
paramMap = mapOf(
"orgnr" to orgnr
)
).map { mapRowToStatistikkdata(it) }.asList
).map { mapVirksomhetRowToStatistikkdata(it) }.asList
session.run(query)
}

private fun mapRowToStatistikkdata(row: Row) = Statistikkdata(
private fun mapKategoriRowToStatistikkdata(row: Row) = Statistikkdata(
årstall = row.int("arstall"),
kvartal = row.int("kvartal"),
sykefraværsprosent = row.double("prosent"),
maskert = row.boolean("maskert"),
)

private fun mapVirksomhetRowToStatistikkdata(row: Row) = Statistikkdata(
årstall = row.int("arstall"),
kvartal = row.int("kvartal"),
sykefraværsprosent = row.double("sykefraversprosent"),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import no.nav.lydia.sykefraversstatistikk.import.Kategori

@Serializable
data class HistoriskStatistikk(
val virksomhetsstatistikk: KategoriStatistikk,
val virksomhetsstatistikk: KategoriStatistikk,
valringsstatistikk: KategoriStatistikk,
)

@Serializable
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,25 @@ import kotlinx.serialization.Serializable
// - Næring: det andre nivået i SN2007 identifisert ved en tosifret tallkode
// - Næringskode: femte nivå identifisert ved en femsifret tallkode (kalt også - feilaktig - 'bransje')
enum class Kategori {
VIRKSOMHET, LAND, SEKTOR, BRANSJE, NÆRING, NÆRINGSKODE
VIRKSOMHET, LAND, SEKTOR, BRANSJE, NÆRING, NÆRINGSKODE;

fun tabellnavn() = when (this) {
LAND -> "sykefravar_statistikk_land"
SEKTOR -> "sykefravar_statistikk_sektor"
BRANSJE -> "sykefravar_statistikk_bransje"
NÆRING -> "sykefravar_statistikk_naring"
NÆRINGSKODE -> "sykefravar_statistikk_naringsundergruppe"
VIRKSOMHET -> "sykefravar_statistikk_virksomhet"
}

fun kodenavn() = when (this) {
LAND -> "land"
SEKTOR -> "sektor_kode"
BRANSJE -> "bransje"
NÆRING -> "naring"
NÆRINGSKODE -> "naringsundergruppe"
VIRKSOMHET -> "orgnr"
}
}

data class SykefraversstatistikkPerKategoriImportDto(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,14 @@ import io.kotest.inspectors.forAll
import io.kotest.inspectors.forAtLeastOne
import io.kotest.inspectors.forNone
import io.kotest.matchers.booleans.shouldBeTrue
import io.kotest.matchers.collections.*
import io.kotest.matchers.collections.shouldBeIn
import io.kotest.matchers.collections.shouldContain
import io.kotest.matchers.collections.shouldContainAll
import io.kotest.matchers.collections.shouldContainInOrder
import io.kotest.matchers.collections.shouldHaveAtLeastSize
import io.kotest.matchers.collections.shouldHaveSize
import io.kotest.matchers.collections.shouldNotContain
import io.kotest.matchers.collections.shouldNotContainAnyOf
import io.kotest.matchers.doubles.shouldBeGreaterThan
import io.kotest.matchers.doubles.shouldBeGreaterThanOrEqual
import io.kotest.matchers.doubles.shouldBeLessThanOrEqual
Expand All @@ -20,7 +27,7 @@ import io.kotest.matchers.shouldNotBe
import io.kotest.matchers.string.shouldStartWith
import no.nav.lydia.Kafka
import no.nav.lydia.container.sykefraversstatistikk.importering.SykefraversstatistikkImportTestUtils
import no.nav.lydia.helper.*
import no.nav.lydia.helper.KafkaContainerHelper
import no.nav.lydia.helper.SakHelper.Companion.nyHendelse
import no.nav.lydia.helper.SakHelper.Companion.nyIkkeAktuellHendelse
import no.nav.lydia.helper.SakHelper.Companion.nySakIViBistår
Expand All @@ -36,10 +43,12 @@ import no.nav.lydia.helper.StatistikkHelper.Companion.hentSykefraværForVirksomh
import no.nav.lydia.helper.StatistikkHelper.Companion.hentSykefraværForVirksomhetSiste4KvartalerRespons
import no.nav.lydia.helper.StatistikkHelper.Companion.hentSykefraværRespons
import no.nav.lydia.helper.StatistikkHelper.Companion.hentTotaltAntallTreffISykefravær
import no.nav.lydia.helper.TestContainerHelper
import no.nav.lydia.helper.TestContainerHelper.Companion.oauth2ServerContainer
import no.nav.lydia.helper.TestContainerHelper.Companion.performGet
import no.nav.lydia.helper.TestContainerHelper.Companion.performPost
import no.nav.lydia.helper.TestContainerHelper.Companion.postgresContainer
import no.nav.lydia.helper.TestData
import no.nav.lydia.helper.TestData.Companion.BEDRIFTSRÅDGIVNING
import no.nav.lydia.helper.TestData.Companion.BOLIGBYGGELAG
import no.nav.lydia.helper.TestData.Companion.NÆRING_JORDBRUK
Expand All @@ -55,17 +64,27 @@ import no.nav.lydia.helper.TestVirksomhet.Companion.LUNNER
import no.nav.lydia.helper.TestVirksomhet.Companion.TESTVIRKSOMHET_FOR_STATUSFILTER
import no.nav.lydia.helper.TestVirksomhet.Companion.beliggenhet
import no.nav.lydia.helper.TestVirksomhet.Companion.nyVirksomhet
import no.nav.lydia.helper.VirksomhetHelper
import no.nav.lydia.helper.VirksomhetHelper.Companion.hentVirksomhetsinformasjon
import no.nav.lydia.helper.VirksomhetHelper.Companion.lastInnNyVirksomhet
import no.nav.lydia.helper.VirksomhetHelper.Companion.nyttOrgnummer
import no.nav.lydia.helper.forExactlyOne
import no.nav.lydia.helper.statuskode
import no.nav.lydia.helper.tilSingelRespons
import no.nav.lydia.ia.sak.api.IASakDto
import no.nav.lydia.ia.sak.api.IA_SAK_RADGIVER_PATH
import no.nav.lydia.ia.sak.domene.ANTALL_DAGER_FØR_SAK_LÅSES
import no.nav.lydia.ia.sak.domene.IAProsessStatus
import no.nav.lydia.ia.sak.domene.IASakshendelseType.FULLFØR_BISTAND
import no.nav.lydia.ia.sak.domene.IASakshendelseType.TA_EIERSKAP_I_SAK
import no.nav.lydia.sykefraversstatistikk.api.*
import no.nav.lydia.sykefraversstatistikk.api.EierDTO
import no.nav.lydia.sykefraversstatistikk.api.FILTERVERDIER_PATH
import no.nav.lydia.sykefraversstatistikk.api.Periode
import no.nav.lydia.sykefraversstatistikk.api.SYKEFRAVERSSTATISTIKK_PATH
import no.nav.lydia.sykefraversstatistikk.api.SnittFilter
import no.nav.lydia.sykefraversstatistikk.api.Søkeparametere.Companion.VIRKSOMHETER_PER_SIDE
import no.nav.lydia.sykefraversstatistikk.api.VirksomhetsoversiktDto
import no.nav.lydia.sykefraversstatistikk.api.VirksomhetsoversiktResponsDto
import no.nav.lydia.sykefraversstatistikk.api.geografi.GeografiService
import no.nav.lydia.sykefraversstatistikk.api.geografi.Kommune
import no.nav.lydia.sykefraversstatistikk.import.Kategori
Expand Down Expand Up @@ -647,13 +666,15 @@ class SykefraversstatistikkApiTest {

val resultat = hentStatikkHistorikk(orgnr = nyVirksomhet.orgnr)

resultat.virksomhetsstatistikk.statistikk shouldHaveSize 12
resultat.virksomhetsstatistikk.statistikk shouldHaveSize perioder.size
// resultat.næringsstatistikk.statistikk shouldHaveSize ANTALL_NÆRINGS_PERIODER

resultat.virksomhetsstatistikk.statistikk.map {
Periode(kvartal = it.kvartal, årstall = it.årstall)
} shouldContainAll perioder

resultat.virksomhetsstatistikk.statistikk.forAll { it.sykefraværsprosent shouldBe 78.9 }
// resultat.næringsstatistikk.statistikk.forAll { it.sykefraværsprosent shouldBe 5.0 }
}

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,32 +72,17 @@ class SykefraversstatistikkImportTestUtils {
val KVARTAL_2022_3 = Kvartal(2022, 3)
val KVARTAL_2022_2 = Kvartal(2022, 2)
val KVARTAL_2022_1 = Kvartal(2022, 1)
private val tabellnavn = mapOf(
Kategori.LAND to "sykefravar_statistikk_land",
Kategori.SEKTOR to "sykefravar_statistikk_sektor",
Kategori.BRANSJE to "sykefravar_statistikk_bransje",
Kategori.NÆRING to "sykefravar_statistikk_naring",
Kategori.NÆRINGSKODE to "sykefravar_statistikk_naringsundergruppe",
Kategori.VIRKSOMHET to "sykefravar_statistikk_virksomhet"
)
private val kodenavn = mapOf(
Kategori.LAND to "land",
Kategori.SEKTOR to "sektor_kode",
Kategori.BRANSJE to "bransje",
Kategori.NÆRING to "naring",
Kategori.NÆRINGSKODE to "naringsundergruppe",
Kategori.VIRKSOMHET to "orgnr"
)


fun cleanUpStatistikkTable(
kategori: Kategori,
verdi: String? = null,
kvartal: Kvartal = TestData.gjeldendePeriode.tilKvartal(),
) {
val optionalClauseOnKode = if (verdi == null) "" else "and ${kodenavn[kategori]} = '$verdi'"
val optionalClauseOnKode = if (verdi == null) "" else "and ${kategori.kodenavn()} = '$verdi'"

TestContainerHelper.postgresContainer.performUpdate("""
delete from ${tabellnavn.get(kategori)}
delete from ${kategori.tabellnavn()}
where arstall = ${kvartal.årstall}
and kvartal = ${kvartal.kvartal}
$optionalClauseOnKode
Expand Down Expand Up @@ -187,8 +172,8 @@ class SykefraversstatistikkImportTestUtils {
): StatistikkGjeldendeKvartal {
val erKategoriTabell = kategori != Kategori.VIRKSOMHET
val query = """
select * from ${tabellnavn[kategori]}
where ${kodenavn[kategori]} = '$verdi'
select * from ${kategori.tabellnavn()}
where ${kategori.kodenavn()} = '$verdi'
and arstall = ${kvartal.årstall} and kvartal = ${kvartal.kvartal}
""".trimMargin()
TestContainerHelper.postgresContainer.dataSource.connection.use { connection ->
Expand All @@ -199,7 +184,7 @@ class SykefraversstatistikkImportTestUtils {
rs.row shouldBe 1
return StatistikkGjeldendeKvartal(
kategori = kategori,
kode = rs.getString(kodenavn[kategori]),
kode = rs.getString(kategori.kodenavn()),
sistePubliserteKvartal = SistePubliserteKvartal(
årstall = rs.getInt("arstall"),
kvartal = rs.getInt("kvartal"),
Expand Down
25 changes: 15 additions & 10 deletions src/test/kotlin/no/nav/lydia/helper/TestContainerHelper.kt
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import no.nav.lydia.helper.TestContainerHelper.Companion.performDelete
import no.nav.lydia.helper.TestContainerHelper.Companion.performGet
import no.nav.lydia.helper.TestContainerHelper.Companion.performPost
import no.nav.lydia.helper.TestContainerHelper.Companion.performPut
import no.nav.lydia.helper.TestData.Companion.lagPerioder
import no.nav.lydia.ia.sak.api.IASakDto
import no.nav.lydia.ia.sak.api.IASakLeveranseDto
import no.nav.lydia.ia.sak.api.IASakLeveranseOppdateringsDto
Expand Down Expand Up @@ -72,6 +73,8 @@ import kotlin.test.fail

class TestContainerHelper {
companion object {
const val ANTALL_NÆRINGS_PERIODER = 10

private var log: Logger = LoggerFactory.getLogger(this::class.java)

private val network = Network.newNetwork()
Expand Down Expand Up @@ -123,16 +126,18 @@ class TestContainerHelper {

// -- generer statistikk for næringer
kafkaContainerHelper.sendSykefraversstatistikkPerKategoriIBulkOgVentTilKonsumert(
importDtoer = næringsRepository.hentNæringer().map {
lagSykefraversstatistikkPerKategoriImportDto(
kategori = Kategori.NÆRING,
kode = it.kode,
periode = TestData.gjeldendePeriode,
sykefraværsProsent = 5.0,
antallPersoner = 1000,
muligeDagsverk = 250_000.0,
tapteDagsverk = 12_500.0,
)
importDtoer = næringsRepository.hentNæringer().flatMap{ næring ->
TestData.gjeldendePeriode.lagPerioder(ANTALL_NÆRINGS_PERIODER).map { periode ->
lagSykefraversstatistikkPerKategoriImportDto(
kategori = Kategori.NÆRING,
kode = næring.kode,
periode = periode,
sykefraværsProsent = 5.0,
antallPersoner = 1000,
muligeDagsverk = 250_000.0,
tapteDagsverk = 12_500.0,
)
}
},
topic = KafkaContainerHelper.statistikkNæringTopic,
groupId = Kafka.statistikkNæringGroupId
Expand Down
Loading

0 comments on commit beadee0

Please sign in to comment.