/** * Copyright 2010 Society for Health Information Systems Programmes, India (HISP India) * * This file is part of Hospital-core module. * * Hospital-core module 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. * Hospital-core module 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 Hospital-core module. If not, see <http://www.gnu.org/licenses/>. * **/ package org.openmrs.module.hospitalcore.db.hibernate; import java.text.SimpleDateFormat; import java.util.Date; import java.util.List; //New Requirement "Editable Dashboard" // import java.util.concurrent.TimeUnit; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; import org.hibernate.Criteria; import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.criterion.Restrictions; import org.openmrs.Concept; import org.openmrs.Encounter; import org.openmrs.Obs; import org.openmrs.Patient; import org.openmrs.Person; import org.openmrs.api.APIException; import org.openmrs.api.context.Context; import org.openmrs.api.db.DAOException; import org.openmrs.module.hospitalcore.db.PatientQueueDAO; import org.openmrs.module.hospitalcore.model.OpdPatientQueue; import org.openmrs.module.hospitalcore.model.OpdPatientQueueLog; public class HibernatePatientQueueDAO implements PatientQueueDAO { SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); SimpleDateFormat formatterExt = new SimpleDateFormat("dd/MM/yyyy"); //New Requirement "Editable Dashboard"// SimpleDateFormat formatter1 = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); /** * Hibernate session factory */ private SessionFactory sessionFactory; /** * Set session factory * * @param sessionFactory */ public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } public OpdPatientQueue saveOpdPatientQueue(OpdPatientQueue opdPatientQueue) throws DAOException { return (OpdPatientQueue) sessionFactory.getCurrentSession().merge(opdPatientQueue); } public OpdPatientQueue updateOpdPatientQueue(Integer id, String status) throws DAOException { OpdPatientQueue opdPatientQueue = getOpdPatientQueueById(id); opdPatientQueue.setStatus(status); return (OpdPatientQueue) sessionFactory.getCurrentSession().merge(opdPatientQueue); } public OpdPatientQueue getOpdPatientQueueById(Integer id) throws DAOException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueue.class); criteria.add(Restrictions.eq("id", id)); OpdPatientQueue opdPatientQueue = (OpdPatientQueue) criteria.uniqueResult(); return opdPatientQueue; } public OpdPatientQueue getOpdPatientQueue(String patientIdentifier,Integer opdConceptId) throws DAOException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueue.class, "queue") .createAlias("queue.opdConcept", "opdConcept"); criteria.add(Restrictions.eq("queue.patientIdentifier", patientIdentifier)); criteria.add(Restrictions.eq("opdConcept.conceptId", opdConceptId)); String date = formatterExt.format(new Date()); String startFromDate = date + " 00:00:00"; String endFromDate = date + " 23:59:59"; try { criteria.add(Restrictions.and(Restrictions.ge( "queue.createdOn", formatter.parse(startFromDate)), Restrictions.le( "queue.createdOn", formatter.parse(endFromDate)))); } catch (Exception e) { // TODO: handle exception System.out.println("Error convert date: "+ e.toString()); e.printStackTrace(); } criteria.addOrder(Order.desc("queue.createdOn")); List<OpdPatientQueue> list = criteria.list(); return CollectionUtils.isNotEmpty(list) ? list.get(0) : null; } public void deleteOpdPatientQueue(OpdPatientQueue opdPatientQueue) throws DAOException { sessionFactory.getCurrentSession().delete(opdPatientQueue); } @SuppressWarnings("unchecked") public List<OpdPatientQueue> listOpdPatientQueue(String searchText , Integer conceptId,String status, int min, int max) throws DAOException{ Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueue.class,"opdPatientQueue"); if(!StringUtils.isBlank(searchText)){ criteria.add(Restrictions.or(Restrictions.like("opdPatientQueue.patientIdentifier", "%"+searchText+"%"),Restrictions.like("opdPatientQueue.patientName", "%"+searchText+"%"))); } if(conceptId != null && conceptId > 0){ criteria.createAlias( "opdPatientQueue.opdConcept","opdConcept"); criteria.add(Restrictions.eq("opdConcept.conceptId", conceptId)); } if(!StringUtils.isBlank(status)){ criteria.add(Restrictions.eq("opdPatientQueue.status", status)); } //only get data if that's current date //we need this because maybe cron-job not work normal String date = formatterExt.format(new Date()); String startFromDate = date + " 00:00:00"; String endFromDate = date + " 23:59:59"; try { criteria.add(Restrictions.and(Restrictions.ge( "opdPatientQueue.createdOn", formatter.parse(startFromDate)), Restrictions.le( "opdPatientQueue.createdOn", formatter.parse(endFromDate)))); } catch (Exception e) { // TODO: handle exception System.out.println("Error convert date: "+ e.toString()); e.printStackTrace(); } criteria.addOrder(Order.asc("opdPatientQueue.createdOn")); if(max > 0){ criteria.setFirstResult(min).setMaxResults(max); } List<OpdPatientQueue> list = criteria.list(); return list; } public Integer countOpdPatientQueue(String patientName , String searchType,Integer conceptId,String status) throws DAOException{ Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueue.class,"opdPatientQueue"); if(!StringUtils.isBlank(patientName)){ criteria.add(Restrictions.like("opdPatientQueue.patientName", "%"+patientName+"%")); } if(conceptId != null){ criteria.createAlias("opdPatientQueue.opdConcept", "opdConcept"); criteria.add(Restrictions.eq("opdConcept.conceptId", conceptId)); } if(!StringUtils.isBlank(status)){ criteria.add(Restrictions.eq("opdPatientQueue.status", status)); } //only get data if that's current date //we need this because maybe cron-job not work normal String date = formatterExt.format(new Date()); String startFromDate = date + " 00:00:00"; String endFromDate = date + " 23:59:59"; try { criteria.add(Restrictions.and(Restrictions.ge( "opdPatientQueue.createdOn", formatter.parse(startFromDate)), Restrictions.le( "opdPatientQueue.createdOn", formatter.parse(endFromDate)))); } catch (Exception e) { // TODO: handle exception System.out.println("Error convert date: "+ e.toString()); e.printStackTrace(); } Number rs = (Number) criteria.setProjection( Projections.rowCount() ).uniqueResult(); return rs != null ? rs.intValue() : 0; } //patient queue log public OpdPatientQueueLog saveOpdPatientQueueLog(OpdPatientQueueLog opdPatientQueueLog) throws DAOException { return (OpdPatientQueueLog) sessionFactory.getCurrentSession().merge(opdPatientQueueLog); } public OpdPatientQueueLog getOpdPatientQueueLogById(Integer id) throws DAOException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueueLog.class); criteria.add(Restrictions.eq("id", id)); OpdPatientQueueLog opdPatientQueueLog = (OpdPatientQueueLog) criteria.uniqueResult(); return opdPatientQueueLog; } //New Requirement "Editable Dashboard" // public Encounter getLastOPDEncounter(Patient patient) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Encounter.class,"encounter") .createAlias("encounter.encounterType", "encounterType"); criteria.add(Restrictions.eq("patient", patient)); criteria.add(Restrictions.eq("encounterType.name","OPDENCOUNTER")); criteria.addOrder(Order.desc("dateCreated")); criteria.setMaxResults(1); return (Encounter) criteria.uniqueResult(); } public OpdPatientQueueLog getOpdPatientQueueLogByEncounter(Encounter encounter) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueueLog.class); criteria.add(Restrictions.eq("encounter", encounter)); return (OpdPatientQueueLog) criteria.uniqueResult(); } public Obs getObservationByPersonConceptAndEncounter(Person person,Concept concept,Encounter encounter) { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Obs.class); criteria.add(Restrictions.eq("person", person)); criteria.add(Restrictions.eq("concept", concept)); criteria.add(Restrictions.eq("encounter", encounter)); criteria.addOrder(Order.desc("dateCreated")); criteria.setMaxResults(1); return (Obs) criteria.uniqueResult(); } public OpdPatientQueueLog getOpdPatientQueueLog(String patientIdentifier,Integer opdConceptId) throws DAOException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueueLog.class, "queue") .createAlias("queue.opdConcept", "opdConcept"); criteria.add(Restrictions.eq("queue.patientIdentifier", patientIdentifier)); criteria.add(Restrictions.eq("queue.visitOutCome", "admit")); criteria.addOrder(Order.desc("queue.createdOn")); criteria.setMaxResults(1); return (OpdPatientQueueLog) criteria.uniqueResult(); } @SuppressWarnings("unchecked") public List<OpdPatientQueue> getAllPatientInQueue() throws DAOException { //for sure everything always get less than one date Criteria criteria = sessionFactory.getCurrentSession().createCriteria(OpdPatientQueue.class,"opdPatientQueue"); String date = formatterExt.format(new Date()); String startFromDate = date + " 00:00:00"; try { criteria.add(Restrictions.lt( "opdPatientQueue.createdOn", formatter.parse(startFromDate))); } catch (Exception e) { // TODO: handle exception System.out.println("Error convert date: "+ e.toString()); e.printStackTrace(); } return criteria.list(); } // TODO Auto-generated method stub //New Requirement "Editable Dashboard" // public List<Obs> getAllDiagnosis(Integer personId) throws DAOException { Criteria criteria = sessionFactory.getCurrentSession().createCriteria(Obs.class,"obs"); String toDdate = formatter1.format(new Date()); Date date1 = new Date(); Date oldDate = new Date(date1.getTime() - TimeUnit.HOURS.toMillis(24)); String fromDate = formatter1.format(oldDate); try { criteria.add(Restrictions.lt( "obs.obsDatetime", formatter1.parse(toDdate))); criteria.add(Restrictions.gt( "obs.obsDatetime", formatter1.parse(fromDate))); } catch (Exception e) { // TODO: handle exception System.out.println("Error convert date: "+ e.toString()); e.printStackTrace(); } criteria.add(Restrictions.eq( "obs.personId",personId)); criteria.add(Restrictions.eq( "obs.concept", Context.getConceptService().getConcept("PROVISIONAL DIAGNOSIS"))); return criteria.list(); } }