/******************************************************************************* * Copyright (c) 2010, Oliver Egger, visionary 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 * *******************************************************************************/ package ch.docbox.elexis; import java.util.ArrayList; import java.util.Calendar; import java.util.List; import ch.docbox.ws.cdachservices.AppointmentType; import ch.elexis.agenda.data.Termin; import ch.elexis.agenda.util.Plannables; import ch.elexis.core.ui.util.Log; import ch.elexis.data.Query; import ch.rgw.tools.ExHandler; import ch.rgw.tools.TimeTool; public class DocboxTermin { private Termin elexisTermin; private Termin elexisTerminDayAfter; protected static Log log = Log.get("DocboxTermin"); //$NON-NLS-1$ @Override // NOTE: used for list search contains, based only on first id of object hashcode public boolean equals(Object obj){ if (obj != null && obj instanceof DocboxTermin) { return this.hashCode() == obj.hashCode(); } return super.equals(obj); } // NOTE: used for list search contains, based only on first id of object hashcode @Override public int hashCode(){ int hashCode = super.hashCode(); if (elexisTermin != null) { hashCode = elexisTermin.hashCode(); } return hashCode; } public DocboxTermin(){ } public boolean loadTermin(String id){ elexisTermin = Termin.load(id); if (elexisTermin != null && elexisTermin.isDeleted()) { elexisTermin.undelete(); } elexisTerminDayAfter = Termin.load(id + "2"); if (elexisTerminDayAfter != null && elexisTerminDayAfter.isDeleted()) { elexisTerminDayAfter.undelete(); } return elexisTermin != null; } static int TimeInMinutes(final TimeTool t){ return (t.get(TimeTool.HOUR_OF_DAY) * 60) + t.get(TimeTool.MINUTE); } private String getTerminUniqueId(String appointmentId, String bereich, boolean first){ return appointmentId + "[-" + bereich + "-]" + (first ? "" : "2"); } public static String getDocboxTerminId(Termin termin){ if (termin != null) { String id = termin.getId(); int pos = id.indexOf("[-"); if (pos > 0) { return id.substring(0, pos); } } return ""; } public boolean create(AppointmentType appointment, String bereich){ try { loadTermin(getTerminUniqueId(appointment.getId(), bereich, true)); Calendar cal = Calendar.getInstance(); cal.setTimeInMillis(appointment.getDate().toGregorianCalendar().getTimeInMillis()); int day = cal.get(Calendar.DAY_OF_WEEK); int startMinutes = cal.get(Calendar.MINUTE) + cal.get(Calendar.HOUR_OF_DAY) * 60; TimeTool ttFrom = new TimeTool(); ttFrom.setTimeInMillis(cal.getTimeInMillis()); cal.add(Calendar.MINUTE, (int) appointment.getDuration()); TimeTool ttUntil = new TimeTool(); ttUntil.setTimeInMillis(cal.getTimeInMillis()); int day2 = cal.get(Calendar.DAY_OF_WEEK); boolean twoday = (day != day2); if (!twoday && elexisTerminDayAfter != null) { if (elexisTerminDayAfter != null) { if (elexisTerminDayAfter.isLocked()) { elexisTerminDayAfter.setLocked(false); } elexisTerminDayAfter.delete(); } } String terminType = Termin.typReserviert(); String terminStatus = Termin.statusStandard(); String tag = ttFrom.toString(TimeTool.DATE_COMPACT); Integer von = TimeInMinutes(ttFrom); // dummy for constructor below Integer bis = TimeInMinutes(ttUntil); // dummy for constructor below if (elexisTermin == null) { elexisTermin = new Termin(getTerminUniqueId(appointment.getId(), bereich, true), bereich, tag, von, bis, terminType, terminStatus); } if (twoday) { if (elexisTerminDayAfter == null) { elexisTerminDayAfter = new Termin(getTerminUniqueId(appointment.getId(), bereich, false), bereich, tag, von, bis, terminType, terminStatus); } } setLocked(false); Plannables.loadTermine(bereich, ttFrom); // fix for tagesgrenzen otherwise not showing // up when empty if (!twoday) { elexisTermin.set( new String[] { "BeiWem", "Tag", "Beginn", "Typ", "Status", "ErstelltVon", "Dauer" }, new String[] { bereich, ttFrom.toString(TimeTool.DATE_COMPACT), Integer.toString(startMinutes), terminType, terminStatus, UserDocboxPreferences.getDocboxLoginID(false), Integer.toString((int) appointment.getDuration()) }); } else { Plannables.loadTermine(bereich, ttUntil); // fix for tagesgrenzen otherwise not // showing up elexisTermin.set( new String[] { "BeiWem", "Tag", "Beginn", "Typ", "Status", "ErstelltVon", "Dauer" }, new String[] { bereich, ttFrom.toString(TimeTool.DATE_COMPACT), Integer.toString(startMinutes), terminType, terminStatus, UserDocboxPreferences.getDocboxLoginID(false), Integer.toString(24 * 60 - startMinutes) }); elexisTerminDayAfter.set( new String[] { "BeiWem", "Tag", "Beginn", "Typ", "Status", "ErstelltVon", "Dauer" }, new String[] { bereich, ttUntil.toString(TimeTool.DATE_COMPACT), Integer.toString(0), terminType, terminStatus, UserDocboxPreferences.getDocboxLoginID(false) + "-sys", Integer.toString((int) (startMinutes + appointment.getDuration()) % (24 * 60)) }); } String text = ""; String grund = ""; if (appointment.getReasonDetails() != null) { grund = appointment.getReasonDetails(); } if ("salesrepresentative-open".equals(appointment.getState())) { text = "offener Ă„rztebesuchertermin"; } else if ("salesrepresentative-booked".equals(appointment.getState())) { text = String.format("%1$s (Ă„rztebesuchertermin): %2$s", appointment.getVisitor(), appointment.getReasonTitle()); } else if ("salesrepresentative-openrequest".equals(appointment.getState())) { text = String.format("offene Anfrage von %1$s", appointment.getVisitor()); grund = appointment.getReasonTitle(); } else if ("salesrepresentative-openinvitation".equals(appointment.getState())) { text = String.format("offene Einladung an %1$s", appointment.getVisitor()); grund = appointment.getReasonTitle(); } else if ("salesrepresentative-phone".equals(appointment.getState())) { text = String.format("%1$s (manuell eingetragen)", appointment.getVisitor()); } else if ("emergencyservice".equals(appointment.getState())) { text = String.format("Notfalldienst %1$s", appointment.getReasonTitle()); } else if ("terminierung-booked".equals(appointment.getState())) { text = appointment.getVisitor(); grund = appointment.getReasonTitle(); grund += "\r\n"; grund += appointment.getReasonDetails(); } else if ("terminierung-open".equals(appointment.getState())) { text = "offene Terminvereinbarung"; } else if ("canceled".equals(appointment.getState())) { elexisTermin.delete(); return true; } if (text != null && text.length() > 80) { int seperator = text.indexOf(",", 65); if (seperator > 80 || seperator <= 65) { seperator = 79; } text = text.substring(0, seperator); } setText(text); setGrund(grund); setLocked(true); log.log("Termin " + elexisTermin.getId() + " " + elexisTermin.getText() + " " + elexisTermin.getGrund() + " - " + elexisTermin.getDay(), Log.DEBUGMSG); } catch (Exception exception) { log.log(exception, "Termin konnte nicht gespeichert werden", Log.ERRORS); ExHandler.handle(exception); return false; } return true; } public void setText(String text){ elexisTermin.setText(text); if (elexisTerminDayAfter != null) { elexisTerminDayAfter.setText(text); } } public void setGrund(String text){ elexisTermin.setGrund(text); if (elexisTerminDayAfter != null) { elexisTerminDayAfter.setGrund(text); } } public void setLocked(boolean locked){ elexisTermin.setLocked(locked); if (elexisTerminDayAfter != null) { elexisTerminDayAfter.setLocked(locked); } } public boolean delete(){ if (elexisTerminDayAfter != null && elexisTerminDayAfter.exists()) { if (elexisTerminDayAfter.isLocked()) { elexisTerminDayAfter.setLocked(false); } elexisTerminDayAfter.delete(); } if (elexisTermin != null && elexisTermin.exists()) { log.log("Terminid " + elexisTermin.getId() + " " + elexisTermin.getText() + " " + elexisTermin.getGrund() + "- " + elexisTermin.getBereich(), Log.DEBUGMSG); if (elexisTermin.isLocked()) { elexisTermin.setLocked(false); } elexisTermin.delete(); return true; } return false; } static public List<DocboxTermin> getDocboxTermine(){ Query<Termin> terminQuery = new Query<Termin>(Termin.class); terminQuery.add("ErstelltVon", "=", UserDocboxPreferences.getDocboxLoginID(false)); terminQuery.add("Tag", ">=", new TimeTool().toString(TimeTool.DATE_COMPACT)); if (UserDocboxPreferences.getAgendaSettingsPerUser()) { terminQuery.add("BeiWem", "=", UserDocboxPreferences.getAppointmentsBereich()); } List<Termin> termine = terminQuery.execute(); log.log("Termine bestehend " + termine.size(), Log.DEBUGMSG); ArrayList<DocboxTermin> docboxTermine = new ArrayList<DocboxTermin>(); for (Termin termin : termine) { DocboxTermin docboxTermin = new DocboxTermin(); docboxTermin.loadTermin(termin.getId()); log.log( "Terminid " + termin.getId() + " " + termin.getText() + " " + termin.getGrund(), Log.DEBUGMSG); docboxTermine.add(docboxTermin); } return docboxTermine; } }