/*******************************************************************************
* Copyright (c) 2006-2015, 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
* MEDEVIT <office@medevit.at> - #4078 remove dependency to c.e.base.ch.artikel
*******************************************************************************/
package ch.elexis.TarmedRechnung;
import java.text.ParseException;
import java.util.Hashtable;
import java.util.List;
import org.jdom.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ch.elexis.TarmedRechnung.XMLExporter.VatRateSum;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.interfaces.IVerrechenbar;
import ch.elexis.data.Artikel;
import ch.elexis.data.Konsultation;
import ch.elexis.data.LaborLeistung;
import ch.elexis.data.PhysioLeistung;
import ch.elexis.data.RFE;
import ch.elexis.data.Rechnung;
import ch.elexis.data.TarmedLeistung;
import ch.elexis.data.Verrechnet;
import ch.elexis.labortarif2009.data.Labor2009Tarif;
import ch.elexis.tarmedprefs.TarmedRequirements;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.Money;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
import ch.rgw.tools.XMLTool;
public class XMLExporterServices {
private static Logger logger = LoggerFactory.getLogger(XMLExporterServices.class);
public static final String ELEMENT_SERVICES = "services"; //$NON-NLS-1$
public static final String ELEMENT_DETAIL = "detail"; //$NON-NLS-1$
private static final String ATTR_RECORD_ID = "record_id"; //$NON-NLS-1$
private static final String ELEMENT_RECORD_OTHER = "record_other"; //$NON-NLS-1$
private static final String ELEMENT_RECORD_PARAMED = "record_paramed"; //$NON-NLS-1$
private static final String ELEMENT_RECORD_MIGEL = "record_migel"; //$NON-NLS-1$
private static final String ELEMENT_RECORD_DRUG = "record_drug"; //$NON-NLS-1$
private static final String ATTR_UNIT_FACTOR = "unit_factor"; //$NON-NLS-1$
private static final String ATTR_UNIT = "unit"; //$NON-NLS-1$
private static final String ELEMENT_RECORD_LAB = "record_lab"; //$NON-NLS-1$
private static final String ATTR_OBLIGATION = "obligation"; //$NON-NLS-1$
private static final String ATTR_VALIDATE = "validate"; //$NON-NLS-1$
private static final String ATTR_EXTERNAL_FACTOR_TT = "external_factor_tt"; //$NON-NLS-1$
private static final String ATTR_SCALE_FACTOR_TT = "scale_factor_tt"; //$NON-NLS-1$
private static final String ATTR_UNIT_FACTOR_TT = "unit_factor_tt"; //$NON-NLS-1$
private static final String ATTR_UNIT_TT = "unit_tt"; //$NON-NLS-1$
private static final String ATTR_EXTERNAL_FACTOR_MT = "external_factor_mt"; //$NON-NLS-1$
private static final String ATTR_SCALE_FACTOR_MT = "scale_factor_mt"; //$NON-NLS-1$
private static final String ATTR_UNIT_FACTOR_MT = "unit_factor_mt"; //$NON-NLS-1$
private static final String ATTR_UNIT_MT = "unit_mt"; //$NON-NLS-1$
private static final String ATTR_BODY_LOCATION = "body_location"; //$NON-NLS-1$
private static final String ATTR_MEDICAL_ROLE = "medical_role"; //$NON-NLS-1$
private static final String ATTR_BILLING_ROLE = "billing_role"; //$NON-NLS-1$
private static final String ATTR_EAN_RESPONSIBLE = "responsible_id"; //$NON-NLS-1$
private static final String ATTR_EAN_PROVIDER = "provider_id"; //$NON-NLS-1$
private static final String ATTR_TREATMENT = "treatment"; //$NON-NLS-1$
private static final String ATTR_DATE_BEGIN = "date_begin"; //$NON-NLS-1$
private static final String ATTR_SESSION = "session"; //$NON-NLS-1$
private static final String ELEMENT_RECORD_TARMED = "record_tarmed"; //$NON-NLS-1$
private static final String TL = "TL"; //$NON-NLS-1$
private static final String AL = "AL"; //$NON-NLS-1$
private static final String TARMED_FALSE = "false"; //$NON-NLS-1$
private static final String TARMED_TRUE = "true"; //$NON-NLS-1$
private Element servicesElement;
private double sumTarmedAL = 0.0;
private double sumTarmedTL = 0.0;
private double tpTarmedTL = 0;
private double tpTarmedAL = 0;
private Money mTarmed;
private Money mKant;
private Money mUebrige;
private Money mAnalysen;
private Money mMigel;
private Money mPhysio;
private Money mMedikament;
boolean initialized = false;
public XMLExporterServices(Element services){
this.servicesElement = services;
mTarmed = new Money();
mKant = new Money();
mUebrige = new Money();
mAnalysen = new Money();
mMigel = new Money();
mPhysio = new Money();
mMedikament = new Money();
}
public Element getElement(){
return servicesElement;
}
public double getSumTarmedAL(){
if (!initialized) {
initFromElement();
}
return sumTarmedAL;
}
public double getSumTarmedTL(){
if (!initialized) {
initFromElement();
}
return sumTarmedTL;
}
public double getTpTarmedAL(){
if (!initialized) {
initFromElement();
}
return tpTarmedAL;
}
public double getTpTarmedTL(){
if (!initialized) {
initFromElement();
}
return tpTarmedTL;
}
public Money getTarmedMoney(){
if (!initialized) {
initFromElement();
}
return mTarmed;
}
public Money getKantMoney(){
if (!initialized) {
initFromElement();
}
return mKant;
}
public Money getUebrigeMoney(){
if (!initialized) {
initFromElement();
}
return mUebrige;
}
public Money getAnalysenMoney(){
if (!initialized) {
initFromElement();
}
return mAnalysen;
}
public Money getMigelMoney(){
if (!initialized) {
initFromElement();
}
return mMigel;
}
/**
* paramed and physio can be seen identical as in XML4.4 physio got replaced with paramed
*
* @return
*/
public Money getPhysioMoney(){
if (!initialized) {
initFromElement();
}
return mPhysio;
}
public Money getMedikamentMoney(){
if (!initialized) {
initFromElement();
}
return mMedikament;
}
public void negateAll(){
@SuppressWarnings("unchecked")
List<Element> sr = servicesElement.getChildren();
for (Element el : sr) {
try {
XMLExporterUtil.negate(el, XMLExporter.ATTR_QUANTITY);//$NON-NLS-1$
XMLExporterUtil.negate(el, XMLExporter.ATTR_AMOUNT_MT);//$NON-NLS-1$
XMLExporterUtil.negate(el, XMLExporter.ATTR_AMOUNT_TT);//$NON-NLS-1$
XMLExporterUtil.negate(el, XMLExporter.ATTR_AMOUNT);//$NON-NLS-1$
} catch (Exception ex) {
ExHandler.handle(ex);
}
}
}
private void initFromElement(){
// calculate sum per type
List<?> records = servicesElement.getChildren();
for (Object object : records) {
if (object instanceof Element) {
Element element = (Element) object;
try {
if (element.getName().equals(ELEMENT_RECORD_TARMED)) {
mTarmed.addAmount(element.getAttributeValue(XMLExporter.ATTR_AMOUNT));
} else if (element.getName().equals(ELEMENT_RECORD_LAB)) {
mAnalysen.addAmount(element.getAttributeValue(XMLExporter.ATTR_AMOUNT));
} else if (element.getName().equals(ELEMENT_RECORD_DRUG)) {
mMedikament.addAmount(element.getAttributeValue(XMLExporter.ATTR_AMOUNT));
} else if (element.getName().equals(ELEMENT_RECORD_MIGEL)) {
mMigel.addAmount(element.getAttributeValue(XMLExporter.ATTR_AMOUNT));
} else if (element.getName().equals(ELEMENT_RECORD_PARAMED)) {
mPhysio.addAmount(element.getAttributeValue(XMLExporter.ATTR_AMOUNT));
} else if (element.getName().equals(ELEMENT_RECORD_OTHER)) {
mUebrige.addAmount(element.getAttributeValue(XMLExporter.ATTR_AMOUNT));
}
} catch (ParseException e) {
logger.error("Error parsing services " + e);
}
}
}
initialized = true;
}
public static XMLExporterServices buildServices(Rechnung rechnung, VatRateSum vatSummer){
XMLExporterServices ret =
new XMLExporterServices(new Element(ELEMENT_SERVICES, XMLExporter.nsinvoice));
List<Konsultation> konsultationen = rechnung.getKonsultationen();
// To make the validator happy, the attribute date_begin must duplicate
// exactly
// the date of the first billing position end date_end must duplicate
// exactly
// the date of the last billed consultation. If we have non-billed
// entries in
// the patient's record we must forget these for the sake of
// xml-confirmity
// so we use ttFirst and ttLast to check he the dates (instead of the
// begin end end
// dates that are stored in the bill
int recordNumber = 1;
String lastKonsDatum = null;
int session = 1;
for (Konsultation konsultation : konsultationen) {
List<Verrechnet> leistungen = konsultation.getLeistungen();
// konsultationen list is ordered by date, so we can just compare with previous
String konsDatum = konsultation.getDatum();
if (konsDatum.equals(lastKonsDatum)) {
session++;
} else {
lastKonsDatum = konsDatum;
session = 1;
}
TimeTool tt = new TimeTool(konsDatum);
String dateForTarmed = XMLExporterUtil.makeTarmedDatum(konsultation.getDatum());
boolean bRFE = false; // RFE already encoded
for (Verrechnet verrechnet : leistungen) {
Element el;
double zahl = verrechnet.getZahl();
IVerrechenbar v = verrechnet.getVerrechenbar();
if (v == null) {
logger.error(Messages.XMLExporter_ErroneusBill + rechnung.getNr()
+ " Null-Verrechenbar bei Kons " //$NON-NLS-1$
+ konsultation.getLabel());
continue;
}
if (v instanceof TarmedLeistung) {
TarmedLeistung tl = (TarmedLeistung) v;
String arzl = verrechnet.getDetail(AL);
String tecl = verrechnet.getDetail(TL);
double primaryScale = verrechnet.getPrimaryScaleFactor();
double secondaryScale = verrechnet.getSecondaryScaleFactor();
double tlTl, tlAL, mult;
mult = tl.getVKMultiplikator(tt, rechnung.getFall());
if ((arzl != null && !arzl.isEmpty()) && (tecl != null && !tecl.isEmpty())) {
tlTl = Double.parseDouble(tecl);
tlAL = Double.parseDouble(arzl);
} else {
tlTl = tl.getTL();
tlAL = tl.getAL();
}
// build monetary values of this TarmedLeistung
Money mAL = new Money(
(int) Math.round(tlAL * mult * zahl * primaryScale * secondaryScale));
Money mTL = new Money(
(int) Math.round(tlTl * mult * zahl * primaryScale * secondaryScale));
Money mAmountLocal = new Money((int) Math
.round((tlAL + tlTl) * mult * zahl * primaryScale * secondaryScale));
// sum tax points and monetary value
ret.tpTarmedTL += tlTl * zahl;
ret.tpTarmedAL += tlAL * zahl;
ret.sumTarmedAL += tlAL * mult * zahl * primaryScale * secondaryScale;
ret.sumTarmedTL += tlTl * mult * zahl * primaryScale * secondaryScale;
ret.mTarmed.addCent(mAmountLocal.getCents());
el = new Element(ELEMENT_RECORD_TARMED, XMLExporter.nsinvoice); // 22000
el.setAttribute(ATTR_TREATMENT, "ambulatory"); // 22050 //$NON-NLS-1$
el.setAttribute(XMLExporter.ATTR_TARIFF_TYPE, "001"); // 22060 //$NON-NLS-1$
Hashtable<String, String> ext = tl.loadExtension();
String bezug = ext.get("Bezug"); // 22360 //$NON-NLS-1$
if (StringTool.isNothing(bezug)) {
bezug = verrechnet.getDetail("Bezug");
}
if (!StringTool.isNothing(bezug)) {
el.setAttribute("ref_code", bezug); //$NON-NLS-1$
}
el.setAttribute(ATTR_EAN_PROVIDER,
TarmedRequirements.getEAN(konsultation.getMandant()));
el.setAttribute(ATTR_EAN_RESPONSIBLE,
XMLExporterUtil.getResponsibleEAN(konsultation));
el.setAttribute(ATTR_BILLING_ROLE, "both"); // 22410 //$NON-NLS-1$
el.setAttribute(ATTR_MEDICAL_ROLE, "self_employed"); // 22430 //$NON-NLS-1$
el.setAttribute(ATTR_BODY_LOCATION, TarmedLeistung.getSide(verrechnet)); // 22450
el.setAttribute(ATTR_UNIT_MT, XMLTool.doubleToXmlDouble(tlAL / 100.0, 2)); // 22470
el.setAttribute(ATTR_UNIT_FACTOR_MT, XMLTool.doubleToXmlDouble(mult, 2)); // 22480
// (strebt
// gegen
// 0)
el.setAttribute(ATTR_SCALE_FACTOR_MT,
XMLTool.doubleToXmlDouble(primaryScale, 1)); // 22490
el.setAttribute(ATTR_EXTERNAL_FACTOR_MT,
XMLTool.doubleToXmlDouble(secondaryScale, 1)); // 22500
el.setAttribute(XMLExporter.ATTR_AMOUNT_MT, XMLTool.moneyToXmlDouble(mAL)); // 22510
el.setAttribute(ATTR_UNIT_TT, XMLTool.doubleToXmlDouble(tlTl / 100.0, 2)); // 22520
el.setAttribute(ATTR_UNIT_FACTOR_TT, XMLTool.doubleToXmlDouble(mult, 2)); // 22530
el.setAttribute(ATTR_SCALE_FACTOR_TT,
XMLTool.doubleToXmlDouble(primaryScale, 1)); // 22540
el.setAttribute(ATTR_EXTERNAL_FACTOR_TT,
XMLTool.doubleToXmlDouble(secondaryScale, 1)); // 22550
el.setAttribute(XMLExporter.ATTR_AMOUNT_TT, XMLTool.moneyToXmlDouble(mTL)); // 22560
el.setAttribute(XMLExporter.ATTR_AMOUNT,
XMLTool.moneyToXmlDouble(mAmountLocal)); // 22570
XMLExporterUtil.setVatAttribute(verrechnet, mAmountLocal, el, vatSummer); // 22590 //$NON-NLS-1$
el.setAttribute(ATTR_VALIDATE, TARMED_TRUE); // 22620
el.setAttribute(ATTR_OBLIGATION,
Boolean.toString(TarmedLeistung.isObligation(verrechnet)));
if (!bRFE) {
List<RFE> rfes = RFE.getRfeForKons(konsultation.getId());
if (rfes.size() > 0) {
StringBuilder sb = new StringBuilder();
for (RFE rfe : rfes) {
sb.append("551_").append(rfe.getCode()).append(" "); //$NON-NLS-1$ //$NON-NLS-2$
}
el.setAttribute(XMLExporter.ATTR_REMARK, sb.toString());
}
bRFE = true;
}
} else if (v instanceof Labor2009Tarif) {
el = new Element(ELEMENT_RECORD_LAB, XMLExporter.nsinvoice); // 28000
el.setAttribute(XMLExporter.ATTR_TARIFF_TYPE, v.getCodeSystemCode());
el.setAttribute(ATTR_EAN_PROVIDER,
TarmedRequirements.getEAN(konsultation.getMandant()));
el.setAttribute(ATTR_EAN_RESPONSIBLE,
XMLExporterUtil.getResponsibleEAN(konsultation));
Labor2009Tarif ll = (Labor2009Tarif) v;
double mult = ll.getFactor(tt, rechnung.getFall());
Money preis = verrechnet.getNettoPreis();
double korr = preis.getCents() / mult;
el.setAttribute(ATTR_UNIT, XMLTool.doubleToXmlDouble(korr / 100.0, 2)); // 28470
el.setAttribute(ATTR_UNIT_FACTOR, XMLTool.doubleToXmlDouble(mult, 2)); // 28480
Money mAmountLocal = new Money(preis);
mAmountLocal.multiply(zahl);
el.setAttribute(XMLExporter.ATTR_AMOUNT,
XMLTool.moneyToXmlDouble(mAmountLocal)); // 28570
XMLExporterUtil.setVatAttribute(verrechnet, mAmountLocal, el, vatSummer); // 28590
el.setAttribute(ATTR_OBLIGATION, TARMED_TRUE); // 28630
el.setAttribute(ATTR_VALIDATE, TARMED_TRUE); // 28620
ret.mAnalysen.addMoney(mAmountLocal);
} else if (v instanceof LaborLeistung) {
el = new Element(ELEMENT_RECORD_LAB, XMLExporter.nsinvoice); // 28000
el.setAttribute(XMLExporter.ATTR_TARIFF_TYPE, "316"); // 28060 //$NON-NLS-1$
LaborLeistung ll = (LaborLeistung) v;
double mult = ll.getFactor(tt, rechnung.getFall());
// Money preis = vv.getEffPreis(); // b.getEffPreis(v);
Money preis = verrechnet.getNettoPreis();
double korr = preis.getCents() / mult;
el.setAttribute(ATTR_UNIT, XMLTool.doubleToXmlDouble(korr / 100.0, 2)); // 28470
el.setAttribute(ATTR_UNIT_FACTOR, XMLTool.doubleToXmlDouble(mult, 2)); // 28480
Money mAmountLocal = new Money(preis);
mAmountLocal.multiply(zahl);
el.setAttribute(XMLExporter.ATTR_AMOUNT,
XMLTool.moneyToXmlDouble(mAmountLocal)); // 28570
XMLExporterUtil.setVatAttribute(verrechnet, mAmountLocal, el, vatSummer); // 28590 //$NON-NLS-1$
el.setAttribute(ATTR_OBLIGATION, TARMED_TRUE); // 28630
el.setAttribute(ATTR_VALIDATE, TARMED_TRUE); // 28620
ret.mAnalysen.addMoney(mAmountLocal);
} else if ("Medikamente".equals(v.getCodeSystemName()) //$NON-NLS-1$
|| "Medicals".equals(v.getCodeSystemName()) //$NON-NLS-1$
|| "400".equals(v.getCodeSystemCode()) //$NON-NLS-1$
|| "402".equals(v.getCodeSystemCode())) {
el = new Element(ELEMENT_RECORD_DRUG, XMLExporter.nsinvoice);
Artikel art = (Artikel) v;
double mult = art.getFactor(tt, rechnung.getFall());
Money preis = verrechnet.getNettoPreis();
Money mAmountLocal = new Money(preis);
// new as of 3/2011: Correct handling of package fractions
Money einzelpreis = verrechnet.getBruttoPreis();
einzelpreis.multiply(verrechnet.getPrimaryScaleFactor());
double cnt = verrechnet.getSecondaryScaleFactor();
if (cnt != 1.0) {
zahl *= cnt;
} else {
mAmountLocal.multiply(zahl);
}
// end corrections
el.setAttribute(ATTR_UNIT, XMLTool.moneyToXmlDouble(einzelpreis));
el.setAttribute(ATTR_UNIT_FACTOR, XMLTool.doubleToXmlDouble(mult, 2));
el.setAttribute(XMLExporter.ATTR_TARIFF_TYPE, v.getCodeSystemCode());
if ("402".equals(v.getCodeSystemCode())) { // GTIN-basiert //$NON-NLS-1$
String gtin = ((Artikel) v).getEAN();
el.setAttribute(XMLExporter.ATTR_CODE, gtin);
} else if ("400".equals(v.getCodeSystemCode())) { // Pharmacode-basiert //$NON-NLS-1$
String pk = ((Artikel) v).getPharmaCode();
el.setAttribute(XMLExporter.ATTR_CODE,
StringTool.pad(StringTool.LEFT, '0', pk, 7));
} else {
logger.warn("Unknown medical code " + v.getCodeSystemCode()
+ " encountered for " + v.getCodeSystemName() + "@" + v);
}
el.setAttribute(XMLExporter.ATTR_AMOUNT,
XMLTool.moneyToXmlDouble(mAmountLocal));
XMLExporterUtil.setVatAttribute(verrechnet, mAmountLocal, el, vatSummer);
String ckzl = art.getExt("Kassentyp"); // cf. MedikamentImporter#KASSENTYP
if (ckzl.equals("1")) {
el.setAttribute(ATTR_OBLIGATION, TARMED_TRUE);
} else {
el.setAttribute(ATTR_OBLIGATION, TARMED_FALSE);
}
el.setAttribute(ATTR_VALIDATE, TARMED_TRUE);
el.setAttribute(ATTR_EAN_PROVIDER,
TarmedRequirements.getEAN(konsultation.getMandant()));
el.setAttribute(ATTR_EAN_RESPONSIBLE,
XMLExporterUtil.getResponsibleEAN(konsultation));
ret.mMedikament.addMoney(mAmountLocal);
} else if ("MiGeL".equals(v.getCodeSystemName())) {
el = new Element(ELEMENT_RECORD_MIGEL, XMLExporter.nsinvoice);
// Money preis = vv.getEffPreis(); // b.getEffPreis(v);
Money preis = verrechnet.getNettoPreis();
el.setAttribute(ATTR_UNIT, XMLTool.moneyToXmlDouble(preis));
el.setAttribute(ATTR_UNIT_FACTOR, "1.0"); //$NON-NLS-1$
el.setAttribute(XMLExporter.ATTR_TARIFF_TYPE, "452"); // MiGeL ab 2001-basiert //$NON-NLS-1$
el.setAttribute(XMLExporter.ATTR_CODE, v.getCode());
el.setAttribute(ATTR_EAN_PROVIDER,
TarmedRequirements.getEAN(konsultation.getMandant()));
el.setAttribute(ATTR_EAN_RESPONSIBLE,
XMLExporterUtil.getResponsibleEAN(konsultation));
Money mAmountLocal = new Money(preis);
mAmountLocal.multiply(zahl);
el.setAttribute(XMLExporter.ATTR_AMOUNT,
XMLTool.moneyToXmlDouble(mAmountLocal));
XMLExporterUtil.setVatAttribute(verrechnet, mAmountLocal, el, vatSummer);
el.setAttribute(ATTR_OBLIGATION, TARMED_TRUE);
el.setAttribute(ATTR_VALIDATE, TARMED_TRUE);
ret.mMigel.addMoney(mAmountLocal);
} else if (v instanceof PhysioLeistung) {
el = new Element(ELEMENT_RECORD_PARAMED, XMLExporter.nsinvoice);
el.setAttribute(XMLExporter.ATTR_TARIFF_TYPE, v.getCodeSystemCode()); // 28060
PhysioLeistung pl = (PhysioLeistung) v;
double mult = pl.getFactor(tt, rechnung.getFall());
Money preis = verrechnet.getNettoPreis();
double korr = preis.getCents() / mult;
el.setAttribute(ATTR_UNIT, XMLTool.doubleToXmlDouble(korr / 100.0, 2)); // 28470
el.setAttribute(ATTR_UNIT_FACTOR, XMLTool.doubleToXmlDouble(mult, 2)); // 28480
Money mAmountLocal = new Money(preis);
mAmountLocal.multiply(zahl);
el.setAttribute(XMLExporter.ATTR_AMOUNT,
XMLTool.moneyToXmlDouble(mAmountLocal)); // 28570
XMLExporterUtil.setVatAttribute(verrechnet, mAmountLocal, el, vatSummer); // 28590
el.setAttribute(ATTR_OBLIGATION, TARMED_TRUE); // 28630
el.setAttribute(ATTR_VALIDATE, TARMED_TRUE); // 28620
// get EAN provider
String ean = TarmedRequirements.getEAN(konsultation.getMandant());
if (ean.equals(TarmedRequirements.EAN_PSEUDO))
ean = "unknown";
el.setAttribute(ATTR_EAN_PROVIDER, ean);
// get EAN resposible
ean = XMLExporterUtil.getResponsibleEAN(konsultation);
if (ean.equals(TarmedRequirements.EAN_PSEUDO))
ean = "unknown";
el.setAttribute(ATTR_EAN_RESPONSIBLE, ean);
ret.mPhysio.addMoney(mAmountLocal);
} else {
Money preis = verrechnet.getNettoPreis();
el = new Element(ELEMENT_RECORD_OTHER, XMLExporter.nsinvoice);
String codeSystemCode = v.getCodeSystemCode();
el.setAttribute(XMLExporter.ATTR_TARIFF_TYPE, codeSystemCode);
// all 406 will have code 2000
if ("406".equals(codeSystemCode)) {
el.setAttribute(XMLExporter.ATTR_CODE, "2000");
el.setAttribute("name",
verrechnet.getText() + " [" + verrechnet.getCode() + "]"); // 22340
}
el.setAttribute(ATTR_UNIT, XMLTool.moneyToXmlDouble(preis));
el.setAttribute(ATTR_UNIT_FACTOR, "1.0"); //$NON-NLS-1$
Money mAmountLocal = new Money(preis);
mAmountLocal.multiply(zahl);
el.setAttribute(XMLExporter.ATTR_AMOUNT,
XMLTool.moneyToXmlDouble(mAmountLocal));
XMLExporterUtil.setVatAttribute(verrechnet, mAmountLocal, el, vatSummer);
el.setAttribute(ATTR_VALIDATE, TARMED_TRUE);
el.setAttribute(ATTR_OBLIGATION, "false"); //$NON-NLS-1$
el.setAttribute("external_factor", "1.0"); //$NON-NLS-1$ //$NON-NLS-2$
el.setAttribute(ATTR_EAN_PROVIDER,
TarmedRequirements.getEAN(konsultation.getMandant()));
el.setAttribute(ATTR_EAN_RESPONSIBLE,
XMLExporterUtil.getResponsibleEAN(konsultation));
ret.mUebrige.addMoney(mAmountLocal);
}
el.setAttribute(ATTR_SESSION, Integer.toString(session));
el.setAttribute(ATTR_RECORD_ID, Integer.toString(recordNumber++)); // 22010
el.setAttribute(XMLExporter.ATTR_QUANTITY, Double.toString(zahl)); // 22350
el.setAttribute(ATTR_DATE_BEGIN, dateForTarmed); // 22370
if (el.getAttribute("name") == null) {
el.setAttribute("name", verrechnet.getText()); // 22340
}
// 22330 set code if still empty
if (el.getAttribute(XMLExporter.ATTR_CODE) == null) {
XMLExporterUtil.setAttributeWithDefault(el, XMLExporter.ATTR_CODE, v.getCode(),
StringConstants.ZERO); // 22330
}
ret.servicesElement.addContent(el);
}
}
ret.initialized = true;
return ret;
}
}