From 798729b874973f9cfaeef28fd5dffd7511218405 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Sat, 28 Jun 2025 22:22:10 +0200 Subject: [PATCH] feat: add genetic counseling recommendation --- .../pcvolkmer/onco/datamapper/ResultSet.java | 25 ++++++++++ .../mapper/TherapieplanDataMapper.java | 36 +++++++++++++++ .../mapper/TherapieplanDataMapperTest.java | 46 +++++++++++++++++++ 3 files changed, 107 insertions(+) diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java b/src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java index abd8cfc..3345d1e 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/ResultSet.java @@ -121,4 +121,29 @@ public class ResultSet { throw new IllegalArgumentException("Cannot convert " + raw.getClass() + " to Date"); } + /** + * Check column value is equal to true + * + * @param columnName The name of the column + * @return True if column value is equal to true + */ + public boolean isTrue(String columnName) { + var raw = this.rawData.get(columnName); + + if (raw == null) { + return false; + } + if (raw instanceof Boolean) { + return ((Boolean) raw); + } else if (raw instanceof Integer) { + return ((Integer) raw) == 1; + } else if (raw instanceof Long) { + return ((Long) raw) == 1; + } else if (raw instanceof String) { + return raw.toString().equals("1"); + } + + throw new IllegalArgumentException("Cannot convert " + raw.getClass() + " to Boolean"); + } + } diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapper.java index 42a94f0..767e49f 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapper.java @@ -57,11 +57,13 @@ public class TherapieplanDataMapper implements DataMapper { .procedureRecommendations(einzelempfehlungProzedurDataMapper.getByParentId(id)) ; + // Formularfeld "protokollauszug" if (therapieplanData.getString("protokollauszug") != null) { // TODO see https://github.com/dnpm-dip/mtb-model/issues/8 builder.notes(List.of(therapieplanData.getString("protokollauszug"))); } + // Formularfeld "status_begruendung" if ( null != therapieplanData.getString("status_begruendung") && therapieplanData.getString("status_begruendung").equals(MtbCarePlanRecommendationsMissingReasonCodingCode.NO_TARGET.toValue()) @@ -77,6 +79,23 @@ public class TherapieplanDataMapper implements DataMapper { ); } + // Humangenetische Beratung + if (therapieplanData.isTrue("humangen_beratung")) { + builder.geneticCounselingRecommendation( + GeneticCounselingRecommendation.builder() + .id(therapieplanData.getString("id")) + .patient(getPatientReference(therapieplanData.getString("patient_id"))) + .issuedOn(therapieplanData.getDate("datum_tk_humangenber")) + .reason( + getGeneticCounselingRecommendationReasonCoding( + therapieplanData.getString("humangen_ber_grund"), + therapieplanData.getInteger("humangen_ber_grund_propcat_version") + ) + ) + .build() + ); + } + return builder.build(); } @@ -95,4 +114,21 @@ public class TherapieplanDataMapper implements DataMapper { return resultBuilder.build(); } + private GeneticCounselingRecommendationReasonCoding getGeneticCounselingRecommendationReasonCoding(String value, int version) { + if (value == null || !Arrays.stream(GeneticCounselingRecommendationReasonCodingCode.values()).map(GeneticCounselingRecommendationReasonCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { + return null; + } + + var resultBuilder = GeneticCounselingRecommendationReasonCoding.builder() + .system("dnpm-dip/mtb/recommendation/genetic-counseling/reason"); + try { + resultBuilder.code(GeneticCounselingRecommendationReasonCodingCode.forValue(value)); + resultBuilder.display(propertyCatalogue.getByCodeAndVersion(value, version).getShortdesc()); + } catch (IOException e) { + return null; + } + + return resultBuilder.build(); + } + } diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapperTest.java index e4242f9..78b2e07 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/TherapieplanDataMapperTest.java @@ -126,4 +126,50 @@ class TherapieplanDataMapperTest { ); } + @Test + void shouldMapHumGenBeratung() { + final Map testData = Map.of( + "id", 1, + "patient_id", 42, + "humangen_beratung", 1, + "humangen_ber_grund", "other", + "humangen_ber_grund_propcat_version", 1234 + ); + + doAnswer(invocationOnMock -> ResultSet.from(testData)) + .when(therapieplanCatalogue) + .getById(anyInt()); + + doAnswer(invocationOnMock -> { + var testPropertyData = Map.of( + "other", new PropertyCatalogue.Entry("other", "Andere", "Andere") + ); + + var code = invocationOnMock.getArgument(0, String.class); + return testPropertyData.get(code); + } + ).when(propertyCatalogue).getByCodeAndVersion(anyString(), anyInt()); + + var actual = this.dataMapper.getById(1); + assertThat(actual).isInstanceOf(MtbCarePlan.class); + assertThat(actual.getId()).isEqualTo("1"); + + assertThat(actual.getRecommendationsMissingReason()).isNull(); + + + assertThat(actual.getGeneticCounselingRecommendation()).isEqualTo( + GeneticCounselingRecommendation.builder() + .id("1") + .patient(Reference.builder().id("42").type("Patient").build()) + .reason( + GeneticCounselingRecommendationReasonCoding.builder() + .code(GeneticCounselingRecommendationReasonCodingCode.OTHER) + .display("Andere") + .system("dnpm-dip/mtb/recommendation/genetic-counseling/reason") + .build() + ) + .build() + ); + } + }