/**
* The contents of this file are subject to the Mozilla Public License
* Version 1.1 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
* License for the specific language governing rights and limitations under
* the License.
*
* The Original Code is OpenELIS code.
*
* Copyright (C) ITECH, University of Washington, Seattle WA. All Rights Reserved.
*
*/
package us.mn.state.health.lims.dataexchange.order.action;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.validator.GenericValidator;
import org.hibernate.Transaction;
import us.mn.state.health.lims.common.services.PatientService;
import us.mn.state.health.lims.common.services.StatusService;
import us.mn.state.health.lims.common.services.StatusService.ExternalOrderStatus;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.dataexchange.order.dao.ElectronicOrderDAO;
import us.mn.state.health.lims.dataexchange.order.daoimpl.ElectronicOrderDAOImpl;
import us.mn.state.health.lims.dataexchange.order.valueholder.ElectronicOrder;
import us.mn.state.health.lims.hibernate.HibernateUtil;
import us.mn.state.health.lims.patient.daoimpl.PatientDAOImpl;
import us.mn.state.health.lims.patient.valueholder.Patient;
import us.mn.state.health.lims.patientidentity.dao.PatientIdentityDAO;
import us.mn.state.health.lims.patientidentity.daoimpl.PatientIdentityDAOImpl;
import us.mn.state.health.lims.patientidentity.valueholder.PatientIdentity;
import us.mn.state.health.lims.patientidentitytype.dao.PatientIdentityTypeDAO;
import us.mn.state.health.lims.patientidentitytype.daoimpl.PatientIdentityTypeDAOImpl;
import us.mn.state.health.lims.patientidentitytype.valueholder.PatientIdentityType;
import us.mn.state.health.lims.person.daoimpl.PersonDAOImpl;
import us.mn.state.health.lims.person.valueholder.Person;
import us.mn.state.health.lims.systemuser.daoimpl.SystemUserDAOImpl;
import us.mn.state.health.lims.systemuser.valueholder.SystemUser;
public class DBOrderPersister implements IOrderPersister{
private static final String SERVICE_USER_ID;
private static final String IDENTITY_GUID_ID;
private static final String IDENTITY_STNUMBER_ID;
private static final String IDENTITY_OBNUMBER_ID;
private static final String IDENTITY_PCNUMBER_ID;
private ElectronicOrderDAO eOrderDAO = new ElectronicOrderDAOImpl();
private Patient patient;
static{
SystemUser serviceUser = new SystemUserDAOImpl().getDataForLoginUser("serviceUser");
SERVICE_USER_ID = serviceUser == null ? null : serviceUser.getId();
PatientIdentityTypeDAO identityTypeDAO = new PatientIdentityTypeDAOImpl();
IDENTITY_GUID_ID = getIdentityType(identityTypeDAO, "GUID");
IDENTITY_STNUMBER_ID = getIdentityType(identityTypeDAO, "ST");
IDENTITY_OBNUMBER_ID = getIdentityType(identityTypeDAO, "OB_NUMBER");
IDENTITY_PCNUMBER_ID = getIdentityType(identityTypeDAO, "PC_NUMBER");
}
private static String getIdentityType(PatientIdentityTypeDAO identityTypeDAO, String name){
PatientIdentityType type = identityTypeDAO.getNamedIdentityType(name);
return type == null ? null : type.getId();
}
private void persist(MessagePatient orderPatient){
PatientService patientService = new PatientService(orderPatient.getGuid());
patient = patientService.getPatient();
if(patient == null){
createNewPatient(orderPatient);
}else{
updatePatient(orderPatient, patientService);
}
}
private void createNewPatient(MessagePatient orderPatient){
Person person = new Person();
person.setFirstName(orderPatient.getFirstName());
person.setLastName(orderPatient.getLastName());
person.setStreetAddress(orderPatient.getAddressStreet());
person.setCity(orderPatient.getAddressVillage());
person.setSysUserId(SERVICE_USER_ID);
patient = new Patient();
patient.setBirthDateForDisplay(orderPatient.getDisplayDOB());
patient.setGender(orderPatient.getGender());
patient.setNationalId(orderPatient.getNationalId());
patient.setPerson(person);
patient.setSysUserId(SERVICE_USER_ID);
List<PatientIdentity> identities = new ArrayList<PatientIdentity>();
addIdentityIfAppropriate(IDENTITY_GUID_ID, orderPatient.getGuid(), identities);
addIdentityIfAppropriate(IDENTITY_STNUMBER_ID, orderPatient.getStNumber(), identities);
addIdentityIfAppropriate(IDENTITY_OBNUMBER_ID, orderPatient.getObNumber(), identities);
addIdentityIfAppropriate(IDENTITY_PCNUMBER_ID, orderPatient.getPcNumber(), identities);
new PersonDAOImpl().insertData(person);
new PatientDAOImpl().insertData(patient);
PatientIdentityDAO identityDAO = new PatientIdentityDAOImpl();
for(PatientIdentity identity : identities){
identity.setPatientId(patient.getId());
identityDAO.insertData(identity);
}
}
private void addIdentityIfAppropriate(String typeId, String value, List<PatientIdentity> identities){
if(typeId != null && value != null){
PatientIdentity identity = new PatientIdentity();
identity.setIdentityData(value);
identity.setIdentityTypeId(typeId);
identity.setSysUserId(SERVICE_USER_ID);
identities.add(identity);
}
}
private void updatePatient(MessagePatient orderPatient, PatientService patientService){
Patient patient = patientService.getPatient();
Person person = patientService.getPerson();
updatePersonIfNeeded(orderPatient, patientService, person);
updatePatientIfNeeded(orderPatient, patientService, patient);
List<PatientIdentity> identityList = patientService.getIdentityList();
PatientIdentityDAO identityDAO = new PatientIdentityDAOImpl();
updateIdentityIfNeeded(IDENTITY_OBNUMBER_ID, orderPatient.getObNumber(), patient.getId(), identityList, identityDAO);
updateIdentityIfNeeded(IDENTITY_STNUMBER_ID, orderPatient.getStNumber(), patient.getId(), identityList, identityDAO);
updateIdentityIfNeeded(IDENTITY_PCNUMBER_ID, orderPatient.getPcNumber(), patient.getId(), identityList, identityDAO);
}
private void updateIdentityIfNeeded(String identityTypeId, String newIdentityValue, String patientId, List<PatientIdentity> identityList, PatientIdentityDAO identityDAO){
if(!GenericValidator.isBlankOrNull(newIdentityValue)){
boolean assigned = false;
for(PatientIdentity identity : identityList){
if(identity.getIdentityTypeId().equals(identityTypeId)){
if(!newIdentityValue.equals(identity.getIdentityData())){
identity.setIdentityData(newIdentityValue);
identity.setSysUserId(SERVICE_USER_ID);
identityDAO.updateData(identity);
}
assigned = true;
break;
}
}
if(!assigned){
PatientIdentity identity = new PatientIdentity();
identity.setIdentityTypeId(identityTypeId);
identity.setIdentityData(newIdentityValue);
identity.setPatientId(patientId);
identity.setSysUserId(SERVICE_USER_ID);
identityDAO.insertData(identity);
}
}
}
private void updatePatientIfNeeded(MessagePatient orderPatient, PatientService patientService, Patient patient){
boolean updatePatient = false;
if(needsUpdating(orderPatient.getDisplayDOB() , patientService.getBirthdayForDisplay() )){
patient.setBirthDateForDisplay(orderPatient.getDisplayDOB());
updatePatient = true;
}
if(needsUpdating(orderPatient.getGender(), patientService.getGender())){
patient.setGender(orderPatient.getGender());
updatePatient = true;
}
if(needsUpdating(orderPatient.getNationalId(), patientService.getNationalId())){
patient.setNationalId(orderPatient.getNationalId());
updatePatient = true;
}
if(updatePatient){
patient.setSysUserId(SERVICE_USER_ID);
new PatientDAOImpl().updateData(patient);
}
}
private void updatePersonIfNeeded(MessagePatient orderPatient, PatientService patientService, Person person){
boolean updatePerson = false;
if(needsUpdating(orderPatient.getFirstName(), patientService.getFirstName())){
person.setFirstName(orderPatient.getFirstName());
updatePerson = true;
}
if(needsUpdating(orderPatient.getLastName(), patientService.getLastName())){
person.setLastName(orderPatient.getLastName());
updatePerson = true;
}
if(needsUpdating(orderPatient.getAddressStreet(), patientService.getPerson().getStreetAddress())){
person.setStreetAddress(orderPatient.getAddressStreet());
updatePerson = true;
}
if(needsUpdating(orderPatient.getAddressVillage(), patientService.getPerson().getCity())){
person.setCity(orderPatient.getAddressVillage());
updatePerson = true;
}
if(updatePerson){
person.setSysUserId(SERVICE_USER_ID);
new PersonDAOImpl().updateData(person);
}
}
private boolean needsUpdating(String orderPatientValue, String currentPatientValue){
return !GenericValidator.isBlankOrNull(orderPatientValue) && StringUtil.compareWithNulls(currentPatientValue, orderPatientValue) != 0;
}
@Override
public void persist(MessagePatient orderPatient, ElectronicOrder eOrder){
Transaction tx = HibernateUtil.getSession().beginTransaction();
try{
persist(orderPatient);
eOrder.setPatient(patient);
eOrderDAO.insertData(eOrder);
tx.commit();
}catch(Exception e){
tx.rollback();
}
}
@Override
public String getServiceUserId(){
return SERVICE_USER_ID;
}
@Override
public void cancelOrder(String referringOrderNumber){
if(!GenericValidator.isBlankOrNull(referringOrderNumber)){
List<ElectronicOrder> eOrders = eOrderDAO.getElectronicOrdersByExternalId(referringOrderNumber);
if(eOrders != null && !eOrders.isEmpty()){
ElectronicOrder eOrder = eOrders.get(eOrders.size() - 1);
eOrder.setStatusId(StatusService.getInstance().getStatusID(ExternalOrderStatus.Cancelled));
eOrder.setSysUserId(SERVICE_USER_ID);
Transaction tx = HibernateUtil.getSession().beginTransaction();
try{
eOrderDAO.updateData(eOrder);
tx.commit();
}catch(Exception e){
tx.rollback();
}
}
}
}
}