[OFBiz] SVN: r4686 - in trunk/applications/product: script/org/ofbiz/shipment/picklist servicedef webapp/facility/facility

jonesde at svn.ofbiz.org jonesde at svn.ofbiz.org
Fri Mar 18 08:23:00 EST 2005


Author: jonesde
Date: 2005-03-18 07:22:51 -0600 (Fri, 18 Mar 2005)
New Revision: 4686

Modified:
   trunk/applications/product/script/org/ofbiz/shipment/picklist/PicklistServices.xml
   trunk/applications/product/servicedef/services_picklist.xml
   trunk/applications/product/webapp/facility/facility/Picklist.fo.ftl
   trunk/applications/product/webapp/facility/facility/PicklistManage.ftl
Log:
A bunch of improvements to the picklist management and pick/pack report

Modified: trunk/applications/product/script/org/ofbiz/shipment/picklist/PicklistServices.xml
===================================================================
--- trunk/applications/product/script/org/ofbiz/shipment/picklist/PicklistServices.xml	2005-03-18 02:45:34 UTC (rev 4685)
+++ trunk/applications/product/script/org/ofbiz/shipment/picklist/PicklistServices.xml	2005-03-18 13:22:51 UTC (rev 4686)
@@ -224,49 +224,6 @@
         <field-to-result field-name="pickMoveByShipmentMethodInfoList"/>
     </simple-method>
 
-    <simple-method method-name="getPicklistData" short-description="Get Picklist Data">
-        <!--
-            Parameters:
-                facilityId
-                shipmentMethodTypeId
-                maxNumberOfOrders
-            Returns:
-                facilityLocationInfoList: List of Maps with facilityLocation, productInfoList, being a List of Maps with product, quantity, inventoryItemList, orderItemList
-                inventoryItemInfoList: List of Maps with inventoryItem, facilityLocation, orderItems, product, statusItem, quantity
-                orderHeaderInfoList: List of Maps with orderHeader, orderItemShipGroup and orderItemInfoList which is List of Maps with orderItem, product and orderItemShipGrpInvResList
-                wrongQuantityReservedList: List of Maps with reservedQuantity and orderItem
-                insufficientQohList: List of Maps with inventoryItem and quantityNeeded
-        -->
-
-        <check-permission permission="FACILITY" action="_VIEW">
-            <fail-message message="Security Error: to run getPicklistData you must have the FACILITY_VIEW or FACILITY_ADMIN permission"/>
-        </check-permission>
-        <check-permission permission="FACILITY" action="_UPDATE">
-            <fail-message message="Security Error: to run getPicklistData you must have the FACILITY_UPDATE or FACILITY_ADMIN permission"/>
-        </check-permission>
-        <check-errors/>
-
-        <now-timestamp-to-env env-name="nowTimestamp"/>
-
-        <set-service-fields map-name="parameters" service-name="findOrdersToPickMove" to-map-name="findOrdersToPickMoveMap"/>
-        <call-service service-name="findOrdersToPickMove" in-map-name="findOrdersToPickMoveMap">
-            <result-to-field result-name="pickMoveByShipmentMethodInfoList"/>
-        </call-service>
-
-        <!-- This creates orderHeaderInfoList, wrongQuantityReservedList, insufficientQohList and inventoryItems, inventoryItemOrderItems, inventoryItemQuantities -->
-        <call-simple-method method-name="assembleOrderHeaderInfoInline"/>
-
-        <!-- This creates facilityLocationInfoList and inventoryItemInfoList -->
-        <call-simple-method method-name="assembleFacilityLocationInfoInline"/>
-
-        <field-to-result field-name="orderHeaderInfoList"/>
-        <field-to-result field-name="wrongQuantityReservedList"/>
-        <field-to-result field-name="insufficientQohList"/>
-
-        <field-to-result field-name="facilityLocationInfoList"/>
-        <field-to-result field-name="inventoryItemInfoList"/>
-    </simple-method>
-
     <simple-method method-name="assembleOrderHeaderInfoInline" short-description="assembleOrderHeaderInfoInline">
         <!-- This uses pickMoveByShipmentMethodInfoList from the findOrdersToPickMove -->
         <!-- This creates orderHeaderInfoList, wrongQuantityReservedList, insufficientQohList and inventoryItems, inventoryItemOrderItems, inventoryItemQuantities -->
@@ -419,102 +376,6 @@
         </iterate-map>
     </simple-method>
     
