Skip to content

Commit

Permalink
feat: Fix diagnosekoder regler (#268)
Browse files Browse the repository at this point in the history
Co-authored-by: Jørn-Are Flaten <[email protected]>
  • Loading branch information
andreasDev and jaflaten authored Oct 8, 2024
1 parent 6921560 commit 2f40c6c
Show file tree
Hide file tree
Showing 5 changed files with 515 additions and 347 deletions.
22 changes: 12 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -218,16 +218,18 @@ graph TD

```mermaid
graph TD
root(UKJENT_DIAGNOSEKODETYPE) -->|Yes| root_UKJENT_DIAGNOSEKODETYPE_INVALID(INVALID):::invalid
root(UKJENT_DIAGNOSEKODETYPE) -->|No| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE(ICPC_2_Z_DIAGNOSE)
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE(ICPC_2_Z_DIAGNOSE) -->|Yes| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_INVALID(INVALID):::invalid
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE(ICPC_2_Z_DIAGNOSE) -->|No| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER(HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER)
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER(HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER) -->|Yes| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_INVALID(INVALID):::invalid
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER(HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER) -->|No| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE(UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE)
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE(UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE) -->|Yes| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_INVALID(INVALID):::invalid
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE(UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE) -->|No| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE)
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) -->|Yes| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE_INVALID(INVALID):::invalid
root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) -->|No| root_UKJENT_DIAGNOSEKODETYPE_ICPC_2_Z_DIAGNOSE_HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE_OK(OK):::ok
root(HOVEDDIAGNOSE_MANGLER) -->|Yes| root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER(FRAVAERSGRUNN_MANGLER)
root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER(FRAVAERSGRUNN_MANGLER) -->|Yes| root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER_INVALID(INVALID):::invalid
root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER(FRAVAERSGRUNN_MANGLER) -->|No| root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE)
root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) -->|Yes| root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE_INVALID(INVALID):::invalid
root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) -->|No| root_HOVEDDIAGNOSE_MANGLER_FRAVAERSGRUNN_MANGLER_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE_OK(OK):::ok
root(HOVEDDIAGNOSE_MANGLER) -->|No| root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE(UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE)
root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE(UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE) -->|Yes| root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_INVALID(INVALID):::invalid
root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE(UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE) -->|No| root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE(ICPC_2_Z_DIAGNOSE)
root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE(ICPC_2_Z_DIAGNOSE) -->|Yes| root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE_INVALID(INVALID):::invalid
root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE(ICPC_2_Z_DIAGNOSE) -->|No| root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE)
root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) -->|Yes| root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE_INVALID(INVALID):::invalid
root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE(UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) -->|No| root_HOVEDDIAGNOSE_MANGLER_UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE_ICPC_2_Z_DIAGNOSE_UGYLDIG_KODEVERK_FOR_BIDIAGNOSE_OK(OK):::ok
classDef ok fill:#c3ff91,stroke:#004a00,color: black;
classDef invalid fill:#ff7373,stroke:#ff0000,color: black;
classDef manuell fill:#ffe24f,stroke:#ffd500,color: #473c00;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,6 @@ private fun getJuridiskHenvisning(): JuridiskHenvisning =
enum class ArbeidsuforhetRuleHit(
val ruleHit: RuleHit,
) {
UKJENT_DIAGNOSEKODETYPE(
ruleHit =
RuleHit(
rule = "UKJENT_DIAGNOSEKODETYPE",
status = Status.INVALID,
messageForSender =
"Sykmeldingen kan ikke rettes, det må skrives en ny. " +
"Pasienten har fått beskjed om å vente på ny sykmelding fra deg. Grunnet følgende:" +
"Ukjent kodeverk er benyttet for diagnosen.",
messageForUser = "Sykmeldingen må ha et kjent kodeverk for diagnosen.",
),
),
ICPC_2_Z_DIAGNOSE(
ruleHit =
RuleHit(
Expand All @@ -39,7 +27,7 @@ enum class ArbeidsuforhetRuleHit(
messageForUser = "Den må ha en gyldig diagnosekode som gir rett til sykepenger.",
),
),
HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER(
FRAVAERSGRUNN_MANGLER(
ruleHit =
RuleHit(
rule = "HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,29 @@ import no.nav.syfo.rules.dsl.RuleNode
import no.nav.syfo.rules.dsl.tree

enum class ArbeidsuforhetRules {
UKJENT_DIAGNOSEKODETYPE,
ICPC_2_Z_DIAGNOSE,
HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER,
HOVEDDIAGNOSE_MANGLER,
FRAVAERSGRUNN_MANGLER,
UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE,
UGYLDIG_KODEVERK_FOR_BIDIAGNOSE,
}

val arbeidsuforhetRuleTree =
tree<ArbeidsuforhetRules, RuleResult>(ArbeidsuforhetRules.UKJENT_DIAGNOSEKODETYPE) {
yes(INVALID, ArbeidsuforhetRuleHit.UKJENT_DIAGNOSEKODETYPE)
no(ArbeidsuforhetRules.ICPC_2_Z_DIAGNOSE) {
yes(INVALID, ArbeidsuforhetRuleHit.ICPC_2_Z_DIAGNOSE)
no(ArbeidsuforhetRules.HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER) {
yes(INVALID, ArbeidsuforhetRuleHit.HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER)
no(ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE) {
yes(INVALID, ArbeidsuforhetRuleHit.UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE)
no(ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) {
yes(INVALID, ArbeidsuforhetRuleHit.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE)
no(OK)
}
tree<ArbeidsuforhetRules, RuleResult>(ArbeidsuforhetRules.HOVEDDIAGNOSE_MANGLER) {
yes(ArbeidsuforhetRules.FRAVAERSGRUNN_MANGLER) {
yes(INVALID, ArbeidsuforhetRuleHit.FRAVAERSGRUNN_MANGLER)
no(ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) {
yes(INVALID, ArbeidsuforhetRuleHit.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE)
no(OK)
}
}
no(ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE) {
yes(INVALID, ArbeidsuforhetRuleHit.UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE)
no(ArbeidsuforhetRules.ICPC_2_Z_DIAGNOSE) {
yes(INVALID, ArbeidsuforhetRuleHit.ICPC_2_Z_DIAGNOSE)
no(ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE) {
yes(INVALID, ArbeidsuforhetRuleHit.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE)
no(OK)
}
}
}
Expand Down Expand Up @@ -61,11 +64,10 @@ internal fun RuleNode<ArbeidsuforhetRules, RuleResult>.no(

fun getRule(rules: ArbeidsuforhetRules): Rule<ArbeidsuforhetRules> {
return when (rules) {
ArbeidsuforhetRules.UKJENT_DIAGNOSEKODETYPE -> ukjentDiagnoseKodeType
ArbeidsuforhetRules.ICPC_2_Z_DIAGNOSE -> icpc2ZDiagnose
ArbeidsuforhetRules.HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER ->
houvedDiagnoseEllerFraversgrunnMangler
ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE -> ugyldigKodeVerkHouvedDiagnose
ArbeidsuforhetRules.HOVEDDIAGNOSE_MANGLER -> manglerHovedDiagnose
ArbeidsuforhetRules.FRAVAERSGRUNN_MANGLER -> manglerAnnenFravarsArsak
ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE -> ugyldigKodeVerkHovedDiagnose
ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE -> ugyldigKodeVerkBiDiagnose
}
}
52 changes: 27 additions & 25 deletions src/main/kotlin/no/nav/syfo/rules/arbeidsuforhet/Rules.kt
Original file line number Diff line number Diff line change
Expand Up @@ -6,22 +6,12 @@ import no.nav.syfo.model.RuleMetadata
import no.nav.syfo.model.Sykmelding
import no.nav.syfo.rules.dsl.RuleResult

object EmptyObject {}

typealias Rule<T> = (sykmelding: Sykmelding, ruleMetadata: RuleMetadata) -> RuleResult<T>

typealias ArbeidsuforhetRule = Rule<ArbeidsuforhetRules>

val ukjentDiagnoseKodeType: ArbeidsuforhetRule = { sykmelding, _ ->
val hoveddiagnose = sykmelding.medisinskVurdering.hovedDiagnose

val ukjentDiagnoseKodeType = hoveddiagnose != null && hoveddiagnose.system !in Diagnosekoder

RuleResult(
ruleInputs = mapOf("ukjentDiagnoseKodeType" to ukjentDiagnoseKodeType),
rule = ArbeidsuforhetRules.UKJENT_DIAGNOSEKODETYPE,
ruleResult = ukjentDiagnoseKodeType,
)
}

val icpc2ZDiagnose: ArbeidsuforhetRule = { sykmelding, _ ->
val hoveddiagnose = sykmelding.medisinskVurdering.hovedDiagnose

Expand All @@ -35,40 +25,52 @@ val icpc2ZDiagnose: ArbeidsuforhetRule = { sykmelding, _ ->
)
}

val houvedDiagnoseEllerFraversgrunnMangler: ArbeidsuforhetRule = { sykmelding, _ ->
val manglerHovedDiagnose: ArbeidsuforhetRule = { sykmelding, _ ->
val hovedDiagnose = sykmelding.medisinskVurdering.hovedDiagnose

RuleResult(
ruleInputs =
mapOf(
"hovedDiagnose" to (hovedDiagnose ?: EmptyObject),
),
rule = ArbeidsuforhetRules.HOVEDDIAGNOSE_MANGLER,
ruleResult = hovedDiagnose == null,
)
}

val manglerAnnenFravarsArsak: ArbeidsuforhetRule = { sykmelding, _ ->
val annenFraversArsak = sykmelding.medisinskVurdering.annenFraversArsak
val hoveddiagnose = sykmelding.medisinskVurdering.hovedDiagnose

val houvedDiagnoseEllerFraversgrunnMangler = annenFraversArsak == null && hoveddiagnose == null
val fraversgrunnMangler =
(annenFraversArsak?.let { it.grunn.isEmpty() && it.beskrivelse.isNullOrBlank() } ?: true)

RuleResult(
ruleInputs =
mapOf(
"houvedDiagnoseEllerFraversgrunnMangler" to houvedDiagnoseEllerFraversgrunnMangler
"annenFraversArsak" to (annenFraversArsak ?: EmptyObject),
),
rule = ArbeidsuforhetRules.HOVEDDIAGNOSE_ELLER_FRAVAERSGRUNN_MANGLER,
ruleResult = houvedDiagnoseEllerFraversgrunnMangler,
rule = ArbeidsuforhetRules.FRAVAERSGRUNN_MANGLER,
ruleResult = fraversgrunnMangler,
)
}

val ugyldigKodeVerkHouvedDiagnose: ArbeidsuforhetRule = { sykmelding, _ ->
val ugyldigKodeVerkHovedDiagnose: ArbeidsuforhetRule = { sykmelding, _ ->
val hoveddiagnose = sykmelding.medisinskVurdering.hovedDiagnose
val annenFravarsArsak = sykmelding.medisinskVurdering.annenFraversArsak

val ugyldigKodeVerkHouvedDiagnose =
val ugyldigKodeverkHovedDiagnose =
(hoveddiagnose?.system !in arrayOf(Diagnosekoder.ICPC2_CODE, Diagnosekoder.ICD10_CODE) ||
hoveddiagnose?.let { diagnose ->
if (diagnose.isICPC2()) {
Diagnosekoder.icpc2.containsKey(diagnose.kode)
} else {
Diagnosekoder.icd10.containsKey(diagnose.kode)
}
} != true) && annenFravarsArsak == null
} != true)

RuleResult(
ruleInputs = mapOf("ugyldigKodeVerkHouvedDiagnose" to ugyldigKodeVerkHouvedDiagnose),
ruleInputs = mapOf("ugyldigKodeverkHovedDiagnose" to ugyldigKodeverkHovedDiagnose),
rule = ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_HOVEDDIAGNOSE,
ruleResult = ugyldigKodeVerkHouvedDiagnose,
ruleResult = ugyldigKodeverkHovedDiagnose,
)
}

Expand All @@ -85,7 +87,7 @@ val ugyldigKodeVerkBiDiagnose: ArbeidsuforhetRule = { sykmelding, _ ->
}

RuleResult(
ruleInputs = mapOf("ugyldigKodeVerkBiDiagnose" to ugyldigKodeVerkBiDiagnose),
ruleInputs = mapOf("biDiagnoser" to biDiagnoser),
rule = ArbeidsuforhetRules.UGYLDIG_KODEVERK_FOR_BIDIAGNOSE,
ruleResult = ugyldigKodeVerkBiDiagnose,
)
Expand Down
Loading

0 comments on commit 2f40c6c

Please sign in to comment.