Author: jacopoc
Date: Wed May 9 05:29:44 2007 New Revision: 536505 URL: http://svn.apache.org/viewvc?view=rev&rev=536505 Log: Inventory reservation balance routine: refactored the part dealing with serialized inventory, now it shares most of the code used for non-serial inventory and now it should work. OFBIZ-774. Modified: ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml ofbiz/trunk/applications/product/script/org/ofbiz/shipment/receipt/ShipmentReceiptServices.xml Modified: ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml?view=diff&rev=536505&r1=536504&r2=536505 ============================================================================== --- ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml (original) +++ ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/InventoryServices.xml Wed May 9 05:29:44 2007 @@ -572,10 +572,16 @@ </condition-list> <!-- TODO: order the list of inventory items in a useful way, since operations occur below based on the first item --> </entity-condition> - - <if-compare field-name="inventoryItemTypeId" map-name="inventoryItem" operator="equals" value="NON_SERIAL_INV_ITEM"> - <!-- find their current reservations --> - <iterate list-name="inventoryItems" entry-name="item"> + <!-- find their current reservations --> + <iterate list-name="inventoryItems" entry-name="item"> + <!-- If quantityOnHandTotal is not equal to availableToPromiseTotal this means that + there are pending reservations on the item that cause availableToPromiseTotal + to be lower than the quantityOnHandTotal (the opposite can never happen). + In fact, if availableToPromiseTotal is negative, this doesn't mean that there are reservations; + for example, if we have a negative quantityOnHandTotal and quantityOnHandTotal equal to + availableToPromiseTotal, then no reservations are present. + --> + <if-compare-field field-name="item.quantityOnHandTotal" operator="not-equals" to-field-name="item.availableToPromiseTotal"> <get-related value-name="item" relation-name="OrderItemShipGrpInvRes" list-name="relatedRes"/> <!--<list-to-list list-name="relatedRes" to-list-name="reservations"/>--> @@ -611,108 +617,49 @@ </if> </if-empty> </iterate> - </iterate> + </if-compare-field> + </iterate> - <!-- sort the list by date --> - <string-to-list string="reservedDatetime" list-name="orderByList"/> - <order-value-list list-name="reservations" order-by-list-name="orderByList"/> - <set field="orderByList[]" value="sequenceId"/> - - <list-to-list list-name="privilegedReservations" to-list-name="allReservations"/> - <list-to-list list-name="reservations" to-list-name="allReservations"/> - - <!-- FIRST, cancel all the reservation --> - <iterate list-name="allReservations" entry-name="oisgir"> - <set from-field="oisgir.orderId" field="cancelOisgirMap.orderId"/> - <set from-field="oisgir.orderItemSeqId" field="cancelOisgirMap.orderItemSeqId"/> - <set from-field="oisgir.inventoryItemId" field="cancelOisgirMap.inventoryItemId"/> - <set from-field="oisgir.shipGroupSeqId" field="cancelOisgirMap.shipGroupSeqId"/> - <call-service service-name="cancelOrderItemShipGrpInvRes" in-map-name="cancelOisgirMap"/> - <clear-field field-name="cancelOisgirMap"/> - </iterate> - - <!-- THEN, re-reserve the cancelled item --> - <iterate list-name="allReservations" entry-name="oisgir"> - <!-- require inventory is N because it had to be N to begin with to have a negative ATP --> - <set from-field="inventoryItem.productId" field="resMap.productId"/> - <set from-field="oisgir.orderId" field="resMap.orderId"/> - <set from-field="oisgir.orderItemSeqId" field="resMap.orderItemSeqId"/> - <set from-field="oisgir.quantity" field="resMap.quantity"/> - <set from-field="oisgir.reservedDatetime" field="resMap.reservedDatetime"/> - <set from-field="oisgir.reserveOrderEnumId" field="resMap.reserveOrderEnumId"/> - <set field="resMap.requireInventory" value="N"/> - <set from-field="oisgir.shipGroupSeqId" field="resMap.shipGroupSeqId"/> - <set from-field="oisgir.sequenceId" field="resMap.sequenceId"/> - <call-service service-name="reserveProductInventory" in-map-name="resMap"/> - <clear-field field-name="resMap"/> - </iterate> - - <else> - <if-compare field-name="inventoryItemTypeId" map-name="inventoryItem" operator="equals" value="SERIALIZED_INV_ITEM"> - <now-timestamp-to-env env-name="nowTimestamp"/> - - <!-- Get the first non-serialized inventory item with a negative ATP --> - <first-from-list entry-name="nonSerInvItem" list-name="inventoryItems"/> - <if-not-empty field-name="nonSerInvItem"> - - <!-- Change the serialized inventoryItem's status to promised --> - <set field="inventoryItem.statusId" value="INV_PROMISED"/> - <store-value value-name="inventoryItem" do-cache-clear="true"/> - <check-errors/> - - <!-- Update the first negative non-serialized inventoryItem's ATP and QOH values --> - <calculate field-name="nonSerInvItem.availableToPromiseTotal" type="Double"> - <calcop operator="add" field-name="nonSerInvItem.availableToPromiseTotal"> - <calcop operator="get" field-name="inventoryItem.availableToPromiseTotal"/> - </calcop> - </calculate> - <calculate field-name="nonSerInvItem.quantityOnHandTotal" type="Double"> - <calcop operator="add" field-name="nonSerInvItem.quantityOnHandTotal"> - <calcop operator="get" field-name="inventoryItem.quantityOnHandTotal"/> - </calcop> - </calculate> - <store-value value-name="nonSerInvItem"/> - <check-errors/> - - <!-- Get list of reservations ordered by reservedDatetime, oldest one first --> - <string-to-list string="reservedDatetime" list-name="orderByList"/> - <get-related value-name="nonSerInvItem" relation-name="OrderItemShipGrpInvRes" list-name="nonSerInvRes" - order-by-list-name="orderByList"/> - <first-from-list entry-name="inventoryReservation" list-name="nonSerInvRes"/> - <if-not-empty field-name="inventoryReservation"> - - <!-- Make a new reservation for the serialized unit quantity for the order --> - <make-value value-name="newReservation" entity-name="OrderItemShipGrpInvRes" map-name="inventoryReservation"/> - <set from-field="inventoryItem.availableToPromiseTotal" field="newReservation.quantity"/> - <set from-field="inventoryItem.inventoryItemId" field="newReservation.inventoryItemId"/> - <create-value value-name="newReservation"/> - <check-errors/> - - <!-- Reduce the previous reservation by 1 unit --> - <calculate field-name="inventoryReservation.quantity" type="Double"> - <calcop operator="subtract" field-name="inventoryReservation.quantity"> - <calcop operator="get" field-name="inventoryItem.availableToPromiseTotal"/> - </calcop> - </calculate> - - <!-- If the previous reservation quantity is now zero then cancel it, otherwise store it --> - <if-compare field-name="inventoryReservation.quantity" value="0" operator="less-equals" type="Double"> - <set from-field="inventoryReservation.orderId" field="cancelOisgirMap.orderId"/> - <set from-field="inventoryReservation.orderItemSeqId" field="cancelOisgirMap.orderItemSeqId"/> - <set from-field="inventoryReservation.inventoryItemId" field="cancelOisgirMap.inventoryItemId"/> - <set from-field="inventoryReservation.shipGroupSeqId" field="cancelOisgirMap.shipGroupSeqId"/> - <call-service service-name="cancelOrderItemShipGrpInvRes" in-map-name="cancelOisgirMap"/> - <check-errors/> - <else> - <store-value value-name="inventoryReservation"/> - </else> - </if-compare> - <check-errors/> - </if-not-empty> - </if-not-empty> - </if-compare> - </else> + <!-- sort the list by date --> + <string-to-list string="reservedDatetime" list-name="orderByList"/> + <order-value-list list-name="reservations" order-by-list-name="orderByList"/> + <set field="orderByList[]" value="sequenceId"/> + + <list-to-list list-name="privilegedReservations" to-list-name="allReservations"/> + <list-to-list list-name="reservations" to-list-name="allReservations"/> + + <if-compare field-name="inventoryItemTypeId" map-name="inventoryItem" operator="equals" value="SERIALIZED_INV_ITEM"> + <!-- if the new item is serialized, i.e. qoh is 1, we just need the first reservation --> + <first-from-list entry-name="inventoryReservation" list-name="allReservations"/> + <clear-field field-name="allReservations"/> + <field-to-list field-name="inventoryReservation" list-name="allReservations"/> </if-compare> + + <!-- FIRST, cancel all the reservations --> + <iterate list-name="allReservations" entry-name="oisgir"> + <set from-field="oisgir.orderId" field="cancelOisgirMap.orderId"/> + <set from-field="oisgir.orderItemSeqId" field="cancelOisgirMap.orderItemSeqId"/> + <set from-field="oisgir.inventoryItemId" field="cancelOisgirMap.inventoryItemId"/> + <set from-field="oisgir.shipGroupSeqId" field="cancelOisgirMap.shipGroupSeqId"/> + <call-service service-name="cancelOrderItemShipGrpInvRes" in-map-name="cancelOisgirMap"/> + <clear-field field-name="cancelOisgirMap"/> + </iterate> + + <!-- THEN, re-reserve the cancelled items --> + <iterate list-name="allReservations" entry-name="oisgir"> + <!-- require inventory is N because it had to be N to begin with to have a negative ATP --> + <set from-field="inventoryItem.productId" field="resMap.productId"/> + <set from-field="oisgir.orderId" field="resMap.orderId"/> + <set from-field="oisgir.orderItemSeqId" field="resMap.orderItemSeqId"/> + <set from-field="oisgir.quantity" field="resMap.quantity"/> + <set from-field="oisgir.reservedDatetime" field="resMap.reservedDatetime"/> + <set from-field="oisgir.reserveOrderEnumId" field="resMap.reserveOrderEnumId"/> + <set field="resMap.requireInventory" value="N"/> + <set from-field="oisgir.shipGroupSeqId" field="resMap.shipGroupSeqId"/> + <set from-field="oisgir.sequenceId" field="resMap.sequenceId"/> + <call-service service-name="reserveProductInventory" in-map-name="resMap"/> + <clear-field field-name="resMap"/> + </iterate> </simple-method> <!-- Inventory Transfer Services --> Modified: ofbiz/trunk/applications/product/script/org/ofbiz/shipment/receipt/ShipmentReceiptServices.xml URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/script/org/ofbiz/shipment/receipt/ShipmentReceiptServices.xml?view=diff&rev=536505&r1=536504&r2=536505 ============================================================================== --- ofbiz/trunk/applications/product/script/org/ofbiz/shipment/receipt/ShipmentReceiptServices.xml (original) +++ ofbiz/trunk/applications/product/script/org/ofbiz/shipment/receipt/ShipmentReceiptServices.xml Wed May 9 05:29:44 2007 @@ -100,10 +100,6 @@ <set-service-fields service-name="createShipmentReceipt" map-name="parameters" to-map-name="serviceInMap"/> <call-service service-name="createShipmentReceipt" in-map-name="serviceInMap"/> <check-errors/> - <clear-field field-name="serviceInMap"/> - <set-service-fields service-name="balanceInventoryItems" map-name="parameters" to-map-name="serviceInMap"/> - <call-service service-name="balanceInventoryItems" in-map-name="serviceInMap"/> - <check-errors/> <!-- update serialized items to AVAILABLE (only if this is not a return), which then triggers other SECA chains --> <if-compare value="SERIALIZED_INV_ITEM" operator="equals" field-name="parameters.inventoryItemTypeId"> <if-compare value="INV_RETURNED" operator="not-equals" field-name="parameters.statusId"> @@ -121,6 +117,10 @@ </if-compare> </if-compare> </if-compare> + <clear-field field-name="serviceInMap"/> + <set-service-fields service-name="balanceInventoryItems" map-name="parameters" to-map-name="serviceInMap"/> + <call-service service-name="balanceInventoryItems" in-map-name="serviceInMap"/> + <check-errors/> <set value="Received ${parameters.quantityAccepted} of ${parameters.productId} in inventory item ${parameters.inventoryItemId}" field="successMessageList[]"/> </loop> <!-- return the last inventory item received --> |
Free forum by Nabble | Edit this page |