-    <simple-method method-name="assembleFacilityLocationInfoInline" short-description="assembleFacilityLocationInfoInline">
-        <!-- This uses inventoryItems, inventoryItemOrderItems, inventoryItemQuantities -->
-        <!-- This creates facilityLocationInfoList and inventoryItemInfoList (and for internal use facilityLocationMap) -->
-
-        <!-- go through all quantities and get inventoryItem and facilityLocation -->
-        <iterate-map key-name="inventoryItemId" value-name="quantityNeeded" map-name="inventoryItemQuantities">
-            <env-to-env env-name="inventoryItems.${inventoryItemId}" to-env-name="inventoryItem"/>
-
-            <!-- create a list of locations, then sort it, will have to create a reverse Map to go from location to inventory item -->
-            <clear-field field-name="facilityLocation"/>
-            <get-related-one value-name="inventoryItem" relation-name="FacilityLocation" to-value-name="facilityLocation"/>
-            <if-not-empty field-name="facilityLocation">
-                <env-to-env env-name="facilityLocation" to-env-name="facilityLocationMap.${facilityLocation.locationSeqId}"/>
-                <!-- support multiple invnetoryItemIds per facilityLocation.locationSeqId -->
-                <clear-field field-name="inventoryItemIdList"/>
-                <env-to-env env-name="inventoryItemsByLocation.${facilityLocation.locationSeqId}" to-env-name="inventoryItemIdList"/>
-                <field-to-list field-name="inventoryItemId" list-name="inventoryItemIdList"/>
-                <env-to-env env-name="inventoryItemIdList" to-env-name="inventoryItemsByLocation.${facilityLocation.locationSeqId}"/>
-            <else>
-                <field-to-list field-name="inventoryItemId" list-name="noLocationInventoryItemIds"/>
-            </else>
-            </if-not-empty>
-        </iterate-map>
-
-        <!-- make a facilityLocations List from the facilityLocationMap, which was used to guarantee uniqueness -->
-        <iterate-map map-name="facilityLocationMap" key-name="locationSeqId" value-name="facilityLocation">
-            <field-to-list field-name="facilityLocation" list-name="facilityLocations"/>
-        </iterate-map>
-
-        <!-- order the facilityLocations -->
-        <string-to-list string="+areaId" list-name="facilityLocsOrdLst"/>
-        <string-to-list string="+aisleId" list-name="facilityLocsOrdLst"/>
-        <string-to-list string="+sectionId" list-name="facilityLocsOrdLst"/>
-        <string-to-list string="+levelId" list-name="facilityLocsOrdLst"/>
-        <string-to-list string="+positionId" list-name="facilityLocsOrdLst"/>
-        <order-value-list list-name="facilityLocations" order-by-list-name="facilityLocsOrdLst"/>
-
-        <!-- for each facility location add an entry to the inventoryItemInfoList -->
-        <iterate entry-name="facilityLocation" list-name="facilityLocations">
-            <!-- facilityLocationInfoList: facilityLocation, productInfoList (product, quantity, inventoryItemList, orderItemList) -->
-            <clear-field field-name="facilityLocationInfo"/>
-            <env-to-field env-name="facilityLocation" map-name="facilityLocationInfo"/>
-
-            <!-- inventoryItemInfoList: facilityLocation, inventoryItem, orderItems, quantity, product, statusItems -->
-            <env-to-env env-name="inventoryItemsByLocation.${facilityLocation.locationSeqId}" to-env-name="inventoryItemIdList"/>
-            <iterate entry-name="inventoryItemId" list-name="inventoryItemIdList">
-                <clear-field field-name="inventoryItemInfo"/>
-                <env-to-field env-name="facilityLocation" map-name="inventoryItemInfo"/>
-                <field-to-field field-name="inventoryItems.${inventoryItemId}" to-field-name="inventoryItemInfo.inventoryItem"/>
-                <field-to-field field-name="inventoryItemOrderItems.${inventoryItemId}" to-field-name="inventoryItemInfo.orderItems"/>
-                <field-to-field field-name="inventoryItemQuantities.${inventoryItemId}" to-field-name="inventoryItemInfo.quantity"/>
-                <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="Product" to-value-name="inventoryItemInfo.product"/>
-                <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="StatusItem" to-value-name="inventoryItemInfo.statusItem"/>
-
-                <field-to-list field-name="inventoryItemInfo" list-name="inventoryItemInfoList"/>
-
-                <!-- before destroying inventoryItemInfo, add info to the productInfoMap -->
-                <env-to-env env-name="inventoryItemInfo.product" to-env-name="productInfoMap.${inventoryItemInfo.product.productId}.product"/>
-                <calculate field-name="productInfoMap.${inventoryItemInfo.product.productId}.quantity" type="Double">
-                    <calcop field-name="productInfoMap.${inventoryItemInfo.product.productId}.quantity" operator="get"/>
-                    <calcop field-name="inventoryItemInfo.quantity" operator="get"/>
-                </calculate>
-                <field-to-list field-name="inventoryItemInfo.inventoryItem" list-name="productInfoMap.${inventoryItemInfo.product.productId}.inventoryItemList"/>
-                <!-- put orderItems in Map by orderId:orderItemSeqId to make sure they are unique -->
-                <iterate entry-name="orderItem" list-name="inventoryItemInfo.orderItems">
-                    <env-to-env env-name="orderItem" to-env-name="orderItemMap.${orderItem.orderId}:${orderItem.orderItemSeqId}"/>
-                </iterate>
-            </iterate>
-
-            <iterate-map key-name="orderItemCompositeId" value-name="orderItem" map-name="orderItemMap">
-                <field-to-list field-name="orderItem" list-name="productInfoMap.${orderItem.productId}.orderItemList"/>
-            </iterate-map>
-
-            <!-- move all values from productInfoMap to facilityLocationInfo.productInfoList -->
-            <iterate-map key-name="productId" value-name="productInfo" map-name="productInfoMap">
-                <field-to-list field-name="productInfo" list-name="facilityLocationInfo.productInfoList"/>
-            </iterate-map>
-
-            <field-to-list field-name="facilityLocationInfo" list-name="facilityLocationInfoList"/>
-            <clear-field field-name="orderItemMap"/>
-            <clear-field field-name="productInfoMap"/>
-        </iterate>
-
-        <!-- add all noLocationInventoryItemIds to inventoryItemInfoList with all entries except facilityLocation -->
-        <iterate entry-name="inventoryItemId" list-name="noLocationInventoryItemIds">
-            <field-to-field field-name="${inventoryItemId}" map-name="inventoryItems" to-field-name="inventoryItem" to-map-name="inventoryItemInfo"/>
-            <field-to-field field-name="${inventoryItemId}" map-name="inventoryItemOrderItems" to-field-name="orderItems" to-map-name="inventoryItemInfo"/>
-            <field-to-field field-name="${inventoryItemId}" map-name="inventoryItemQuantities" to-field-name="quantity" to-map-name="inventoryItemInfo"/>
-            <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="Product" to-value-name="inventoryItemInfo.product"/>
-            <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="StatusItem" to-value-name="inventoryItemInfo.statusItem"/>
-
-            <field-to-list field-name="inventoryItemInfo" list-name="inventoryItemInfoList"/>
-            <clear-field field-name="inventoryItemInfo"/>
-        </iterate>
-    </simple-method>
-
     <!-- ========================================================= -->
     <!-- ======= Persisted Picklist Maintenance Services ========= -->
     <!-- ========================================================= -->
@@ -806,8 +667,8 @@
         <!-- 
             Creates:
               1. Standard picklistInfo Map from the getPicklistSingleInfoInline simple-method (see comment there for details)
