/*
* This file is part of onkostar-plugin-dnpm
*
* Copyright (C) 2023-2026 the original author or authors.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see .
*/
package dev.dnpm.oshelper.services.therapieplan;
import dev.dnpm.oshelper.services.FormService;
import de.itc.onkostar.api.IOnkostarApi;
import de.itc.onkostar.api.Item;
import de.itc.onkostar.api.Procedure;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import static dev.dnpm.oshelper.services.FormService.hasValue;
import static dev.dnpm.oshelper.services.FormService.isYes;
public class DefaultTherapieplanService extends AbstractTherapieplanService {
public static final String FORMFIELD_REFERSTEMTB = "referstemtb";
public static final String FORMFIELD_HUMANGENBERATUNG = "humangenberatung";
public static final String FORMFIELD_REEVALUATION = "reevaluation";
public static final String FORMFIELD_DATUM = "datum";
public static final String FORMFIELD_REFTKHUMANGENBER = "reftkhumangenber";
public static final String FORMFIELD_DATUMTKHUMANGENBER = "datumtkhumangenber";
public static final String FORMFIELD_REFTKREEVALUATION = "reftkreevaluation";
public static final String FORMFIELD_DATUMTKREEVALUATION = "datumtkreevaluation";
public static final String FORMFIELD_MTB = "mtb";
public static final String FORMFIELD_UFEEDATUM = "ufeedatum";
public static final String FORMFIELD_REFTUMORKONFERENZ = "reftumorkonferenz";
public static final String FORMFIELD_UFRBDATUM = "ufrbdatum";
public static final String DATAFIELD_REF_TK_HUMANGENBER = "ref_tk_humangenber";
public static final String DATAFIELD_DATUM_TK_HUMANGENBER = "datum_tk_humangenber";
public static final String DATAFIELD_DATUM = "datum";
private final Logger logger = LoggerFactory.getLogger(this.getClass());
public DefaultTherapieplanService(final IOnkostarApi onkostarApi, final FormService formService) {
super(onkostarApi, formService);
}
/**
* Verlinke MTB und Übernahme Datum aus Hauptformular in weiteren Bereichen
* "Humangenetische Beratung" und "Reevaluation" und Unterformularen, wenn erforderlich.
*
* @param procedure Die Prozedur mit Hauptformular
*/
@Override
public void updateRequiredMtbEntries(Procedure procedure) {
this.updateMtbInSections(procedure);
this.updateMtbInSubforms(procedure);
}
/**
* Finde verlinkte MTBs in Hauptformular und Unterformularen
*
* @param procedure Die Prozedur mit Hauptformular
* @return Liste mit verlinkten MTBs
*/
@Override
public List findReferencedMtbs(Procedure procedure) {
if (!hasValue(procedure, FORMFIELD_REFERSTEMTB)) {
return List.of();
}
var mtbProcedure = this.onkostarApi.getProcedure(procedure.getValue(FORMFIELD_REFERSTEMTB).getInt());
if (null == mtbProcedure) {
return List.of();
}
return List.of(mtbProcedure);
}
/**
* Finde verlinkte MTBs in Hauptformular und Unterformularen
*
* @param procedureId ID der Prozedur mit Hauptformular
* @return Liste mit verlinkten MTBs
*/
@Override
public List findReferencedMtbs(int procedureId) {
var procedure = this.onkostarApi.getProcedure(procedureId);
if (null == procedure) {
return List.of();
}
return findReferencedMtbs(procedure);
}
private void updateMtbInSections(Procedure procedure) {
if (!isYes(procedure, FORMFIELD_HUMANGENBERATUNG) && !isYes(procedure, FORMFIELD_REEVALUATION)) {
return;
}
var mtbReference = procedure.getValue(FORMFIELD_REFERSTEMTB).getInt();
var mtbDate = procedure.getValue(FORMFIELD_DATUM).getDate();
var noUpdateRequired = true;
if (
isYes(procedure, FORMFIELD_HUMANGENBERATUNG) && (
!hasValue(procedure, FORMFIELD_REFTKHUMANGENBER)
|| mtbReference != procedure.getValue(FORMFIELD_REFTKHUMANGENBER).getInt()
)
) {
procedure.setValue(FORMFIELD_REFTKHUMANGENBER, new Item(DATAFIELD_REF_TK_HUMANGENBER, mtbReference));
noUpdateRequired = false;
}
if (
isYes(procedure, FORMFIELD_HUMANGENBERATUNG) && (
!hasValue(procedure, FORMFIELD_DATUMTKHUMANGENBER)
|| !mtbDate.equals(procedure.getValue(FORMFIELD_DATUMTKHUMANGENBER).getDate())
)
) {
procedure.setValue(FORMFIELD_DATUMTKHUMANGENBER, new Item(DATAFIELD_DATUM_TK_HUMANGENBER, mtbDate));
noUpdateRequired = false;
}
if (
isYes(procedure, FORMFIELD_REEVALUATION) && (
!hasValue(procedure, FORMFIELD_REFTKREEVALUATION)
|| mtbReference != procedure.getValue(FORMFIELD_REFTKREEVALUATION).getInt()
)
) {
procedure.setValue(FORMFIELD_REFTKREEVALUATION, new Item("ref_tk_reevaluation", mtbReference));
noUpdateRequired = false;
}
if (
isYes(procedure, FORMFIELD_REEVALUATION) && (
!hasValue(procedure, FORMFIELD_DATUMTKREEVALUATION)
|| !mtbDate.equals(procedure.getValue(FORMFIELD_DATUMTKREEVALUATION).getDate())
)
) {
procedure.setValue(FORMFIELD_DATUMTKREEVALUATION, new Item("datum_tk_reevaluation", mtbDate));
noUpdateRequired = false;
}
if (noUpdateRequired) {
return;
}
try {
onkostarApi.saveProcedure(procedure, false);
} catch (Exception e) {
logger.error("Formular 'DNPM Therapieplan' konnte nicht aktualisiert werden", e);
}
}
private void updateMtbInSubforms(Procedure procedure) {
if (
!hasValue(procedure, FORMFIELD_REFERSTEMTB) || !hasValue(procedure, FORMFIELD_DATUM)
) {
return;
}
var mtbReference = procedure.getValue(FORMFIELD_REFERSTEMTB).getInt();
var mtbDate = procedure.getValue(FORMFIELD_DATUM).getDate();
formService.getSubFormProcedureIds(procedure.getId()).stream()
.map(onkostarApi::getProcedure)
.filter(Objects::nonNull)
.forEach(subform -> {
if (isUsableEinzelempfehlung(subform, mtbReference, mtbDate)) {
subform.setValue(FORMFIELD_MTB, new Item("ref_tumorkonferenz", mtbReference));
subform.setValue(FORMFIELD_UFEEDATUM, new Item(DATAFIELD_DATUM, mtbDate));
try {
onkostarApi.saveProcedure(subform, false);
} catch (Exception e) {
logger.error("Formular 'DNPM UF Einzelempfehlung' konnte nicht aktualisiert werden", e);
}
}
if (isUsableRebiopsie(subform, mtbReference, mtbDate)) {
subform.setValue(FORMFIELD_REFTUMORKONFERENZ, new Item("ref_tumorkonferenz", mtbReference));
subform.setValue(FORMFIELD_UFRBDATUM, new Item(DATAFIELD_DATUM, mtbDate));
try {
onkostarApi.saveProcedure(subform, false);
} catch (Exception e) {
logger.error("Formular 'DNPM UF Rebiopsie' konnte nicht aktualisiert werden", e);
}
}
});
}
private static boolean isUsableRebiopsie(Procedure subform, int mtbReference, Date mtbDate) {
return subform.getFormName().equals("DNPM UF Rebiopsie") && mtbReference != subform.getValue(FORMFIELD_REFTUMORKONFERENZ).getInt() && !mtbDate.equals(subform.getValue(FORMFIELD_UFRBDATUM).getDate());
}
private static boolean isUsableEinzelempfehlung(Procedure subform, int mtbReference, Date mtbDate) {
return subform.getFormName().equals("DNPM UF Einzelempfehlung") && mtbReference != subform.getValue(FORMFIELD_MTB).getInt() && !mtbDate.equals(subform.getValue(FORMFIELD_UFEEDATUM).getDate());
}
}