/*
* PatientView
*
* Copyright (c) Worth Solutions Limited 2004-2013
*
* This file is part of PatientView.
*
* PatientView is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3 of the License,
* or (at your option) any later version.
* PatientView is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License along with PatientView in a file
* titled COPYING. If not, see <http://www.gnu.org/licenses/>.
*
* @package PatientView
* @link http://www.patientview.org
* @author PatientView <info@patientview.org>
* @copyright Copyright (c) 2004-2013, Worth Solutions Limited
* @license http://www.gnu.org/licenses/gpl-3.0.html The GNU General Public License V3.0
*/
package org.patientview.service.impl;
import org.patientview.model.Patient;
import org.patientview.model.Unit;
import org.patientview.patientview.PatientDetails;
import org.patientview.patientview.logging.AddLog;
import org.patientview.patientview.model.UserMapping;
import org.patientview.patientview.uktransplant.UktUtils;
import org.patientview.repository.PatientDao;
import org.patientview.service.DiagnosisManager;
import org.patientview.service.EdtaCodeManager;
import org.patientview.service.LetterManager;
import org.patientview.service.MedicineManager;
import org.patientview.service.PatientManager;
import org.patientview.service.SecurityUserManager;
import org.patientview.service.TestResultManager;
import org.patientview.service.UnitManager;
import org.patientview.service.UserManager;
import org.patientview.utils.LegacySpringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.inject.Inject;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
@Service(value = "patientManager")
public class PatientManagerImpl implements PatientManager {
@Inject
private PatientDao patientDao;
@Inject
private SecurityUserManager securityUserManager;
@Inject
private UserManager userManager;
@Inject
private UnitManager unitManager;
@Inject
private EdtaCodeManager edtaCodeManager;
@Inject
private DiagnosisManager diagnosisManager;
@Inject
private TestResultManager testResultManager;
@Inject
private LetterManager letterManager;
@Inject
private MedicineManager medicineManager;
@Override
public Patient get(String nhsno, String unitcode) {
return patientDao.get(nhsno, unitcode);
}
@Override
public Patient get(Long id) {
return patientDao.get(id);
}
@Override
public void save(Patient patient) {
patientDao.save(patient);
}
@Override
public void delete(String nhsno, String unitcode) {
patientDao.delete(nhsno, unitcode);
}
@Override
public void removePatientFromSystem(String nhsno, String unitcode) {
// remove all the patiens content
testResultManager.deleteTestResults(nhsno, unitcode);
letterManager.delete(nhsno, unitcode);
medicineManager.delete(nhsno, unitcode);
diagnosisManager.deleteOtherDiagnoses(nhsno, unitcode);
// finally remove the patient
delete(nhsno, unitcode);
}
@Override
public List<Patient> get(String unitCode) {
return patientDao.get(unitCode);
}
@Override
public List<Patient> getByNhsNo(String nhsNo) {
return patientDao.getByNhsNo(nhsNo);
}
public Patient getRadarPatient(String nhsNo) {
return patientDao.getRadarPatient(nhsNo);
}
@Override
public List getUnitPatientsWithTreatment(String unitcode, String nhsno, String name, boolean showgps) {
return patientDao.getUnitPatientsWithTreatmentDao(unitcode, nhsno, name, showgps,
securityUserManager.getLoggedInSpecialty());
}
@Override
public List getAllUnitPatientsWithTreatment(String nhsno, String name, boolean showgps) {
return patientDao.getAllUnitPatientsWithTreatmentDao(nhsno, name, showgps,
securityUserManager.getLoggedInSpecialty());
}
@Override
public List getUnitPatientsAllWithTreatmentDao(String unitcode) {
return patientDao.getUnitPatientsAllWithTreatmentDao(unitcode, securityUserManager.getLoggedInSpecialty());
}
@Override
public List<Patient> getUktPatients() {
return patientDao.getUktPatients();
}
/**
* Get all patient records that are associated with this user
* @param username of user
* @return a list of 'mini' objects based on patient records
*/
@Override
public List<PatientDetails> getPatientDetails(String username) {
// our results list
List<PatientDetails> patientDetails = new ArrayList<PatientDetails>();
// Get a set of nhs numbers associated with this user via the user mappings table
Set<String> nhsNumbersAssociatedWithUser = new HashSet<String>();
List<UserMapping> userMappings = userManager.getUserMappings(username);
if (!CollectionUtils.isEmpty(userMappings)) {
for (UserMapping userMapping : userMappings) {
nhsNumbersAssociatedWithUser.add(userMapping.getNhsno());
}
}
// get a set of patient records for these nhs numbers, including patients added by Radar
for (String nhsNumber : nhsNumbersAssociatedWithUser) {
for (Patient patient : getByNhsNo(nhsNumber)) {
patientDetails.add(createPatientDetails(patient, unitManager.get(patient.getUnitcode())));
AddLog.addLog(LegacySpringUtils.getSecurityUserManager().getLoggedInUsername(),
AddLog.PATIENT_VIEW, "", patient.getNhsno(),
patient.getUnitcode(), "");
}
}
return patientDetails;
}
@Override
public List<PatientDetails> getPatientDetails(Long id) {
Patient patient = get(id);
List<PatientDetails> patientDetails = new ArrayList<PatientDetails>();
patientDetails.add(createPatientDetails(patient, unitManager.get(patient.getUnitcode())));
return patientDetails;
}
private PatientDetails createPatientDetails(Patient patient, Unit unit) {
PatientDetails patientDetail = new PatientDetails();
patientDetail.setPatient(patient);
patientDetail.setUnit(unit);
patientDetail.setEdtaDiagnosis(edtaCodeManager.getEdtaCode(patient.getDiagnosis()));
patientDetail.setEdtaTreatment(edtaCodeManager.getEdtaCode(patient.getTreatment()));
patientDetail.setOtherDiagnoses(diagnosisManager.getOtherDiagnoses(patient.getNhsno(),
patient.getUnitcode()));
// get the transplant status for the patient
patientDetail.setUktStatus(UktUtils.retreiveUktStatus(patient.getNhsno()));
return patientDetail;
}
@Override
public Patient getPatient(String username) {
List<UserMapping> userMappings = userManager.getUserMappings(username);
for (UserMapping userMapping : userMappings) {
String unitcode = userMapping.getUnitcode();
//check user's permission
if (!securityUserManager.userHasReadAccessToUnit(unitcode)) {
continue;
}
Unit unit = unitManager.get(unitcode);
if (!"radargroup".equalsIgnoreCase(unit.getSourceType())) {
continue;
}
Patient patient = get(userMapping.getNhsno(), unitcode);
if (patient == null) {
continue;
}
AddLog.addLog(LegacySpringUtils.getSecurityUserManager().getLoggedInUsername(),
AddLog.PATIENT_VIEW, "", patient.getNhsno(),
patient.getUnitcode(), "");
return patient;
}
return null;
}
/**
* This is to get the date by unit of the test results loaded into the system
*
*
* @param nhsNo
* @return
*/
public Map.Entry<String, Date> getLatestTestResultUnit(String nhsNo) {
Map.Entry<String, Date> maxTestRange = null;
for (Map.Entry<String, Date> testDateRange : getMostRecentTestResultDateByNhsNo(nhsNo).entrySet()) {
if (maxTestRange == null) {
maxTestRange = testDateRange;
} else {
// Check which entry is the latest
if (maxTestRange.getValue().before(testDateRange.getValue())) {
maxTestRange = testDateRange;
}
}
}
return maxTestRange;
}
private Map<String, Date> getMostRecentTestResultDateByNhsNo(String nhsNo) {
Map<String, Date> maxDataRangeDate = new HashMap<String, Date>();
for (Patient patient : patientDao.getByNhsNo(nhsNo)) {
if (patient.getMostRecentTestResultDateRangeStopDate() != null) {
maxDataRangeDate.put(patient.getUnitcode(), patient.getMostRecentTestResultDateRangeStopDate());
}
}
return maxDataRangeDate;
}
}