-              2. facilityLocationInfoList (facilityLocation, picklistItemInfoList (picklistItem, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList))
-              3. noLocationProductInfoList (product, picklistItemInfoList (picklistItem, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList))
+              2. facilityLocationInfoList (facilityLocation, product, pickQuantity, picklistBinInfoList (picklistBin, quantity), picklistItemInfoList (picklistItem, picklistBin, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList))
+              3. noLocationProductInfoList (product, pickQuantity, picklistBinInfoList (picklistBin, quantity), picklistItemInfoList (picklistItem, picklistBin, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList))
         -->
         <check-permission permission="FACILITY" action="_VIEW">
             <fail-message message="Security Error: to run getPickAndPackReportInfo you must have the FACILITY_VIEW or FACILITY_ADMIN permission"/>
@@ -821,6 +682,8 @@
         
         <!-- Assemble the information per facility location for the pick sheet -->
         <iterate entry-name="picklistBinInfo" list-name="picklistInfo.picklistBinInfoList">
+            <env-to-env env-name="picklistBinInfo.picklistBin" to-env-name="picklistBinByIdMap.${picklistBinInfo.picklistBin.picklistBinId}"/>
+            
             <iterate entry-name="picklistItemInfo" list-name="picklistBinInfo.picklistItemInfoList">
                 <!-- 
                     In this iteration through the items we want 2 things:
@@ -879,6 +742,41 @@
             <clear-field field-name="facilityLocationInfo"/>
             <env-to-env env-name="facilityLocation" to-env-name="facilityLocationInfo.facilityLocation"/>
             <env-to-env env-name="picklistItemInfoListByLocationSeqIdMap.${facilityLocation.locationSeqId}" to-env-name="facilityLocationInfo.picklistItemInfoList"/>
+            
+            <!-- make the pickQuantity and quantityByPicklistBinIdMap -->
+            <iterate entry-name="picklistItemInfo" list-name="facilityLocationInfo.picklistItemInfoList">
+                <calculate field-name="facilityLocationInfo.pickQuantity" type="Double">
+                    <calcop field-name="facilityLocationInfo.pickQuantity" operator="add">
+                        <calcop field-name="picklistItemInfo.picklistItem.quantity" operator="get"/>
+                    </calcop>
+                </calculate>
+                
+                <calculate field-name="facilityLocationInfo.quantityByPicklistBinIdMap.${picklistItemInfo.picklistBin.picklistBinId}" type="Double">
+                    <calcop field-name="facilityLocationInfo.quantityByPicklistBinIdMap.${picklistItemInfo.picklistBin.picklistBinId}" operator="add">
+                        <calcop field-name="picklistItemInfo.picklistItem.quantity" operator="get"/>
+                    </calcop>
+                </calculate>
+                
+                <!-- also put the product record in place -->
+                <if-empty field-name="facilityLocationInfo.product">
+                    <env-to-env env-name="picklistItemInfo.product" to-env-name="facilityLocationInfo.product"/>
+                <else>
+                    <if-compare-field field-name="facilityLocationInfo.product.productId" operator="not-equals" to-field-name="picklistItemInfo.product.productId">
+                        <!-- Uh oh, have different products in the same location... what to do about this? -->
+                        <log level="error" message="When creating picklist report found in the same location [${facilityLocation.locationSeqId}] two different products: ${facilityLocationInfo.product.productId} and ${picklistItemInfo.product.productId}"/>
+                    </if-compare-field>
+                </else>
+                </if-empty>
+            </iterate>
+            
+            <!-- create the picklistBinInfoList from the quantityByPicklistBinIdMap -->
+            <iterate-map key-name="picklistBinId" value-name="quantity" map-name="facilityLocationInfo.quantityByPicklistBinIdMap">
+                <clear-field field-name="picklistBinInfo"/>
+                <env-to-env env-name="picklistBinByIdMap.${picklistBinId}" to-env-name="picklistBinInfo.picklistBin"/>
+                <env-to-env env-name="quantity" to-env-name="picklistBinInfo.quantity"/>
+                <env-to-env env-name="picklistBinInfo" to-env-name="facilityLocationInfo.picklistBinInfoList[]"/>
+            </iterate-map>
+            
             <env-to-env env-name="facilityLocationInfo" to-env-name="facilityLocationInfoList[]"/>
         </iterate>
         
@@ -895,6 +793,30 @@
             <clear-field field-name="productInfo"/>
             <env-to-env env-name="product" to-env-name="productInfo.product"/>
             <env-to-env env-name="picklistItemInfoListByProductIdMap.${product.productId}" to-env-name="productInfo.picklistItemInfoList"/>
+
+            <!-- make the pickQuantity and quantityByPicklistBinIdMap -->
+            <iterate entry-name="picklistItemInfo" list-name="productInfo.picklistItemInfoList">
+                <calculate field-name="productInfo.pickQuantity" type="Double">
+                    <calcop field-name="productInfo.pickQuantity" operator="add">
+                        <calcop field-name="picklistItemInfo.picklistItem.quantity" operator="get"/>
+                    </calcop>
+                </calculate>
+                
+                <calculate field-name="productInfo.quantityByPicklistBinIdMap.${picklistItemInfo.picklistBin.picklistBinId}" type="Double">
+                    <calcop field-name="productInfo.quantityByPicklistBinIdMap.${picklistItemInfo.picklistBin.picklistBinId}" operator="add">
+                        <calcop field-name="picklistItemInfo.picklistItem.quantity" operator="get"/>
+                    </calcop>
+                </calculate>
+            </iterate>
+            
+            <!-- create the picklistBinInfoList from the quantityByPicklistBinIdMap -->
+            <iterate-map key-name="picklistBinId" value-name="quantity" map-name="productInfo.quantityByPicklistBinIdMap">
+                <clear-field field-name="picklistBinInfo"/>
+                <env-to-env env-name="picklistBinByIdMap.${picklistBinId}" to-env-name="picklistBinInfo.picklistBin"/>
+                <env-to-env env-name="quantity" to-env-name="picklistBinInfo.quantity"/>
+                <env-to-env env-name="picklistBinInfo" to-env-name="productInfo.picklistBinInfoList[]"/>
+            </iterate-map>
+            
             <env-to-env env-name="productInfo" to-env-name="noLocationProductInfoList[]"/>
         </iterate>
         
