svn commit: r745931 - in /ofbiz/trunk/applications/product: servicedef/services_shipment.xml src/org/ofbiz/shipment/packing/PackingServices.java src/org/ofbiz/shipment/packing/PackingSession.java webapp/facility/shipment/PackOrder.ftl

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r745931 - in /ofbiz/trunk/applications/product: servicedef/services_shipment.xml src/org/ofbiz/shipment/packing/PackingServices.java src/org/ofbiz/shipment/packing/PackingSession.java webapp/facility/shipment/PackOrder.ftl

jleroux@apache.org
Author: jleroux
Date: Thu Feb 19 17:19:48 2009
New Revision: 745931

URL: http://svn.apache.org/viewvc?rev=745931&view=rev
Log:
A slightly modified patch from Karim Rahimpur "Packing issues: weights and remaining items" https://issues.apache.org/jira/browse/OFBIZ-2163 OFBIZ-2163

Modified:
    ofbiz/trunk/applications/product/servicedef/services_shipment.xml
    ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingServices.java
    ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSession.java
    ofbiz/trunk/applications/product/webapp/facility/shipment/PackOrder.ftl

Modified: ofbiz/trunk/applications/product/servicedef/services_shipment.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services_shipment.xml?rev=745931&r1=745930&r2=745931&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/servicedef/services_shipment.xml (original)
+++ ofbiz/trunk/applications/product/servicedef/services_shipment.xml Thu Feb 19 17:19:48 2009
@@ -469,6 +469,7 @@
         <attribute name="selInfo" type="Map" string-map-prefix="sel_" mode="IN" optional="true"/>
         <attribute name="iteInfo" type="Map" string-map-prefix="ite_" mode="IN" optional="true"/>
         <attribute name="wgtInfo" type="Map" string-map-prefix="wgt_" mode="IN" optional="true"/>
+        <attribute name="numPackagesInfo" type="Map" string-map-prefix="numPackages_" mode="IN" optional="true"/>
     </service>
 
     <service name="setNextPackageSeq" engine="java"

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingServices.java?rev=745931&r1=745930&r2=745931&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingServices.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingServices.java Thu Feb 19 17:19:48 2009
@@ -70,6 +70,23 @@
         return ServiceUtil.returnSuccess();
     }
 
+    /**
+     * <p>Create or update package lines.</p>
+     * <p>Context parameters:
+     * <ul>
+     * <li>selInfo - selected rows</li>
+     * <li>iteInfo - orderItemIds</li>
+     * <li>prdInfo - productIds</li>
+     * <li>pkgInfo - package numbers</li>
+     * <li>wgtInfo - weights to pack</li>
+     * <li>numPackagesInfo - number of packages to pack per line (>= 1, default: 1)<br/>
+     * Packs the same items n times in consecutive packages, starting from the package number retrieved from pkgInfo.</li>
+     * <ul>
+     * </p>
+     * @param dctx
+     * @param context
+     * @return
+     */
     public static Map<String, Object> packBulk(DispatchContext dctx, Map<String, ? extends Object> context) {
         PackingSession session = (PackingSession) context.get("packingSession");
         String orderId = (String) context.get("orderId");
@@ -93,6 +110,7 @@
         Map<String, String> qtyInfo = UtilGenerics.checkMap(context.get("qtyInfo"));
         Map<String, String> pkgInfo = UtilGenerics.checkMap(context.get("pkgInfo"));
         Map<String, String> wgtInfo = UtilGenerics.checkMap(context.get("wgtInfo"));
+        Map<String, String> numPackagesInfo = UtilGenerics.checkMap(context.get("numPackagesInfo"));
 
         if (selInfo != null) {
             for (String rowKey: selInfo.keySet()) {
@@ -158,7 +176,20 @@
                     }
 
                     try {
-                        session.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, prdStr, quantity, packageSeq, weightSeq, updateQuantity.booleanValue());
+                        String numPackagesStr = numPackagesInfo.get(rowKey);
+                        int numPackages = 1;
+                        if (numPackagesStr != null) {
+                            try {
+                                numPackages = Integer.parseInt(numPackagesStr);
+                                if (numPackages < 1) {
+                                    numPackages = 1;
+                                }
+                            } catch (NumberFormatException nex) {
+                            }
+                        }
+                        for (int numPackage=0; numPackage<numPackages; numPackage++) {
+                            session.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, prdStr, quantity, packageSeq+numPackage, weightSeq, updateQuantity.booleanValue());
+                        }
                     } catch (GeneralException e) {
                         Debug.logError(e, module);
                         return ServiceUtil.returnError(e.getMessage());

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSession.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSession.java?rev=745931&r1=745930&r2=745931&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSession.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSession.java Thu Feb 19 17:19:48 2009
@@ -325,6 +325,40 @@
         return itemInfos;
     }
 
