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 2007/01/16 18:21:15 UTC

svn commit: r496780 - in /ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing: PackingEvent.java PackingServices.java PackingSession.java PackingSessionLine.java

Author: jaz
Date: Tue Jan 16 09:21:14 2007
New Revision: 496780

URL: http://svn.apache.org/viewvc?view=rev&rev=496780
Log:
updated packing code used in production by several clients; just now getting back into the project

Modified:
    ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingEvent.java
    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/src/org/ofbiz/shipment/packing/PackingSessionLine.java

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingEvent.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingEvent.java?view=diff&rev=496780&r1=496779&r2=496780
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingEvent.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingEvent.java Tue Jan 16 09:21:14 2007
@@ -1,13 +1,12 @@
 /*
+ * Copyright 2001-2007 The Apache Software Foundation
  *
- * Copyright 2001-2006 The Apache Software Foundation
- * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the

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?view=diff&rev=496780&r1=496779&r2=496780
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingServices.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingServices.java Tue Jan 16 09:21:14 2007
@@ -1,13 +1,12 @@
 /*
+ * Copyright 2001-2007 The Apache Software Foundation
  *
- * Copyright 2001-2006 The Apache Software Foundation
- * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -41,6 +40,10 @@
         String instructions = (String) context.get("handlingInstructions");
         session.setHandlingInstructions(instructions);
 
+        // set the picker party id -- will clear out previous if now null
+        String pickerPartyId = (String) context.get("pickerPartyId");
+        session.setPickerPartyId(pickerPartyId);
+
         if (quantity == null) {
             quantity = new Double(1);
         }
@@ -48,7 +51,7 @@
         Debug.log("Pack input [" + productId + "] @ [" + quantity + "]", module);
         
         try {
-            session.addOrIncreaseLine(orderId, null, shipGroupSeqId, productId, quantity.doubleValue(), packageSeq.intValue());
+            session.addOrIncreaseLine(orderId, null, shipGroupSeqId, productId, quantity.doubleValue(), packageSeq.intValue(), false);
         } catch (GeneralException e) {
             Debug.logError(e, module);
             return ServiceUtil.returnError(e.getMessage());
@@ -61,42 +64,86 @@
         PackingSession session = (PackingSession) context.get("packingSession");
         String orderId = (String) context.get("orderId");
         String shipGroupSeqId = (String) context.get("shipGroupSeqId");
+        Boolean updateQuantity = (Boolean) context.get("updateQuantity");
+        if (updateQuantity == null) {
+            updateQuantity = Boolean.FALSE;
+        }
 
         // set the instructions -- will clear out previous if now null
         String instructions = (String) context.get("handlingInstructions");
         session.setHandlingInstructions(instructions);
 
+        // set the picker party id -- will clear out previous if now null
+        String pickerPartyId = (String) context.get("pickerPartyId");
+        session.setPickerPartyId(pickerPartyId);
+
+        Map selInfo = (Map) context.get("selInfo");
         Map prdInfo = (Map) context.get("prdInfo");
         Map qtyInfo = (Map) context.get("qtyInfo");
         Map pkgInfo = (Map) context.get("pkgInfo");
-        Map selInfo = (Map) context.get("selInfo");
+
         if (selInfo != null) {
             Iterator i = selInfo.keySet().iterator();
             while (i.hasNext()) {
                 String orderItemSeqId = (String) i.next();
-                String qtyStr = (String) qtyInfo.get(orderItemSeqId);
-                String pkgStr = (String) pkgInfo.get(orderItemSeqId);
                 String prdStr = (String) prdInfo.get(orderItemSeqId);
                 if (UtilValidate.isEmpty(prdStr)) {
                     // set the productId to null if empty
                     prdStr = null;
                 }
+
+                // base package/quantity strings
+                String pkgStr = (String) pkgInfo.get(orderItemSeqId);
+                String qtyStr = (String) qtyInfo.get(orderItemSeqId);
+
                 Debug.log("Item: " + orderItemSeqId + " / Product: " + prdStr + " / Quantity: " + qtyStr + " /  Package: " + pkgStr, module);
 
-                double quantity = 0;
-                int packageSeq = 0;
-                try {
-                    quantity = Double.parseDouble(qtyStr);
-                    packageSeq = Integer.parseInt(pkgStr);
-                } catch (Exception e) {
-                    return ServiceUtil.returnError(e.getMessage());
+                // array place holders
+                String[] quantities;
+                String[] packages;
+
+                // process the package array
+                if (pkgStr.indexOf(",") != -1) {
+                    // this is a multi-box update
+                    packages = pkgStr.split(",");
+                } else {
+                    packages = new String[] { pkgStr };
+                }
+
+                // check to make sure there is at least one package
+                if (packages == null || packages.length == 0) {
+                    return ServiceUtil.returnError("No packages defined for processing.");
+                }
+
+                // process the quantity array
+                if (qtyStr == null) {
+                    quantities = new String[packages.length];
+                    for (int p = 0; p < packages.length; p++) {
+                        quantities[p] = (String) qtyInfo.get(orderItemSeqId + ":" + packages[p]);
+                    }
+                    if (quantities.length != packages.length) {
+                        return ServiceUtil.returnError("Packages and quantities do not match.");
+                    }
+                } else {
+                    quantities = new String[] { qtyStr };
                 }
 
-                try {
-                    session.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, prdStr, quantity, packageSeq);
-                } catch (GeneralException e) {
-                    Debug.logError(e, module);
-                    return ServiceUtil.returnError(e.getMessage());
+                for (int p = 0; p < packages.length; p++) {
+                    double quantity;
+                    int packageSeq;
+                    try {
+                        quantity = Double.parseDouble(quantities[p]);
+                        packageSeq = Integer.parseInt(packages[p]);
+                    } catch (Exception e) {
+                        return ServiceUtil.returnError(e.getMessage());
+                    }
+
+                    try {
+                        session.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, prdStr, quantity, packageSeq, updateQuantity.booleanValue());
+                    } catch (GeneralException e) {
+                        Debug.logError(e, module);
+                        return ServiceUtil.returnError(e.getMessage());
+                    }
                 }
             }
         }
@@ -112,6 +159,14 @@
         return result;
     }
 
+    public static Map clearLastPackage(DispatchContext dctx, Map context) {
+        PackingSession session = (PackingSession) context.get("packingSession");
+        int nextSeq = session.clearLastPackage();
+        Map result = ServiceUtil.returnSuccess();
+        result.put("nextPackageSeq", new Integer(nextSeq));
+        return result;
+    }
+
     public static Map clearPackLine(DispatchContext dctx, Map context) {
         PackingSession session = (PackingSession) context.get("packingSession");
         String orderId = (String) context.get("orderId");
@@ -135,7 +190,7 @@
 
     public static Map clearPackAll(DispatchContext dctx, Map context) {
         PackingSession session = (PackingSession) context.get("packingSession");
-        session.clear();
+        session.clearAllLines();
 
         return ServiceUtil.returnSuccess();
     }
@@ -146,7 +201,9 @@
 
         // set the instructions -- will clear out previous if now null
         String instructions = (String) context.get("handlingInstructions");
+        String pickerPartyId = (String) context.get("pickerPartyId");
         session.setHandlingInstructions(instructions);
+        session.setPickerPartyId(pickerPartyId);
 
         Boolean force = (Boolean) context.get("forceComplete");
         if (force == null) {

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?view=diff&rev=496780&r1=496779&r2=496780
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSession.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSession.java Tue Jan 16 09:21:14 2007
@@ -1,13 +1,12 @@
 /*
+ * Copyright 2001-2007 The Apache Software Foundation
  *
- * Copyright 2001-2006 The Apache Software Foundation
- * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -20,9 +19,11 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import javolution.util.FastMap;
 import javolution.util.FastList;
+import javolution.util.FastSet;
 
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.GeneralException;
@@ -31,6 +32,7 @@
 import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.entity.GenericDelegator;
 import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.GenericEntityException;
 import org.ofbiz.entity.util.EntityUtil;
 import org.ofbiz.service.GenericDispatcher;
 import org.ofbiz.service.GenericServiceException;
@@ -43,10 +45,12 @@
     public static final String module = PackingSession.class.getName();
 
     protected GenericValue userLogin = null;
+    protected String pickerPartyId = null;
     protected String primaryOrderId = null;
     protected String primaryShipGrp = null;
     protected String dispatcherName = null;
     protected String delegatorName = null;
+    protected String picklistBinId = null;
     protected String facilityId = null;
     protected String shipmentId = null;
     protected String instructions = null;
@@ -58,7 +62,7 @@
     private transient GenericDelegator _delegator = null;
     private transient LocalDispatcher _dispatcher = null;
 
-    public PackingSession(LocalDispatcher dispatcher, GenericValue userLogin, String facilityId, String orderId, String shipGrp) {
+    public PackingSession(LocalDispatcher dispatcher, GenericValue userLogin, String facilityId, String binId, String orderId, String shipGrp) {
         this._dispatcher = dispatcher;
         this.dispatcherName = dispatcher.getName();
 
@@ -67,6 +71,7 @@
 
         this.primaryOrderId = orderId;
         this.primaryShipGrp = shipGrp;
+        this.picklistBinId = binId;
         this.userLogin = userLogin;
         this.facilityId = facilityId;
         this.packLines = new ArrayList();
@@ -75,19 +80,24 @@
     }
 
     public PackingSession(LocalDispatcher dispatcher, GenericValue userLogin, String facilityId) {
-        this(dispatcher, userLogin, facilityId, null, null);
+        this(dispatcher, userLogin, facilityId, null, null, null);
     }
 
     public PackingSession(LocalDispatcher dispatcher, GenericValue userLogin) {
-        this(dispatcher, userLogin, null, null, null);
+        this(dispatcher, userLogin, null, null, null, null);
     }
 
-    public void addOrIncreaseLine(String orderId, String orderItemSeqId, String shipGroupSeqId, String productId, double quantity, int packageSeqId) throws GeneralException {
+    public void addOrIncreaseLine(String orderId, String orderItemSeqId, String shipGroupSeqId, String productId, double quantity, int packageSeqId, boolean update) throws GeneralException {
         // reset the session if we just completed
         if (status == 0) {
             throw new GeneralException("Packing session has been completed; be sure to CLEAR before packing a new order! [000]");
         }
 
+        // do nothing if we are trying to add a quantity of 0
+        if (!update && quantity == 0) {
+            return;
+        }
+
         // find the actual product ID
         productId = ProductWorker.findProductId(this.getDelegator(), productId);
 
@@ -117,7 +127,7 @@
         // find the inventoryItemId to use
         if (reservations.size() == 1) {
             GenericValue res = EntityUtil.getFirst(reservations);
-            int checkCode = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, quantity, packageSeqId);
+            int checkCode = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, quantity, packageSeqId, update);
             this.createPackLineItem(checkCode, res, orderId, orderItemSeqId, shipGroupSeqId, productId, quantity, packageSeqId);
         } else {
             // more than one reservation found
@@ -130,7 +140,7 @@
                 double resQty = res.getDouble("quantity").doubleValue();
                 double thisQty = resQty > qtyRemain ? qtyRemain : resQty;
 
-                int thisCheck = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, thisQty, packageSeqId);
+                int thisCheck = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, thisQty, packageSeqId, update);
                 switch (thisCheck) {
                     case 2:
                         Debug.log("Packing check returned '2' - new pack line will be created!", module);
@@ -164,11 +174,11 @@
     }
 
     public void addOrIncreaseLine(String orderId, String orderItemSeqId, String shipGroupSeqId, double quantity, int packageSeqId) throws GeneralException {
-        this.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, null, quantity, packageSeqId);
+        this.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, null, quantity, packageSeqId, false);
     }
 
     public void addOrIncreaseLine(String productId, double quantity, int packageSeqId) throws GeneralException {
-        this.addOrIncreaseLine(null, null, null, productId, quantity, packageSeqId);
+        this.addOrIncreaseLine(null, null, null, productId, quantity, packageSeqId, false);
     }
 
     public PackingSessionLine findLine(String orderId, String orderItemSeqId, String shipGroupSeqId, String inventoryItemId, int packageSeq) {
@@ -213,6 +223,7 @@
         Map lookupMap = FastMap.newInstance();
         lookupMap.put("orderId", orderId);
         lookupMap.put("productId", productId);
+        lookupMap.put("statusId", "ITEM_APPROVED");
         lookupMap.put("shipGroupSeqId", shipGroupSeqId);
 
         List sort = UtilMisc.toList("-quantity");
@@ -223,10 +234,21 @@
             Iterator i = orderItems.iterator();
             while (i.hasNext()) {
                 GenericValue item = (GenericValue) i.next();
-                Double qty = item.getDouble("quantity");
-                if (quantity <= qty.doubleValue()) {
-                    orderItemSeqId = item.getString("orderItemSeqId");
-                    break;
+
+                // get the reservations for the item
+                Map invLookup = FastMap.newInstance();
+                invLookup.put("orderId", orderId);
+                invLookup.put("orderItemSeqId", item.getString("orderItemSeqId"));
+                invLookup.put("shipGroupSeqId", shipGroupSeqId);
+                List reservations = this.getDelegator().findByAnd("OrderItemShipGrpInvRes", invLookup);
+                Iterator resIter = reservations.iterator();
+                while (resIter.hasNext()) {
+                    GenericValue res = (GenericValue) resIter.next();
+                    Double qty = res.getDouble("quantity");
+                    if (quantity <= qty.doubleValue()) {
+                        orderItemSeqId = item.getString("orderItemSeqId");
+                        break;
+                    }
                 }
             }
         }
@@ -238,23 +260,29 @@
         }
     }
 
-    protected int checkLineForAdd(GenericValue res, String orderId, String orderItemSeqId, String shipGroupSeqId, double quantity, int packageSeqId) {
+    protected int checkLineForAdd(GenericValue res, String orderId, String orderItemSeqId, String shipGroupSeqId, double quantity, int packageSeqId, boolean update) {
         // check to see if the reservation can hold the requested quantity amount
         String invItemId = res.getString("inventoryItemId");
         double resQty = res.getDouble("quantity").doubleValue();
 
         PackingSessionLine line = this.findLine(orderId, orderItemSeqId, shipGroupSeqId, invItemId, packageSeqId);
+        double packedQty = this.getPackedQuantity(orderId, orderItemSeqId, shipGroupSeqId);
+
+        Debug.log("Packed quantity [" + packedQty + "] + [" + quantity + "]", module);
+
         if (line == null) {
-            Debug.log("No current line found testing [" + invItemId + "] R: " + resQty + " / Q: " + quantity, module);
-            if (resQty < quantity) {
+            double checkQty = packedQty + quantity;
+            Debug.log("No current line found testing [" + invItemId + "] R: " + resQty + " / Q: " + checkQty, module);
+            if (resQty < checkQty) {
                 return 0;
             } else {
                 return 2;
             }
         } else {
-            double newQty = line.getQuantity() + quantity;
+            double checkQty = update ? ((packedQty - line.getQuantity()) + quantity) : packedQty + quantity;
+            double newQty = update ? quantity : (line.getQuantity() + quantity);            
             Debug.log("Existing line found testing [" + invItemId + "] R: " + resQty + " / Q: " + newQty, module);
-            if (resQty < newQty) {
+            if (resQty < checkQty) {
                 return 0;
             } else {
                 line.setQuantity(newQty);
@@ -280,6 +308,14 @@
     }
 
     public double getPackedQuantity(String orderId, String orderItemSeqId, String shipGroupSeqId) {
+        return getPackedQuantity(orderId, orderItemSeqId, shipGroupSeqId, null, -1);
+    }
+
+    public double getPackedQuantity(String orderId, String orderItemSeqId, String shipGroupSeqId, int packageSeq) {
+        return getPackedQuantity(orderId, orderItemSeqId, shipGroupSeqId, null, packageSeq);
+    }
+
+    public double getPackedQuantity(String orderId, String orderItemSeqId, String shipGroupSeqId, String inventoryItemId, int packageSeq) {
         double total = 0.0;
         List lines = this.getLines();
         Iterator i = lines.iterator();
@@ -287,12 +323,119 @@
             PackingSessionLine line = (PackingSessionLine) i.next();
             if (orderId.equals(line.getOrderId()) && orderItemSeqId.equals(line.getOrderItemSeqId()) &&
                     shipGroupSeqId.equals(line.getShipGroupSeqId())) {
+                if (inventoryItemId == null || inventoryItemId.equals(line.getInventoryItemId())) {
+                    if (packageSeq == -1 || packageSeq == line.getPackageSeq()) {
+                        total += line.getQuantity();
+                    }
+                }
+            }
+        }
+        return total;
+    }
+
+    public double getPackedQuantity(String productId, int packageSeq) {
+        if (productId != null) {
+            try {
+                productId = ProductWorker.findProductId(this.getDelegator(), productId);
+            } catch (GenericEntityException e) {
+                Debug.logError(e, module);
+            }
+        }
+
+        double total = 0.0;
+        if (productId != null ) {
+            List lines = this.getLines();
+            Iterator i = lines.iterator();
+            while (i.hasNext()) {
+                PackingSessionLine line = (PackingSessionLine) i.next();
+                if (productId.equals(line.getProductId())) {
+                    if (packageSeq == -1 || packageSeq == line.getPackageSeq()) {
+                        total += line.getQuantity();
+                    }
+                }
+            }
+        }
+        return total;
+    }
+
+    public double getPackedQuantity(int packageSeq) {
+        double total = 0.0;
+        List lines = this.getLines();
+        Iterator i = lines.iterator();
+        while (i.hasNext()) {
+            PackingSessionLine line = (PackingSessionLine) i.next();
+            if (packageSeq == -1 || packageSeq == line.getPackageSeq()) {
                 total += line.getQuantity();
             }
         }
         return total;
     }
 
+    public double getPackedQuantity(String productId) {
+        return getPackedQuantity(productId, -1);
+    }
+
+    public double getCurrentReservedQuantity(String orderId, String orderItemSeqId, String shipGroupSeqId) {
+        double reserved = -1;
+        List res = null;
+        try {
+            res = this.getDelegator().findByAnd("OrderItemShipGrpInvRes", UtilMisc.toMap("orderId", orderId,
+                    "orderItemSeqId", orderItemSeqId, "shipGroupSeqId", shipGroupSeqId));
+        } catch (GenericEntityException e) {
+            Debug.logError(e, module);
+        }
+
+        if (res != null) {
+            reserved = 0.0;
+            Iterator i = res.iterator();
+            while (i.hasNext()) {
+                GenericValue v = (GenericValue) i.next();
+                Double qty = v.getDouble("quantity");
+                if (qty == null) qty = new Double(0);
+                reserved += qty.doubleValue();
+            }
+        }
+
+        return reserved;
+    }
+
+    public double getCurrentShippedQuantity(String orderId, String orderItemSeqId, String shipGroupSeqId) {
+        double shipped = 0.0;
+        List issues = this.getItemIssuances(orderId, orderItemSeqId, shipGroupSeqId);
+        if (issues != null) {
+            Iterator i = issues.iterator();
+            while (i.hasNext()) {
+                GenericValue v = (GenericValue) i.next();
+                Double qty = v.getDouble("quantity");
+                if (qty == null) qty = new Double(0);
+                shipped += qty.doubleValue();
+            }
+        }
+
+        return shipped;
+    }
+
+    public List getCurrentShipmentIds(String orderId, String orderItemSeqId, String shipGroupSeqId) {
+        Set shipmentIds = FastSet.newInstance();
+        List issues = this.getItemIssuances(orderId, orderItemSeqId, shipGroupSeqId);
+
+        if (issues != null) {
+            Iterator i = issues.iterator();
+            while (i.hasNext()) {
+                GenericValue v = (GenericValue) i.next();
+                shipmentIds.add(v.getString("shipmentId"));
+            }
+        }
+
+        List retList = FastList.newInstance();
+        retList.addAll(shipmentIds);
+        return retList;
+    }
+
+    public List getCurrentShipmentIds(String orderId, String shipGroupSeqId) {
+        return this.getCurrentShipmentIds(orderId, null, shipGroupSeqId);
+    }
+
     public void registerEvent(PackingEvent event) {
         this.packEvents.add(event);
         this.runEvents(PackingEvent.EVENT_CODE_EREG);
@@ -348,6 +491,14 @@
         this.primaryShipGrp = shipGroupSeqId;
     }
 
+    public void setPicklistBinId(String binId) {
+        this.picklistBinId = binId;
+    }
+
+    public String getPicklistBinId() {
+        return this.picklistBinId;
+    }
+
     public String getHandlingInstructions() {
         return this.instructions;
     }
@@ -356,13 +507,44 @@
         this.instructions = instructions;
     }
 
+    public void setPickerPartyId(String partyId) {
+        this.pickerPartyId = partyId;
+    }
+
+    public String getPickerPartyId() {
+        return this.pickerPartyId;
+    }
+
+    public int clearLastPackage() {
+        if (packageSeq == 1) {
+            this.clear();
+            return packageSeq;
+        }
+        
+        List currentLines = new ArrayList(this.packLines);
+        Iterator i = currentLines.iterator();
+        while (i.hasNext()) {
+            PackingSessionLine line = (PackingSessionLine) i.next();
+            if (line.getPackageSeq() == packageSeq) {
+                this.clearLine(line);
+            }
+        }
+        return --packageSeq;
+    }
+
     public void clearLine(PackingSessionLine line) {
         this.packLines.remove(line);
     }
 
+    public void clearAllLines() {
+        this.packLines.clear();
+    }
+
     public void clear() {
         this.packLines.clear();
         this.instructions = null;
+        this.pickerPartyId = null;
+        this.picklistBinId = null;
         this.primaryOrderId = null;
         this.primaryShipGrp = null;
         this.packageSeq = 1;
@@ -371,6 +553,10 @@
     }
 
     public String complete(boolean force) throws GeneralException {
+        // clear out empty lines
+        // this.checkEmptyLines(); // removing, this seems to be causeing issues -  mja
+
+        // check to see if there is anything to process
         if (this.getLines().size() == 0) {
             return "EMPTY";
         }
@@ -389,6 +575,8 @@
         this.applyItemsToPackages();
         // set the shipment to packed
         this.setShipmentToPacked();
+        // set role on picklist
+        this.setPickerOnPicklist();
         // run the complete events
         this.runEvents(PackingEvent.EVENT_CODE_COMPLETE);
 
@@ -400,32 +588,35 @@
         Iterator i = this.getLines().iterator();
         while (i.hasNext()) {
             PackingSessionLine line = (PackingSessionLine) i.next();
-            Map invLookup = FastMap.newInstance();
-            invLookup.put("orderId", line.getOrderId());
-            invLookup.put("orderItemSeqId", line.getOrderItemSeqId());
-            invLookup.put("shipGroupSeqId", line.getShipGroupSeqId());
-            invLookup.put("inventoryItemId", line.getInventoryItemId());
-            GenericValue res = this.getDelegator().findByPrimaryKey("OrderItemShipGrpInvRes", invLookup);
-            Double qty = res.getDouble("quantity");
-            if (qty == null) qty = new Double(0);
-
-            double resQty = qty.doubleValue();
-            double lineQty = line.getQuantity();
+            double reservedQty =  this.getCurrentReservedQuantity(line.getOrderId(), line.getOrderItemSeqId(), line.getShipGroupSeqId());
+            double packedQty = this.getPackedQuantity(line.getOrderId(), line.getOrderItemSeqId(), line.getShipGroupSeqId());
 
-            if (lineQty != resQty) {
-                errors.add("Packed amount does not match reserved amount for item (" + line.getProductId() + ") [" + lineQty + " / " + resQty + "]");
+            if (packedQty != reservedQty) {
+                errors.add("Packed amount does not match reserved amount for item (" + line.getProductId() + ") [" + packedQty + " / " + reservedQty + "]");
             }
         }
 
         if (errors.size() > 0) {
             if (!ignore) {
-                throw new GeneralException("Attempt to pack order failed. Click COMPLETE again to force.", errors);
+                throw new GeneralException("Attempt to pack order failed.", errors);
             } else {
                 Debug.logWarning("Packing warnings: " + errors, module);
             }
         }
     }
 
+    protected void checkEmptyLines() throws GeneralException {
+        List lines = FastList.newInstance();
+        lines.addAll(this.getLines());
+        Iterator i = lines.iterator();
+        while (i.hasNext()) {
+            PackingSessionLine l = (PackingSessionLine) i.next();
+            if (l.getQuantity() == 0) {
+                this.packLines.remove(l);
+            }
+        }
+    }
+
     protected void runEvents(int eventCode) {
         if (this.packEvents.size() > 0) {
             Iterator i = this.packEvents.iterator();
@@ -436,6 +627,29 @@
         }
     }
 
+    protected List getItemIssuances(String orderId, String orderItemSeqId, String shipGroupSeqId) {
+        List issues = null;
+        if (orderId == null) {
+            throw new IllegalArgumentException("Value for orderId is  null");
+        }
+
+        Map lookupMap = FastMap.newInstance();
+        lookupMap.put("orderId", orderId);
+        if (UtilValidate.isNotEmpty(orderItemSeqId)) {
+            lookupMap.put("orderItemSeqId", orderItemSeqId);
+        }
+        if (UtilValidate.isNotEmpty(shipGroupSeqId)) {
+            lookupMap.put("shipGroupSeqId", shipGroupSeqId);
+        }
+        try {
+            issues = this.getDelegator().findByAnd("ItemIssuance",  lookupMap);
+        } catch (GenericEntityException e) {
+            Debug.logError(e, module);
+        }
+
+        return issues;
+    }
+
     protected void createShipment() throws GeneralException {
         // first create the shipment
         Map newShipment = FastMap.newInstance();
@@ -445,6 +659,7 @@
         newShipment.put("shipmentTypeId", "OUTGOING_SHIPMENT");
         newShipment.put("statusId", "SHIPMENT_INPUT");
         newShipment.put("handlingInstructions", instructions);
+        newShipment.put("picklistBinId", picklistBinId);
         newShipment.put("userLogin", userLogin);
         Debug.log("Creating new shipment with context: " + newShipment, module);
         Map newShipResp = this.getDispatcher().runSync("createShipment", newShipment);
@@ -456,14 +671,34 @@
     }
 
     protected void issueItemsToShipment() throws GeneralException {
+        List processedLines = FastList.newInstance();
         List lines = this.getLines();
         Iterator i = lines.iterator();
         while (i.hasNext()) {
             PackingSessionLine line = (PackingSessionLine) i.next();
-            line.issueItemToShipment(shipmentId, userLogin, getDispatcher());
+            if (this.checkLine(processedLines, line)) {
+                double totalPacked = this.getPackedQuantity(line.getOrderId(),  line.getOrderItemSeqId(),
+                        line.getShipGroupSeqId(), line.getInventoryItemId(), -1);
+
+                line.issueItemToShipment(shipmentId, picklistBinId, userLogin, new Double(totalPacked), getDispatcher());
+                processedLines.add(line);
+            }
         }
     }
 
+    protected boolean checkLine(List processedLines, PackingSessionLine line) {
+        Iterator i = processedLines.iterator();
+        while (i.hasNext()) {
+            PackingSessionLine l = (PackingSessionLine) i.next();
+            if (line.isSameItem(l)) {
+                line.setShipmentItemSeqId(l.getShipmentItemSeqId());
+                return false;
+            }
+        }
+
+        return true;
+    }
+    
     protected void createPackages() throws GeneralException {
         for (int i = 0; i < packageSeq; i++) {
             String shipmentPackageSeqId = UtilFormatOut.formatPaddedNumber(i+1, 5);
@@ -495,6 +730,32 @@
         Map packedResp = this.getDispatcher().runSync("updateShipment", packedCtx);
         if (packedResp != null && ServiceUtil.isError(packedResp)) {
             throw new GeneralException(ServiceUtil.getErrorMessage(packedResp));
+        }
+    }
+
+    protected void setPickerOnPicklist() throws GeneralException {
+        if (picklistBinId != null) {
+            // first find the picklist id
+            GenericValue bin = this.getDelegator().findByPrimaryKey("PicklistBin", UtilMisc.toMap("picklistBinId", picklistBinId));
+            if (bin != null) {
+                Map ctx = FastMap.newInstance();
+                ctx.put("picklistId", bin.getString("picklistId"));
+                ctx.put("partyId", pickerPartyId);
+                ctx.put("roleTypeId", "PICKER");
+
+                // check if the role already exists and is valid
+                List currentRoles = this.getDelegator().findByAnd("PicklistRole", ctx);
+                currentRoles = EntityUtil.filterByDate(currentRoles);
+
+                // if not; create the role
+                if (currentRoles != null && currentRoles.size() > 0) {
+                    ctx.put("userLogin", userLogin);
+                    Map addRole = this.getDispatcher().runSync("createPicklistRole", ctx);
+                    if (ServiceUtil.isError(addRole)) {
+                        throw new GeneralException(ServiceUtil.getErrorMessage(addRole));
+                    }
+                }
+            }
         }
     }
 }

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSessionLine.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSessionLine.java?view=diff&rev=496780&r1=496779&r2=496780
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSessionLine.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/shipment/packing/PackingSessionLine.java Tue Jan 16 09:21:14 2007
@@ -1,30 +1,31 @@
 /*
+ * Copyright 2001-2007 The Apache Software Foundation
  *
- * Copyright 2001-2006 The Apache Software Foundation
- * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  * use this file except in compliance with the License. You may obtain a copy of
  * the License at
- * 
+ *
  * http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  * License for the specific language governing permissions and limitations
  * under the License.
  */
