You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jl...@apache.org on 2019/01/12 12:52:44 UTC

svn commit: r1851163 - in /ofbiz/ofbiz-framework/branches/release18.12: ./ applications/product/src/main/java/org/apache/ofbiz/shipment/packing/PackingSession.java

Author: jleroux
Date: Sat Jan 12 12:52:44 2019
New Revision: 1851163

URL: http://svn.apache.org/viewvc?rev=1851163&view=rev
Log:
"Applied fix from trunk for revision: 1850914" 
------------------------------------------------------------------------
r1850914 | paulfoxworthy | 2019-01-10 04:32:33 +0100 (jeu. 10 janv. 2019) | 7 lignes

Fixed: In packing, only use reservations with stock on hand
(OFBIZ-9677)

During packing, OFBiz looks for reservations (OrderItemShipGrpInvRes)
for the order item. Some reservations are for back ordered items not on hand.
These reservations should not be used during packing, but they are.

------------------------------------------------------------------------

Modified:
    ofbiz/ofbiz-framework/branches/release18.12/   (props changed)
    ofbiz/ofbiz-framework/branches/release18.12/applications/product/src/main/java/org/apache/ofbiz/shipment/packing/PackingSession.java

Propchange: ofbiz/ofbiz-framework/branches/release18.12/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sat Jan 12 12:52:44 2019
@@ -10,4 +10,4 @@
 /ofbiz/branches/json-integration-refactoring:1634077-1635900
 /ofbiz/branches/multitenant20100310:921280-927264
 /ofbiz/branches/release13.07:1547657
-/ofbiz/ofbiz-framework/trunk:1850015,1850023,1850530,1850647,1850685,1850694,1850711,1850918,1850921,1850948,1850953,1851006,1851013,1851068,1851074,1851130,1851158
+/ofbiz/ofbiz-framework/trunk:1850015,1850023,1850530,1850647,1850685,1850694,1850711,1850914,1850918,1850921,1850948,1850953,1851006,1851013,1851068,1851074,1851130,1851158

Modified: ofbiz/ofbiz-framework/branches/release18.12/applications/product/src/main/java/org/apache/ofbiz/shipment/packing/PackingSession.java
URL: http://svn.apache.org/viewvc/ofbiz/ofbiz-framework/branches/release18.12/applications/product/src/main/java/org/apache/ofbiz/shipment/packing/PackingSession.java?rev=1851163&r1=1851162&r2=1851163&view=diff
==============================================================================
--- ofbiz/ofbiz-framework/branches/release18.12/applications/product/src/main/java/org/apache/ofbiz/shipment/packing/PackingSession.java (original)
+++ ofbiz/ofbiz-framework/branches/release18.12/applications/product/src/main/java/org/apache/ofbiz/shipment/packing/PackingSession.java Sat Jan 12 12:52:44 2019
@@ -144,8 +144,12 @@ public class PackingSession implements j
         // find the inventoryItemId to use
         if (reservations.size() == 1) {
             GenericValue res = EntityUtil.getFirst(reservations);
-            int checkCode = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, productId, quantity, packageSeqId, update);
-            this.createPackLineItem(checkCode, res, orderId, orderItemSeqId, shipGroupSeqId, productId, quantity, weight, packageSeqId);
+            BigDecimal resQty = numAvailableItems(res);
+
+            if (resQty.compareTo(quantity) > 0) {
+                int checkCode = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, productId, quantity, packageSeqId, update);
+                this.createPackLineItem(checkCode, res, orderId, orderItemSeqId, shipGroupSeqId, productId, quantity, weight, packageSeqId);
+            }
         } else {
             // more than one reservation found
             Map<GenericValue, BigDecimal> toCreateMap = new HashMap<GenericValue, BigDecimal>();
@@ -160,33 +164,36 @@ public class PackingSession implements j
                     continue;
                 }
 
