From 987e4abcce4187d923f34e6edac02ee1fa81d85f Mon Sep 17 00:00:00 2001 From: Andreas Date: Fri, 13 Oct 2023 13:40:54 +0200 Subject: [PATCH] Ny regletre for HPR, mer lesbart (#195) * update rules for HPR * update naming --------- Co-authored-by: Joakim Taule Kartveit --- README.md | 28 +- .../nav/syfo/client/NorskHelsenettClient.kt | 12 + .../no/nav/syfo/rules/hpr/HPRRuleHit.kt | 11 + .../no/nav/syfo/rules/hpr/HPRRuleTree.kt | 46 - .../no/nav/syfo/rules/hpr/HprRuleTree.kt | 78 ++ .../kotlin/no/nav/syfo/rules/hpr/Rules.kt | 190 ++- .../kotlin/no/nav/syfo/rules/hpr/HPRTest.kt | 1176 ++++++++++++----- 7 files changed, 1118 insertions(+), 423 deletions(-) delete mode 100644 src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleTree.kt create mode 100644 src/main/kotlin/no/nav/syfo/rules/hpr/HprRuleTree.kt diff --git a/README.md b/README.md index 0d895a3f..6b9aa075 100644 --- a/README.md +++ b/README.md @@ -136,14 +136,26 @@ graph TD HPR ```mermaid graph TD - root(BEHANDLER_IKKE_GYLDIG_I_HPR) -->|Yes| root_BEHANDLER_IKKE_GYLDIG_I_HPR_INVALID(INVALID):::invalid - root(BEHANDLER_IKKE_GYLDIG_I_HPR) -->|No| root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR(BEHANDLER_MANGLER_AUTORISASJON_I_HPR) - root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR(BEHANDLER_MANGLER_AUTORISASJON_I_HPR) -->|Yes| root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_INVALID(INVALID):::invalid - root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR(BEHANDLER_MANGLER_AUTORISASJON_I_HPR) -->|No| root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR(BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR) - root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR(BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR) -->|Yes| root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR_INVALID(INVALID):::invalid - root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR(BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR) -->|No| root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR_BEHANDLER_MT_FT_KI_OVER_12_UKER(BEHANDLER_MT_FT_KI_OVER_12_UKER) - root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR_BEHANDLER_MT_FT_KI_OVER_12_UKER(BEHANDLER_MT_FT_KI_OVER_12_UKER) -->|Yes| root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR_BEHANDLER_MT_FT_KI_OVER_12_UKER_INVALID(INVALID):::invalid - root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR_BEHANDLER_MT_FT_KI_OVER_12_UKER(BEHANDLER_MT_FT_KI_OVER_12_UKER) -->|No| root_BEHANDLER_IKKE_GYLDIG_I_HPR_BEHANDLER_MANGLER_AUTORISASJON_I_HPR_BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR_BEHANDLER_MT_FT_KI_OVER_12_UKER_OK(OK):::ok + root(BEHANDLER_GYLIDG_I_HPR) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR(BEHANDLER_HAR_AUTORISASJON_I_HPR) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR(BEHANDLER_HAR_AUTORISASJON_I_HPR) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR(BEHANDLER_ER_LEGE_I_HPR) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR(BEHANDLER_ER_LEGE_I_HPR) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_OK(OK):::ok + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR(BEHANDLER_ER_LEGE_I_HPR) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR(BEHANDLER_ER_TANNLEGE_I_HPR) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR(BEHANDLER_ER_TANNLEGE_I_HPR) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_OK(OK):::ok + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR(BEHANDLER_ER_TANNLEGE_I_HPR) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR(BEHANDLER_ER_MANUELLTERAPEUT_I_HPR) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR(BEHANDLER_ER_MANUELLTERAPEUT_I_HPR) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_SYKEFRAVAR_OVER_12_UKER_INVALID(INVALID):::invalid + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_SYKEFRAVAR_OVER_12_UKER_OK(OK):::ok + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR(BEHANDLER_ER_MANUELLTERAPEUT_I_HPR) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR(BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR(BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER_INVALID(INVALID):::invalid + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER_OK(OK):::ok + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR(BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR(BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR(BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) -->|Yes| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER_INVALID(INVALID):::invalid + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER(SYKEFRAVAR_OVER_12_UKER) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR_SYKEFRAVAR_OVER_12_UKER_OK(OK):::ok + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR(BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_BEHANDLER_ER_LEGE_I_HPR_BEHANDLER_ER_TANNLEGE_I_HPR_BEHANDLER_ER_MANUELLTERAPEUT_I_HPR_BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR_BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR_INVALID(INVALID):::invalid + root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR(BEHANDLER_HAR_AUTORISASJON_I_HPR) -->|No| root_BEHANDLER_GYLIDG_I_HPR_BEHANDLER_HAR_AUTORISASJON_I_HPR_INVALID(INVALID):::invalid + root(BEHANDLER_GYLIDG_I_HPR) -->|No| root_BEHANDLER_GYLIDG_I_HPR_INVALID(INVALID):::invalid classDef ok fill:#c3ff91,stroke:#004a00,color: black; classDef invalid fill:#ff7373,stroke:#ff0000,color: black; classDef manuell fill:#ffe24f,stroke:#ffd500,color: #473c00; diff --git a/src/main/kotlin/no/nav/syfo/client/NorskHelsenettClient.kt b/src/main/kotlin/no/nav/syfo/client/NorskHelsenettClient.kt index 546b1a11..cc71ee7e 100644 --- a/src/main/kotlin/no/nav/syfo/client/NorskHelsenettClient.kt +++ b/src/main/kotlin/no/nav/syfo/client/NorskHelsenettClient.kt @@ -11,6 +11,7 @@ import io.ktor.http.HttpStatusCode.Companion.InternalServerError import io.ktor.http.HttpStatusCode.Companion.NotFound import io.ktor.http.HttpStatusCode.Companion.OK import java.io.IOException +import java.time.LocalDateTime import net.logstash.logback.argument.StructuredArguments.fields import no.nav.syfo.azuread.v2.AzureAdV2Client import no.nav.syfo.helpers.retry @@ -90,8 +91,19 @@ data class Behandler( data class Godkjenning( val helsepersonellkategori: Kode? = null, val autorisasjon: Kode? = null, + val tillegskompetanse: List? = null, ) +data class Tilleggskompetanse( + val avsluttetStatus: Kode?, + val eTag: String?, + val gyldig: Periode?, + val id: Int?, + val type: Kode? +) + +data class Periode(val fra: LocalDateTime?, val til: LocalDateTime?) + data class Kode( val aktiv: Boolean, val oid: Int, diff --git a/src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleHit.kt b/src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleHit.kt index 3ef7cbbc..78af2f51 100644 --- a/src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleHit.kt +++ b/src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleHit.kt @@ -50,4 +50,15 @@ enum class HPRRuleHit( "gjør at sykefraværet ditt overstiger 12 uker", ), ), + BEHANDLER_ER_FT_UTEN_TILLIGESKOMPETANSE_SYKMELDING( + ruleHit = + RuleHit( + rule = "BEHANDLER_ER_FT_UTEN_TILLIGESKOMPETANSE_SYKMELDINGHPRRuleHit", + status = Status.INVALID, + messageForSender = + "Behandler finnes i HPR, men er fysioterapeut uten tilleggskompetanse for sykmelding" + + "Pasienten har fått beskjed.", + messageForUser = "Den som skrev sykmeldingen manglet autorisasjon", + ), + ), } diff --git a/src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleTree.kt b/src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleTree.kt deleted file mode 100644 index 07765c35..00000000 --- a/src/main/kotlin/no/nav/syfo/rules/hpr/HPRRuleTree.kt +++ /dev/null @@ -1,46 +0,0 @@ -package no.nav.syfo.rules.hpr - -import no.nav.syfo.model.Status -import no.nav.syfo.model.Status.OK -import no.nav.syfo.rules.common.RuleResult -import no.nav.syfo.rules.dsl.RuleNode -import no.nav.syfo.rules.dsl.tree - -enum class HPRRules { - BEHANDLER_IKKE_GYLDIG_I_HPR, - BEHANDLER_MANGLER_AUTORISASJON_I_HPR, - BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR, - BEHANDLER_MT_FT_KI_OVER_12_UKER, -} - -val hprRuleTree = - tree(HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR) { - yes(Status.INVALID, HPRRuleHit.BEHANDLER_IKKE_GYLDIG_I_HPR) - no(HPRRules.BEHANDLER_MANGLER_AUTORISASJON_I_HPR) { - yes(Status.INVALID, HPRRuleHit.BEHANDLER_MANGLER_AUTORISASJON_I_HPR) - no(HPRRules.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR) { - yes(Status.INVALID, HPRRuleHit.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR) - no(HPRRules.BEHANDLER_MT_FT_KI_OVER_12_UKER) { - yes(Status.INVALID, HPRRuleHit.BEHANDLER_MT_FT_KI_OVER_12_UKER) - no(OK) - } - } - } - } - -internal fun RuleNode.yes(status: Status, ruleHit: HPRRuleHit? = null) { - yes(RuleResult(status, ruleHit?.ruleHit)) -} - -internal fun RuleNode.no(status: Status, ruleHit: HPRRuleHit? = null) { - no(RuleResult(status, ruleHit?.ruleHit)) -} - -fun getRule(rules: HPRRules): Rule { - return when (rules) { - HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR -> behanderIkkeGyldigHPR - HPRRules.BEHANDLER_MANGLER_AUTORISASJON_I_HPR -> behandlerManglerAutorisasjon - HPRRules.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR -> behandlerIkkeLEKIMTTLFT - HPRRules.BEHANDLER_MT_FT_KI_OVER_12_UKER -> behandlerMTFTKISykmeldtOver12Uker - } -} diff --git a/src/main/kotlin/no/nav/syfo/rules/hpr/HprRuleTree.kt b/src/main/kotlin/no/nav/syfo/rules/hpr/HprRuleTree.kt new file mode 100644 index 00000000..18659563 --- /dev/null +++ b/src/main/kotlin/no/nav/syfo/rules/hpr/HprRuleTree.kt @@ -0,0 +1,78 @@ +package no.nav.syfo.rules.hpr + +import HPRRule +import behanderGyldigHPR +import behandlerErFTMedTilligskompetanseSykmelding +import behandlerErKIMedTilligskompetanseSykmelding +import behandlerErLege +import behandlerErManuellterapeut +import behandlerErTannlege +import behandlerHarAutorisasjon +import no.nav.syfo.model.Status +import no.nav.syfo.rules.common.RuleResult +import no.nav.syfo.rules.dsl.RuleNode +import no.nav.syfo.rules.dsl.tree +import sykefravarOver12Uker + +enum class HPRRules { + BEHANDLER_GYLIDG_I_HPR, + BEHANDLER_HAR_AUTORISASJON_I_HPR, + BEHANDLER_ER_LEGE_I_HPR, + BEHANDLER_ER_TANNLEGE_I_HPR, + BEHANDLER_ER_MANUELLTERAPEUT_I_HPR, + BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR, + BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR, + SYKEFRAVAR_OVER_12_UKER, +} + +val hprRuleTree = + tree(HPRRules.BEHANDLER_GYLIDG_I_HPR) { + no(Status.INVALID, HPRRuleHit.BEHANDLER_IKKE_GYLDIG_I_HPR) + yes(HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR) { + no(Status.INVALID, HPRRuleHit.BEHANDLER_MANGLER_AUTORISASJON_I_HPR) + yes(HPRRules.BEHANDLER_ER_LEGE_I_HPR) { + yes(Status.OK) + no(HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR) { + yes(Status.OK) + no(HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR) { + yes(HPRRules.SYKEFRAVAR_OVER_12_UKER, checkSykefravarOver12Uker()) + no(HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR) { + yes(HPRRules.SYKEFRAVAR_OVER_12_UKER, checkSykefravarOver12Uker()) + no(HPRRules.BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR) { + yes(HPRRules.SYKEFRAVAR_OVER_12_UKER, checkSykefravarOver12Uker()) + no(Status.INVALID, HPRRuleHit.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR) + } + } + } + } + } + } + } + +private fun checkSykefravarOver12Uker(): RuleNode.() -> Unit = { + yes(Status.INVALID, HPRRuleHit.BEHANDLER_MT_FT_KI_OVER_12_UKER) + no(Status.OK) +} + +internal fun RuleNode.yes(status: Status, ruleHit: HPRRuleHit? = null) { + yes(RuleResult(status, ruleHit?.ruleHit)) +} + +internal fun RuleNode.no(status: Status, ruleHit: HPRRuleHit? = null) { + no(RuleResult(status, ruleHit?.ruleHit)) +} + +fun getRule(rules: HPRRules): HPRRule { + return when (rules) { + HPRRules.BEHANDLER_GYLIDG_I_HPR -> behanderGyldigHPR(rules) + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR -> behandlerHarAutorisasjon(rules) + HPRRules.BEHANDLER_ER_LEGE_I_HPR -> behandlerErLege(rules) + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR -> behandlerErTannlege(rules) + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR -> behandlerErManuellterapeut(rules) + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR -> + behandlerErFTMedTilligskompetanseSykmelding(rules) + HPRRules.BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR -> + behandlerErKIMedTilligskompetanseSykmelding(rules) + HPRRules.SYKEFRAVAR_OVER_12_UKER -> sykefravarOver12Uker(rules) + } +} diff --git a/src/main/kotlin/no/nav/syfo/rules/hpr/Rules.kt b/src/main/kotlin/no/nav/syfo/rules/hpr/Rules.kt index 9ced02d4..e90d8741 100644 --- a/src/main/kotlin/no/nav/syfo/rules/hpr/Rules.kt +++ b/src/main/kotlin/no/nav/syfo/rules/hpr/Rules.kt @@ -1,8 +1,10 @@ -package no.nav.syfo.rules.hpr - +import java.time.LocalDateTime import no.nav.syfo.client.Godkjenning +import no.nav.syfo.client.Tilleggskompetanse import no.nav.syfo.model.Sykmelding import no.nav.syfo.rules.dsl.RuleResult +import no.nav.syfo.rules.hpr.HPRRules +import no.nav.syfo.rules.hpr.HelsepersonellKategori import no.nav.syfo.services.BehandlerOgStartdato import no.nav.syfo.services.daysBetween import no.nav.syfo.services.sortedFOMDate @@ -13,7 +15,7 @@ typealias Rule = typealias HPRRule = Rule -val behanderIkkeGyldigHPR: HPRRule = { _, behandlerOgStartdato -> +fun behanderGyldigHPR(rule: HPRRules): HPRRule = { _, behandlerOgStartdato -> val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger val aktivAutorisasjon = @@ -21,12 +23,12 @@ val behanderIkkeGyldigHPR: HPRRule = { _, behandlerOgStartdato -> RuleResult( ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), - rule = HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR, - ruleResult = !aktivAutorisasjon, + rule = rule, + ruleResult = aktivAutorisasjon, ) } -val behandlerManglerAutorisasjon: HPRRule = { _, behandlerOgStartdato -> +fun behandlerHarAutorisasjon(rule: HPRRules): HPRRule = { _, behandlerOgStartdato -> val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger val gyldigeGodkjenninger = @@ -40,78 +42,162 @@ val behandlerManglerAutorisasjon: HPRRule = { _, behandlerOgStartdato -> RuleResult( ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), - rule = HPRRules.BEHANDLER_MANGLER_AUTORISASJON_I_HPR, - ruleResult = !gyldigeGodkjenninger, + rule = rule, + ruleResult = gyldigeGodkjenninger, ) } -val behandlerIkkeLEKIMTTLFT: HPRRule = { _, behandlerOgStartdato -> +fun behandlerErLege(rule: HPRRules): HPRRule = { _, behandlerOgStartdato -> val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger - val behandlerLEKIMTTLFT = - behandlerGodkjenninger.any { - (it.helsepersonellkategori?.aktiv != null && - it.autorisasjon?.aktiv == true && - it.helsepersonellkategori.verdi != null && - harAktivHelsepersonellAutorisasjonsSom( - behandlerGodkjenninger, - listOf( - HelsepersonellKategori.LEGE.verdi, - HelsepersonellKategori.KIROPRAKTOR.verdi, - HelsepersonellKategori.MANUELLTERAPEUT.verdi, - HelsepersonellKategori.TANNLEGE.verdi, - HelsepersonellKategori.FYSIOTERAPAEUT.verdi, - ), - )) - } + val behandlerErLege = sjekkBehandler(behandlerGodkjenninger, HelsepersonellKategori.LEGE) RuleResult( ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), - rule = HPRRules.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR, - ruleResult = !behandlerLEKIMTTLFT, + rule = rule, + ruleResult = behandlerErLege, ) } -val behandlerMTFTKISykmeldtOver12Uker: HPRRule = { sykmelding, behandlerOgStartdato -> - val forsteFomDato = sykmelding.perioder.sortedFOMDate().first() - val sisteTomDato = sykmelding.perioder.sortedTOMDate().last() - val behandlerStartDato = behandlerOgStartdato.startdato +fun behandlerErTannlege(rule: HPRRules): HPRRule = { _, behandlerOgStartdato -> + val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger + + val behandlerErTannlege = + sjekkBehandler(behandlerGodkjenninger, HelsepersonellKategori.TANNLEGE) + + RuleResult( + ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), + rule = rule, + ruleResult = behandlerErTannlege, + ) +} + +fun behandlerErManuellterapeut(rule: HPRRules): HPRRule = { _, behandlerOgStartdato -> val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger - val behandlerMTFTKISykmeldtOver12Uker = - ((forsteFomDato..sisteTomDato).daysBetween() > 84 || - (behandlerStartDato != null && - (behandlerStartDato..sisteTomDato).daysBetween() > 84)) && - !harAktivHelsepersonellAutorisasjonsSom( + val behandlerErManuellterapeut = + sjekkBehandler(behandlerGodkjenninger, HelsepersonellKategori.MANUELLTERAPEUT) + + RuleResult( + ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), + rule = rule, + ruleResult = behandlerErManuellterapeut, + ) +} + +fun behandlerErFTMedTilligskompetanseSykmelding(rule: HPRRules): HPRRule = + { metadata, behandlerOgStartdato -> + val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger + val genereringsTidspunkt = metadata.signaturDato + + val erFtMedTilleggskompetanse = + erHelsepersonellKategoriMedTilleggskompetanse( behandlerGodkjenninger, - listOf( - HelsepersonellKategori.LEGE.verdi, - HelsepersonellKategori.TANNLEGE.verdi, - ), - ) && - harAktivHelsepersonellAutorisasjonsSom( + genereringsTidspunkt, + HelsepersonellKategori.FYSIOTERAPAEUT + ) + + val result = erFtMedTilleggskompetanse + + RuleResult( + ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), + rule = rule, + ruleResult = result, + ) + } + +fun behandlerErKIMedTilligskompetanseSykmelding(rule: HPRRules): HPRRule = + { metadata, behandlerOgStartdato -> + val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger + val genereringsTidspunkt = metadata.signaturDato + + val erKIMedTilleggskompetanse = + erHelsepersonellKategoriMedTilleggskompetanse( behandlerGodkjenninger, - listOf( - HelsepersonellKategori.KIROPRAKTOR.verdi, - HelsepersonellKategori.MANUELLTERAPEUT.verdi, - HelsepersonellKategori.FYSIOTERAPAEUT.verdi, - ), + genereringsTidspunkt, + HelsepersonellKategori.KIROPRAKTOR ) + val result = erKIMedTilleggskompetanse + + RuleResult( + ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), + rule = rule, + ruleResult = result, + ) + } + +fun sykefravarOver12Uker(rule: HPRRules): HPRRule = { sykmelding, behandlerOgStartdato -> + val forsteFomDato = sykmelding.perioder.sortedFOMDate().first() + val sisteTomDato = sykmelding.perioder.sortedTOMDate().last() + val behandlerStartDato = behandlerOgStartdato.startdato + val behandlerGodkjenninger = behandlerOgStartdato.behandler.godkjenninger + + val over12Uker = + (forsteFomDato..sisteTomDato).daysBetween() > 84 || + (behandlerStartDato != null && (behandlerStartDato..sisteTomDato).daysBetween() > 84) + RuleResult( - ruleInputs = mapOf("behandlerGodkjenninger" to behandlerGodkjenninger), - rule = HPRRules.BEHANDLER_MT_FT_KI_OVER_12_UKER, - ruleResult = behandlerMTFTKISykmeldtOver12Uker, + ruleInputs = + mapOf( + "fom" to forsteFomDato, + "tom" to sisteTomDato, + "startDatoSykefravær" to (behandlerStartDato ?: forsteFomDato), + "behandlerGodkjenninger" to behandlerGodkjenninger, + ), + rule = rule, + ruleResult = over12Uker, ) } +private fun erHelsepersonellKategoriMedTilleggskompetanse( + behandlerGodkjenninger: List, + genereringsTidspunkt: LocalDateTime, + helsepersonellkategori: HelsepersonellKategori +) = + (behandlerGodkjenninger.size == 1 && + behandlerGodkjenninger.any { godkjenning -> + godkjenning.helsepersonellkategori?.verdi == helsepersonellkategori.verdi && + godkjenning.tillegskompetanse?.any { tillegskompetanse -> + tillegskompetanse.avsluttetStatus == null && + tillegskompetanse.gyldigPeriode(genereringsTidspunkt) && + tillegskompetanse.type?.aktiv == true && + tillegskompetanse.type.oid == 7702 && + tillegskompetanse.type.verdi == "1" + } + ?: false + }) + +private fun sjekkBehandler( + behandlerGodkjenninger: List, + helsepersonellkategori: HelsepersonellKategori +) = + behandlerGodkjenninger.any { + (it.helsepersonellkategori?.aktiv != null && + it.autorisasjon?.aktiv == true && + harAktivHelsepersonellAutorisasjonsSom( + behandlerGodkjenninger, + helsepersonellkategori.verdi + )) + } + private fun harAktivHelsepersonellAutorisasjonsSom( behandlerGodkjenninger: List, - helsepersonerVerdi: List, + helsepersonerVerdi: String, ): Boolean = behandlerGodkjenninger.any { godkjenning -> godkjenning.helsepersonellkategori?.aktiv != null && godkjenning.autorisasjon?.aktiv == true && godkjenning.helsepersonellkategori.verdi != null && - godkjenning.helsepersonellkategori.let { it.aktiv && it.verdi in helsepersonerVerdi } + godkjenning.helsepersonellkategori.let { it.aktiv && it.verdi == helsepersonerVerdi } } + +private fun Tilleggskompetanse.gyldigPeriode(genereringsTidspunkt: LocalDateTime): Boolean { + val fom = gyldig?.fra?.toLocalDate() + val tom = gyldig?.til?.toLocalDate() + val genDate = genereringsTidspunkt.toLocalDate() + if (fom == null) { + return false + } + return fom.minusDays(1).isBefore(genDate) && (tom == null || tom.plusDays(1).isAfter(genDate)) +} diff --git a/src/test/kotlin/no/nav/syfo/rules/hpr/HPRTest.kt b/src/test/kotlin/no/nav/syfo/rules/hpr/HPRTest.kt index 240c9d5e..2136495d 100644 --- a/src/test/kotlin/no/nav/syfo/rules/hpr/HPRTest.kt +++ b/src/test/kotlin/no/nav/syfo/rules/hpr/HPRTest.kt @@ -7,341 +7,883 @@ import java.time.LocalDate import no.nav.syfo.client.Behandler import no.nav.syfo.client.Godkjenning import no.nav.syfo.client.Kode +import no.nav.syfo.client.Periode +import no.nav.syfo.client.Tilleggskompetanse import no.nav.syfo.generateSykmelding import no.nav.syfo.model.Status import no.nav.syfo.rules.tilbakedatering.toRuleMetadata import no.nav.syfo.services.BehandlerOgStartdato import no.nav.syfo.services.RuleMetadataSykmelding import no.nav.syfo.services.SykmeldingMetadataInfo +import org.amshove.kluent.`should contain all` import org.amshove.kluent.shouldBeEqualTo class HPRTest : - FunSpec({ - val ruleTree = HPRRulesExecution() - - context("Testing hpr rules and checking the rule outcomes") { - test("har aktiv autorisasjon, Status OK") { - val sykmelding = - generateSykmelding( - fom = LocalDate.of(2020, 1, 1), - tom = LocalDate.of(2020, 1, 2), - behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), - ) - val behandler = - Behandler( + FunSpec( + { + val ruleTree = HPRRulesExecution() + + context("Testing hpr rules and checking the rule outcomes") { + test("har ikke aktiv autorisasjon, Status INVALID") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 1, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = + generateBehandler( + "LE", + autorisasjon = + Kode( + aktiv = false, + oid = 7704, + verdi = "1", + ), + ) + + val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = behandlerOgStartdato, + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.INVALID + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo listOf( - Godkjenning( - autorisasjon = - Kode( - aktiv = true, - oid = 7704, - verdi = "1", - ), - helsepersonellkategori = - Kode( - aktiv = true, - oid = 0, - verdi = "LE", - ), - ), - ), - ) - - val ruleMetadata = sykmelding.toRuleMetadata() - - val ruleMetadataSykmelding = - RuleMetadataSykmelding( - ruleMetadata = ruleMetadata, - sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), - doctorSuspensjon = false, - behandlerOgStartdato = BehandlerOgStartdato(behandler, null), - ) - - val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) - - status.first.treeResult.status shouldBeEqualTo Status.OK - status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo - listOf( - HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR to false, - HPRRules.BEHANDLER_MANGLER_AUTORISASJON_I_HPR to false, - HPRRules.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR to false, - HPRRules.BEHANDLER_MT_FT_KI_OVER_12_UKER to false, - ) - - mapOf( - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - ) shouldBeEqualTo status.first.ruleInputs - - status.first.treeResult.ruleHit shouldBeEqualTo null - } + HPRRules.BEHANDLER_GYLIDG_I_HPR to false, + ) + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + ) shouldBeEqualTo status.first.ruleInputs + + status.first.treeResult.ruleHit shouldBeEqualTo + HPRRuleHit.BEHANDLER_IKKE_GYLDIG_I_HPR.ruleHit + } + + test("mangler autorisasjon, Status INVALID") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 1, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = + generateBehandler( + "LE", + autorisasjon = + Kode( + aktiv = true, + oid = 7702, + verdi = "19", + ), + ) + + val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) - test("har ikke aktiv autorisasjon, Status INVALID") { - val sykmelding = - generateSykmelding( - fom = LocalDate.of(2020, 1, 1), - tom = LocalDate.of(2020, 1, 2), - behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), - ) - val behandler = - Behandler( + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = behandlerOgStartdato, + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.INVALID + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo listOf( - Godkjenning( - autorisasjon = - Kode( - aktiv = false, - oid = 7704, - verdi = "1", - ), - helsepersonellkategori = - Kode( - aktiv = true, - oid = 0, - verdi = "LE", - ), - ), - ), - ) - - val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) - - val ruleMetadata = sykmelding.toRuleMetadata() - - val ruleMetadataSykmelding = - RuleMetadataSykmelding( - ruleMetadata = ruleMetadata, - sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), - doctorSuspensjon = false, - behandlerOgStartdato = behandlerOgStartdato, - ) - - val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) - - status.first.treeResult.status shouldBeEqualTo Status.INVALID - status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo - listOf( - HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR to true, - ) - mapOf( - "behandlerGodkjenninger" to behandler.godkjenninger, - ) shouldBeEqualTo status.first.ruleInputs - - status.first.treeResult.ruleHit shouldBeEqualTo - HPRRuleHit.BEHANDLER_IKKE_GYLDIG_I_HPR.ruleHit - } - test("mangler autorisasjon, Status INVALID") { - val sykmelding = - generateSykmelding( - fom = LocalDate.of(2020, 1, 1), - tom = LocalDate.of(2020, 1, 2), - behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), - ) - val behandler = - Behandler( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to false, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + ) shouldBeEqualTo status.first.ruleInputs + + status.first.treeResult.ruleHit shouldBeEqualTo + HPRRuleHit.BEHANDLER_MANGLER_AUTORISASJON_I_HPR.ruleHit + } + + test("LEGE har aktiv autorisasjon, Status OK") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 1, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = generateBehandler("LE") + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = BehandlerOgStartdato(behandler, null), + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.OK + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo listOf( - Godkjenning( - autorisasjon = - Kode( - aktiv = true, - oid = 7702, - verdi = "19", - ), - helsepersonellkategori = - Kode( - aktiv = true, - oid = 0, - verdi = "LE", - ), - ), - ), - ) - - val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) - - val ruleMetadata = sykmelding.toRuleMetadata() - - val ruleMetadataSykmelding = - RuleMetadataSykmelding( - ruleMetadata = ruleMetadata, - sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), - doctorSuspensjon = false, - behandlerOgStartdato = behandlerOgStartdato, - ) - - val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) - - status.first.treeResult.status shouldBeEqualTo Status.INVALID - status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo - listOf( - HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR to false, - HPRRules.BEHANDLER_MANGLER_AUTORISASJON_I_HPR to true, - ) - - mapOf( - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - ) shouldBeEqualTo status.first.ruleInputs - - status.first.treeResult.ruleHit shouldBeEqualTo - HPRRuleHit.BEHANDLER_MANGLER_AUTORISASJON_I_HPR.ruleHit - } - test("behandler ikke riktig helsepersonell kategori, Status INVALID") { - val sykmelding = - generateSykmelding( - fom = LocalDate.of(2020, 1, 1), - tom = LocalDate.of(2020, 1, 2), - behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), - ) - val behandler = - Behandler( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to true, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + ) shouldBeEqualTo status.first.ruleInputs + status.first.treeResult.ruleHit shouldBeEqualTo null + } + + test("TANNLEGE har aktiv autorisasjon, Status OK") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 1, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = generateBehandler("TL") + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = BehandlerOgStartdato(behandler, null), + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.OK + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo listOf( - Godkjenning( - autorisasjon = - Kode( - aktiv = true, - oid = 7704, - verdi = "18", - ), - helsepersonellkategori = - Kode( - aktiv = true, - oid = 0, - verdi = "PL", - ), - ), - ), - ) - - val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) - - val ruleMetadata = sykmelding.toRuleMetadata() - - val ruleMetadataSykmelding = - RuleMetadataSykmelding( - ruleMetadata = ruleMetadata, - sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), - doctorSuspensjon = false, - behandlerOgStartdato = behandlerOgStartdato, - ) - - val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) - - status.first.treeResult.status shouldBeEqualTo Status.INVALID - status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo - listOf( - HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR to false, - HPRRules.BEHANDLER_MANGLER_AUTORISASJON_I_HPR to false, - HPRRules.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR to true, - ) - - mapOf( - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - ) shouldBeEqualTo status.first.ruleInputs - - status.first.treeResult.ruleHit shouldBeEqualTo - HPRRuleHit.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR.ruleHit - } + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to true, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + ) shouldBeEqualTo status.first.ruleInputs + status.first.treeResult.ruleHit shouldBeEqualTo null + } + + test("Manuellterapaut har aktiv autorisasjon, Status OK") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 1, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = generateBehandler("MT") + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = BehandlerOgStartdato(behandler, null), + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.OK + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to true, + HPRRules.SYKEFRAVAR_OVER_12_UKER to false, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + "fom" to sykmelding.perioder.first().fom, + "tom" to sykmelding.perioder.first().tom, + "startDatoSykefravær" to sykmelding.perioder.first().fom, + ) shouldBeEqualTo status.first.ruleInputs + status.first.treeResult.ruleHit shouldBeEqualTo null + } + + test( + "Manuellterapaut har aktiv autorisasjon, sykefravæt over 12 uker, Status INVALID" + ) { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 1, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = generateBehandler("MT") + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = + BehandlerOgStartdato( + behandler, + sykmelding.perioder.first().tom.minusDays(85), + ), + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.INVALID + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to true, + HPRRules.SYKEFRAVAR_OVER_12_UKER to true, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + "fom" to sykmelding.perioder.first().fom, + "tom" to sykmelding.perioder.first().tom, + "startDatoSykefravær" to + (ruleMetadataSykmelding.behandlerOgStartdato.startdato), + ) shouldBeEqualTo status.first.ruleInputs + status.first.treeResult.ruleHit shouldBeEqualTo + HPRRuleHit.BEHANDLER_MT_FT_KI_OVER_12_UKER.ruleHit + } + + test("behandler ikke riktig helsepersonell kategori, Status INVALID") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 1, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = generateBehandler("PL") + + val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = behandlerOgStartdato, + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.INVALID + status.first.rulePath.map { it.rule to it.ruleResult } `should contain all` + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to false, + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR to false, + HPRRules.BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR to false, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + ) shouldBeEqualTo status.first.ruleInputs + + status.first.treeResult.ruleHit shouldBeEqualTo + HPRRuleHit.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR.ruleHit + } + + test("FT uten tilleggsinfo, Status INVALID") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 4, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = generateBehandler("FT") + + val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = behandlerOgStartdato, + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.INVALID + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to false, + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR to false, + HPRRules.BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR to false, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + ) shouldBeEqualTo status.first.ruleInputs + + status.first.treeResult.ruleHit shouldBeEqualTo + HPRRuleHit.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR.ruleHit + } + + test("FT Gyldig") { + val behandler = + generateBehandler( + "FT", + tilleggskompetanse = + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = LocalDate.of(2000, 1, 1).atStartOfDay(), + til = null, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ) + + val sykmedling = generateSykmelding() + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) + + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.OK + result.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to false, + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR to true, + HPRRules.SYKEFRAVAR_OVER_12_UKER to false + ) + } + + test("FT Gyldig over 12 uker, INVALID") { + val behandler = + generateBehandler( + "FT", + tilleggskompetanse = + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = LocalDate.of(2000, 1, 1).atStartOfDay(), + til = null, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ) + + val sykmelding = generateSykmelding() + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = + BehandlerOgStartdato( + behandler, + sykmelding.perioder.first().tom.minusDays(85), + ), + ) + + val result = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + result.first.treeResult.status shouldBeEqualTo Status.INVALID + result.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to false, + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR to true, + HPRRules.SYKEFRAVAR_OVER_12_UKER to true + ) + } + + test("KI uten tilleggsinfo, Status INVALID") { + val sykmelding = + generateSykmelding( + fom = LocalDate.of(2020, 1, 1), + tom = LocalDate.of(2020, 4, 2), + behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), + ) + val behandler = generateBehandler("KI") + + val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) + + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = behandlerOgStartdato, + ) + + val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + + status.first.treeResult.status shouldBeEqualTo Status.INVALID + status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to false, + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR to false, + HPRRules.BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR to false, + ) + + mapOf( + "behandlerGodkjenninger" to behandler.godkjenninger, + ) shouldBeEqualTo status.first.ruleInputs + + status.first.treeResult.ruleHit shouldBeEqualTo + HPRRuleHit.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR.ruleHit + } + + test("KI Gyldig") { + val behandler = + generateBehandler( + "KI", + tilleggskompetanse = + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = LocalDate.of(2000, 1, 1).atStartOfDay(), + til = null, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ) + + val sykmedling = generateSykmelding() + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) - test("behandler KI MT FT over 84 dager, Status INVALID") { - val sykmelding = - generateSykmelding( - fom = LocalDate.of(2020, 1, 1), - tom = LocalDate.of(2020, 4, 2), - behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), - ) - val behandler = - Behandler( + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.OK + result.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo listOf( - Godkjenning( - autorisasjon = - Kode( - aktiv = true, - oid = 7704, - verdi = "18", + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to false, + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR to false, + HPRRules.BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR to true, + HPRRules.SYKEFRAVAR_OVER_12_UKER to false + ) + } + + test("KI Gyldig over 12 uker, INVALID") { + val behandler = + generateBehandler( + "KI", + tilleggskompetanse = + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = LocalDate.of(2000, 1, 1).atStartOfDay(), + til = null, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ) + + val sykmelding = generateSykmelding() + val ruleMetadata = sykmelding.toRuleMetadata() + + val ruleMetadataSykmelding = + RuleMetadataSykmelding( + ruleMetadata = ruleMetadata, + sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), + doctorSuspensjon = false, + behandlerOgStartdato = + BehandlerOgStartdato( + behandler, + sykmelding.perioder.first().tom.minusDays(85), + ), + ) + + val result = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) + result.first.treeResult.status shouldBeEqualTo Status.INVALID + result.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo + listOf( + HPRRules.BEHANDLER_GYLIDG_I_HPR to true, + HPRRules.BEHANDLER_HAR_AUTORISASJON_I_HPR to true, + HPRRules.BEHANDLER_ER_LEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_TANNLEGE_I_HPR to false, + HPRRules.BEHANDLER_ER_MANUELLTERAPEUT_I_HPR to false, + HPRRules.BEHANDLER_ER_FT_MED_TILLEGSKOMPETANSE_I_HPR to false, + HPRRules.BEHANDLER_ER_KI_MED_TILLEGSKOMPETANSE_I_HPR to true, + HPRRules.SYKEFRAVAR_OVER_12_UKER to true + ) + } + + test("FT, Gyldig periode fom samme dag som genereringstidspunkt") { + val sykmedling = generateSykmelding() + val behandler = + Behandler( + godkjenninger = + listOf( + Godkjenning( + autorisasjon = Kode(aktiv = true, oid = 7704, verdi = "18"), + helsepersonellkategori = + Kode(aktiv = true, oid = 0, verdi = "FT"), + tillegskompetanse = + listOf( + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = sykmedling.signaturDato, + til = null, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ), ), - helsepersonellkategori = - Kode( - aktiv = true, - oid = 0, - verdi = "MT", + ), + ) + + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) + + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.OK + } + test("FT, ugylidg periode") { + val sykmedling = generateSykmelding() + val behandler = + Behandler( + godkjenninger = + listOf( + Godkjenning( + autorisasjon = Kode(aktiv = true, oid = 7704, verdi = "18"), + helsepersonellkategori = + Kode(aktiv = true, oid = 0, verdi = "FT"), + tillegskompetanse = + listOf( + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = + sykmedling.signaturDato.plusDays(1), + til = null, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ), ), - ), - ), - ) - - val behandlerOgStartdato = BehandlerOgStartdato(behandler, null) - - val ruleMetadata = sykmelding.toRuleMetadata() - - val ruleMetadataSykmelding = - RuleMetadataSykmelding( - ruleMetadata = ruleMetadata, - sykmeldingMetadataInfo = SykmeldingMetadataInfo(null, emptyList()), - doctorSuspensjon = false, - behandlerOgStartdato = behandlerOgStartdato, - ) - - val status = ruleTree.runRules(sykmelding, ruleMetadataSykmelding) - - status.first.treeResult.status shouldBeEqualTo Status.INVALID - status.first.rulePath.map { it.rule to it.ruleResult } shouldBeEqualTo - listOf( - HPRRules.BEHANDLER_IKKE_GYLDIG_I_HPR to false, - HPRRules.BEHANDLER_MANGLER_AUTORISASJON_I_HPR to false, - HPRRules.BEHANDLER_IKKE_LE_KI_MT_TL_FT_I_HPR to false, - HPRRules.BEHANDLER_MT_FT_KI_OVER_12_UKER to true, - ) - - mapOf( - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - "behandlerGodkjenninger" to behandler.godkjenninger, - ) shouldBeEqualTo status.first.ruleInputs - - status.first.treeResult.ruleHit shouldBeEqualTo - HPRRuleHit.BEHANDLER_MT_FT_KI_OVER_12_UKER.ruleHit - } - } - - test("test") { - val behandler = - Behandler( - listOf( - Godkjenning( - autorisasjon = - Kode( - aktiv = false, - oid = 7704, - verdi = "99", ), - helsepersonellkategori = - Kode( - aktiv = true, - oid = 9060, - verdi = "HP", + ) + + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) + + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.INVALID + } + + test("FT, ugylidg periode tom før genereringstidspunkt") { + val sykmedling = generateSykmelding() + val behandler = + Behandler( + godkjenninger = + listOf( + Godkjenning( + autorisasjon = Kode(aktiv = true, oid = 7704, verdi = "18"), + helsepersonellkategori = + Kode(aktiv = true, oid = 0, verdi = "FT"), + tillegskompetanse = + listOf( + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = + sykmedling.signaturDato.minusDays( + 10, + ), + til = + sykmedling.signaturDato.minusDays( + 1, + ), + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ), + ), + ), + ) + + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) + + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.INVALID + } + + test("FT, gyldig periode tom samme som genereringstidspunkt") { + val sykmedling = generateSykmelding() + val behandler = + Behandler( + godkjenninger = + listOf( + Godkjenning( + autorisasjon = Kode(aktiv = true, oid = 7704, verdi = "18"), + helsepersonellkategori = + Kode(aktiv = true, oid = 0, verdi = "FT"), + tillegskompetanse = + listOf( + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = + sykmedling.signaturDato.minusDays( + 10, + ), + til = sykmedling.signaturDato, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "1", + ), + ), + ), + ), + ), + ) + + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) + + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.OK + } + test("FT, ugyldig, feil tillegskompetanse type verdi") { + val sykmedling = generateSykmelding() + val behandler = + Behandler( + godkjenninger = + listOf( + Godkjenning( + autorisasjon = Kode(aktiv = true, oid = 7704, verdi = "18"), + helsepersonellkategori = + Kode(aktiv = true, oid = 0, verdi = "FT"), + tillegskompetanse = + listOf( + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = + sykmedling.signaturDato.minusDays( + 10, + ), + til = sykmedling.signaturDato, + ), + id = null, + type = + Kode( + aktiv = true, + oid = 7702, + verdi = "2", + ), + ), + ), + ), + ), + ) + + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) + + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.INVALID + } + test("FT, ugyldig, feil tillegskompetanse er ikke aktiv") { + val sykmedling = generateSykmelding() + val behandler = + Behandler( + godkjenninger = + listOf( + Godkjenning( + autorisasjon = Kode(aktiv = true, oid = 7704, verdi = "18"), + helsepersonellkategori = + Kode(aktiv = true, oid = 0, verdi = "FT"), + tillegskompetanse = + listOf( + Tilleggskompetanse( + avsluttetStatus = null, + eTag = null, + gyldig = + Periode( + fra = + LocalDate.of(2000, 1, 1) + .atStartOfDay(), + til = null, + ), + id = null, + type = + Kode( + aktiv = false, + oid = 7702, + verdi = "2", + ), + ), + ), + ), ), - ), - Godkjenning( - helsepersonellkategori = Kode(aktiv = true, verdi = "LE", oid = 9060), - autorisasjon = Kode(aktiv = true, oid = 7704, verdi = "1"), - ), + ) + + val mockRuleMetadata = mockk() + every { mockRuleMetadata.behandlerOgStartdato } returns + BehandlerOgStartdato(behandler, null) + + val result = ruleTree.runRules(sykmedling, mockRuleMetadata) + result.first.treeResult.status shouldBeEqualTo Status.INVALID + } + } + }, + ) + +private fun generateBehandler( + helsepersonellKategori: String, + tilleggskompetanse: Tilleggskompetanse? = null, + autorisasjon: Kode = + Kode( + aktiv = true, + oid = 7704, + verdi = "18", + ), +) = + Behandler( + listOf( + Godkjenning( + autorisasjon = autorisasjon, + helsepersonellkategori = + Kode( + aktiv = true, + oid = 0, + verdi = helsepersonellKategori, ), - ) - val sykmelding = - generateSykmelding( - fom = LocalDate.of(2020, 1, 1), - tom = LocalDate.of(2020, 4, 2), - behandletTidspunkt = LocalDate.of(2020, 1, 3).atStartOfDay(), - ) - val mockRuleMetadata = mockk() - every { mockRuleMetadata.behandlerOgStartdato } returns - BehandlerOgStartdato(behandler, null) - val result = ruleTree.runRules(sykmelding, mockRuleMetadata) - result.first.treeResult.status shouldBeEqualTo Status.OK - } - }) + tillegskompetanse = + tilleggskompetanse?.let { + listOf( + tilleggskompetanse, + ) + } + ?: emptyList(), + ), + ), + )