/*******************************************************************************
* Copyright (c) 2006-2010, 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.views;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URL;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import org.jdom.Document;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import at.medevit.elexis.tarmed.model.TarmedJaxbUtil;
import ch.elexis.TarmedRechnung.XMLExporter;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.interfaces.IRnOutputter;
import ch.elexis.core.ui.text.ITextPlugin;
import ch.elexis.core.ui.text.MimeTypeUtil;
import ch.elexis.core.ui.text.TextContainer;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.Brief;
import ch.elexis.data.Query;
import ch.elexis.data.Rechnung;
import ch.elexis.data.RnStatus;
import ch.elexis.tarmed.printer.TarmedTemplateRequirement;
import ch.elexis.tarmed.printer.XML40Printer;
import ch.elexis.tarmed.printer.XML44Printer;
/**
* This is a pop-in replacement for RnPrintView. To avoid several problems around OpenOffice based
* bills we keep things easier here. Thus this approach does not optimize printer access but rather
* waits for each page to be printed before starting the next.
*
* We also corrected several problems around the TrustCenter-system. Tokens are printed only on TG
* bills and only if the mandator has a TC contract. Tokens are computed correctly now with the TC
* number as identifier in TG bills and left as ESR in TP bills.
*
* @author Gerry
*
*/
public class RnPrintView2 extends ViewPart {
public static final String ID = "ch.elexis.arzttarife_ch.printview2";
private static Logger logger = LoggerFactory.getLogger(RnPrintView2.class);
TextContainer text;
public RnPrintView2(){
}
@Override
public void createPartControl(final Composite parent){
text = new TextContainer(getViewSite());
text.getPlugin().createContainer(parent, new ITextPlugin.ICallback() {
@Override
public void save(){
// TODO Auto-generated method stub
}
@Override
public boolean saveAs(){
// TODO Auto-generated method stub
return false;
}
});
text.getPlugin().setParameter(ITextPlugin.Parameter.NOUI);
}
@Override
public void setFocus(){
// TODO Auto-generated method stub
}
/**
* Druckt die Rechnung auf eine Vorlage, deren Ränder alle auf 0.5cm eingestellt sein müssen,
* und die unterhalb von 170 mm leer ist. (Papier mit EZ-Schein wird erwartet) Zweite und
* Folgeseiten müssen gem Tarmedrechnung formatiert sein.
*
* @param rn
* die Rechnung
* @param saveFile
* Filename für eine XML-Kopie der Rechnung oder null: Keine Kopie
* @param withForms
* @param monitor
* @return
*/
public boolean doPrint(final Rechnung rn, final IRnOutputter.TYPE rnType,
final String saveFile, final boolean withESR, final boolean withForms,
final boolean doVerify, final IProgressMonitor monitor){
XMLExporter xmlex = new XMLExporter();
Document xmlRn = xmlex.doExport(rn, saveFile, rnType, doVerify);
if (rn.getStatus() == RnStatus.FEHLERHAFT) {
return false;
}
// check if we have all req. text templates
initializeRequiredTemplates();
// check if we are working with 4.0 or 4.4 tarmed xml
if (TarmedJaxbUtil.getXMLVersion(xmlRn).equals("4.0")) {
XML40Printer xmlPrinter = new XML40Printer(text);
return xmlPrinter.doPrint(rn, xmlRn, rnType, saveFile, withESR, withForms, doVerify,
monitor);
} else if (TarmedJaxbUtil.getXMLVersion(xmlRn).equals("4.4")) {
XML44Printer xmlPrinter = new XML44Printer(text);
return xmlPrinter.doPrint(rn, xmlRn, rnType, saveFile, withESR, withForms, doVerify,
monitor);
} else {
SWTHelper.showError("Fehler beim Drucken",
"Die Rechnung ist in keinem gültigen XML Format");
rn.addTrace(Rechnung.REJECTED, "XML Format");
return false;
}
}
private void initializeRequiredTemplates(){
if(!testTemplate(TarmedTemplateRequirement.TT_TARMED_S1)) {
initializeTemplate(TarmedTemplateRequirement.TT_TARMED_S1);
}
if (!testTemplate(TarmedTemplateRequirement.TT_TARMED_S2)) {
initializeTemplate(TarmedTemplateRequirement.TT_TARMED_S2);
}
if (!testTemplate(TarmedTemplateRequirement.TT_TARMED_44_S1)) {
initializeTemplate(TarmedTemplateRequirement.TT_TARMED_44_S1);
}
if (!testTemplate(TarmedTemplateRequirement.TT_TARMED_44_S2)) {
initializeTemplate(TarmedTemplateRequirement.TT_TARMED_44_S2);
}
}
private void initializeTemplate(String name){
String templateUrl = getTemplateUrl(name);
if(templateUrl != null) {
byte[] content = downloadTempalte(templateUrl);
if (content != null && content.length > 0) {
Brief template = new Brief(name, null, CoreHub.actUser, null, null, Brief.TEMPLATE);
template.save(content, text.getPlugin().getMimeType());
// all tarmed templates are sys templates
template.set(Brief.FLD_KONSULTATION_ID, Brief.SYS_TEMPLATE);
}
}
}
private byte[] downloadTempalte(String templateUrl){
BufferedInputStream in = null;
ByteArrayOutputStream bout = null;
try {
in = new BufferedInputStream(new URL(templateUrl).openStream());
bout = new ByteArrayOutputStream();
final byte data[] = new byte[1024];
int count;
while ((count = in.read(data, 0, 1024)) != -1) {
bout.write(data, 0, count);
}
} catch (IOException e) {
logger.warn("Could not dowload template from [" + templateUrl + "]", e);
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// ignore
}
try {
if(bout!=null) {
bout.close();
}
} catch (IOException e) {
// ignore
}
}
}
return bout != null ? bout.toByteArray() : null;
}
private String getTemplateUrl(String name){
if (isWord()) {
switch (name) {
case TarmedTemplateRequirement.TT_TARMED_S1:
return "https://medelexis.ch/uploads/media/Tarmedrechnung_S1_01.docx";
case TarmedTemplateRequirement.TT_TARMED_S2:
return "https://medelexis.ch/uploads/media/Tarmedrechnung_S2_01.docx";
case TarmedTemplateRequirement.TT_TARMED_44_S1:
return "https://medelexis.ch/uploads/media/TR44_S1.docx";
case TarmedTemplateRequirement.TT_TARMED_44_S2:
return "https://medelexis.ch/uploads/media/TR44_S2.docx";
default:
break;
}
} else {
switch (name) {
case TarmedTemplateRequirement.TT_TARMED_S1:
return "https://medelexis.ch/uploads/media/Tarmedrechnung_S1.odt";
case TarmedTemplateRequirement.TT_TARMED_S2:
return "https://medelexis.ch/uploads/media/Tarmedrechnung_S2.odt";
case TarmedTemplateRequirement.TT_TARMED_44_S1:
return "https://medelexis.ch/uploads/media/TR44_S1.odt";
case TarmedTemplateRequirement.TT_TARMED_44_S2:
return "https://medelexis.ch/uploads/media/TR44_S2.odt";
default:
break;
}
}
return null;
}
private boolean isWord(){
return text.getPlugin().getMimeType().equals(MimeTypeUtil.MIME_TYPE_MSWORD);
}
private boolean testTemplate(String name){
Query<Brief> qbe = new Query<Brief>(Brief.class);
qbe.add(Brief.FLD_TYPE, Query.EQUALS, Brief.TEMPLATE);
qbe.and();
qbe.add(Brief.FLD_SUBJECT, Query.EQUALS, name);
List<Brief> list = qbe.execute();
if ((list == null) || (list.size() == 0)) {
return false;
}
return true;
}
}