This is my opinionated guide to OpenMRS (http://openmrs.org) customization for multiple sites, may work for a single site if developer resources are available. This guide is based on 3 years working with the UgandaEMR distribution (https://wiki.openmrs.org/display/docs/UgandaEMR+Distribution) for the Ministry of Health of Uganda, currently in 650 sites across the country (December 2017).
OpenMRS is a electronic medical records solution, which runs on Java 8, Apache Tomcat 7 and MySQL 5.x (we are using 5.5 and 5.6). The solution is based on openmrs-core (the platform) and modules which extend the platform providing key functionality such as look and feel, REST API, data collection tools, dashboards, patient management workflows.
OpenMRS releases the Reference Application (RefApp) a collection of modules that showcases how the EMR can be setup for clinical workflows, and which is usually the starting point for implementations. The RefApp is released twice a year, April and October, with enhancements that are prioritized by the community and developed leveraging available resources.
I may be somwhat biased due to my role as Reference Application Lead from January 2017.
This is one of the nationally approved EMR solutions, which is being actively developed from August 2015, currently supporting HIV Treatment and Care including HIV Exposed Infants (babies born to HIV positive mothers), Safe Male Circumcision, Tuberculosis treatment, Maternal and Child Health (antenatal, maternity and post-natal care), Outpatient services among others.
This approach follows the list of principles below:
Use the SDK to create a reference application module usually named openmrs-module-mydistribution using
mvn openmrs-sdk:create-project -Dtype=referenceapplication-module
${project.parent.artifactId}-${project.parent.version} org.openmrs.maven.plugins maven-openmrs-plugin org.apache.maven.plugins maven-dependency-plugin org.openmrs.maven.plugins openmrs-sdk-maven-plugin 3.13.1 build-distro install build-distro ${project.build.directory}/docker true ${project.build.directory}/classes/openmrs-distro.properties n</param>
mvn openmrs-sdk:watch
More examples from UgandaEMR can be found at http://bit.ly/ugandaemr-technicalguide
In closing, these are my thoughts on how such customizations should be done, while they may need a developer available, they are bound to start the test of time.
Do share your thoughts and learnings from this and let me know how to improve, I may not be able to change though