From 21739a055d23617b50b49a20be3182a851ea043c Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Sun, 22 Jun 2025 12:01:38 +0200 Subject: [PATCH] feat: add display and system to patient data --- .../onco/datamapper/PropertyCatalogue.java | 2 +- .../mapper/KpaPatientDataMapper.java | 35 ++++++++++++++----- .../onco/datamapper/mapper/MtbDataMapper.java | 16 +++++---- .../datamapper/mapper/PatientDataMapper.java | 12 ++++--- .../mapper/KpaPatientDataMapperTest.java | 34 +++++++++++++++--- 5 files changed, 75 insertions(+), 24 deletions(-) diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/PropertyCatalogue.java b/src/main/java/dev/pcvolkmer/onco/datamapper/PropertyCatalogue.java index 6e47426..93a95d4 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/PropertyCatalogue.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/PropertyCatalogue.java @@ -60,7 +60,7 @@ public class PropertyCatalogue { private final String shortdesc; private final String description; - Entry(String code, String shortdesc, String description) { + public Entry(String code, String shortdesc, String description) { this.code = code; this.shortdesc = shortdesc; this.description = description; diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java index 7fec0d4..c866e56 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapper.java @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.*; +import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; @@ -13,9 +14,14 @@ import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; public class KpaPatientDataMapper implements DataMapper { private final KpaCatalogue kpaCatalogue; + private final PropertyCatalogue propertyCatalogue; - public KpaPatientDataMapper(final KpaCatalogue kpaCatalogue) { + public KpaPatientDataMapper( + final KpaCatalogue kpaCatalogue, + final PropertyCatalogue propertyCatalogue + ) { this.kpaCatalogue = kpaCatalogue; + this.propertyCatalogue = propertyCatalogue; } /** @@ -40,30 +46,36 @@ public class KpaPatientDataMapper implements DataMapper { } private GenderCoding getGenderCoding(ResultSet data) { - var genderCodingBuilder = GenderCoding.builder(); + var genderCodingBuilder = GenderCoding.builder() + .system("Gender"); + String geschlecht = data.getString("geschlecht"); switch (geschlecht) { case "m": - genderCodingBuilder.code(GenderCodingCode.MALE); + genderCodingBuilder.code(GenderCodingCode.MALE).display("Männlich"); break; case "w": - genderCodingBuilder.code(GenderCodingCode.FEMALE); + genderCodingBuilder.code(GenderCodingCode.FEMALE).display("Weiblich"); break; case "d": case "x": - genderCodingBuilder.code(GenderCodingCode.OTHER); + genderCodingBuilder.code(GenderCodingCode.OTHER).display("Divers"); break; default: - genderCodingBuilder.code(GenderCodingCode.UNKNOWN); + genderCodingBuilder.code(GenderCodingCode.UNKNOWN).display("Unbekannt"); } return genderCodingBuilder.build(); } private HealthInsurance getHealthInsurance(ResultSet data) { - var healthInsuranceCodingBuilder = HealthInsuranceCoding.builder(); + var healthInsuranceCodingBuilder = HealthInsuranceCoding.builder() + .system("http://fhir.de/CodeSystem/versicherungsart-de-basis"); + String healthInsuranceType = data.getString("artderkrankenkasse"); if (healthInsuranceType == null) { - healthInsuranceCodingBuilder.code(HealthInsuranceCodingCode.UNK).build(); + healthInsuranceCodingBuilder + .code(HealthInsuranceCodingCode.UNK) + .build(); return HealthInsurance.builder().type(healthInsuranceCodingBuilder.build()).build(); } @@ -99,6 +111,13 @@ public class KpaPatientDataMapper implements DataMapper { healthInsuranceCodingBuilder.code(HealthInsuranceCodingCode.UNK).build(); } + var healthInsurancePropertyEntry = propertyCatalogue.getByCodeAndVersion( + data.getString("artderkrankenkasse"), + data.getInteger("artderkrankenkasse_propcat_version") + ); + + healthInsuranceCodingBuilder.display(healthInsurancePropertyEntry.getDescription()); + return HealthInsurance.builder().type(healthInsuranceCodingBuilder.build()).build(); } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java index 032bddf..b5180ee 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java @@ -1,10 +1,8 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.Mtb; -import dev.pcvolkmer.onco.datamapper.datacatalogues.DataCatalogueFactory; -import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; -import dev.pcvolkmer.onco.datamapper.datacatalogues.PatientCatalogue; -import dev.pcvolkmer.onco.datamapper.datacatalogues.ProzedurCatalogue; +import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; +import dev.pcvolkmer.onco.datamapper.datacatalogues.*; import dev.pcvolkmer.onco.datamapper.exceptions.DataAccessException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -24,9 +22,11 @@ public class MtbDataMapper implements DataMapper { private final Logger logger = LoggerFactory.getLogger(this.getClass()); private final DataCatalogueFactory catalogueFactory; + private final PropertyCatalogue propertyCatalogue; MtbDataMapper(final JdbcTemplate jdbcTemplate) { this.catalogueFactory = DataCatalogueFactory.initialize(jdbcTemplate); + this.propertyCatalogue = PropertyCatalogue.initialize(jdbcTemplate); } /** @@ -59,8 +59,12 @@ public class MtbDataMapper implements DataMapper { public Mtb getById(int kpaId) { var kpaCatalogue = catalogueFactory.catalogue(KpaCatalogue.class); var patientDataMapper = new PatientDataMapper(catalogueFactory.catalogue(PatientCatalogue.class)); - var kpaPatientDataMapper = new KpaPatientDataMapper(kpaCatalogue); - var diagnosisDataMapper = new KpaDiagnosisDataMapper(kpaCatalogue); + var kpaPatientDataMapper = new KpaPatientDataMapper(kpaCatalogue, propertyCatalogue); + var diagnosisDataMapper = new KpaDiagnosisDataMapper( + kpaCatalogue, + catalogueFactory.catalogue(TumorausbreitungCatalogue.class), + catalogueFactory.catalogue(TumorgradingCatalogue.class) + ); var prozedurMapper = new KpaProzedurDataMapper(catalogueFactory.catalogue(ProzedurCatalogue.class)); var resultBuilder = Mtb.builder(); diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java index a55fe29..3edf6b5 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/PatientDataMapper.java @@ -43,20 +43,22 @@ public class PatientDataMapper implements DataMapper { } private GenderCoding getGenderCoding(final ResultSet data) { - var genderCodingBuilder = GenderCoding.builder(); + var genderCodingBuilder = GenderCoding.builder() + .system("Gender"); + String geschlecht = data.getString("geschlecht"); switch (geschlecht) { case "M": - genderCodingBuilder.code(GenderCodingCode.MALE); + genderCodingBuilder.code(GenderCodingCode.MALE).display("Männlich"); break; case "F": - genderCodingBuilder.code(GenderCodingCode.FEMALE); + genderCodingBuilder.code(GenderCodingCode.FEMALE).display("Weiblich"); break; case "X": - genderCodingBuilder.code(GenderCodingCode.OTHER); + genderCodingBuilder.code(GenderCodingCode.OTHER).display("Divers"); break; default: - genderCodingBuilder.code(GenderCodingCode.UNKNOWN); + genderCodingBuilder.code(GenderCodingCode.UNKNOWN).display("Unbekannt"); } return genderCodingBuilder.build(); } diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java index e0edd30..3dcb90f 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaPatientDataMapperTest.java @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.*; +import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; import org.junit.jupiter.api.BeforeEach; @@ -23,13 +24,18 @@ import static org.mockito.Mockito.doAnswer; class KpaPatientDataMapperTest { KpaCatalogue kpaCatalogue; + PropertyCatalogue propertyCatalogue; KpaPatientDataMapper dataMapper; @BeforeEach - void setUp(@Mock KpaCatalogue kpaCatalogue) { + void setUp( + @Mock KpaCatalogue kpaCatalogue, + @Mock PropertyCatalogue propertyCatalogue + ) { this.kpaCatalogue = kpaCatalogue; - this.dataMapper = new KpaPatientDataMapper(kpaCatalogue); + this.propertyCatalogue = propertyCatalogue; + this.dataMapper = new KpaPatientDataMapper(kpaCatalogue, propertyCatalogue); } @Test @@ -61,6 +67,10 @@ class KpaPatientDataMapperTest { .when(kpaCatalogue) .getById(anyInt()); + doAnswer(invocationOnMock -> + new PropertyCatalogue.Entry("GKV", "Gesetzliche Krankenversicherung", "Gesetzliche Krankenversicherung") + ).when(propertyCatalogue).getByCodeAndVersion(anyString(), anyInt()); + var actual = this.dataMapper.getById(1); assertThat(actual).isInstanceOf(Patient.class); assertThat(actual.getId()).isEqualTo("1"); @@ -68,7 +78,13 @@ class KpaPatientDataMapperTest { assertThat(actual.getBirthDate()).isEqualTo(Date.from(Instant.parse("2000-01-01T12:00:00Z"))); assertThat(actual.getDateOfDeath()).isEqualTo(Date.from(Instant.parse("2024-06-19T12:00:00Z"))); assertThat(actual.getHealthInsurance()).isEqualTo( - HealthInsurance.builder().type(HealthInsuranceCoding.builder().code(HealthInsuranceCodingCode.GKV).build()).build() + HealthInsurance.builder().type( + HealthInsuranceCoding.builder() + .code(HealthInsuranceCodingCode.GKV) + .display("Gesetzliche Krankenversicherung") + .system("http://fhir.de/CodeSystem/versicherungsart-de-basis") + .build() + ).build() ); } @@ -95,6 +111,10 @@ class KpaPatientDataMapperTest { .when(kpaCatalogue) .getById(anyInt()); + doAnswer(invocationOnMock -> + new PropertyCatalogue.Entry("PKV", "Private Krankenversicherung", "Private Krankenversicherung") + ).when(propertyCatalogue).getByCodeAndVersion(anyString(), anyInt()); + var actual = this.dataMapper.getById(1); assertThat(actual).isInstanceOf(Patient.class); assertThat(actual.getId()).isEqualTo("1"); @@ -102,7 +122,13 @@ class KpaPatientDataMapperTest { assertThat(actual.getBirthDate()).isEqualTo(Date.from(Instant.parse("2000-01-01T12:00:00Z"))); assertThat(actual.getDateOfDeath()).isNull(); assertThat(actual.getHealthInsurance()).isEqualTo( - HealthInsurance.builder().type(HealthInsuranceCoding.builder().code(HealthInsuranceCodingCode.PKV).build()).build() + HealthInsurance.builder().type( + HealthInsuranceCoding.builder() + .code(HealthInsuranceCodingCode.PKV) + .display("Private Krankenversicherung") + .system("http://fhir.de/CodeSystem/versicherungsart-de-basis") + .build() + ).build() ); }