/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs.module.xforms;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.kxml2.kdom.Element;
import org.openmrs.Location;
import org.openmrs.Patient;
import org.openmrs.PatientIdentifier;
import org.openmrs.PatientIdentifierType;
import org.openmrs.PersonAddress;
import org.openmrs.PersonAttribute;
import org.openmrs.PersonAttributeType;
import org.openmrs.PersonName;
import org.openmrs.api.PersonService;
import org.openmrs.api.context.Context;
import org.openmrs.module.xforms.util.DOMUtil;
import org.openmrs.module.xforms.util.XformsUtil;
import org.openmrs.util.OpenmrsConstants.PERSON_TYPE;
/**
*
* @author daniel
*
*/
public class XformPatientEdit {
private static final Log log = LogFactory.getLog(XformPatientEdit.class);
public static boolean isPatientElement(Element element){
return (element.getName().equalsIgnoreCase(XformBuilder.NODE_PATIENT) &&
String.valueOf(XformConstants.PATIENT_XFORM_FORM_ID).equals(element.getAttributeValue(null,(XformBuilder.ATTRIBUTE_ID))));
}
public static Patient getEditedPatient(HttpServletRequest request, Element rootNode) throws Exception {
XformObsEdit.retrieveSessionValues(request);
XformObsEdit.clearSessionData(request, XformConstants.PATIENT_XFORM_FORM_ID);
String patientId = XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_PATIENT_ID);
Patient patient = Context.getPatientService().getPatient(Integer.parseInt(patientId));
PersonName personName = patient.getPersonName();
personName.setFamilyName(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_FAMILY_NAME));
personName.setMiddleName(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_MIDDLE_NAME));
personName.setGivenName(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_GIVEN_NAME));
personName.setDateChanged(new Date());
personName.setChangedBy(Context.getAuthenticatedUser());
personName.setDegree(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_DEGREE));
personName.setFamilyName2(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_FAMILY_NAME2));
personName.setFamilyNamePrefix(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_FAMILY_NAME_PREFIX));
personName.setFamilyNameSuffix(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_FAMILY_NAME_SUFFIX));
personName.setPrefix(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_PREFIX));
String val = XformBuilder.getNodeValue(rootNode,XformBuilder.NODE_BIRTH_DATE);
try{
patient.setBirthdate(XformsUtil.fromSubmitString2Date(val));
} catch(Exception e){log.error(val,e); }
patient.setBirthdateEstimated("true".equals(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_BIRTH_DATE_ESTIMATED)));
patient.setGender(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_GENDER));
patient.setDateChanged(new Date());
patient.setChangedBy(Context.getAuthenticatedUser());
PatientIdentifier patientIdentifier = patient.getPatientIdentifier();
patientIdentifier.setIdentifier(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_IDENTIFIER));
Location location = Context.getLocationService().getLocation(Integer.parseInt(
XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_LOCATION_ID)));
patientIdentifier.setLocation(location);
PatientIdentifierType identifierType = Context.getPatientService().getPatientIdentifierType(
Integer.parseInt(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_IDENTIFIER_TYPE_ID)));
patientIdentifier.setIdentifierType(identifierType);
savePersonAttributes(patient,rootNode);
savePersonAddresses(patient,rootNode);
return patient;
}
private static void savePersonAddresses(Patient patient, Element rootNode) throws Exception {
boolean addressIsNew = false;
PersonAddress pa = patient.getPersonAddress();
if(pa == null){
pa = new PersonAddress();
pa.setDateCreated(new Date());
pa.setCreator(Context.getAuthenticatedUser());
pa.setPreferred(true);
addressIsNew = true;
}
pa.setAddress1(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_ADDRESS1));
pa.setAddress2(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_ADDRESS2));
pa.setCityVillage(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_CITY_VILLAGE));
pa.setStateProvince(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_STATE_PROVINCE));
pa.setPostalCode(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_POSTAL_CODE));
pa.setCountry(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_COUNTRY));
pa.setLatitude(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_LATITUDE));
pa.setLongitude(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_LONGITUDE));
pa.setCountyDistrict(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_COUNTY_DISTRICT));
pa.setNeighborhoodCell(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_NEIGHBORHOOD_CELL));
pa.setRegion(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_REGION));
pa.setSubregion(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_SUBREGION));
pa.setTownshipDivision(XformBuilder.getNodeValue(rootNode, XformBuilder.NODE_NAME_PREFIX_PERSON_ADDRESS + XformBuilder.NODE_NAME_TOWNSHIP_DIVISION));
if(addressIsNew){
if(pa.getAddress1() == null || pa.getAddress1().trim().length() == 0)
return;
patient.addAddress(pa);
}
}
private static void savePersonAttributes(Patient patient, Element rootNode) throws Exception {
List<String> complexObs = DOMUtil.getModelComplexObsNodeNames(XformConstants.PATIENT_XFORM_FORM_ID);
List<String> dirtyComplexObs = XformObsEdit.getEditedComplexObsNames();
PersonService personService = Context.getPersonService();
for (PersonAttributeType type : personService.getPersonAttributeTypes(PERSON_TYPE.PERSON, null)) {
String name = "person_attribute"+type.getPersonAttributeTypeId();
Element element = XformBuilder.getElement(rootNode,name);
if(element == null)
continue;
String value = XformBuilder.getTextValue(element);
if(complexObs.contains(name)){
if(!dirtyComplexObs.contains(name))
continue;
value = XformObsEdit.saveComplexObs(name,value,rootNode);
}
PersonAttribute personAttribute = patient.getAttribute(type.getPersonAttributeTypeId());
if(personAttribute == null){
personAttribute = new PersonAttribute();
personAttribute.setDateCreated(new Date());
personAttribute.setCreator(Context.getAuthenticatedUser());
personAttribute.setAttributeType(type);
//addAttribute will not add if value is not set.
personAttribute.setValue(value);
patient.addAttribute(personAttribute);
}
personAttribute.setValue(value);
if(value == null || value.length() == 0)
patient.removeAttribute(personAttribute);
}
}
}