Index: metadata/api/hibernate/org/openmrs/api/db/hibernate/Encounter.hbm.xml
===================================================================
--- metadata/api/hibernate/org/openmrs/api/db/hibernate/Encounter.hbm.xml (revision 14044)
+++ metadata/api/hibernate/org/openmrs/api/db/hibernate/Encounter.hbm.xml (working copy)
@@ -77,5 +77,9 @@
+
+
+
+
Index: metadata/model/liquibase-update-to-latest.xml
===================================================================
--- metadata/model/liquibase-update-to-latest.xml (revision 14044)
+++ metadata/model/liquibase-update-to-latest.xml (working copy)
@@ -3301,4 +3301,35 @@
message_state IN (0,1)
+
+
+
+
+
+
+
+
+ Ticket 2369, to store multiple providers for an encounter instead of just one
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
Index: src/api/org/openmrs/Encounter.java
===================================================================
--- src/api/org/openmrs/Encounter.java (revision 14044)
+++ src/api/org/openmrs/Encounter.java (working copy)
@@ -48,16 +48,17 @@
private EncounterType encounterType;
- private Person provider;
-
private Set orders;
private Set obs;
+ private List providers;
+
// Constructors
/** default constructor */
public Encounter() {
+ providers = new ArrayList();
}
/**
@@ -65,6 +66,7 @@
* @should set encounter id
*/
public Encounter(Integer encounterId) {
+ this();
this.encounterId = encounterId;
}
@@ -403,27 +405,73 @@
/**
* @return Returns the provider.
* @since 1.6 (used to return User)
+ * @deprecated use{@link #getProviders()}
*/
- public Person getProvider() {
- return provider;
+ @Deprecated
+ public Person getProvider() {
+ if (!providers.isEmpty()) {
+ return providers.get(0);
+ }
+ return null;
}
/**
* @param provider The provider to set.
- * @deprecated use {@link #setProvider(Person)}
+ * @deprecated use {@link #addProvider(Person)}
*/
- public void setProvider(User provider) {
+ @Deprecated
+ public void setProvider(User provider) {
setProvider(provider.getPerson());
}
/**
- * @param provider The provider to set.
- */
+ * @param provider The provider to set.
+ * @deprecated use {@link #addProvider(Person)}
+ */
+ @Deprecated
public void setProvider(Person provider) {
- this.provider = provider;
+ addProvider(provider);
}
/**
+ * @return Returns the providers
+ */
+ public List getProviders() {
+ return providers;
+ }
+
+ /**
+ * @param provider a new provider
+ */
+ public void addProvider(Person provider) {
+ if (!providers.contains(provider)) {
+ providers.add(provider);
+ }
+ }
+
+ /**
+ * @param provider a provider is removed
+ */
+ public boolean removeProvider(Person provider) {
+ return providers.remove(provider);
+ }
+
+ /**
+ * @param providers The providers to set.
+ */
+ public void setProviders(List providers) {
+ if (providers != null) {
+ this.providers = providers;
+ } else {
+ this.providers = new ArrayList();
+ }
+ }
+
+ public void clearProviders() {
+ setProviders(null);
+ }
+
+ /**
* @return Returns the form.
*/
public Form getForm() {
@@ -450,6 +498,7 @@
ret += this.getLocation() == null ? "(no Location) " : this.getLocation().getName() + " ";
ret += this.getPatient() == null ? "(no Patient) " : this.getPatient().getPatientId().toString() + " ";
ret += this.getForm() == null ? "(no Form) " : this.getForm().getName() + " ";
+ ret += this.getProviders().size() == 0 ? "(no Providers) " : "num Providers: " + this.getProviders().size() + " ";
ret += this.getObsAtTopLevel(false) == null ? "(no Obss) " : "num Obs: " + this.getObsAtTopLevel(false) + " ";
ret += this.getOrders() == null ? "(no Orders) " : "num Orders: " + this.getOrders().size() + " ";
return "Encounter: [" + ret + "]";
Index: src/web/org/openmrs/web/controller/encounter/EncounterFormController.java
===================================================================
--- src/web/org/openmrs/web/controller/encounter/EncounterFormController.java (revision 14044)
+++ src/web/org/openmrs/web/controller/encounter/EncounterFormController.java (working copy)
@@ -13,6 +13,7 @@
*/
package org.openmrs.web.controller.encounter;
+import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
@@ -34,6 +35,7 @@
import org.openmrs.FormField;
import org.openmrs.Location;
import org.openmrs.Obs;
+import org.openmrs.Person;
import org.openmrs.api.EncounterService;
import org.openmrs.api.FormService;
import org.openmrs.api.context.Context;
@@ -100,14 +102,14 @@
if (StringUtils.hasText(request.getParameter("patientId")))
encounter.setPatient(Context.getPatientService().getPatient(
Integer.valueOf(request.getParameter("patientId"))));
- if (StringUtils.hasText(request.getParameter("providerId")))
- encounter.setProvider(Context.getPersonService().getPerson(
- Integer.valueOf(request.getParameter("providerId"))));
+
if (encounter.isVoided())
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "voidReason", "error.null");
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "patient", "error.null");
- ValidationUtils.rejectIfEmptyOrWhitespace(errors, "provider", "error.null");
+ if (fetchProviderIDs(request) == null) {
+ errors.rejectValue("providers", "error.null", null, null);
+ }
ValidationUtils.rejectIfEmptyOrWhitespace(errors, "encounterDatetime", "error.null");
}
@@ -148,9 +150,6 @@
encounter.setPatient(Context.getPatientService().getPatient(
Integer.valueOf(request.getParameter("patientId"))));
- // set the provider if they changed it
- encounter.setProvider(Context.getPersonService().getPerson(Integer.valueOf(request.getParameter("providerId"))));
-
if (encounter.isVoided() && encounter.getVoidedBy() == null)
// if this is a "new" voiding, call voidEncounter to set appropriate attributes
Context.getEncounterService().voidEncounter(encounter, encounter.getVoidReason());
@@ -186,10 +185,10 @@
Encounter encounter = null;
if (Context.isAuthenticated()) {
- EncounterService es = Context.getEncounterService();
- String encounterId = request.getParameter("encounterId");
- if (encounterId != null) {
- encounter = es.getEncounter(Integer.valueOf(encounterId));
+ encounter = fetchEncounter(request);
+ String[] providerIds = fetchProviderIDs(request);
+ if (providerIds != null) {
+ updateProvidersOfEncounter(encounter, providerIds);
}
}
@@ -199,6 +198,51 @@
return encounter;
}
+ private void updateProvidersOfEncounter(Encounter encounter, String[] newProviderIds) {
+
+ List providers = encounter.getProviders();
+
+ Map mapExistingProviders = new HashMap();
+ for (Person person : providers) {
+ mapExistingProviders.put(person.getPersonId().toString(), person);
+ }
+ List newProviders = new ArrayList();
+ for (String providerId : newProviderIds) {
+ Person currentPerson = mapExistingProviders.get(providerId);
+ if (currentPerson == null) {
+ newProviders.add(Context.getPersonService().getPerson(Integer.valueOf(providerId)));
+ } else {
+ newProviders.add(currentPerson);
+ }
+ }
+ encounter.setProviders(newProviders);
+
+ }
+
+ private Encounter fetchEncounter(HttpServletRequest request) {
+ Encounter encounter = null;
+ EncounterService es = Context.getEncounterService();
+ String encounterId = request.getParameter("encounterId");
+ if (encounterId != null) {
+ encounter = es.getEncounter(Integer.valueOf(encounterId));
+ return encounter;
+ } else {
+ Encounter emptyEncounter = new Encounter();
+ emptyEncounter.setProviders(new ArrayList());
+ return emptyEncounter;
+ }
+
+ }
+
+ private String[] fetchProviderIDs(HttpServletRequest request) {
+ String[] providerIds = null;
+ String strProviders = request.getParameter("encounterProviders");
+ if (StringUtils.hasText(strProviders)) {
+ providerIds = strProviders.split(" ");
+ }
+ return providerIds;
+ }
+
/**
* @see org.springframework.web.servlet.mvc.SimpleFormController#referenceData(javax.servlet.http.HttpServletRequest,
* java.lang.Object, org.springframework.validation.Errors)
@@ -246,7 +290,7 @@
//get the obs that was not created with the original encounter
Encounter en = o.getEncounter();
- if(o.getDateCreated().compareTo(en.getDateCreated())!=0){
+ if (o.getDateCreated().compareTo(en.getDateCreated()) != 0) {
obsAfterEncounter.add(o.getId());
}
@@ -269,7 +313,7 @@
ff = new FormField();
// we only put the top-level obs in the obsMap. Those would
- // be the obs that don't have an obs grouper
+ // be the obs that don't have an obs grouper
if (o.getObsGroup() == null) {
// populate the obs map with this formfield and obs
List list = obsMapToReturn.get(ff);
Index: test/api/org/openmrs/api/EncounterServiceTest.java
===================================================================
--- test/api/org/openmrs/api/EncounterServiceTest.java (revision 14044)
+++ test/api/org/openmrs/api/EncounterServiceTest.java (working copy)
@@ -146,8 +146,12 @@
enc.setLocation(new Location(1));
enc.setEncounterType(new EncounterType(1));
enc.setEncounterDatetime(new Date());
- enc.setPatient(new Patient(3));
- enc.setProvider(new Person(1));
+ Patient patient = new Patient(3);
+ patient.setGender("M");
+ enc.setPatient(patient);
+ Person provider = new Person(1);
+ provider.setGender("M");
+ enc.setProvider(provider);
es.saveEncounter(enc);
// Now add an obs to it
Index: web/WEB-INF/messages.properties
===================================================================
--- web/WEB-INF/messages.properties (revision 14044)
+++ web/WEB-INF/messages.properties (working copy)
@@ -654,6 +654,7 @@
Encounter.type=Encounter Type
Encounter.location=Location
Encounter.provider=Provider
+Encounter.providers=Providers
Encounter.provider.find=Find Provider
Encounter.datetime=Encounter Date
Encounter.find=Find Encounter
Index: web/WEB-INF/openmrs_static_content-servlet.xml
===================================================================
--- web/WEB-INF/openmrs_static_content-servlet.xml (revision 14044)
+++ web/WEB-INF/openmrs_static_content-servlet.xml (working copy)
@@ -14,6 +14,7 @@
jstlContentController
jstlContentController
+ jstlContentController
jstlContentController
jstlContentController
jstlContentController
Index: web/WEB-INF/view/admin/encounters/encounterForm.jsp
===================================================================
--- web/WEB-INF/view/admin/encounters/encounterForm.jsp (revision 14044)
+++ web/WEB-INF/view/admin/encounters/encounterForm.jsp (working copy)
@@ -18,6 +18,37 @@
+