package ch.elexis.tarmed.printer; import static ch.elexis.tarmed.printer.TarmedTemplateRequirement.TT_TARMED_44_S1; import static ch.elexis.tarmed.printer.TarmedTemplateRequirement.TT_TARMED_44_S2; import java.text.DateFormat; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.GregorianCalendar; import java.util.HashMap; import java.util.HashSet; import java.util.List; import javax.xml.datatype.XMLGregorianCalendar; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.swt.SWT; import org.jdom.Document; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.medevit.elexis.tarmed.model.TarmedJaxbUtil; 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.data.events.ElexisEventDispatcher; import ch.elexis.core.data.interfaces.IRnOutputter.TYPE; import ch.elexis.core.data.interfaces.text.ReplaceCallback; import ch.elexis.core.data.util.SortedList; import ch.elexis.core.ui.Hub; import ch.elexis.core.ui.text.ITextPlugin; import ch.elexis.core.ui.text.TextContainer; 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.tarmed.printer.EZPrinter.EZPrinterData; import ch.elexis.tarmedprefs.TarmedRequirements; import ch.fd.invoice440.request.BalanceType; import ch.fd.invoice440.request.BodyType; import ch.fd.invoice440.request.DiagnosisType; import ch.fd.invoice440.request.GarantType; import ch.fd.invoice440.request.RecordDRGType; import ch.fd.invoice440.request.RecordDrugType; import ch.fd.invoice440.request.RecordLabType; import ch.fd.invoice440.request.RecordMigelType; import ch.fd.invoice440.request.RecordOtherType; import ch.fd.invoice440.request.RecordParamedType; import ch.fd.invoice440.request.RecordServiceType; import ch.fd.invoice440.request.RecordTarmedType; import ch.fd.invoice440.request.ReminderType; import ch.fd.invoice440.request.RequestType; import ch.fd.invoice440.request.ServicesType; import ch.fd.invoice440.request.TreatmentType; import ch.fd.invoice440.request.VatRateType; import ch.fd.invoice440.request.VatType; import ch.rgw.tools.Money; import ch.rgw.tools.StringTool; import ch.rgw.tools.TimeTool; public class XML44Printer { private static Logger logger = LoggerFactory.getLogger(XML44Printer.class); private static final String FREETEXT = "freetext"; private static final String BY_CONTRACT = "by_contract"; private static final String SPACE = " "; private static double cmPerLine = 0.67; // Höhe pro Zeile (0.65 plus Toleranz) private static double cmFirstPage = 12.0; // Platz auf der ersten Seite private static double cmMiddlePage = 21.0; // Platz auf Folgeseiten private static double cmFooter = 4; // Platz für Endabrechnung private double cmAvail = 21.4; // Verfügbare Druckhöhe in cm private TextContainer text; private Brief actBrief; private String printer; private String tarmedTray; private TimeTool tTime; private double sideTotal; private Fall fall; private Patient pat; private Mandant rnMandant; private Rechnungssteller rnSteller; private RequestType request; private static DecimalFormat df = new DecimalFormat(StringConstants.DOUBLE_ZERO); public XML44Printer(TextContainer text){ this.text = text; tTime = new TimeTool(); DecimalFormatSymbols custom = new DecimalFormatSymbols(); custom.setDecimalSeparator('.'); df.setDecimalFormatSymbols(custom); } private EZPrinter.EZPrinterData getEZPrintData(BalanceType balance, ServicesType services, BodyType body){ EZPrinter.EZPrinterData ret = new EZPrinter.EZPrinterData(); XML44Services xmlServices = new XML44Services(services); ret.amountTarmed = xmlServices.getTarmedMoney(); ret.amountDrug = xmlServices.getDrugMoney(); ret.amountLab = xmlServices.getLabMoney(); ret.amountMigel = xmlServices.getMigelMoney(); ret.amountPhysio = xmlServices.getParamedMoney(); ret.amountUnclassified = xmlServices.getOtherMoney(); ret.due = new Money(balance.getAmountDue()); ret.paid = new Money(balance.getAmountPrepaid()); GarantType eTiers = body.getTiersGarant(); if (eTiers == null) { ret.paymentMode = XMLExporter.TIERS_PAYANT; } return ret; } public boolean doPrint(Rechnung rn, Document xmlRn, TYPE rnType, String saveFile, boolean withESR, boolean withForms, boolean doVerify, IProgressMonitor monitor){ Mandant mSave = (Mandant) ElexisEventDispatcher.getSelected(Mandant.class); monitor.subTask(rn.getLabel()); if (!initBasicInvoiceValues(rn, xmlRn)) { return false; } initPrinterSettings(); BodyType body = request.getPayload().getBody(); BalanceType balance = body.getBalance(); ServicesType services = body.getServices(); EZPrinterData ezData = getEZPrintData(balance, services, body); String tcCode = null; if (TarmedRequirements.hasTCContract(rnSteller) && ezData.paymentMode.equals(XMLExporter.TIERS_GARANT)) { tcCode = TarmedRequirements.getTCCode(rnSteller); } else if (ezData.paymentMode.equals(XMLExporter.TIERS_PAYANT)) { tcCode = "01"; } XMLPrinterUtil.updateContext(rn, fall, pat, rnMandant, rnSteller, ezData.paymentMode); ESR esr = new ESR(rnSteller.getInfoString(TarmedACL.getInstance().ESRNUMBER), rnSteller.getInfoString(TarmedACL.getInstance().ESRSUB), rn.getRnId(), ESR.ESR27); if (withESR == true) { EZPrinter ezPrinter = new EZPrinter(); actBrief = ezPrinter.doPrint(rn, ezData, text, esr, monitor); } if (withForms == false) { // avoid dead letters XMLPrinterUtil.deleteBrief(actBrief); Hub.setMandant(mSave); return true; } Kontakt adressat = loadAddressee(ezData.paymentMode); XMLPrinterUtil.createBrief(TT_TARMED_44_S1, adressat, text); if (request.getPayload().isCopy()) { text.replace("\\[F5\\]", Messages.RnPrintView_yes); //$NON-NLS-1$ } else { text.replace("\\[F5\\]", Messages.RnPrintView_no); //$NON-NLS-1$ } addFallSpecificLines(); addDiagnoses(body.getTreatment()); addRemarks(body.getRemark()); // adds values to reminder fields or "" if it's no reminder addReminderFields(request.getPayload().getReminder(), rn.getNr()); List<Object> serviceRecords = services.getRecordTarmedOrRecordDrgOrRecordLab(); // lookup EAN numbers in services String[] eanArray = initEanArray(serviceRecords); HashMap<String, String> eanMap = XMLPrinterUtil.getEANHashMap(eanArray); text.replace("\\[F98\\]", XMLPrinterUtil.getEANList(eanArray)); // add the various record services SortedList<Object> serviceRecordsSorted = new SortedList<Object>(serviceRecords, new Rn44Comparator()); XMLPrinterUtil.replaceHeaderFields(text, rn, xmlRn, ezData.paymentMode); text.replace("\\[F.+\\]", ""); //$NON-NLS-1$ //$NON-NLS-2$ Object cursor = text.getPlugin().insertText("[Rechnungszeilen]", "\n", SWT.LEFT); //$NON-NLS-1$ //$NON-NLS-2$ int page = 1; sideTotal = 0.0; ITextPlugin tp = text.getPlugin(); cmAvail = cmFirstPage; monitor.worked(2); StringBuilder sb = new StringBuilder(); for (Object obj : serviceRecordsSorted) { tp.setFont("Helvetica", SWT.NORMAL, 8); //$NON-NLS-1$ sb.setLength(0); String recText = ""; String name = ""; if (obj instanceof RecordServiceType) { RecordServiceType rec = (RecordServiceType) obj; recText = getRecordServiceString(rec, sb, eanMap); name = rec.getName(); } else if (obj instanceof RecordTarmedType) { RecordTarmedType tarmed = (RecordTarmedType) obj; recText = getTarmedRecordString(tarmed, sb, eanMap); name = tarmed.getName(); } if (recText == null) { continue; } cursor = tp.insertText(cursor, recText, SWT.LEFT); tp.setFont("Helvetica", SWT.BOLD, 7); //$NON-NLS-1$ cursor = tp.insertText(cursor, "\t" + name + "\n", SWT.LEFT); //$NON-NLS-1$ //$NON-NLS-2$ cmAvail -= cmPerLine; if (cmAvail <= cmPerLine) { addSubTotalLine(cursor, tp, balance, tcCode, esr); addESRCodeLine(balance, tcCode, esr); if (needDeadLetterAvoidance(mSave)) { return false; } XMLPrinterUtil.insertPage(TT_TARMED_44_S2, ++page, adressat, rn, xmlRn, ezData.paymentMode, text); cursor = text.getPlugin().insertText("[Rechnungszeilen]", "\n", SWT.LEFT); //$NON-NLS-1$ //$NON-NLS-2$ cmAvail = cmMiddlePage; monitor.worked(2); } } addBalanceLines(cursor, tp, balance, ezData.paid); addESRCodeLine(balance, tcCode, esr); if (needDeadLetterAvoidance(mSave)) { return false; } monitor.worked(2); // avoid dead letters XMLPrinterUtil.deleteBrief(actBrief); Hub.setMandant(mSave); try { Thread.sleep(5); } catch (InterruptedException e) { // never mind } return true; } private void addReminderFields(ReminderType reminder, String nr){ String reminderDate = ""; String reminderNr = ""; if (reminder != null) { String reminderLevel = reminder.getReminderLevel(); reminderNr = nr + "_m" + reminderLevel; DateFormat df = new SimpleDateFormat("dd.MM.yyyy"); XMLGregorianCalendar date = reminder.getRequestDate(); GregorianCalendar cal = date.toGregorianCalendar(); reminderDate = df.format(cal.getTime()); } text.replace("\\[F44.MDatum\\]", reminderDate); text.replace("\\[F44.MNr\\]", reminderNr); } private void initPrinterSettings(){ printer = CoreHub.localCfg.get("Drucker/A4/Name", null); //$NON-NLS-1$ tarmedTray = CoreHub.localCfg.get("Drucker/A4/Schacht", null); //$NON-NLS-1$ if (StringTool.isNothing(tarmedTray)) { tarmedTray = null; } } private Kontakt loadAddressee(String paymentMode){ Kontakt addressee; if (paymentMode.equals(XMLExporter.TIERS_PAYANT)) { addressee = fall.getRequiredContact(TarmedRequirements.INSURANCE); } else { addressee = fall.getGarant(); } Kontakt legalGuardian = pat.getLegalGuardian(); if ((addressee == null) || (!addressee.exists()) || legalGuardian != null) { if (legalGuardian != null) { addressee = legalGuardian; } else { addressee = pat; } } addressee.getPostAnschrift(true); // damit sicher eine existiert return addressee; } private void addSubTotalLine(Object cursor, ITextPlugin tp, BalanceType balance, String tcCode, ESR esr){ StringBuilder footer = new StringBuilder(); int places = Double.toString(sideTotal).indexOf('.'); if (places > 6) { footer.append("\t\t\t\t\t\t\t\t\t\t\t\t\tZwischentotal\t").append(df.format(sideTotal)); //$NON-NLS-1$ } else if (places > 3) { footer .append("\t\t\t\t\t\t\t\t\t\t\t\t\t\tZwischentotal\t").append(df.format(sideTotal)); //$NON-NLS-1$ } else { footer .append("\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tZwischentotal\t").append(df.format(sideTotal)); //$NON-NLS-1$ } tp.setFont("Helvetica", SWT.BOLD, 7); //$NON-NLS-1$ cursor = tp.insertText(cursor, footer.toString(), SWT.LEFT); // needed to make sure ESRCodeLine gets inserted correctly cursor = text.getPlugin().insertTextAt(0, 0, 0, 0, "", SWT.LEFT); //$NON-NLS-1$ sideTotal = 0.0; } private void addFallSpecificLines(){ BodyType body = request.getPayload().getBody(); if (body != null) { String gesetzDatum = "Falldatum"; String gesetzNummer = "Fall-Nr."; String gesetzZSRNIF = "ZSR-Nr.(P)"; if (body.getUvg() != null) { gesetzDatum = "Unfalldatum"; gesetzNummer = "Unfall-Nr."; } if (body.getIvg() != null) { gesetzDatum = "Verfügungsdatum"; gesetzNummer = "Verfügungs-Nr."; gesetzZSRNIF = "NIF-Nr.(P)"; } String vekaNumber = fall.getXid("www.covercard.ch/xid"); if (vekaNumber == null || vekaNumber.isEmpty()) { Object veka = fall.getExtInfoStoredObjectByKey("VEKAnummer"); vekaNumber = veka == null ? "" : veka.toString(); } text.replace("\\[F44.Datum\\]", gesetzDatum); text.replace("\\[F44.Nummer\\]", gesetzNummer); text.replace("\\[F44.ZSRNIF\\]", gesetzZSRNIF); text.replace("\\[F44.VEKANr\\]", vekaNumber); } } private void addRemarks(final String remark){ if (remark != null && !remark.isEmpty()) { text.getPlugin().findOrReplace(Messages.RnPrintView_remark, new ReplaceCallback() { @Override public String replace(final String in){ return Messages.RnPrintView_remarksp + remark; } }); } } private void addESRCodeLine(BalanceType balance, String tcCode, ESR esr){ String offenRp = new Money(balance.getAmountDue()).getCentsAsString(); if (tcCode != null) { esr.printESRCodeLine(text.getPlugin(), offenRp, tcCode); } } private boolean needDeadLetterAvoidance(Mandant mSave){ if (text.getPlugin().print(printer, tarmedTray, false) == false) { // avoid dead letters XMLPrinterUtil.deleteBrief(actBrief); Hub.setMandant(mSave); return true; } return false; } private boolean initBasicInvoiceValues(Rechnung rn, Document xmlRn){ fall = rn.getFall(); rnMandant = rn.getMandant(); if (fall == null || rnMandant == null) { logger.error("Fall and/or Mandant of invoice is null"); return false; } pat = fall.getPatient(); Hub.setMandant(rnMandant); rnSteller = rnMandant.getRechnungssteller(); if (pat == null || rnSteller == null) { logger.error("Patient and/or Rechnungssteller is null"); return false; } request = TarmedJaxbUtil.unmarshalInvoiceRequest440(xmlRn); if (request == null) { logger.error("Could not unmarshall xml document for invoice"); return false; } return true; } private String[] initEanArray(List<Object> serviceRecords){ HashSet<String> eanUniqueSet = new HashSet<String>(); for (Object record : serviceRecords) { String responsibleEAN = null; String providerEAN = null; if (record instanceof RecordServiceType) { RecordServiceType recService = (RecordServiceType) record; responsibleEAN = recService.getResponsibleId(); providerEAN = recService.getProviderId(); } else if (record instanceof RecordTarmedType) { RecordTarmedType recTarmed = (RecordTarmedType) record; responsibleEAN = recTarmed.getResponsibleId(); providerEAN = recTarmed.getProviderId(); } if (responsibleEAN != null && !responsibleEAN.isEmpty()) { eanUniqueSet.add(responsibleEAN); } if (providerEAN != null && !providerEAN.isEmpty()) { eanUniqueSet.add(providerEAN); } } return XMLPrinterUtil.getEANArray(eanUniqueSet); } private String getRecordServiceString(RecordServiceType rec, StringBuilder sb, HashMap<String, String> eanMap){ if (rec.getDateBegin() == null) { return null; } tTime.set(rec.getDateBegin().toGregorianCalendar()); sb.append(tTime.toString(TimeTool.DATE_GER)).append("\t"); //$NON-NLS-1$ sb.append(getTarifType(rec)).append("\t");//$NON-NLS-1$ //$NON-NLS-2$ String code = rec.getCode(); sb.append(code).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ if (code.length() < 10) { String refCode = rec.getRefCode(); if (refCode == null) { refCode = SPACE; } sb.append(refCode).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ } sb.append(rec.getSession()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(" \t"); sb.append(rec.getQuantity()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ // unit, scale factor, unit factor mt & tt sb.append(SPACE).append("\t"); //$NON-NLS-1$ sb.append(SPACE).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(SPACE).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(SPACE).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(SPACE).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(SPACE).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ String providerEAN = rec.getProviderId(); String responsibleEAN = rec.getResponsibleId(); if (getTarifType(rec) != null) { if (providerEAN != null && !providerEAN.isEmpty()) { sb.append(eanMap.get(providerEAN) + "\t");//$NON-NLS-1$ } if (responsibleEAN != null && !responsibleEAN.isEmpty()) { sb.append(eanMap.get(responsibleEAN) + "\t"); //$NON-NLS-1$ } } else { sb.append("\t\t"); } if (rec.isObligation()) { sb.append("0\t"); //$NON-NLS-1$ } else { sb.append("1\t"); //$NON-NLS-1$ } double amount = rec.getAmount(); double vatRate = rec.getVatRate(); sb.append(Integer.toString(XMLPrinterUtil.guessVatCode(vatRate + ""))).append("\t"); //$NON-NLS-1$ sb.append(df.format(amount)); sideTotal += amount; sb.append("\n"); //$NON-NLS-1$ return sb.toString(); } private String getTarmedRecordString(RecordTarmedType tarmed, StringBuilder sb, HashMap<String, String> eanMap){ if (tarmed.getDateBegin() == null) { return null; } tTime.set(tarmed.getDateBegin().toGregorianCalendar()); sb.append(tTime.toString(TimeTool.DATE_GER)).append("\t"); //$NON-NLS-1$ sb.append(tarmed.getTariffType()).append("\t");//$NON-NLS-1$ //$NON-NLS-2$ sb.append(tarmed.getCode()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ String refCode = tarmed.getRefCode(); if (refCode == null) { refCode = SPACE; } sb.append(refCode).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(tarmed.getSession()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ String bodyLocation = tarmed.getBodyLocation(); if (bodyLocation.startsWith("l")) { //$NON-NLS-1$ //$NON-NLS-2$ sb.append("L\t"); } else if (bodyLocation.startsWith("r")) { //$NON-NLS-1$ //$NON-NLS-2$ sb.append("R\t"); } else { sb.append(" \t"); } sb.append(tarmed.getQuantity()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(tarmed.getUnitMt()).append("\t"); //$NON-NLS-1$ sb.append(tarmed.getScaleFactorMt()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(tarmed.getUnitFactorMt()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(tarmed.getUnitTt()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(tarmed.getScaleFactorTt()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ sb.append(tarmed.getUnitFactorTt()).append("\t"); //$NON-NLS-1$ //$NON-NLS-2$ String providerEAN = tarmed.getProviderId(); String responsibleEAN = tarmed.getResponsibleId(); if (tarmed.getTariffType() != null) { if (providerEAN != null && !providerEAN.isEmpty()) { sb.append(eanMap.get(providerEAN) + "\t");//$NON-NLS-1$ } if (responsibleEAN != null && !responsibleEAN.isEmpty()) { sb.append(eanMap.get(responsibleEAN) + "\t"); //$NON-NLS-1$ } } else { sb.append("\t\t"); } if (tarmed.isObligation()) { sb.append("0\t"); //$NON-NLS-1$ } else { sb.append("1\t"); //$NON-NLS-1$ } double amount = tarmed.getAmount(); double vatRate = tarmed.getVatRate(); sb.append(Integer.toString(XMLPrinterUtil.guessVatCode(vatRate + ""))).append("\t"); //$NON-NLS-1$ sb.append(df.format(amount)); sideTotal += amount; sb.append("\n"); //$NON-NLS-1$ return sb.toString(); } private void addBalanceLines(Object cursor, ITextPlugin tp, BalanceType balance, Money paid){ cursor = text.getPlugin().insertTextAt(0, 255, 190, 45, " ", SWT.LEFT); //$NON-NLS-1$ String balanceHeaders = "Code\tSatz\tBetrag\tMWSt\tMWSt.-Nr.:\t"; //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, true, balanceHeaders); VatType vat = balance.getVat(); String vatNumber = vat.getVatNumber(); if (vatNumber == null || vatNumber.equals(" ")) { vatNumber = "keine"; } else { vatNumber = vatNumber + " MWST"; } cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, false, vatNumber + "\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, true, "Anzahlung:\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, false, df.format(paid) + "\t\t\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.RIGHT, true, "Gesamtbetrag:\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.RIGHT, false, df.format(balance.getAmount()) + "\n"); //$NON-NLS-1$ // second line String secondLine = "0\t" + df.format(getVatRate(0, vat)) + "\t" + df.format(getVatAmount(0, vat)) + "\t" + df.format(getVatVat(0, vat)) + "\t"; cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, false, secondLine); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, true, "Währung:\t\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, false, "CHF\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, false, "\t\t\t\t\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.RIGHT, true, "davon PFL:\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.RIGHT, false, df.format(balance.getAmountObligations()) + "\n"); //$NON-NLS-1$ // third line String thirdLine = "1\t" + df.format(getVatRate(1, vat)) + "\t" + df.format(getVatAmount(1, vat)) + "\t" + df.format(getVatVat(1, vat)) //$NON-NLS-1$ + "\n"; //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, false, thirdLine); //$NON-NLS-1$ // forth line String forthLine = "2\t" + df.format(getVatRate(2, vat)) + "\t" + df.format(getVatAmount(2, vat)) + "\t" + df.format(vat.getVat()) + "\t\t\t\t\t\t\t\t\t";//$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.LEFT, false, forthLine); cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.RIGHT, true, "Fälliger Betrag:\t"); //$NON-NLS-1$ cursor = XMLPrinterUtil.print(cursor, tp, 7, SWT.RIGHT, true, df.format(balance.getAmountDue()) + "\n"); //$NON-NLS-1$ } private void addDiagnoses(TreatmentType treatment){ if (treatment == null) { logger.debug("no treatments defined"); return; } List<DiagnosisType> diagnoses = treatment.getDiagnosis(); if (diagnoses == null || diagnoses.isEmpty()) { logger.warn("No diagnoses found to print at the tarmed invoice request"); return; } List<String> occuredCodes = new ArrayList<String>(); String type = ""; String freetext = ""; StringBuilder dCodesBuilder = new StringBuilder(); for (DiagnosisType diagnose : diagnoses) { String dType = diagnose.getType(); if (dType.equals(FREETEXT)) { freetext = diagnose.getValue(); continue; } if (type.isEmpty()) { type = dType; dCodesBuilder.append(diagnose.getCode()); occuredCodes.add(diagnose.getCode()); } else if (type.equals(dType)) { // add each code only once if (!occuredCodes.contains(diagnose.getCode())) { dCodesBuilder.append("; "); //$NON-NLS-1$ dCodesBuilder.append(diagnose.getCode()); occuredCodes.add(diagnose.getCode()); } } } if (type.equals(BY_CONTRACT)) { type = "TI-Code"; //$NON-NLS-1$ } text.replace("\\[F51\\]", type); //$NON-NLS-1$ //$NON-NLS-1$ text.replace("\\[F52\\]", dCodesBuilder.toString()); //$NON-NLS-1$ //$NON-NLS-1$ text.replace("\\[F53\\]", freetext); //$NON-NLS-1$ //$NON-NLS-1$ } private String getTarifType(RecordServiceType rec){ if (rec instanceof RecordOtherType) { RecordOtherType other = (RecordOtherType) rec; return other.getTariffType(); } else if (rec instanceof RecordDrugType) { RecordDrugType drug = (RecordDrugType) rec; return drug.getTariffType(); } else if (rec instanceof RecordDRGType) { RecordDRGType drg = (RecordDRGType) rec; return drg.getTariffType(); } else if (rec instanceof RecordMigelType) { RecordMigelType migel = (RecordMigelType) rec; return migel.getTariffType(); } else if (rec instanceof RecordLabType) { RecordLabType lab = (RecordLabType) rec; return lab.getTariffType(); } else if (rec instanceof RecordParamedType) { RecordParamedType param = (RecordParamedType) rec; return param.getTariffType(); } return ""; } private double getVatAmount(int code, VatType vat){ VatRateType vatRate = getVatRateElement(code, vat); if (vatRate != null) { return vatRate.getAmount(); } return 0.0D; } private double getVatRate(int code, VatType vat){ VatRateType vatRate = getVatRateElement(code, vat); if (vatRate != null) { return vatRate.getVatRate(); } return 0.0D; } private double getVatVat(int code, VatType vat){ VatRateType vatRate = getVatRateElement(code, vat); if (vatRate != null) { return vatRate.getVat(); } return 0.0D; } private VatRateType getVatRateElement(int code, VatType vat){ List<VatRateType> vatRates = vat.getVatRate(); for (VatRateType vatRate : vatRates) { double rate = vatRate.getVatRate(); int vatCode = XMLPrinterUtil.guessVatCode(rate + ""); if (vatCode == code) { return vatRate; } } return null; } }