diff --git a/dusseldorf-common/src/main/kotlin/no/nav/helse/dusseldorf/common/Personidentifikator.kt b/dusseldorf-common/src/main/kotlin/no/nav/helse/dusseldorf/common/Personidentifikator.kt index b053ea8e..8f1ced70 100644 --- a/dusseldorf-common/src/main/kotlin/no/nav/helse/dusseldorf/common/Personidentifikator.kt +++ b/dusseldorf-common/src/main/kotlin/no/nav/helse/dusseldorf/common/Personidentifikator.kt @@ -20,6 +20,7 @@ class Personidentifikator(private val ident: String) { val TEST_NORGE_GRENSEVERDI = 8 //Syntetisk bruker fra TestNorge som har tredje siffer + 8 val D_NUMMER_GRENSEVERDI = 4 //D-nummer har første siffer + 4 + val DOLLY_FNR_GRENSEVERDI = 40 //FNR fra Dolly har + 40 på måned val vekttallProviderFnr1: (Int) -> Int = { arrayOf(3, 7, 6, 1, 8, 9, 4, 5, 2).reversedArray()[it] } val vekttallProviderFnr2: (Int) -> Int = { arrayOf(5, 4, 3, 2, 7, 6, 5, 4, 3, 2).reversedArray()[it] } @@ -34,6 +35,8 @@ class Personidentifikator(private val ident: String) { type = when { erTestNorgeDNummer() -> Type.TEST_NORGE_DNR erTestNorgeFNummer() -> Type.TEST_NORGE_FNR + erDollyDnr() -> Type.DOLLY_DNR + erDollyFnr() -> Type.DOLLY_FNR erDNummer() -> Type.DNR else -> Type.FNR } @@ -123,6 +126,18 @@ class Personidentifikator(private val ident: String) { fødselsdatoFormat.parse(ident.take(6)) true } + + Type.DOLLY_FNR -> { + val tilVanligFraDollyFNR = ident.tilVanligFraDollyFNR() + fødselsdatoFormat.parse(tilVanligFraDollyFNR.take(6)) + true + } + + Type.DOLLY_DNR -> { + val tilVanligFraDollyDNR = ident.tilVanligFraDollyDNR() + fødselsdatoFormat.parse(tilVanligFraDollyDNR.take(6)) + true + } } } catch (cause: Throwable) { logger.warn("Feilet med å parse fødselsdato for type: $type. Grunn:", cause) @@ -140,16 +155,43 @@ class Personidentifikator(private val ident: String) { private fun førsteSiffer(): Int = ident.substring(0, 1).toInt() private fun tredjeSiffer(): Int = ident.substring(2, 3).toInt() + private fun tredjeOgFjerdeSiffer(): Int = ident.substring(2, 4).toInt() private fun String.tilVanligFraDNummer(): String = replaceRange(0, 1, "${førsteSiffer() - D_NUMMER_GRENSEVERDI}") private fun String.tilVanligFraTestNorgeNummer(): String = replaceRange(2, 3, "${tredjeSiffer() - TEST_NORGE_GRENSEVERDI}") + private fun String.tilVanligFraDollyFNR(): String { + val dag = this.substring(0, 2) + var måned = this.substring(2, 4).toInt() + val år = this.substring(4, 6) + val personNummer = this.substring(6) + + måned -= DOLLY_FNR_GRENSEVERDI + val nyMåned = if (måned < 10) "0$måned" else måned.toString() + + return "$dag$nyMåned$år$personNummer" + } + private fun String.tilVanligFraDollyDNR(): String { + var dag = this.substring(0, 2) + var måned = this.substring(2, 4).toInt() + val år = this.substring(4, 6) + val personNummer = this.substring(6) + + måned -= DOLLY_FNR_GRENSEVERDI + val nyDag = dag.replaceRange(0, 1, "${førsteSiffer() - D_NUMMER_GRENSEVERDI}") + val nyMåned = if (måned < 10) "0$måned" else måned.toString() + + return "$nyDag$nyMåned$år$personNummer" + } + private fun erTestNorgeFNummer(): Boolean = tredjeSiffer() >= TEST_NORGE_GRENSEVERDI + private fun erDollyFnr(): Boolean = tredjeOgFjerdeSiffer() >= DOLLY_FNR_GRENSEVERDI + private fun erDollyDnr(): Boolean = erDollyFnr() && erDNummer() private fun erDNummer(): Boolean = førsteSiffer() >= D_NUMMER_GRENSEVERDI private fun erTestNorgeDNummer(): Boolean = erTestNorgeFNummer() && erDNummer() enum class Type { - FNR, DNR, TEST_NORGE_FNR, TEST_NORGE_DNR + FNR, DNR, TEST_NORGE_FNR, TEST_NORGE_DNR, DOLLY_FNR, DOLLY_DNR } } diff --git a/dusseldorf-common/src/test/kotlin/no/nav/helse/dusseldorf/common/PersonidentifikatorTest.kt b/dusseldorf-common/src/test/kotlin/no/nav/helse/dusseldorf/common/PersonidentifikatorTest.kt index 96d4e1e7..4f1c407a 100644 --- a/dusseldorf-common/src/test/kotlin/no/nav/helse/dusseldorf/common/PersonidentifikatorTest.kt +++ b/dusseldorf-common/src/test/kotlin/no/nav/helse/dusseldorf/common/PersonidentifikatorTest.kt @@ -42,6 +42,13 @@ internal class PersonidentifikatorTest { // TEST_NORGE_DNR "42921275204", // D-nummer fra TestNorge med +4 på første siffer og +8 på tredje + // DOLLY_FNR (+40 i måned) + "17912099997", "12429400544", "12505209719", // Mann + "29822099635", "05440355678", "21483609245", // Kvinne + + // DOLLY_DNR (+4 på første siffer og +40 i måned) + "55507608360", "52429405181", "52505209540", // Mann + "69422056629", "45440356293", "61483601467" // Kvinne ] ) internal fun `gitt gyldige identer, forvent ingen feil`(ident: String) {