@@ -916,7 +838,7 @@
                - picklistBin
                - primaryOrderHeader
                - primaryOrderItemShipGroup
-               - picklistItemInfoList (picklistItem, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList) 
+               - picklistItemInfoList (picklistItem, picklistBin, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList) 
         -->
         <!-- expects a picklist GenericValue to be in the context, and creates a picklistInfo Map -->
         <clear-field field-name="picklistRoleInfoList"/>
@@ -956,6 +878,7 @@
                 <get-related-one value-name="picklistItem" relation-name="OrderItemShipGrpInvRes" to-value-name="picklistItemInfo.orderItemShipGrpInvRes"/>
                 <get-related value-name="picklistItem" relation-name="ItemIssuance" list-name="picklistItemInfo.itemIssuanceList"/>
                 <env-to-env env-name="picklistItem" to-env-name="picklistItemInfo.picklistItem"/>
+                <env-to-env env-name="picklistBin" to-env-name="picklistItemInfo.picklistBin"/>
                 <field-to-list field-name="picklistItemInfo" list-name="picklistItemInfoList"/>
             </iterate>
             <env-to-env env-name="picklistItemInfoList" to-env-name="picklistBinInfo.picklistItemInfoList"/>
@@ -975,4 +898,148 @@
         <get-related-one value-name="picklist" relation-name="ShipmentMethodType" to-value-name="picklistInfo.shipmentMethodType" use-cache="true"/>
         <get-related value-name="picklist" relation-name="StatusValidChangeToDetail" list-name="picklistInfo.statusValidChangeToDetailList"/>
     </simple-method>
