package ch.elexis.TarmedRechnung;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.List;
import org.eclipse.swt.widgets.Display;
import org.eclipse.ui.PlatformUI;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.Namespace;
import org.jdom.filter.ElementFilter;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;
import org.junit.After;
import org.junit.Test;
import ch.elexis.base.ch.arzttarife.test.TestData;
import ch.elexis.base.ch.arzttarife.test.TestData.TestSzenario;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.interfaces.IRnOutputter;
import ch.elexis.data.Rechnung;
import ch.elexis.data.RnStatus;
import ch.rgw.tools.Money;
import ch.rgw.tools.TimeTool;
public class XMLExporterTest {
@After
public void teardown() throws Exception{
Display.getDefault().syncExec(new Runnable() {
@Override
public void run(){
PlatformUI.getWorkbench().saveAllEditors(false); // do not confirm saving
PlatformUI.getWorkbench().saveAll(
PlatformUI.getWorkbench().getActiveWorkbenchWindow(),
PlatformUI.getWorkbench().getActiveWorkbenchWindow(), null, false);
if (PlatformUI.getWorkbench() != null) // null if run from Eclipse-IDE
{
// needed if run as surefire test from using mvn install
try {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.closeAllPerspectives(false, true);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
});
}
@Test
public void doExportTest() throws IOException{
TestSzenario szenario = TestData.getTestSzenarioInstance();
assertNotNull(szenario.getRechnungen());
assertFalse(szenario.getRechnungen().isEmpty());
XMLExporter exporter = new XMLExporter();
List<Rechnung> rechnungen = szenario.getRechnungen();
for (Rechnung rechnung : rechnungen) {
Document result =
exporter.doExport(rechnung, getTempDestination(), IRnOutputter.TYPE.ORIG, true);
assertNotNull(result);
if (rechnung.getStatus() == RnStatus.FEHLERHAFT) {
printFaildDocument(result);
fail();
}
// check if the leistung is included
Element root = result.getRootElement();
Iterator<?> iter = root.getDescendants(new ElementFilter("record_tarmed"));
assertTrue(iter.hasNext());
Element record = (Element) iter.next();
Attribute code = record.getAttribute("code");
assertEquals("00.0010", code.getValue());
// check if patient is included
iter = root.getDescendants(new ElementFilter("patient"));
assertTrue(iter.hasNext());
Element patient = (Element) iter.next();
assertNotNull(patient);
if (patient.getAttributeValue("birthdate").equals("1957-04-14T00:00:00")) {
Iterator telcoms = patient.getDescendants(new ElementFilter("telecom"));
if (!telcoms.hasNext()) {
printFaildDocument(result);
fail();
}
} else {
Iterator telcoms = patient.getDescendants(new ElementFilter("telecom"));
if (telcoms.hasNext()) {
printFaildDocument(result);
fail();
}
}
}
}
@Test
public void doExportVatTest() throws IOException{
TestSzenario szenario = TestData.getTestSzenarioInstance();
assertNotNull(szenario.getRechnungen());
assertFalse(szenario.getRechnungen().isEmpty());
XMLExporter exporter = new XMLExporter();
List<Rechnung> rechnungen = szenario.getRechnungen();
for (Rechnung rechnung : rechnungen) {
Document result =
exporter.doExport(rechnung, getTempDestination(), IRnOutputter.TYPE.ORIG, true);
assertNotNull(result);
if (rechnung.getStatus() == RnStatus.FEHLERHAFT) {
printFaildDocument(result);
fail();
}
// check if the vat is included
Element root = result.getRootElement();
Iterator<?> iter = root.getDescendants(new ElementFilter("vat_rate"));
assertTrue(iter.hasNext());
while (iter.hasNext()) {
Element vat_rate = (Element) iter.next();
Attribute rate = vat_rate.getAttribute("vat_rate");
Attribute vat = vat_rate.getAttribute("vat");
if ("0.00".equals(rate.getValue())) {
assertEquals(0.0, Double.parseDouble(vat.getValue()), 0.01);
} else {
Attribute amount = vat_rate.getAttribute("amount");
Double rateDouble = Double.parseDouble(rate.getValue());
Double amountDouble = Double.parseDouble(amount.getValue());
Double expectedVat = (amountDouble / (100.0 + rateDouble)) * rateDouble;
assertEquals(expectedVat, Double.parseDouble(vat.getValue()), 0.01);
}
}
}
}
@Test
public void doExportExisting4Test() throws IOException{
Namespace namespace = Namespace.getNamespace("http://www.xmlData.ch/xmlInvoice/XSD"); //$NON-NLS-1$
TestSzenario szenario = TestData.getTestSzenarioInstance();
Rechnung existing = szenario.getExistingRechnung(TestData.EXISTING_4_RNR);
existing.addZahlung(new Money(1.0), "test", new TimeTool());
XMLExporter exporter = new XMLExporter();
Document result =
exporter.doExport(existing, getTempDestination(), IRnOutputter.TYPE.COPY, true);
assertNotNull(result);
if (existing.getStatus() == RnStatus.FEHLERHAFT) {
printFaildDocument(result);
fail();
}
Element invoice = result.getRootElement().getChild("invoice", namespace);//$NON-NLS-1$
Element balance = invoice.getChild("balance", namespace);//$NON-NLS-1$
String prepaid = balance.getAttributeValue("amount_prepaid");//$NON-NLS-1$
assertEquals("1.00", prepaid);
result = exporter.doExport(existing, getTempDestination(), IRnOutputter.TYPE.STORNO, true);
assertNotNull(result);
if (existing.getStatus() == RnStatus.FEHLERHAFT) {
printFaildDocument(result);
fail();
}
invoice = result.getRootElement().getChild("invoice", namespace);//$NON-NLS-1$
balance = invoice.getChild("balance", namespace);//$NON-NLS-1$
String due = balance.getAttributeValue("amount_due");//$NON-NLS-1$
assertEquals("0.00", due);
}
@Test
public void doExportExisting44Test() throws IOException{
TestSzenario szenario = TestData.getTestSzenarioInstance();
Rechnung existing = szenario.getExistingRechnung(TestData.EXISTING_44_RNR);
existing.addZahlung(new Money(1.0), "test", new TimeTool());
XMLExporter exporter = new XMLExporter();
Document result =
exporter.doExport(existing, getTempDestination(), IRnOutputter.TYPE.COPY, true);
assertNotNull(result);
if (existing.getStatus() == RnStatus.FEHLERHAFT) {
printFaildDocument(result);
fail();
}
Element payload = result.getRootElement().getChild("payload", XMLExporter.nsinvoice);//$NON-NLS-1$
Element body = payload.getChild("body", XMLExporter.nsinvoice);//$NON-NLS-1$
Element balance = body.getChild("balance", XMLExporter.nsinvoice);//$NON-NLS-1$
String prepaid = balance.getAttributeValue("amount_prepaid");//$NON-NLS-1$
assertEquals("1.00", prepaid);
result = exporter.doExport(existing, getTempDestination(), IRnOutputter.TYPE.STORNO, true);
assertNotNull(result);
if (existing.getStatus() == RnStatus.FEHLERHAFT) {
printFaildDocument(result);
fail();
}
payload = result.getRootElement().getChild("payload", XMLExporter.nsinvoice);//$NON-NLS-1$
body = payload.getChild("body", XMLExporter.nsinvoice);//$NON-NLS-1$
balance = body.getChild("balance", XMLExporter.nsinvoice);//$NON-NLS-1$
String due = balance.getAttributeValue("amount_due");//$NON-NLS-1$
assertEquals("0.00", due);
}
private String getTempDestination(){
return CoreHub.getTempDir().getAbsolutePath() + File.separator + "tarmedTest.xml";
}
private void printFaildDocument(Document result) throws IOException{
XMLOutputter xout = new XMLOutputter(Format.getPrettyFormat());
xout.output(result, System.err);
}
}