You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by ja...@apache.org on 2006/08/05 10:20:07 UTC

svn commit: r428975 - /incubator/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/StockMoveServices.xml

Author: jacopoc
Date: Sat Aug  5 01:20:07 2006
New Revision: 428975

URL: http://svn.apache.org/viewvc?rev=428975&view=rev
Log:
A few minor additions and one important bug fix to the OFBiz stock movement services:

* the services now return, in the output list of maps, more information about the suggested/required stock moves (atp/qoh of the from and to locations and the GenericValue of the destination ProductFacilityLocation)
* the important bug fix is about the map "InventoryItemAndLocationByLocMap" that was not cleared after each iteration and this was causing errors in the suggested moves.
* a few minor cleanups to some minilang instructions

Modified:
    incubator/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/StockMoveServices.xml

Modified: incubator/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/StockMoveServices.xml
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/StockMoveServices.xml?rev=428975&r1=428974&r2=428975&view=diff
==============================================================================
--- incubator/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/StockMoveServices.xml (original)
+++ incubator/ofbiz/trunk/applications/product/script/org/ofbiz/product/inventory/StockMoveServices.xml Sat Aug  5 01:20:07 2006
@@ -42,6 +42,11 @@
              - product
              - facilityLocationFrom
              - facilityLocationTo
+             - targetProductFacilityLocation
+             - quantityOnHandTotalFrom
+             - quantityOnHandTotalTo
+             - availableToPromiseTotalFrom
+             - availableToPromiseTotalTo
              - totalQuantity
              - orderItemShipGrpInvResInfoList (to be done later if we need it)
         -->
@@ -83,7 +88,7 @@
                     <!-- should generally only be one pick/primary location, just choose the first... -->
                     <first-from-list entry-name="productFacilityLocationView" list-name="productFacilityLocationViewList"/>
                     <get-related-one value-name="productFacilityLocationView" relation-name="FacilityLocation" to-value-name="moveInfo.facilityLocationTo"/>
-                    <get-related-one value-name="productFacilityLocationView" relation-name="ProductFacilityLocation" to-value-name="targetProductFacilityLocation"/>
+                    <get-related-one value-name="productFacilityLocationView" relation-name="ProductFacilityLocation" to-value-name="moveInfo.targetProductFacilityLocation"/>
 
                     <!-- get totalQuantity: iterate through perProductOiirailList and add up quantity (from OrderItemShipGrpInvRes) -->
                     <calculate field-name="moveInfo.totalQuantity" type="Double"><number value="0"/></calculate>
@@ -101,60 +106,71 @@
                     </entity-and>
 
                     <calculate field-name="totalQuantityOnHand" type="Double"><number value="0"/></calculate>
+                    <calculate field-name="totalAvailableToPromise" type="Double"><number value="0"/></calculate>
                     <iterate entry-name="inventoryItem" list-name="inventoryItemList">
                         <calculate field-name="totalQuantityOnHand" type="Double">
                             <calcop field-name="totalQuantityOnHand" operator="add"><calcop field-name="inventoryItem.quantityOnHandTotal" operator="get"/></calcop>
                         </calculate>
+                        <calculate field-name="totalAvailableToPromise" type="Double">
+                            <calcop field-name="totalAvailableToPromise" operator="add"><calcop field-name="inventoryItem.availableToPromiseTotal" operator="get"/></calcop>
+                        </calculate>
                     </iterate>
+                    <set from-field="totalQuantityOnHand" field="moveInfo.quantityOnHandTotalFrom"/>
+                    <set from-field="totalAvailableToPromise" field="moveInfo.availableToPromiseTotalFrom"/>
                     <if-compare-field field-name="totalQuantityOnHand" operator="less" to-field-name="moveInfo.totalQuantity" type="Double">
                         <!-- not enough on hand for move: add warning message, set moveInfo.totalQuantity to totalQuantityOnHand, and don't even bother looking for pre-emptive replenishment needs for this location right now -->
