/******************************************************************************* * Copyright (c) 2011, A. Kaufmann and Elexis * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * A. Kaufmann - initial implementation * *******************************************************************************/ package ch.elexis.icpc; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import ch.elexis.data.Konsultation; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; import ch.elexis.core.data.interfaces.IDataAccess; import ch.rgw.tools.IFilter; import ch.rgw.tools.Result; import ch.rgw.tools.TimeTool; public class DataAccessor implements IDataAccess { public String getName(){ return "ICPC2-Daten"; } public String getDescription(){ return "Daten aus dem ICPC2-Plugin"; } public List<Element> getList(){ // TODO Auto-generated method stub return null; } private String code(IcpcCode ic){ return (ic == null ? "" : ic.getCode()); } /** * Alle Encounters in der Episode ep suchen, die zum Zeitraum dates passen und Liste zurueck * geben. */ private Result<Object> sucheEncounters(Episode ep, String dates, PersistentObject dep){ Query<Encounter> qen = new Query<Encounter>(Encounter.class); qen.add("EpisodeID", Query.LIKE, ep.getId()); if (dep instanceof Konsultation) { Konsultation kons = (Konsultation) dep; qen.add("KonsID", Query.LIKE, kons.getId()); } // TODO: Filtern nach dates // Encounters ohne RFE, Diag und Procedere rauswerfen qen.addPostQueryFilter(new IFilter() { public boolean select(Object element){ Encounter e = (Encounter) element; return e.getRFE() != null || e.getDiag() != null || e.getProc() != null; } }); List<Encounter> result = qen.execute(); // Sortieren Collections.sort(result, new Comparator<Encounter>() { public int compare(Encounter e1, Encounter e2){ TimeTool tt1 = new TimeTool(e1.getKons().getDatum()); TimeTool tt2 = new TimeTool(e2.getKons().getDatum()); return tt1.compareTo(tt2); } }); return new Result<Object>(result); } private Result<Object> sucheEncounters(List<Episode> eps, Map<Episode, List<Encounter>> encs, PersistentObject dep, String dates){ Patient pat; if (dep instanceof Konsultation) { Konsultation kons = (Konsultation) dep; pat = kons.getFall().getPatient(); } else if (dep instanceof Patient) { pat = (Patient) dep; } else { return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.INVALID_PARAMETERS, "Ungültiger Parameter", dep, true); } // Alle Episoden des Patienten zusammensuchen Query<Episode> qep = new Query<Episode>(Episode.class); qep.add(Episode.FLD_PATIENT_ID, Query.LIKE, pat.getId()); qep.orderBy(false, Episode.FLD_START_DATE); List<Episode> raw_eps = qep.execute(); int count = 0; for (Episode ep : raw_eps) { // Betroffene Encounters suchen Result<Object> res = sucheEncounters(ep, dates, dep); if (!res.isOK()) { return res; } // Falls mindestens ein Encounter gefunden wurde, // Episode in Liste aufnehmen. @SuppressWarnings("unchecked") List<Encounter> ep_encs = (List<Encounter>) res.get(); if (ep_encs.size() > 0) { eps.add(ep); encs.put(ep, ep_encs); // Eine Zeile fuer die Episode + eine pro Encounter count += 1 + ep_encs.size(); } } return new Result<Object>(count); } public Result<Object> getObject(String descriptor, PersistentObject dependentObject, String dates, String[] params){ if (descriptor.toLowerCase().equals("encounters")) { /* * Tabelle in der Form: Problem1 | Datum | aktiv/inaktiv | Datum | RFE | Diagnose | * Procedere . . . . . Problem2 | Datum | aktiv/inaktiv . . . . . */ List<Episode> episodes = new LinkedList<Episode>(); HashMap<Episode, List<Encounter>> encounters = new HashMap<Episode, List<Encounter>>(); Result<Object> res = sucheEncounters(episodes, encounters, dependentObject, dates); if (!res.isOK()) { return res; } int rows = (Integer) res.get() + 1; String result[][] = new String[rows][5]; int i = 0; // Spaltenüberschriften result[i][0] = "Problem"; result[i][1] = "Datum"; result[i][2] = "RFE"; result[i][3] = "Diagnose"; result[i][4] = "Procedere"; i++; for (Episode ep : episodes) { /* Zeile fuer Episode generieren */ result[i][0] = ep.getTitle(); result[i][1] = ep.getStartDate(); result[i][2] = ep.getStatusText(); result[i][3] = result[i][4] = ""; i++; /* Zeilen fuer Encounters generieren */ for (Encounter en : encounters.get(ep)) { result[i][0] = ""; result[i][1] = en.getKons().getDatum(); result[i][2] = code(en.getRFE()); result[i][3] = code(en.getDiag()); result[i][4] = code(en.getProc()); i++; } } return new Result<Object>(result); } else { return new Result<Object>(Result.SEVERITY.ERROR, IDataAccess.OBJECT_NOT_FOUND, "Ungültiger Parameter", descriptor, true); } } }