/* * 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.joda.time.DateTime; import org.joda.time.Days; import org.patientview.model.Patient; import org.patientview.radar.dao.TransplantDao; import org.patientview.radar.dao.impl.TransplantDaoImpl; import org.patientview.radar.model.Transplant; import org.patientview.radar.model.exception.InvalidModelException; import org.patientview.radar.service.PatientManager; import org.patientview.radar.service.TransplantManager; import org.patientview.radar.service.TreatmentManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.List; public class TransplantManagerImpl implements TransplantManager { TransplantDao transplantDao; PatientManager patientManager; private static final Logger LOGGER = LoggerFactory.getLogger(TransplantDaoImpl.class); public void saveTransplant(Transplant transplant) throws InvalidModelException { // validate transplant List<String> errors = new ArrayList<String>(); List<Transplant> transplants = transplantDao.getTransplantsByRadarNumber(transplant.getRadarNumber()); // transplant date must be greater than reccur, failure date, date reject and date biopsy List<Date> datesAfterStart = new ArrayList<Date>(); datesAfterStart.addAll(Arrays.asList(transplant.getDateRecurr(), transplant.getDateFailureRejectData().getFailureDate())); List<Transplant.RejectData> rejectDataList = transplantDao.getRejectDataByTransplantNumber( transplant.getId()); for (Transplant.RejectData rejectData : rejectDataList) { datesAfterStart.add(rejectData.getRejectedDate()); datesAfterStart.add(rejectData.getBiopsyDate()); } for (Date dateAfterStart : datesAfterStart) { if (dateAfterStart != null) { if (transplant.getDate().compareTo(dateAfterStart) >= 0) { errors.add(START_DATE_ERROR); break; } } } // date of failure has to be after reccur, date reject and date biopsy List<Date> datesAfterEndDate = new ArrayList<Date>(); datesAfterEndDate.add(transplant.getDateRecurr()); for (Transplant.RejectData rejectData : rejectDataList) { datesAfterEndDate.add(rejectData.getRejectedDate()); datesAfterEndDate.add(rejectData.getBiopsyDate()); } Date failureDate = transplant.getDateFailureRejectData() != null ? transplant. getDateFailureRejectData().getFailureDate() : null; if (failureDate != null) { for (Date dateAfterEndDate : datesAfterEndDate) { if (dateAfterEndDate != null) { if (failureDate.compareTo(dateAfterEndDate) <= 0) { errors.add(FAILURE_DATE_ERROR); break; } } } } // transplant must be 14 days apart for (Transplant existingTransplant : transplants) { if (existingTransplant.getId().equals(transplant.getId())) { continue; } int daysApart = Math.abs(Days.daysBetween(new DateTime(existingTransplant.getDate()), new DateTime(transplant.getDate())).getDays()); if (Math.abs(daysApart) <= 14) { errors.add(TRANSPLANTS_INTERVAL_ERROR); break; } } // cannot add new transplant whilst previous transplant has not failed for (Transplant existingTransplant : transplants) { if (existingTransplant.getId().equals(transplant.getId())) { continue; } if (existingTransplant.getDateFailureRejectData() != null) { if (existingTransplant.getDateFailureRejectData().getFailureDate() == null) { errors.add(TreatmentManager.PREVIOUS_TREATMENT_NOT_CLOSED_ERROR); break; } } else { errors.add(TreatmentManager.PREVIOUS_TREATMENT_NOT_CLOSED_ERROR); break; } } // cannot add transplant before another failure date for (Transplant existingTransplant : transplants) { if (existingTransplant.getId().equals(transplant.getId())) { continue; } if (existingTransplant.getDateFailureRejectData() != null) { if (failureDate != null) { if (failureDate.compareTo(transplant.getDate()) > 0) { errors.add(BEFORE_PREVIOUS_FAILURE_DATE); break; } } } } List<Date> datesToCheck = Arrays.asList(transplant.getDate(), transplant.getDateRecurr(), transplant.getDateFailureRejectData() != null ? transplant.getDateFailureRejectData(). getFailureDate() : null); // cannot be before date of birth Patient patient = patientManager.getPatientByRadarNumber(transplant.getRadarNumber()); if (patient != null) { Date dob = patient.getDob(); if (dob != null) { for (Date date : datesToCheck) { if (date != null) { if (dob.compareTo(date) > 0) { errors.add(TreatmentManager.BEFORE_DOB_ERROR); break; } } } } } // cannot be after today Date today = new Date(); for (Date date : datesToCheck) { if (date != null) { if (today.compareTo(date) < 0) { errors.add(TreatmentManager.AFTER_TODAY_ERROR); break; } } } if (!errors.isEmpty()) { InvalidModelException exception = new InvalidModelException("Transplant model is not valid"); exception.setErrors(errors); throw exception; } transplantDao.saveTransplant(transplant); } public void deleteTransplant(Transplant transplant) { transplantDao.deleteTransplant(transplant); } public Transplant getTransplant(long id) { return transplantDao.getTransplant(id); } public List<Transplant> getTransplantsByRadarNumber(long radarNumber) { return transplantDao.getTransplantsByRadarNumber(radarNumber); } public List<Transplant.Modality> getTransplantModalitites() { return transplantDao.getTransplantModalitites(); } public Transplant.Modality getTransplantModality(long id) { return transplantDao.getTransplantModality(id); } public void saveRejectData(Transplant.RejectData rejectData) { transplantDao.saveRejectData(rejectData); } public void saveRejectDataWithValidation(Transplant.RejectData rejectData) throws InvalidModelException { List<String> errors = new ArrayList<String>(); // validatation // reject dates must be after transplant start date and before failure date Long transplantId = rejectData.getTransplantId(); Transplant transplant = transplantDao.getTransplant(transplantId); List<Date> rejectDates = Arrays.asList(rejectData.getBiopsyDate(), rejectData.getRejectedDate()); for (Date rejectDate : rejectDates) { if (rejectDate != null) { Date startDate = transplant.getDate(); Date failureDate = transplant.getDateFailureRejectData() != null ? transplant.getDateFailureRejectData().getFailureDate() : null; if (startDate != null) { if (startDate.compareTo(rejectDate) >= 0) { errors.add(TransplantManager.REJECT_DATA_ERROR_MESSAGE); break; } } if (failureDate != null) { if (failureDate.compareTo(rejectDate) <= 0) { errors.add(TransplantManager.REJECT_DATA_ERROR_MESSAGE); break; } } } } if (!errors.isEmpty()) { InvalidModelException exception = new InvalidModelException("Transplant model is not valid"); exception.setErrors(errors); throw exception; } transplantDao.saveRejectData(rejectData); } public void deleteRejectData(Transplant.RejectData rejectData) { transplantDao.deleteRejectData(rejectData); } public List<Transplant.RejectData> getRejectDataByTransplantNumber(Long transplantNumber) { return transplantDao.getRejectDataByTransplantNumber(transplantNumber); } public Transplant.RejectData getRejectData(Long id) { return transplantDao.getRejectData(id); } public TransplantDao getTransplantDao() { return transplantDao; } public void setTransplantDao(TransplantDao transplantDao) { this.transplantDao = transplantDao; } public void setPatientManager(PatientManager patientManager) { this.patientManager = patientManager; } }