+    /**
+     * <p>Delivers all the packing lines grouped by package.</p>
+     * <p>Output map:
+     * <ul>
+     * <li>packageMap - a Map of type Map<Integer, List<PackingSessionLine>>
+     * that maps package sequence ids to the lines that belong in
+     * that package</li>
+     * <li>sortedKeys - a List of type List<Integer> with the sorted package
+     * sequence numbers to index the packageMap</li>
+     * @return result Map with packageMap and sortedKeys
+     */
+    public Map<Object, Object> getPackingSessionLinesByPackage() {
+        FastMap<Integer, List<PackingSessionLine>> packageMap = FastMap.newInstance();
+        for (PackingSessionLine line : packLines) {
+           int pSeq = line.getPackageSeq();
+           List<PackingSessionLine> packageLineList = packageMap.get(pSeq);
+           if (packageLineList == null) {
+               packageLineList = FastList.newInstance();
+               packageMap.put(pSeq, packageLineList);
+           }
+           packageLineList.add(line);
+        }
+        Object[] keys = packageMap.keySet().toArray();
+        java.util.Arrays.sort(keys);
+        List<Object> sortedKeys = FastList.newInstance();
+        for (Object key : keys) {
+            sortedKeys.add(key);
+        }
+        Map<Object, Object> result = FastMap.newInstance();
+        result.put("packageMap", packageMap);
+        result.put("sortedKeys", sortedKeys);
+        return result;
+    }
+
     public void clearItemInfos() {
         itemInfos.clear();
     }
@@ -539,15 +573,29 @@
                 this.clearLine(line);
             }
         }
