[ https://issues.apache.org/jira/browse/OFBIZ-13262?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17979910#comment-17979910 ]
Yashwant Dhakad commented on OFBIZ-13262: ----------------------------------------- h1. *Work Order Reservation Implementation Plan* This implementation plan outlines enhancements to the Apache OFBiz manufacturing module to support a robust work order reservation flow. The proposed features include manual lot selection, automatic reservation to reduce inventory issues, improve accuracy, and align with real-world manufacturing requirements. h2. *Objectives* * {*}Manual Lot Selection{*}: Allow users to reserve and issue materials from specific inventory lots via the UI, overriding default FIFO/LIFO logic. * {*}Automatic Reservation{*}: Automatically reserve inventory at production approval using FIFO/LIFO, preventing cross-run conflicts. h2. *Data Model Enhancements* h3. *New Entity: WorkEffortInvRes* Introduce a new entity WorkEffortInvRes to handle inventory reservations specific to work orders. This entity will follow a similar design pattern to the existing OrderItemShipGrpInvRes entity used for managing order-based reservations. *Entity: WorkEffortInvRes* * {*}Fields{*}: * workEffortId (type: id, description: Identifier of the work effort/task) * inventoryItemId (type: id, description: Identifier of the reserved inventory item) * wegsProductId (type: id, description: Reference to the WorkEffortGoodStandard.productId record for tracking primary/substitute products) * reserveOrderEnumId (type: id, description: Enum indicating reservation type, e.g., FIFO, LIFO, or manual) * quantity (type: fixed-point, description: Quantity reserved) * quantityNotAvailable (type: fixed-point, description: Quantity not available at reservation time, if any) * reservedDatetime (type: date-time, description: Timestamp when reservation was made) * createdDatetime (type: date-time, description: Timestamp when the record was created) * promisedDatetime (type: date-time, description: Original promised delivery date for the reservation) * currentPromisedDate (type: date-time, description: Current promised delivery date, updated if changed) * sequenceId (type: numeric, description: Sequence for ordering reservations within a work effort) * {*}Primary Key{*}: workEffortId, inventoryItemId, wegsProductId * {*}Purpose{*}: Stores reservation details for inventory items tied to work efforts, supporting both manual and automatic reservations. h2. *Service Implementations* h3. *1. Manual Reservation Service* * {*}Service Name{*}: reserveWorkEffortInventoryItem * {*}Purpose{*}: Allows users to manually reserve a specific inventory item either from main product for a work effort, bypassing FIFO/LIFO logic. We have added validation in the reserve service to ensure that users cannot select a quantity greater than the required amount. Additionally, only those inventory items with *Available to Promise (ATP) greater than 0* will be displayed and considered for reservation. This ensures that users can only reserve inventory that is currently available. * {*}Input Parameters{*}: * workEffortId (String, required): Work effort/task ID. * inventoryItemId (String, required): Specific inventory item to reserve. * wegsProductId (String, required): Reference to the WorkEffortGoodStandard record. * quantity (BigDecimal, required): Quantity to reserve. * {*}Output{*}: Creates a record in WorkEffortInvRes and InventoryItemDetail. * {*}Logic{*}: * Validate the inventory item exists and has sufficient quantity(ATP) and will not reserve more than the required quantity. * Create a reservation record in WorkEffortInvRes. * Create the InventoryItemDetail record for auditing purposes. * Update InventoryItem to reduce availableToPromiseTotal by the reserved quantity, locking the item for this reservation. * If inventory is serialize then update inventory availability status(Promised). * Ensure that the reservation flow does not release the work order reservation when inventory values are modified in reassignInventoryReservation flow. * *UI Integration:* Add a UI form in the manufacturing module to allow users to select specific lots, serial numbers, or expiration dates. The form should display inventory for both the main and substitute products. Users should be able to select and pick multiple inventory items along with their quantities. We have added validation in the reserve service to ensure that users cannot select a quantity greater than the required amount. Additionally, only those inventory items with *Available to Promise (ATP) greater than 0* will be displayed and considered for reservation. This ensures that users can only reserve inventory that is currently available. Upon clicking {*}"Reserve"{*}, the selected inventory will be reserved accordingly. h3. *2. Automatic Reservation Service* * {*}Service Name{*}: autoReserveWorkEffortInventory * {*}Purpose{*}: Automatically reserves inventory for all items in a work effort task at production task approval, using FIFO or LIFO logic. * {*}Input Parameters{*}: * workEffortId (String, required): Work effort task ID. * {*}Output{*}: Creates multiple WorkEffortInvRes along with InventoryItemDetail records for all required items in the work effort. * {*}Logic{*}: * Retrieve all WorkEffortGoodStandard records for the given workEffortId. * For each record, select inventory items based on FIFO/LIFO logic. * Create reservation records in WorkEffortInvRes with the appropriate wegsProductId. * Create an InventoryItemDetail record for auditing purposes. * Handle cross-run conflicts by checking existing reservations. * {*}Trigger{*}: Automatically called during production run task approval. h3. *3. Cancel Reservation Service* * {*}Service Name{*}: cancelWorkEffortInventoryReservation * {*}Purpose{*}: Allows users to cancel existing reservations manually, enabling re-reservation if needed. * {*}Input Parameters{*}: * workEffortId (String, required): Work effort/task ID. * inventoryItemId (String, required): Inventory item to cancel. * wegsProductId (String, required): Reference to the WorkEffortGoodStandard record. * {*}Output{*}: Deletes the corresponding WorkEffortInvRes and InventoryItemDetail record and updates inventory availability. * {*}Logic{*}: * Validate the reservation exists. * Remove the reservation record. * Update inventory status to reflect released quantities. * {*}UI Integration{*}: Add a "Cancel Reservation" button in the routing task component management screen. h3. *4. Issuance Service Update* * {*}Service Name{*}: Update the issueProductionRunTaskComponent or can create new service(issueReservedProductionRunTaskComponent). * {*}Purpose{*}: Issue reserved inventory items, using the WorkEffortInvRes entity. * {*}Input Parameters{*}: * workEffortId (String, required): Work effort/task ID. * wegsProductId (String, optional): Specific reference for issuance (supports substitutes). * {*}Logic{*}: * Retrieve all WorkEffortInvRes records for the workEffortId. * For each reservation, issue the reserved inventoryItemId. * Update inventory quantities and mark reservations as issued. * Add the ItemIssuance record for the issued inventory so we can update the return flow to return the issued units in the same inventory instead of creating new. * {*}Output{*}: Remove WorkEffortInvRes records after issuance, log issuance details and create InventoryItemDetail record for auditing purpose. > Implement Inventory Reservation Flow for Work Orders in Manufacturing > --------------------------------------------------------------------- > > Key: OFBIZ-13262 > URL: https://issues.apache.org/jira/browse/OFBIZ-13262 > Project: OFBiz > Issue Type: Sub-task > Components: manufacturing > Affects Versions: Upcoming Branch > Reporter: Yashwant Dhakad > Priority: Minor > Fix For: Upcoming Branch > > > Introduce a robust inventory reservation flow for work orders in the > manufacturing module. Currently, inventory is not reserved at the time of > production run approval, leading to the risk of overcommitting stock across > multiple runs. This enhancement will enable both manual lot selection by > users and automatic reservation based on configured logic (like FIFO/LIFO). > The goal is to prevent material conflicts, improve inventory accuracy, and > align with real-world production control needs. -- This message was sent by Atlassian Jira (v8.20.10#820010)