+
+
+<!-- ================================================== -->
+<!-- ================================================== -->
+<!-- DEJ20050317 These methods are no longer used, but are here temporarily for reference. -->
+<!-- ================================================== -->
+<!-- ================================================== -->
+    <simple-method method-name="getPicklistData" short-description="Get Picklist Data">
+        <!--
+            Parameters:
+                facilityId
+                shipmentMethodTypeId
+                maxNumberOfOrders
+            Returns:
+                facilityLocationInfoList: List of Maps with facilityLocation, productInfoList, being a List of Maps with product, quantity, inventoryItemList, orderItemList
+                inventoryItemInfoList: List of Maps with inventoryItem, facilityLocation, orderItems, product, statusItem, quantity
+                orderHeaderInfoList: List of Maps with orderHeader, orderItemShipGroup and orderItemInfoList which is List of Maps with orderItem, product and orderItemShipGrpInvResList
+                wrongQuantityReservedList: List of Maps with reservedQuantity and orderItem
+                insufficientQohList: List of Maps with inventoryItem and quantityNeeded
+        -->
+
+        <check-permission permission="FACILITY" action="_VIEW">
+            <fail-message message="Security Error: to run getPicklistData you must have the FACILITY_VIEW or FACILITY_ADMIN permission"/>
+        </check-permission>
+        <check-permission permission="FACILITY" action="_UPDATE">
+            <fail-message message="Security Error: to run getPicklistData you must have the FACILITY_UPDATE or FACILITY_ADMIN permission"/>
+        </check-permission>
+        <check-errors/>
+
+        <now-timestamp-to-env env-name="nowTimestamp"/>
+
+        <set-service-fields map-name="parameters" service-name="findOrdersToPickMove" to-map-name="findOrdersToPickMoveMap"/>
+        <call-service service-name="findOrdersToPickMove" in-map-name="findOrdersToPickMoveMap">
+            <result-to-field result-name="pickMoveByShipmentMethodInfoList"/>
+        </call-service>
+
+        <!-- This creates orderHeaderInfoList, wrongQuantityReservedList, insufficientQohList and inventoryItems, inventoryItemOrderItems, inventoryItemQuantities -->
+        <call-simple-method method-name="assembleOrderHeaderInfoInline"/>
+
+        <!-- This creates facilityLocationInfoList and inventoryItemInfoList -->
+        <call-simple-method method-name="assembleFacilityLocationInfoInline"/>
+
+        <field-to-result field-name="orderHeaderInfoList"/>
+        <field-to-result field-name="wrongQuantityReservedList"/>
+        <field-to-result field-name="insufficientQohList"/>
+
+        <field-to-result field-name="facilityLocationInfoList"/>
+        <field-to-result field-name="inventoryItemInfoList"/>
+    </simple-method>
+    <simple-method method-name="assembleFacilityLocationInfoInline" short-description="assembleFacilityLocationInfoInline">
+        <!-- This uses inventoryItems, inventoryItemOrderItems, inventoryItemQuantities -->
+        <!-- This creates facilityLocationInfoList and inventoryItemInfoList (and for internal use facilityLocationMap) -->
+
+        <!-- go through all quantities and get inventoryItem and facilityLocation -->
+        <iterate-map key-name="inventoryItemId" value-name="quantityNeeded" map-name="inventoryItemQuantities">
+            <env-to-env env-name="inventoryItems.${inventoryItemId}" to-env-name="inventoryItem"/>
+
+            <!-- create a list of locations, then sort it, will have to create a reverse Map to go from location to inventory item -->
+            <clear-field field-name="facilityLocation"/>
+            <get-related-one value-name="inventoryItem" relation-name="FacilityLocation" to-value-name="facilityLocation"/>
+            <if-not-empty field-name="facilityLocation">
+                <env-to-env env-name="facilityLocation" to-env-name="facilityLocationMap.${facilityLocation.locationSeqId}"/>
+                <!-- support multiple invnetoryItemIds per facilityLocation.locationSeqId -->
+                <clear-field field-name="inventoryItemIdList"/>
+                <env-to-env env-name="inventoryItemsByLocation.${facilityLocation.locationSeqId}" to-env-name="inventoryItemIdList"/>
+                <field-to-list field-name="inventoryItemId" list-name="inventoryItemIdList"/>
+                <env-to-env env-name="inventoryItemIdList" to-env-name="inventoryItemsByLocation.${facilityLocation.locationSeqId}"/>
+            <else>
+                <field-to-list field-name="inventoryItemId" list-name="noLocationInventoryItemIds"/>
+            </else>
+            </if-not-empty>
+        </iterate-map>
+
+        <!-- make a facilityLocations List from the facilityLocationMap, which was used to guarantee uniqueness -->
+        <iterate-map map-name="facilityLocationMap" key-name="locationSeqId" value-name="facilityLocation">
+            <field-to-list field-name="facilityLocation" list-name="facilityLocations"/>
+        </iterate-map>
+
+        <!-- order the facilityLocations -->
+        <string-to-list string="+areaId" list-name="facilityLocsOrdLst"/>
+        <string-to-list string="+aisleId" list-name="facilityLocsOrdLst"/>
+        <string-to-list string="+sectionId" list-name="facilityLocsOrdLst"/>
+        <string-to-list string="+levelId" list-name="facilityLocsOrdLst"/>
+        <string-to-list string="+positionId" list-name="facilityLocsOrdLst"/>
+        <order-value-list list-name="facilityLocations" order-by-list-name="facilityLocsOrdLst"/>
+
+        <!-- for each facility location add an entry to the inventoryItemInfoList -->
+        <iterate entry-name="facilityLocation" list-name="facilityLocations">
+            <!-- facilityLocationInfoList: facilityLocation, productInfoList (product, quantity, inventoryItemList, orderItemList) -->
+            <clear-field field-name="facilityLocationInfo"/>
+            <env-to-field env-name="facilityLocation" map-name="facilityLocationInfo"/>
+
+            <!-- inventoryItemInfoList: facilityLocation, inventoryItem, orderItems, quantity, product, statusItems -->
+            <env-to-env env-name="inventoryItemsByLocation.${facilityLocation.locationSeqId}" to-env-name="inventoryItemIdList"/>
+            <iterate entry-name="inventoryItemId" list-name="inventoryItemIdList">
+                <clear-field field-name="inventoryItemInfo"/>
+                <env-to-field env-name="facilityLocation" map-name="inventoryItemInfo"/>
+                <field-to-field field-name="inventoryItems.${inventoryItemId}" to-field-name="inventoryItemInfo.inventoryItem"/>
+                <field-to-field field-name="inventoryItemOrderItems.${inventoryItemId}" to-field-name="inventoryItemInfo.orderItems"/>
+                <field-to-field field-name="inventoryItemQuantities.${inventoryItemId}" to-field-name="inventoryItemInfo.quantity"/>
+                <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="Product" to-value-name="inventoryItemInfo.product"/>
+                <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="StatusItem" to-value-name="inventoryItemInfo.statusItem"/>
+
+                <field-to-list field-name="inventoryItemInfo" list-name="inventoryItemInfoList"/>
+
+                <!-- before destroying inventoryItemInfo, add info to the productInfoMap -->
+                <env-to-env env-name="inventoryItemInfo.product" to-env-name="productInfoMap.${inventoryItemInfo.product.productId}.product"/>
+                <calculate field-name="productInfoMap.${inventoryItemInfo.product.productId}.quantity" type="Double">
+                    <calcop field-name="productInfoMap.${inventoryItemInfo.product.productId}.quantity" operator="get"/>
+                    <calcop field-name="inventoryItemInfo.quantity" operator="get"/>
+                </calculate>
+                <field-to-list field-name="inventoryItemInfo.inventoryItem" list-name="productInfoMap.${inventoryItemInfo.product.productId}.inventoryItemList"/>
+                <!-- put orderItems in Map by orderId:orderItemSeqId to make sure they are unique -->
+                <iterate entry-name="orderItem" list-name="inventoryItemInfo.orderItems">
+                    <env-to-env env-name="orderItem" to-env-name="orderItemMap.${orderItem.orderId}:${orderItem.orderItemSeqId}"/>
+                </iterate>
+            </iterate>
+
+            <iterate-map key-name="orderItemCompositeId" value-name="orderItem" map-name="orderItemMap">
+                <field-to-list field-name="orderItem" list-name="productInfoMap.${orderItem.productId}.orderItemList"/>
+            </iterate-map>
+
+            <!-- move all values from productInfoMap to facilityLocationInfo.productInfoList -->
+            <iterate-map key-name="productId" value-name="productInfo" map-name="productInfoMap">
+                <field-to-list field-name="productInfo" list-name="facilityLocationInfo.productInfoList"/>
+            </iterate-map>
+
+            <field-to-list field-name="facilityLocationInfo" list-name="facilityLocationInfoList"/>
+            <clear-field field-name="orderItemMap"/>
+            <clear-field field-name="productInfoMap"/>
+        </iterate>
+
+        <!-- add all noLocationInventoryItemIds to inventoryItemInfoList with all entries except facilityLocation -->
+        <iterate entry-name="inventoryItemId" list-name="noLocationInventoryItemIds">
+            <field-to-field field-name="${inventoryItemId}" map-name="inventoryItems" to-field-name="inventoryItem" to-map-name="inventoryItemInfo"/>
+            <field-to-field field-name="${inventoryItemId}" map-name="inventoryItemOrderItems" to-field-name="orderItems" to-map-name="inventoryItemInfo"/>
+            <field-to-field field-name="${inventoryItemId}" map-name="inventoryItemQuantities" to-field-name="quantity" to-map-name="inventoryItemInfo"/>
+            <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="Product" to-value-name="inventoryItemInfo.product"/>
+            <get-related-one value-name="inventoryItemInfo.inventoryItem" relation-name="StatusItem" to-value-name="inventoryItemInfo.statusItem"/>
+
+            <field-to-list field-name="inventoryItemInfo" list-name="inventoryItemInfoList"/>
+            <clear-field field-name="inventoryItemInfo"/>
+        </iterate>
+    </simple-method>
 </simple-methods>

