package ch.elexis.TarmedRechnung; import org.jdom.Element; import ch.elexis.core.constants.Preferences; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.data.Fall; import ch.elexis.data.Mandant; import ch.elexis.data.Patient; import ch.elexis.data.Rechnung; import ch.elexis.data.RnStatus.REJECTCODE; import ch.elexis.tarmedprefs.TarmedRequirements; import ch.rgw.tools.StringTool; public class XMLExporterInsurance { private static final String ATTR_CASE_ID = "case_id"; //$NON-NLS-1$ private Element insuranceElement; private XMLExporterInsurance(Element insuranceElement){ this.insuranceElement = insuranceElement; } public Element getElement(){ return insuranceElement; } public static XMLExporterInsurance buildInsurance(Rechnung rechnung, XMLExporter xmlExporter){ Fall actFall = rechnung.getFall(); Patient actPatient = actFall.getPatient(); Mandant actMandant = rechnung.getMandant(); String gesetz = TarmedRequirements.getGesetz(actFall); Element element = new Element(gesetz.toLowerCase(), XMLExporter.nsinvoice); if (gesetz.equalsIgnoreCase("ivg")) { //$NON-NLS-1$ String caseNumber = actFall.getRequiredString(TarmedRequirements.CASE_NUMBER); caseNumber = caseNumber.replaceAll("[^0-9]", StringConstants.EMPTY); //$NON-NLS-1$ if ((!caseNumber.matches("[0-9]{14}")) && // seit 1.1.2000 gültige Nummer //$NON-NLS-1$ (!caseNumber.matches("[0-9]{10}")) && // bis 31.12.1999 gültige Nummer //$NON-NLS-1$ (!caseNumber.matches("[0-9]{9}")) && // auch bis 31.12.1999 gültige Nummer //$NON-NLS-1$ (!caseNumber.matches("[0-9]{6}"))) { // Nummer für Abklärungsmassnahmen //$NON-NLS-1$ /* die spinnen, die Bürokraten */ if (CoreHub.userCfg.get(Preferences.LEISTUNGSCODES_BILLING_STRICT, true)) { rechnung.reject(REJECTCODE.VALIDATION_ERROR, Messages.XMLExporter_IVCaseNumberInvalid); } else { caseNumber = "123456"; // sometimes it's better to cheat than to fight //$NON-NLS-1$ // bureaucrazy } } element.setAttribute(ATTR_CASE_ID, caseNumber); addSSNAttribute(element, actPatient, actFall, rechnung); String nif = TarmedRequirements.getNIF(actMandant.getRechnungssteller()).replaceAll( "[^0-9]", StringConstants.EMPTY); //$NON-NLS-1$ if (CoreHub.userCfg.get(Preferences.LEISTUNGSCODES_BILLING_STRICT, true) && (!nif.matches("[0-9]{1,7}"))) { //$NON-NLS-1$ rechnung.reject(REJECTCODE.VALIDATION_ERROR, Messages.XMLExporter_NIFInvalid); } else { element.setAttribute("nif", nif); //$NON-NLS-1$ } } else if (gesetz.equalsIgnoreCase("mvg")) { addSSNAttribute(element, actPatient, actFall, rechnung); addInsuredId(element, actPatient, actFall); } else if (gesetz.equalsIgnoreCase("uvg")) { //$NON-NLS-1$ String casenumber = actFall.getRequiredString(TarmedRequirements.CASE_NUMBER); if (StringTool.isNothing(casenumber)) { casenumber = actFall.getRequiredString(TarmedRequirements.ACCIDENT_NUMBER); } if (!StringTool.isNothing(casenumber)) { element.setAttribute(ATTR_CASE_ID, casenumber); } addInsuredId(element, actPatient, actFall); } else { addInsuredId(element, actPatient, actFall); } String casedate = actFall.getInfoString("Unfalldatum"); //$NON-NLS-1$ if (StringTool.isNothing(casedate)) { casedate = rechnung.getDatumVon(); } element.setAttribute("case_date", XMLExporterUtil.makeTarmedDatum(casedate)); //$NON-NLS-1$ XMLExporterUtil.setAttributeIfNotEmpty(element, "contract_number", actFall //$NON-NLS-1$ .getInfoString("Vertragsnummer")); //$NON-NLS-1$ return new XMLExporterInsurance(element); } private static void addInsuredId(Element element, Patient actPatient, Fall actFall){ String vnummer = actFall.getRequiredString(TarmedRequirements.INSURANCE_NUMBER); if (StringTool.isNothing(vnummer)) { vnummer = actFall.getRequiredString(TarmedRequirements.CASE_NUMBER); } if (StringTool.isNothing(vnummer)) { vnummer = actPatient.getId(); } element.setAttribute("insured_id", vnummer); //$NON-NLS-1$ } private static void addSSNAttribute(Element element, Patient actPatient, Fall actFall, Rechnung rechnung){ String ahv = TarmedRequirements.getAHV(actPatient).replaceAll("[^0-9]", StringConstants.EMPTY); //$NON-NLS-1$ if (ahv.length() == 0) { ahv = actFall.getRequiredString(TarmedRequirements.SSN).replaceAll( "[^0-9]", StringConstants.EMPTY); //$NON-NLS-1$ } boolean bAHVValid = ahv.matches("[0-9]{11}") || ahv.matches("[0-9]{13}"); //$NON-NLS-1$ //$NON-NLS-2$ if (CoreHub.userCfg.get(Preferences.LEISTUNGSCODES_BILLING_STRICT, true) && (bAHVValid == false)) { rechnung.reject(REJECTCODE.VALIDATION_ERROR, Messages.XMLExporter_AHVInvalid); } else { element.setAttribute("ssn", ahv); //$NON-NLS-1$ } } }