package model.manager; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.celllife.idart.database.hibernate.Drug; import org.celllife.idart.database.hibernate.Episode; import org.celllife.idart.database.hibernate.PrescribedDrugs; import org.celllife.idart.database.hibernate.Prescription; import org.celllife.idart.database.hibernate.Regimen; import org.celllife.idart.database.hibernate.RegimenDrugs; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.criterion.Restrictions; public class PrescriptionManager { public static List<Prescription> getValidPrescriptions(Session session, int clinicId, boolean isPaeds, Date startDate, Date endDate, Date cutOff) { return getValidPrescriptions(session, clinicId, isPaeds, startDate, endDate, cutOff, false); } public static List<Prescription> getValidPrescriptions(Session session, int clinicId, boolean isPaeds, Date startDate, Date endDate, Date cutOff, boolean limitByEpisodes) { Criteria criteria; if (clinicId != 0) { criteria = session.createCriteria(Prescription.class).createAlias( "patient", "patient").createAlias("patient.episodes", "episode").createAlias("episode.clinic", "clinic").add( Restrictions.or(Restrictions.and(Restrictions.le("date", endDate), Restrictions.isNull("endDate")), Restrictions.and(Restrictions.le("date", endDate), Restrictions.ge("endDate", endDate)))).add( Restrictions.eq("clinic.id", clinicId)); } else { criteria = session.createCriteria(Prescription.class).createAlias( "patient", "patient").createAlias("patient.episodes", "episode").add( Restrictions.or(Restrictions.and(Restrictions.le("date", endDate), Restrictions.isNull("endDate")), Restrictions.and(Restrictions.le("date", endDate), Restrictions.ge("endDate", endDate)))); } if (cutOff != null) { if (isPaeds) { criteria.add(Restrictions.gt("patient.dateOfBirth", cutOff)); } else { criteria.add(Restrictions.le("patient.dateOfBirth", cutOff)); } } if (limitByEpisodes && startDate != null && startDate.before(endDate)) { criteria.add( Restrictions.or( Restrictions.or(Restrictions.between("episode.startDate", startDate, endDate), Restrictions.between("episode.stopDate", startDate, endDate)), Restrictions.and(Restrictions.lt("episode.startDate", startDate), Restrictions.isNull("episode.stopDate")))); } criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); List<Prescription> scripts = criteria.list(); return scripts; } public static Map<Regimen, Set<Integer>> getRegimenIdMap(Session session) { List<Regimen> regimens = session.createQuery("from Regimen as reg") .list(); Iterator<Regimen> regIt = regimens.iterator(); Map<Regimen, Set<Integer>> regimenIdMap = new HashMap<Regimen, Set<Integer>>(); while (regIt.hasNext()) { Set<Integer> regDrugSet = new HashSet<Integer>(); // get all the drugs in this set of regimenDrugs Regimen theReg = regIt.next(); List<RegimenDrugs> regDrugs = theReg.getRegimenDrugs(); Iterator<RegimenDrugs> regDrugsIt = regDrugs.iterator(); while (regDrugsIt.hasNext()) { RegimenDrugs rd = regDrugsIt.next(); // we only care about ARVs if (rd.getDrug().isARV()) { regDrugSet.add(rd.getDrug().getId()); } } if (!regDrugSet.isEmpty()) { regimenIdMap.put(theReg, regDrugSet); } } return regimenIdMap; } /** * This method will return the first prescription * * @return */ public static Prescription getFirstPrescriptionForEpisode(Session session, Episode episode) { if (episode.getStopDate() == null) { return (Prescription) session.createQuery( "select pre from Prescription pre where " + "pre.patient = :pId and " + "(pre.endDate > :startDate or " + "pre.endDate is null ) " + "order by pre.date asc").setLong("pId", episode.getPatient().getId()).setDate("startDate", episode.getStartDate()).setMaxResults(1).uniqueResult(); } return (Prescription) session.createQuery( "select pre from Prescription pre where " + "pre.patient = :pId and " + "((pre.date between :startDate and :endDate) or " + "(pre.endDate between :startDate and :endDate) or " + "(pre.date < :startDate and pre.endDate is null)) " + "order by pre.date asc").setLong("pId", episode.getPatient().getId()).setDate("startDate", episode.getStartDate()).setDate("endDate", episode.getStopDate()).setMaxResults(1).uniqueResult(); } /** * @param pack * @return a string of the form d4t 30, EFV 600 etc * @throws HibernateException */ public static String getShortPrescriptionContentsString(Prescription pres) { String drugsInPrescription = ""; List<Drug> result = new ArrayList<Drug>(); if (pres.getPrescribedDrugs() != null) { for (PrescribedDrugs pd : pres.getPrescribedDrugs()) { result.add(pd.getDrug()); } drugsInPrescription = DrugManager.getDrugListString(result, ", ", true); } return drugsInPrescription; } /** * This method will return the first prescription * * @return */ public static Prescription getLastPrescriptionForEpisode(Session session, Episode episode) { return (Prescription) session.createQuery( "select pre from Prescription pre where " + "pre.patient = :pId and " + "((pre.date between :startDate and :endDate) or " + "(pre.endDate between :startDate and :endDate) or " + "(pre.date < :startDate and pre.endDate is null)) " + "order by pre.date asc").setLong("pId", episode.getPatient().getId()).setDate("startDate", episode.getStartDate()).setDate("endDate", episode.getStopDate()).setMaxResults(1).uniqueResult(); } }