/*******************************************************************************
* Copyright (c) 2008-2011, G. Weirich 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:
* G. Weirich - initial implementation
*******************************************************************************/
package ch.elexis.core.ui.views;
import java.util.List;
import ch.elexis.core.data.interfaces.IDiagnose;
import ch.elexis.core.data.interfaces.IVerrechenbar;
import ch.elexis.core.model.ISticker;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.Artikel;
import ch.elexis.data.BezugsKontakt;
import ch.elexis.data.Fall;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Kontakt;
import ch.elexis.data.NamedBlob;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Prescription;
import ch.elexis.data.Query;
import ch.elexis.data.Script;
import ch.elexis.data.Sticker;
import ch.elexis.data.Verrechnet;
import ch.rgw.tools.ExHandler;
/**
* Default implementation of IPatFilter. Will be called after all other filters returned DONT_HANDLE
*
* @author Gerry
*/
public class PatFilterImpl implements IPatFilter {
public int accept(Patient p, PersistentObject o){
if (o instanceof Kontakt) {
Query<BezugsKontakt> qbe = new Query<BezugsKontakt>(BezugsKontakt.class);
qbe.add(BezugsKontakt.MY_ID, Query.EQUALS, p.getId());
qbe.add(BezugsKontakt.OTHER_ID, Query.EQUALS, o.getId());
if (qbe.execute().size() > 0) {
return ACCEPT;
}
return REJECT;
} else if (o instanceof IVerrechenbar) {
IVerrechenbar iv = (IVerrechenbar) o;
Fall[] faelle = p.getFaelle();
for (Fall fall : faelle) {
Konsultation[] konsen = fall.getBehandlungen(false);
for (Konsultation k : konsen) {
List<Verrechnet> lv = k.getLeistungen();
for (Verrechnet v : lv) {
if (v.getVerrechenbar().equals(iv)) {
return ACCEPT;
}
}
}
}
return REJECT;
} else if (o instanceof IDiagnose) {
IDiagnose diag = (IDiagnose) o;
Fall[] faelle = p.getFaelle();
for (Fall fall : faelle) {
Konsultation[] konsen = fall.getBehandlungen(false);
for (Konsultation k : konsen) {
List<IDiagnose> id = k.getDiagnosen();
if (id.contains(diag)) {
return ACCEPT;
}
}
}
return REJECT;
} else if (o instanceof Artikel) {
Query<Prescription> qbe = new Query<Prescription>(Prescription.class);
qbe.add(Prescription.FLD_PATIENT_ID, Query.EQUALS, p.getId());
qbe.add(Prescription.FLD_ARTICLE, Query.EQUALS, o.storeToString());
if (qbe.execute().size() > 0) {
return ACCEPT;
}
return REJECT;
} else if (o instanceof Prescription) {
Artikel art = ((Prescription) o).getArtikel();
Query<Prescription> qbe = new Query<Prescription>(Prescription.class);
qbe.add(Prescription.FLD_PATIENT_ID, Query.EQUALS, p.getId());
qbe.add(Prescription.FLD_ARTICLE, Query.EQUALS, art.storeToString());
if (qbe.execute().size() > 0) {
return ACCEPT;
}
return REJECT;
} else if (o instanceof Sticker) {
List<ISticker> etis = p.getStickers();
ISticker e = (ISticker) o;
if (etis.contains(e)) {
return ACCEPT;
}
return REJECT;
} else if (o instanceof NamedBlob) {
NamedBlob nb = (NamedBlob) o;
String[] val = nb.getString().split("::");
String test = p.get(val[0]);
if (test == null) {
return DONT_HANDLE;
}
String op = val[1];
if (op.equals(Query.EQUALS)) {
return test.equalsIgnoreCase(val[2]) ? ACCEPT : REJECT;
} else if (op.equals("LIKE")) {
return test.toLowerCase().contains(val[2].toLowerCase()) ? ACCEPT : REJECT;
} else if (op.equals("Regexp")) {
return test.matches(val[2]) ? ACCEPT : REJECT;
}
} else if (o instanceof Script) {
Object ret;
try {
Script script = (Script) o;
script.setVariable("patient", p);
ret = script.execute(null, p);
if (ret instanceof Integer) {
return (Integer) ret;
}
} catch (Exception e) {
return FILTER_FAULT;
}
}
return DONT_HANDLE;
}
public boolean aboutToStart(PersistentObject filter){
if (filter instanceof Script) {
try {
((Script) filter).init();
return true;
} catch (Exception e) {
ExHandler.handle(e);
SWTHelper.showError("Fehler beim Initialisieren des Scripts", e.getMessage());
}
}
return false;
}
public boolean finished(PersistentObject filter){
if (filter instanceof Script) {
try {
((Script) filter).finished();
return true;
} catch (Exception e) {
ExHandler.handle(e);
SWTHelper.showError("Fehler beim Abschluss des Scripts", e.getMessage());
}
}
return false;
}
}