From 1e09495d41f8e79f2fe789e955e8f1e0cd512dc4 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Sat, 28 Jun 2025 14:28:33 +0200 Subject: [PATCH] feat: add MTB episodes of care --- README.md | 2 +- .../onco/datamapper/mapper/MtbDataMapper.java | 2 + .../mapper/MtbEpisodeDataMapper.java | 61 ++++++++++++++++ .../mapper/MtbEpisodeDataMapperTest.java | 71 +++++++++++++++++++ 4 files changed, 135 insertions(+), 1 deletion(-) create mode 100644 src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapper.java create mode 100644 src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapperTest.java diff --git a/README.md b/README.md index 4c54553..0916bd8 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ var jsonResult = Converter.toJsonString(mtbMapper.getByCaseId("16000123")); | DNPM-Datenmodell 2.1 - Bereich | Status | Anmerkung | |----------------------------------|--------|----------------------------------------------------------------| | Patient | ✅ | Verwendet Datenbank-ID, keine managing Site | -| Episoden | | | +| Episoden | ✅ | | | Diagnosen | ✅ | Entsprechend Formularaufbau nur Diagnose der aktuellen Episode | | Verwandten-Diagnosen | ✅ | | | Systemische Leitlinien-Therapien | ⌛ | Status noch nicht vollständig in Formular | 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 2b06da4..7c059a1 100644 --- a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbDataMapper.java @@ -67,6 +67,7 @@ public class MtbDataMapper implements DataMapper { catalogueFactory.catalogue(TumorgradingCatalogue.class), propertyCatalogue ); + var mtbEpisodeDataMapper = new MtbEpisodeDataMapper(kpaCatalogue, propertyCatalogue); var prozedurMapper = new KpaProzedurDataMapper( catalogueFactory.catalogue(ProzedurCatalogue.class), propertyCatalogue @@ -97,6 +98,7 @@ public class MtbDataMapper implements DataMapper { resultBuilder .patient(kpaPatient) + .episodesOfCare(List.of(mtbEpisodeDataMapper.getById(kpaId))) // DNPM Klinik/Anamnese .diagnoses(List.of(diagnosisDataMapper.getById(kpaId))) .guidelineProcedures(prozedurMapper.getByParentId(kpaId)) diff --git a/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapper.java b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapper.java new file mode 100644 index 0000000..87a27b5 --- /dev/null +++ b/src/main/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapper.java @@ -0,0 +1,61 @@ +package dev.pcvolkmer.onco.datamapper.mapper; + +import dev.pcvolkmer.mv64e.mtb.MtbEpisodeOfCare; +import dev.pcvolkmer.mv64e.mtb.PeriodDate; +import dev.pcvolkmer.mv64e.mtb.Reference; +import dev.pcvolkmer.onco.datamapper.PropertyCatalogue; +import dev.pcvolkmer.onco.datamapper.datacatalogues.KpaCatalogue; + +import java.util.List; + +import static dev.pcvolkmer.onco.datamapper.mapper.MapperUtils.getPatientReference; + +/** + * Mapper class to load and map patient data from database table 'dk_dnpm_kpa' + * + * @author Paul-Christian Volkmer + * @since 0.1 + */ +public class MtbEpisodeDataMapper implements DataMapper { + + private final KpaCatalogue kpaCatalogue; + private final PropertyCatalogue propertyCatalogue; + + + public MtbEpisodeDataMapper( + final KpaCatalogue kpaCatalogue, + final PropertyCatalogue propertyCatalogue + ) { + this.kpaCatalogue = kpaCatalogue; + this.propertyCatalogue = propertyCatalogue; + } + + /** + * Loads and maps a ca plan using the database id + * + * @param id The database id of the procedure data set + * @return The loaded Patient data + */ + @Override + public MtbEpisodeOfCare getById(int id) { + var kpaData = kpaCatalogue.getById(id); + + var builder = MtbEpisodeOfCare.builder(); + builder + .id(kpaData.getString("id")) + .patient(getPatientReference(kpaData.getString("patient_id"))) + .diagnoses( + List.of( + Reference.builder() + .id(kpaData.getString("id")) + .type("Diagnose") + .build() + ) + ) + .period(PeriodDate.builder().start(kpaData.getDate("anmeldedatummtb")).build()) + .build() + ; + return builder.build(); + } + +} diff --git a/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapperTest.java b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapperTest.java new file mode 100644 index 0000000..d044a64 --- /dev/null +++ b/src/test/java/dev/pcvolkmer/onco/datamapper/mapper/MtbEpisodeDataMapperTest.java @@ -0,0 +1,71 @@ +package dev.pcvolkmer.onco.datamapper.mapper; + +import dev.pcvolkmer.mv64e.mtb.MtbEpisodeOfCare; +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.KpaCatalogue; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.time.Instant; +import java.util.Date; +import java.util.Map; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.Mockito.doAnswer; + +@ExtendWith(MockitoExtension.class) +class MtbEpisodeDataMapperTest { + + KpaCatalogue kpaCatalogue; + PropertyCatalogue propertyCatalogue; + + MtbEpisodeDataMapper dataMapper; + + @BeforeEach + void setUp( + @Mock KpaCatalogue kpaCatalogue, + @Mock PropertyCatalogue propertyCatalogue + ) { + this.kpaCatalogue = kpaCatalogue; + this.propertyCatalogue = propertyCatalogue; + this.dataMapper = new MtbEpisodeDataMapper(kpaCatalogue, propertyCatalogue); + } + + @Test + void shouldMapData() { + final Map kpaData = Map.of( + "id", 4711, + "patient_id", 42, + "anmeldedatummtb", new java.sql.Date(Date.from(Instant.parse("2025-06-28T12:00:00Z")).getTime()) + ); + + doAnswer(invocationOnMock -> ResultSet.from(kpaData)) + .when(kpaCatalogue) + .getById(anyInt()); + + var actual = this.dataMapper.getById(1); + assertThat(actual).isInstanceOf(MtbEpisodeOfCare.class); + assertThat(actual.getId()).isEqualTo("4711"); + assertThat(actual.getPatient()) + .isEqualTo(Reference.builder().id("42").type("Patient").build()); + + assertThat(actual.getDiagnoses()) + .hasSize(1); + assertThat(actual.getDiagnoses().get(0)) + .isEqualTo(Reference.builder().id("4711").type("Diagnose").build()); + + assertThat(actual.getPeriod()) + .isEqualTo( + // UTC day start! + PeriodDate.builder().start(Date.from(Instant.parse("2025-06-28T00:00:00Z"))).build() + ); + } + +}