package ch.elexis.tarmed.printer;
import static ch.elexis.tarmed.printer.TarmedTemplateRequirement.TT_TARMED_EZ;
import static ch.elexis.tarmed.printer.TarmedTemplateRequirement.TT_TARMED_M1;
import static ch.elexis.tarmed.printer.TarmedTemplateRequirement.TT_TARMED_M2;
import static ch.elexis.tarmed.printer.TarmedTemplateRequirement.TT_TARMED_M3;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.swt.SWT;
import ch.elexis.TarmedRechnung.TarmedACL;
import ch.elexis.TarmedRechnung.XMLExporter;
import ch.elexis.arzttarife_schweiz.Messages;
import ch.elexis.base.ch.ebanking.esr.ESR;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.activator.CoreHub;
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.Kontakt;
import ch.elexis.data.Mandant;
import ch.elexis.data.Patient;
import ch.elexis.data.Rechnung;
import ch.elexis.data.Rechnungssteller;
import ch.elexis.data.RnStatus;
import ch.elexis.data.Zahlung;
import ch.elexis.tarmedprefs.TarmedRequirements;
import ch.rgw.tools.Money;
import ch.rgw.tools.StringTool;
public class EZPrinter {
public static class EZPrinterData {
Money amountTarmed;
Money amountDrug;
Money amountLab;
Money amountMigel;
Money amountPhysio;
Money amountUnclassified;
Money due;
Money paid;
String paymentMode;
public EZPrinterData(){
amountTarmed = new Money();
amountDrug = new Money();
amountLab = new Money();
amountMigel = new Money();
amountPhysio = new Money();
amountUnclassified = new Money();
due = new Money();
paid = new Money();
paymentMode = XMLExporter.TIERS_GARANT;
}
}
private Kontakt getAddressee(String paymentMode, Fall fall, Patient patient){
Kontakt addressee;
if (paymentMode.equals(XMLExporter.TIERS_PAYANT)) {
addressee = fall.getRequiredContact(TarmedRequirements.INSURANCE);
} else {
addressee = fall.getGarant();
}
Kontakt legalGuardian = patient.getLegalGuardian();
if ((addressee == null) || (!addressee.exists()) || legalGuardian != null) {
if (legalGuardian != null) {
addressee = legalGuardian;
} else {
addressee = patient;
}
}
addressee.getPostAnschrift(true);
return addressee;
}
private String printer;
public Brief doPrint(Rechnung rn, EZPrinterData ezData, TextContainer text, ESR esr,
IProgressMonitor monitor){
Money mEZDue = new Money(ezData.due); // XMLTool.xmlDoubleToMoney(balance.getAttributeValue("amount_obligations"));
mEZDue.addMoney(ezData.paid);
Brief actBrief;
Fall fall = rn.getFall();
Patient pat = fall.getPatient();
Mandant mnd = rn.getMandant();
Rechnungssteller rs = mnd.getRechnungssteller();
Kontakt adressat;
if (ezData.paymentMode.equals(XMLExporter.TIERS_PAYANT)) {
adressat = fall.getRequiredContact(TarmedRequirements.INSURANCE);
} else {
adressat = fall.getGarant();
}
if ((adressat == null) || (!adressat.exists())) {
adressat = pat;
}
String tmpl = TT_TARMED_EZ; //$NON-NLS-1$
if ((rn.getStatus() == RnStatus.MAHNUNG_1)
|| (rn.getStatus() == RnStatus.MAHNUNG_1_GEDRUCKT)) {
tmpl = TT_TARMED_M1;
} else if ((rn.getStatus() == RnStatus.MAHNUNG_2)
|| (rn.getStatus() == RnStatus.MAHNUNG_2_GEDRUCKT)) {
tmpl = TT_TARMED_M2;
} else if ((rn.getStatus() == RnStatus.MAHNUNG_3)
|| (rn.getStatus() == RnStatus.MAHNUNG_3_GEDRUCKT)) {
tmpl = TT_TARMED_M3;
}
actBrief =
XMLPrinterUtil.createBrief(tmpl, getAddressee(ezData.paymentMode, fall, pat), text);
List<Zahlung> extra = rn.getZahlungen();
Kontakt bank = Kontakt.load(rs.getInfoString(TarmedACL.getInstance().RNBANK));
final StringBuilder sb = new StringBuilder();
sb.append(Messages.RnPrintView_tarmedPoints)
.append(ezData.amountTarmed.getAmountAsString()).append(StringConstants.LF);
sb.append(Messages.RnPrintView_medicaments).append(ezData.amountDrug.getAmountAsString())
.append(StringConstants.LF);
sb.append(Messages.RnPrintView_labpoints).append(ezData.amountLab.getAmountAsString())
.append(StringConstants.LF);
sb.append(Messages.RnPrintView_migelpoints).append(ezData.amountMigel.getAmountAsString())
.append(StringConstants.LF);
sb.append(Messages.RnPrintView_physiopoints)
.append(ezData.amountPhysio.getAmountAsString()).append(StringConstants.LF);
sb.append(Messages.RnPrintView_otherpoints)
.append(ezData.amountUnclassified.getAmountAsString()).append(StringConstants.LF);
for (Zahlung z : extra) {
Money betrag = new Money(z.getBetrag()).multiply(-1.0);
if (!betrag.isNegative()) {
sb.append(z.getBemerkung())
.append(":\t").append(betrag.getAmountAsString()).append(StringConstants.LF); //$NON-NLS-1$
mEZDue.addMoney(betrag);
}
}
sb.append("--------------------------------------").append(StringConstants.LF); //$NON-NLS-1$
sb.append(Messages.RnPrintView_sum).append(mEZDue);
if (!ezData.paid.isZero()) {
sb.append(Messages.RnPrintView_prepaid).append(ezData.paid.getAmountAsString())
.append(StringConstants.LF);
// sb.append("Noch zu zahlen:\t").append(xmlex.mDue.getAmountAsString()).append("\n");
sb.append(Messages.RnPrintView_topay)
.append(mEZDue.subtractMoney(ezData.paid).roundTo5().getAmountAsString())
.append(StringConstants.LF);
}
text.getPlugin().setFont("Serif", SWT.NORMAL, 9); //$NON-NLS-1$
text.replace("\\[Leistungen\\]", sb.toString());
if (esr.printBESR(bank, adressat, rs, mEZDue.roundTo5().getCentsAsString(), text) == false) {
return actBrief;
}
printer = CoreHub.localCfg.get("Drucker/A4ESR/Name", null); //$NON-NLS-1$
String esrTray = CoreHub.localCfg.get("Drucker/A4ESR/Schacht", null); //$NON-NLS-1$
if (StringTool.isNothing(esrTray)) {
esrTray = null;
}
// Das mit der Tray- Einstellung funktioniert sowieso nicht richtig.
// OOo nimmt den Tray aus der Druckformatvorlage. Besser wir setzen
// ihn hier auf
// null vorläufig.
// Alternative: Wir verwenden ihn, falls er eingestellt ist, sonst
// nicht.
// Dies scheint je nach Druckertreiber unterschiedlich zu
// funktionieren.
if (text.getPlugin().print(printer, esrTray, false) == false) {
SWTHelper.showError("Fehler beim Drucken", "Konnte den Drucker nicht starten");
rn.addTrace(Rechnung.REJECTED, "Druckerfehler");
return actBrief;
}
monitor.worked(2);
return actBrief;
}
}