package com.hilotec.elexis.kgview.data;
import java.util.Arrays;
import java.util.HashSet;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.data.Anwender;
import ch.elexis.data.Konsultation;
import ch.elexis.data.PersistentObject;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
public class KonsData extends PersistentObject {
public static final String VERSION = "9";
public static final String PLUGIN_ID = "com.hilotec.elexis.kgview";
private static final String TABLENAME = "COM_HILOTEC_ELEXIS_KGVIEW_KONSDATA";
public static final String FLD_JETZLEIDEN = "JetzigesLeiden";
public static final String FLD_JETZLEIDEN_ICPC = "JetzigesLeidenICPC";
public static final String FLD_ALLGSTATUS = "AllgStatus";
public static final String FLD_LOKSTATUS = "LokStatus";
public static final String FLD_PROZEDERE = "Prozedere";
public static final String FLD_PROZEDERE_ICPC = "ProzedereICPC";
public static final String FLD_DIAGNOSE = "Diagnose";
public static final String FLD_DIAGNOSE_ICPC = "DiagnoseICPC";
public static final String FLD_THERAPIE = "Therapie";
public static final String FLD_VERLAUF = "Verlauf";
public static final String FLD_ROENTGEN = "Roentgen";
public static final String FLD_EKG = "EKG";
public static final String FLD_KONSZEIT = "KonsZeit";
public static final String FLD_KONSBEGINN = "KonsBeginn";
public static final String FLD_KONSTYP = "KonsTyp";
public static final String FLD_AUTOR = "Autor";
public static final int KONSTYP_NORMAL = 0;
public static final int KONSTYP_TELEFON = 1;
public static final int KONSTYP_HAUSBESUCH = 2;
// Felder an denen Aenderungen nur durch den Autor durchgefuehrt werden
// duerfen.
private static final String[] KGFIELDS = {
FLD_JETZLEIDEN, FLD_JETZLEIDEN_ICPC, FLD_ALLGSTATUS, FLD_LOKSTATUS, FLD_PROZEDERE,
FLD_PROZEDERE_ICPC, FLD_DIAGNOSE, FLD_DIAGNOSE_ICPC, FLD_THERAPIE, FLD_VERLAUF,
FLD_ROENTGEN, FLD_EKG,
};
private static final HashSet<String> KGFIELD_SET = new HashSet<String>(Arrays.asList(KGFIELDS));
static {
addMapping(TABLENAME, "JetzigesLeiden=JetzLeiden", "JetzigesLeidenICPC=JetzLeidenICPC",
"AllgStatus", "LokStatus", "Prozedere", "ProzedereICPC", "Diagnose", "DiagnoseICPC",
"Therapie", "Verlauf", "Roentgen", "EKG", "KonsZeit", "KonsBeginn", "KonsTyp", "Autor");
checkTable();
}
private static final String create = "CREATE TABLE " + TABLENAME + " ("
+ " ID VARCHAR(25) PRIMARY KEY, " + " lastupdate BIGINT, "
+ " deleted CHAR(1) DEFAULT '0', " + " JetzLeiden TEXT, " + " JetzLeidenICPC TEXT, "
+ " AllgStatus TEXT, " + " LokStatus TEXT, " + " Prozedere TEXT, "
+ " ProzedereICPC TEXT, " + " Diagnose TEXT, " + " DiagnoseICPC TEXT, "
+ " Therapie TEXT, " + " Verlauf TEXT, " + " Roentgen TEXT, " + " EKG TEXT, "
+ " KonsZeit BIGINT DEFAULT 0, " + " KonsBeginn BIGINT, "
+ " KonsTyp SMALLINT DEFAULT 0, " + " Autor VARCHAR(25) " + ");"
+ "INSERT INTO " + TABLENAME + " (ID, JetzLeiden) VALUES " + " ('VERSION', '" + VERSION
+ "');";
private static final String up_1to2 = "ALTER TABLE " + TABLENAME
+ " ADD JetzLeidenICPC TEXT AFTER JetzLeiden,"
+ " ADD ProzedereICPC TEXT AFTER Prozedere," + " ADD DiagnoseICPC TEXT AFTER Diagnose;"
+ "UPDATE " + TABLENAME + " SET JetzLeiden = '2' WHERE" + " ID LIKE 'VERSION';";
private static final String up_2to3 = "ALTER TABLE " + TABLENAME
+ " ADD Therapie TEXT AFTER DiagnoseICPC," + " ADD Verlauf TEXT AFTER Therapie;"
+ "UPDATE " + TABLENAME + " SET JetzLeiden = '3' WHERE" + " ID LIKE 'VERSION';";
private static final String up_3to4 = "ALTER TABLE " + TABLENAME
+ " ADD Roentgen TEXT AFTER Verlauf," + " ADD EKG TEXT AFTER Roentgen;" + "UPDATE "
+ TABLENAME + " SET JetzLeiden = '4' WHERE" + " ID LIKE 'VERSION';";
private static final String up_4to5 = "ALTER TABLE " + TABLENAME
+ " ADD KonsBeginn BIGINT AFTER KonsZeit;" + "UPDATE " + TABLENAME
+ " SET JetzLeiden = '5' WHERE" + " ID LIKE 'VERSION';";
private static final String up_5to6 = "ALTER TABLE " + TABLENAME
+ " CHANGE KonsZeit KonsZeit BIGINT DEFAULT 0;" + "UPDATE " + TABLENAME
+ " SET KonsZeit = 0 WHERE" + " KonsZeit IS NULL;" + "UPDATE " + TABLENAME
+ " SET JetzLeiden = '6' WHERE" + " ID LIKE 'VERSION';";
private static final String up_6to7 = "ALTER TABLE " + TABLENAME
+ " ADD IstTelefon CHAR(1) DEFAULT '0' AFTER KonsBeginn;" + "UPDATE " + TABLENAME
+ " SET JetzLeiden = '7' WHERE" + " ID LIKE 'VERSION';";
private static final String up_7to8 = "ALTER TABLE " + TABLENAME
+ " ADD Autor VARCHAR(25) AFTER IstTelefon;" + "UPDATE " + TABLENAME
+ " SET JetzLeiden = '8' WHERE" + " ID LIKE 'VERSION';";
private static final String up_8to9 = "ALTER TABLE " + TABLENAME
+ " ADD KonsTyp SMALLINT DEFAULT 0 AFTER IstTelefon;" + "UPDATE " + TABLENAME
+ " SET KonsTyp = 1 WHERE" + " IstTelefon = 1;" + "ALTER TABLE " + TABLENAME
+ " DROP IstTelefon; " + "UPDATE " + TABLENAME + " SET JetzLeiden = '9' WHERE"
+ " ID LIKE 'VERSION';";
private static void checkTable(){
KonsData check = load("VERSION");
if (!check.exists()) {
createOrModifyTable(create);
} else {
if (check.getJetzigesLeiden().equals("1"))
createOrModifyTable(up_1to2);
if (check.getJetzigesLeiden().equals("2"))
createOrModifyTable(up_2to3);
if (check.getJetzigesLeiden().equals("3"))
createOrModifyTable(up_3to4);
if (check.getJetzigesLeiden().equals("4"))
createOrModifyTable(up_4to5);
if (check.getJetzigesLeiden().equals("5"))
createOrModifyTable(up_5to6);
if (check.getJetzigesLeiden().equals("6"))
createOrModifyTable(up_6to7);
if (check.getJetzigesLeiden().equals("7"))
createOrModifyTable(up_7to8);
if (check.getJetzigesLeiden().equals("8"))
createOrModifyTable(up_8to9);
}
}
public static KonsData load(final String id){
return new KonsData(id);
}
public static KonsData load(Konsultation kons){
return load(kons.getId());
}
protected KonsData(){}
protected KonsData(final String id){
super(id);
}
public KonsData(Konsultation kons){
super(kons.getId());
if (!exists()) {
create(kons.getId());
set(FLD_KONSBEGINN, Long.toString(System.currentTimeMillis()));
}
}
@Override
public String getLabel(){
return getKonsultation().getLabel();
}
@Override
protected String getTableName(){
return TABLENAME;
}
public String getJetzigesLeiden(){
return get(FLD_JETZLEIDEN);
}
public String getJetzigesLeidenICPC(){
return get(FLD_JETZLEIDEN_ICPC);
}
public String getAllgemeinstatus(){
return get(FLD_ALLGSTATUS);
}
public String getLokalstatus(){
return get(FLD_LOKSTATUS);
}
public String getProzedere(){
return get(FLD_PROZEDERE);
}
public String getProzedereICPC(){
return get(FLD_PROZEDERE_ICPC);
}
public String getDiagnose(){
return get(FLD_DIAGNOSE);
}
public String getDiagnoseICPC(){
return get(FLD_DIAGNOSE_ICPC);
}
public String getTherapie(){
return get(FLD_THERAPIE);
}
public String getVerlauf(){
return get(FLD_VERLAUF);
}
public String getRoentgen(){
return get(FLD_ROENTGEN);
}
public String getEKG(){
return get(FLD_EKG);
}
public long getKonsZeit(){
return Long.parseLong(get(FLD_KONSZEIT));
}
public String getKonsBeginn(){
String ts = get(FLD_KONSBEGINN);
if (ts == null || ts.equals(""))
return "";
TimeTool t = new TimeTool();
t.setTimeInMillis(Long.parseLong(ts));
return t.toString(TimeTool.TIME_SMALL);
}
public Konsultation getKonsultation(){
return Konsultation.load(getId());
}
public int getKonsTyp(){
String tel = get(FLD_KONSTYP);
tel = (StringTool.isNothing(tel) ? "0" : tel);
return Integer.parseInt(tel);
}
public Anwender getAutor(){
String id = get(FLD_AUTOR);
if (!StringTool.isNothing(id)) {
Anwender aw = Anwender.load(id);
return aw;
}
return null;
}
public void setJetzigesLeiden(String txt){
set(FLD_JETZLEIDEN, txt);
}
public void setAllgemeinstatus(String txt){
set(FLD_ALLGSTATUS, txt);
}
public void setLokalstatus(String txt){
set(FLD_LOKSTATUS, txt);
}
public void setProzedere(String txt){
set(FLD_PROZEDERE, txt);
}
public void setDiagnose(String txt){
set(FLD_DIAGNOSE, txt);
}
public void setTherapie(String txt){
set(FLD_THERAPIE, txt);
}
public void setVerlauf(String txt){
set(FLD_VERLAUF, txt);
}
public void setRoentgen(String txt){
set(FLD_ROENTGEN, txt);
}
public void setEKG(String txt){
set(FLD_EKG, txt);
}
public void setKonsBeginn(long zeit){
set(FLD_KONSBEGINN, Long.toString(zeit));
}
public void setKonsZeit(long zeit){
set(FLD_KONSZEIT, Long.toString(zeit));
}
public void setKonsTyp(int typ){
set(FLD_KONSTYP, Integer.toString(typ));
}
public void setAutor(Anwender anw){
String id = "";
if (anw != null)
id = anw.getId();
set(FLD_AUTOR, id);
}
/**
* Wir ueberschreiben hier set() um sicherzustellen dass nur der Autor einen KG-Eintrag anpassen
* kann, und um den Autor festzuhalten falls das noch nicht geschehen ist.
*/
@Override
public boolean set(final String field, String value){
if (KGFIELD_SET.contains(field)) {
Anwender au = getAutor();
if (au == null) {
// Noch kein Autor gesetzt, auf dieser Kons, setze auf
// aktuellen User
setAutor(CoreHub.actUser);
} else if (!au.equals(CoreHub.actUser)) {
// Ungueltiger User
throw new RuntimeException("Nur Autor kann " + "Krankengeschichte veraendern!");
} else if (StringTool.isNothing(value)) {
// Wenn das Feld leer ist, und alle anderen KG-Felder leer sind,
// wird der Autor zurueckgesesetzt.
boolean nonempty = false;
for (int i = 0; i < KGFIELDS.length && !nonempty; i++) {
nonempty |= !StringTool.isNothing(get(KGFIELDS[i]));
}
if (!nonempty)
set(FLD_AUTOR, "");
}
}
return super.set(field, value);
}
/**
* Prueft ob die KG dieser Konsultation vom aktuellen Benutzer bearbeitet werden darf
*/
public boolean isEditOK(){
Anwender au = getAutor();
return au == null || au.equals(CoreHub.actUser);
}
@Override
public boolean isDragOK(){
return true;
}
}