diff --git a/src/main/java/DNPM/services/mtb/DefaultMtbService.java b/src/main/java/DNPM/services/mtb/DefaultMtbService.java new file mode 100644 index 0000000..40d9360 --- /dev/null +++ b/src/main/java/DNPM/services/mtb/DefaultMtbService.java @@ -0,0 +1,39 @@ +package DNPM.services.mtb; + +import DNPM.services.SettingsService; +import de.itc.onkostar.api.Procedure; + +import java.util.List; + +public class DefaultMtbService implements MtbService { + + private final SettingsService settingsService; + + public DefaultMtbService(final SettingsService settingsService) { + this.settingsService = settingsService; + } + + @Override + public String getProtocol(List procedures) { + ProcedureToProtocolMapper mapper = null; + var sid = settingsService.getSID(); + + if (sid.isPresent()) { + switch (sid.get()) { + case "20119": + mapper = new OsTumorkonferenzVarianteUkwToProtocolMapper(); + default: + if (!settingsService.multipleMtbsInMtbEpisode()) { + mapper = new OsTumorkonferenzToProtocolMapper(); + } + } + } + + if (null == mapper) { + return ""; + } + + return mapper.apply(procedures).orElse(""); + } + +} diff --git a/src/main/java/DNPM/services/mtb/MtbService.java b/src/main/java/DNPM/services/mtb/MtbService.java new file mode 100644 index 0000000..b854307 --- /dev/null +++ b/src/main/java/DNPM/services/mtb/MtbService.java @@ -0,0 +1,9 @@ +package DNPM.services.mtb; + +import de.itc.onkostar.api.Procedure; + +import java.util.List; + +public interface MtbService { + String getProtocol(List procedures); +} diff --git a/src/main/java/DNPM/services/mtb/OsTumorkonferenzToProtocolMapper.java b/src/main/java/DNPM/services/mtb/OsTumorkonferenzToProtocolMapper.java new file mode 100644 index 0000000..f6684a2 --- /dev/null +++ b/src/main/java/DNPM/services/mtb/OsTumorkonferenzToProtocolMapper.java @@ -0,0 +1,33 @@ +package DNPM.services.mtb; + +import de.itc.onkostar.api.Procedure; + +import java.util.List; +import java.util.Optional; + +public class OsTumorkonferenzToProtocolMapper implements ProcedureToProtocolMapper { + @Override + public Optional apply(List procedures) { + assert(procedures.size() == 1); + + var procedure = procedures.get(0); + + assert(procedure.getFormName().equals("OS.Tumorkonferenz")); + + var fragestellung = procedure.getValue("Fragestellung"); + var empfehlung = procedure.getValue("Empfehlung"); + + if ( + null != fragestellung && !fragestellung.getString().isBlank() + && null != empfehlung && !empfehlung.getString().isBlank() + ) { + return Optional.of(String.format("%s\n%s", fragestellung.getString(), empfehlung.getString())); + } else if (null != fragestellung && !fragestellung.getString().isBlank()) { + return Optional.of(fragestellung.getString()); + } else if (null != empfehlung && !empfehlung.getString().isBlank()) { + return Optional.of(empfehlung.getString()); + } + + return Optional.empty(); + } +} diff --git a/src/main/java/DNPM/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapper.java b/src/main/java/DNPM/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapper.java new file mode 100644 index 0000000..de36415 --- /dev/null +++ b/src/main/java/DNPM/services/mtb/OsTumorkonferenzVarianteUkwToProtocolMapper.java @@ -0,0 +1,42 @@ +package DNPM.services.mtb; + +import de.itc.onkostar.api.Procedure; + +import java.util.Comparator; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +public class OsTumorkonferenzVarianteUkwToProtocolMapper implements ProcedureToProtocolMapper { + @Override + public Optional apply(List procedures) { + procedures.forEach(procedure -> { + assert (procedure.getFormName().equals("OS.Tumorkonferenz.VarianteUKW")); + }); + + procedures.sort(Comparator.comparing(Procedure::getStartDate)); + + var result = procedures.stream().map(procedure -> { + var fragestellung = procedure.getValue("Fragestellung"); + var empfehlung = procedure.getValue("Empfehlung"); + + if ( + null != fragestellung && !fragestellung.getString().isBlank() + && null != empfehlung && !empfehlung.getString().isBlank() + ) { + return String.format("%s\n%s", fragestellung.getString(), empfehlung.getString()); + } else if (null != fragestellung && !fragestellung.getString().isBlank()) { + return fragestellung.getString(); + } else if (null != empfehlung && !empfehlung.getString().isBlank()) { + return empfehlung.getString(); + } + return ""; + }).collect(Collectors.joining("\n")); + + if (!result.isBlank()) { + return Optional.of(result); + } + + return Optional.empty(); + } +} diff --git a/src/main/java/DNPM/services/mtb/ProcedureToProtocolMapper.java b/src/main/java/DNPM/services/mtb/ProcedureToProtocolMapper.java new file mode 100644 index 0000000..54c04d9 --- /dev/null +++ b/src/main/java/DNPM/services/mtb/ProcedureToProtocolMapper.java @@ -0,0 +1,10 @@ +package DNPM.services.mtb; + +import de.itc.onkostar.api.Procedure; + +import java.util.List; +import java.util.Optional; +import java.util.function.Function; + +@FunctionalInterface +public interface ProcedureToProtocolMapper extends Function, Optional> {} diff --git a/src/test/java/DNPM/services/mtb/DefaultMtbServiceTest.java b/src/test/java/DNPM/services/mtb/DefaultMtbServiceTest.java new file mode 100644 index 0000000..6230edd --- /dev/null +++ b/src/test/java/DNPM/services/mtb/DefaultMtbServiceTest.java @@ -0,0 +1,110 @@ +package DNPM.services.mtb; + +import DNPM.services.SettingsService; +import de.itc.onkostar.api.IOnkostarApi; +import de.itc.onkostar.api.Item; +import de.itc.onkostar.api.Procedure; +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.Arrays; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +@ExtendWith(MockitoExtension.class) +public class DefaultMtbServiceTest { + + @Mock + private IOnkostarApi onkostarApi; + + @Mock + private SettingsService settingsService; + + private DefaultMtbService service; + + @BeforeEach + void setup() { + this.service = new DefaultMtbService(settingsService); + } + + @Test + void testShouldReturnMtbProtocolForDefaultImplementation() { + + when(settingsService.getSID()).thenReturn(Optional.of("12345")); + when(settingsService.multipleMtbsInMtbEpisode()).thenReturn(false); + + var procedure1 = new Procedure(onkostarApi); + procedure1.setFormName("OS.Tumorkonferenz"); + procedure1.setStartDate(Date.from(Instant.parse("2023-01-01T00:00:00Z"))); + procedure1.setValue("Fragestellung", new Item("Fragestellung", "Test ok?")); + procedure1.setValue("Empfehlung", new Item("Empfehlung", "Rerun Test if not ok!")); + + var procedures = List.of( + procedure1 + ); + + var actual = service.getProtocol(procedures); + + assertThat(actual).isEqualTo("Test ok?\nRerun Test if not ok!"); + } + + @Test + void testShouldReturnEmptyMtbProtocolForMultipleMtb() { + + when(settingsService.getSID()).thenReturn(Optional.of("12345")); + when(settingsService.multipleMtbsInMtbEpisode()).thenReturn(true); + + var procedure1 = new Procedure(onkostarApi); + procedure1.setFormName("OS.Tumorkonferenz"); + procedure1.setStartDate(Date.from(Instant.parse("2023-01-01T00:00:00Z"))); + procedure1.setValue("Fragestellung", new Item("Fragestellung", "Test ok?")); + procedure1.setValue("Empfehlung", new Item("Empfehlung", "Rerun Test if not ok!")); + + var procedures = List.of( + procedure1 + ); + + var actual = service.getProtocol(procedures); + + assertThat(actual).isEmpty(); + } + + @Test + void testShouldReturnMtbProtocolForSID20119() { + when(settingsService.getSID()).thenReturn(Optional.of("20119")); + when(settingsService.multipleMtbsInMtbEpisode()).thenReturn(true); + + var procedure1 = new Procedure(onkostarApi); + procedure1.setFormName("OS.Tumorkonferenz.VarianteUKW"); + procedure1.setStartDate(Date.from(Instant.parse("2023-02-01T00:00:00Z"))); + procedure1.setValue("Fragestellung", new Item("Fragestellung", "Test immer noch ok?")); + procedure1.setValue("Empfehlung", new Item("Empfehlung", "Do not rerun Test if ok!")); + + var procedure2 = new Procedure(onkostarApi); + procedure2.setFormName("OS.Tumorkonferenz.VarianteUKW"); + procedure2.setStartDate(Date.from(Instant.parse("2023-01-01T00:00:00Z"))); + procedure2.setValue("Fragestellung", new Item("Fragestellung", "Test ok?")); + procedure2.setValue("Empfehlung", new Item("Empfehlung", "Rerun Test if not ok!")); + + + var procedures = Arrays.asList( + procedure1, + procedure2 + ); + + var actual = service.getProtocol(procedures); + + assertThat(actual).isEqualTo( + "Test ok?\nRerun Test if not ok!\nTest immer noch ok?\nDo not rerun Test if ok!" + ); + } + +}