/* * 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.radar.service.impl; import org.patientview.model.Ethnicity; import org.patientview.model.Patient; import org.patientview.model.Sex; import org.patientview.model.Status; import org.patientview.model.generic.DiseaseGroup; import org.patientview.model.generic.GenericDiagnosis; import org.patientview.radar.dao.PatientDao; import org.patientview.radar.exception.PatientLinkException; import org.patientview.radar.service.PatientManager; import org.patientview.radar.util.RadarUtility; import java.util.List; /** * Created for the new functionality with using just the on patient table. Going forward this can be then merged with * the class of the same name in Patient View * * User: james@solidstategroup.com * Date: 06/11/13 * Time: 11:11 */ public class PatientManagerImpl implements PatientManager { private static final String LINKED_PATIENT_MARKUP = "<span class=\"patientLinked\" " + "title=\"Linked Patient\"></span>"; private PatientDao patientDao; public List<Patient> getPatientByNhsNumber(String nhsNo) { return patientDao.getPatientsByNhsNumber(nhsNo); } public Patient getById(Long id) { return resolveLinkRecord(patientDao.getById(id)); } public Patient getPatientByRadarNumber(Long radarNumber) { Patient patient = patientDao.getByRadarNumber(radarNumber); patient = resolveLinkRecord(patient); return patient; } /** * This manages four saves. On create it will populate the radar number with the patient id field * * 1) A linked patient save where we strip fields out of the update statement and then re populate * 2) A linked patient create * 3) A unlinked patient save * 4) A unlinked patient create * * @param patient */ public void save(final Patient patient){ // If this is a link record then we need to stop any duplicated data being saved if (patient.isLinked()) { RadarUtility.cleanLinkRecord(patient); } patientDao.save(patient); // We have to re-populate fields after they are cleaned from the save, only for link patients if (patient.isLinked()) { overRideLinkRecord(patientDao.getById(patient.getPatientLinkId()), patient); } } public List<Patient> getPatientsByUnitCode(List<String> unitCodes) { List<Patient> patients = patientDao.getPatientsByUnitCode(unitCodes); for (Patient patient : patients) { // Need to rewrite linked patient with populated version if (patient.isLinked()) { Patient sourcePatient = patientDao.getById(patient.getPatientLinkId()); overRideLinkRecord(sourcePatient, patient); patient.setNhsno(LINKED_PATIENT_MARKUP + sourcePatient.getNhsno()); } } return patients; } /** * Method to create a Patient record linked to the original that is ready for registration * * @param source * @return * @throws PatientLinkException */ public Patient createLinkPatient(Patient source) throws PatientLinkException { // Merge a new patient record with the source to create the new link record if (source == null || !source.hasValidId()) { throw new PatientLinkException("This has to be a valid source record"); } Patient target = new Patient(); target.setNhsno(source.getNhsno()); target.setPatientLinkId(source.getId()); target.setPatientLinkUnitCode(source.getUnitcode()); target.setForename(source.getForename()); target.setSurname(source.getSurname()); target.setDob(source.getDob()); target.setAddress1(source.getAddress1()); target.setAddress2(source.getAddress2()); target.setAddress3(source.getAddress3()); target.setAddress4(source.getAddress4()); target.setPostcode(source.getPostcode()); target.setSex(source.getSex()); target.setTelephone1(source.getTelephone1()); target.setHospitalnumber(source.getHospitalnumber()); return target; } /** * Replace linked fields on the link patient from the source patient * @param source the original PV record that is linked to * @param link the radar create record that linked to the source */ public void overRideLinkRecord(Patient source, Patient link) { link.setForename(source.getForename()); link.setSurname(source.getSurname()); link.setDob(source.getDob()); link.setAddress1(source.getAddress1()); link.setAddress2(source.getAddress2()); link.setAddress3(source.getAddress3()); link.setAddress4(source.getAddress4()); link.setPostcode(source.getPostcode()); link.setSex(source.getSex()); link.setTelephone1(source.getTelephone1()); link.setHospitalnumber(source.getHospitalnumber()); link.setPatientLinkUnitCode(source.getUnitcode()); } /** * Resolve a patient link. * * 1) If it's a link record - get the source linked fields * * Otherwise just return the patient object * * @param patient a potentially linked patient that may need resolving * @return the same patient, but override the linked fields if it's a linked patient */ private Patient resolveLinkRecord(final Patient patient) { if (patient != null && patient.isLinked()) { Patient source = patientDao.getById(patient.getPatientLinkId()); if (source != null) { overRideLinkRecord(source, patient); return patient; } else { throw new RuntimeException("Source patient does not exist when trying to resolveLinkRecord, id: " + patient.getPatientLinkId()); } } return patient; } public List<Sex> getSexes() { return patientDao.getSexes(); } public List<Status> getStatuses() { return patientDao.getStatuses(); } public List<DiseaseGroup> getDiseaseGroups() { return patientDao.getDiseaseGroups(); } public List<GenericDiagnosis> getGenericDiagnoses() { return patientDao.getGenericDiagnoses(); } public List<Ethnicity> getEthnicities() { return patientDao.getEthnicities(); } public void setPatientDao(PatientDao patientDao) { this.patientDao = patientDao; } }