Hello Gil, I will get back to this conversation in next week. Thanks!
-- Ashish ----- gil portenseigne <gil.portensei...@nereide.fr> wrote: | I ashish, | | Is there a reason to introduce these imports in : CategoryServices.java, | these might be remains of devel | | import java.io.Writer; | +import java.math.BigDecimal; | import java.sql.Timestamp; | +import java.util.ArrayList; | import java.util.List; | | [...] | | import org.ofbiz.entity.util.EntityListIterator; | +import org.ofbiz.entity.util.EntityTypeUtil; | import org.ofbiz.entity.util.EntityUtil; | [...] | +import org.ofbiz.service.GenericServiceException; | | My eclipse tell me they are no use here :). | | Not so important i guess, but to have less import is better. | | Other thing is formatting where you remove an empty line for spaces : | | @@ -237,7 +245,7 @@ public class CategoryServices { | } | | Timestamp nowTimestamp = UtilDateTime.nowTimestamp(); | - | + | int viewIndex = 0; | try { | | | Best Regards | | Gil | | Le 18/10/2014 13:23, ash...@apache.org a écrit : | > Author: ashish | > Date: Sat Oct 18 11:23:45 2014 | > New Revision: 1632760 | > | > URL: http://svn.apache.org/r1632760 | > Log: | > Applied bug fix from trunk r1632750. | > =========================================== | > Applied patch from jira issue - OFBIZ-4528 - Out of stock products screw up the pagination during category browsing. | > =================================================================== | > Pagination is handled in getProductCategoryAndLimitedMembers | > Then the out of stock filtering is done in CategoryDetail.groovy. | > Hence the pagination is screwed up. Certain pages might show less records or no records based upon data condition. | > =================================================================== | > Thanks Arun for the contribution and Thanks Kiran for creating the issue. | > | > Modified: | > ofbiz/branches/release13.07/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/CategoryDetail.groovy | > ofbiz/branches/release13.07/applications/order/webapp/ordermgr/entry/catalog/categorydetail.ftl | > ofbiz/branches/release13.07/applications/product/servicedef/services_view.xml | > ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/category/CategoryServices.java | > ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/product/ProductWorker.java | > | > Modified: ofbiz/branches/release13.07/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/CategoryDetail.groovy | > URL: http://svn.apache.org/viewvc/ofbiz/branches/release13.07/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/CategoryDetail.groovy?rev=1632760&r1=1632759&r2=1632760&view=diff | > ============================================================================== | > --- ofbiz/branches/release13.07/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/CategoryDetail.groovy (original) | > +++ ofbiz/branches/release13.07/applications/order/webapp/ordermgr/WEB-INF/actions/entry/catalog/CategoryDetail.groovy Sat Oct 18 11:23:45 2014 | > @@ -54,52 +54,20 @@ andMap = [productCategoryId : productCat | > limitView : limitView]; | > andMap.put("prodCatalogId", currentCatalogId); | > andMap.put("checkViewAllow", true); | > +// Prevents out of stock product to be displayed on site | > +productStore = ProductStoreWorker.getProductStore(request); | > +if (productStore) { | > + andMap.put("productStoreId", productStore.productStoreId); | > +} | > if (context.orderByFields) { | > andMap.put("orderByFields", context.orderByFields); | > } else { | > andMap.put("orderByFields", ["sequenceNum", "productId"]); | > } | > catResult = dispatcher.runSync("getProductCategoryAndLimitedMembers", andMap); | > - | > productCategory = catResult.productCategory; | > productCategoryMembers = catResult.productCategoryMembers; | > - | > -// Prevents out of stock product to be displayed on site | > -productStore = ProductStoreWorker.getProductStore(request); | > -if(productStore) { | > - if("N".equals(productStore.showOutOfStockProducts)) { | > - productsInStock = []; | > - productCategoryMembers.each { productCategoryMember -> | > - product = delegator.findOne("Product", [productId : productCategoryMember.productId], true); | > - boolean isMarketingPackage = EntityTypeUtil.hasParentType(delegator, "ProductType", "productTypeId", product.productTypeId, "parentTypeId", "MARKETING_PKG"); | > - context.isMarketingPackage = (isMarketingPackage? "true": "false"); | > - if (isMarketingPackage) { | > - resultOutput = dispatcher.runSync("getMktgPackagesAvailable", [productId : productCategoryMember.productId]); | > - availableInventory = resultOutput.availableToPromiseTotal; | > - if(availableInventory > 0) { | > - productsInStock.add(productCategoryMember); | > - } | > - } else { | > - facilities = delegator.findList("ProductFacility", EntityCondition.makeCondition([productId : productCategoryMember.productId]), null, null, null, false); | > - availableInventory = 0.0; | > - if (facilities) { | > - facilities.each { facility -> | > - lastInventoryCount = facility.lastInventoryCount; | > - if (lastInventoryCount != null) { | > - availableInventory += lastInventoryCount; | > - } | > - } | > - if (availableInventory > 0) { | > - productsInStock.add(productCategoryMember); | > - } | > - } | > - } | > - } | > - context.productCategoryMembers = productsInStock; | > - } else { | > - context.productCategoryMembers = productCategoryMembers; | > - } | > -} | > +context.productCategoryMembers = productCategoryMembers; | > context.productCategory = productCategory; | > context.viewIndex = catResult.viewIndex; | > context.viewSize = catResult.viewSize; | > | > Modified: ofbiz/branches/release13.07/applications/order/webapp/ordermgr/entry/catalog/categorydetail.ftl | > URL: http://svn.apache.org/viewvc/ofbiz/branches/release13.07/applications/order/webapp/ordermgr/entry/catalog/categorydetail.ftl?rev=1632760&r1=1632759&r2=1632760&view=diff | > ============================================================================== | > --- ofbiz/branches/release13.07/applications/order/webapp/ordermgr/entry/catalog/categorydetail.ftl (original) | > +++ ofbiz/branches/release13.07/applications/order/webapp/ordermgr/entry/catalog/categorydetail.ftl Sat Oct 18 11:23:45 2014 | > @@ -41,14 +41,14 @@ under the License. | > </script> | > | > <#macro paginationControls> | > - <#assign viewIndexMax = Static["java.lang.Math"].ceil((listSize - 1)?double / viewSize?double)> | > + <#assign viewIndexMax = Static["java.lang.Math"].ceil((listSize)?double / viewSize?double)> | > <#if (viewIndexMax?int > 0)> | > <div class="product-prevnext"> | > <select name="pageSelect" onchange="callDocumentByPaginate(this[this.selectedIndex].value);"> | > <option value="#">${uiLabelMap.CommonPage} ${viewIndex?int + 1} ${uiLabelMap.CommonOf} ${viewIndexMax}</option> | > <#if (viewIndex?int > 1)> | > - <#list 0..viewIndexMax as curViewNum> | > - <option value="${productCategoryId}~${viewSize}~${curViewNum?int}">${uiLabelMap.CommonGotoPage} ${curViewNum + 1}</option> | > + <#list 1..viewIndexMax as curViewNum> | > + <option value="${productCategoryId}~${viewSize}~${curViewNum-1?int}">${uiLabelMap.CommonGotoPage} ${curViewNum}</option> | > </#list> | > </#if> | > </select> | > | > Modified: ofbiz/branches/release13.07/applications/product/servicedef/services_view.xml | > URL: http://svn.apache.org/viewvc/ofbiz/branches/release13.07/applications/product/servicedef/services_view.xml?rev=1632760&r1=1632759&r2=1632760&view=diff | > ============================================================================== | > --- ofbiz/branches/release13.07/applications/product/servicedef/services_view.xml (original) | > +++ ofbiz/branches/release13.07/applications/product/servicedef/services_view.xml Sat Oct 18 11:23:45 2014 | > @@ -152,6 +152,7 @@ under the License. | > <attribute name="introductionDateLimit" type="java.sql.Timestamp" mode="IN" optional="true"/> | > <attribute name="releaseDateLimit" type="java.sql.Timestamp" mode="IN" optional="true"/> | > <attribute name="orderByFields" type="List" mode="IN" optional="true"/> | > + <attribute name="productStoreId" mode="IN" type="String" optional="true"/> | > <attribute name="productCategory" type="org.ofbiz.entity.GenericValue" mode="OUT" optional="true"/> | > <attribute name="productCategoryMembers" type="java.util.Collection" mode="OUT" optional="true"/> <!-- this list will only contain the limited members if limitView=true --> | > <attribute name="viewIndex" type="Integer" mode="OUT" optional="false"/> <!-- this is a 1 based index, ie the first results are in index 1 --> | > | > Modified: ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/category/CategoryServices.java | > URL: http://svn.apache.org/viewvc/ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/category/CategoryServices.java?rev=1632760&r1=1632759&r2=1632760&view=diff | > ============================================================================== | > --- ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/category/CategoryServices.java (original) | > +++ ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/category/CategoryServices.java Sat Oct 18 11:23:45 2014 | > @@ -21,7 +21,9 @@ package org.ofbiz.product.category; | > import java.io.IOException; | > import java.io.UnsupportedEncodingException; | > import java.io.Writer; | > +import java.math.BigDecimal; | > import java.sql.Timestamp; | > +import java.util.ArrayList; | > import java.util.List; | > import java.util.Locale; | > import java.util.Map; | > @@ -35,6 +37,7 @@ import javolution.util.FastMap; | > import net.sf.json.JSONObject; | > | > import org.ofbiz.base.util.Debug; | > +import org.ofbiz.base.util.GeneralException; | > import org.ofbiz.base.util.UtilDateTime; | > import org.ofbiz.base.util.UtilGenerics; | > import org.ofbiz.base.util.UtilMisc; | > @@ -48,9 +51,13 @@ import org.ofbiz.entity.condition.Entity | > import org.ofbiz.entity.model.ModelEntity; | > import org.ofbiz.entity.util.EntityFindOptions; | > import org.ofbiz.entity.util.EntityListIterator; | > +import org.ofbiz.entity.util.EntityTypeUtil; | > import org.ofbiz.entity.util.EntityUtil; | > import org.ofbiz.product.catalog.CatalogWorker; | > +import org.ofbiz.product.product.ProductWorker; | > import org.ofbiz.service.DispatchContext; | > +import org.ofbiz.service.GenericServiceException; | > +import org.ofbiz.service.LocalDispatcher; | > import org.ofbiz.service.ServiceUtil; | > | > /** | > @@ -212,6 +219,7 @@ public class CategoryServices { | > | > public static Map<String, Object> getProductCategoryAndLimitedMembers(DispatchContext dctx, Map<String, ? extends Object> context) { | > Delegator delegator = dctx.getDelegator(); | > + LocalDispatcher dispatcher = dctx.getDispatcher(); | > String productCategoryId = (String) context.get("productCategoryId"); | > boolean limitView = ((Boolean) context.get("limitView")).booleanValue(); | > int defaultViewSize = ((Integer) context.get("defaultViewSize")).intValue(); | > @@ -237,7 +245,7 @@ public class CategoryServices { | > } | > | > Timestamp nowTimestamp = UtilDateTime.nowTimestamp(); | > - | > + | > int viewIndex = 0; | > try { | > viewIndex = Integer.valueOf((String) context.get("viewIndexString")).intValue(); | > @@ -272,7 +280,18 @@ public class CategoryServices { | > lowIndex = 0; | > highIndex = 0; | > } | > - | > + Boolean filterOutOfStock = false ; | > + try { | > + String productStoreId = (String) context.get("productStoreId"); | > + if (UtilValidate.isNotEmpty(productStoreId)) { | > + GenericValue productStore = delegator.findOne("ProductStore", UtilMisc.toMap("productStoreId", productStoreId), false); | > + if (productStore != null && "N".equals(productStore.getString("showOutOfStockProducts"))) { | > + filterOutOfStock = true; | > + } | > + } | > + } catch (GenericEntityException e) { | > + Debug.logWarning(e.getMessage(), module); | > + } | > List<GenericValue> productCategoryMembers = null; | > if (productCategory != null) { | > try { | > @@ -293,7 +312,16 @@ public class CategoryServices { | > if (!filterConditions.isEmpty()) { | > productCategoryMembers = EntityUtil.filterByCondition(productCategoryMembers, EntityCondition.makeCondition(filterConditions, EntityOperator.AND)); | > } | > - | > + | > + // filter out of stock products | > + if (filterOutOfStock) { | > + try { | > + productCategoryMembers = ProductWorker.filterOutOfStockProducts(productCategoryMembers, dispatcher, delegator); | > + } catch (GeneralException e) { | > + Debug.logWarning("Problem filtering out of stock products :"+e.getMessage(), module); | > + } | > + | > + } | > // filter out the view allow before getting the sublist | > if (UtilValidate.isNotEmpty(viewProductCategoryId)) { | > productCategoryMembers = CategoryWorker.filterProductsInCategory(delegator, productCategoryMembers, viewProductCategoryId); | > @@ -371,7 +399,15 @@ public class CategoryServices { | > lowIndex = 1; | > highIndex = listSize; | > } | > - | > + // filter out of stock products | > + if (filterOutOfStock) { | > + try { | > + productCategoryMembers = ProductWorker.filterOutOfStockProducts(productCategoryMembers, dispatcher, delegator); | > + listSize = productCategoryMembers.size(); | > + } catch (GeneralException e) { | > + Debug.logWarning("Problem filtering out of stock products :"+e.getMessage(), module); | > + } | > + } | > // null safety | > if (productCategoryMembers == null) { | > productCategoryMembers = FastList.newInstance(); | > @@ -399,7 +435,7 @@ public class CategoryServices { | > if (productCategoryMembers != null) result.put("productCategoryMembers", productCategoryMembers); | > return result; | > } | > - | > + | > // Please note : the structure of map in this function is according to the JSON data map of the jsTree | > @SuppressWarnings("unchecked") | > public static void getChildCategoryTree(HttpServletRequest request, HttpServletResponse response){ | > | > Modified: ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/product/ProductWorker.java | > URL: http://svn.apache.org/viewvc/ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/product/ProductWorker.java?rev=1632760&r1=1632759&r2=1632760&view=diff | > ============================================================================== | > --- ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/product/ProductWorker.java (original) | > +++ ofbiz/branches/release13.07/applications/product/src/org/ofbiz/product/product/ProductWorker.java Sat Oct 18 11:23:45 2014 | > @@ -21,6 +21,7 @@ package org.ofbiz.product.product; | > import java.math.BigDecimal; | > import java.math.MathContext; | > import java.sql.Timestamp; | > +import java.util.ArrayList; | > import java.util.LinkedHashMap; | > import java.util.List; | > import java.util.Locale; | > @@ -32,6 +33,7 @@ import javolution.util.FastMap; | > import javolution.util.FastSet; | > | > import org.ofbiz.base.util.Debug; | > +import org.ofbiz.base.util.GeneralException; | > import org.ofbiz.base.util.UtilDateTime; | > import org.ofbiz.base.util.UtilMisc; | > import org.ofbiz.base.util.UtilValidate; | > @@ -1205,4 +1207,43 @@ nextProd: | > | > return false; | > } | > + | > + // Method to filter-out out of stock products | > + public static List<GenericValue> filterOutOfStockProducts (List<GenericValue> productsToFilter, LocalDispatcher dispatcher, Delegator delegator) throws GeneralException { | > + ArrayList<GenericValue> productsInStock = new ArrayList<GenericValue>(); | > + if (UtilValidate.isNotEmpty(productsToFilter)) { | > + for (GenericValue genericRecord : productsToFilter) { | > + String productId = genericRecord.getString("productId"); | > + GenericValue product = null; | > + product = delegator.findOne("Product", UtilMisc.toMap("productId", productId), true); | > + Boolean isMarketingPackage = EntityTypeUtil.hasParentType(delegator, "ProductType", "productTypeId", product.getString("productTypeId"), "parentTypeId", "MARKETING_PKG"); | > + | > + if ( UtilValidate.isNotEmpty(isMarketingPackage) && isMarketingPackage) { | > + Map<String, Object> resultOutput = new FastMap<String, Object>(); | > + resultOutput = dispatcher.runSync("getMktgPackagesAvailable", UtilMisc.toMap("productId" ,productId)); | > + Debug.logWarning("Error getting available marketing package.", module); | > + | > + BigDecimal availableInventory = (BigDecimal) resultOutput.get("availableToPromiseTotal"); | > + if(availableInventory.compareTo(BigDecimal.ZERO) > 0) { | > + productsInStock.add(genericRecord); | > + } | > + } else { | > + List<GenericValue> facilities = delegator.findList("ProductFacility", EntityCondition.makeCondition("productId",EntityOperator.EQUALS, productId), null, null, null, false); | > + 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); | > + } | > + } | > + } | > + } | > + } | > + return productsInStock; | > + } | > } | > | > | | | -- | | <www.nereide.fr> | | Gil Portenseigne | Consultant ERP OFBiz | Société Néréide | 3b Les isles | 37270 Veretz | Tel : 09 74 53 46 09, puis 1, poste 61 | Mob : 06 82 740 444 | www.nereide.fr <http://www.nereide.fr> | | Membre d'OFBiz France | www.ofbiz-fr.org <http://www.ofbiz-fr.org> |