-                BigDecimal resQty = res.getBigDecimal("quantity");
-                BigDecimal resPackedQty = this.getPackedQuantity(orderId, orderItemSeqId, shipGroupSeqId, productId, res.getString("inventoryItemId"), -1);
-                if (resPackedQty.compareTo(resQty) >= 0) {
-                    continue;
-                } else if (!update) {
-                    resQty = resQty.subtract(resPackedQty);
-                }
-
-                BigDecimal thisQty = resQty.compareTo(qtyRemain) > 0 ? qtyRemain : resQty;
+                BigDecimal resQty = numAvailableItems(res);
 
-                int thisCheck = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, productId, thisQty, packageSeqId, update);
-                switch (thisCheck) {
-                    case 2:
-                        Debug.logInfo("Packing check returned '2' - new pack line will be created!", module);
-                        toCreateMap.put(res, thisQty);
-                        qtyRemain = qtyRemain.subtract(thisQty);
-                        break;
-                    case 1:
-                        Debug.logInfo("Packing check returned '1' - existing pack line has been updated!", module);
-                        qtyRemain = qtyRemain.subtract(thisQty);
-                        break;
-                    case 0:
-                        Debug.logInfo("Packing check returned '0' - doing nothing.", module);
-                        break;
-                default:
-                    Debug.logInfo("Packing check returned '> 2' or '< 0'", module);
-                    break;
+                if (resQty.compareTo(BigDecimal.ZERO) > 0) {
+                    BigDecimal resPackedQty = this.getPackedQuantity(orderId, orderItemSeqId, shipGroupSeqId, productId, res.getString("inventoryItemId"), -1);
+                    if (resPackedQty.compareTo(resQty) >= 0) {
+                        continue;
+                    } else if (!update) {
+                        resQty = resQty.subtract(resPackedQty);
+                    }
+
+                    BigDecimal thisQty = resQty.compareTo(qtyRemain) > 0 ? qtyRemain : resQty;
+
+                    int thisCheck = this.checkLineForAdd(res, orderId, orderItemSeqId, shipGroupSeqId, productId, thisQty, packageSeqId, update);
+                    switch (thisCheck) {
+                        case 2:
+                            Debug.logInfo("Packing check returned '2' - new pack line will be created!", module);
+                            toCreateMap.put(res, thisQty);
+                            qtyRemain = qtyRemain.subtract(thisQty);
+                            break;
+                        case 1:
+                            Debug.logInfo("Packing check returned '1' - existing pack line has been updated!", module);
+                            qtyRemain = qtyRemain.subtract(thisQty);
+                            break;
+                        case 0:
+                            Debug.logInfo("Packing check returned '0' - doing nothing.", module);
+                            break;
+                        default:
+                            Debug.logInfo("Packing check returned '> 2' or '< 0'", module);
+                            break;
+                    }
                 }
             }
 
@@ -205,6 +212,20 @@ public class PackingSession implements j
         this.runEvents(PackingEvent.EVENT_CODE_ADD);
     }
 
+    private BigDecimal numAvailableItems(GenericValue res) {
+        // In simple situations, the reserved quantity will match the quantity from the order item.
+        // If there is a back order, quantity from order may exceed quantity currently reserved and on hand.
+        // resQty should never exceed the quantity from the order item, because that quantity was the quantity reserved in the first place.
+        BigDecimal notAvailable = res.getBigDecimal("quantityNotAvailable");
+        BigDecimal resQty = res.getBigDecimal("quantity");
+
+        if (notAvailable != null) {
+            resQty = resQty.subtract(notAvailable);
+        }
+
+        return resQty;
+    }
+
     public void addOrIncreaseLine(String orderId, String orderItemSeqId, String shipGroupSeqId, BigDecimal quantity, int packageSeqId) throws GeneralException {
         this.addOrIncreaseLine(orderId, orderItemSeqId, shipGroupSeqId, null, quantity, packageSeqId, BigDecimal.ZERO, false);
     }