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/17 21:10:05 UTC

[ofbiz-framework] branch release18.12 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 release18.12
in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git


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

commit c0511d01cb6efd77aab0e7ab79cdeffb5d0a6feb
Author: Giulio Speri <gi...@mpstyle.it>
AuthorDate: Sun Apr 17 23:07:50 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 ed6569fa7e..bf0e6d1319 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;
@@ -49,6 +50,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.
@@ -1248,17 +1250,51 @@ nextProd:
                         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 {
+                        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 (availableInventory.compareTo(BigDecimal.ZERO) > 0) {
+                                productsInStock.add(genericRecord);
+                            }
                         }
                     }
                 }