You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by gs...@apache.org on 2022/04/16 22:58:59 UTC

[ofbiz-framework] branch trunk updated: Fixed: ecomm. listing ProductFacility out of stock issue (OFBIZ-12359)

This is an automated email from the ASF dual-hosted git repository.

gsperi pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


The following commit(s) were added to refs/heads/trunk by this push:
     new bbc9e2fe9b Fixed: ecomm. listing ProductFacility out of stock issue (OFBIZ-12359)
bbc9e2fe9b is described below

commit bbc9e2fe9be4bc2718a4e2b6cc6292c9deab282c
Author: Giulio Speri <gi...@mpstyle.it>
AuthorDate: Sun Apr 17 00:57:46 2022 +0200

    Fixed: ecomm. listing ProductFacility out of stock issue (OFBIZ-12359)
    
    In method filterOutOfStockProducts added case for "virtual" products.
    In case a product isVirtual (= Y), then the available inventory count
    (lastInventoryCount) is summed up on all its product variants, across
    all the ProductFacility records, and then used to determine if the
    (parent/virtual) product is in stock or out of stock.
    
    This fix does not check if the facilityId of the ProductFacility
    records retrieved is associated and enabled to the ProductStore.
    
    Thanks Nicola Mazzoni for helping in anlyzing this issue.
---
 .../ofbiz/product/product/ProductWorker.java       | 54 ++++++++++++++++++----
 1 file changed, 45 insertions(+), 9 deletions(-)

diff --git a/applications/product/src/main/java/org/apache/ofbiz/product/product/ProductWorker.java b/applications/product/src/main/java/org/apache/ofbiz/product/product/ProductWorker.java
index 36d3a441d1..52e8c72a88 100644
--- a/applications/product/src/main/java/org/apache/ofbiz/product/product/ProductWorker.java
+++ b/applications/product/src/main/java/org/apache/ofbiz/product/product/ProductWorker.java
@@ -34,6 +34,7 @@ import java.util.Set;
 import org.apache.ofbiz.base.util.Debug;
 import org.apache.ofbiz.base.util.GeneralException;
 import org.apache.ofbiz.base.util.UtilDateTime;
+import org.apache.ofbiz.base.util.UtilGenerics;
 import org.apache.ofbiz.base.util.UtilMisc;
 import org.apache.ofbiz.base.util.UtilValidate;
 import org.apache.ofbiz.common.geo.GeoWorker;
@@ -50,6 +51,7 @@ import org.apache.ofbiz.product.config.ProductConfigWrapper.ConfigOption;
 import org.apache.ofbiz.service.GenericServiceException;
 import org.apache.ofbiz.service.LocalDispatcher;
 import org.apache.ofbiz.service.ModelService;
+import org.apache.ofbiz.service.ServiceUtil;
 
 /**
  * Product Worker class to reduce code in JSPs.
@@ -1317,17 +1319,51 @@ public final class ProductWorker {
                         productsInStock.add(genericRecord);
                     }
                 } else {
-                    List<GenericValue> facilities = EntityQuery.use(delegator).from("ProductFacility").where("productId", productId).queryList();
-                    BigDecimal availableInventory = BigDecimal.ZERO;
-                    if (UtilValidate.isNotEmpty(facilities)) {
-                        for (GenericValue facility : facilities) {
-                            BigDecimal lastInventoryCount = facility.getBigDecimal("lastInventoryCount");
-                            if (lastInventoryCount != null) {
-                                availableInventory = lastInventoryCount.add(availableInventory);
+                    if ("Y".equals(product.getString("isVirtual"))) {
+                        BigDecimal availableInventory = BigDecimal.ZERO;
+                        try {
+                            Map<String, Object> variantResultOutput = dispatcher.runSync("getAllProductVariants",
+                                    UtilMisc.toMap("productId", productId));
+                            if (ServiceUtil.isError(variantResultOutput)) {
+                                Debug.logError("Error in retrieving all product variants for productId " + productId
+                                        + " Skip this product. Error is : " + ServiceUtil.getErrorMessage(variantResultOutput), MODULE);
+                                continue;
                             }
+                            List<GenericValue> productVariants = UtilGenerics.cast(variantResultOutput.get("assocProducts"));
+                            for (GenericValue productVariant : productVariants) {
+                                List<GenericValue> facilities = EntityQuery.use(delegator)
+                                        .from("ProductFacility")
+                                        .where("productId", productVariant.getString("productIdTo"))
+                                        .queryList();
+                                if (UtilValidate.isNotEmpty(facilities)) {
+                                    for (GenericValue facility : facilities) {
+                                        BigDecimal lastInventoryCount = facility.getBigDecimal("lastInventoryCount");
+                                        if (lastInventoryCount != null) {
+                                            availableInventory = lastInventoryCount.add(availableInventory);
+                                        }
+                                    }
+                                }
+                            }
+                            if (availableInventory.compareTo(BigDecimal.ZERO) > 0) {
+                                productsInStock.add(genericRecord);
+                            }
+                        } catch (GenericServiceException e) {
+                            Debug.logError(e, "Error getting all product variants for productId " + productId
+                                    + ", while filtering out of stock products.", MODULE);
                         }
-                        if (availableInventory.compareTo(BigDecimal.ZERO) > 0) {
-                            productsInStock.add(genericRecord);
+                    } else {
+                        BigDecimal availableInventory = BigDecimal.ZERO;
+                        List<GenericValue> facilities = EntityQuery.use(delegator).from("ProductFacility").where("productId", productId).queryList();
+                        if (UtilValidate.isNotEmpty(facilities)) {
+                            for (GenericValue facility : facilities) {
+                                BigDecimal lastInventoryCount = facility.getBigDecimal("lastInventoryCount");
+                                if (lastInventoryCount != null) {
+                                    availableInventory = lastInventoryCount.add(availableInventory);
+                                }
+                            }
+                            if (availableInventory.compareTo(BigDecimal.ZERO) > 0) {
+                                productsInStock.add(genericRecord);
+                            }
                         }
                     }
                 }