/*
* 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.sample.action.util;
import org.apache.commons.validator.GenericValidator;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMessages;
import us.mn.state.health.lims.address.valueholder.OrganizationAddress;
import us.mn.state.health.lims.common.formfields.FormFields;
import us.mn.state.health.lims.common.formfields.FormFields.Field;
import us.mn.state.health.lims.common.provider.validation.IAccessionNumberValidator;
import us.mn.state.health.lims.common.services.ObservationHistoryService;
import us.mn.state.health.lims.common.services.ObservationHistoryService.ObservationType;
import us.mn.state.health.lims.common.services.SampleAddService;
import us.mn.state.health.lims.common.services.SampleAddService.SampleTestCollection;
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.services.StatusService.OrderStatus;
import us.mn.state.health.lims.common.services.TableIdService;
import us.mn.state.health.lims.common.util.ConfigurationProperties;
import us.mn.state.health.lims.common.util.ConfigurationProperties.Property;
import us.mn.state.health.lims.common.util.DateUtil;
import us.mn.state.health.lims.common.util.StringUtil;
import us.mn.state.health.lims.common.util.SystemConfiguration;
import us.mn.state.health.lims.common.util.validator.ActionError;
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.observationhistory.valueholder.ObservationHistory;
import us.mn.state.health.lims.observationhistory.valueholder.ObservationHistory.ValueType;
import us.mn.state.health.lims.organization.dao.OrganizationDAO;
import us.mn.state.health.lims.organization.daoimpl.OrganizationDAOImpl;
import us.mn.state.health.lims.organization.valueholder.Organization;
import us.mn.state.health.lims.patient.util.PatientUtil;
import us.mn.state.health.lims.person.valueholder.Person;
import us.mn.state.health.lims.provider.valueholder.Provider;
import us.mn.state.health.lims.requester.valueholder.SampleRequester;
import us.mn.state.health.lims.sample.bean.SampleOrderItem;
import us.mn.state.health.lims.sample.util.AccessionNumberUtil;
import us.mn.state.health.lims.sample.valueholder.Sample;
import us.mn.state.health.lims.samplehuman.valueholder.SampleHuman;
import java.util.ArrayList;
import java.util.List;
/**
*/
public class SamplePatientUpdateData{
private boolean savePatient = false;
private Person providerPerson;
private Provider provider;
private String patientId;
private String accessionNumber;
private Sample sample;
private SampleHuman sampleHuman = new SampleHuman();
private SampleRequester requesterSite;
private List<SampleTestCollection> sampleItemsTests;
private SampleAddService sampleAddService;
private ActionMessages patientErrors;
private Organization newOrganization;
private Organization currentOrganization;
private ElectronicOrder electronicOrder = null;
private boolean useReceiveDateForCollectionDate = !FormFields.getInstance().useField( Field.CollectionDate);
private String collectionDateFromReceiveDate = null;
private OrganizationDAO orgDAO = new OrganizationDAOImpl();
private ElectronicOrderDAO electronicOrderDAO = new ElectronicOrderDAOImpl();
private List<ObservationHistory> observations = new ArrayList<ObservationHistory>();
private List<OrganizationAddress> orgAddressExtra = new ArrayList<OrganizationAddress>();
private final String currentUserId;
public SamplePatientUpdateData(String currentUserId){
this.currentUserId = currentUserId;
}
public boolean isSavePatient(){
return savePatient;
}
public void setSavePatient( boolean savePatient ){
this.savePatient = savePatient;
}
public Person getProviderPerson(){
return providerPerson;
}
public void setProviderPerson( Person providerPerson ){
this.providerPerson = providerPerson;
}
public Provider getProvider(){
return provider;
}
public void setProvider( Provider provider ){
this.provider = provider;
}
public String getPatientId(){
return patientId;
}
public void setPatientId( String patientId ){
this.patientId = patientId;
}
public String getAccessionNumber(){
return accessionNumber;
}
public void setAccessionNumber( String accessionNumber ){
this.accessionNumber = accessionNumber;
}
public Sample getSample(){
return sample;
}
public void setSample( Sample sample ){
this.sample = sample;
}
public SampleHuman getSampleHuman(){
return sampleHuman;
}
public void setSampleHuman( SampleHuman sampleHuman ){
this.sampleHuman = sampleHuman;
}
public SampleRequester getRequesterSite(){
return requesterSite;
}
public void setRequesterSite( SampleRequester requesterSite ){
this.requesterSite = requesterSite;
}
public List<SampleTestCollection> getSampleItemsTests(){
return sampleItemsTests;
}
public void setSampleItemsTests( List<SampleTestCollection> sampleItemsTests ){
this.sampleItemsTests = sampleItemsTests;
}
public SampleAddService getSampleAddService(){
return sampleAddService;
}
public void setSampleAddService( SampleAddService sampleAddService ){
this.sampleAddService = sampleAddService;
}
public void setPatientErrors( ActionMessages patientErrors ){
this.patientErrors = patientErrors;
}
public Organization getNewOrganization(){
return newOrganization;
}
public void setNewOrganization( Organization newOrganization ){
this.newOrganization = newOrganization;
}
public Organization getCurrentOrganization(){
return currentOrganization;
}
public ElectronicOrder getElectronicOrder(){
return electronicOrder;
}
public void setCollectionDateFromRecieveDateIfNeeded( String collectionDateFromRecieveDate ){
if( useReceiveDateForCollectionDate){
this.collectionDateFromReceiveDate = collectionDateFromRecieveDate;
}
}
public List<ObservationHistory> getObservations(){
return observations;
}
public List<OrganizationAddress> getOrgAddressExtra(){
return orgAddressExtra;
}
public String getCurrentUserId(){
return currentUserId;
}
public void addOrgAddressExtra(String value, String type, String addressPart) {
if (!GenericValidator.isBlankOrNull( value )) {
OrganizationAddress orgAddress = new OrganizationAddress();
orgAddress.setSysUserId(currentUserId);
orgAddress.setType(type);
orgAddress.setValue(value);
orgAddress.setAddressPartId(addressPart);
orgAddressExtra.add(orgAddress);
}
}
public void createObservation(String observationData, String observationType, ObservationHistory.ValueType valueType) {
if (!GenericValidator.isBlankOrNull(observationData) && !GenericValidator.isBlankOrNull(observationType)) {
ObservationHistory observation = new ObservationHistory();
observation.setObservationHistoryTypeId(observationType);
observation.setSysUserId(currentUserId);
observation.setValue(observationData);
observation.setValueType(valueType);
observations.add(observation);
}
}
public void validateSample(ActionMessages errors) {
// assure accession number
//TODO
IAccessionNumberValidator.ValidationResults result = AccessionNumberUtil.checkAccessionNumberValidity( accessionNumber, null, null, null );
if (result != IAccessionNumberValidator.ValidationResults.SUCCESS) {
String message = AccessionNumberUtil.getInvalidMessage(result);
errors.add( ActionErrors.GLOBAL_MESSAGE, new ActionError(message));
}
// assure that there is at least 1 sample
if (sampleItemsTests.isEmpty()) {
errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.no.sample"));
}
// assure that all samples have tests
if (!allSamplesHaveTests()) {
errors.add(ActionErrors.GLOBAL_MESSAGE, new ActionError("errors.samples.with.no.tests"));
}
// check patient errors
if (patientErrors.size(ActionErrors.GLOBAL_MESSAGE) > 0) {
errors.add(patientErrors);
}
}
private boolean allSamplesHaveTests() {
for (SampleTestCollection sampleTest : sampleItemsTests) {
if (sampleTest.tests.size() == 0) {
return false;
}
}
return true;
}
public void createPopulatedSample( String receivedDate, SampleOrderItem sampleOrder) {
sample = new Sample();
sample.setSysUserId(currentUserId);
sample.setAccessionNumber(accessionNumber);
sample.setEnteredDate( DateUtil.getNowAsSqlDate());
sample.setReceivedTimestamp(DateUtil.convertStringDateToTimestamp(receivedDate));
sample.setReferringId( sampleOrder.getRequesterSampleID() );
if (useReceiveDateForCollectionDate) {
sample.setCollectionDateForDisplay( collectionDateFromReceiveDate );
}
sample.setDomain( SystemConfiguration.getInstance().getHumanDomain());
sample.setStatusId( StatusService.getInstance().getStatusID(OrderStatus.Entered));
setElectronicOrderIfNeeded( sampleOrder );
}
private void setElectronicOrderIfNeeded( SampleOrderItem sampleOrder ){
electronicOrder = null;
String externalOrderNumber = sampleOrder.getExternalOrderNumber();
if( !GenericValidator.isBlankOrNull(externalOrderNumber)){
List<ElectronicOrder> orders = electronicOrderDAO.getElectronicOrdersByExternalId(externalOrderNumber);
if( !orders.isEmpty()){
electronicOrder = orders.get(orders.size() - 1);
electronicOrder.setStatusId(StatusService.getInstance().getStatusID(ExternalOrderStatus.Realized));
electronicOrder.setSysUserId(currentUserId);
sample.setReferringId(externalOrderNumber);
sample.setClinicalOrderId(electronicOrder.getId());
}
}
}
public void initProvider(SampleOrderItem sampleOrder) {
providerPerson = null;
if (noRequesterInformation(sampleOrder)){
provider = PatientUtil.getUnownProvider();
} else {
providerPerson = new Person();
provider = new Provider();
providerPerson.setFirstName(sampleOrder.getProviderFirstName());
providerPerson.setLastName(sampleOrder.getProviderLastName());
providerPerson.setWorkPhone(sampleOrder.getProviderWorkPhone());
providerPerson.setFax(sampleOrder.getProviderFax());
providerPerson.setEmail(sampleOrder.getProviderEmail());
providerPerson.setSysUserId(currentUserId);
provider.setExternalId(sampleOrder.getRequesterSampleID());
}
provider.setSysUserId(currentUserId);
}
private boolean noRequesterInformation( SampleOrderItem sampleOrder){
return (GenericValidator.isBlankOrNull(sampleOrder.getProviderFirstName()) &&
GenericValidator.isBlankOrNull(sampleOrder.getProviderWorkPhone()) &&
GenericValidator.isBlankOrNull(sampleOrder.getProviderLastName()) &&
GenericValidator.isBlankOrNull(sampleOrder.getRequesterSampleID()) &&
GenericValidator.isBlankOrNull(sampleOrder.getProviderFax()) &&
GenericValidator.isBlankOrNull(sampleOrder.getProviderEmail()));
}
public void buildSampleHuman(){
sampleHuman.setSysUserId(currentUserId);
sampleHuman.setSampleId(sample.getId());
sampleHuman.setPatientId(patientId);
if (provider != null) {
sampleHuman.setProviderId(provider.getId());
}
}
public void initializeNewOrganization( SampleOrderItem orderItem ){
newOrganization.setCode(orderItem.getReferringSiteCode());
newOrganization.setIsActive("Y");
newOrganization.setOrganizationName(orderItem.getNewRequesterName());
// this was left as a warning for copy and paste -- it causes a null
// pointer exception in session.flush()
// newOrganization.setOrganizationTypes(ORG_TYPE_SET);
newOrganization.setSysUserId(currentUserId);
newOrganization.setMlsSentinelLabFlag("N");
}
public void updateCurrentOrgIfNeeded(String code, String orgId){
currentOrganization = orgDAO.getOrganizationById(orgId);
if( StringUtil.compareWithNulls( code, currentOrganization.getCode() ) != 0){
currentOrganization.setCode(code);
currentOrganization.setSysUserId(currentUserId);
}else{
currentOrganization = null;
}
}
public void initializeRequester( SampleOrderItem sampleOrder ){
if ( FormFields.getInstance().useField( Field.RequesterSiteList )) {
setRequesterSite( initSampleRequester( sampleOrder ) );
}
}
private SampleRequester initSampleRequester( SampleOrderItem orderItem ) {
SampleRequester requester = null;
String orgId = orderItem.getReferringSiteId();
if (!GenericValidator.isBlankOrNull(orgId)) {
requester = createSiteRequester(orgId);
if( FormFields.getInstance().useField(Field.SampleEntryReferralSiteCode)){
updateCurrentOrgIfNeeded( orderItem.getReferringSiteCode(), orgId );
}
} else if (!GenericValidator.isBlankOrNull(orderItem.getNewRequesterName())) {
//will be corrected after newOrg is persisted
requester = createSiteRequester("0");
setNewOrganization( new Organization() );
if (FormFields.getInstance().useField(Field.SampleEntryHealthFacilityAddress)) {
addOrgAddressExtra( orderItem.getFacilityPhone(), "T", TableIdService.ADDRESS_PHONE_ID );
addOrgAddressExtra( orderItem.getFacilityFax(), "T", TableIdService.ADDRESS_FAX_ID );
addOrgAddressExtra( orderItem.getFacilityAddressCommune(), "T", TableIdService.ADDRESS_COMMUNE_ID );
addOrgAddressExtra( orderItem.getFacilityAddressStreet(), "T", TableIdService.ADDRESS_STREET_ID );
}
initializeNewOrganization( orderItem );
}
return requester;
}
private SampleRequester createSiteRequester(String orgId) {
SampleRequester requester;
requester = new SampleRequester();
requester.setRequesterId(orgId);
requester.setRequesterTypeId(TableIdService.ORGANIZATION_REQUESTER_TYPE_ID);
requester.setSysUserId(currentUserId);
return requester;
}
public void initSampleData(String sampleXML, String receivedDate, boolean trackPayments, SampleOrderItem sampleOrder
) {
createPopulatedSample( receivedDate, sampleOrder );
addObservations(sampleOrder, trackPayments);
SampleAddService sampleAddService = new SampleAddService(sampleXML, currentUserId, getSample(), receivedDate);
setSampleItemsTests( sampleAddService.createSampleTestCollection() );
setSampleAddService( sampleAddService );
}
private void addObservations( SampleOrderItem sampleOrder, boolean trackPayments ) {
if (trackPayments) {
createObservation( sampleOrder.getPaymentOptionSelection(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.PAYMENT_STATUS ), ValueType.DICTIONARY );
}
createObservation( sampleOrder.getRequestDate(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.REQUEST_DATE ), ValueType.LITERAL );
createObservation( sampleOrder.getNextVisitDate(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.NEXT_VISIT_DATE ), ValueType.LITERAL );
createObservation( sampleOrder.getTestLocationCode(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.TEST_LOCATION_CODE ), ValueType.DICTIONARY );
createObservation( sampleOrder.getOtherLocationCode(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.TEST_LOCATION_CODE_OTHER ), ValueType.LITERAL );
createObservation( sampleOrder.getReferringPatientNumber(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.REFERRERS_PATIENT_ID ), ValueType.LITERAL );
if( ConfigurationProperties.getInstance().isPropertyValueEqual( Property.USE_BILLING_REFERENCE_NUMBER, "true" )){
createObservation( sampleOrder.getBillingReferenceNumber(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.BILLING_REFERENCE_NUMBER ), ValueType.LITERAL );
}
if( ConfigurationProperties.getInstance().isPropertyValueEqual( Property.ORDER_PROGRAM, "true" )){
createObservation( sampleOrder.getProgram(), ObservationHistoryService.getObservationTypeIdForType( ObservationType.PROGRAM ), ValueType.DICTIONARY );
}
}
}