/*******************************************************************************
* Copyright (c) 2006-2010, 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.core.ui.exchange.elements;
import java.util.List;
import ch.elexis.core.model.IPersistentObject;
import ch.elexis.core.ui.exchange.KontaktMatcher;
import ch.elexis.core.ui.exchange.XChangeExporter;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Organisation;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Person;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
/**
* A Contact can contain elements of the types address, connection, and medical
*
* @author Gerry
*
*/
@SuppressWarnings("serial")
public class ContactElement extends XChangeElement {
public static final String XMLNAME = "contact"; //$NON-NLS-1$
public static final String ATTR_BIRTHDATE = "birthdate"; //$NON-NLS-1$
public static final String ATTR_FIRSTNAME = "firstname"; //$NON-NLS-1$
public static final String ATTR_MIDDLENAME = "middlename"; //$NON-NLS-1$
public static final String ATTR_LASTNAME = "lastname"; //$NON-NLS-1$
public static final String ATTR_SEX = "sex"; //$NON-NLS-1$
public static final String ATTR_SALUTATION = "salutation"; //$NON-NLS-1$
public static final String ATTR_TITLE = "title"; //$NON-NLS-1$
public static final String ATTR_TYPE = "type"; //$NON-NLS-1$
public static final String ATTR_SHORTNAME = "shortname"; //$NON-NLS-1$
public static final String ELEM_XID = "xid"; //$NON-NLS-1$
public static final String ELEM_ADDRESS = "address"; //$NON-NLS-1$
public static final String VALUE_PERSON = "person"; //$NON-NLS-1$
public static final String VALUE_ORGANIZATION = "organization"; //$NON-NLS-1$
public static final String VALUE_MALE = "male"; //$NON-NLS-1$
public static final String VALUE_FEMALE = "female"; //$NON-NLS-1$
public void add(AddressElement ae){
super.add(ae);
}
public void add(ContactRefElement ce){
super.add(ce);
}
public void add(MedicalElement me){
super.add(me);
}
public List<AddressElement> getAddresses(){
return (List<AddressElement>) getChildren(ELEM_ADDRESS, AddressElement.class);
}
public ContactElement asExporter(XChangeExporter parent, Kontakt k){
asExporter(parent);
XidElement eXid = new XidElement().asExporter(parent, k);
add(eXid);
if (k.istPerson()) {
Person p = Person.load(k.getId());
setAttribute(ATTR_TYPE, VALUE_PERSON);
setAttribute(ATTR_LASTNAME, p.getName());
setAttribute(ATTR_FIRSTNAME, p.getVorname());
if (p.getGeschlecht().equals(Person.MALE)) { //$NON-NLS-1$
setAttribute(ATTR_SEX, VALUE_MALE);
} else {
setAttribute(ATTR_SEX, VALUE_FEMALE);
}
String gebdat = p.getGeburtsdatum();
if (!StringTool.isNothing(gebdat)) {
setAttribute(ATTR_BIRTHDATE, new TimeTool(gebdat).toString(TimeTool.DATE_ISO));
}
} else {
setAttribute(ATTR_TYPE, VALUE_ORGANIZATION);
setAttribute(ATTR_LASTNAME, k.getLabel());
}
add(new AddressElement().asExporter(parent, k.getAnschrift(), "default")); //$NON-NLS-1$
parent.getContainer().addMapping(this, k);
return this;
}
public List<ContactRefElement> getAssociations(){
List<ContactRefElement> ret =
(List<ContactRefElement>) getChildren("connection", ContactRefElement.class); //$NON-NLS-1$
return ret;
}
public String toString(){
StringBuilder sb = new StringBuilder();
sb.append(Messages.ContactElement_Name).append(getAttr(ATTR_LASTNAME))
.append(StringTool.lf); //$NON-NLS-1$
sb.append(Messages.ContactElement_vorname).append(getAttr(ATTR_FIRSTNAME)); //$NON-NLS-1$
String middle = getAttr(ATTR_MIDDLENAME);
if (middle.length() > 0) {
sb.append(StringTool.space).append(middle);
}
sb.append(Messages.ContactElement_gebdat); //$NON-NLS-1$
TimeTool geb = new TimeTool(getAttr(ATTR_BIRTHDATE));
sb.append(geb.toString(TimeTool.DATE_GER)).append(StringTool.lf);
sb.append("PID: ").append(getAttr(ATTR_ID)).append(StringTool.lf + StringTool.lf); //$NON-NLS-1$
List<AddressElement> addresses = getAddresses();
for (AddressElement adr : addresses) {
sb.append(adr.toString()).append(StringTool.lf);
}
return sb.toString();
}
@Override
public String getXMLName(){
return XMLNAME;
}
public PersistentObject doImport(PersistentObject context){
XidElement eXid = getXid();
Kontakt ret = null;
if (eXid != null) {
List<IPersistentObject> cands = eXid.findObject();
if (cands.size() == 0) {
AddressElement ae = null;
List<AddressElement> lae = getAddresses();
if (lae.size() > 0) {
if (lae.size() == 1) {
ae = lae.get(0);
} else {
for (AddressElement adr : lae) {
if (adr.getAttr(AddressElement.ATTR_DESCRIPTION).equalsIgnoreCase(
AddressElement.VALUE_DEFAULT)) {
ae = adr;
break;
}
}
if (ae == null) {
ae = lae.get(0);
}
}
}
String strasse = null;
String plz = null;
String ort = null;
String natel = null;
if (ae != null) {
strasse = ae.getAttr(AddressElement.ATTR_STREET);
plz = ae.getAttr(AddressElement.ATTR_ZIP);
ort = ae.getAttr(AddressElement.ATTR_CITY);
}
if (getAttr(ATTR_TYPE).equalsIgnoreCase(VALUE_PERSON)) {
String s = getAttr(ATTR_SEX).equals(VALUE_MALE) ? Person.MALE : Person.FEMALE;
ret =
KontaktMatcher.findPerson(getAttr(ATTR_LASTNAME), getAttr(ATTR_FIRSTNAME),
getAttr(ATTR_BIRTHDATE), s, strasse, plz, ort, natel,
KontaktMatcher.CreateMode.CREATE);
} else {
ret =
KontaktMatcher.findOrganisation(getAttr(ATTR_LASTNAME),
getAttr(ATTR_FIRSTNAME), strasse, plz, ort,
KontaktMatcher.CreateMode.CREATE);
}
} else if (cands.size() == 1) {
if (getAttr(ATTR_TYPE).equalsIgnoreCase(VALUE_PERSON)) {
ret = Person.load(cands.get(0).getId());
} else {
ret = Organisation.load(cands.get(0).getId());
}
}
MedicalElement me =
(MedicalElement) getChild(MedicalElement.XMLNAME, MedicalElement.class);
me.doImport(ret);
}
return ret;
}
}