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

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

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

jleroux@apache.org
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);
     }