-        return --packageSeq;
+        //return --packageSeq;
+        return packageSeq;
     }
 
     public void clearLine(PackingSessionLine line) {
         this.packLines.remove(line);
+        BigDecimal packageWeight = this.packageWeights.get(line.packageSeq);
+        if (packageWeight != null) {
+            packageWeight = packageWeight.subtract(line.weight);
+            if (packageWeight.compareTo(BigDecimal.ZERO) < 0) {
+                packageWeight = BigDecimal.ZERO;
+            }
+            this.packageWeights.put(line.packageSeq, packageWeight);
+        }
+        if (line.packageSeq == packageSeq) {
+            packageSeq--;
+        }
     }
 
     public void clearAllLines() {
         this.packLines.clear();
+        this.packageWeights.clear();
+        this.packageSeq = 1;
     }
 
     public void clear() {

Modified: ofbiz/trunk/applications/product/webapp/facility/shipment/PackOrder.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/facility/shipment/PackOrder.ftl?rev=745931&r1=745930&r2=745931&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/webapp/facility/shipment/PackOrder.ftl (original)
+++ ofbiz/trunk/applications/product/webapp/facility/shipment/PackOrder.ftl Thu Feb 19 17:19:48 2009
@@ -19,7 +19,7 @@
 
 <#if security.hasEntityPermission("FACILITY", "_VIEW", session)>
     <#assign showInput = requestParameters.showInput?default("Y")>
-    <#assign hideGrid = requestParameters.hideGrid?default("N")>    
+    <#assign hideGrid = requestParameters.hideGrid?default("N")>
 
     <#if (requestParameters.forceComplete?has_content && !shipmentId?has_content)>
         <#assign forceComplete = "true">
@@ -35,19 +35,19 @@
         <div class="screenlet-body">
             <#if shipmentId?has_content>
                 <div>
-                ${uiLabelMap.CommonView} <a href="<@ofbizUrl>/PackingSlip.pdf?shipmentId=${shipmentId}</@ofbizUrl>" target="_blank" class="buttontext">${uiLabelMap.ProductPackingSlip}</a> ${uiLabelMap.CommonOr}
+                ${uiLabelMap.CommonView} <a href="<@ofbizUrl>/PackingSlip.pdf?shipmentId=${shipmentId}</@ofbizUrl>" target="_blank" class="buttontext">${uiLabelMap.ProductPackingSlip}</a> ${uiLabelMap.CommonOr}
                 ${uiLabelMap.CommonView} <a href="<@ofbizUrl>/ShipmentBarCode.pdf?shipmentId=${shipmentId}</@ofbizUrl>" target="_blank" class="buttontext">${uiLabelMap.ProductBarcode}</a> ${uiLabelMap.CommonFor} ${uiLabelMap.ProductShipmentId} <a href="<@ofbizUrl>/ViewShipment?shipmentId=${shipmentId}</@ofbizUrl>" class="buttontext">${shipmentId}</a>
                 </div>
                 <#if invoiceIds?exists && invoiceIds?has_content>
                 <div>
-                    <p>${uiLabelMap.AccountingInvoices}:</p>
+                    <p>${uiLabelMap.AccountingInvoices}:</p>
                     <ul>
-                     <#list invoiceIds as invoiceId>
-                       <li>
-                         #<a href="/accounting/control/invoiceOverview?invoiceId=${invoiceId}&externalLoginKey=${externalLoginKey}" target="_blank" class="buttontext">${invoiceId}</a>
-                         (<a href="/accounting/control/invoice.pdf?invoiceId=${invoiceId}&externalLoginKey=${externalLoginKey}" target="_blank" class="buttontext">PDF</a>)
-                       </li>
-                     </#list>
+                    <#list invoiceIds as invoiceId>
+                      <li>
+                        #<a href="/accounting/control/invoiceOverview?invoiceId=${invoiceId}&externalLoginKey=${externalLoginKey}" target="_blank" class="buttontext">${invoiceId}</a>
+                        (<a href="/accounting/control/invoice.pdf?invoiceId=${invoiceId}&externalLoginKey=${externalLoginKey}" target="_blank" class="buttontext">PDF</a>)
+                      </li>
+                    </#list>
                     </ul>
                 </div>
                 </#if>
@@ -59,7 +59,7 @@
               <input type="hidden" name="facilityId" value="${facilityId?if_exists}">
               <table cellspacing="0" class="basic-table">
                 <tr>
-                  <td width="25%" align="right"><span class="label">${uiLabelMap.ProductOrderId} #</span></td>
+                  <td width="25%" align="right"><span class="label">${uiLabelMap.ProductOrderId}</span></td>
                   <td width="1">&nbsp;</td>
                   <td width="25%">
                     <input type="text" name="orderId" size="20" maxlength="20" value="${orderId?if_exists}"/>
@@ -85,10 +85,10 @@
               <input type="hidden" name="facilityId" value="${facilityId?if_exists}">
               <table cellspacing="0" class="basic-table">
                 <tr>
-                  <td width="25%" align='right'><span class="label">${uiLabelMap.FormFieldTitle_picklistBinId} #</span></td>
+                  <td width="25%" align='right'><span class="label">${uiLabelMap.FormFieldTitle_picklistBinId}</span></td>
                   <td width="1">&nbsp;</td>
                   <td width="25%">
-                    <input type="text" name="picklistBinId" size="29" maxlength="60" value="${picklistBinId?if_exists}"/>            
+                    <input type="text" name="picklistBinId" size="29" maxlength="60" value="${picklistBinId?if_exists}"/>
                   </td>
                   <td><span class="label">${uiLabelMap.ProductHideGrid}</span>&nbsp;<input type="checkbox" name="hideGrid" value="Y" <#if (hideGrid == "Y")>checked=""</#if>></td>
                   <td>&nbsp;</td>
@@ -114,7 +114,7 @@
             </form>
         </div>
     </div>
-            
+
     <#if showInput != "N" && ((orderHeader?exists && orderHeader?has_content))>
     <div class="screenlet">
         <div class="screenlet-title-bar">
@@ -175,9 +175,9 @@
                     </td>
                     <td>&nbsp;</td>
                     <td valign="top">
-                      <span class="label">${uiLabelMap.ProductShipping} ${uiLabelMap.ProductInstruction}</span>
+                      <span class="label">${uiLabelMap.OrderInstructions}</span>
                       <br/>
-                      ${orderItemShipGroup.shippingInstructions?default("(none)")}
+                      ${orderItemShipGroup.shippingInstructions?default("(${uiLabelMap.CommonNone})")}
                     </td>
                   </tr>
                 </table>
@@ -196,7 +196,7 @@
                     <tr>
                       <td>
                         <div>
-                            <span class="label">${uiLabelMap.ProductProduct} #</span>
+                            <span class="label">${uiLabelMap.ProductProductNumber}</span>
                             <input type="text" name="productId" size="20" maxlength="20" value=""/>
                             @
                             <input type="text" name="quantity" size="6" maxlength="6" value="1"/>
@@ -204,9 +204,9 @@
                         </div>
                       </td>
                       <td>
-                          <span class="label">${uiLabelMap.CommonCurrent} ${uiLabelMap.ProductPackage} ${uiLabelMap.CommonSequence}</span>
+                          <span class="label">${uiLabelMap.ProductCurrentPackageSequence}</span>
                           ${packingSession.getCurrentPackageSeq()}
-                          <input type="button" value="${uiLabelMap.CommonNext} ${uiLabelMap.ProductPackage}" onclick="javascript:document.incPkgSeq.submit();">
+                          <input type="button" value="${uiLabelMap.ProductNextPackage}" onclick="javascript:document.incPkgSeq.submit();">
                       </td>
                     </tr>
                   </table>
@@ -229,19 +229,20 @@
                       <td>&nbsp;</td>
                       <td>${uiLabelMap.ProductItem} #</td>
                       <td>${uiLabelMap.ProductProductId}</td>
-                      <td>${uiLabelMap.Description}</td>
+                      <td>${uiLabelMap.ProductInternalName}</td>
                       <td align="right">${uiLabelMap.ProductOrderedQuantity}</td>
                       <td align="right">${uiLabelMap.ProductQuantityShipped}</td>
                       <td align="right">${uiLabelMap.ProductPackedQty}</td>
                       <td>&nbsp;</td>
                       <td align="center">${uiLabelMap.ProductPackQty}</td>
-                      <#--td align="center">${uiLabelMap.ProductPackedWeight}&nbsp;(${("uiLabelMap.ProductShipmentUomAbbreviation_" + defaultWeightUomId)?eval})</td-->
+                      <td align="center">${uiLabelMap.ProductPackedWeight}&nbsp;(${("uiLabelMap.ProductShipmentUomAbbreviation_" + defaultWeightUomId)?eval})</td>
                       <td align="center">${uiLabelMap.ProductPackage}</td>
+                      <td align="right">&nbsp;<b>*</b>&nbsp;${uiLabelMap.ProductPackages}</td>
                     </tr>
-                                
-                    <#if (itemInfos?has_content)>              
+
+                    <#if (itemInfos?has_content)>
                       <#assign rowKey = 1>
-                      <#list itemInfos as itemInfo>                                            
+                      <#list itemInfos as itemInfo>
                       <#-- <#list itemInfos as orderItem>  -->
                         <#assign orderItem = itemInfo.orderItem/>
                         <#assign shippedQuantity = orderReadHelper.getItemShippedQuantity(orderItem)?if_exists>
@@ -255,8 +256,7 @@
                           <#assign orderItemQuantity = orderItem.quantity>
                         </#if>
                         -->
-
-                        <#assign inputQty = (orderItemQuantity - shippedQuantity - packingSession.getPackedQuantity(orderId, orderItem.orderItemSeqId, shipGroupSeqId, itemInfo.productId))>
+                        <#assign inputQty = orderItemQuantity - packingSession.getPackedQuantity(orderId, orderItem.orderItemSeqId, shipGroupSeqId, itemInfo.productId)>
                         <tr>
                           <td><input type="checkbox" name="sel_${rowKey}" value="Y" <#if (inputQty >0)>checked=""</#if>/></td>
                           <td>${orderItem.orderItemSeqId}</td>
@@ -279,18 +279,29 @@
                           <td align="center">
                             <input type="text" size="7" name="qty_${rowKey}" value="${inputQty}">
                           </td>
-                          <#--td align="center">
+                          <td align="center">
                             <input type="text" size="7" name="wgt_${rowKey}" value="">
-                          </td-->
+                          </td>
                           <td align="center">
                             <select name="pkg_${rowKey}">
-                              <option value="1">${uiLabelMap.ProductPackage} 1</option>
-                              <option value="2">${uiLabelMap.ProductPackage} 2</option>
-                              <option value="3">${uiLabelMap.ProductPackage} 3</option>
-                              <option value="4">${uiLabelMap.ProductPackage} 4</option>
-                              <option value="5">${uiLabelMap.ProductPackage} 5</option>
+                              <#if packingSession.getPackageSeqIds()?exists>
+                                <#list packingSession.getPackageSeqIds() as packageSeqId>
+                                  <option value="${packageSeqId}">${uiLabelMap.ProductPackage} ${packageSeqId}</option>
+                                </#list>
+                                <#assign nextPackageSeqId = packingSession.getPackageSeqIds().size() + 1>
+                                <option value="${nextPackageSeqId}">${uiLabelMap.ProductNextPackage}</option>
+                              <#else>
+                                <option value="1">${uiLabelMap.ProductPackage} 1</option>
+                                <option value="2">${uiLabelMap.ProductPackage} 2</option>
+                                <option value="3">${uiLabelMap.ProductPackage} 3</option>
+                                <option value="4">${uiLabelMap.ProductPackage} 4</option>
+                                <option value="5">${uiLabelMap.ProductPackage} 5</option>
+                              </#if>
                             </select>
                           </td>
+                          <td align="right">
+                            <input type="text" size="7" name="numPackages_${rowKey}" value="1">
+                          </td>
                           <input type="hidden" name="prd_${rowKey}" value="${itemInfo.productId?if_exists}"/>
                           <input type="hidden" name="ite_${rowKey}" value="${orderItem.orderItemSeqId}"/>
                         </tr>
@@ -299,10 +310,10 @@
                     </#if>
                     <tr><td colspan="10">&nbsp;</td></tr>
                     <tr>
-                      <td colspan="10" align="right">
+                      <td colspan="12" align="right">
                         <input type="submit" value="${uiLabelMap.ProductPackItem}">
                         &nbsp;
-                        <input type="button" value="${uiLabelMap.CommonClear}" onclick="javascript:document.clearPackForm.submit();"/>
+                        <input type="button" value="${uiLabelMap.CommonClear} (${uiLabelMap.CommonAll})" onclick="javascript:document.clearPackForm.submit();"/>
                       </td>
                     </tr>
                   </table>
@@ -328,7 +339,7 @@
                                 <span class="label">${uiLabelMap.ProductPackedWeight} (${("uiLabelMap.ProductShipmentUomAbbreviation_" + defaultWeightUomId)?eval}):</span>
                                 <br/>
                                 <#list packageSeqIds as packageSeqId>
-                                    ${uiLabelMap.ProductPackage} ${packageSeqId}  
+                                    ${uiLabelMap.ProductPackage} ${packageSeqId}
                                     <input type="text" size="7" name="packageWeight_${packageSeqId}" value="${packingSession.getPackageWeight(packageSeqId?int)?if_exists}">
                                     <br/>
                                 </#list>
@@ -369,11 +380,29 @@
                   <br/>
                 </form>
               </#if>
+        </div>
+    </div>
 
-              <!-- packed items display -->
-              <#assign packedLines = packingSession.getLines()?if_exists>
+    <!-- display items in packages, per packed package and in order -->
+    <#assign linesByPackageResultMap = packingSession.getPackingSessionLinesByPackage()?if_exists>
+    <#assign packageMap = linesByPackageResultMap.get("packageMap")?if_exists>
+    <#assign sortedKeys = linesByPackageResultMap.get("sortedKeys")?if_exists>
+    <#if ((packageMap?has_content) && (sortedKeys?has_content))>
+      <div class="screenlet">
+        <div class="screenlet-title-bar">
+            <ul>
+                <li class="h3">${uiLabelMap.ProductPackages} : ${sortedKeys.size()?if_exists}</li>
+            </ul>
+            <br class="clear"/>
+        </div>
+          <div class="screenlet-body">
+            <#list sortedKeys as key>
+              <#assign packedLines = packageMap.get(key)>
               <#if packedLines?has_content>
                 <br/>
+                <#assign packedLine = packedLines.get(0)?if_exists>
+                <span class="label" style="font-size:1.2em">${uiLabelMap.ProductPackage}&nbsp;${packedLine.getPackageSeq()?if_exists}</span>
+                <br/>
                 <table class="basic-table" cellspacing='0'>
                   <tr class="header-row">
                     <td>${uiLabelMap.ProductItem} #</td>
@@ -381,7 +410,7 @@
                     <td>${uiLabelMap.Description}</td>
                     <td>${uiLabelMap.ProductInventoryItem} #</td>
                     <td align="right">${uiLabelMap.ProductPackedQty}</td>
-                    <#--td align="right">${uiLabelMap.ProductPackedWeight}&nbsp;(${("uiLabelMap.ProductShipmentUomAbbreviation_" + defaultWeightUomId)?eval})</td-->
+                    <td align="right">${uiLabelMap.ProductPackedWeight}&nbsp;(${("uiLabelMap.ProductShipmentUomAbbreviation_" + defaultWeightUomId)?eval})&nbsp;(${uiLabelMap.ProductPackage})</td>
                     <td align="right">${uiLabelMap.ProductPackage} #</td>
                     <td>&nbsp;</td>
                   </tr>
@@ -395,26 +424,72 @@
                       </td>
                       <td>${line.getInventoryItemId()}</td>
                       <td align="right">${line.getQuantity()}</td>
-                      <#--td align="right">${line.getWeight()}</td-->
+                      <td align="right">${line.getWeight()} (${packingSession.getPackageWeight(line.getPackageSeq()?int)?if_exists})</td>
                       <td align="right">${line.getPackageSeq()}</td>
                       <td align="right"><a href="<@ofbizUrl>ClearPackLine?facilityId=${facilityId}&orderId=${line.getOrderId()}&orderItemSeqId=${line.getOrderItemSeqId()}&shipGroupSeqId=${line.getShipGroupSeqId()}&amp;productId=${line.getProductId()?default("")}&inventoryItemId=${line.getInventoryItemId()}&packageSeqId=${line.getPackageSeq()}</@ofbizUrl>" class="buttontext">${uiLabelMap.CommonClear}</a></td>
                     </tr>
                   </#list>
                 </table>
               </#if>
-            </#if>
+            </#list>
+          </div>
+      </div>
+    </#if>
 
-            <#if orderId?has_content>
-              <script language="javascript">
-                document.singlePackForm.productId.focus();
-              </script>
-            <#else>
-              <script language="javascript">
-                document.selectOrderForm.orderId.focus();
-              </script>
-            </#if>
-        </div>
-    </div>
+    <!-- packed items display -->
+    <#assign packedLines = packingSession.getLines()?if_exists>
+    <#if packedLines?has_content>
+      <div class="screenlet">
+          <div class="screenlet-title-bar">
+              <ul>
+                  <li class="h3">${uiLabelMap.ProductItems} (${uiLabelMap.ProductPackages}): ${packedLines.size()?if_exists}</li>
+              </ul>
+              <br class="clear"/>
+          </div>
+          <div class="screenlet-body">
+            <table class="basic-table" cellspacing='0'>
+              <tr class="header-row">
+                  <td>${uiLabelMap.ProductItem} #</td>
+                  <td>${uiLabelMap.ProductProductId}</td>
+                  <td>${uiLabelMap.Description}</td>
+                  <td>${uiLabelMap.ProductInventoryItem} #</td>
+                  <td align="right">${uiLabelMap.ProductPackedQty}</td>
+                  <td align="right">${uiLabelMap.ProductPackedWeight}&nbsp;(${("uiLabelMap.ProductShipmentUomAbbreviation_" + defaultWeightUomId)?eval})&nbsp;(${uiLabelMap.ProductPackage})</td>
+                  <td align="right">${uiLabelMap.ProductPackage} #</td>
+                  <td>&nbsp;</td>
+              </tr>
+              <#list packedLines as line>
+                  <#assign product = Static["org.ofbiz.product.product.ProductWorker"].findProduct(delegator, line.getProductId())/>
+                  <tr>
+                      <td>${line.getOrderItemSeqId()}</td>
+                      <td>${line.getProductId()?default("N/A")}</td>
+                      <td>
+                          <a href="/catalog/control/EditProduct?productId=${line.getProductId()?if_exists}${externalKeyParam}" class="buttontext" target="_blank">${product.internalName?if_exists?default("[N/A]")}</a>
+                      </td>
+                      <td>${line.getInventoryItemId()}</td>
+                      <td align="right">${line.getQuantity()}</td>
+                      <td align="right">${line.getWeight()} (${packingSession.getPackageWeight(line.getPackageSeq()?int)?if_exists})</td>
+                      <td align="right">${line.getPackageSeq()}</td>
+                      <td align="right"><a href="<@ofbizUrl>ClearPackLine?facilityId=${facilityId}&orderId=${line.getOrderId()}&orderItemSeqId=${line.getOrderItemSeqId()}&shipGroupSeqId=${line.getShipGroupSeqId()}&amp;productId=${line.getProductId()?default("")}&inventoryItemId=${line.getInventoryItemId()}&packageSeqId=${line.getPackageSeq()}</@ofbizUrl>" class="buttontext">${uiLabelMap.CommonClear}</a></td>
+                  </tr>
+              </#list>
+            </table>
+          </div>
+      </div>
+    </#if>
+  </#if>
+
+  <#if orderId?has_content>
+    <script language="javascript">
+      document.singlePackForm.productId.focus();
+    </script>
+  <#else>
+    <script language="javascript">
+      document.selectOrderForm.orderId.focus();
+    </script>
+  </#if>
+  </div>
+  </div>
 <#else>
-    <h3>${uiLabelMap.ProductFacilityViewPermissionError}</h3>
+  <h3>${uiLabelMap.ProductFacilityViewPermissionError}</h3>
 </#if>
\ No newline at end of file