package at.medevit.elexis.tarmed.model.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.math.BigInteger;
import java.util.GregorianCalendar;
import java.util.List;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import org.junit.BeforeClass;
import org.junit.Test;
import at.medevit.elexis.tarmed.model.TarmedJaxbUtil;
import ch.fd.invoice400.request.BalanceType;
import ch.fd.invoice400.request.BankAddressType;
import ch.fd.invoice400.request.BankCompanyType;
import ch.fd.invoice400.request.BillerAddressType;
import ch.fd.invoice400.request.BillerPersonType;
import ch.fd.invoice400.request.CompanyType;
import ch.fd.invoice400.request.DataValidatorType;
import ch.fd.invoice400.request.DetailType;
import ch.fd.invoice400.request.DiagnosisType;
import ch.fd.invoice400.request.Esr9Type;
import ch.fd.invoice400.request.GeneratorType;
import ch.fd.invoice400.request.GuarantorAddressType;
import ch.fd.invoice400.request.GuarantorPersonType;
import ch.fd.invoice400.request.HeaderPartyType;
import ch.fd.invoice400.request.HeaderType;
import ch.fd.invoice400.request.InsuranceAddressType;
import ch.fd.invoice400.request.InvoiceType;
import ch.fd.invoice400.request.PatientAddressType;
import ch.fd.invoice400.request.PatientPersonType;
import ch.fd.invoice400.request.PayantType;
import ch.fd.invoice400.request.PostalAddressType;
import ch.fd.invoice400.request.PrologType;
import ch.fd.invoice400.request.ProviderAddressType;
import ch.fd.invoice400.request.ProviderPersonType;
import ch.fd.invoice400.request.RecordDrugType;
import ch.fd.invoice400.request.RecordTarmedType;
import ch.fd.invoice400.request.RequestType;
import ch.fd.invoice400.request.ServicesType;
import ch.fd.invoice400.request.SoftwareType;
import ch.fd.invoice400.request.TelecomAddressType;
import ch.fd.invoice400.request.UvgLawType;
import ch.fd.invoice400.request.VatRateType;
import ch.fd.invoice400.request.VatType;
import ch.fd.invoice400.request.XtendHeaderPartyType;
import ch.fd.invoice400.request.ZipType;
public class InvoiceRequest400Tests {
private static TarmedJaxbUtil jaxbHelper;
private static File writeReq400;
private static File readReq400;
@BeforeClass
public static void setUpBeforeClass() throws Exception{
jaxbHelper = new TarmedJaxbUtil();
writeReq400 = new File("rsc/writeReq400.xml");
if (!writeReq400.exists()) {
writeReq400.createNewFile();
}
readReq400 = new File("rsc/readReq400.xml");
}
@Test
public void testMarshallInvoiceRequest400() throws FileNotFoundException,
DatatypeConfigurationException{
jaxbHelper.marshallInvoiceRequest(generateRequestSample(),
new FileOutputStream(writeReq400));
assertTrue(writeReq400.exists());
}
@Test
public void testUnmarshalInvoiceRequest400() throws FileNotFoundException{
RequestType request =
jaxbHelper.unmarshalInvoiceRequest400(new FileInputStream(readReq400));
assertNotNull(request);
assertEquals("production", request.getRole());
assertNotNull(request.getHeader());
assertEquals("2099988872462", request.getHeader().getSender().getEanParty());
assertEquals("2000000000000", request.getHeader().getRecipient().getEanParty());
assertNotNull(request.getProlog());
assertEquals("Elexis", request.getProlog().getPackage().getValue());
assertEquals("JDOM", request.getProlog().getGenerator().getSoftware().getValue());
assertNotNull(request.getInvoice());
BalanceType balance = request.getInvoice().getBalance();
assertEquals("110.19", Double.toString(balance.getAmount()));
assertEquals("CHF", balance.getCurrency());
assertEquals("3.11", Double.toString(balance.getVat().getVat()));
Esr9Type esr9 = request.getInvoice().getEsr9();
assertEquals("01-200020-9", esr9.getParticipantNumber());
assertNotNull(esr9.getBank());
PayantType payant = request.getInvoice().getTiersPayant();
assertEquals("Schwarz", payant.getBiller().getPerson().getFamilyname());
assertEquals("Adlerauge", payant.getPatient().getPerson().getFamilyname());
assertEquals("male", payant.getPatient().getGender());
assertNotNull(payant.getGuarantor());
assertNotNull(payant.getInsurance());
List<DiagnosisType> diagnosis = request.getInvoice().getDetail().getDiagnosis();
assertEquals("V17", diagnosis.get(0).getCode());
assertEquals("ICD10", diagnosis.get(0).getType());
UvgLawType uvg = request.getInvoice().getDetail().getUvg();
assertEquals("accident", uvg.getReason());
assertEquals("97651", uvg.getCaseId());
List<Object> records =
request.getInvoice().getDetail().getServices()
.getRecordTarmedOrRecordCantonalOrRecordUnclassified();
assertEquals(6, records.size());
}
private RequestType generateRequestSample() throws DatatypeConfigurationException{
RequestType request = new RequestType();
request.setRole("UnitTest");
// header
HeaderType header = new HeaderType();
HeaderPartyType sender = new HeaderPartyType();
sender.setEanParty("2099988872462");
HeaderPartyType intermidate = new HeaderPartyType();
intermidate.setEanParty("2000000000000");
XtendHeaderPartyType recipient = new XtendHeaderPartyType();
recipient.setEanParty("2000000000000");
header.setSender(sender);
header.setIntermediate(intermidate);
header.setRecipient(recipient);
request.setHeader(header);
// prolog
PrologType prolog = new PrologType();
SoftwareType pack = new SoftwareType();
pack.setVersion(new BigInteger("300"));
pack.setId(new BigInteger("1"));
pack.setValue("Elexis");
prolog.setPackage(pack);
GeneratorType generator = new GeneratorType();
SoftwareType software = new SoftwareType();
software.setVersion(new BigInteger("100"));
software.setId(new BigInteger("1"));
software.setValue("JDOM");
generator.setSoftware(software);
prolog.setGenerator(generator);
DataValidatorType validator = new DataValidatorType();
validator.setFocus("tarmed");
validator.setVersionSoftware(new BigInteger("300"));
validator.setVersionDb(new BigInteger("401"));
validator.setId(new BigInteger("1"));
validator.setValue("Elexis TarmedVerifier");
prolog.getValidator().add(validator);
request.setProlog(prolog);
// invoice
request.setInvoice(generateInvoiceSample());
return request;
}
private InvoiceType generateInvoiceSample() throws DatatypeConfigurationException{
GregorianCalendar c = new GregorianCalendar();
c.set(2015, 03, 19, 10, 30);
XMLGregorianCalendar cal = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
c = new GregorianCalendar();
c.set(1966, 07, 20, 10, 30);
XMLGregorianCalendar birthDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(c);
InvoiceType invoice = new InvoiceType();
invoice.setInvoiceTimestamp(new BigInteger("1426759765"));
invoice.setInvoiceId("001026000562");
invoice.setInvoiceDate(cal);
invoice.setCaseId("ka933bacc6535fecf017");
invoice.setResend(false);
// invoice balance
BalanceType balance = new BalanceType();
balance.setCurrency("CHF");
balance.setAmount(110.19);
balance.setAmountPrepaid(0.00);
balance.setAmountDue(110.20);
balance.setAmountTarmed(54.59);
balance.setAmountTarmedMt(30.61);
balance.setAmountTarmedTt(28.16);
balance.setUnitTarmedTt(28.73);
balance.setUnitTarmedMt(26.43);
balance.setAmountCantonal(0.00);
balance.setAmountUnclassified(0.00);
balance.setAmountLab(0.00);
balance.setAmountPhysio(0.00);
balance.setAmountDrug(55.60);
balance.setAmountMigel(0.00);
balance.setAmountObligations(110.19);
//set vat
VatType vat = new VatType();
vat.setVat(3.11);
VatRateType vr1 = new VatRateType();
vr1.setVatRate(0.00);
vr1.setAmount(54.59);
vr1.setVat(0.00);
vat.getVatRate().add(vr1);
VatRateType vr2 = new VatRateType();
vr2.setVatRate(2.50);
vr2.setAmount(24.25);
vr2.setVat(0.61);
vat.getVatRate().add(vr2);
VatRateType vr3 = new VatRateType();
vr3.setVatRate(8.00);
vr3.setAmount(31.35);
vr3.setVat(2.51);
vat.getVatRate().add(vr3);
balance.setVat(vat);
invoice.setBalance(balance);
//esr9
Esr9Type esr9 = new Esr9Type();
esr9.setParticipantNumber("01-200020-9");
esr9.setType("16or27");
esr9.setReferenceNumber("81 17000 00000 00001 02600 05629");
esr9.setCodingLine("0100000110207>811700000000000010260005629+ 012000209>");
//Bank
BankAddressType bank = new BankAddressType();
BankCompanyType bCompany = new BankCompanyType();
bCompany.setCompanyname("Hartmann");
PostalAddressType bPostal = new PostalAddressType();
bPostal.setCity("Zürich");
bCompany.setPostal(bPostal);
bank.setCompany(bCompany);
esr9.setBank(bank);
invoice.setEsr9(esr9);
//tiers payant
PayantType payant = new PayantType();
payant.setInvoiceModification(false);
payant.setPurpose("invoice");
//biller
BillerAddressType biller = new BillerAddressType();
biller.setEanParty("2099988872462");
biller.setZsr("C196719");
biller.setSpecialty("General Medicine");
//biller person
BillerPersonType billPerson = new BillerPersonType();
billPerson.setSalutation("Ms.");
billPerson.setFamilyname("Schwarz");
billPerson.getGivenname().add("Lena");
PostalAddressType billPostal = new PostalAddressType();
billPostal.setStreet("Uferweg 3");
ZipType billZip = new ZipType();
billZip.setCountrycode("CH");
billZip.setValue("5000");
billPostal.setZip(billZip);
billPostal.setCity("Aarau");
billPerson.setPostal(billPostal);
TelecomAddressType billTele = new TelecomAddressType();
billTele.getPhone().add("555-0944235");
billPerson.setTelecom(billTele);
biller.setPerson(billPerson);
payant.setBiller(biller);
// provider
ProviderAddressType provider = new ProviderAddressType();
provider.setEanParty("2099988872462");
provider.setZsr("C196719");
provider.setSpecialty("General Medicine");
//Provider Person
ProviderPersonType pPerson = new ProviderPersonType();
pPerson.setSalutation("Ms.");
pPerson.setFamilyname("Schwarz");
pPerson.getGivenname().add("Lena");
pPerson.setPostal(billPostal);
pPerson.setTelecom(billTele);
provider.setPerson(pPerson);
payant.setProvider(provider);
//insurance
InsuranceAddressType insurance = new InsuranceAddressType();
insurance.setEanParty("2000000000000");
CompanyType iCompany = new CompanyType();
iCompany.setCompanyname("Adlerauge");
PostalAddressType iPostal = new PostalAddressType();
iPostal.setStreet("Bahnhofstrasse 3");
iPostal.setCity("Aarau");
ZipType iZip = new ZipType();
iZip.setCountrycode("CH");
iZip.setValue("5000");
iPostal.setZip(iZip);
iCompany.setPostal(iPostal);
insurance.setCompany(iCompany);
payant.setInsurance(insurance);
//patient
PatientAddressType patient = new PatientAddressType();
patient.setGender("male");
patient.setBirthdate(birthDate);
PatientPersonType patPerson = new PatientPersonType();
patPerson.setFamilyname("Adlerauge");
patPerson.getGivenname().add("Albertino");
patPerson.setPostal(iPostal);
patient.setPerson(patPerson);
payant.setPatient(patient);
//guarantor
GuarantorAddressType guarantor = new GuarantorAddressType();
GuarantorPersonType gPerson = new GuarantorPersonType();
gPerson.setFamilyname("Adlerauge");
gPerson.getGivenname().add("Albertino");
gPerson.setPostal(iPostal);
guarantor.setPerson(gPerson);
payant.setGuarantor(guarantor);
invoice.setTiersPayant(payant);
// detail
DetailType detail = new DetailType();
detail.setDateBegin(cal);
detail.setDateEnd(cal);
detail.setCanton("AG");
detail.setServiceLocalityAttribute("practice");
//diagnosis
DiagnosisType diagnosis = new DiagnosisType();
diagnosis.setType("ICD10");
diagnosis.setCode("V17");
detail.getDiagnosis().add(diagnosis);
diagnosis = new DiagnosisType();
diagnosis.setType("by_contract");
diagnosis.setCode("R4");
detail.getDiagnosis().add(diagnosis);
diagnosis = new DiagnosisType();
diagnosis.setType("by_contract");
diagnosis.setCode("R5");
detail.getDiagnosis().add(diagnosis);
UvgLawType uvg = new UvgLawType();
uvg.setReason("accident");
uvg.setCaseId("97651");
uvg.setCaseDate(cal);
detail.setUvg(uvg);
//services
ServicesType services = new ServicesType();
// rec 1
RecordDrugType recDrug = new RecordDrugType();
recDrug.setUnit(3.90);
recDrug.setUnitFactor(1.00);
recDrug.setTariffType("400");
recDrug.setCode("2321636");
recDrug.setAmount(3.90);
recDrug.setVatRate(8.0);
recDrug.setObligation(false);
recDrug.setValidate(true);
recDrug.setRecordId(new BigInteger("1"));
recDrug.setNumber(new BigInteger("1"));
recDrug.setQuantity(1.0);
recDrug.setDateBegin(cal);
recDrug.setValue("HANSAPLAST Wundreinigungstücher 8 Stk ()");
services.getRecordTarmedOrRecordCantonalOrRecordUnclassified().add(recDrug);
//rec 2
recDrug = new RecordDrugType();
recDrug.setUnit(25.45);
recDrug.setUnitFactor(1.00);
recDrug.setTariffType("400");
recDrug.setCode("2180791");
recDrug.setAmount(24.45);
recDrug.setVatRate(8.0);
recDrug.setObligation(false);
recDrug.setValidate(true);
recDrug.setRecordId(new BigInteger("2"));
recDrug.setNumber(new BigInteger("1"));
recDrug.setQuantity(1.0);
recDrug.setDateBegin(cal);
recDrug.setValue("HANSAPLAST Knie Bandage (1 Stk)");
services.getRecordTarmedOrRecordCantonalOrRecordUnclassified().add(recDrug);
//rec 3
recDrug = new RecordDrugType();
recDrug.setUnit(3.00);
recDrug.setUnitFactor(1.00);
recDrug.setTariffType("400");
recDrug.setCode("2321599");
recDrug.setAmount(3.00);
recDrug.setVatRate(8.0);
recDrug.setObligation(false);
recDrug.setValidate(true);
recDrug.setRecordId(new BigInteger("3"));
recDrug.setNumber(new BigInteger("1"));
recDrug.setQuantity(1.0);
recDrug.setDateBegin(cal);
recDrug.setValue("HANSAPLAST UNIVERSAL Schnellverb Strips ass 20 Stk ()");
services.getRecordTarmedOrRecordCantonalOrRecordUnclassified().add(recDrug);
//rec 4
recDrug = new RecordDrugType();
recDrug.setUnit(24.25);
recDrug.setUnitFactor(1.00);
recDrug.setTariffType("400");
recDrug.setCode("2648343");
recDrug.setAmount(24.45);
recDrug.setVatRate(24.45);
recDrug.setObligation(false);
recDrug.setValidate(true);
recDrug.setRecordId(new BigInteger("4"));
recDrug.setNumber(new BigInteger("1"));
recDrug.setQuantity(1.0);
recDrug.setDateBegin(cal);
recDrug.setValue("VOLTAREN DOLO Emulgel (Tube 120 g)");
services.getRecordTarmedOrRecordCantonalOrRecordUnclassified().add(recDrug);
// tarmed1
RecordTarmedType recTarmed =
createTarmedRecord(cal, 9.57, 8.80, 8.19, 7.53, 16.34, "5", "00.0010",
"Konsultation, erste 5 Min. (Grundkonsultation)");
services.getRecordTarmedOrRecordCantonalOrRecordUnclassified().add(recTarmed);
//tarmed 2
recTarmed =
createTarmedRecord(cal, 21.04, 19.36, 20.54, 18.90, 38.25, "6", "01.0110",
"Taping, Kategorie I");
services.getRecordTarmedOrRecordCantonalOrRecordUnclassified().add(recTarmed);
detail.setServices(services);
invoice.setDetail(detail);
return invoice;
}
private RecordTarmedType createTarmedRecord(XMLGregorianCalendar cal, double unitMt,
double amountMt, double unitTt, double amountTt, double amount, String recordId,
String code, String value){
RecordTarmedType recTarmed = new RecordTarmedType();
recTarmed.setTreatment("ambulatory");
recTarmed.setTariffType("001");
recTarmed.setEanProvider("2099988872462");
recTarmed.setEanResponsible("2099988872462");
recTarmed.setBillingRole("both");
recTarmed.setMedicalRole("self_employed");
recTarmed.setBodyLocation("none");
recTarmed.setUnitMt(unitMt);
recTarmed.setUnitFactorMt(0.92);
recTarmed.setScaleFactorMt(1.0);
recTarmed.setExternalFactorMt(1.0);
recTarmed.setAmountMt(amountMt);
recTarmed.setUnitTt(unitTt);
recTarmed.setUnitFactorTt(0.92);
recTarmed.setScaleFactorTt(1.0);
recTarmed.setExternalFactorTt(1.0);
recTarmed.setAmountTt(amountTt);
recTarmed.setAmount(amount);
recTarmed.setVatRate(0.0);
recTarmed.setValidate(true);
recTarmed.setObligation(true);
recTarmed.setRecordId(new BigInteger(recordId));
recTarmed.setNumber(new BigInteger("1"));
recTarmed.setQuantity(1.0);
recTarmed.setDateBegin(cal);
recTarmed.setCode(code);
recTarmed.setValue(value);
return recTarmed;
}
}