/******************************************************************************* * * The authorship of this code and the accompanying materials is held by * medshare GmbH, Switzerland. All rights reserved. * http://medshare.net * * This code and the accompanying materials are made available under * the terms of the Eclipse Public License v1.0 * * Year of publication: 2012 * *******************************************************************************/ package ch.elexis.labor.viollier.v2.labimport; import java.io.File; import java.io.IOException; import java.text.MessageFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.interfaces.text.IOpaqueDocument; import ch.elexis.core.data.services.GlobalServiceDescriptors; import ch.elexis.core.data.services.IDocumentManager; import ch.elexis.core.data.util.Extensions; import ch.elexis.core.exceptions.ElexisException; import ch.elexis.core.types.LabItemTyp; import ch.elexis.core.ui.importer.div.importers.LabImportUtil; import ch.elexis.core.ui.text.GenericDocument; import ch.elexis.data.LabItem; import ch.elexis.data.LabResult; import ch.elexis.data.Labor; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.elexis.labor.viollier.v2.Messages; import ch.elexis.labor.viollier.v2.data.ViollierLaborImportSettings; import ch.elexis.laborimport.viollier.v2.util.ViollierLogger; import ch.rgw.io.FileTool; import ch.rgw.tools.TimeSpan; import ch.rgw.tools.TimeTool; /** * Hilfsklasse für den Viollier Laborimporter * */ public class PatientLabor { public enum SaveResult { SUCCESS, ERROR }; public static String LABOR_NAME = Messages.PatientLabor_nameViollierLabor; public static String DEFAULT_PRIO = "50"; //$NON-NLS-1$ public static String FORMAT_DATE = "yyyyMMdd"; //$NON-NLS-1$ public static String FORMAT_TIME = "HHmmss"; //$NON-NLS-1$ private static String KUERZEL = Messages.PatientLabor_kuerzelViollier; private static String FIELD_ORGIN = "Quelle"; //$NON-NLS-1$ private static int MAX_LEN_RESULT = 80; // Spaltenlänge LABORWERTE.Result private ViollierLaborImportSettings settings; private Labor myLab = null; private final Patient patient; private IDocumentManager docManager; private boolean overwriteResults = false; /** * Konstruktor mit Angabe des aktuellen Patienten * * @param patient */ public PatientLabor(Patient patient){ super(); this.patient = patient; myLab = LabImportUtil.getOrCreateLabor(KUERZEL); initDocumentManager(); } /** * Initialisiert document manager (omnivore) falls vorhanden */ private void initDocumentManager(){ settings = new ViollierLaborImportSettings((CoreHub.actMandant)); Object os = Extensions.findBestService(GlobalServiceDescriptors.DOCUMENT_MANAGEMENT); if (os != null) { this.docManager = (IDocumentManager) os; } } /** * Prüft, ob die angegebene Kategorie in Omivore existiert. Falls dies nicht der Fall ist, wird * sie gleich erstellt */ private void checkCreateCategory(final String category){ if (category != null) { boolean catExists = false; String[] categories = this.docManager.getCategories(); if (categories != null) { for (String cat : categories) { if (category.equals(cat)) { catExists = true; } } } if (!catExists) { Boolean result = this.docManager.addCategorie(category); if (result) { ViollierLogger.getLogger().println( MessageFormat.format(Messages.LabOrderImport_InfoCategoryCreate, category)); } else { ViollierLogger.getLogger().println( MessageFormat.format(Messages.LabOrderImport_WarnCategoryCreate, category)); } } } } /** * Fügt ein neues Dokument in Omnivore hinzu (falls es nicht bereits existierte) * * @param title * Titel des Dokuments * @param category * Gewünschte Kategorie, unter welcher das Dokument abgelegt werden soll * @param dateStr * Zeitstempel des Dokuments * @param file * Eigentliches Dokumente, das archiviert werden soll * @param keywords * Schlüsselwörter zum Dokument * @return true bei Erfolg. Sonst false * @throws IOException * @throws ElexisException */ private boolean addDocument(final String title, final String category, final String dateStr, final File file, String keywords) throws IOException, ElexisException{ checkCreateCategory(category); List<IOpaqueDocument> documentList = this.docManager.listDocuments(this.patient, category, title, null, new TimeSpan(dateStr + "-" + dateStr), null); //$NON-NLS-1$ if (documentList == null || documentList.size() == 0) { this.docManager.addDocument(new GenericDocument(this.patient, title, category, file, dateStr, keywords, FileTool.getExtension(file.getName()))); return true; } return false; } /** * Liest gewünschtes LabItem * * @param kuerzel * Kürzel, nach dem gesucht werden soll * @param name * Name, nach dem gesucht werden soll * @param type * Typ, nach dem gesucht werden soll * @return LabItem falls exisitiert. Sonst null */ private LabItem getLabItem(String kuerzel, String name, LabItemTyp type){ Query<LabItem> qli = new Query<LabItem>(LabItem.class); qli.add(LabItem.SHORTNAME, "=", kuerzel); //$NON-NLS-1$ //$NON-NLS-2$ qli.and(); qli.add(LabItem.LAB_ID, "=", myLab.get("ID")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ qli.and(); qli.add(LabItem.TYPE, "=", new Integer(type.ordinal()).toString()); //$NON-NLS-1$ LabItem labItem = null; List<LabItem> itemList = qli.execute(); if (itemList.size() > 0) { labItem = itemList.get(0); } else { // Rückwärtskompatibilität qli = new Query<LabItem>(LabItem.class); qli.add(LabItem.SHORTNAME, "=", name); //$NON-NLS-1$ //$NON-NLS-2$ qli.and(); qli.add(LabItem.LAB_ID, "=", myLab.get("ID")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ qli.and(); qli.add(LabItem.TYPE, "=", new Integer(type.ordinal()).toString()); //$NON-NLS-1$ labItem = null; itemList = qli.execute(); if (itemList.size() > 0) { labItem = itemList.get(0); } } return labItem; } /** * Liest gewünschtes Laborresultat * * @param labItem * Labortest, zu welchem ein Resultat gesucht werden soll * @param name * Resultatewert, nach welchem gesucht werden soll * @param date * Datum, nach welchem gesucht werden soll * @return Gefundenes Resultat oder null */ private LabResult getLabResult(LabItem labItem, String name, String date){ Query<LabResult> qli = new Query<LabResult>(LabResult.class); qli.add(LabResult.ITEM_ID, "=", labItem.getId()); //$NON-NLS-1$ qli.and(); qli.add(LabResult.DATE, "=", date); //$NON-NLS-1$ //$NON-NLS-2$ qli.and(); qli.add(LabResult.PATIENT_ID, "=", patient.getId()); //$NON-NLS-1$ qli.and(); qli.add(LabResult.RESULT, "=", name); //$NON-NLS-1$ //$NON-NLS-2$ LabResult labResult = null; List<LabResult> resultList = qli.execute(); if (resultList.size() > 0) { labResult = resultList.get(0); } return labResult; } /** * Speichert externer Laborbefund * * @param title * Titel, der gespeichert werden soll * @param category * Kategorie, die verwendet werden soll * @param file * File, das archiviert werden soll * @param timeStamp * Timestamp, welcher gespeichert werden soll * @param orderId * Fremdschlüssel auf kontakt_order_management.id * @param keyword * Schlüsselwörter, welche gespeichert werden sollen * @param group * Gruppierung der Labortests, welche gespeichert werden soll * @param sequence * Sequenz des Labortests, welche gespeichert werden soll * @throws IOException */ public void saveLaborItem(String title, String category, File file, Date timeStamp, String orderId, String keyword, String group, String sequence) throws IOException{ String filename = file.getName(); if (this.docManager == null) { throw new IOException(MessageFormat.format( Messages.PatientLabor_errorKeineDokumentablage, filename, this.patient.getLabel())); } // Kategorie überprüfen/ erstellen checkCreateCategory(category); TimeTool dateTime = new TimeTool(); dateTime.setTime(timeStamp); SimpleDateFormat sdfDatum = new SimpleDateFormat(FORMAT_DATE); SimpleDateFormat sdfZeit = new SimpleDateFormat(FORMAT_TIME); String datum = sdfDatum.format(timeStamp); String zeit = sdfZeit.format(timeStamp); if (title.length() > MAX_LEN_RESULT) title = "..." + title.substring(title.length() - MAX_LEN_RESULT + 3, title.length()); //$NON-NLS-1$ // Labor Item erstellen String name = Messages.PatientLabor_DocumentLabItemName; String kuerzel = "doc"; //$NON-NLS-1$ LabItem labItem = getLabItem(kuerzel, name, LabItemTyp.DOCUMENT); if (labItem == null) { if (group == null || group.length() == 0) { group = LABOR_NAME; } if (sequence == null || sequence.length() == 0) { sequence = DEFAULT_PRIO; } labItem = new LabItem(kuerzel, Messages.PatientLabor_nameDokumentLaborParameter, myLab, "", "", //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ "pdf", LabItemTyp.DOCUMENT, group, sequence); //$NON-NLS-1$ //$NON-NLS-2$ } if (orderId == null || "".equals(orderId)) { //$NON-NLS-1$ orderId = LABOR_NAME; } boolean saved = false; LabResult lr = getLabResult(labItem, title, datum); if (lr == null) { // Neues Laborresultat erstellen lr = new LabResult(patient, dateTime, labItem, title, null); //$NON-NLS-1$ lr.set(FIELD_ORGIN, orderId); //$NON-NLS-1$ lr.set(LabResult.TIME, zeit); //$NON-NLS-1$ saved = true; } else { // bestehendes Laborresultat ändern, sofern es neuer ist als das bereits gespeicherte if ((overwriteResults) || (lr.getDateTime().getTimeInMillis() < dateTime.getTimeInMillis())) { ViollierLogger .getLogger() .println( MessageFormat.format( Messages.PatientLabor_InfoOverwriteValue, labItem.getKuerzel() + "-" + labItem.getName(), lr.getDateTime().toDBString(true), dateTime.toDBString(true), lr.getResult(), title)); //$NON-NLS-2$ lr.setResult(title); lr.set(LabResult.TIME, zeit); //$NON-NLS-1$ saved = true; } else { ViollierLogger .getLogger() .println( MessageFormat.format( Messages.PatientLabor_InfoExistingValueIsValid, labItem.getKuerzel() + "-" + labItem.getName(), lr.getDateTime().toDBString(true), dateTime.toDBString(true), lr.getResult(), title)); //$NON-NLS-2$ } } if (saved) { // Dokument in Omnivore archivieren try { String dateTimeStr = dateTime.toString(TimeTool.DATE_GER); // Zu Dokumentablage hinzufügen addDocument(title, category, dateTimeStr, file, keyword); ViollierLogger.getLogger().println( MessageFormat.format(Messages.PatientLabor_InfoDocSavedToOmnivore, title)); } catch (ElexisException e) { throw new IOException(MessageFormat.format( Messages.PatientLabor_errorAddingDocument, filename), e); } } } }