package ch.elexis.data; import java.util.List; import ch.elexis.core.jdt.Nullable; import ch.elexis.core.model.prescription.EntryType; import ch.rgw.tools.JdbcLink; /** * Stores the default signature for an ATC code or a specific article * */ public class ArticleDefaultSignature extends PersistentObject { public static final String FLD_ATC_CODE = "atccode"; public static final String FLD_ARTICLE = "article"; public static final String FLD_TYPE = "type"; public static final String FLD_SIG_MORNING = "morning"; public static final String FLD_SIG_NOON = "noon"; public static final String FLD_SIG_EVENING = "evening"; public static final String FLD_SIG_NIGHT = "night"; public static final String FLD_SIG_COMMENT = "comment"; public static final String EXT_FLD_MEDICATIONTYPE = "medicationType"; public static final String EXT_FLD_DISPOSALTYPE = "disposalType"; public static final String EXT_FLD_FREETEXT = "textSignature"; public static final String TABLENAME = "default_signatures"; private static final String VERSION_ENTRY_ID = "VERSION"; private static final String VERSION = "1.0.0"; //@formatter:off /** Definition of the database table */ static final String createDB = "CREATE TABLE " + TABLENAME + "(" + "ID VARCHAR(25) primary key," + "lastupdate BIGINT," + "deleted CHAR(1) default '0'," + FLD_ATC_CODE + " CHAR(10)," + FLD_ARTICLE + " VARCHAR(255)," // contains EAN%Pharmacode$Article_StoreToString + FLD_TYPE + " VARCHAR(255)," + FLD_SIG_MORNING + " CHAR(10)," // id(VERSION) contains cummulated N dataset vers + FLD_SIG_NOON + " CHAR(10)," + FLD_SIG_EVENING + " CHAR(10)," + FLD_SIG_NIGHT + " CHAR(10)," + FLD_SIG_COMMENT + " TEXT," + PersistentObject.FLD_EXTINFO + " BLOB" + "); " + "CREATE INDEX idxATCCode ON " + TABLENAME + " (" + FLD_ATC_CODE + "); " + "INSERT INTO " + TABLENAME + " (ID," + FLD_ATC_CODE + ") VALUES ('VERSION', " + JdbcLink.wrap(VERSION) + ")"; //@formatter:on static { addMapping(TABLENAME, FLD_ATC_CODE, FLD_ARTICLE, FLD_TYPE, FLD_SIG_MORNING, FLD_SIG_NOON, FLD_SIG_EVENING, FLD_SIG_NIGHT, FLD_SIG_COMMENT, FLD_EXTINFO); ArticleDefaultSignature version = load(VERSION_ENTRY_ID); if (!version.exists()) { createOrModifyTable(createDB); } } protected ArticleDefaultSignature(){} protected ArticleDefaultSignature(final String id){ super(id); } /** * Create a new default signature for an article. The value can be bound to a specific article * (where the following article info is stored: <code>EAN$PharmaCode$Elexis_internal_ID</code>) * or an ATC Code. * * @param article * @param atcCode */ public ArticleDefaultSignature(Artikel article, String atcCode){ create(null); if (article != null) set(FLD_ARTICLE, article.getEAN() + "$" + article.getPharmaCode() + "$" + article.storeToString()); if (atcCode != null) set(FLD_ATC_CODE, atcCode); } public static ArticleDefaultSignature load(String id){ return new ArticleDefaultSignature(id); } @Override public String getLabel(){ StringBuilder sb = new StringBuilder(); String atcCode = get(FLD_ATC_CODE); Artikel article = getArticle(); if (atcCode != null && !atcCode.isEmpty()) { sb.append("ATC [" + atcCode + "] "); } else if (article != null) { sb.append("ARTICLE [" + article.getLabel() + "] "); } sb.append(getSignatureMorning()).append("-").append(getSignatureNoon()).append("-") .append(getSignatureEvening()).append("-").append(getSignatureNight()).append(" ") .append(getSignatureComment()); return null; } @Override protected String getTableName(){ return TABLENAME; } /** * * @param artikel * @return the default signature for the specific article or the specific ATC code (in order), * <code>null</code> if either not available */ public static @Nullable ArticleDefaultSignature getDefaultsignatureForArticle(@Nullable Artikel artikel){ if(artikel==null) return null; Query<ArticleDefaultSignature> qbe = new Query<ArticleDefaultSignature>(ArticleDefaultSignature.class); qbe.add(FLD_ARTICLE, Query.LIKE, "%" + artikel.storeToString()); List<ArticleDefaultSignature> resultArticle = qbe.execute(); if (resultArticle.size() > 0) { return resultArticle.get(0); } return ArticleDefaultSignature.getDefaultSignatureForATCCode(artikel.getATC_code()); } /** * * @param atcCode * @return the default signature or <code>null</code> if no corresponding entry */ public static ArticleDefaultSignature getDefaultSignatureForATCCode(String atcCode){ Query<ArticleDefaultSignature> qbe = new Query<ArticleDefaultSignature>(ArticleDefaultSignature.class); qbe.add(FLD_ATC_CODE, Query.LIKE, atcCode); List<ArticleDefaultSignature> execute = qbe.execute(); return (execute.size() > 0) ? execute.get(0) : null; } public String getSignatureMorning(){ return checkNull(get(FLD_SIG_MORNING)); } public void setSignatureMorning(String sm){ set(FLD_SIG_MORNING, sm); } public String getSignatureNoon(){ return checkNull(get(FLD_SIG_NOON)); } public void setSignatureNoon(String sm){ set(FLD_SIG_NOON, sm); } public String getSignatureEvening(){ return checkNull(get(FLD_SIG_EVENING)); } public void setSignatureEvening(String sm){ set(FLD_SIG_EVENING, sm); } public String getSignatureNight(){ return checkNull(get(FLD_SIG_NIGHT)); } public void setSignatureNight(String sm){ set(FLD_SIG_NIGHT, sm); } public String getSignatureComment(){ return checkNull(get(FLD_SIG_COMMENT)); } public void setSignatureComment(String sm){ set(FLD_SIG_COMMENT, sm); } public EntryType getMedicationType(){ String typeNumber = (String) getExtInfoStoredObjectByKey(EXT_FLD_MEDICATIONTYPE); if (typeNumber != null && !typeNumber.isEmpty()) { return EntryType.byNumeric(Integer.parseInt(typeNumber)); } return EntryType.UNKNOWN; } public void setMedicationType(EntryType type){ setExtInfoStoredObjectByKey(EXT_FLD_MEDICATIONTYPE, Integer.toString(type.numericValue())); } public EntryType getDisposalType(){ String typeNumber = (String) getExtInfoStoredObjectByKey(EXT_FLD_DISPOSALTYPE); if (typeNumber != null && !typeNumber.isEmpty()) { return EntryType.byNumeric(Integer.parseInt(typeNumber)); } return EntryType.UNKNOWN; } public void setDisposalType(EntryType type){ setExtInfoStoredObjectByKey(EXT_FLD_DISPOSALTYPE, Integer.toString(type.numericValue())); } public Artikel getArticle(){ String articleString = get(FLD_ARTICLE); if (articleString != null && !articleString.isEmpty()) { String[] parts = articleString.split("\\$"); if (parts.length == 3) { PersistentObjectFactory factory = new PersistentObjectFactory(); PersistentObject ret = factory.createFromString(parts[2]); if (ret instanceof Artikel) { return (Artikel) ret; } } } return null; } public String getAtcCode(){ return get(FLD_ATC_CODE); } public String getSignatureFreeText(){ return (String) getExtInfoStoredObjectByKey(EXT_FLD_FREETEXT); } public void setSignatureFreeText(String text){ if (text == null) { text = ""; } setExtInfoStoredObjectByKey(EXT_FLD_FREETEXT, text); } public static class ArticleSignature { private ArticleDefaultSignature defaultSignature; private Artikel article; private String atcCode; private String morning; private String noon; private String evening; private String night; private String freeText; private String comment; private EntryType medicationType; private EntryType disposalType; public static ArticleSignature fromDefault(ArticleDefaultSignature defaultSignature){ ArticleSignature signature = new ArticleSignature(defaultSignature.getArticle(), defaultSignature.getAtcCode()); signature.setMorning(defaultSignature.getSignatureMorning()); signature.setNoon(defaultSignature.getSignatureNoon()); signature.setEvening(defaultSignature.getSignatureEvening()); signature.setNight(defaultSignature.getSignatureNight()); signature.setFreeText(defaultSignature.getSignatureFreeText()); signature.setComment(defaultSignature.getSignatureComment()); signature.setMedicationType(defaultSignature.getMedicationType()); signature.setDisposalType(defaultSignature.getDisposalType()); signature.defaultSignature = defaultSignature; return signature; } public ArticleSignature(Artikel article, String atcCode){ this.article = article; this.atcCode = atcCode; } public ArticleDefaultSignature toDefault(){ if (defaultSignature != null) { defaultSignature.setSignatureMorning(morning); defaultSignature.setSignatureNoon(noon); defaultSignature.setSignatureEvening(evening); defaultSignature.setSignatureNight(night); defaultSignature.setSignatureFreeText(freeText); defaultSignature.setSignatureComment(comment); if (medicationType != null) { defaultSignature.setMedicationType(medicationType); } if (disposalType != null) { defaultSignature.setDisposalType(disposalType); } if (atcCode != null && !atcCode.isEmpty()) { defaultSignature.set(FLD_ATC_CODE, atcCode); defaultSignature.set(FLD_ARTICLE, null); } else if (article != null) { defaultSignature.set(FLD_ATC_CODE, null); defaultSignature.set(FLD_ARTICLE, article.storeToString()); } } return defaultSignature; } public void delete(){ if (defaultSignature != null) { defaultSignature.delete(); } } public String getFreeText(){ return freeText; } public void setFreeText(String text){ this.freeText = text; } public String getMorning(){ return morning; } public void setMorning(String morning){ this.morning = morning; } public String getNoon(){ return noon; } public void setNoon(String noon){ this.noon = noon; } public String getEvening(){ return evening; } public void setEvening(String evening){ this.evening = evening; } public String getNight(){ return night; } public void setNight(String night){ this.night = night; } public String getSignatureAsDosisString(){ String freeText = getFreeText(); if (freeText != null && !freeText.isEmpty()) { return freeText; } String[] values = new String[] { morning, noon, evening, night }; StringBuilder sb = new StringBuilder(); if (signatureInfoExists(values)) { for (int i = 0; i < values.length; i++) { String string = values[i] == null || values[i].isEmpty() ? "0" : values[i]; if (i > 0) { sb.append("-"); } sb.append(string); } } return sb.toString(); } private boolean signatureInfoExists(String[] values){ for (String val : values) { if (val != null && !val.isEmpty()) { return true; } } return false; } public String getComment(){ return comment; } public void setComment(String comment){ this.comment = comment; } public EntryType getMedicationType(){ return medicationType; } public void setMedicationType(EntryType medicationType){ this.medicationType = medicationType; } public EntryType getDisposalType(){ return disposalType; } public void setDisposalType(EntryType disposalType){ this.disposalType = disposalType; } public void setAtcCode(String code){ this.atcCode = code; this.article = null; } public void setArticle(Artikel article){ this.article = article; this.atcCode = null; } public boolean isAtc(){ return (atcCode != null && !atcCode.isEmpty()); } public boolean isPersistent(){ return defaultSignature != null; } public void createPersistent(){ if (isPersistent()) { return; } if (isAtc()) { defaultSignature = new ArticleDefaultSignature(null, atcCode); } else { defaultSignature = new ArticleDefaultSignature(article, null); } } } }