/******************************************************************************* * Copyright (c) 2005-2009, G. Weirich and Elexis * 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.data; import ch.elexis.core.constants.StringConstants; import ch.elexis.core.model.ICodeElement; import ch.elexis.core.types.Gender; import ch.rgw.tools.JdbcLink; import ch.rgw.tools.StringTool; import ch.rgw.tools.TimeTool; /** * Eine Person ist ein Kontakt mit zusätzlich Namen, Geburtsdatum und Geschlecht. * * @author gerry * */ public class Person extends Kontakt { // If you add new fields, please be sure to update KontakteView.java tidySelectedAddressesAction // (and, most probably, other places) public static final String TITLE = "Titel"; //$NON-NLS-1$ public static final String FLD_TITLE_SUFFIX = "TitelSuffix"; //$NON-NLS-1$ public static final String MOBILE = "Natel"; //$NON-NLS-1$ public static final String SEX = "Geschlecht"; //$NON-NLS-1$ public static final String BIRTHDATE = "Geburtsdatum"; //$NON-NLS-1$ public static final String FIRSTNAME = "Vorname"; //$NON-NLS-1$ public static final String NAME = "Name"; //$NON-NLS-1$ public static final String MALE = "m"; //$NON-NLS-1$ public static final String FEMALE = "w"; //$NON-NLS-1$ static { addMapping(Kontakt.TABLENAME, NAME + "=" + Kontakt.FLD_NAME1, FIRSTNAME + "=" + Kontakt.FLD_NAME2, "Zusatz =" + Kontakt.FLD_NAME3, BIRTHDATE + "= S:D:Geburtsdatum", SEX, MOBILE + "=NatelNr", //$NON-NLS-1$ //$NON-NLS-2$ Kontakt.FLD_IS_PERSON, TITLE, FLD_TITLE_SUFFIX); } public String getName(){ return checkNull(get(NAME)); } public String getVorname(){ return checkNull(get(FIRSTNAME)); } public String getGeburtsdatum(){ return checkNull(get(BIRTHDATE)); } public String getGeschlecht(){ return checkNull(get(SEX)); } public Gender getGender() { return Gender.fromValue(getGeschlecht().toUpperCase()); } public String getNatel(){ return get(MOBILE); } public boolean isValid(){ return super.isValid(); } /** Eine Person mit gegebener Id aus der Datenbank einlesen */ public static Person load(String id){ Person ret = new Person(id); return ret; } protected Person(String id){ super(id); } public Person(){ // System.out.println("Person"); } /** Eine neue Person erstellen */ public Person(String Name, String Vorname, String Geburtsdatum, String s){ create(null); // String[] vals=new String[]{Name,Vorname,new // TimeTool(Geburtsdatum).toString(TimeTool.DATE_COMPACT),s}; String[] vals = new String[] { Name, Vorname, Geburtsdatum, s }; String[] fields = new String[] { NAME, FIRSTNAME, BIRTHDATE, SEX }; set(fields, vals); } /** * This constructor is more critical than the previous one * * @param name * will be checked for non-alphabetic characters and may not be empty * @param vorname * will be checked for non alphabetic characters but may be empty * @param gebDat * will be checked for unplausible values but may be null * @param s * will be checked for undefined values and may not be empty * @throws PersonDataException */ public Person(String name, String vorname, TimeTool gebDat, String s) throws PersonDataException{ name = name.trim(); vorname = vorname.trim(); if ((StringTool.isNothing(name)) || (!name.matches("[" + StringTool.wordChars + "\\s-]+"))) { //$NON-NLS-1$ //$NON-NLS-2$ throw new PersonDataException(PersonDataException.CAUSE.LASTNAME); } if ((!StringTool.isNothing(vorname)) && (!vorname.matches("[" + StringTool.wordChars + "\\s-]+"))) { //$NON-NLS-1$ //$NON-NLS-2$ throw new PersonDataException(PersonDataException.CAUSE.FIRSTNAME); } String dat = StringTool.leer; if (gebDat != null) { TimeTool now = new TimeTool(); int myYear = now.get(TimeTool.YEAR); int oYear = gebDat.get(TimeTool.YEAR); if (oYear > myYear || oYear < myYear - 120) { throw new PersonDataException(PersonDataException.CAUSE.BIRTHDATE); } dat = gebDat.toString(TimeTool.DATE_COMPACT); } if (!s.equalsIgnoreCase(Person.MALE) && !s.equalsIgnoreCase(Person.FEMALE)) { throw new PersonDataException(PersonDataException.CAUSE.SEX); } create(null); String[] fields = new String[] { NAME, FIRSTNAME, BIRTHDATE, SEX }; String[] vals = new String[] { name, vorname, dat, s }; set(fields, vals); } /** * Return a short or long label for this Person * * @return a label describing this Person */ public String getLabel(boolean shortLabel){ StringBuilder sb = new StringBuilder(); if (shortLabel) { sb.append(getVorname()).append(StringTool.space).append(getName()); return sb.toString(); } else { return getPersonalia(); } } /** * Initialen holen * * @param num * Auf wieviele Stellen der Name gekürzt werden soll */ public String getInitials(int num){ StringBuilder ret = new StringBuilder(); String name = getName(); String vorname = getVorname(); String sex = getGeschlecht(); String geb = getGeburtsdatum(); if (geb.length() > 7) { geb = geb.substring(6); } ret.append((name.length() > num - 1) ? name.substring(0, num) : name).append("."); ret.append((vorname.length() > num - 1) ? vorname.substring(0, num) : vorname).append(".(") .append(sex).append("), ").append(geb); return ret.toString(); } /* * Einen String mit den Personalien holen. * * Ein allfälliger Titel wie Dr. med. kommt nach Name und Vorname, damit die Suche bei der * Patientsicht nach Namen und Person funktioniert */ public String getPersonalia(){ StringBuffer ret = new StringBuffer(200); String[] fields = new String[] { NAME, FIRSTNAME, BIRTHDATE, SEX, TITLE }; String[] vals = new String[fields.length]; get(fields, vals); ret.append(vals[0]); if (!StringTool.isNothing(vals[1])) { ret.append(StringTool.space).append(vals[1]); } if (StringTool.isNothing(vals[3])) { ret.append(StringTool.space); } else { ret.append(StringTool.space + "(").append(vals[3]).append(")," + StringTool.space); } if (!StringTool.isNothing(vals[2])) { ret.append(new TimeTool(vals[2]).toString(TimeTool.DATE_GER)); } if (!StringTool.isNothing(vals[4])) { ret.append("," + StringTool.space).append(vals[4]); } return ret.toString(); } @Override protected String getConstraint(){ return new StringBuilder(Kontakt.FLD_IS_PERSON).append(StringTool.equals) .append(JdbcLink.wrap(StringConstants.ONE)).toString(); } @Override protected void setConstraint(){ set(Kontakt.FLD_IS_PERSON, StringConstants.ONE); } /** * Statistik für ein bestimmtes Objekt führen * * @param ice */ public void countItem(ICodeElement ice){ statForItem((PersistentObject) ice); } @SuppressWarnings("serial") public static class PersonDataException extends Exception { enum CAUSE { LASTNAME, FIRSTNAME, BIRTHDATE, SEX } static final String[] causes = new String[] { NAME, FIRSTNAME, BIRTHDATE, "Geschlecht (m oder w)"}; //$NON-NLS-1$ public CAUSE cause; PersonDataException(CAUSE cause){ super(causes[cause.ordinal()]); this.cause = cause; } } }