Modified: trunk/applications/product/servicedef/services_picklist.xml
===================================================================
--- trunk/applications/product/servicedef/services_picklist.xml	2005-03-18 02:45:34 UTC (rev 4685)
+++ trunk/applications/product/servicedef/services_picklist.xml	2005-03-18 13:22:51 UTC (rev 4686)
@@ -36,21 +36,6 @@
         <attribute name="pickMoveByShipmentMethodInfoList" type="List" mode="OUT" optional="true"/>
     </service>
     
-    <!-- this old service definition is for one that used to get data for the picklist report
-    <service name="getPicklistData" engine="simple"
-            location="org/ofbiz/shipment/picklist/PicklistServices.xml" invoke="getPicklistData">
-        <description>Gets Picklist Data</description>
-        <attribute name="facilityId" type="String" mode="IN" optional="false"/>
-        <attribute name="shipmentMethodTypeId" type="String" mode="IN" optional="true"/>
-        <attribute name="maxNumberOfOrders" type="Long" mode="IN" optional="true"/>
-        <attribute name="facilityLocationInfoList" type="List" mode="OUT" optional="true"/>
-        <attribute name="inventoryItemInfoList" type="List" mode="OUT" optional="true"/>
-        <attribute name="orderHeaderInfoList" type="List" mode="OUT" optional="true"/>
-        <attribute name="wrongQuantityReservedList" type="List" mode="OUT" optional="true"/>
-        <attribute name="insufficientQohList" type="List" mode="OUT" optional="true"/>
-    </service>
-    -->
-    
     <!-- Persisted Picklist Services -->
     <service name="createPicklistFromOrders" engine="simple"
             location="org/ofbiz/shipment/picklist/PicklistServices.xml" invoke="createPicklistFromOrders">

Modified: trunk/applications/product/webapp/facility/facility/Picklist.fo.ftl
===================================================================
--- trunk/applications/product/webapp/facility/facility/Picklist.fo.ftl	2005-03-18 02:45:34 UTC (rev 4685)
+++ trunk/applications/product/webapp/facility/facility/Picklist.fo.ftl	2005-03-18 13:22:51 UTC (rev 4686)
@@ -28,6 +28,39 @@
  *@since      3.0
 -->
 
+<#macro pickInfoDetail pickQuantity picklistBinInfoList product facilityLocation>
+    <fo:table-row>
+        <fo:table-cell padding="2pt" background-color="${rowColor}">
+            <#if facilityLocation?has_content>
+                <fo:block>${facilityLocation.areaId?if_exists}-${facilityLocation.aisleId?if_exists}-${facilityLocation.sectionId?if_exists}-${facilityLocation.levelId?if_exists}-${facilityLocation.positionId?if_exists}</fo:block>
+            <#else>
+                <fo:block>[${uiLabelMap.ProductNoLocation}]</fo:block>
+            </#if>
+        </fo:table-cell>
+        <fo:table-cell padding="2pt" background-color="${rowColor}">
+            <#if product?has_content>
+                <fo:block>${product.internalName} [${product.productId}]</fo:block>
+            <#else>
+                <fo:block> </fo:block>
+            </#if>
+        </fo:table-cell>
+        <fo:table-cell padding="2pt" background-color="${rowColor}">
+            <fo:block>${pickQuantity}</fo:block>
+        </fo:table-cell>
+        <fo:table-cell padding="2pt" background-color="${rowColor}">
+            <#list picklistBinInfoList as picklistBinInfo>
+                <fo:block>${picklistBinInfo.quantity} to #${picklistBinInfo.picklistBin.binLocationNumber}</fo:block>
+            </#list>
+        </fo:table-cell>
+    </fo:table-row>
+    <#-- toggle the row color -->
+    <#if rowColor == "white">
+        <#assign rowColor = "#D4D0C8">
+    <#else>
+        <#assign rowColor = "white">
+    </#if>
+</#macro>
+
 <#macro picklistItemInfoDetail picklistItemInfo product facilityLocation>
     <#local picklistItem = picklistItemInfo.picklistItem>
     <#local orderItem = picklistItemInfo.orderItem>
@@ -35,8 +68,6 @@
         <fo:table-cell padding="2pt" background-color="${rowColor}">
             <#if facilityLocation?has_content>
                 <fo:block>${facilityLocation.areaId?if_exists}-${facilityLocation.aisleId?if_exists}-${facilityLocation.sectionId?if_exists}-${facilityLocation.levelId?if_exists}-${facilityLocation.positionId?if_exists}</fo:block>
-            <#elseif product?has_content>
-                <fo:block>[${uiLabelMap.ProductNoLocation}:${product.productId}]</fo:block>
             <#else>
                 <fo:block>[${uiLabelMap.ProductNoLocation}]</fo:block>
             </#if>
@@ -52,7 +83,7 @@
             <fo:block>${picklistItem.quantity}</fo:block>
         </fo:table-cell>
         <fo:table-cell padding="2pt" background-color="${rowColor}">
-            <fo:block>${orderItem.orderId}:${orderItem.orderItemSeqId} [of total: ${orderItem.quantity}]</fo:block>
+            <fo:block>${orderItemShipGrpInvRes.orderId}:${orderItem.orderItemSeqId}</fo:block>
         </fo:table-cell>
         <fo:table-cell padding="2pt" background-color="${rowColor}">
             <fo:block>
@@ -79,7 +110,7 @@
        - picklistBin
        - primaryOrderHeader
        - primaryOrderItemShipGroup
-       - picklistItemInfoList (picklistItem, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList) 
+       - picklistItemInfoList (picklistItem, picklistBin, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList) 
 -->
 <fo:layout-master-set>
     <fo:simple-page-master master-name="main" page-height="11in" page-width="8.5in"
@@ -96,49 +127,57 @@
     <#if security.hasEntityPermission("FACILITY", "_VIEW", session)>
 
     <#if picklistInfo?has_content>
