/******************************************************************************* * 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.Date; import org.eclipse.jface.action.IAction; import org.eclipse.jface.viewers.ISelection; import org.eclipse.swt.SWT; import org.eclipse.swt.custom.BusyIndicator; import org.eclipse.swt.widgets.MessageBox; import org.eclipse.ui.IWorkbenchWindow; import org.eclipse.ui.IWorkbenchWindowActionDelegate; import org.eclipse.ui.PartInitException; import org.hl7.v3.ClinicalDocumentType; import org.hl7.v3.POCDMT000040Author; import org.hl7.v3.POCDMT000040Custodian; import org.hl7.v3.POCDMT000040InformationRecipient; import org.hl7.v3.POCDMT000040RecordTarget; import ch.docbox.cdach.DocboxCDA; import ch.docbox.model.DocboxContact; import ch.docbox.ws.cdachservices.CDACHServices; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.core.data.events.ElexisEventDispatcher; import ch.elexis.core.ui.UiDesk; import ch.elexis.core.ui.util.Log; import ch.elexis.data.Fall; import ch.elexis.data.Kontakt; import ch.elexis.data.Patient; import ch.elexis.data.Person; import ch.rgw.tools.ExHandler; import ch.rgw.tools.TimeTool; import ch.swissmedicalsuite.HCardBrowser; public class DocboxTerminvereinbarungAction extends DocboxAction { private IWorkbenchWindow window; private Patient patient; private Fall fall; private Kontakt kontakt; protected static Log log = Log.get("DocboxTerminvereinbarungAction"); //$NON-NLS-1$ /** * The constructor. */ public DocboxTerminvereinbarungAction(){} /** * The action has been activated. The argument of the method represents the 'real' action * sitting in the workbench UI. * * @see IWorkbenchWindowActionDelegate#run */ public void run(IAction action){ try { if (CoreHub.actUser != null) { patient = ElexisEventDispatcher.getSelectedPatient(); kontakt = (Kontakt) ElexisEventDispatcher.getSelected(Kontakt.class); if (patient == null) { MessageBox box = new MessageBox(UiDesk.getDisplay().getActiveShell(), SWT.ICON_ERROR); box.setText(Messages.DocboxTerminvereinbarungAction_NoPatientSelectedText); box.setMessage(Messages.DocboxTerminvereinbarungAction_NoPatientSelectedMessage); box.open(); return; } if (kontakt != null) { Boolean terminvereinbarung = (Boolean) kontakt.getInfoElement("terminvereinbarung"); if (terminvereinbarung == null || !terminvereinbarung.booleanValue()) { MessageBox box = new MessageBox(UiDesk.getDisplay().getActiveShell(), SWT.ICON_ERROR); box.setText(Messages.DocboxTerminvereinbarungAction_NoDoctorSelectedText); box.setMessage(Messages.DocboxTerminvereinbarungAction_NoDoctorSelectedMessage); box.open(); } } if (!hasValidDocboxCredentials()) { return; } Runnable longJob = new Runnable() { boolean done = false; public void run(){ Thread thread = new Thread(new Runnable() { public void run(){ log.log("job started", Log.DEBUGMSG); try { makeReferral(kontakt); } catch (Exception e) { ExHandler.handle(e); log.log("excetion in makereferral", Log.DEBUGMSG); log.log(e.toString(), Log.DEBUGMSG); } log.log("job done", Log.DEBUGMSG); done = true; if (UiDesk.getDisplay().isDisposed()) return; UiDesk.getDisplay().wake(); } }); log.log("thread starting", Log.DEBUGMSG); thread.start(); while (!done && !UiDesk.getTopShell().isDisposed()) { if (!UiDesk.getDisplay().readAndDispatch()) UiDesk.getDisplay().sleep(); } log.log("thread ended", Log.DEBUGMSG); } }; BusyIndicator.showWhile(UiDesk.getDisplay(), longJob); if (UserDocboxPreferences.useHCard()) { new HCardBrowser(UserDocboxPreferences.getDocboxLoginID(false), UserDocboxPreferences.getDocboxBrowserUrl()).setTerminvereinbarung(); } else { DocboxView docboxView = (DocboxView) window.getWorkbench().getActiveWorkbenchWindow() .getActivePage().showView("ch.docbox.elexis.DocboxView"); if (docboxView != null) { docboxView.setTerminvereinbarung(); } } } } catch (PartInitException e) { e.printStackTrace(); } } private void makeReferral(Kontakt kontakt){ DocboxCDA docboxCDA = new DocboxCDA(); System.out.println("Invoking makeReferral..."); try { addVersicherung(fall, docboxCDA); } catch (Exception e) { e.printStackTrace(); } // FIXME phone, phoneBusiness notyet found // Patient personaldaten Date birthday = null; if (!"".equals(patient.getGeburtsdatum())) { TimeTool ttBirthday = new TimeTool(patient.getGeburtsdatum()); birthday = ttBirthday.getTime(); } POCDMT000040RecordTarget recordTarget = docboxCDA.getRecordTarget(patient.getPatCode(), null, patient.getAnschrift() .getStrasse(), patient.getAnschrift().getPlz(), patient.getAnschrift().getOrt(), null, null, patient.getNatel(), patient.getMailAddress(), patient.getVorname(), patient.getName(), "w".equals(patient.getGeschlecht()), "m".equals(patient .getGeschlecht()), false, birthday); POCDMT000040Author author = docboxCDA.getAuthor(CoreHub.actMandant.get(Person.TITLE), CoreHub.actMandant.getVorname(), CoreHub.actMandant.getName(), CoreHub.actMandant.getNatel(), null, null, CoreHub.actMandant.getMailAddress(), null, null, null); POCDMT000040Custodian custodian = docboxCDA.getCustodian(null, null, null, null, null, null); log.log("Invoking addReferral...", Log.DEBUGMSG); POCDMT000040InformationRecipient informationRecipient = null; if (kontakt != null) { informationRecipient = docboxCDA.getInformationRecipient(null, null, null, DocboxContact.getDocboxIdFor(kontakt), null); } ClinicalDocumentType _addReferral_document = new ClinicalDocumentType(); _addReferral_document.setClinicalDocument(docboxCDA.getClinicalDocument("", recordTarget, author, custodian, informationRecipient, docboxCDA.getCodeReferral(), null, null)); log.log("makeReferral ended...", Log.DEBUGMSG); byte[] _addReferral_attachment = new byte[0]; javax.xml.ws.Holder<java.lang.Boolean> _addReferral_success = new javax.xml.ws.Holder<java.lang.Boolean>(); javax.xml.ws.Holder<java.lang.String> _addReferral_message = new javax.xml.ws.Holder<java.lang.String>(); javax.xml.ws.Holder<java.lang.String> _addReferral_documentID = new javax.xml.ws.Holder<java.lang.String>(); CDACHServices port = UserDocboxPreferences.getPort(); port.addReferral(_addReferral_document, _addReferral_attachment, _addReferral_success, _addReferral_message, _addReferral_documentID); log.log("addReferral._addReferral_success=" + _addReferral_success.value, Log.DEBUGMSG); log.log("addReferral._addReferral_message=" + _addReferral_message.value, Log.DEBUGMSG); log.log("addReferral._addReferral_documentID=" + _addReferral_documentID.value, Log.DEBUGMSG); } private void addVersicherung(Fall fall, DocboxCDA docboxCDA){ if (fall != null) { if ("UVG".equals(fall.getAbrechnungsSystem())) { try { docboxCDA.addUnfallversicherung(fall.getRequiredContact("Kostenträger") .getLabel()); } catch (Exception e) {} try { docboxCDA.addUnfallversicherungPolicenummer(fall .getRequiredString("Unfallnummer")); } catch (Exception e) {} } if ("KVG".equals(fall.getAbrechnungsSystem())) { try { docboxCDA.addKrankenkasse(fall.getRequiredContact("Kostenträger").getLabel()); } catch (Exception e) {} try { docboxCDA.addKrankenkassePolicenummer(fall .getRequiredString("Versicherungsnummer")); } catch (Exception e) {} } } } /** * Selection in the workbench has been changed. We can change the state of the 'real' action * here if we want, but this can only happen after the delegate has been created. * * @see IWorkbenchWindowActionDelegate#selectionChanged */ public void selectionChanged(IAction action, ISelection selection){} /** * We can use this method to dispose of any system resources we previously allocated. * * @see IWorkbenchWindowActionDelegate#dispose */ public void dispose(){} /** * We will cache window object in order to be able to provide parent shell for the message * dialog. * * @see IWorkbenchWindowActionDelegate#init */ public void init(IWorkbenchWindow window){ this.window = window; } }