From c165aecebe00adee4dd8d0eb83cae37788cfa6bc Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Sun, 12 Oct 2025 19:17:23 +0530 Subject: [PATCH 01/17] Extending episode model for patient ref, reasons, period, status. Also adding episode attribute model --- .../org/openmrs/module/episodes/Episode.java | 72 +++++- .../module/episodes/EpisodeAttribute.java | 36 +++ .../module/episodes/EpisodeAttributeType.java | 26 ++ .../module/episodes/EpisodeReason.java | 70 ++++++ .../module/episodes/dao/impl/EpisodeDAO.java | 2 + .../dao/impl/impl/EpisodeDAOImpl.java | 10 +- .../episodes/service/EpisodeService.java | 2 + .../service/impl/EpisodeServiceImpl.java | 5 + api/src/main/resources/Episode.hbm.xml | 24 +- .../main/resources/EpisodeAttribute.hbm.xml | 42 ++++ .../resources/EpisodeAttributeType.hbm.xml | 52 ++++ api/src/main/resources/EpisodeReason.hbm.xml | 19 ++ api/src/main/resources/liquibase.xml | 223 ++++++++++++++++++ .../impl/EpisodeServiceImplITTest.java | 19 +- api/src/test/resources/test-hibernate.cfg.xml | 3 + omod/src/main/resources/config.xml | 20 ++ 16 files changed, 618 insertions(+), 7 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/episodes/EpisodeAttribute.java create mode 100644 api/src/main/java/org/openmrs/module/episodes/EpisodeAttributeType.java create mode 100644 api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java create mode 100644 api/src/main/resources/EpisodeAttribute.hbm.xml create mode 100644 api/src/main/resources/EpisodeAttributeType.hbm.xml create mode 100644 api/src/main/resources/EpisodeReason.hbm.xml 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..100353d 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,67 @@ package org.openmrs.module.episodes; -import org.openmrs.BaseOpenmrsData; +import org.openmrs.BaseCustomizableData; import org.openmrs.Encounter; +import org.openmrs.Patient; import org.openmrs.PatientProgram; +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; + + 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 enum Status { + UNKNOWN, + PLANNED, + ACTIVE, + ONHOLD, + FINISHED, + CANCELLED, + ENTERED_IN_ERROR + } public Episode(Integer episodeId, Set encounters, Set patientPrograms) { this.episodeId = episodeId; @@ -18,6 +69,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 +94,7 @@ public Integer getId() { @Override public void setId(Integer id) { - + this.episodeId = id; } public Set getPatientPrograms() { @@ -62,4 +120,12 @@ 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; + } } 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..8b2a08f --- /dev/null +++ b/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java @@ -0,0 +1,70 @@ +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 reason; + private Episode episode; + + 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 getReason() { + return reason; + } + + public void setReason(Concept reason) { + this.reason = reason; + } + + public Episode getEpisode() { + return episode; + } + + public void setEpisode(Episode episode) { + this.episode = episode; + } +} 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/impl/EpisodeDAO.java index 1c0a77e..cae0bb9 100644 --- a/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAO.java +++ b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeDAO.java @@ -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/impl/EpisodeDAOImpl.java b/api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeDAOImpl.java index 5768f59..ca858c1 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/impl/EpisodeDAOImpl.java @@ -1,7 +1,7 @@ package org.openmrs.module.episodes.dao.impl.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; @@ -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/EpisodeService.java b/api/src/main/java/org/openmrs/module/episodes/service/EpisodeService.java index 2e89f47..4ec0f90 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 @@ -11,6 +11,8 @@ public interface EpisodeService { 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/service/impl/EpisodeServiceImpl.java b/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImpl.java index 2209558..817367a 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 @@ -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..332fd49 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -2,7 +2,7 @@ - + @@ -41,5 +41,27 @@ + + + + + + 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..1b68c7e --- /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..e4e8fdb --- /dev/null +++ b/api/src/main/resources/EpisodeReason.hbm.xml @@ -0,0 +1,19 @@ + + + + + + + + episode_id + + + + + + + + + diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 2a41878..e91c2b6 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -73,4 +73,227 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 index 6930d9d..400a7b7 100644 --- 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 @@ -6,12 +6,12 @@ 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.Date; import java.util.Set; import static org.hamcrest.MatcherAssert.assertThat; @@ -19,7 +19,6 @@ 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 @@ -78,6 +77,22 @@ public void shouldReturnEpisodeRelatedToAnEncounter() { assertThat(episodeForEncounter, is(episode)); } + @Test + public void shouldCreateANewEpisodeForPatient() { + Episode episode = createAnEpisodeForPatient(); + assertThat(episode.getId(), is(notNullValue())); + Episode savedEpisode = episodeService.get(episode.getId()); + assertThat(savedEpisode.getEncounters(), is(notNullValue())); + } + + private Episode createAnEpisodeForPatient() { + Episode episode = new Episode(); + episode.setPatient(new Patient()); + episode.setDateCreated(new Date()); + episodeService.save(episode); + return episode; + } + private Episode createAnEpisode() { Episode episode = new Episode(); episode.addPatientProgram(testPatientProgram()); diff --git a/api/src/test/resources/test-hibernate.cfg.xml b/api/src/test/resources/test-hibernate.cfg.xml index a5cd501..8b4e30f 100644 --- a/api/src/test/resources/test-hibernate.cfg.xml +++ b/api/src/test/resources/test-hibernate.cfg.xml @@ -6,5 +6,8 @@ + + + diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index c0c61cb..955a4c4 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -14,8 +14,28 @@ @openmrs.platform.version@ + + Get Episodes + Ability to get episodes + + + Add Episodes + Ability to add episodes + + + Edit Episodes + Ability to edit episodes + + + Delete Episodes + Ability to delete episodes + + Episode.hbm.xml + EpisodeReason.hbm.xml + EpisodeAttributeType.hbm.xml + EpisodeAttribute.hbm.xml From 9908e43f75f1eaba52d0466835b3c4925f6f2686 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Mon, 13 Oct 2025 00:29:43 +0530 Subject: [PATCH 02/17] Adding episode.type as classification of episode --- .../org/openmrs/module/episodes/Episode.java | 10 ++++++++++ api/src/main/resources/Episode.hbm.xml | 2 ++ api/src/main/resources/liquibase.xml | 17 +++++++++++++++++ .../service/impl/EpisodeServiceImplITTest.java | 6 ++++-- 4 files changed, 33 insertions(+), 2 deletions(-) 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 100353d..3a1bbef 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -1,6 +1,7 @@ package org.openmrs.module.episodes; import org.openmrs.BaseCustomizableData; +import org.openmrs.Concept; import org.openmrs.Encounter; import org.openmrs.Patient; import org.openmrs.PatientProgram; @@ -19,6 +20,7 @@ public class Episode extends BaseCustomizableData { private Episode.Status status = Episode.Status.ACTIVE; private Date dateStarted; private Date dateEnded; + private Concept concept; public Status getStatus() { return status; @@ -53,6 +55,14 @@ public void setDateStarted(Date dateStarted) { this.dateStarted = dateStarted; } + public Concept getConcept() { + return concept; + } + + public void setConcept(Concept concept) { + this.concept = concept; + } + public enum Status { UNKNOWN, PLANNED, diff --git a/api/src/main/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml index 332fd49..15fd0eb 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -63,5 +63,7 @@ + + diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index e91c2b6..c44e0b8 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -166,6 +166,23 @@ + + + + + + + + + + + + + + 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 index 400a7b7..d579306 100644 --- 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 @@ -1,6 +1,7 @@ package org.bahmni.module.episodes.service.impl; import org.junit.Test; +import org.openmrs.Concept; import org.openmrs.Encounter; import org.openmrs.Patient; import org.openmrs.PatientProgram; @@ -79,16 +80,17 @@ public void shouldReturnEpisodeRelatedToAnEncounter() { @Test public void shouldCreateANewEpisodeForPatient() { - Episode episode = createAnEpisodeForPatient(); + Episode episode = createAnEpisodeForPatientWithType(); assertThat(episode.getId(), is(notNullValue())); Episode savedEpisode = episodeService.get(episode.getId()); assertThat(savedEpisode.getEncounters(), is(notNullValue())); } - private Episode createAnEpisodeForPatient() { + private Episode createAnEpisodeForPatientWithType() { Episode episode = new Episode(); episode.setPatient(new Patient()); episode.setDateCreated(new Date()); + episode.setConcept(new Concept()); episodeService.save(episode); return episode; } From c991a3012a38fed483e12f0361e6e7bb02501838 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Mon, 13 Oct 2025 19:26:46 +0530 Subject: [PATCH 03/17] Adding location to Episode --- .../org/openmrs/module/episodes/Episode.java | 10 ++++++++++ api/src/main/resources/Episode.hbm.xml | 1 + api/src/main/resources/liquibase.xml | 17 +++++++++++++++++ 3 files changed, 28 insertions(+) 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 3a1bbef..d7f6457 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -3,6 +3,7 @@ import org.openmrs.BaseCustomizableData; import org.openmrs.Concept; import org.openmrs.Encounter; +import org.openmrs.Location; import org.openmrs.Patient; import org.openmrs.PatientProgram; @@ -21,6 +22,7 @@ public class Episode extends BaseCustomizableData { private Date dateStarted; private Date dateEnded; private Concept concept; + private Location location; public Status getStatus() { return status; @@ -63,6 +65,14 @@ public void setConcept(Concept concept) { this.concept = concept; } + public Location getLocation() { + return location; + } + + public void setLocation(Location location) { + this.location = location; + } + public enum Status { UNKNOWN, PLANNED, diff --git a/api/src/main/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml index 15fd0eb..82c455f 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -65,5 +65,6 @@ + diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index c44e0b8..04ecf64 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -183,6 +183,23 @@ referencedTableName="concept" referencedColumnNames="concept_id" /> + + + + + + + + + + + + + + From c7d0c1fcdfdc38ce47226c8fdd1039a4ae452445 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Mon, 13 Oct 2025 19:33:35 +0530 Subject: [PATCH 04/17] Removing Location from Episode --- .../org/openmrs/module/episodes/Episode.java | 9 --------- api/src/main/resources/Episode.hbm.xml | 1 - api/src/main/resources/liquibase.xml | 17 ----------------- 3 files changed, 27 deletions(-) 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 d7f6457..bac0bd8 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -22,7 +22,6 @@ public class Episode extends BaseCustomizableData { private Date dateStarted; private Date dateEnded; private Concept concept; - private Location location; public Status getStatus() { return status; @@ -65,14 +64,6 @@ public void setConcept(Concept concept) { this.concept = concept; } - public Location getLocation() { - return location; - } - - public void setLocation(Location location) { - this.location = location; - } - public enum Status { UNKNOWN, PLANNED, diff --git a/api/src/main/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml index 82c455f..15fd0eb 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -65,6 +65,5 @@ - diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 04ecf64..c44e0b8 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -183,23 +183,6 @@ referencedTableName="concept" referencedColumnNames="concept_id" /> - - - - - - - - - - - - - - From dcf8371377ec482f72a232107705e606328a262f Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Tue, 14 Oct 2025 14:45:03 +0530 Subject: [PATCH 05/17] bumping version to 1.3.0-SNAPSHOT --- api/pom.xml | 2 +- omod/pom.xml | 2 +- pom.xml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/pom.xml b/api/pom.xml index c4294c3..a7c358c 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -4,7 +4,7 @@ org.bahmni.module episodes - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT episodes-api diff --git a/omod/pom.xml b/omod/pom.xml index 7621b37..4b402b4 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -4,7 +4,7 @@ org.bahmni.module episodes - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT episodes-omod diff --git a/pom.xml b/pom.xml index 20ab1f7..20459a6 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ org.bahmni.module episodes - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT pom Episodes of Care Module Implementation of Episodes of Care for OpenMRS From 63cbd2838310ec183c5c0775ae3c6745117d5e1b Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Wed, 15 Oct 2025 15:52:44 +0530 Subject: [PATCH 06/17] Added Episode Status History. Added integration test --- .../org/openmrs/module/episodes/Episode.java | 31 +++++- .../module/episodes/EpisodeReason.java | 36 +++++++ .../module/episodes/EpisodeStatusHistory.java | 83 ++++++++++++++++ api/src/main/resources/Episode.hbm.xml | 19 +++- api/src/main/resources/EpisodeReason.hbm.xml | 12 ++- .../resources/EpisodeStatusHistory.hbm.xml | 25 +++++ api/src/main/resources/liquibase.xml | 96 +++++++++++++++++++ .../impl/EpisodeServiceImplITTest.java | 44 ++++++++- api/src/test/resources/test-hibernate.cfg.xml | 1 + omod/src/main/resources/config.xml | 1 + 10 files changed, 339 insertions(+), 9 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/episodes/EpisodeStatusHistory.java create mode 100644 api/src/main/resources/EpisodeStatusHistory.hbm.xml 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 bac0bd8..b9dd0ab 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -3,9 +3,10 @@ import org.openmrs.BaseCustomizableData; import org.openmrs.Concept; import org.openmrs.Encounter; -import org.openmrs.Location; import org.openmrs.Patient; import org.openmrs.PatientProgram; +import org.openmrs.User; +import org.openmrs.Visit; import java.util.Date; import java.util.HashSet; @@ -22,6 +23,9 @@ public class Episode extends BaseCustomizableData { private Date dateStarted; private Date dateEnded; private Concept concept; + private Set statusHistory = new HashSet<>(); + private User careManager; + private Set visits = new HashSet<>(); public Status getStatus() { return status; @@ -64,8 +68,33 @@ public void setConcept(Concept concept) { this.concept = concept; } + public User getCareManager() { + return careManager; + } + + public void setCareManager(User 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, diff --git a/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java b/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java index 8b2a08f..6b07eb2 100644 --- a/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java +++ b/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java @@ -14,6 +14,10 @@ public class EpisodeReason extends BaseOpenmrsObject { private Date dateCreated; private Concept reason; private Episode episode; + private Boolean voided = Boolean.FALSE; + private Date dateVoided; + private User voidedBy; + private String voidReason; public Integer getEpisodeReasonId() { return episodeReasonId; @@ -67,4 +71,36 @@ public Episode getEpisode() { 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; + } } 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/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml index 15fd0eb..0778feb 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -8,7 +8,7 @@ - episode_id + episode_episode_id_seq @@ -32,7 +32,7 @@ - + @@ -65,5 +65,20 @@ + + + + + + + + + + + + + + + diff --git a/api/src/main/resources/EpisodeReason.hbm.xml b/api/src/main/resources/EpisodeReason.hbm.xml index e4e8fdb..e3c6fe2 100644 --- a/api/src/main/resources/EpisodeReason.hbm.xml +++ b/api/src/main/resources/EpisodeReason.hbm.xml @@ -7,13 +7,19 @@ - episode_id + 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..36d6a95 --- /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 c44e0b8..1b2b55d 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -312,5 +312,101 @@ referencedTableName="users" referencedColumnNames="user_id" /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 index d579306..1ae778a 100644 --- 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 @@ -2,17 +2,24 @@ 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.api.ConceptService; import org.openmrs.api.EncounterService; import org.openmrs.api.ProgramWorkflowService; import org.openmrs.module.episodes.Episode; +import org.openmrs.module.episodes.EpisodeReason; +import org.openmrs.module.episodes.EpisodeStatusHistory; import org.openmrs.module.episodes.service.EpisodeService; import org.openmrs.test.BaseModuleContextSensitiveTest; import org.springframework.beans.factory.annotation.Autowired; import java.util.Date; +import java.util.Locale; import java.util.Set; import static org.hamcrest.MatcherAssert.assertThat; @@ -31,6 +38,9 @@ public class EpisodeServiceImplITTest extends BaseModuleContextSensitiveTest { @Autowired private EncounterService encounterService; + @Autowired + private ConceptService conceptService; + @Test public void shouldCreateANewEpisode() { Episode episode = createAnEpisode(); @@ -80,21 +90,49 @@ public void shouldReturnEpisodeRelatedToAnEncounter() { @Test public void shouldCreateANewEpisodeForPatient() { - Episode episode = createAnEpisodeForPatientWithType(); + Episode episode = createAnEpisodeForPatientWithTypeAndReason(); assertThat(episode.getId(), is(notNullValue())); Episode savedEpisode = episodeService.get(episode.getId()); assertThat(savedEpisode.getEncounters(), is(notNullValue())); } - private Episode createAnEpisodeForPatientWithType() { + private Episode createAnEpisodeForPatientWithTypeAndReason() { Episode episode = new Episode(); episode.setPatient(new Patient()); episode.setDateCreated(new Date()); - episode.setConcept(new Concept()); + episode.setStatus(Episode.Status.ACTIVE); + episode.setConcept(createConcept("hospitalization")); + EpisodeReason reason = new EpisodeReason(); + reason.setEpisode(episode); + Concept concept = conceptService.saveConcept(createConcept("accident")); + reason.setReason(concept); + episode.getEpisodeReason().add(reason); + EpisodeStatusHistory statusHistory = new EpisodeStatusHistory(); + statusHistory.setEpisode(episode); + statusHistory.setStatus(Episode.Status.ACTIVE); + statusHistory.setDateStarted(new Date()); + episode.getStatusHistory().add(statusHistory); 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 concept; + } + private Episode createAnEpisode() { Episode episode = new Episode(); episode.addPatientProgram(testPatientProgram()); diff --git a/api/src/test/resources/test-hibernate.cfg.xml b/api/src/test/resources/test-hibernate.cfg.xml index 8b4e30f..0bdd62c 100644 --- a/api/src/test/resources/test-hibernate.cfg.xml +++ b/api/src/test/resources/test-hibernate.cfg.xml @@ -9,5 +9,6 @@ + diff --git a/omod/src/main/resources/config.xml b/omod/src/main/resources/config.xml index 955a4c4..09342bd 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -36,6 +36,7 @@ EpisodeReason.hbm.xml EpisodeAttributeType.hbm.xml EpisodeAttribute.hbm.xml + EpisodeStatusHistory.hbm.xml From dd81018111edbc3b3192fe4db547aaebb5417aa7 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Wed, 15 Oct 2025 16:06:07 +0530 Subject: [PATCH 07/17] Minor improvement. --- .../java/org/openmrs/module/episodes/Episode.java | 14 ++++++++++++++ .../service/impl/EpisodeServiceImplITTest.java | 11 ++++------- 2 files changed, 18 insertions(+), 7 deletions(-) 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 b9dd0ab..cd78e3d 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -168,4 +168,18 @@ public Patient getPatient() { 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); + } + } } 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 index 1ae778a..ab0b05f 100644 --- 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 @@ -103,15 +103,12 @@ private Episode createAnEpisodeForPatientWithTypeAndReason() { episode.setStatus(Episode.Status.ACTIVE); episode.setConcept(createConcept("hospitalization")); EpisodeReason reason = new EpisodeReason(); - reason.setEpisode(episode); - Concept concept = conceptService.saveConcept(createConcept("accident")); - reason.setReason(concept); - episode.getEpisodeReason().add(reason); + reason.setReason(createConcept("accident")); + episode.addEpisodeReason(reason); EpisodeStatusHistory statusHistory = new EpisodeStatusHistory(); - statusHistory.setEpisode(episode); statusHistory.setStatus(Episode.Status.ACTIVE); statusHistory.setDateStarted(new Date()); - episode.getStatusHistory().add(statusHistory); + episode.addEpisodeStatusHistory(statusHistory); episodeService.save(episode); return episode; } @@ -130,7 +127,7 @@ private Concept createConcept(String name) { concept.addName(cn); concept.setConceptClass(miscClass); concept.setDatatype(naDataType); - return concept; + return conceptService.saveConcept(concept); } private Episode createAnEpisode() { From ead59b53e48efcb5bc3ca40082ca87df381edec5 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Wed, 15 Oct 2025 21:48:42 +0530 Subject: [PATCH 08/17] minor code improvement --- api/src/main/java/org/openmrs/module/episodes/Episode.java | 4 ++++ 1 file changed, 4 insertions(+) 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 cd78e3d..8856f0b 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -182,4 +182,8 @@ public void addEpisodeStatusHistory(EpisodeStatusHistory statusHistory) { getStatusHistory().add(statusHistory); } } + + public boolean hasStatusHistory() { + return statusHistory != null && !statusHistory.isEmpty(); + } } From 1535744e7fa3ff679639127196ec5cab1e385f74 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Sat, 18 Oct 2025 22:50:28 +0530 Subject: [PATCH 09/17] Squashing the liquibase episode model --- .../module/episodes/EpisodeReason.java | 30 +++- api/src/main/resources/Episode.hbm.xml | 2 +- .../resources/EpisodeAttributeType.hbm.xml | 2 +- api/src/main/resources/EpisodeReason.hbm.xml | 5 +- .../resources/EpisodeStatusHistory.hbm.xml | 2 +- api/src/main/resources/liquibase.xml | 143 +++++------------- .../impl/EpisodeServiceImplITTest.java | 2 +- 7 files changed, 70 insertions(+), 116 deletions(-) diff --git a/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java b/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java index 6b07eb2..d15bba8 100644 --- a/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java +++ b/api/src/main/java/org/openmrs/module/episodes/EpisodeReason.java @@ -12,13 +12,17 @@ public class EpisodeReason extends BaseOpenmrsObject { private User creator; private Date dateCreated; - private Concept reason; + 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; } @@ -56,12 +60,12 @@ public void setCreator(User creator) { this.creator = creator; } - public Concept getReason() { - return reason; + public Concept getReasonUse() { + return reasonUse; } - public void setReason(Concept reason) { - this.reason = reason; + public void setReasonUse(Concept reasonUse) { + this.reasonUse = reasonUse; } public Episode getEpisode() { @@ -103,4 +107,20 @@ public String getVoidReason() { 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/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml index 0778feb..f512177 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -44,7 +44,7 @@ - + org.openmrs.module.episodes.Episode$Status true diff --git a/api/src/main/resources/EpisodeAttributeType.hbm.xml b/api/src/main/resources/EpisodeAttributeType.hbm.xml index 1b68c7e..54d0c57 100644 --- a/api/src/main/resources/EpisodeAttributeType.hbm.xml +++ b/api/src/main/resources/EpisodeAttributeType.hbm.xml @@ -13,7 +13,7 @@ - + diff --git a/api/src/main/resources/EpisodeReason.hbm.xml b/api/src/main/resources/EpisodeReason.hbm.xml index e3c6fe2..29fdb14 100644 --- a/api/src/main/resources/EpisodeReason.hbm.xml +++ b/api/src/main/resources/EpisodeReason.hbm.xml @@ -11,7 +11,7 @@ - + @@ -21,5 +21,8 @@ + + + diff --git a/api/src/main/resources/EpisodeStatusHistory.hbm.xml b/api/src/main/resources/EpisodeStatusHistory.hbm.xml index 36d6a95..af4547d 100644 --- a/api/src/main/resources/EpisodeStatusHistory.hbm.xml +++ b/api/src/main/resources/EpisodeStatusHistory.hbm.xml @@ -11,7 +11,7 @@ - + org.openmrs.module.episodes.Episode$Status true diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 1b2b55d..0c37233 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -82,18 +82,26 @@ - - + + + + + + + + + + @@ -107,10 +115,18 @@ baseTableName="episode_reason" baseColumnNames="episode_id" referencedTableName="episode" referencedColumnNames="episode_id" /> - + + @@ -125,73 +141,33 @@ - - - - - - - - - - - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + - - - - - - - - + @@ -203,10 +179,10 @@ - + - + @@ -243,13 +219,13 @@ - - - @@ -294,13 +270,6 @@ - - - - - - - @@ -312,23 +281,6 @@ referencedTableName="users" referencedColumnNames="user_id" /> - - - - - - - - - - - - - - @@ -355,7 +307,7 @@ - + @@ -387,26 +339,5 @@ baseTableName="episode_status_history" baseColumnNames="creator" referencedTableName="users" referencedColumnNames="user_id" /> - - - - - - - - - - - - - - - - - - \ 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 index ab0b05f..a20aa8b 100644 --- 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 @@ -103,8 +103,8 @@ private Episode createAnEpisodeForPatientWithTypeAndReason() { episode.setStatus(Episode.Status.ACTIVE); episode.setConcept(createConcept("hospitalization")); EpisodeReason reason = new EpisodeReason(); - reason.setReason(createConcept("accident")); episode.addEpisodeReason(reason); + reason.setValueConcept(createConcept("accident")); EpisodeStatusHistory statusHistory = new EpisodeStatusHistory(); statusHistory.setStatus(Episode.Status.ACTIVE); statusHistory.setDateStarted(new Date()); From 5e7c8f365a19c6d7b7dc8278e53b3f66a4b8bd6c Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Sat, 18 Oct 2025 23:26:38 +0530 Subject: [PATCH 10/17] fixing liquibase error for conflicting id --- api/src/main/resources/liquibase.xml | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 0c37233..80dbb66 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -213,12 +213,7 @@ - - - - - - + @@ -258,12 +253,7 @@ - - - - - - + From 180f9af39ce583504f3b992b35327e709d74fc85 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Mon, 27 Oct 2025 19:13:06 +0530 Subject: [PATCH 11/17] Created Dao and service and resource controller for Episode Attribute type --- .../dao/impl/EpisodeAttributeTypeDao.java | 17 ++++ .../impl/EpisodeAttributeTypeDaoImpl.java | 61 ++++++++++++ .../service/EpisodeAttributeTypeService.java | 31 +++++++ .../impl/EpisodeAttributeTypeServiceImpl.java | 52 +++++++++++ ...EpisodeAttributeTypeServiceImplITTest.java | 76 +++++++++++++++ .../impl/EpisodeServiceImplITTest.java | 2 +- .../service/impl/EpisodeServiceImplTest.java | 2 +- omod/pom.xml | 18 ++++ .../EpisodeAttributeTypeResource.java | 92 +++++++++++++++++++ omod/src/main/resources/config.xml | 12 +++ .../resources/webModuleApplicationContext.xml | 2 + pom.xml | 19 ++++ 12 files changed, 382 insertions(+), 2 deletions(-) create mode 100644 api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDao.java create mode 100644 api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeAttributeTypeDaoImpl.java create mode 100644 api/src/main/java/org/openmrs/module/episodes/service/EpisodeAttributeTypeService.java create mode 100644 api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImpl.java create mode 100644 api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImplITTest.java rename api/src/test/java/org/{bahmni => openmrs}/module/episodes/service/impl/EpisodeServiceImplITTest.java (99%) rename api/src/test/java/org/{bahmni => openmrs}/module/episodes/service/impl/EpisodeServiceImplTest.java (94%) create mode 100644 omod/src/main/java/org/openmrs/module/episodes/web/resource/EpisodeAttributeTypeResource.java diff --git a/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDao.java b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDao.java new file mode 100644 index 0000000..b853f80 --- /dev/null +++ b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDao.java @@ -0,0 +1,17 @@ +package org.openmrs.module.episodes.dao.impl; + +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/impl/EpisodeAttributeTypeDaoImpl.java b/api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeAttributeTypeDaoImpl.java new file mode 100644 index 0000000..35cf62a --- /dev/null +++ b/api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeAttributeTypeDaoImpl.java @@ -0,0 +1,61 @@ +package org.openmrs.module.episodes.dao.impl.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.impl.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/service/EpisodeAttributeTypeService.java b/api/src/main/java/org/openmrs/module/episodes/service/EpisodeAttributeTypeService.java new file mode 100644 index 0000000..f63b85f --- /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({"View Appointments"}) + 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/impl/EpisodeAttributeTypeServiceImpl.java b/api/src/main/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImpl.java new file mode 100644 index 0000000..ac6f8de --- /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.impl.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/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..7d10f2a --- /dev/null +++ b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeAttributeTypeServiceImplITTest.java @@ -0,0 +1,76 @@ +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; + +public class EpisodeAttributeTypeServiceImplITTest extends BaseModuleContextSensitiveTest { + + @Autowired + private EpisodeAttributeTypeService attributeTypeService; + + @Test + public void shouldCreateNewEpisodeAttributeType() { + EpisodeAttributeType caseNumberAttributeType = exampleAttributeTypeInsuranceCase(); + 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(exampleAttributeTypeInsuranceCase()); + EpisodeAttributeType insuranceIdAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceId()); + EpisodeAttributeType attributeType = attributeTypeService.getAttributeTypeByUuid(caseAttributeType.getUuid()); + Assert.assertEquals(caseAttributeType, attributeType); + + } + + @Test + public void shouldGetMultipleNonRetiredEpisodeAttributeTypes() { + attributeTypeService.save(exampleAttributeTypeInsuranceCase()); + attributeTypeService.save(exampleAttributeTypeInsuranceId()); + List allAttributeTypes = attributeTypeService.getAllAttributeTypes(false); + Assert.assertEquals(2, allAttributeTypes.size()); + } + + @Test + public void shouldRetireAnEpisodeAttributeType() { + EpisodeAttributeType caseAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceCase()); + Assert.assertTrue(!caseAttributeType.getRetired()); + EpisodeAttributeType retired = attributeTypeService.retire(caseAttributeType, "entered-in-error"); + Assert.assertTrue(retired.getRetired()); + } + + @Test + public void shouldSearchEpisodeAttributeTypesByName() { + attributeTypeService.save(exampleAttributeTypeInsuranceCase()); + attributeTypeService.save(exampleAttributeTypeInsuranceId()); + List allAttributeTypes = attributeTypeService.getAttributesByName("Insurance"); + Assert.assertEquals(2, allAttributeTypes.size()); + List matches = attributeTypeService.getAttributesByName("Insurance case"); + Assert.assertEquals(1, matches.size()); + } + + private EpisodeAttributeType exampleAttributeTypeInsuranceCase() { + 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; + } + + private EpisodeAttributeType exampleAttributeTypeInsuranceId() { + EpisodeAttributeType episodeAttributeType = new EpisodeAttributeType(); + episodeAttributeType.setName("Insurance ID"); + episodeAttributeType.setDescription("Insurance ID associated with Episode"); + episodeAttributeType.setDatatypeClassname("org.openmrs.customdatatype.datatype.FloatDatatype"); + episodeAttributeType.setMinOccurs(0); + return episodeAttributeType; + } +} \ 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/openmrs/module/episodes/service/impl/EpisodeServiceImplITTest.java similarity index 99% rename from api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplITTest.java rename to api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplITTest.java index a20aa8b..c43b251 100644 --- a/api/src/test/java/org/bahmni/module/episodes/service/impl/EpisodeServiceImplITTest.java +++ b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplITTest.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.openmrs.Concept; 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 94% 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..05fdcb4 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; diff --git a/omod/pom.xml b/omod/pom.xml index 4b402b4..43c18eb 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -22,6 +22,16 @@ org.openmrs.web openmrs-web + + org.openmrs.module + webservices.rest-omod-common + provided + + + org.openmrs.module + webservices.rest-omod + provided + @@ -102,6 +112,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 09342bd..d685090 100644 --- a/omod/src/main/resources/config.xml +++ b/omod/src/main/resources/config.xml @@ -13,6 +13,9 @@ org.openmrs.module.episodes.EpisodeActivator @openmrs.platform.version@ + + org.openmrs.module.webservices.rest + Get Episodes @@ -31,6 +34,15 @@ 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 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 20459a6..6782ccb 100644 --- a/pom.xml +++ b/pom.xml @@ -53,6 +53,7 @@ 1.7.4 3.5.11 4.0.1 + 2.29.0 @@ -185,6 +186,24 @@ ${mockitoVersion} test + + org.openmrs.module + webservices.rest-omod + ${webServices.version} + provided + + + org.openmrs.module + webservices.rest-omod-common + ${webServices.version} + provided + + + org.openmrs.module + webservices.rest-omod + ${webServices.version} + provided + From 6a69ac26db4680e90575e384bfa9e07af4c61a4d Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Mon, 27 Oct 2025 21:49:17 +0530 Subject: [PATCH 12/17] Refactoring - the dao package had redundant dao.impl.imp structure. - removed dependency of webservices.rest-omod-common, as its has transitive dependency of webservices.rest-omod --- .../dao/{impl => }/EpisodeAttributeTypeDao.java | 2 +- .../module/episodes/dao/{impl => }/EpisodeDAO.java | 2 +- .../impl/{impl => }/EpisodeAttributeTypeDaoImpl.java | 4 ++-- .../episodes/dao/impl/{impl => }/EpisodeDAOImpl.java | 4 ++-- .../impl/EpisodeAttributeTypeServiceImpl.java | 2 +- .../episodes/service/impl/EpisodeServiceImpl.java | 2 +- .../module/episodes/dao/impl/EpisodeDaoTest.java | 1 + .../service/impl/EpisodeServiceImplTest.java | 3 +-- omod/pom.xml | 5 ----- pom.xml | 12 ------------ 10 files changed, 10 insertions(+), 27 deletions(-) rename api/src/main/java/org/openmrs/module/episodes/dao/{impl => }/EpisodeAttributeTypeDao.java (90%) rename api/src/main/java/org/openmrs/module/episodes/dao/{impl => }/EpisodeDAO.java (90%) rename api/src/main/java/org/openmrs/module/episodes/dao/impl/{impl => }/EpisodeAttributeTypeDaoImpl.java (95%) rename api/src/main/java/org/openmrs/module/episodes/dao/impl/{impl => }/EpisodeDAOImpl.java (94%) diff --git a/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDao.java b/api/src/main/java/org/openmrs/module/episodes/dao/EpisodeAttributeTypeDao.java similarity index 90% rename from api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDao.java rename to api/src/main/java/org/openmrs/module/episodes/dao/EpisodeAttributeTypeDao.java index b853f80..264b432 100644 --- a/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDao.java +++ b/api/src/main/java/org/openmrs/module/episodes/dao/EpisodeAttributeTypeDao.java @@ -1,4 +1,4 @@ -package org.openmrs.module.episodes.dao.impl; +package org.openmrs.module.episodes.dao; import org.openmrs.module.episodes.EpisodeAttributeType; 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 90% 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 cae0bb9..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; diff --git a/api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeAttributeTypeDaoImpl.java b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDaoImpl.java similarity index 95% rename from api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeAttributeTypeDaoImpl.java rename to api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDaoImpl.java index 35cf62a..aa8d3be 100644 --- a/api/src/main/java/org/openmrs/module/episodes/dao/impl/impl/EpisodeAttributeTypeDaoImpl.java +++ b/api/src/main/java/org/openmrs/module/episodes/dao/impl/EpisodeAttributeTypeDaoImpl.java @@ -1,10 +1,10 @@ -package org.openmrs.module.episodes.dao.impl.impl; +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.impl.EpisodeAttributeTypeDao; +import org.openmrs.module.episodes.dao.EpisodeAttributeTypeDao; import org.springframework.stereotype.Repository; import java.util.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 94% 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 ca858c1..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.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; 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 index ac6f8de..c282e95 100644 --- 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 @@ -2,7 +2,7 @@ import org.openmrs.api.context.Context; import org.openmrs.module.episodes.EpisodeAttributeType; -import org.openmrs.module.episodes.dao.impl.EpisodeAttributeTypeDao; +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; 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 817367a..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; 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/EpisodeServiceImplTest.java b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplTest.java index 05fdcb4..054f2c2 100644 --- a/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplTest.java +++ b/api/src/test/java/org/openmrs/module/episodes/service/impl/EpisodeServiceImplTest.java @@ -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/omod/pom.xml b/omod/pom.xml index 43c18eb..e64dde2 100644 --- a/omod/pom.xml +++ b/omod/pom.xml @@ -22,11 +22,6 @@ org.openmrs.web openmrs-web - - org.openmrs.module - webservices.rest-omod-common - provided - org.openmrs.module webservices.rest-omod diff --git a/pom.xml b/pom.xml index 6782ccb..4e416da 100644 --- a/pom.xml +++ b/pom.xml @@ -192,18 +192,6 @@ ${webServices.version} provided - - org.openmrs.module - webservices.rest-omod-common - ${webServices.version} - provided - - - org.openmrs.module - webservices.rest-omod - ${webServices.version} - provided - From 69a97e53016e1d8c661ac662985d4a5a23ff5624 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Mon, 27 Oct 2025 23:10:26 +0530 Subject: [PATCH 13/17] Added tests, curved out a helper test class, updated target build for Java 8 --- ...EpisodeAttributeTypeServiceImplITTest.java | 33 +++++--------- .../impl/EpisodeServiceImplITTest.java | 44 +++++++++++++++++-- .../episodes/service/impl/TestHelper.java | 32 ++++++++++++++ pom.xml | 4 +- 4 files changed, 87 insertions(+), 26 deletions(-) create mode 100644 api/src/test/java/org/openmrs/module/episodes/service/impl/TestHelper.java 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 index 7d10f2a..1e70521 100644 --- 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 @@ -9,6 +9,10 @@ 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 @@ -16,14 +20,14 @@ public class EpisodeAttributeTypeServiceImplITTest extends BaseModuleContextSens @Test public void shouldCreateNewEpisodeAttributeType() { - EpisodeAttributeType caseNumberAttributeType = exampleAttributeTypeInsuranceCase(); + 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(exampleAttributeTypeInsuranceCase()); + EpisodeAttributeType caseAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber()); EpisodeAttributeType insuranceIdAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceId()); EpisodeAttributeType attributeType = attributeTypeService.getAttributeTypeByUuid(caseAttributeType.getUuid()); Assert.assertEquals(caseAttributeType, attributeType); @@ -32,7 +36,7 @@ public void getAttributeTypeByUuid() { @Test public void shouldGetMultipleNonRetiredEpisodeAttributeTypes() { - attributeTypeService.save(exampleAttributeTypeInsuranceCase()); + attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber()); attributeTypeService.save(exampleAttributeTypeInsuranceId()); List allAttributeTypes = attributeTypeService.getAllAttributeTypes(false); Assert.assertEquals(2, allAttributeTypes.size()); @@ -40,7 +44,7 @@ public void shouldGetMultipleNonRetiredEpisodeAttributeTypes() { @Test public void shouldRetireAnEpisodeAttributeType() { - EpisodeAttributeType caseAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceCase()); + EpisodeAttributeType caseAttributeType = attributeTypeService.save(exampleAttributeTypeInsuranceCaseNumber()); Assert.assertTrue(!caseAttributeType.getRetired()); EpisodeAttributeType retired = attributeTypeService.retire(caseAttributeType, "entered-in-error"); Assert.assertTrue(retired.getRetired()); @@ -48,29 +52,16 @@ public void shouldRetireAnEpisodeAttributeType() { @Test public void shouldSearchEpisodeAttributeTypesByName() { - attributeTypeService.save(exampleAttributeTypeInsuranceCase()); + 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()); } - private EpisodeAttributeType exampleAttributeTypeInsuranceCase() { - 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; - } - private EpisodeAttributeType exampleAttributeTypeInsuranceId() { - EpisodeAttributeType episodeAttributeType = new EpisodeAttributeType(); - episodeAttributeType.setName("Insurance ID"); - episodeAttributeType.setDescription("Insurance ID associated with Episode"); - episodeAttributeType.setDatatypeClassname("org.openmrs.customdatatype.datatype.FloatDatatype"); - episodeAttributeType.setMinOccurs(0); - return episodeAttributeType; - } + + } \ 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 index c43b251..2333019 100644 --- 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 @@ -12,14 +12,21 @@ import org.openmrs.api.EncounterService; import org.openmrs.api.ProgramWorkflowService; 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; @@ -27,6 +34,10 @@ 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 @@ -41,6 +52,9 @@ public class EpisodeServiceImplITTest extends BaseModuleContextSensitiveTest { @Autowired private ConceptService conceptService; + @Autowired + private EpisodeAttributeTypeService attributeTypeService; + @Test public void shouldCreateANewEpisode() { Episode episode = createAnEpisode(); @@ -90,14 +104,37 @@ public void shouldReturnEpisodeRelatedToAnEncounter() { @Test public void shouldCreateANewEpisodeForPatient() { - Episode episode = createAnEpisodeForPatientWithTypeAndReason(); + Episode episode = createAnEpisodeForPatientWithTypeAndReason(Collections.emptyList()); assertThat(episode.getId(), is(notNullValue())); Episode savedEpisode = episodeService.get(episode.getId()); assertThat(savedEpisode.getEncounters(), is(notNullValue())); } - private Episode createAnEpisodeForPatientWithTypeAndReason() { - Episode episode = new Episode(); + @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); + 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) { + final Episode episode = new Episode(); episode.setPatient(new Patient()); episode.setDateCreated(new Date()); episode.setStatus(Episode.Status.ACTIVE); @@ -109,6 +146,7 @@ private Episode createAnEpisodeForPatientWithTypeAndReason() { statusHistory.setStatus(Episode.Status.ACTIVE); statusHistory.setDateStarted(new Date()); episode.addEpisodeStatusHistory(statusHistory); + episodeAttributes.forEach(attribute -> episode.addAttribute(attribute)); episodeService.save(episode); return episode; } 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/pom.xml b/pom.xml index 4e416da..077cb35 100644 --- a/pom.xml +++ b/pom.xml @@ -237,8 +237,8 @@ org.apache.maven.plugins maven-compiler-plugin - 1.7 - 1.7 + 1.8 + 1.8 From 4dce0dd37812305804bd7cee9e1b7d36e9c9edfe Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Mon, 27 Oct 2025 23:16:52 +0530 Subject: [PATCH 14/17] added version for maven-compiler-plugin --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index 077cb35..c1d0600 100644 --- a/pom.xml +++ b/pom.xml @@ -236,6 +236,7 @@ org.apache.maven.plugins maven-compiler-plugin + 3.14.0 1.8 1.8 From bc6c96c82b9eba0d2ba88276166131c86588fc74 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Sat, 1 Nov 2025 17:26:23 +0530 Subject: [PATCH 15/17] Changing Episode.care_manager to provider instead of user --- .../org/openmrs/module/episodes/Episode.java | 7 ++-- api/src/main/resources/Episode.hbm.xml | 4 +-- api/src/main/resources/liquibase.xml | 9 +++-- .../impl/EpisodeServiceImplITTest.java | 35 +++++++++++++++++-- 4 files changed, 41 insertions(+), 14 deletions(-) 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 8856f0b..d2fb759 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -5,6 +5,7 @@ import org.openmrs.Encounter; import org.openmrs.Patient; import org.openmrs.PatientProgram; +import org.openmrs.Provider; import org.openmrs.User; import org.openmrs.Visit; @@ -24,7 +25,7 @@ public class Episode extends BaseCustomizableData { private Date dateEnded; private Concept concept; private Set statusHistory = new HashSet<>(); - private User careManager; + private Provider careManager; private Set visits = new HashSet<>(); public Status getStatus() { @@ -68,11 +69,11 @@ public void setConcept(Concept concept) { this.concept = concept; } - public User getCareManager() { + public Provider getCareManager() { return careManager; } - public void setCareManager(User careManager) { + public void setCareManager(Provider careManager) { this.careManager = careManager; } diff --git a/api/src/main/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml index f512177..124cf89 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -66,9 +66,7 @@ - - - + diff --git a/api/src/main/resources/liquibase.xml b/api/src/main/resources/liquibase.xml index 80dbb66..508543e 100644 --- a/api/src/main/resources/liquibase.xml +++ b/api/src/main/resources/liquibase.xml @@ -130,7 +130,7 @@ - + @@ -162,12 +162,11 @@ referencedTableName="patient" referencedColumnNames="patient_id"/> + referencedTableName="concept" referencedColumnNames="concept_id"/> + referencedTableName="provider" referencedColumnNames="provider_id"/> + 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 index 2333019..e9cbcb8 100644 --- 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 @@ -8,9 +8,14 @@ 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; @@ -52,6 +57,12 @@ public class EpisodeServiceImplITTest extends BaseModuleContextSensitiveTest { @Autowired private ConceptService conceptService; + @Autowired + private ProviderService providerService; + + @Autowired + private PersonService personService; + @Autowired private EpisodeAttributeTypeService attributeTypeService; @@ -104,7 +115,8 @@ public void shouldReturnEpisodeRelatedToAnEncounter() { @Test public void shouldCreateANewEpisodeForPatient() { - Episode episode = createAnEpisodeForPatientWithTypeAndReason(Collections.emptyList()); + 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())); @@ -119,7 +131,7 @@ public void shouldCreateNewEpisodeForPatientWithAttribute() { exampleAttributeFromType(caseNumberAttributeType, "CN-1234"), exampleAttributeFromType(accidentCaseAttributeType, Boolean.TRUE.toString()) ); - Episode episode = createAnEpisodeForPatientWithTypeAndReason(episodeAttributes); + 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()); @@ -133,12 +145,15 @@ private EpisodeAttribute exampleAttributeFromType(EpisodeAttributeType caseNumbe return attribute; } - private Episode createAnEpisodeForPatientWithTypeAndReason(List episodeAttributes) { + 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.setConcept(createConcept("hospitalization")); + if (careManager != null) { + episode.setCareManager(careManager); + } EpisodeReason reason = new EpisodeReason(); episode.addEpisodeReason(reason); reason.setValueConcept(createConcept("accident")); @@ -168,6 +183,20 @@ private Concept createConcept(String name) { 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()); From b1cbe9148b1d9a843aab79fefddf76b1e34be753 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Sat, 1 Nov 2025 17:35:13 +0530 Subject: [PATCH 16/17] Fixed previleges. --- .../module/episodes/service/EpisodeAttributeTypeService.java | 2 +- .../org/openmrs/module/episodes/service/EpisodeService.java | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) 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 index f63b85f..846a8a3 100644 --- a/api/src/main/java/org/openmrs/module/episodes/service/EpisodeAttributeTypeService.java +++ b/api/src/main/java/org/openmrs/module/episodes/service/EpisodeAttributeTypeService.java @@ -14,7 +14,7 @@ public interface EpisodeAttributeTypeService { List getAllAttributeTypes(boolean includeRetired); @Transactional(readOnly = true) - @Authorized({"View Appointments"}) + @Authorized({"Get Episode Attribute Types"}) EpisodeAttributeType getAttributeTypeByUuid(@NotBlank String uuid); @Transactional 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 4ec0f90..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,7 @@ public interface EpisodeService { Episode get(Integer episodeId); + @Authorized({"Get Episodes"}) Episode getEpisodeByUuid(String uuid); Episode getEpisodeForPatientProgram(PatientProgram patientProgram); From 4bac9662c4de6d48e7461db7500ece893fa12dc7 Mon Sep 17 00:00:00 2001 From: Angshuman Sarkar Date: Sat, 1 Nov 2025 23:40:24 +0530 Subject: [PATCH 17/17] renamed episode.concept to episode.episodeType --- .../java/org/openmrs/module/episodes/Episode.java | 11 +++++------ api/src/main/resources/Episode.hbm.xml | 2 +- .../service/impl/EpisodeServiceImplITTest.java | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) 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 d2fb759..ec681c0 100644 --- a/api/src/main/java/org/openmrs/module/episodes/Episode.java +++ b/api/src/main/java/org/openmrs/module/episodes/Episode.java @@ -6,7 +6,6 @@ import org.openmrs.Patient; import org.openmrs.PatientProgram; import org.openmrs.Provider; -import org.openmrs.User; import org.openmrs.Visit; import java.util.Date; @@ -23,7 +22,7 @@ public class Episode extends BaseCustomizableData { private Episode.Status status = Episode.Status.ACTIVE; private Date dateStarted; private Date dateEnded; - private Concept concept; + private Concept episodeType; private Set statusHistory = new HashSet<>(); private Provider careManager; private Set visits = new HashSet<>(); @@ -61,12 +60,12 @@ public void setDateStarted(Date dateStarted) { this.dateStarted = dateStarted; } - public Concept getConcept() { - return concept; + public Concept getEpisodeType() { + return episodeType; } - public void setConcept(Concept concept) { - this.concept = concept; + public void setEpisodeType(Concept episodeType) { + this.episodeType = episodeType; } public Provider getCareManager() { diff --git a/api/src/main/resources/Episode.hbm.xml b/api/src/main/resources/Episode.hbm.xml index 124cf89..126e757 100644 --- a/api/src/main/resources/Episode.hbm.xml +++ b/api/src/main/resources/Episode.hbm.xml @@ -64,7 +64,7 @@ - + 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 index e9cbcb8..5db2a31 100644 --- 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 @@ -150,7 +150,7 @@ private Episode createAnEpisodeForPatientWithTypeAndReason(List