-        <fo:block font-size="14pt">Items to Pick in Facility ${picklistInfo.facility.facilityName} <fo:inline font-size="8pt">[${picklistInfo.facility.facilityId}]</fo:inline></fo:block>
+        <fo:block font-size="12pt">Picklist ${picklistInfo.picklist.picklistId} in Facility ${picklistInfo.facility.facilityName} <fo:inline font-size="8pt">[${picklistInfo.facility.facilityId}]</fo:inline></fo:block>
+        <#if picklistInfo.shipmentMethodType?has_content>
+            <fo:block font-size="10pt">for Shipment Method Type ${picklistInfo.shipmentMethodType.description?default(picklistInfo.shipmentMethodType.shipmentMethodTypeId)}</fo:block>
+        </#if>
     </#if>
 
     <fo:block space-after.optimum="10pt" font-size="10pt">
     <fo:table>
-        <fo:table-column column-width="80pt"/>
-        <fo:table-column column-width="180pt"/>
+        <fo:table-column column-width="90pt"/>
+        <fo:table-column column-width="220pt"/>
         <fo:table-column column-width="50pt"/>
-        <fo:table-column column-width="60pt"/>
         <fo:table-column column-width="80pt"/>
         <fo:table-header>
             <fo:table-row font-weight="bold">
                 <fo:table-cell border-bottom="thin solid grey"><fo:block>${uiLabelMap.ProductLocation}</fo:block></fo:table-cell>
                 <fo:table-cell border-bottom="thin solid grey"><fo:block>${uiLabelMap.ProductProductId}</fo:block></fo:table-cell>
                 <fo:table-cell border-bottom="thin solid grey"><fo:block>${uiLabelMap.ProductToPick}</fo:block></fo:table-cell>
+                <fo:table-cell border-bottom="thin solid grey"><fo:block>Quantity to Bin#</fo:block></fo:table-cell>
+                
+              <#-- Not display details here, just the summary info for the bins
                 <fo:table-cell border-bottom="thin solid grey"><fo:block>${uiLabelMap.OrderOrderItems}</fo:block></fo:table-cell>
                 <fo:table-cell border-bottom="thin solid grey"><fo:block>${uiLabelMap.ProductInventoryItems}</fo:block></fo:table-cell>
+              -->
             </fo:table-row>
         </fo:table-header>
         <fo:table-body>
+            <#--
+              2. facilityLocationInfoList (facilityLocation, product, pickQuantity, picklistBinInfoList (picklistBin, quantity), picklistItemInfoList (picklistItem, picklistBin, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList))
+              3. noLocationProductInfoList (product, pickQuantity, picklistBinInfoList (picklistBin, quantity), picklistItemInfoList (picklistItem, picklistBin, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList))
+            -->
             <#if facilityLocationInfoList?has_content || noLocationProductInfoList?has_content>
                 <#assign rowColor = "white">
-                <#-- facilityLocationInfoList: facilityLocation, picklistItemInfoList (picklistItem, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList) -->
                 <#if facilityLocationInfoList?has_content>
                 <#list facilityLocationInfoList as facilityLocationInfo>
-                    <#assign facilityLocation = facilityLocationInfo.facilityLocation>
-                    <#assign picklistItemInfoList = facilityLocationInfo.picklistItemInfoList>
-                    <#list picklistItemInfoList as picklistItemInfo>
-                        <#assign product = picklistItemInfo.product/>
-                        <@picklistItemInfoDetail picklistItemInfo=picklistItemInfo product=product facilityLocation=facilityLocation/>
+                    <@pickInfoDetail pickQuantity=facilityLocationInfo.pickQuantity picklistBinInfoList=facilityLocationInfo.picklistBinInfoList product=facilityLocationInfo.product facilityLocation=facilityLocationInfo.facilityLocation/>
+                  <#-- Not display details here, just the summary info for the bins
+                    <#list facilityLocationInfo.picklistItemInfoList as picklistItemInfo>
+                        <@picklistItemInfoDetail picklistItemInfo=picklistItemInfo product=picklistItemInfo.product facilityLocation=facilityLocationInfo.facilityLocation/>
                     </#list>
+                  -->
                 </#list>
                 </#if>
-                <#-- noLocationProductInfoList: product, picklistItemInfoList (picklistItem, orderItem, product, inventoryItemAndLocation, orderItemShipGrpInvRes, itemIssuanceList) -->
+
                 <#if noLocationProductInfoList?has_content>
                 <#list noLocationProductInfoList as noLocationProductInfo>
-                    <#if !noLocationProductInfo.facilityLocation?exists>
-                        <#assign product = noLocationProductInfo.product>
-                        <#assign picklistItemInfoList = noLocationProductInfo.picklistItemInfoList>
-                        <#list picklistItemInfoList as picklistItemInfo>
-                            <@picklistItemInfoDetail picklistItemInfo=picklistItemInfo product=product facilityLocation=null/>
-                        </#list>
-                    </#if>
+                    <@pickInfoDetail pickQuantity=noLocationProductInfo.pickQuantity picklistBinInfoList=noLocationProductInfo.picklistBinInfoList product=noLocationProductInfo.product facilityLocation=null/>
+                  <#-- Not display details here, just the summary info for the bins
+                    <#list noLocationProductInfo.picklistItemInfoList as picklistItemInfo>
+                        <@picklistItemInfoDetail picklistItemInfo=picklistItemInfo product=noLocationProductInfo.product facilityLocation=null/>
+                    </#list>
+                  -->
                 </#list>
                 </#if>
             <#else>
@@ -159,7 +198,7 @@
         <#assign picklistItemInfoList = picklistBinInfo.picklistItemInfoList>
         <fo:page-sequence master-reference="main">
         <fo:flow flow-name="xsl-region-body" font-family="Helvetica">
-            <fo:block font-size="14pt">Order ${picklistBinInfo_index+1} to Pack, ID: ${picklistBinInfo.primaryOrderHeader.orderId}, Ship Group ID: ${picklistBinInfo.primaryOrderItemShipGroup.shipGroupSeqId}</fo:block>
+            <fo:block font-size="14pt">Bin ${picklistBin.binLocationNumber} to Pack, Order ID: ${picklistBinInfo.primaryOrderHeader.orderId}, Ship Group ID: ${picklistBinInfo.primaryOrderItemShipGroup.shipGroupSeqId}</fo:block>
             <fo:block space-after.optimum="10pt" font-size="10pt">
             <fo:table>
                 <fo:table-column column-width="60pt"/>
