/*******************************************************************************
* Copyright (c) 2009, G. Weirich and medelexis AG
* 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
*
*******************************************************************************/
package ch.elexis.labortarif2009.data;
import java.util.List;
import ch.elexis.core.data.interfaces.IOptifier;
import ch.elexis.core.ui.data.UiVerrechenbarAdapter;
import ch.elexis.data.Fall;
import ch.elexis.data.Query;
import ch.elexis.data.Xid;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
public class Labor2009Tarif extends UiVerrechenbarAdapter {
public static final String FLD_GUELTIG_BIS = "GueltigBis";
public static final String FLD_GUELTIG_VON = "GueltigVon";
public static final String CODESYSTEM_CODE_LAB2009 = "317"; //$NON-NLS-1$
public static final String CODESYSTEM_CODE_TARMED = "300"; //$NON-NLS-1$
public static final String MULTIPLICATOR_NAME = "EAL2009"; //$NON-NLS-1$
public static final String CODESYSTEM_NAME = "EAL 2009"; //$NON-NLS-1$
public static final String FLD_FACHBEREICH = "fachbereich"; //$NON-NLS-1$
public static final String FLD_LIMITATIO = "limitatio"; //$NON-NLS-1$
public static final String FLD_NAME = "name"; //$NON-NLS-1$
public static final String FLD_TP = "tp"; //$NON-NLS-1$
public static final String FLD_CODE = "code"; //$NON-NLS-1$
public static final String FLD_CHAPTER = "chapter"; //$NON-NLS-1$
public static final String FLD_FACHSPEC = "praxistyp"; //$NON-NLS-1$
public static final String XIDDOMAIN = "www.xid.ch/id/analysenliste_ch2009/"; //$NON-NLS-1$
private final static String TABLENAME = "CH_MEDELEXIS_LABORTARIF2009"; //$NON-NLS-1$
public static final String VERSION010 = "0.1.0"; //$NON-NLS-1$
public static final String VERSION011 = "0.1.1"; //$NON-NLS-1$
public static final String VERSION = "0.1.2"; //$NON-NLS-1$
// @formatter:off
private static final String createTable = "create table " + TABLENAME + "(" //$NON-NLS-1$ //$NON-NLS-2$
+ "ID VARCHAR(25) primary key," //$NON-NLS-1$
+ "lastupdate BIGINT," //$NON-NLS-1$
+ "deleted CHAR(1) default '0'," //$NON-NLS-1$
+ "chapter VARCHAR(255)," //$NON-NLS-1$
+ "code VARCHAR(12)," //$NON-NLS-1$
+ "tp VARCHAR(10)," //$NON-NLS-1$
+ "name VARCHAR(255)," //$NON-NLS-1$
+ "limitatio TEXT," //$NON-NLS-1$
+ "fachbereich VARCHAR(10)," //$NON-NLS-1$
+ "GueltigVon CHAR(8)," //$NON-NLS-1$
+ "GueltigBis CHAR(8)," //$NON-NLS-1$
+ "praxistyp VARCHAR(2));" //$NON-NLS-1$
+ "INSERT INTO " + TABLENAME + "(ID,code) VALUES (1,'" + VERSION + "');"; //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
// @formatter:on
private static final IOptifier l09optifier = new Optifier();
private static TimeTool future = new TimeTool("01.01.9999"); //$NON-NLS-1$
static {
createTable();
}
static void createTable(){
addMapping(TABLENAME, FLD_CHAPTER, FLD_CODE, FLD_TP, FLD_NAME, FLD_LIMITATIO,
FLD_FACHBEREICH, FLD_FACHSPEC, FLD_GUELTIG_BIS, FLD_GUELTIG_VON);
Labor2009Tarif version = load("1"); //$NON-NLS-1$
if (!version.exists()) {
createOrModifyTable(createTable);
}
if (version.get(FLD_CODE).equals(VERSION010)) {
createOrModifyTable("ALTER TABLE " + TABLENAME
+ " ADD GueltigVon CHAR(8); ALTER TABLE " + TABLENAME + " ADD GueltigBis CHAR(8);");
createOrModifyTable("ALTER TABLE " + TABLENAME + " MODIFY chapter VARCHAR(255);");
version.set(FLD_CODE, VERSION);
}
if (version.get(FLD_CODE).equals(VERSION011)) {
createOrModifyTable("ALTER TABLE " + TABLENAME + " MODIFY chapter VARCHAR(255);");
version.set(FLD_CODE, VERSION);
}
Xid.localRegisterXIDDomainIfNotExists(XIDDOMAIN,
"Analysenliste 2009", Xid.ASSIGNMENT_REGIONAL); //$NON-NLS-1$
}
/** Only needed by the importer */
Labor2009Tarif(String chapter, String code, String tp, String name, String lim, String fach,
int fachspec){
create(null);
set(new String[] {
FLD_CHAPTER, FLD_CODE, FLD_TP, FLD_NAME, FLD_LIMITATIO, FLD_FACHBEREICH, FLD_FACHSPEC
}, chapter, code, tp, name, lim, fach, Integer.toString(fachspec));
}
@Override
public String getLabel(){
String[] values =
get(true, Labor2009Tarif.FLD_GUELTIG_VON, Labor2009Tarif.FLD_GUELTIG_BIS,
Labor2009Tarif.FLD_CODE, Labor2009Tarif.FLD_NAME);
String validFromString = values[0];
String validToString = values[1];
String code = values[2];
String text = StringTool.getFirstLine(values[3], 80);
if (!StringTool.isNothing(code)) {
StringBuilder sb = new StringBuilder(code).append(" ").append(text) //$NON-NLS-1$
.append(" (").append(get(FLD_FACHBEREICH)).append(")"); //$NON-NLS-1$ //$NON-NLS-2$
TimeTool validFrom = null;
TimeTool validTo = null;
if (validFromString != null && validFromString.trim().length() > 0) {
validFrom = new TimeTool(validFromString);
}
if (validToString != null && validToString.trim().length() > 0) {
validTo = new TimeTool(validToString);
}
if (validFrom != null) {
sb.append(" (").append(validFrom.toString(TimeTool.DATE_GER));
if (validTo != null) {
sb.append("-").append(validTo.toString(TimeTool.DATE_GER)).append(")");
} else {
sb.append("-").append(" ").append(")");
}
}
return sb.toString();
} else {
return "?"; //$NON-NLS-1$
}
}
@Override
public String getCode(){
return get(FLD_CODE);
}
@Override
public String getText(){
return StringTool.getFirstLine(get(FLD_NAME), 80);
}
@Override
protected String getTableName(){
return TABLENAME;
}
public static Labor2009Tarif load(final String id){
return new Labor2009Tarif(id);
}
protected Labor2009Tarif(final String id){
super(id);
}
public Labor2009Tarif(){}
public String getXidDomain(){
return XIDDOMAIN;
}
public double getFactor(TimeTool date, Fall fall){
double ret = getVKMultiplikator(date, MULTIPLICATOR_NAME);
return ret;
}
public int getTP(TimeTool date, Fall fall){
double tp = checkZeroDouble(get(FLD_TP));
return (int) Math.round(tp * 100.0);
}
public boolean isValidOn(TimeTool date){
String validFromString = get(FLD_GUELTIG_VON);
String validToString = get(FLD_GUELTIG_BIS);
if (validFromString != null && validFromString.trim().length() > 0) {
TimeTool validFrom = new TimeTool(validFromString);
if (validFrom.after(date))
return false;
}
if (validToString != null && validToString.trim().length() > 0) {
TimeTool validTo = new TimeTool(validToString);
if (validTo.before(date) || validTo.equals(date))
return false;
}
return true;
}
public static int getCurrentCodeVersion(){
Labor2009Tarif version = load("1");
String currentVersion = version.get(Labor2009Tarif.FLD_CHAPTER);
if (currentVersion != null && !currentVersion.isEmpty()) {
return Integer.parseInt(currentVersion);
}
return 0;
}
public static void setCurrentCodeVersion(int value){
Labor2009Tarif version = load("1");
version.set(Labor2009Tarif.FLD_CHAPTER, Integer.toString(value));
}
@Override
public boolean isDragOK(){
return true;
}
@Override
public String getCodeSystemName(){
return CODESYSTEM_NAME;
}
public String getCodeSystemCode(){
return CODESYSTEM_CODE_LAB2009;
}
@Override
public IOptifier getOptifier(){
return l09optifier;
}
@Override
public VatInfo getVatInfo(){
// Code Mehrwertsteuer (CMWS) - 1stellig
// 1: voller MWSt-Satz (zur Zeit 6.5%)
// 2: reduzierter MWSt-Satz (zur Zeit 2%)
// 3: von der MWSt befreit
return VatInfo.VAT_NONE;
}
public static Labor2009Tarif getFromCode(String code, TimeTool date){
Query<Labor2009Tarif> query = new Query<Labor2009Tarif>(Labor2009Tarif.class);
query.add(Labor2009Tarif.FLD_CODE, "=", code);
List<Labor2009Tarif> leistungen = query.execute();
for (Labor2009Tarif laborLeistung : leistungen) {
TimeTool validFrom = laborLeistung.getGueltigVon();
TimeTool validTo = laborLeistung.getGueltigBis();
if (validTo == null) {
validTo = future;
}
if (date.isAfterOrEqual(validFrom) && date.isBeforeOrEqual(validTo))
return laborLeistung;
}
return null;
}
private TimeTool getGueltigBis(){
String value = get(FLD_GUELTIG_BIS);
if (!StringTool.isNothing(value)) {
TimeTool res = new TimeTool(value);
res.set(TimeTool.HOUR_OF_DAY, 23);
res.set(TimeTool.MINUTE, 59);
res.set(TimeTool.SECOND, 59);
return res;
} else {
return null;
}
}
private TimeTool getGueltigVon(){
String value = get(FLD_GUELTIG_VON);
if (!StringTool.isNothing(value)) {
return new TimeTool(value);
} else {
return null;
}
}
}