-                        <string-to-list string="Warning in stock move: for facility [${parameters.facilityId}] and product [${productId}] going from location [${productFacilityLocation.locationSeqId}] to location [${targetProductFacilityLocation.locationSeqId}] a quantity of [${moveInfo.totalQuantity}] was needed but there are only [${totalQuantityOnHand}] on hand (this will be in the pick list with the full quantity on hand, but note that this will not be enough to prepare for all orders reserved against this location)" list-name="warningMessageList"/>
+                        <string-to-list string="Warning in stock move: for facility [${parameters.facilityId}] and product [${productId}] going from location [${productFacilityLocation.locationSeqId}] to location [${moveInfo.targetProductFacilityLocation.locationSeqId}] a quantity of [${moveInfo.totalQuantity}] was needed but there are only [${totalQuantityOnHand}] on hand (this will be in the pick list with the full quantity on hand, but note that this will not be enough to prepare for all orders reserved against this location)" list-name="warningMessageList"/>
                         <set from-field="totalQuantityOnHand" field="moveInfo.totalQuantity"/>
                     <else>
                         <!-- check ProductFacilityLocation for where this is going and see if we should do a pre-emptive transfer too... -->
 
-                        <!-- get all InventoryItems and total the availableToPromise for the target location -->
-                        <get-related value-name="targetProductFacilityLocation" relation-name="InventoryItem" list-name="targetInventoryItemList"/>
+                        <!-- get all InventoryItems and total the availableToPromise (and quantityOnHand) for the target location -->
+                        <get-related value-name="moveInfo.targetProductFacilityLocation" relation-name="InventoryItem" list-name="targetInventoryItemList"/>
                         <calculate field-name="targetTotalAvailableToPromise" type="Double"><number value="0"/></calculate>
+                        <calculate field-name="targetTotalQuantityOnHand" type="Double"><number value="0"/></calculate>
                         <iterate entry-name="inventoryItem" list-name="targetInventoryItemList">
                             <calculate field-name="targetTotalAvailableToPromise" type="Double">
                                 <calcop field-name="targetTotalAvailableToPromise" operator="add"><calcop field-name="inventoryItem.availableToPromiseTotal" operator="get"/></calcop>
                             </calculate>
+                            <calculate field-name="targetTotalQuantityOnHand" type="Double">
+                                <calcop field-name="targetTotalQuantityOnHand" operator="add"><calcop field-name="inventoryItem.quantityOnHandTotal" operator="get"/></calcop>
+                            </calculate>
                         </iterate>
-
+                        <set from-field="targetTotalAvailableToPromise" field="moveInfo.availableToPromiseTotalTo"/>
+                        <set from-field="targetTotalQuantityOnHand" field="moveInfo.quantityOnHandTotalTo"/>
                         <!--
                             now if there is enough left and there is less than the minimum for the
                             ProductFacilityLocation, move the restock quantity from ProductFacilityLocation
                         -->
-                        <if-compare-field field-name="targetTotalAvailableToPromise" operator="less" to-field-name="targetProductFacilityLocation.minimumStock" type="Double">
-                            <if-empty field-name="targetLocationSimpleMoveQuantity.${targetProductFacilityLocation.locationSeqId}">
-                                <!-- if targetTotalAvailableToPromise is less than productFacilityLocation.minimumStock, move over the targetProductFacilityLocation.moveQuantity -->
+                        <if-compare-field field-name="targetTotalAvailableToPromise" operator="less" to-field-name="moveInfo.targetProductFacilityLocation.minimumStock" type="Double">
+                            <if-empty field-name="targetLocationSimpleMoveQuantity.${moveInfo.targetProductFacilityLocation.locationSeqId}">
+                                <!-- if targetTotalAvailableToPromise is less than productFacilityLocation.minimumStock, move over the moveInfo.targetProductFacilityLocation.moveQuantity -->
 
