/*******************************************************************************
* Copyright (c) 2007-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.berchtold.emanuel.privatrechnung.rechnung;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Properties;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;
import ch.berchtold.emanuel.privatrechnung.data.PreferenceConstants;
import ch.elexis.base.ch.ebanking.esr.ESR;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.interfaces.IVerrechenbar;
import ch.elexis.core.ui.text.ITextPlugin;
import ch.elexis.core.ui.text.TextContainer;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.Brief;
import ch.elexis.data.Fall;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Mandant;
import ch.elexis.data.Rechnung;
import ch.elexis.data.Verrechnet;
import ch.rgw.tools.Money;
import ch.rgw.tools.Result;
import ch.rgw.tools.Result.SEVERITY;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
public class RnPrintView extends ViewPart {
final static String ID = "ch.berchtold.privatrechung.view";
final static double lineHeight = 0.63;
TextContainer tc;
Fall fall;
@Override
public void createPartControl(final Composite parent){
tc = new TextContainer(parent.getShell());
tc.getPlugin().createContainer(parent, new ITextPlugin.ICallback() {
public void save(){
// we don't save
}
public boolean saveAs(){
return false; // nope
}
});
}
@Override
public void setFocus(){
// TODO Auto-generated method stub
}
/**
* print a bill into a text container
*/
public Result<Rechnung> doPrint(final Rechnung rn, Properties props){
Mandant sm = ElexisEventDispatcher.getSelectedMandator();
if (sm == null || (!sm.isValid())) {
return new Result<Rechnung>(SEVERITY.ERROR, 1, "Kein Mandant eingeloggt", null, true);
}
String id = sm.getId();
Result<Rechnung> ret = new Result<Rechnung>();
fall = rn.getFall();
ElexisEventDispatcher.fireSelectionEvent(fall);
Kontakt adressat = fall.getGarant();// .getRequiredContact("Rechnungsempfänger");
if (!adressat.isValid()) {
adressat = fall.getPatient();
}
List<Konsultation> kons = rn.getKonsultationen();
Collections.sort(kons, new Comparator<Konsultation>() {
TimeTool t0 = new TimeTool();
TimeTool t1 = new TimeTool();
public int compare(final Konsultation arg0, final Konsultation arg1){
t0.set(arg0.getDatum());
t1.set(arg1.getDatum());
return t0.compareTo(t1);
}
});
// Leistungen und Artikel gruppieren
Money sum = new Money();
HashMap<String, List<Verrechnet>> groups = new HashMap<String, List<Verrechnet>>();
for (Konsultation k : kons) {
List<Verrechnet> vv = k.getLeistungen();
for (Verrechnet v : vv) {
Money netto = v.getNettoPreis();
netto.multiply(v.getZahl());
sum.addMoney(netto);
IVerrechenbar iv = v.getVerrechenbar();
String csName = iv.getCodeSystemName();
List<Verrechnet> gl = groups.get(csName);
if (gl == null) {
gl = new ArrayList<Verrechnet>();
groups.put(csName, gl);
}
gl.add(v);
}
}
if (props.get("Summary").equals(Boolean.toString(true))) {
// Seite mit ESR
tc.createFromTemplateName(null,
BerchtoldPrivatrechnungTextTemplateRequirement.getESRTemplate(), Brief.RECHNUNG,
adressat, rn.getNr());
fillFields();
ESR esr =
new ESR(CoreHub.localCfg.get(PreferenceConstants.esrIdentity + "/" + id, ""),
CoreHub.localCfg.get(PreferenceConstants.esrUser + "/" + id, ""), rn.getRnId(),
27);
Kontakt bank =
Kontakt.load(CoreHub.localCfg.get(PreferenceConstants.cfgBank + "/" + id, ""));
if (!bank.isValid()) {
SWTHelper
.showError("Keine Bank", "Bitte geben Sie eine Bank für die Zahlungen ein");
}
esr.printBESR(bank, adressat, rn.getMandant(), sum.getCentsAsString(), tc);
Object pos =
tc.getPlugin().insertText("[Leistungen]", "Leistungspositionen\n", SWT.LEFT);
for (String k : groups.keySet()) {
tc.getPlugin().setFont("Helvetiva", SWT.BOLD, 10);
pos = tc.getPlugin().insertText(pos, k + ":\t", SWT.LEFT);
tc.getPlugin().setFont("Helvetiva", SWT.NORMAL, 10);
List<Verrechnet> lv = groups.get(k);
Money zeile = new Money();
for (Verrechnet vv : lv) {
zeile.addMoney(vv.getNettoPreis().multiply(vv.getZahl()));
}
pos =
tc.getPlugin().insertText(pos, "\t\t" + zeile.getAmountAsString() + "\n",
SWT.LEFT);
}
pos =
tc.getPlugin().insertText(pos,
"_____________________________________\nSumme\t\t\t" + sum.getAmountAsString(),
SWT.LEFT);
tc.getPlugin().print(CoreHub.localCfg.get("Drucker/A4ESR/Name", null), null, false);
}
if (props.get("Detail").equals(Boolean.toString(true))) {
// Seite Detail
double cmAvail =
CoreHub.localCfg.get(PreferenceConstants.cfgTemplateBillHeight + "/" + id, 15.0);
String toPrinter = CoreHub.localCfg.get("Drucker/A4/Name", null);
tc.createFromTemplateName(null,
BerchtoldPrivatrechnungTextTemplateRequirement.getBill1Template(), Brief.RECHNUNG,
adressat, rn.getNr());
fillFields();
Object pos = tc.getPlugin().insertText("[Leistungen]", "\n", SWT.LEFT);
sum = new Money();
int page = 1;
tc.getPlugin().setFont("Helvetica", SWT.NORMAL, 8);
for (Konsultation k : kons) {
/*
* tc.getPlugin().setFont("Helvetica", SWT.BOLD, 10); pos =
* tc.getPlugin().insertText(pos, new
* TimeTool(k.getDatum()).toString(TimeTool.DATE_GER) + "\n", SWT.LEFT);
*/
String date = new TimeTool(k.getDatum()).toString(TimeTool.DATE_GER);
for (Verrechnet vv : k.getLeistungen()) {
Money preis = vv.getNettoPreis();
int zahl = vv.getZahl();
Money subtotal = new Money(preis);
subtotal.multiply(zahl);
StringBuilder sb = new StringBuilder();
sb.append(date).append("\t").append(zahl).append("\t").append(vv.getText())
.append("\t").append(preis.getAmountAsString()).append("\t")
.append(subtotal.getAmountAsString()).append("\n");
pos = tc.getPlugin().insertText(pos, sb.toString(), SWT.LEFT);
sum.addMoney(subtotal);
cmAvail -= lineHeight;
if (cmAvail <= 0.0) {
StringBuilder footer = new StringBuilder();
pos = tc.getPlugin().insertText(pos, "\n\n", SWT.LEFT); //$NON-NLS-1$
footer.append("Zwischentotal:\t\t").append(sum.getAmountAsString()); //$NON-NLS-1$
pos = tc.getPlugin().insertText(pos, footer.toString(), SWT.LEFT);
if (tc.getPlugin().print(toPrinter, null, false) == false) {
return new Result<Rechnung>(SEVERITY.ERROR, 2,
"Fehler beim Drucken der Rn. " + rn.getNr(), null, true);
}
insertPage(++page, adressat, rn);
pos = tc.getPlugin().insertText("[Leistungen]", "\n", SWT.LEFT); //$NON-NLS-1$ //$NON-NLS-2$
cmAvail =
CoreHub.localCfg.get(PreferenceConstants.cfgTemplateBill2Height + "/"
+ id, 20.0);
}
}
}
pos =
tc.getPlugin().insertText(pos,
StringTool.filler("_", 110) + "\nTotal:\t\t\t\t" + sum.getAmountAsString(),
SWT.LEFT);
tc.getPlugin().print(toPrinter, null, false);
}
return ret;
}
private void insertPage(final int page, final Kontakt adressat, final Rechnung rn){
tc.createFromTemplateName(null,
BerchtoldPrivatrechnungTextTemplateRequirement.getBill2Template(), Brief.RECHNUNG,
adressat, rn.getNr());
fillFields();
tc.replace("\\[Seite\\]", StringTool.pad(StringTool.LEFT, '0', Integer.toString(page), 2)); //$NON-NLS-1$
}
private void fillFields(){
Kontakt versicherung = Kontakt.load(fall.getInfoString("Versicherung"));
if (versicherung.isValid()) {
tc.replace("\\?\\?Versicherung\\.Name\\?\\?]", versicherung.getLabel());
tc.replace("\\?\\?Versicherung\\.Anschrift\\?\\?", versicherung.getPostAnschrift(true));
}
}
}