-
 package org.ofbiz.shipment.packing;
 
 import java.util.Map;
 
-import org.ofbiz.service.LocalDispatcher;
-import org.ofbiz.service.ServiceUtil;
-import org.ofbiz.entity.GenericValue;
+import javolution.util.FastMap;
+
 import org.ofbiz.base.util.GeneralException;
 import org.ofbiz.base.util.UtilFormatOut;
-import javolution.util.FastMap;
+import org.ofbiz.base.util.Debug;
+import org.ofbiz.entity.GenericValue;
+import org.ofbiz.entity.GenericDelegator;
+import org.ofbiz.service.LocalDispatcher;
+import org.ofbiz.service.ServiceUtil;
 
 public class PackingSessionLine implements java.io.Serializable {
 
@@ -93,14 +94,31 @@
         return this.packageSeq;
     }
 
-    protected void issueItemToShipment(String shipmentId, GenericValue userLogin, LocalDispatcher dispatcher) throws GeneralException {
+    public boolean isSameItem(PackingSessionLine line) {
+        if (this.getInventoryItemId().equals(line.getInventoryItemId())) {
+            if (this.getOrderItemSeqId().equals(line.getOrderItemSeqId())) {
+                if (this.getOrderId().equals(line.getOrderId())) {
+                    if (this.getShipGroupSeqId().equals(line.getShipGroupSeqId())) {
+                        return true;
+                    }
+                }
+            }
+        }
+        return false;
+    }
+
+    protected void issueItemToShipment(String shipmentId, String picklistBinId, GenericValue userLogin, Double quantity, LocalDispatcher dispatcher) throws GeneralException {
+        if (quantity == null) {
+            quantity = new Double(this.getQuantity());
+        }
+
         Map issueMap = FastMap.newInstance();
         issueMap.put("shipmentId", shipmentId);
         issueMap.put("orderId", this.getOrderId());
         issueMap.put("orderItemSeqId", this.getOrderItemSeqId());
         issueMap.put("shipGroupSeqId", this.getShipGroupSeqId());
         issueMap.put("inventoryItemId", this.getInventoryItemId());
-        issueMap.put("quantity", new Double(this.getQuantity()));
+        issueMap.put("quantity", quantity);
         issueMap.put("userLogin", userLogin);
 
         Map issueResp = dispatcher.runSync("issueOrderItemShipGrpInvResToShipment", issueMap);
@@ -113,6 +131,39 @@
             throw new GeneralException("Issue item did not return a valid shipmentItemSeqId!");
         } else {
             this.setShipmentItemSeqId(shipmentItemSeqId);
+        }
+
+        if (picklistBinId != null) {
+            // find the pick list item
+            Debug.log("Looking up picklist item for bin ID #" + picklistBinId, module);
+            GenericDelegator delegator = dispatcher.getDelegator();
+            Map itemLookup = FastMap.newInstance();
+            itemLookup.put("picklistBinId", picklistBinId);
+            itemLookup.put("orderId", this.getOrderId());
+            itemLookup.put("orderItemSeqId", this.getOrderItemSeqId());
+            itemLookup.put("shipGroupSeqId", this.getShipGroupSeqId());
+            itemLookup.put("inventoryItemId", this.getInventoryItemId());
+            GenericValue plItem = delegator.findByPrimaryKey("PicklistItem", itemLookup);
+            if (plItem != null) {
+                Debug.log("Found picklist bin: " + plItem, module);
+                Double itemQty = plItem.getDouble("quantity");
+                if (itemQty.doubleValue() == quantity.doubleValue()) {
+                    // set to complete
+                    itemLookup.put("itemStatusId", "PICKITEM_COMPLETED");
+                } else {
+                    itemLookup.put("itemStatusId", "PICKITEM_CANCELLED");
+                }
+                itemLookup.put("userLogin", userLogin);
+
+                Map itemUpdateResp = dispatcher.runSync("updatePicklistItem", itemLookup);
+                if (ServiceUtil.isError(itemUpdateResp)) {
+                    throw new GeneralException(ServiceUtil.getErrorMessage(issueResp));
+                }
+            } else {
+                Debug.log("No item was found for lookup: " + itemLookup, module);
+            }
+        } else {
+            Debug.logWarning("*** NO Picklist Bin ID set; cannot update picklist status!", module);
         }
     }