Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

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(ProductFacility, 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
  • (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(ProductFacility) (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(ProductFacility, Quantity) // maybe a StockEvent
  • Decrement Inventory (after picking)
    • InventoryManagement.processStockEvent(StockEvent, pointer to reservation)
      • StockEvent (Event Type, Facility, Product, Batch/Lot, Quantity)
  • 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