-                                <!-- if trying to move more from the location than is there, find the difference and put it in targetLocationSimpleMoveQuantity.${targetProductFacilityLocation.locationSeqId} -->
+                                <!-- if trying to move more from the location than is there, find the difference and put it in targetLocationSimpleMoveQuantity.${moveInfo.targetProductFacilityLocation.locationSeqId} -->
                                 <calculate field-name="moveInfo.totalQuantity" type="Double">
-                                    <calcop field-name="moveInfo.totalQuantity" operator="add"><calcop field-name="targetProductFacilityLocation.moveQuantity" operator="get"/></calcop>
+                                    <calcop field-name="moveInfo.totalQuantity" operator="add"><calcop field-name="moveInfo.targetProductFacilityLocation.moveQuantity" operator="get"/></calcop>
                                 </calculate>
                             <else>
                                 <!--
                                     see if there is enough left for the full amount in
-                                    targetLocationSimpleMoveQuantity.${targetProductFacilityLocation.locationSeqId},
+                                    targetLocationSimpleMoveQuantity.${moveInfo.targetProductFacilityLocation.locationSeqId},
                                     if not do whatever is available and put difference back in
-                                    targetLocationSimpleMoveQuantity.${targetProductFacilityLocation.locationSeqId}
+                                    targetLocationSimpleMoveQuantity.${moveInfo.targetProductFacilityLocation.locationSeqId}
                                 -->
                                 <calculate field-name="moveInfo.totalQuantity" type="Double">
-                                    <calcop field-name="moveInfo.totalQuantity" operator="add"><calcop field-name="targetLocationSimpleMoveQuantity.${targetProductFacilityLocation.locationSeqId}" operator="get"/></calcop>
+                                    <calcop field-name="moveInfo.totalQuantity" operator="add"><calcop field-name="targetLocationSimpleMoveQuantity.${moveInfo.targetProductFacilityLocation.locationSeqId}" operator="get"/></calcop>
                                 </calculate>
                             </else>
                             </if-empty>
                             <if-compare-field field-name="totalQuantityOnHand" operator="less" to-field-name="moveInfo.totalQuantity" type="Double">
-                                <calculate field-name="targetLocationSimpleMoveQuantity.${targetProductFacilityLocation.locationSeqId}" type="Double">
+                                <calculate field-name="targetLocationSimpleMoveQuantity.${moveInfo.targetProductFacilityLocation.locationSeqId}" type="Double">
                                     <calcop field-name="moveInfo.totalQuantity" operator="subtract"><calcop field-name="totalQuantityOnHand" operator="get"/></calcop>
                                 </calculate>
                                 <set from-field="totalQuantityOnHand" field="moveInfo.totalQuantity"/>
                             </if-compare-field>
 
                             <!-- add it to the stockMoveHandled Map to keep track of minimumStock based transfers already done so they are not duplicated below -->
-                            <set value="Y" field="stockMoveHandled.${targetProductFacilityLocation.locationSeqId}"/>
+                            <set value="Y" field="stockMoveHandled.${moveInfo.targetProductFacilityLocation.locationSeqId}"/>
                         </if-compare-field>
                     </else>
                     </if-compare-field>
@@ -176,7 +192,7 @@
     <simple-method method-name="findStockMovesRecommended" short-description="Find all Stock Moves recommended to be done based on ProductFacilityLocation settings">
         <!-- TODO: make this method aware of serialized inventory in addition to non-serialized inventory -->
         <check-permission permission="FACILITY" action="_VIEW">
-            <fail-message message="Security Error: to run findStockMovesNeeded you must have the FACILITY_VIEW or FACILITY_ADMIN permission"/>
+            <fail-message message="Security Error: to run findStockMovesRecommended you must have the FACILITY_VIEW or FACILITY_ADMIN permission"/>
         </check-permission>
         <check-errors/>
 
@@ -189,6 +205,11 @@
              - product
              - facilityLocationFrom
              - facilityLocationTo
+             - targetProductFacilityLocation
+             - quantityOnHandTotalFrom
+             - quantityOnHandTotalTo
+             - availableToPromiseTotalFrom
+             - availableToPromiseTotalTo
              - totalQuantity
         -->
         <!-- start by finding all Xxx where locationTypeEnumId=FLT_PICKLOC and total of InventoryItems in the loc are less than minimumStock (ProductFacilityLocation, FacilityLocation, InventoryItem) -->
