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