From 673d89f5e2c99f780910ba7aa98c580ae06c0413 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Sun, 22 Jun 2025 14:45:08 +0200 Subject: [PATCH] feat: add display and system to prozedur data --- .../AbstractKpaTherapieverlaufDataMapper.java | 38 +++++++---- .../mapper/KpaProzedurDataMapper.java | 40 +++++++++-- .../mapper/KpaProzedurDataMapperTest.java | 67 +++++++++++++++---- 3 files changed, 112 insertions(+), 33 deletions(-) diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractKpaTherapieverlaufDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractKpaTherapieverlaufDataMapper.java index 46ad72c..52f3ebd 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractKpaTherapieverlaufDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/AbstractKpaTherapieverlaufDataMapper.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.datacatalogues.AbstractSubformDataCatalogue; import java.io.IOException; @@ -15,16 +16,21 @@ import java.util.stream.Collectors; */ public abstract class AbstractKpaTherapieverlaufDataMapper extends AbstractSubformDataMapper { - AbstractKpaTherapieverlaufDataMapper(AbstractSubformDataCatalogue catalogue) { + private final PropertyCatalogue propertyCatalogue; + + AbstractKpaTherapieverlaufDataMapper(final AbstractSubformDataCatalogue catalogue, final PropertyCatalogue propertyCatalogue) { super(catalogue); + this.propertyCatalogue = propertyCatalogue; } - protected MtbTherapyIntentCoding getMtbTherapyIntentCoding(String value) { + protected MtbTherapyIntentCoding getMtbTherapyIntentCoding(String value, int version) { if (value == null || !Arrays.stream(MtbTherapyIntentCodingCode.values()).map(MtbTherapyIntentCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { return null; } - var resultBuilder = MtbTherapyIntentCoding.builder(); + var resultBuilder = MtbTherapyIntentCoding.builder() + .system("dnpm-dip/therapy/intent") + .display(propertyCatalogue.getByCodeAndVersion(value, version).getShortdesc()); switch (value) { case "X": @@ -44,12 +50,14 @@ public abstract class AbstractKpaTherapieverlaufDataMapper extends AbstractSu return resultBuilder.build(); } - protected TherapyStatusCoding getTherapyStatusCoding(String value) { + protected TherapyStatusCoding getTherapyStatusCoding(String value, int version) { if (value == null || !Arrays.stream(TherapyStatusCodingCode.values()).map(TherapyStatusCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { return null; } - var resultBuilder = TherapyStatusCoding.builder(); + var resultBuilder = TherapyStatusCoding.builder() + .system("dnpm-dip/therapy/status") + .display(propertyCatalogue.getByCodeAndVersion(value, version).getShortdesc()); switch (value) { case "not-done": @@ -69,12 +77,15 @@ public abstract class AbstractKpaTherapieverlaufDataMapper extends AbstractSu return resultBuilder.build(); } - protected MtbTherapyStatusReasonCoding getMtbTherapyStatusReasonCoding(String value) { + protected MtbTherapyStatusReasonCoding getMtbTherapyStatusReasonCoding(String value, int version) { if (value == null || !Arrays.stream(MtbTherapyStatusReasonCodingCode.values()).map(MtbTherapyStatusReasonCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { return null; } - var resultBuilder = MtbTherapyStatusReasonCoding.builder(); + var resultBuilder = MtbTherapyStatusReasonCoding.builder() + .system("dnpm-dip/therapy/status-reason") + .display(propertyCatalogue.getByCodeAndVersion(value, version).getShortdesc()); + try { resultBuilder.code(MtbTherapyStatusReasonCodingCode.forValue(value)); } catch (IOException e) { @@ -84,7 +95,7 @@ public abstract class AbstractKpaTherapieverlaufDataMapper extends AbstractSu return resultBuilder.build(); } - protected MtbSystemicTherapyRecommendationFulfillmentStatusCoding getMtbSystemicTherapyRecommendationFulfillmentStatusCoding(String value) { + protected MtbSystemicTherapyRecommendationFulfillmentStatusCoding getMtbSystemicTherapyRecommendationFulfillmentStatusCoding(String value, int version) { if (value == null || !Arrays.stream(MtbSystemicTherapyRecommendationFulfillmentStatusCodingCode.values()).map(MtbSystemicTherapyRecommendationFulfillmentStatusCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { return null; } @@ -99,7 +110,7 @@ public abstract class AbstractKpaTherapieverlaufDataMapper extends AbstractSu return resultBuilder.build(); } - protected MtbSystemicTherapyCategoryCoding getMtbSystemicTherapyCategoryCoding(String value) { + protected MtbSystemicTherapyCategoryCoding getMtbSystemicTherapyCategoryCoding(String value, int version) { if (value == null || !Arrays.stream(MtbSystemicTherapyCategoryCodingCode.values()).map(MtbSystemicTherapyCategoryCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { return null; } @@ -114,7 +125,7 @@ public abstract class AbstractKpaTherapieverlaufDataMapper extends AbstractSu return resultBuilder.build(); } - protected MtbSystemicTherapyDosageDensityCoding getMtbSystemicTherapyDosageDensityCoding(String value) { + protected MtbSystemicTherapyDosageDensityCoding getMtbSystemicTherapyDosageDensityCoding(String value, int version) { if (value == null || !Arrays.stream(MtbSystemicTherapyDosageDensityCodingCode.values()).map(MtbSystemicTherapyDosageDensityCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { return null; } @@ -129,12 +140,15 @@ public abstract class AbstractKpaTherapieverlaufDataMapper extends AbstractSu return resultBuilder.build(); } - protected OncoProcedureCoding getOncoProcedureCoding(String value) { + protected OncoProcedureCoding getOncoProcedureCoding(String value, int version) { if (value == null || !Arrays.stream(OncoProcedureCodingCode.values()).map(OncoProcedureCodingCode::toValue).collect(Collectors.toSet()).contains(value)) { return null; } - var resultBuilder = OncoProcedureCoding.builder(); + var resultBuilder = OncoProcedureCoding.builder() + .system("dnpm-dip/therapy/type") + .display(propertyCatalogue.getByCodeAndVersion(value, version).getShortdesc()); + try { resultBuilder.code(OncoProcedureCodingCode.forValue(value)); } catch (IOException e) { diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapper.java index 634e8df..6f02dc4 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapper.java @@ -3,6 +3,7 @@ package dev.pcvolkmer.onco.datamapper.mapper; import dev.pcvolkmer.mv64e.mtb.OncoProcedure; import dev.pcvolkmer.mv64e.mtb.PeriodDate; import dev.pcvolkmer.mv64e.mtb.Reference; +import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; import dev.pcvolkmer.onco.datamapper.ResultSet; import dev.pcvolkmer.onco.datamapper.datacatalogues.ProzedurCatalogue; @@ -14,8 +15,8 @@ import dev.pcvolkmer.onco.datamapper.datacatalogues.ProzedurCatalogue; */ public class KpaProzedurDataMapper extends AbstractKpaTherapieverlaufDataMapper { - public KpaProzedurDataMapper(final ProzedurCatalogue catalogue) { - super(catalogue); + public KpaProzedurDataMapper(final ProzedurCatalogue catalogue, final PropertyCatalogue propertyCatalogue) { + super(catalogue, propertyCatalogue); } /** @@ -45,11 +46,36 @@ public class KpaProzedurDataMapper extends AbstractKpaTherapieverlaufDataMapper< .basedOn(Reference.builder().id(diseases.get(0).getDiseaseId().toString()).build()) .recordedOn(resultSet.getDate("erfassungsdatum")) .therapyLine(resultSet.getLong("therapielinie")) - .intent(getMtbTherapyIntentCoding(resultSet.getString("intention"))) - .status(getTherapyStatusCoding(resultSet.getString("status"))) - .statusReason(getMtbTherapyStatusReasonCoding(resultSet.getString("statusgrund"))) - .period(PeriodDate.builder().start(resultSet.getDate("beginn")).end(resultSet.getDate("ende")).build()) - .code(getOncoProcedureCoding(resultSet.getString("typ"))) + .intent( + getMtbTherapyIntentCoding( + resultSet.getString("intention"), + resultSet.getInteger("intention_propcat_version") + ) + ) + .status( + getTherapyStatusCoding( + resultSet.getString("status"), + resultSet.getInteger("status_propcat_version") + ) + ) + .statusReason( + getMtbTherapyStatusReasonCoding( + resultSet.getString("statusgrund"), + resultSet.getInteger("statusgrund_propcat_version") + ) + ) + .period( + PeriodDate.builder() + .start(resultSet.getDate("beginn")) + .end(resultSet.getDate("ende")) + .build() + ) + .code( + getOncoProcedureCoding( + resultSet.getString("typ"), + resultSet.getInteger("typ_propcat_version") + ) + ) ; return builder.build(); } diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapperTest.java index 823871a..78f5b87 100644 --- a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapperTest.java +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/KpaProzedurDataMapperTest.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.ProzedurCatalogue; import org.junit.jupiter.api.BeforeEach; @@ -24,13 +25,18 @@ import static org.mockito.Mockito.when; class KpaProzedurDataMapperTest { ProzedurCatalogue catalogue; + PropertyCatalogue propertyCatalogue; KpaProzedurDataMapper dataMapper; @BeforeEach - void setUp(@Mock ProzedurCatalogue catalogue) { + void setUp( + @Mock ProzedurCatalogue catalogue, + @Mock PropertyCatalogue propertyCatalogue + ) { this.catalogue = catalogue; - this.dataMapper = new KpaProzedurDataMapper(catalogue); + this.propertyCatalogue = propertyCatalogue; + this.dataMapper = new KpaProzedurDataMapper(catalogue, propertyCatalogue); } @Test @@ -74,6 +80,19 @@ class KpaProzedurDataMapperTest { .when(catalogue) .getDiseases(anyInt()); + doAnswer(invocationOnMock -> { + var testPropertyData = Map.of( + "S", new PropertyCatalogue.Entry("S", "Sonstiges", "Sonstiges"), + "stopped", new PropertyCatalogue.Entry("stopped", "Abgebrochen", "Abgebrochen"), + "patient-death", new PropertyCatalogue.Entry("patient-death", "Tod", "Tod"), + "surgery", new PropertyCatalogue.Entry("surgery", "OP", "OP") + ); + + var code = invocationOnMock.getArgument(0, String.class); + return testPropertyData.get(code); + } + ).when(propertyCatalogue).getByCodeAndVersion(anyString(), anyInt()); + var actualList = this.dataMapper.getByParentId(1); assertThat(actualList).hasSize(1); @@ -87,19 +106,39 @@ class KpaProzedurDataMapperTest { .build() ); assertThat(actual.getRecordedOn()).isEqualTo(Date.from(Instant.parse("2024-06-19T12:00:00Z"))); - assertThat(actual.getIntent()).isEqualTo( - MtbTherapyIntentCoding.builder().code(MtbTherapyIntentCodingCode.S).build() - ); - assertThat(actual.getStatus()).isEqualTo( - TherapyStatusCoding.builder().code(TherapyStatusCodingCode.STOPPED).build() - ); - assertThat(actual.getStatusReason()).isEqualTo( - MtbTherapyStatusReasonCoding.builder().code(MtbTherapyStatusReasonCodingCode.PATIENT_DEATH).build() - ); + assertThat(actual.getIntent()) + .isEqualTo( + MtbTherapyIntentCoding.builder() + .code(MtbTherapyIntentCodingCode.S) + .display("Sonstiges") + .system("dnpm-dip/therapy/intent") + .build() + ); + assertThat(actual.getStatus()) + .isEqualTo( + TherapyStatusCoding.builder() + .code(TherapyStatusCodingCode.STOPPED) + .display("Abgebrochen") + .system("dnpm-dip/therapy/status") + .build() + ); + assertThat(actual.getStatusReason()) + .isEqualTo( + MtbTherapyStatusReasonCoding.builder() + .code(MtbTherapyStatusReasonCodingCode.PATIENT_DEATH) + .display("Tod") + .system("dnpm-dip/therapy/status-reason") + .build() + ); assertThat(actual.getTherapyLine()).isEqualTo(1); - assertThat(actual.getCode()).isEqualTo( - OncoProcedureCoding.builder().code(OncoProcedureCodingCode.SURGERY).build() - ); + assertThat(actual.getCode()) + .isEqualTo( + OncoProcedureCoding.builder() + .code(OncoProcedureCodingCode.SURGERY) + .display("OP") + .system("dnpm-dip/therapy/type") + .build() + ); } }