@@ -227,7 +248,7 @@
                             </or>
                         </condition>
                         <then>
-                            <if-compare-field map-name="productFacilityLocationQuantityTest" field-name="productId" operator="not-equals" to-map-name="productSave">
+                            <if-compare-field field-name="productFacilityLocationQuantityTest.productId" operator="not-equals" to-field-name="productSave.productId">
                                 <get-related-one value-name="productFacilityLocationQuantityTest" relation-name="Product" to-value-name="productSave"/>
                                  <clear-field field-name="fromLocationTotalAvailableToPromise"/>
                             </if-compare-field>
@@ -245,13 +266,20 @@
                             <else>
                                 <set from-field="productFacilityLocationQuantityTest.moveQuantity" field="targetLocationMoveQuantity"/>
                                 <!-- start by making a Map where the locationSeqId is the key and the value is a List of InventoryItemAndLocation -->
+                                <clear-field field-name="InventoryItemAndLocationByLocMap"/>
                                 <iterate entry-name="InventoryItemAndLocation" list-name="inventoryItemAndLocationList">
                                     <field-to-list field-name="InventoryItemAndLocation" list-name="InventoryItemAndLocationByLocMap.${InventoryItemAndLocation.locationSeqId}"/>
                                 </iterate>
+                                <clear-field field-name="locationSeqId"/>
+                                <clear-field field-name="perLocationInventoryItemAndLocList"/>
                                 <iterate-map key-name="locationSeqId" value-name="perLocationInventoryItemAndLocList" map-name="InventoryItemAndLocationByLocMap">
                                     <if-empty field-name="fromLocationTotalAvailableToPromise.${locationSeqId}">
+                                        <calculate field-name="totalQuantityOnHand" type="Double"><number value="0"/></calculate>
                                         <calculate field-name="totalAvailableToPromise" type="Double"><number value="0"/></calculate>
                                         <iterate entry-name="inventoryItem" list-name="perLocationInventoryItemAndLocList">
+                                            <calculate field-name="totalQuantityOnHand" type="Double">
+                                                <calcop field-name="totalQuantityOnHand" operator="add"><calcop field-name="inventoryItem.quantityOnHandTotal" operator="get"/></calcop>
+                                            </calculate>
                                             <calculate field-name="totalAvailableToPromise" type="Double">
                                                 <calcop field-name="totalAvailableToPromise" operator="add"><calcop field-name="inventoryItem.availableToPromiseTotal" operator="get"/></calcop>
                                             </calculate>
@@ -273,6 +301,11 @@
                                         <set from-field="targetFacilityLocationSave" field="moveInfo.facilityLocationTo"/>
                                         <first-from-list entry-name="InventoryItemAndLocation" list-name="perLocationInventoryItemAndLocList"/>
                                         <get-related-one value-name="InventoryItemAndLocation" relation-name="FacilityLocation" to-value-name="moveInfo.facilityLocationFrom"/>
+                                        <get-related-one value-name="productFacilityLocationQuantityTest" relation-name="ProductFacilityLocation" to-value-name="moveInfo.targetProductFacilityLocation"/>
+                                        <set from-field="productFacilityLocationQuantityTest.availableToPromiseTotal" field="moveInfo.availableToPromiseTotalTo"/>
+                                        <set from-field="productFacilityLocationQuantityTest.quantityOnHandTotal" field="moveInfo.quantityOnHandTotalTo"/>
+                                        <set from-field="totalAvailableToPromise" field="moveInfo.availableToPromiseTotalFrom"/>
+                                        <set from-field="totalQuantityOnHand" field="moveInfo.quantityOnHandTotalFrom"/>
 
                                         <!--   see if there is enough left for the full amount in targetLocationMoveQuantity,
                                                  if not do whatever is available and put difference back in targetLocationMoveQuantity,