Author: jleroux
Date: Fri Mar 12 08:27:42 2010 New Revision: 922177 URL: http://svn.apache.org/viewvc?rev=922177&view=rev Log: A slightly modified patch from Geir Ove Grønmo "Calculation of promotions and price rules should support multi-level GROUP_ROLLUP" (https://issues.apache.org/jira/browse/OFBIZ-3440) - OFBIZ-3440 The calculation of product prices given promotion and price rules do not currently take multi-level GROUP_ROLLUP party relations into account. The calculation of price rules consider two levels of GROUP_ROLLUP only, while the calculation of promotions take just a single level of GROUP_ROLLUP into account. The attached patch will calculate price rules and promotions for GROUP_ROLLUPs for an arbitrary number of GROUP_ROLLUPs. This is essential in the situation where there are hierarchies of parties. Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java Modified: ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java?rev=922177&r1=922176&r2=922177&view=diff ============================================================================== --- ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java (original) +++ ofbiz/trunk/applications/order/src/org/ofbiz/order/shoppingcart/product/ProductPromoWorker.java Fri Mar 12 08:27:42 2010 @@ -980,21 +980,21 @@ public class ProductPromoWorker { if (UtilValidate.isEmpty(partyId) || UtilValidate.isEmpty(condValue)) { compareBase = Integer.valueOf(1); } else { - String groupPartyId = condValue; - if (partyId.equals(groupPartyId)) { - compareBase = Integer.valueOf(0); - } else { + String groupPartyId = condValue; + if (partyId.equals(groupPartyId)) { + compareBase = new Integer(0); + } else { // look for PartyRelationship with partyRelationshipTypeId=GROUP_ROLLUP, the partyIdTo is the group member, so the partyIdFrom is the groupPartyId - List partyRelationshipList = delegator.findByAndCache("PartyRelationship", UtilMisc.toMap("partyIdFrom", groupPartyId, "partyIdTo", partyId, "partyRelationshipTypeId", "GROUP_ROLLUP")); + List<GenericValue> partyRelationshipList = delegator.findByAndCache("PartyRelationship", UtilMisc.toMap("partyIdFrom", groupPartyId, "partyIdTo", partyId, "partyRelationshipTypeId", "GROUP_ROLLUP")); // and from/thru date within range partyRelationshipList = EntityUtil.filterByDate(partyRelationshipList, true); - // then 0 (equals), otherwise 1 (not equals) + if (UtilValidate.isNotEmpty(partyRelationshipList)) { - compareBase = Integer.valueOf(0); - } else { - compareBase = Integer.valueOf(1); - } - } + compareBase = new Integer(0); + } else { + compareBase = new Integer(checkConditionPartyHierarchy(delegator, nowTimestamp, groupPartyId, partyId)); + } + } } } else if ("PPIP_PARTY_CLASS".equals(inputParamEnumId)) { if (UtilValidate.isEmpty(partyId) || UtilValidate.isEmpty(condValue)) { @@ -1002,7 +1002,7 @@ public class ProductPromoWorker { } else { String partyClassificationGroupId = condValue; // find any PartyClassification - List partyClassificationList = delegator.findByAndCache("PartyClassification", UtilMisc.toMap("partyId", partyId, "partyClassificationGroupId", partyClassificationGroupId)); + List<GenericValue> partyClassificationList = delegator.findByAndCache("PartyClassification", UtilMisc.toMap("partyId", partyId, "partyClassificationGroupId", partyClassificationGroupId)); // and from/thru date within range partyClassificationList = EntityUtil.filterByDate(partyClassificationList, true); // then 0 (equals), otherwise 1 (not equals) @@ -1181,6 +1181,21 @@ public class ProductPromoWorker { return false; } + private static int checkConditionPartyHierarchy(Delegator delegator, Timestamp nowTimestamp, String groupPartyId, String partyId) throws GenericEntityException{ + List<GenericValue> partyRelationshipList = delegator.findByAndCache("PartyRelationship", UtilMisc.toMap("partyIdTo", partyId, "partyRelationshipTypeId", "GROUP_ROLLUP")); + partyRelationshipList = EntityUtil.filterByDate(partyRelationshipList, nowTimestamp, null, null, true); + for (GenericValue genericValue : partyRelationshipList) { + String partyIdFrom = (String)genericValue.get("partyIdFrom"); + if (partyIdFrom.equals(groupPartyId)) { + return 0; + } + if (0 == checkConditionPartyHierarchy(delegator, nowTimestamp, groupPartyId, partyIdFrom)) { + return 0; + } + } + return 1; + } + public static class ActionResultInfo { public boolean ranAction = false; public BigDecimal totalDiscountAmount = BigDecimal.ZERO; Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java?rev=922177&r1=922176&r2=922177&view=diff ============================================================================== --- ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java (original) +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java Fri Mar 12 08:27:42 2010 @@ -1198,7 +1198,9 @@ public class PriceServices { if (partyId.equals(groupPartyId)) { compare = 0; } else { - // look for PartyRelationship with partyRelationshipTypeId=GROUP_ROLLUP, the partyIdTo is the group member, so the partyIdFrom is the groupPartyId + // look for PartyRelationship with + // partyRelationshipTypeId=GROUP_ROLLUP, the partyIdTo is + // the group member, so the partyIdFrom is the groupPartyId List<GenericValue> partyRelationshipList = delegator.findByAndCache("PartyRelationship", UtilMisc.toMap("partyIdFrom", groupPartyId, "partyIdTo", partyId, "partyRelationshipTypeId", "GROUP_ROLLUP")); // and from/thru date within range partyRelationshipList = EntityUtil.filterByDate(partyRelationshipList, nowTimestamp, null, null, true); @@ -1206,15 +1208,7 @@ public class PriceServices { if (UtilValidate.isNotEmpty(partyRelationshipList)) { compare = 0; } else { - // before setting 1 try one more query: look for a 2 hop relationship - List<GenericValue> partyRelationshipTwoHopList = delegator.findByAndCache("PartyRelationshipToFrom", UtilMisc.toMap("onePartyIdFrom", groupPartyId, "twoPartyIdTo", partyId, "onePartyRelationshipTypeId", "GROUP_ROLLUP", "twoPartyRelationshipTypeId", "GROUP_ROLLUP")); - partyRelationshipTwoHopList = EntityUtil.filterByDate(partyRelationshipTwoHopList, nowTimestamp, "oneFromDate", "oneThruDate", true); - partyRelationshipTwoHopList = EntityUtil.filterByDate(partyRelationshipTwoHopList, nowTimestamp, "twoFromDate", "twoThruDate", true); - if (UtilValidate.isNotEmpty(partyRelationshipTwoHopList)) { - compare = 0; - } else { - compare = 1; - } + compare = checkConditionPartyHierarchy(delegator, nowTimestamp, groupPartyId, partyId); } } } @@ -1281,6 +1275,22 @@ public class PriceServices { return false; } + private static int checkConditionPartyHierarchy(Delegator delegator, Timestamp nowTimestamp, String groupPartyId, String partyId) throws GenericEntityException{ + List<GenericValue> partyRelationshipList = delegator.findByAndCache("PartyRelationship", UtilMisc.toMap("partyIdTo", partyId, "partyRelationshipTypeId", "GROUP_ROLLUP")); + partyRelationshipList = EntityUtil.filterByDate(partyRelationshipList, nowTimestamp, null, null, true); + for (GenericValue genericValue : partyRelationshipList) { + String partyIdFrom = (String)genericValue.get("partyIdFrom"); + if (partyIdFrom.equals(groupPartyId)) { + return 0; + } + if (0 == checkConditionPartyHierarchy(delegator, nowTimestamp, groupPartyId, partyIdFrom)) { + return 0; + } + } + + return 1; + } + /** * Calculates the purchase price of a product */ |
Free forum by Nabble | Edit this page |