package at.medevit.elexis.cobasmira.resulthandler;
import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import at.medevit.elexis.cobasmira.model.CobasMiraMapping;
import at.medevit.elexis.cobasmira.model.CobasMiraMessage;
import at.medevit.elexis.cobasmira.model.CobasMiraPatientResult;
import at.medevit.elexis.cobasmira.ui.Preferences;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.data.LabItem;
import ch.elexis.data.LabResult;
import ch.elexis.data.Patient;
import ch.elexis.data.Query;
import ch.rgw.tools.TimeTool;
public class ImportPatientResult {
private static Logger logger = LoggerFactory.getLogger(ImportPatientResult.class);
public static int importPatientResult(CobasMiraMessage msg){
TimeTool resultDate = msg.getEntryDate();
LinkedList<CobasMiraPatientResult> patientResults = msg.getPatientResults();
logger.debug(resultDate + " Handling " + patientResults.size() + " results.");
for (CobasMiraPatientResult coMiPaRe : patientResults) {
String labitemID = CobasMiraMapping.getId(coMiPaRe.getTestName());
LabItem l = LabItem.load(labitemID);
if (!l.exists()) { // LabItem does not exist
logger.warn("LabItem ID " + labitemID + " could not be loaded.");
if (patientResults.size() == 1)
return CobasMiraMessage.ELEXIS_RESULT_LABITEM_NOT_FOUND;
continue;
}
// Resolve Patient
String patientElexisID = coMiPaRe.getPatientIdentification();
String kontrollePatientID = CoreHub.localCfg.get(Preferences.CONTROLUSER, "KO").trim();
if (patientElexisID.equalsIgnoreCase(kontrollePatientID)) {
int ret = ControlResultHandler.writeControlResult(coMiPaRe, msg.getEntryDate());
if (patientResults.size() == 1)
return ret;
continue;
}
// Need to find PersistentObject ID for given PatientNr
String patID =
new Query<Patient>(Patient.class).findSingle(Patient.FLD_PATID, Query.EQUALS,
patientElexisID);
Patient p = Patient.load(patID);
if (!p.exists()) { // Patient does not exist
logger.warn("Patient " + patientElexisID + " could not be loaded.");
if (patientResults.size() == 1)
return CobasMiraMessage.ELEXIS_RESULT_PATIENT_NOT_FOUND;
continue;
}
//TODO: check getForDate() Funktion?!
Query<LabResult> labResult = new Query<LabResult>(LabResult.class);
labResult.add(LabResult.ITEM_ID, "=", labitemID);
labResult.and();
labResult.add(LabResult.DATE, "=", resultDate.toString(TimeTool.DATE_GER));
labResult.and();
labResult.add(LabResult.PATIENT_ID, "=", coMiPaRe.getPatientIdentification());
List<LabResult> labResults = labResult.execute();
if (labResults.size() == 0) {
int noDecPlaces = CobasMiraMapping.getNoDecPlaces(coMiPaRe.getTestName());
Float result = roundToDecimals(coMiPaRe.getConcentration(), noDecPlaces);
// if remark value is set, value is blue and callable from lab view
// LabResult lr = new LabResult(p, resultDate, l, result.toString(), CobasMiraCodes.getRemarkString(coMiPaRe.remark));
LabResult lr;
if (noDecPlaces == 0) {
lr = new LabResult(p, resultDate, l, Integer.toString(result.intValue()), "");
} else {
lr = new LabResult(p, resultDate, l, result.toString(), "");
}
lr.set("Quelle", l.getLabor().getKuerzel());
lr.setFlag(0, true);
} else if (labResults.size() == 1) { // We already have an entry
// LabResult lr = labResults.get(0);
// lr.set(LabResult.RESULT, result.toString());
// lr.set("Quelle", _labItem.getLabor().getKuerzel());
// lr.setFlag(0, true);
logger.warn("We already have an entry for " + labResults);
return CobasMiraMessage.ELEXIS_RESULT_RESULT_ALREADY_HERE;
} else {
logger.warn("Invalid number of entries (" + labResults.size() + ") for "
+ labResults);
}
}
return CobasMiraMessage.ELEXIS_RESULT_INTEGRATION_OK;
}
/**
* Round a given float value to a selected number of comma places
*
* @param d
* the value to be rounded
* @param c
* the number of decimal places to round to
*/
public static float roundToDecimals(float d, int c){
//TODO(marco): If c==0 write an integer into the labresult, not a float because float.toString() results in x.y
if (c == 0)
return Math.round(d);
BigDecimal l_bd = new BigDecimal(d);
l_bd = l_bd.setScale(c, BigDecimal.ROUND_HALF_UP);
return l_bd.floatValue();
}
}