diff --git a/api/pom.xml b/api/pom.xml
index 80a0a7c..a7c358c 100644
--- a/api/pom.xml
+++ b/api/pom.xml
@@ -4,7 +4,7 @@
org.bahmni.module
episodes
- 1.2.0
+ 1.3.0-SNAPSHOT
episodes-api
diff --git a/api/src/main/java/org/openmrs/module/episodes/Episode.java b/api/src/main/java/org/openmrs/module/episodes/Episode.java
index 7cb962b..ec681c0 100644
--- a/api/src/main/java/org/openmrs/module/episodes/Episode.java
+++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java
@@ -1,16 +1,107 @@
package org.openmrs.module.episodes;
-import org.openmrs.BaseOpenmrsData;
+import org.openmrs.BaseCustomizableData;
+import org.openmrs.Concept;
import org.openmrs.Encounter;
+import org.openmrs.Patient;
import org.openmrs.PatientProgram;
+import org.openmrs.Provider;
+import org.openmrs.Visit;
+import java.util.Date;
import java.util.HashSet;
import java.util.Set;
-public class Episode extends BaseOpenmrsData {
+public class Episode extends BaseCustomizableData {
+
private Integer episodeId;
private Set encounters = new HashSet<>();
private Set patientPrograms = new HashSet<>();
+ private Patient patient;
+ private Set episodeReason = new HashSet<>();
+ private Episode.Status status = Episode.Status.ACTIVE;
+ private Date dateStarted;
+ private Date dateEnded;
+ private Concept episodeType;
+ private Set statusHistory = new HashSet<>();
+ private Provider careManager;
+ private Set visits = new HashSet<>();
+
+ public Status getStatus() {
+ return status;
+ }
+
+ public void setStatus(Status status) {
+ this.status = status;
+ }
+
+ public Date getDateEnded() {
+ return dateEnded;
+ }
+
+ public void setDateEnded(Date dateEnded) {
+ this.dateEnded = dateEnded;
+ }
+
+
+ public Set getEpisodeReason() {
+ return episodeReason;
+ }
+
+ public void setEpisodeReason(Set episodeReason) {
+ this.episodeReason = episodeReason;
+ }
+
+ public Date getDateStarted() {
+ return dateStarted;
+ }
+
+ public void setDateStarted(Date dateStarted) {
+ this.dateStarted = dateStarted;
+ }
+
+ public Concept getEpisodeType() {
+ return episodeType;
+ }
+
+ public void setEpisodeType(Concept episodeType) {
+ this.episodeType = episodeType;
+ }
+
+ public Provider getCareManager() {
+ return careManager;
+ }
+
+ public void setCareManager(Provider careManager) {
+ this.careManager = careManager;
+ }
+
+ public Set getStatusHistory() {
+ return statusHistory;
+ }
+
+ public void setStatusHistory(Set statusHistory) {
+ this.statusHistory = statusHistory;
+ }
+
+ public Set getVisits() {
+ return visits;
+ }
+
+ public void setVisits(Set visits) {
+ this.visits = visits;
+ }
+
+ public enum Status {
+ UNKNOWN,
+ WAITLIST,
+ PLANNED,
+ ACTIVE,
+ ONHOLD,
+ FINISHED,
+ CANCELLED,
+ ENTERED_IN_ERROR
+ }
public Episode(Integer episodeId, Set encounters, Set patientPrograms) {
this.episodeId = episodeId;
@@ -18,6 +109,13 @@ public Episode(Integer episodeId, Set encounters, Set
this.patientPrograms = patientPrograms;
}
+ public Episode(Integer episodeId, Patient patient, Set encounters, Set patientPrograms) {
+ this.episodeId = episodeId;
+ this.patient = patient;
+ this.encounters = encounters;
+ this.patientPrograms = patientPrograms;
+ }
+
public Episode() {
}
@@ -36,7 +134,7 @@ public Integer getId() {
@Override
public void setId(Integer id) {
-
+ this.episodeId = id;
}
public Set getPatientPrograms() {
@@ -62,4 +160,30 @@ public void setEncounters(Set encounters) {
public void setPatientPrograms(Set patientPrograms) {
this.patientPrograms = patientPrograms;
}
+
+ public Patient getPatient() {
+ return patient;
+ }
+
+ public void setPatient(Patient patient) {
+ this.patient = patient;
+ }
+
+ public void addEpisodeReason(EpisodeReason reason) {
+ if (reason != null) {
+ reason.setEpisode(this);
+ getEpisodeReason().add(reason);
+ }
+ }
+
+ public void addEpisodeStatusHistory(EpisodeStatusHistory statusHistory) {
+ if (statusHistory != null) {
+ statusHistory.setEpisode(this);
+ getStatusHistory().add(statusHistory);
+ }
+ }
+
+ public boolean hasStatusHistory() {
+ return statusHistory != null && !statusHistory.isEmpty();
+ }
}
diff --git a/api/src/main/java/org/openmrs/module/episodes/EpisodeAttribute.java b/api/src/main/java/org/openmrs/module/episodes/EpisodeAttribute.java
new file mode 100644
index 0000000..e25e587
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/EpisodeAttribute.java
@@ -0,0 +1,36 @@
+package org.openmrs.module.episodes;
+
+import org.openmrs.attribute.Attribute;
+import org.openmrs.attribute.BaseAttribute;
+
+public class EpisodeAttribute extends BaseAttribute implements Attribute {
+ private Integer episodeAttributeId;
+
+ @Override
+ public Integer getId() {
+ return getEpisodeAttributeId();
+ }
+
+ @Override
+ public void setId(Integer id) {
+ setEpisodeAttributeId(id);
+ }
+
+ public Integer getEpisodeAttributeId() {
+ return episodeAttributeId;
+ }
+
+ public void setEpisodeAttributeId(Integer episodeAttributeId) {
+ this.episodeAttributeId = episodeAttributeId;
+ }
+
+ public Episode getEpisode() {
+ return getOwner();
+ }
+
+ public void setEpisode(Episode episode) {
+ setOwner(episode);
+ }
+
+
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/EpisodeAttributeType.java b/api/src/main/java/org/openmrs/module/episodes/EpisodeAttributeType.java
new file mode 100644
index 0000000..13fe93e
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/EpisodeAttributeType.java
@@ -0,0 +1,26 @@
+package org.openmrs.module.episodes;
+
+import org.openmrs.attribute.AttributeType;
+import org.openmrs.attribute.BaseAttributeType;
+
+public class EpisodeAttributeType extends BaseAttributeType implements AttributeType {
+
+ private Integer episodeAttributeTypeId;
+ @Override
+ public Integer getId() {
+ return getEpisodeAttributeTypeId();
+ }
+
+ @Override
+ public void setId(Integer id) {
+ setEpisodeAttributeTypeId(id);
+ }
+
+ public Integer getEpisodeAttributeTypeId() {
+ return episodeAttributeTypeId;
+ }
+
+ public void setEpisodeAttributeTypeId(Integer episodeAttributeTypeId) {
+ this.episodeAttributeTypeId = episodeAttributeTypeId;
+ }
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java b/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java
new file mode 100644
index 0000000..d15bba8
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java
@@ -0,0 +1,126 @@
+package org.openmrs.module.episodes;
+
+import org.openmrs.BaseOpenmrsObject;
+import org.openmrs.Concept;
+import org.openmrs.User;
+
+import java.util.Date;
+
+public class EpisodeReason extends BaseOpenmrsObject {
+
+ private Integer episodeReasonId;
+
+ private User creator;
+ private Date dateCreated;
+ private Concept reasonUse;
+ private Concept valueConcept;
+ private String valueReference;
+
+ private Episode episode;
+ private Boolean voided = Boolean.FALSE;
+ private Date dateVoided;
+ private User voidedBy;
+ private String voidReason;
+
+
+ public Integer getEpisodeReasonId() {
+ return episodeReasonId;
+ }
+
+ public void setEpisodeReasonId(Integer episodeReasonId) {
+ this.episodeReasonId = episodeReasonId;
+ }
+
+ public EpisodeReason() {
+ }
+
+ @Override
+ public Integer getId() {
+ return getEpisodeReasonId();
+ }
+
+ @Override
+ public void setId(Integer id) {
+ setEpisodeReasonId(id);
+ }
+
+ public User getCreator() {
+ return creator;
+ }
+
+ public Date getDateCreated() {
+ return dateCreated;
+ }
+
+ public void setDateCreated(Date dateCreated) {
+ this.dateCreated = dateCreated;
+ }
+
+ public void setCreator(User creator) {
+ this.creator = creator;
+ }
+
+ public Concept getReasonUse() {
+ return reasonUse;
+ }
+
+ public void setReasonUse(Concept reasonUse) {
+ this.reasonUse = reasonUse;
+ }
+
+ public Episode getEpisode() {
+ return episode;
+ }
+
+ public void setEpisode(Episode episode) {
+ this.episode = episode;
+ }
+
+ public Boolean getVoided() {
+ return voided;
+ }
+
+ public void setVoided(Boolean voided) {
+ this.voided = voided;
+ }
+
+ public Date getDateVoided() {
+ return dateVoided;
+ }
+
+ public void setDateVoided(Date dateVoided) {
+ this.dateVoided = dateVoided;
+ }
+
+ public User getVoidedBy() {
+ return voidedBy;
+ }
+
+ public void setVoidedBy(User voidedBy) {
+ this.voidedBy = voidedBy;
+ }
+
+ public String getVoidReason() {
+ return voidReason;
+ }
+
+ public void setVoidReason(String voidReason) {
+ this.voidReason = voidReason;
+ }
+
+ public String getValueReference() {
+ return valueReference;
+ }
+
+ public void setValueReference(String valueReference) {
+ this.valueReference = valueReference;
+ }
+
+ public Concept getValueConcept() {
+ return valueConcept;
+ }
+
+ public void setValueConcept(Concept valueConcept) {
+ this.valueConcept = valueConcept;
+ }
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/EpisodeStatusHistory.java b/api/src/main/java/org/openmrs/module/episodes/EpisodeStatusHistory.java
new file mode 100644
index 0000000..9692917
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/EpisodeStatusHistory.java
@@ -0,0 +1,83 @@
+package org.openmrs.module.episodes;
+
+import org.openmrs.BaseOpenmrsObject;
+import org.openmrs.User;
+
+import java.util.Date;
+
+public class EpisodeStatusHistory extends BaseOpenmrsObject {
+ private Integer episodeStatusHistoryId;
+
+ private User creator;
+ private Date dateCreated;
+ private Episode episode;
+ private Episode.Status status;
+ private Date dateStarted;
+ private Date dateEnded;
+
+ @Override
+ public Integer getId() {
+ return getEpisodeStatusHistoryId();
+ }
+
+ @Override
+ public void setId(Integer id) {
+ setEpisodeStatusHistoryId(id);
+ }
+
+ public Integer getEpisodeStatusHistoryId() {
+ return episodeStatusHistoryId;
+ }
+
+ public void setEpisodeStatusHistoryId(Integer episodeStatusHistoryId) {
+ this.episodeStatusHistoryId = episodeStatusHistoryId;
+ }
+
+ public User getCreator() {
+ return creator;
+ }
+
+ public void setCreator(User creator) {
+ this.creator = creator;
+ }
+
+ public Date getDateCreated() {
+ return dateCreated;
+ }
+
+ public void setDateCreated(Date dateCreated) {
+ this.dateCreated = dateCreated;
+ }
+
+ public Episode getEpisode() {
+ return episode;
+ }
+
+ public void setEpisode(Episode episode) {
+ this.episode = episode;
+ }
+
+ public Episode.Status getStatus() {
+ return status;
+ }
+
+ public void setStatus(Episode.Status status) {
+ this.status = status;
+ }
+
+ public Date getDateStarted() {
+ return dateStarted;
+ }
+
+ public void setDateStarted(Date dateStarted) {
+ this.dateStarted = dateStarted;
+ }
+
+ public Date getDateEnded() {
+ return dateEnded;
+ }
+
+ public void setDateEnded(Date dateEnded) {
+ this.dateEnded = dateEnded;
+ }
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/dao/EpisodeAttributeTypeDao.java b/api/src/main/java/org/openmrs/module/episodes/dao/EpisodeAttributeTypeDao.java
new file mode 100644
index 0000000..264b432
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/dao/EpisodeAttributeTypeDao.java
@@ -0,0 +1,17 @@
+package org.openmrs.module.episodes.dao;
+
+import org.openmrs.module.episodes.EpisodeAttributeType;
+
+import java.util.List;
+
+public interface EpisodeAttributeTypeDao {
+ List getAllAttributeTypes(boolean includeRetired);
+
+ EpisodeAttributeType getAttributeTypeByUuid(String uuid);
+
+ EpisodeAttributeType getAttributeTypeById(Integer id);
+
+ EpisodeAttributeType save(EpisodeAttributeType attributeType);
+
+ List findByName(String name);
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAO.java b/api/src/main/java/org/openmrs/module/episodes/dao/EpisodeDAO.java
similarity index 82%
rename from api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAO.java
rename to api/src/main/java/org/openmrs/module/episodes/dao/EpisodeDAO.java
index 1c0a77e..d3c2cf7 100644
--- a/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAO.java
+++ b/api/src/main/java/org/openmrs/module/episodes/dao/EpisodeDAO.java
@@ -1,4 +1,4 @@
-package org.openmrs.module.episodes.dao.impl;
+package org.openmrs.module.episodes.dao;
import org.openmrs.Encounter;
import org.openmrs.PatientProgram;
@@ -11,6 +11,8 @@ public interface EpisodeDAO {
Episode get(Integer episodeId);
+ Episode getEpisodeByUuid(String uuid);
+
Episode getEpisodeForPatientProgram(PatientProgram patientProgram);
Episode getEpisodeForEncounter(Encounter encounter);
diff --git a/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDaoImpl.java b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDaoImpl.java
new file mode 100644
index 0000000..aa8d3be
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDaoImpl.java
@@ -0,0 +1,61 @@
+package org.openmrs.module.episodes.dao.impl;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.query.Query;
+import org.openmrs.module.episodes.EpisodeAttributeType;
+import org.openmrs.module.episodes.dao.EpisodeAttributeTypeDao;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+@Repository
+public class EpisodeAttributeTypeDaoImpl implements EpisodeAttributeTypeDao {
+
+ private static final String HQL_SELECT_ALL_EPISODE_ATTRIBUTE_TYPE = "FROM EpisodeAttributeType";
+ private static final String HQL_SELECT_UN_RETIRED_EPISODE_ATTRIBUTE_TYPE = "FROM EpisodeAttributeType WHERE retired = false";
+ private static final String HQL_SELECT_EPISODE_ATTRIBUTE_TYPE_BY_UUID = "FROM EpisodeAttributeType WHERE uuid = :uuid";
+ private static final String HQL_SELECT_EPISODE_ATTRIBUTE_TYPE_BY_NAME = "FROM EpisodeAttributeType WHERE UPPER(name) LIKE :pattern";
+
+
+ private SessionFactory sessionFactory;
+
+ public EpisodeAttributeTypeDaoImpl(SessionFactory sessionFactory) {
+ this.sessionFactory = sessionFactory;
+ }
+
+ @Override
+ public List getAllAttributeTypes(boolean includeRetired) {
+ String hql = includeRetired ? HQL_SELECT_ALL_EPISODE_ATTRIBUTE_TYPE : HQL_SELECT_UN_RETIRED_EPISODE_ATTRIBUTE_TYPE;
+ Query episodeAttributeTypeQuery = sessionFactory.getCurrentSession().createQuery(hql, EpisodeAttributeType.class);
+ return episodeAttributeTypeQuery.list();
+ }
+
+ @Override
+ public EpisodeAttributeType getAttributeTypeByUuid(String uuid) {
+ Query episodeAttributeTypeQuery = sessionFactory.getCurrentSession().createQuery(HQL_SELECT_EPISODE_ATTRIBUTE_TYPE_BY_UUID, EpisodeAttributeType.class);
+ episodeAttributeTypeQuery.setParameter("uuid", uuid);
+ List episodeAttributeTypes = episodeAttributeTypeQuery.list();
+ return !episodeAttributeTypes.isEmpty() ? episodeAttributeTypes.get(0) : null;
+ }
+
+ @Override
+ public EpisodeAttributeType getAttributeTypeById(Integer id) {
+ return sessionFactory.getCurrentSession().get(EpisodeAttributeType.class, id);
+ }
+
+ @Override
+ public EpisodeAttributeType save(EpisodeAttributeType attributeType) {
+ Session currentSession = sessionFactory.getCurrentSession();
+ currentSession.saveOrUpdate(attributeType);
+ return attributeType;
+ }
+
+ @Override
+ public List findByName(String name) {
+ Query episodeAttributeTypeQuery = sessionFactory.getCurrentSession().createQuery(HQL_SELECT_EPISODE_ATTRIBUTE_TYPE_BY_NAME, EpisodeAttributeType.class);
+ String likePattern = (name + "%").toUpperCase();
+ episodeAttributeTypeQuery.setParameter("pattern", likePattern);
+ return episodeAttributeTypeQuery.list();
+ }
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeDAOImpl.java b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAOImpl.java
similarity index 80%
rename from api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeDAOImpl.java
rename to api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAOImpl.java
index 5768f59..4008e53 100644
--- a/api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeDAOImpl.java
+++ b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAOImpl.java
@@ -1,11 +1,11 @@
-package org.openmrs.module.episodes.dao.impl.impl;
+package org.openmrs.module.episodes.dao.impl;
-import org.hibernate.SessionFactory;
import org.hibernate.Session;
+import org.hibernate.SessionFactory;
import org.openmrs.Encounter;
import org.openmrs.PatientProgram;
import org.openmrs.module.episodes.Episode;
-import org.openmrs.module.episodes.dao.impl.EpisodeDAO;
+import org.openmrs.module.episodes.dao.EpisodeDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@@ -27,6 +27,14 @@ public Episode get(Integer episodeId) {
return (Episode) session().get(Episode.class, episodeId);
}
+ @Override
+ public Episode getEpisodeByUuid(String uuid) {
+ return (Episode) sessionFactory.getCurrentSession()
+ .createQuery("from Episode e where e.uuid = :uuid")
+ .setParameter("uuid", uuid)
+ .uniqueResult();
+ }
+
@Override
public Episode getEpisodeForPatientProgram(PatientProgram patientProgram) {
return (Episode) session().createQuery(
diff --git a/api/src/main/java/org/openmrs/module/episodes/service/EpisodeAttributeTypeService.java b/api/src/main/java/org/openmrs/module/episodes/service/EpisodeAttributeTypeService.java
new file mode 100644
index 0000000..846a8a3
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/service/EpisodeAttributeTypeService.java
@@ -0,0 +1,31 @@
+package org.openmrs.module.episodes.service;
+
+import org.openmrs.ConceptAttributeType;
+import org.openmrs.annotation.Authorized;
+import org.openmrs.module.episodes.EpisodeAttributeType;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.validation.constraints.NotBlank;
+import java.util.List;
+
+public interface EpisodeAttributeTypeService {
+ @Transactional(readOnly = true)
+ @Authorized({"Get Episode Attribute Types"})
+ List getAllAttributeTypes(boolean includeRetired);
+
+ @Transactional(readOnly = true)
+ @Authorized({"Get Episode Attribute Types"})
+ EpisodeAttributeType getAttributeTypeByUuid(@NotBlank String uuid);
+
+ @Transactional
+ @Authorized({"Manage Episode Attribute Types"})
+ EpisodeAttributeType save(EpisodeAttributeType attributeType);
+
+ @Transactional
+ @Authorized({"Manage Episode Attribute Types"})
+ EpisodeAttributeType retire(EpisodeAttributeType attributeType, String retireReason);
+
+ @Transactional
+ @Authorized({"Manage Episode Attribute Types"})
+ List getAttributesByName(String name);
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/service/EpisodeService.java b/api/src/main/java/org/openmrs/module/episodes/service/EpisodeService.java
index 2e89f47..c372f4f 100644
--- a/api/src/main/java/org/openmrs/module/episodes/service/EpisodeService.java
+++ b/api/src/main/java/org/openmrs/module/episodes/service/EpisodeService.java
@@ -2,6 +2,7 @@
import org.openmrs.Encounter;
import org.openmrs.PatientProgram;
+import org.openmrs.annotation.Authorized;
import org.openmrs.module.episodes.Episode;
import java.util.List;
@@ -11,6 +12,9 @@ public interface EpisodeService {
Episode get(Integer episodeId);
+ @Authorized({"Get Episodes"})
+ Episode getEpisodeByUuid(String uuid);
+
Episode getEpisodeForPatientProgram(PatientProgram patientProgram);
Episode getEpisodeForEncounter(Encounter encounter);
diff --git a/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImpl.java b/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImpl.java
new file mode 100644
index 0000000..c282e95
--- /dev/null
+++ b/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImpl.java
@@ -0,0 +1,52 @@
+package org.openmrs.module.episodes.service.impl;
+
+import org.openmrs.api.context.Context;
+import org.openmrs.module.episodes.EpisodeAttributeType;
+import org.openmrs.module.episodes.dao.EpisodeAttributeTypeDao;
+import org.openmrs.module.episodes.service.EpisodeAttributeTypeService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.validation.constraints.NotBlank;
+import java.util.Date;
+import java.util.List;
+
+@Service
+@Transactional
+public class EpisodeAttributeTypeServiceImpl implements EpisodeAttributeTypeService {
+
+ private EpisodeAttributeTypeDao episodeAttributeTypeDao;
+
+ public EpisodeAttributeTypeServiceImpl(EpisodeAttributeTypeDao episodeAttributeTypeDao) {
+ this.episodeAttributeTypeDao = episodeAttributeTypeDao;
+ }
+
+ @Override
+ public List getAllAttributeTypes(boolean includeRetired) {
+ return episodeAttributeTypeDao.getAllAttributeTypes(includeRetired);
+ }
+
+ @Override
+ public EpisodeAttributeType getAttributeTypeByUuid(@NotBlank String uuid) {
+ return episodeAttributeTypeDao.getAttributeTypeByUuid(uuid);
+ }
+
+ @Override
+ public EpisodeAttributeType save(EpisodeAttributeType attributeType) {
+ return episodeAttributeTypeDao.save(attributeType);
+ }
+
+ @Override
+ public EpisodeAttributeType retire(EpisodeAttributeType attributeType, String retireReason) {
+ attributeType.setRetired(true);
+ attributeType.setRetireReason(retireReason);
+ attributeType.setRetiredBy(Context.getAuthenticatedUser());
+ attributeType.setDateRetired(new Date());
+ return episodeAttributeTypeDao.save(attributeType);
+ }
+
+ @Override
+ public List getAttributesByName(String name) {
+ return episodeAttributeTypeDao.findByName(name);
+ }
+}
diff --git a/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImpl.java b/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImpl.java
index 2209558..6e3b13f 100644
--- a/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImpl.java
+++ b/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImpl.java
@@ -3,7 +3,7 @@
import org.openmrs.Encounter;
import org.openmrs.PatientProgram;
import org.openmrs.module.episodes.Episode;
-import org.openmrs.module.episodes.dao.impl.EpisodeDAO;
+import org.openmrs.module.episodes.dao.EpisodeDAO;
import org.openmrs.module.episodes.service.EpisodeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -27,6 +27,11 @@ public Episode get(Integer episodeId) {
return episodeDAO.get(episodeId);
}
+ @Override
+ public Episode getEpisodeByUuid(String uuid) {
+ return episodeDAO.getEpisodeByUuid(uuid);
+ }
+
@Override
public Episode getEpisodeForPatientProgram(PatientProgram patientProgram) {
return episodeDAO.getEpisodeForPatientProgram(patientProgram);
diff --git a/api/src/main/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml
index 1acbb8a..126e757 100644
--- a/api/src/main/resources/Episode.hbm.xml
+++ b/api/src/main/resources/Episode.hbm.xml
@@ -2,13 +2,13 @@
-
+
- episode_id
+ episode_episode_id_seq
@@ -32,7 +32,7 @@
-
+
@@ -41,5 +41,42 @@
+
+
+
+
+
+ org.openmrs.module.episodes.Episode$Status
+ true
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/api/src/main/resources/EpisodeAttribute.hbm.xml b/api/src/main/resources/EpisodeAttribute.hbm.xml
new file mode 100644
index 0000000..92731c8
--- /dev/null
+++ b/api/src/main/resources/EpisodeAttribute.hbm.xml
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+ episode_attribute_episode_attribute_id_seq
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/api/src/main/resources/EpisodeAttributeType.hbm.xml b/api/src/main/resources/EpisodeAttributeType.hbm.xml
new file mode 100644
index 0000000..54d0c57
--- /dev/null
+++ b/api/src/main/resources/EpisodeAttributeType.hbm.xml
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+ episode_attribute_type_episode_attribute_type_id_seq
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/api/src/main/resources/EpisodeReason.hbm.xml b/api/src/main/resources/EpisodeReason.hbm.xml
new file mode 100644
index 0000000..29fdb14
--- /dev/null
+++ b/api/src/main/resources/EpisodeReason.hbm.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+ episode_reason_episode_reason_id_seq
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/api/src/main/resources/EpisodeStatusHistory.hbm.xml b/api/src/main/resources/EpisodeStatusHistory.hbm.xml
new file mode 100644
index 0000000..af4547d
--- /dev/null
+++ b/api/src/main/resources/EpisodeStatusHistory.hbm.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+ episode_status_history_episode_status_history_id_seq
+
+
+
+
+
+
+ org.openmrs.module.episodes.Episode$Status
+ true
+
+
+
+
+
+
+
+
diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml
index 2a41878..508543e 100644
--- a/api/src/main/resources/liquibase.xml
+++ b/api/src/main/resources/liquibase.xml
@@ -73,4 +73,260 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplITTest.java b/api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplITTest.java
deleted file mode 100644
index 6930d9d..0000000
--- a/api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplITTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-package org.bahmni.module.episodes.service.impl;
-
-import org.junit.Test;
-import org.openmrs.Encounter;
-import org.openmrs.Patient;
-import org.openmrs.PatientProgram;
-import org.openmrs.api.EncounterService;
-import org.openmrs.api.ProgramWorkflowService;
-import org.openmrs.api.context.Context;
-import org.openmrs.module.episodes.Episode;
-import org.openmrs.module.episodes.service.EpisodeService;
-import org.openmrs.test.BaseModuleContextSensitiveTest;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.Set;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.is;
-import static org.hamcrest.Matchers.notNullValue;
-import static org.hamcrest.Matchers.nullValue;
-import static org.junit.Assert.assertEquals;
-
-public class EpisodeServiceImplITTest extends BaseModuleContextSensitiveTest {
- @Autowired
- private EpisodeService episodeService;
-
- @Autowired
- private ProgramWorkflowService programWorkflowService;
-
- @Autowired
- private EncounterService encounterService;
-
- @Test
- public void shouldCreateANewEpisode() {
- Episode episode = createAnEpisode();
- assertThat(episode.getId(), is(notNullValue()));
- Episode savedEpisode = episodeService.get(episode.getId());
- assertThat(savedEpisode.getEncounters(), is(notNullValue()));
- }
-
- @Test
- public void shouldRetrieveEpisodeForAProgram() {
- createAnEpisode();
- PatientProgram patientProgram = testPatientProgram();
-
- Episode episodeForPatientProgram = episodeService.getEpisodeForPatientProgram(patientProgram);
-
- Set patientPrograms = episodeForPatientProgram.getPatientPrograms();
- assertThat(patientPrograms.size(), is(equalTo(1)));
- assertThat(patientPrograms.iterator().next().getUuid(), is(equalTo(patientProgram.getUuid())));
- }
-
- @Test
- public void shouldReturnNullIfPatientProgramIsNotLinkedToAnEpisode() {
- Episode episodeForPatientProgram = episodeService.getEpisodeForPatientProgram(testPatientProgram());
-
- assertThat(episodeForPatientProgram, is(nullValue()));
- }
-
- @Test
- public void shouldReturnNullEpisodeIfPatientProgramIsNull() {
- Episode episodeForPatientProgram = episodeService.getEpisodeForPatientProgram(null);
-
- assertThat(episodeForPatientProgram, is(nullValue()));
- }
-
- @Test
- public void shouldReturnEpisodeRelatedToAnEncounter() {
- Episode episode = new Episode();
- Encounter encounter = encounterService.getEncounter(3);
- episode.addEncounter(encounter);
- episode.addPatientProgram(testPatientProgram());
- episodeService.save(episode);
-
- Episode episodeForEncounter = episodeService.getEpisodeForEncounter(encounter);
-
- assertThat(episodeForEncounter, is(episode));
- }
-
- private Episode createAnEpisode() {
- Episode episode = new Episode();
- episode.addPatientProgram(testPatientProgram());
- episodeService.save(episode);
- return episode;
- }
-
- private PatientProgram testPatientProgram() {
- return programWorkflowService.getPatientProgram(1);
- }
-}
\ No newline at end of file
diff --git a/api/src/test/java/org/openmrs/module/episodes/dao/impl/EpisodeDaoTest.java b/api/src/test/java/org/openmrs/module/episodes/dao/impl/EpisodeDaoTest.java
index 2325b83..0d27675 100644
--- a/api/src/test/java/org/openmrs/module/episodes/dao/impl/EpisodeDaoTest.java
+++ b/api/src/test/java/org/openmrs/module/episodes/dao/impl/EpisodeDaoTest.java
@@ -6,6 +6,7 @@
import org.openmrs.api.EncounterService;
import org.openmrs.api.ProgramWorkflowService;
import org.openmrs.module.episodes.Episode;
+import org.openmrs.module.episodes.dao.EpisodeDAO;
import org.openmrs.test.BaseModuleContextSensitiveTest;
import org.springframework.beans.factory.annotation.Autowired;
diff --git a/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImplITTest.java b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImplITTest.java
new file mode 100644
index 0000000..1e70521
--- /dev/null
+++ b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImplITTest.java
@@ -0,0 +1,67 @@
+package org.openmrs.module.episodes.service.impl;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.openmrs.module.episodes.EpisodeAttributeType;
+import org.openmrs.module.episodes.service.EpisodeAttributeTypeService;
+import org.openmrs.test.BaseModuleContextSensitiveTest;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.List;
+
+import static org.openmrs.module.episodes.service.impl.TestHelper.exampleAttributeTypeInsuranceCaseNumber;
+import static org.openmrs.module.episodes.service.impl.TestHelper.exampleAttributeTypeInsuranceId;
+import static org.openmrs.module.episodes.service.impl.TestHelper.exampleAttributeTypeIsAccidentCase;
+
+public class EpisodeAttributeTypeServiceImplITTest extends BaseModuleContextSensitiveTest {
+
+ @Autowired
+ private EpisodeAttributeTypeService attributeTypeService;
+
+ @Test
+ public void shouldCreateNewEpisodeAttributeType() {
+ EpisodeAttributeType caseNumberAttributeType = exampleAttributeTypeInsuranceCaseNumber();
+ EpisodeAttributeType attributeType = attributeTypeService.save(caseNumberAttributeType);
+ Assert.assertTrue("Created episode attribute must have a UUID", !attributeType.getUuid().isEmpty());
+ }
+
+ @Test
+ public void getAttributeTypeByUuid() {
+ EpisodeAttributeType caseAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber());
+ EpisodeAttributeType insuranceIdAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceId());
+ EpisodeAttributeType attributeType = attributeTypeService.getAttributeTypeByUuid(caseAttributeType.getUuid());
+ Assert.assertEquals(caseAttributeType, attributeType);
+
+ }
+
+ @Test
+ public void shouldGetMultipleNonRetiredEpisodeAttributeTypes() {
+ attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber());
+ attributeTypeService.save(exampleAttributeTypeInsuranceId());
+ List allAttributeTypes = attributeTypeService.getAllAttributeTypes(false);
+ Assert.assertEquals(2, allAttributeTypes.size());
+ }
+
+ @Test
+ public void shouldRetireAnEpisodeAttributeType() {
+ EpisodeAttributeType caseAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber());
+ Assert.assertTrue(!caseAttributeType.getRetired());
+ EpisodeAttributeType retired = attributeTypeService.retire(caseAttributeType, "entered-in-error");
+ Assert.assertTrue(retired.getRetired());
+ }
+
+ @Test
+ public void shouldSearchEpisodeAttributeTypesByName() {
+ attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber());
+ attributeTypeService.save(exampleAttributeTypeInsuranceId());
+ attributeTypeService.save(exampleAttributeTypeIsAccidentCase());
+ List allAttributeTypes = attributeTypeService.getAttributesByName("Insurance");
+ Assert.assertEquals(2, allAttributeTypes.size());
+ List matches = attributeTypeService.getAttributesByName("Insurance case");
+ Assert.assertEquals(1, matches.size());
+ }
+
+
+
+
+}
\ No newline at end of file
diff --git a/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplITTest.java b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplITTest.java
new file mode 100644
index 0000000..5db2a31
--- /dev/null
+++ b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplITTest.java
@@ -0,0 +1,210 @@
+package org.openmrs.module.episodes.service.impl;
+
+import org.junit.Test;
+import org.openmrs.Concept;
+import org.openmrs.ConceptClass;
+import org.openmrs.ConceptDatatype;
+import org.openmrs.ConceptName;
+import org.openmrs.Encounter;
+import org.openmrs.Patient;
+import org.openmrs.PatientProgram;
+import org.openmrs.Person;
+import org.openmrs.PersonName;
+import org.openmrs.Provider;
+import org.openmrs.api.ConceptService;
+import org.openmrs.api.EncounterService;
+import org.openmrs.api.PersonService;
+import org.openmrs.api.ProgramWorkflowService;
+import org.openmrs.api.ProviderService;
+import org.openmrs.module.episodes.Episode;
+import org.openmrs.module.episodes.EpisodeAttribute;
+import org.openmrs.module.episodes.EpisodeAttributeType;
+import org.openmrs.module.episodes.EpisodeReason;
+import org.openmrs.module.episodes.EpisodeStatusHistory;
+import org.openmrs.module.episodes.service.EpisodeAttributeTypeService;
+import org.openmrs.module.episodes.service.EpisodeService;
+import org.openmrs.test.BaseModuleContextSensitiveTest;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Optional;
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
+import static org.hamcrest.Matchers.is;
+import static org.hamcrest.Matchers.notNullValue;
+import static org.hamcrest.Matchers.nullValue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.openmrs.module.episodes.service.impl.TestHelper.exampleAttributeTypeInsuranceCaseNumber;
+import static org.openmrs.module.episodes.service.impl.TestHelper.exampleAttributeTypeIsAccidentCase;
+
+public class EpisodeServiceImplITTest extends BaseModuleContextSensitiveTest {
+ @Autowired
+ private EpisodeService episodeService;
+
+ @Autowired
+ private ProgramWorkflowService programWorkflowService;
+
+ @Autowired
+ private EncounterService encounterService;
+
+ @Autowired
+ private ConceptService conceptService;
+
+ @Autowired
+ private ProviderService providerService;
+
+ @Autowired
+ private PersonService personService;
+
+ @Autowired
+ private EpisodeAttributeTypeService attributeTypeService;
+
+ @Test
+ public void shouldCreateANewEpisode() {
+ Episode episode = createAnEpisode();
+ assertThat(episode.getId(), is(notNullValue()));
+ Episode savedEpisode = episodeService.get(episode.getId());
+ assertThat(savedEpisode.getEncounters(), is(notNullValue()));
+ }
+
+ @Test
+ public void shouldRetrieveEpisodeForAProgram() {
+ createAnEpisode();
+ PatientProgram patientProgram = testPatientProgram();
+
+ Episode episodeForPatientProgram = episodeService.getEpisodeForPatientProgram(patientProgram);
+
+ Set patientPrograms = episodeForPatientProgram.getPatientPrograms();
+ assertThat(patientPrograms.size(), is(equalTo(1)));
+ assertThat(patientPrograms.iterator().next().getUuid(), is(equalTo(patientProgram.getUuid())));
+ }
+
+ @Test
+ public void shouldReturnNullIfPatientProgramIsNotLinkedToAnEpisode() {
+ Episode episodeForPatientProgram = episodeService.getEpisodeForPatientProgram(testPatientProgram());
+
+ assertThat(episodeForPatientProgram, is(nullValue()));
+ }
+
+ @Test
+ public void shouldReturnNullEpisodeIfPatientProgramIsNull() {
+ Episode episodeForPatientProgram = episodeService.getEpisodeForPatientProgram(null);
+
+ assertThat(episodeForPatientProgram, is(nullValue()));
+ }
+
+ @Test
+ public void shouldReturnEpisodeRelatedToAnEncounter() {
+ Episode episode = new Episode();
+ Encounter encounter = encounterService.getEncounter(3);
+ episode.addEncounter(encounter);
+ episode.addPatientProgram(testPatientProgram());
+ episodeService.save(episode);
+
+ Episode episodeForEncounter = episodeService.getEpisodeForEncounter(encounter);
+
+ assertThat(episodeForEncounter, is(episode));
+ }
+
+ @Test
+ public void shouldCreateANewEpisodeForPatient() {
+ Provider drJones = createProvider("Dr Jones");
+ Episode episode = createAnEpisodeForPatientWithTypeAndReason(Collections.emptyList(), drJones);
+ assertThat(episode.getId(), is(notNullValue()));
+ Episode savedEpisode = episodeService.get(episode.getId());
+ assertThat(savedEpisode.getEncounters(), is(notNullValue()));
+ }
+
+ @Test
+ public void shouldCreateNewEpisodeForPatientWithAttribute() {
+ EpisodeAttributeType caseNumberAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber());
+ EpisodeAttributeType accidentCaseAttributeType = attributeTypeService.save(exampleAttributeTypeIsAccidentCase());
+
+ List episodeAttributes = Arrays.asList(
+ exampleAttributeFromType(caseNumberAttributeType, "CN-1234"),
+ exampleAttributeFromType(accidentCaseAttributeType, Boolean.TRUE.toString())
+ );
+ Episode episode = createAnEpisodeForPatientWithTypeAndReason(episodeAttributes, null);
+ assertEquals(2, episode.getActiveAttributes().size());
+ Optional caseNumber = episode.getActiveAttributes().stream().filter(e -> e.getValueReference().equals("CN-1234")).findFirst();
+ assertTrue(caseNumber.isPresent());
+ assertTrue(!caseNumber.get().getUuid().isEmpty());
+ }
+
+ private EpisodeAttribute exampleAttributeFromType(EpisodeAttributeType caseNumberAttributeType, String value) {
+ EpisodeAttribute attribute = new EpisodeAttribute();
+ attribute.setAttributeType(caseNumberAttributeType);
+ attribute.setValueReferenceInternal(value);
+ return attribute;
+ }
+
+ private Episode createAnEpisodeForPatientWithTypeAndReason(List episodeAttributes, Provider careManager) {
+ final Episode episode = new Episode();
+ episode.setPatient(new Patient());
+ episode.setDateCreated(new Date());
+ episode.setStatus(Episode.Status.ACTIVE);
+ episode.setEpisodeType(createConcept("hospitalization"));
+ if (careManager != null) {
+ episode.setCareManager(careManager);
+ }
+ EpisodeReason reason = new EpisodeReason();
+ episode.addEpisodeReason(reason);
+ reason.setValueConcept(createConcept("accident"));
+ EpisodeStatusHistory statusHistory = new EpisodeStatusHistory();
+ statusHistory.setStatus(Episode.Status.ACTIVE);
+ statusHistory.setDateStarted(new Date());
+ episode.addEpisodeStatusHistory(statusHistory);
+ episodeAttributes.forEach(attribute -> episode.addAttribute(attribute));
+ episodeService.save(episode);
+ return episode;
+ }
+
+ private ConceptClass findConceptClass(String className) {
+ return conceptService.getConceptClassByName(className);
+ }
+
+ private Concept createConcept(String name) {
+ Concept concept = new Concept();
+ ConceptName cn = new ConceptName();
+ cn.setName(name);
+ cn.setLocale(Locale.ENGLISH);
+ ConceptDatatype naDataType = conceptService.getConceptDatatypeByUuid(ConceptDatatype.N_A_UUID);
+ ConceptClass miscClass = findConceptClass("Misc");
+ concept.addName(cn);
+ concept.setConceptClass(miscClass);
+ concept.setDatatype(naDataType);
+ return conceptService.saveConcept(concept);
+ }
+
+ private Provider createProvider(String name) {
+ Person person = new Person();
+ PersonName personName = new PersonName();
+ personName.setGivenName("Random");
+ personName.setFamilyName("Person");
+ person.addName(personName);
+ personService.savePerson(person);
+ Provider provider = new Provider();
+ provider.setName(name);
+ provider.setPerson(person);
+ providerService.saveProvider(provider);
+ return provider;
+ }
+
+ private Episode createAnEpisode() {
+ Episode episode = new Episode();
+ episode.addPatientProgram(testPatientProgram());
+ episodeService.save(episode);
+ return episode;
+ }
+
+ private PatientProgram testPatientProgram() {
+ return programWorkflowService.getPatientProgram(1);
+ }
+}
\ No newline at end of file
diff --git a/api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplTest.java b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplTest.java
similarity index 80%
rename from api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplTest.java
rename to api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplTest.java
index 2615235..054f2c2 100644
--- a/api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplTest.java
+++ b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplTest.java
@@ -1,4 +1,4 @@
-package org.bahmni.module.episodes.service.impl;
+package org.openmrs.module.episodes.service.impl;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -6,8 +6,7 @@
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.openmrs.Encounter;
-import org.openmrs.module.episodes.dao.impl.EpisodeDAO;
-import org.openmrs.module.episodes.service.impl.EpisodeServiceImpl;
+import org.openmrs.module.episodes.dao.EpisodeDAO;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
diff --git a/api/src/test/java/org/openmrs/module/episodes/service/impl/TestHelper.java b/api/src/test/java/org/openmrs/module/episodes/service/impl/TestHelper.java
new file mode 100644
index 0000000..bea3015
--- /dev/null
+++ b/api/src/test/java/org/openmrs/module/episodes/service/impl/TestHelper.java
@@ -0,0 +1,32 @@
+package org.openmrs.module.episodes.service.impl;
+
+import org.openmrs.module.episodes.EpisodeAttributeType;
+
+public class TestHelper {
+ public static EpisodeAttributeType exampleAttributeTypeInsuranceCaseNumber() {
+ EpisodeAttributeType episodeAttributeType = new EpisodeAttributeType();
+ episodeAttributeType.setName("Insurance case Number");
+ episodeAttributeType.setDescription("Insurance Case Number For Episode");
+ episodeAttributeType.setDatatypeClassname("org.openmrs.customdatatype.datatype.FreeTextDatatype");
+ episodeAttributeType.setMinOccurs(0);
+ return episodeAttributeType;
+ }
+
+ public static EpisodeAttributeType exampleAttributeTypeInsuranceId() {
+ EpisodeAttributeType episodeAttributeType = new EpisodeAttributeType();
+ episodeAttributeType.setName("Insurance Group Id");
+ episodeAttributeType.setDescription("Insurance Id associated with Episode");
+ episodeAttributeType.setDatatypeClassname("org.openmrs.customdatatype.datatype.FloatDatatype");
+ episodeAttributeType.setMinOccurs(0);
+ return episodeAttributeType;
+ }
+
+ public static EpisodeAttributeType exampleAttributeTypeIsAccidentCase() {
+ EpisodeAttributeType episodeAttributeType = new EpisodeAttributeType();
+ episodeAttributeType.setName("Is Accident case");
+ episodeAttributeType.setDescription("Whether accident case");
+ episodeAttributeType.setDatatypeClassname("org.openmrs.customdatatype.datatype.BooleanDatatype");
+ episodeAttributeType.setMinOccurs(0);
+ return episodeAttributeType;
+ }
+}
diff --git a/api/src/test/resources/test-hibernate.cfg.xml b/api/src/test/resources/test-hibernate.cfg.xml
index a5cd501..0bdd62c 100644
--- a/api/src/test/resources/test-hibernate.cfg.xml
+++ b/api/src/test/resources/test-hibernate.cfg.xml
@@ -6,5 +6,9 @@
+
+
+
+
diff --git a/omod/pom.xml b/omod/pom.xml
index d1412da..e64dde2 100644
--- a/omod/pom.xml
+++ b/omod/pom.xml
@@ -4,7 +4,7 @@
org.bahmni.module
episodes
- 1.2.0
+ 1.3.0-SNAPSHOT
episodes-omod
@@ -22,6 +22,11 @@
org.openmrs.web
openmrs-web
+
+ org.openmrs.module
+ webservices.rest-omod
+ provided
+
@@ -102,6 +107,14 @@
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ 8
+ 8
+
+
diff --git a/omod/src/main/java/org/openmrs/module/episodes/web/resource/EpisodeAttributeTypeResource.java b/omod/src/main/java/org/openmrs/module/episodes/web/resource/EpisodeAttributeTypeResource.java
new file mode 100644
index 0000000..d993a41
--- /dev/null
+++ b/omod/src/main/java/org/openmrs/module/episodes/web/resource/EpisodeAttributeTypeResource.java
@@ -0,0 +1,92 @@
+package org.openmrs.module.episodes.web.resource;
+
+import org.openmrs.api.APIException;
+import org.openmrs.api.context.Context;
+import org.openmrs.module.episodes.EpisodeAttributeType;
+import org.openmrs.module.episodes.service.EpisodeAttributeTypeService;
+import org.openmrs.module.webservices.rest.web.RequestContext;
+import org.openmrs.module.webservices.rest.web.RestConstants;
+import org.openmrs.module.webservices.rest.web.annotation.Resource;
+import org.openmrs.module.webservices.rest.web.resource.impl.NeedsPaging;
+import org.openmrs.module.webservices.rest.web.response.ResponseException;
+import org.openmrs.module.webservices.rest.web.v1_0.resource.openmrs1_9.BaseAttributeTypeCrudResource1_9;
+
+import java.util.List;
+import java.util.Optional;
+
+
+@Resource(name = RestConstants.VERSION_1 + "/episode-attribute-type", supportedClass = EpisodeAttributeType.class, supportedOpenmrsVersions = {"2.0.* - 9.*" })
+public class EpisodeAttributeTypeResource extends BaseAttributeTypeCrudResource1_9 {
+
+ public static final String SERVER_ERROR_CAN_NOT_FIND_SERVICE = "Can not perform operation. Please contact your system administrator.";
+
+ public EpisodeAttributeTypeResource() {
+ }
+
+ private EpisodeAttributeTypeService service() {
+ List registeredComponents = Context.getRegisteredComponents(EpisodeAttributeTypeService.class);
+ if (!registeredComponents.isEmpty()) {
+ return registeredComponents.get(0);
+ }
+ return null;
+ }
+
+ /**
+ * @see org.openmrs.module.webservices.rest.web.resource.impl.BaseDelegatingResource#getByUniqueId(String)
+ */
+ @Override
+ public EpisodeAttributeType getByUniqueId(String uniqueId) {
+ EpisodeAttributeTypeService episodeAttributeTypeService = Optional.ofNullable(service()).orElseThrow(() -> new APIException(SERVER_ERROR_CAN_NOT_FIND_SERVICE));
+ return episodeAttributeTypeService.getAttributeTypeByUuid(uniqueId);
+ }
+
+ /**
+ * @see org.openmrs.module.webservices.rest.web.resource.impl.DelegatingCrudResource#doGetAll(RequestContext)
+ */
+ @Override
+ protected NeedsPaging doGetAll(RequestContext context) throws ResponseException {
+ EpisodeAttributeTypeService episodeAttributeTypeService = Optional.ofNullable(service()).orElseThrow(() -> new APIException(SERVER_ERROR_CAN_NOT_FIND_SERVICE));
+ return new NeedsPaging<>(episodeAttributeTypeService.getAllAttributeTypes(false), context);
+ }
+
+ /**
+ * @see org.openmrs.module.webservices.rest.web.resource.impl.BaseDelegatingResource#newDelegate()
+ */
+ @Override
+ public EpisodeAttributeType newDelegate() {
+ return new EpisodeAttributeType();
+ }
+
+ /**
+ * @see org.openmrs.module.webservices.rest.web.resource.impl.DelegatingResourceHandler#save(Object)
+ */
+ @Override
+ public EpisodeAttributeType save(EpisodeAttributeType delegate) {
+ EpisodeAttributeTypeService episodeAttributeTypeService = Optional.ofNullable(service()).orElseThrow(() -> new APIException(SERVER_ERROR_CAN_NOT_FIND_SERVICE));
+ return episodeAttributeTypeService.save(delegate);
+ }
+
+ /**
+ * @see org.openmrs.module.webservices.rest.web.resource.impl.BaseDelegatingResource#purge(Object,
+ * RequestContext)
+ */
+ @Override
+ public void purge(EpisodeAttributeType delegate, RequestContext context) throws ResponseException {
+ EpisodeAttributeTypeService episodeAttributeTypeService = Optional.ofNullable(service()).orElseThrow(() -> new APIException(SERVER_ERROR_CAN_NOT_FIND_SERVICE));
+ episodeAttributeTypeService.retire(delegate, "user action");
+ }
+
+ /**
+ * @see org.openmrs.module.webservices.rest.web.resource.impl.DelegatingCrudResource#doSearch(RequestContext)
+ */
+ @Override
+ protected NeedsPaging doSearch(RequestContext context) {
+ EpisodeAttributeTypeService episodeAttributeTypeService = Optional.ofNullable(service()).orElseThrow(() -> new APIException(SERVER_ERROR_CAN_NOT_FIND_SERVICE));
+ return new NeedsPaging<>(episodeAttributeTypeService.getAttributesByName(context.getParameter("q")), context);
+ }
+
+ @Override
+ public String getResourceVersion() {
+ return "2.0";
+ }
+}
diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml
index c0c61cb..d685090 100644
--- a/omod/src/main/resources/config.xml
+++ b/omod/src/main/resources/config.xml
@@ -13,9 +13,42 @@
org.openmrs.module.episodes.EpisodeActivator
@openmrs.platform.version@
+
+ org.openmrs.module.webservices.rest
+
+
+
+ Get Episodes
+ Ability to get episodes
+
+
+ Add Episodes
+ Ability to add episodes
+
+
+ Edit Episodes
+ Ability to edit episodes
+
+
+ Delete Episodes
+ Ability to delete episodes
+
+
+
+ Get Episode Attribute Types
+ Able to view Episode Attribute Types
+
+
+ Manage Episode Attribute Types
+ Ability to add/edit/retire Episode Attribute Types
+
Episode.hbm.xml
+ EpisodeReason.hbm.xml
+ EpisodeAttributeType.hbm.xml
+ EpisodeAttribute.hbm.xml
+ EpisodeStatusHistory.hbm.xml
diff --git a/omod/src/main/resources/webModuleApplicationContext.xml b/omod/src/main/resources/webModuleApplicationContext.xml
index 9fec7c1..1a034f4 100644
--- a/omod/src/main/resources/webModuleApplicationContext.xml
+++ b/omod/src/main/resources/webModuleApplicationContext.xml
@@ -19,5 +19,7 @@
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/util
http://www.springframework.org/schema/util/spring-util-3.0.xsd">
+
+
diff --git a/pom.xml b/pom.xml
index 70b9ae8..91615f7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
org.bahmni.module
episodes
- 1.2.0
+ 1.3.0-SNAPSHOT
pom
Episodes of Care Module
Implementation of Episodes of Care for OpenMRS
@@ -53,6 +53,7 @@
1.7.4
3.5.11
4.0.1
+ 2.29.0
@@ -192,6 +193,12 @@
${mockitoVersion}
test
+
+ org.openmrs.module
+ webservices.rest-omod
+ ${webServices.version}
+ provided
+
@@ -236,9 +243,10 @@
org.apache.maven.plugins
maven-compiler-plugin
+ 3.14.0
- 1.7
- 1.7
+ 1.8
+ 1.8