/******************************************************************************* * Copyright (c) 2011-2016 Medevit OG, Medelexis AG * 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: * Marco Descher, initial API and implementaion * Lucia Amman, bug fixes and improvements * Sponsors: M. + P. Richter *******************************************************************************/ package at.medevit.elexis.gdt.data; import java.util.List; import at.medevit.elexis.gdt.constants.GDTConstants; import at.medevit.elexis.gdt.interfaces.IGDTCommunicationPartner; import at.medevit.elexis.gdt.messages.GDTSatzNachricht; import ch.elexis.data.Patient; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; import ch.rgw.tools.JdbcLink; import ch.rgw.tools.TimeTool; import ch.rgw.tools.VersionInfo; public class GDTProtokoll extends PersistentObject { public static final String FLD_DATETIME = "DateTime"; public static final String FLD_PATIENT_ID = "PatientID"; public static final String FLD_BEZEICHNUNG = "Bezeichnung"; public static final String FLD_BEMERKUNGEN = "Bemerkungen"; public static final String FLD_MESSAGE_TYPE = "MessageType"; public static final String FLD_MESSAGE_DIRECTION = "MessageDirection"; public static final String FLD_GEGENSTELLE = "Remote"; public static final String FLD_MESSAGE = "Message"; static final String VERSION = "1.0.1"; public static final String MESSAGE_DIRECTION_IN = "IN"; public static final String MESSAGE_DIRECTION_OUT = "OUT"; static final String TABLENAME = "at_medevit_elexis_gdt_protokoll"; static final String createDB = "CREATE TABLE " + TABLENAME + "(" + "ID VARCHAR(25) primary key," + "lastupdate BIGINT," + "deleted CHAR(1) default '0'," + FLD_DATETIME +" VARCHAR(24)," + FLD_PATIENT_ID+" VARCHAR(25)," + FLD_BEZEICHNUNG+" VARCHAR(60)," + FLD_BEMERKUNGEN+" VARCHAR(80)," + FLD_MESSAGE_TYPE+" VARCHAR(4)," + FLD_MESSAGE_DIRECTION+" VARCHAR(3)," + FLD_GEGENSTELLE+" VARCHAR(60)," + FLD_MESSAGE+" TEXT);" + "CREATE INDEX " + TABLENAME + "idx1 on " + TABLENAME + " ("+FLD_DATETIME+");" + "INSERT INTO " + TABLENAME + " (ID,DateTime) VALUES ('VERSION'," + JdbcLink.wrap("1.0.0") + ");"; static { addMapping(TABLENAME, FLD_DATETIME, FLD_PATIENT_ID, FLD_BEZEICHNUNG, FLD_BEMERKUNGEN, FLD_MESSAGE_TYPE, FLD_MESSAGE_DIRECTION, FLD_GEGENSTELLE, FLD_MESSAGE); GDTProtokoll version = load("VERSION"); if (!version.exists()) { createOrModifyTable(createDB); } else { VersionInfo vi = new VersionInfo(version.get(FLD_DATETIME)); if (vi.isOlder(VERSION)) { { // 1.0.1 createOrModifyTable("ALTER TABLE "+TABLENAME+" MODIFY "+FLD_GEGENSTELLE+" VARCHAR(255);"); version.set(FLD_DATETIME, VERSION); } } } } GDTProtokoll(){} protected GDTProtokoll(String id) { super(id); } public <U extends GDTSatzNachricht> GDTProtokoll(String messageDirection, IGDTCommunicationPartner cp, U satzNachricht){ create(null); Patient pat = Patient.loadByPatientID(satzNachricht.getValue(GDTConstants.FELDKENNUNG_PATIENT_KENNUNG)); StringBuilder sb = new StringBuilder(); String[] message = satzNachricht.getMessage(); for (int i = 0; i < message.length; i++) { sb.append(message[i]); } set(new String[] { FLD_DATETIME, FLD_PATIENT_ID, FLD_MESSAGE_TYPE, FLD_MESSAGE_DIRECTION, FLD_GEGENSTELLE, FLD_MESSAGE, FLD_BEZEICHNUNG }, new TimeTool().toString(TimeTool.TIMESTAMP), (pat!=null) ? pat.getId() : "nicht zugeordnet", satzNachricht.getValue(GDTConstants.FELDKENNUNG_SATZIDENTIFIKATION), messageDirection, cp.getLabel(), sb.toString(), satzNachricht.getValue(GDTConstants.FELDKENNUNG_TEST_IDENT) ); int satznachrichtType = Integer.parseInt(satzNachricht.getValue(GDTConstants.FELDKENNUNG_SATZIDENTIFIKATION)); if(messageDirection.equalsIgnoreCase(GDTProtokoll.MESSAGE_DIRECTION_OUT)) { switch (satznachrichtType) { case GDTConstants.SATZART_UNTERSUCHUNG_ANFORDERN: set(FLD_BEZEICHNUNG, "Anforderung Untersuchung: "+satzNachricht.getValue(GDTConstants.FELDKENNUNG_GERAETE_UND_VERFAHRENSSPEZIFISCHES_KENNFELD)); break; case GDTConstants.SATZART_DATEN_EINER_UNTERSUCHUNG_ZEIGEN: set(FLD_BEZEICHNUNG, "Anzeige Untersuchung: "+satzNachricht.getValue(GDTConstants.FELDKENNUNG_GERAETE_UND_VERFAHRENSSPEZIFISCHES_KENNFELD)); break; case GDTConstants.SATZART_STAMMDATEN_UEBERMITTELN: set(FLD_BEZEICHNUNG, "Stammdaten übermittelt"); break; default: break; } } if(messageDirection.equalsIgnoreCase(GDTProtokoll.MESSAGE_DIRECTION_IN)) { switch (satznachrichtType) { case GDTConstants.SATZART_DATEN_EINER_UNTERSUCHUNG_UEBERMITTELN: set(FLD_BEZEICHNUNG, "Resultat Untersuchung: "+satzNachricht.getValue(GDTConstants.FELDKENNUNG_GERAETE_UND_VERFAHRENSSPEZIFISCHES_KENNFELD)); break; default: break; } } } public static GDTProtokoll load(String id){ return new GDTProtokoll(id); } @Override protected String getTableName(){ return TABLENAME; } @Override public String getLabel(){ StringBuilder sb = new StringBuilder(); TimeTool tt = new TimeTool(get(FLD_DATETIME)); Patient pat = Patient.loadByPatientID(get(FLD_PATIENT_ID)); sb.append(tt.toString(TimeTool.DATE_GER)+": "+pat.getLabel()+" "+FLD_MESSAGE_TYPE+" "+FLD_MESSAGE_DIRECTION); return sb.toString(); } public String getMenuLabel() { StringBuilder sb = new StringBuilder(); TimeTool tt = new TimeTool(get(FLD_DATETIME)); sb.append(tt.toString(TimeTool.DATE_GER)+": "+get(FLD_BEZEICHNUNG)+" "+"["+get(FLD_GEGENSTELLE)+"]"); return sb.toString(); } public static <U extends GDTSatzNachricht> GDTProtokoll addEntry(String messageDirection, IGDTCommunicationPartner cp, U satzNachricht){ return new GDTProtokoll(messageDirection, cp, satzNachricht); } public static GDTProtokoll[] getAllEntries() { Query<GDTProtokoll> qbe = new Query<GDTProtokoll>(GDTProtokoll.class); qbe.add("ID", Query.NOT_EQUAL, "VERSION"); List<GDTProtokoll> qre = qbe.execute(); return qre.toArray(new GDTProtokoll[] {}); } public static GDTProtokoll[] getEntriesForPatient(Patient pat) { String ID = pat.getId(); Query<GDTProtokoll> qbe = new Query<GDTProtokoll>(GDTProtokoll.class); qbe.add("ID", Query.NOT_EQUAL, "VERSION"); qbe.add(GDTProtokoll.FLD_PATIENT_ID, Query.EQUALS, ID); List<GDTProtokoll> qre = qbe.execute(); return qre.toArray(new GDTProtokoll[] {}); } public String getMessageDirection() { return get(FLD_MESSAGE_DIRECTION); } public TimeTool getEntryTime() { return new TimeTool(get(FLD_DATETIME)); } /** * @return value of {@link GDTConstants#FELDKENNUNG_SATZIDENTIFIKATION} */ public String getMessageType(){ return get(FLD_MESSAGE_TYPE); } public Patient getEntryRelatedPatient() { return Patient.load(get(FLD_PATIENT_ID)); } public String getBezeichnung() { return get(FLD_BEZEICHNUNG); } public void setBezeichnung(String bezeichnung) { set(FLD_BEZEICHNUNG, bezeichnung); } public String getBemerkungen() { return get(FLD_BEMERKUNGEN); } public void setBemerkungen(String bemerkung) { set(FLD_BEMERKUNGEN, bemerkung); } public String getGegenstelle() { return get(FLD_GEGENSTELLE); } public String getMessage() { return get(FLD_MESSAGE); } }