@@ -182,7 +221,7 @@
                         <#assign orderItemShipGrpInvRes = picklistItemInfo.orderItemShipGrpInvRes>
                         <fo:table-row>
                             <fo:table-cell padding="2pt" background-color="${rowColor}">
-                                <fo:block>${picklistItem.orderId}:${picklistItem.shipGroupSeqId}:${picklistItem.orderItemSeqId}</fo:block>
+                                <fo:block><#--${picklistItem.orderId}:${picklistItem.shipGroupSeqId}:-->${picklistItem.orderItemSeqId}</fo:block>
                             </fo:table-cell>
                             <fo:table-cell padding="2pt" background-color="${rowColor}">
                                 <#if product?has_content>
@@ -192,7 +231,7 @@
                                 </#if>
                             </fo:table-cell>
                             <fo:table-cell padding="2pt" background-color="${rowColor}">
-                                <fo:block>${picklistItem.quantity} of ${orderItem.quantity}</fo:block>
+                                <fo:block>${picklistItem.quantity}</fo:block>
                             </fo:table-cell>
                             <fo:table-cell padding="2pt" background-color="${rowColor}">
                                 <fo:block>${orderItemShipGrpInvRes.inventoryItemId}:${orderItemShipGrpInvRes.quantity}:${orderItemShipGrpInvRes.quantityNotAvailable?if_exists}</fo:block>

Modified: trunk/applications/product/webapp/facility/facility/PicklistManage.ftl
===================================================================
--- trunk/applications/product/webapp/facility/facility/PicklistManage.ftl	2005-03-18 02:45:34 UTC (rev 4685)
+++ trunk/applications/product/webapp/facility/facility/PicklistManage.ftl	2005-03-18 13:22:51 UTC (rev 4686)
@@ -55,8 +55,13 @@
                         <input type="submit" value="${uiLabelMap.CommonUpdate}" class="smallSubmit"/>
                     </form>
                     <b>created/modified by</b> ${picklist.createdByUserLogin}/${picklist.lastModifiedByUserLogin}
-                    <a href="<@ofbizUrl>PicklistReport.pdf?picklistId=${picklist.picklistId}</@ofbizUrl>" class="buttontext" target="_blank">[Pick/Pack Report]</a>
+                    <a href="<@ofbizUrl>PicklistReport.pdf?picklistId=${picklist.picklistId}</@ofbizUrl>" class="buttontext">[Pick/Pack Report]</a>
                 </div>
+                <#if picklistInfo.shipmentMethodType?has_content>
+                    <div class="tabletext" style="margin-left: 15px;">
+                        <b>for Shipment Method Type</b> ${picklistInfo.shipmentMethodType.description?default(picklistInfo.shipmentMethodType.shipmentMethodTypeId)}
+                    </div>
+                </#if>
                 
                 <#-- PicklistRole -->
                 <#list picklistInfo.picklistRoleInfoList?if_exists as picklistRoleInfo>
@@ -98,16 +103,19 @@
                         <b>Bin</b> ${picklistBinInfo.picklistBin.binLocationNumber}
                         <#if picklistBinInfo.primaryOrderHeader?exists><b>Primary Order</b> ${picklistBinInfo.primaryOrderHeader.orderId}</#if>
                         <#if picklistBinInfo.primaryOrderItemShipGroup?exists><b>Primary Ship Group</b> ${picklistBinInfo.primaryOrderItemShipGroup.shipGroupSeqId}</#if>
-                        <b>Move Bin to Picklist: </b>
+                    </div>
+                    <div class="tabletext" style="margin-left: 30px;">
+                        <b>Update Bin:</b>
 	                    <form method="POST" action="<@ofbizUrl>updatePicklistBin</@ofbizUrl>" style="display: inline;">
 	                        <input type="hidden" name="facilityId" value="${facilityId}"/>
 	                        <input type="hidden" name="picklistBinId" value="${picklistBinInfo.picklistBin.picklistBinId}"/>
+	                        Location#:
+	                        <input type"text" size="2" name="binLocationNumber" value="${picklistBinInfo.picklistBin.binLocationNumber}"/>
+                            Picklist:
 	                        <select name="picklistId" class="smallSelect">
 	                            <#list picklistActiveList as picklistActive>
-	                              <#if picklistActive.picklistId != picklist.picklistId>
 	                                <#assign picklistActiveStatusItem = picklistActive.getRelatedOneCache("StatusItem")>
-	                                <option value="${picklistActive.picklistId}">${picklistActive.picklistId} [Date:${picklistActive.picklistDate},Status:${picklistActiveStatusItem.description}]</option>
-	                              </#if>
+	                                <option value="${picklistActive.picklistId}"<#if picklistActive.picklistId != picklist.picklistId> selected</#if>>${picklistActive.picklistId} [Date:${picklistActive.picklistDate},Status:${picklistActiveStatusItem.description}]</option>
 	                            </#list>
 	                        </select>
 	                        <input type="submit" value="${uiLabelMap.CommonUpdate}" class="smallSubmit"/>
@@ -121,7 +129,7 @@
                             <b>Product</b> ${picklistItemInfo.orderItem.productId}
                             <b>Inventory Item</b> ${inventoryItemAndLocation.inventoryItemId}
                             <b>Location</b> ${inventoryItemAndLocation.areaId?if_exists}-${inventoryItemAndLocation.aisleId?if_exists}-${inventoryItemAndLocation.sectionId?if_exists}-${inventoryItemAndLocation.levelId?if_exists}-${inventoryItemAndLocation.positionId?if_exists}
-                            <b>Quantity</b> ${picklistItem.quantity} of ${picklistItemInfo.orderItem.quantity}
+                            <b>Quantity</b> ${picklistItem.quantity}<#-- of ${picklistItemInfo.orderItem.quantity}-->
                         </div>
                         <#-- picklistItem.orderItemShipGrpInvRes (do we want to display any of this info?) -->
                         <#-- picklistItemInfo.itemIssuanceList -->



More information about the Svn mailing list