...
The real purpose of OpenLMIS is the workflow and process of the demand and supply cycle; inventory management is supportive of this, but is not the end goal of OpenLMIS.
Interfaces Between Bounded Contexts
Requisition Service
- Query to Inventory Management system for stock on hand, and beginning balance (as an input to "Requisition Advice")
- InventoryManagement.getStockDetails(Product, Facility)
- InventoryManagement.getStockDetailsAtHistoricDate(Product, Facility, Date)
- Query to Inventory Management system for "what was my facility's past consumption" (e.g. period-normalized consumption based on last period). if no Inventory Management system, this will be manually entered as part of the requisition
- InventoryManagement.getConsumption(Product, Facility, Period)
- need similar methods for Adjustments, etc.
- Query to itself for numbers from last month's requisition
- RequisitionService.getRequisition(Facility, Period, Program)
- Query Program Data service to verify if all required data has been captured
- (no new shared reference data)
- Query (something) for my facility's budget for this program and period
- (Facility, Program, Period)
- Query Product Service(?) for catalog of Requestables and their type for my facility + program + period (with full-supply vs non-full-supply details)
- Program, Period, Facility => Requestable
- Query (something) for unit prices of the Requestables
- Program, Period, Requestable => (Currency)
- Use Fulfillment Service to create a new Order based on a Requisition
- Order
- Requestable, from Facility, to Facility, Program, Period
- Order
- (future) Use Notification Service to notify X that Y event happened
Fulfillment
- Submit an order to external ERP
- (maybe) Query Requisition Service for full details of the requisition that led to this order
- Requisition.getRequisition(id) => Requisition
- Query to Inventory Management system for available stock
- InventoryManagement.getStockAvailable(Product, Facility) (maybe stock is separated out by Program)
- (maybe) getProductsThatCouldSatisfy(Requestable) => Product(?) aka Orderable/Stockable
- Use Inventory Management to reserve some stock (to be picked)
- InventoryManagement.reserveStock(Product, Facility, Quantity) // maybe a StockEvent
- Decrement Inventory (after picking)
- InventoryManagement.processStockEvent(StockEvent, pointer to reservation)
- StockEvent (Event Type, Facility, Product, Batch/Lot, Quantity)
- InventoryManagement.processStockEvent(StockEvent, pointer to reservation)
- Create Shipments
- Shipment.newShipment(from Facility, to Facility, Product/Stockable line item details)
Shipping
- Get product list
- ProductService.getProductList(...)
- Update stock
- InventoryManagement.processStockEvent(StockEvent)
- Do we need to update the Requisition Service with a status that a requisition was fulfilled?
- Or update the Fulfillment Service with an "order received" status?
Inventory Management Service
- Use Notification service to send alerts
- (internal) Stock Movement service, same as processStockEvent(StockEvent)
Program Data Service
- Call out to 3rd party data collection system to get data (e.g. Ona, ODK Aggregate, DHIS2, etc)
Product Service
Notification Service