Modular Architecture / Reusability / Implementation Models

**Comment: This document describes one possible model for the modular architecture. In reality, this could be done in a number of different ways. The core concept is that there is a place for "Core" code, and a place for "non-core" code, and a process for defining what code falls into each bucket** 

There is also a question of expectations regarding code reusability. After the re-architecture, it will be possible to clearly define to funders at the beginning of a project how reusable their investment will be, based on the target destination of the code to be created. In most cases, country specific implementation investments will results in community modules that are publicly available, but are likely not designed for easy deployment in additional countries. At the beginning of an OpenLMIS country implementation project, the project team would assess the requirements in coordination with the OpenLMIS Global Team and OpenLMIS Community to determine the target destination(s) for code that will be created and include this in the project plan provided to funders:

  • Core: Code created for an implementation would rarely be added directly to core. The exception would be if there is something on the core product roadmap (for example, enhanced bar code support) that a country implementation is willing to fund. Any code generated that is targeted for core must be developed by the OpenLMIS global team, or closely coordinated with the OpenLMIS global team, and meet all standards for core code.
  • Community Supported Module: Code created for community supported modules is intended for use across multiple countries, and the community has committed to ongoing support of the module. Requirements are generated across multiple geographies. The bar code library currently being created by PATH is an example of a piece of work that would, in the future, be a community supported module (if the community agrees to support it).
  • Community Modules: Most software development done to support specific country implementation would be created as community modules. Community modules are modules created by anyone that are shared with the community. Community modules typically would contain features targeted at in-country stakeholders - the specific requirements of a certain MoH that can not be configured within OpenLMIS. Requirements are derived from a single country. There is no expectation that the code will be useful in other contexts, or that the code will be supported by the community. Community modules may be upgraded to communit- supported modules at a later date if they are deemed useful by the community. 

This scenario implies two general funding options for OpenLMIS software development:

1) Ongoing Core Product Funding: The OpenLMIS global team is sufficiently funded to build out the OpenLMIS roadmap. When a country implementation needs something that is on the roadmap, the community can discuss reordering priorities to move the feature "up" on the roadmap. For example, with the VIMS product the OpenLMIS Global Team could have contributed a community-supported stock management module.

2) Project-Based Funding: At project outset, it is decide what (if any) portion of the code should be a community-support module. If so desired, the project funds one of the software development orgs active in the OpenLMIS community to create the community-supported module. Note that any code submitted by an organization for community support must be reviewed and approved by the community. 

OpenLMIS: the global initiative for powerful LMIS software