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 @@ +