You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by jo...@apache.org on 2006/11/09 10:21:55 UTC

svn commit: r472825 - in /incubator/ofbiz/trunk/applications: party/entitydef/entitygroup.xml party/entitydef/entitymodel.xml product/data/ProductTypeData.xml product/src/org/ofbiz/product/price/PriceServices.java

Author: jonesde
Date: Thu Nov  9 01:21:54 2006
New Revision: 472825

URL: http://svn.apache.org/viewvc?view=rev&rev=472825
Log:
Added two enhancements for ProductPriceRules: new condition for ProductFeature/Appl, enhancement to group member condition to support a member of a group that is a member of a group in addition to being a direct member of a group

Modified:
    incubator/ofbiz/trunk/applications/party/entitydef/entitygroup.xml
    incubator/ofbiz/trunk/applications/party/entitydef/entitymodel.xml
    incubator/ofbiz/trunk/applications/product/data/ProductTypeData.xml
    incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java

Modified: incubator/ofbiz/trunk/applications/party/entitydef/entitygroup.xml
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/party/entitydef/entitygroup.xml?view=diff&rev=472825&r1=472824&r2=472825
==============================================================================
--- incubator/ofbiz/trunk/applications/party/entitydef/entitygroup.xml (original)
+++ incubator/ofbiz/trunk/applications/party/entitydef/entitygroup.xml Thu Nov  9 01:21:54 2006
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-
 Copyright 2001-2006 The Apache Software Foundation
 
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
@@ -115,6 +114,7 @@
     <entity-group group="org.ofbiz" entity="PartyNoteView" />
     <entity-group group="org.ofbiz" entity="PartyProfileDefault" />
     <entity-group group="org.ofbiz" entity="PartyRelationship" />
+    <entity-group group="org.ofbiz" entity="PartyRelationshipToFrom" />
     <entity-group group="org.ofbiz" entity="PartyRelationshipType" />
     <entity-group group="org.ofbiz" entity="PartyRole" />
     <entity-group group="org.ofbiz" entity="PartyRoleAndPartyDetail" />

Modified: incubator/ofbiz/trunk/applications/party/entitydef/entitymodel.xml
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/party/entitydef/entitymodel.xml?view=diff&rev=472825&r1=472824&r2=472825
==============================================================================
--- incubator/ofbiz/trunk/applications/party/entitydef/entitymodel.xml (original)
+++ incubator/ofbiz/trunk/applications/party/entitydef/entitymodel.xml Thu Nov  9 01:21:54 2006
@@ -1705,6 +1705,19 @@
         <key-map field-name="securityGroupId" rel-field-name="groupId"/>
       </relation>
     </entity>
+    <view-entity entity-name="PartyRelationshipToFrom" package-name="org.ofbiz.party.party">
+        <description>
+            Links two PartyRelationships together to be used to get a member of a group that is a member of a group, so links the to party of the first to the from party of the second.
+            To query the group ID would go on onePartyIdFrom and the member ID would go in twoPartyIdTo. 
+        </description>
+        <member-entity entity-alias="PR1" entity-name="PartyRelationship"/>
+        <member-entity entity-alias="PR2" entity-name="PartyRelationship"/>
+        <alias-all entity-alias="PR1" prefix="one"/>
+        <alias-all entity-alias="PR2" prefix="two"/>
+        <view-link entity-alias="PR1" rel-entity-alias="PR2">
+            <key-map field-name="partyIdTo" rel-field-name="partyIdFrom"/>
+        </view-link>
+    </view-entity>
     <entity entity-name="PartyRelationshipType"
             package-name="org.ofbiz.party.party"
             default-resource-name="PartyEntityLabels"

Modified: incubator/ofbiz/trunk/applications/product/data/ProductTypeData.xml
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/product/data/ProductTypeData.xml?view=diff&rev=472825&r1=472824&r2=472825
==============================================================================
--- incubator/ofbiz/trunk/applications/product/data/ProductTypeData.xml (original)
+++ incubator/ofbiz/trunk/applications/product/data/ProductTypeData.xml Thu Nov  9 01:21:54 2006
@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-
 Copyright 2001-2006 The Apache Software Foundation
 
 Licensed under the Apache License, Version 2.0 (the "License"); you may not
@@ -37,15 +36,16 @@
     <Enumeration description="Product" enumCode="PRODUCT_ID" enumId="PRIP_PRODUCT_ID" sequenceId="01" enumTypeId="PROD_PRICE_IN_PARAM"/>
     <Enumeration description="Product Category" enumCode="PRODUCT_CATEGORY_ID" enumId="PRIP_PROD_CAT_ID" sequenceId="02" enumTypeId="PROD_PRICE_IN_PARAM"/>
     <Enumeration description="Product Catalog" enumCode="PROD_CATALOG_ID" enumId="PRIP_PROD_CLG_ID" sequenceId="03" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Product Store Group" enumCode="PROD_STORE_GRP_ID" enumId="PRIP_PROD_SGRP_ID" sequenceId="04" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Website" enumCode="WEBSITE_ID" enumId="PRIP_WEBSITE_ID" sequenceId="05" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Quantity" enumCode="QUANTITY" enumId="PRIP_QUANTITY" sequenceId="06" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Party" enumCode="PARTY_ID" enumId="PRIP_PARTY_ID" sequenceId="07" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Party Group Member" enumCode="PARTY_GROUP_MEMBER" enumId="PRIP_PARTY_GRP_MEM" sequenceId="08" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Party Classification" enumCode="PARTY_CLASS" enumId="PRIP_PARTY_CLASS" sequenceId="09" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Role Type" enumCode="ROLE_TYPE" enumId="PRIP_ROLE_TYPE" sequenceId="10" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="List Price" enumCode="LIST_PRICE" enumId="PRIP_LIST_PRICE" sequenceId="11" enumTypeId="PROD_PRICE_IN_PARAM"/>
-    <Enumeration description="Currency UomId" enumCode="CURRENCY_UOMID" enumId="PRIP_CURRENCY_UOMID" sequenceId="12" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Product Feature" enumCode="PRODUCT_FEATURE_ID" enumId="PRIP_PROD_FEAT_ID" sequenceId="04" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Product Store Group" enumCode="PROD_STORE_GRP_ID" enumId="PRIP_PROD_SGRP_ID" sequenceId="05" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Website" enumCode="WEBSITE_ID" enumId="PRIP_WEBSITE_ID" sequenceId="06" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Quantity" enumCode="QUANTITY" enumId="PRIP_QUANTITY" sequenceId="07" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Party" enumCode="PARTY_ID" enumId="PRIP_PARTY_ID" sequenceId="08" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Party Group Member" enumCode="PARTY_GROUP_MEMBER" enumId="PRIP_PARTY_GRP_MEM" sequenceId="09" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Party Classification" enumCode="PARTY_CLASS" enumId="PRIP_PARTY_CLASS" sequenceId="10" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Role Type" enumCode="ROLE_TYPE" enumId="PRIP_ROLE_TYPE" sequenceId="11" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="List Price" enumCode="LIST_PRICE" enumId="PRIP_LIST_PRICE" sequenceId="12" enumTypeId="PROD_PRICE_IN_PARAM"/>
+    <Enumeration description="Currency UomId" enumCode="CURRENCY_UOMID" enumId="PRIP_CURRENCY_UOMID" sequenceId="13" enumTypeId="PROD_PRICE_IN_PARAM"/>
 
     <!-- old style; very technical ...
     <Enumeration description="==" enumCode="EQ" enumId="PRC_EQ" sequenceId="01" enumTypeId="PROD_PRICE_COND"/>

Modified: incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java
URL: http://svn.apache.org/viewvc/incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java?view=diff&rev=472825&r1=472824&r2=472825
==============================================================================
--- incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java (original)
+++ incubator/ofbiz/trunk/applications/product/src/org/ofbiz/product/price/PriceServices.java Thu Nov  9 01:21:54 2006
@@ -1,5 +1,4 @@
 /*
- *
  * Copyright 2001-2006 The Apache Software Foundation
  * 
  * Licensed under the Apache License, Version 2.0 (the "License"); you may not
@@ -534,10 +533,10 @@
                             if ("PRIP_QUANTITY".equals(productPriceCond.getString("inputParamEnumId"))) {
                                 foundQuantityInputParam = true;
                             } else {
-                                if (!checkPriceCondition(productPriceCond, productId, prodCatalogId, productStoreGroupId, webSiteId, partyId, new Double(quantity), listPriceDbl.doubleValue(), currencyUomId, delegator)) {
+                                if (!checkPriceCondition(productPriceCond, productId, prodCatalogId, productStoreGroupId, webSiteId, partyId, new Double(quantity), listPriceDbl.doubleValue(), currencyUomId, delegator, nowTimestamp)) {
                                     // if there is a virtualProductId, try that given that this one has failed
                                     if (virtualProductId != null) {
-                                        if (!checkPriceCondition(productPriceCond, virtualProductId, prodCatalogId, productStoreGroupId, webSiteId, partyId, new Double(quantity), listPriceDbl.doubleValue(), currencyUomId, delegator)) {
+                                        if (!checkPriceCondition(productPriceCond, virtualProductId, prodCatalogId, productStoreGroupId, webSiteId, partyId, new Double(quantity), listPriceDbl.doubleValue(), currencyUomId, delegator, nowTimestamp)) {
                                             allExceptQuantTrue = false;
                                         }
                                         // otherwise, okay, this one made it so carry on checking
@@ -682,6 +681,16 @@
                 }
             }
 
+            // by productFeatureId
+            Collection productFeatureIdConds = delegator.findByAndCache("ProductPriceCond", UtilMisc.toMap("inputParamEnumId", "PRIP_PROD_FEAT_ID"));
+            if (productFeatureIdConds != null && productFeatureIdConds.size() > 0) {
+                Iterator productFeatureIdCondsIter = productFeatureIdConds.iterator();
+                while (productFeatureIdCondsIter.hasNext()) {
+                    GenericValue productFeatureIdCond = (GenericValue) productFeatureIdCondsIter.next();
+                    productPriceRuleIds.add(productFeatureIdCond.getString("productPriceRuleId"));
+                }
+            }
+
             // by quantity -- should we really do this one, ie is it necessary?
             // we could say that all rules with quantity on them must have one of these other values
             // but, no we'll do it the other way, any that have a quantity will always get compared
@@ -873,10 +882,10 @@
 
                 totalConds++;
 
-                if (!checkPriceCondition(productPriceCond, productId, prodCatalogId, productStoreGroupId, webSiteId, partyId, quantity, listPrice, currencyUomId, delegator)) {
+                if (!checkPriceCondition(productPriceCond, productId, prodCatalogId, productStoreGroupId, webSiteId, partyId, quantity, listPrice, currencyUomId, delegator, nowTimestamp)) {
                     // if there is a virtualProductId, try that given that this one has failed
                     if (virtualProductId != null) {
-                        if (!checkPriceCondition(productPriceCond, virtualProductId, prodCatalogId, productStoreGroupId, webSiteId, partyId, quantity, listPrice, currencyUomId, delegator)) {
+                        if (!checkPriceCondition(productPriceCond, virtualProductId, prodCatalogId, productStoreGroupId, webSiteId, partyId, quantity, listPrice, currencyUomId, delegator, nowTimestamp)) {
                             allTrue = false;
                             break;
                         }
@@ -1088,7 +1097,7 @@
 
     public static boolean checkPriceCondition(GenericValue productPriceCond, String productId, String prodCatalogId,
             String productStoreGroupId, String webSiteId, String partyId, Double quantity, double listPrice,
-            String currencyUomId, GenericDelegator delegator) throws GenericEntityException {
+            String currencyUomId, GenericDelegator delegator, Timestamp nowTimestamp) throws GenericEntityException {
         if (Debug.verboseOn()) Debug.logVerbose("Checking price condition: " + productPriceCond, module);
         int compare = 0;
 
@@ -1100,13 +1109,26 @@
             List productCategoryMembers = delegator.findByAndCache("ProductCategoryMember",
                     UtilMisc.toMap("productId", productId, "productCategoryId", productCategoryId));
             // and from/thru date within range
-            productCategoryMembers = EntityUtil.filterByDate(productCategoryMembers, true);
+            productCategoryMembers = EntityUtil.filterByDate(productCategoryMembers, nowTimestamp, null, null, true);
             // then 0 (equals), otherwise 1 (not equals)
             if (productCategoryMembers != null && productCategoryMembers.size() > 0) {
                 compare = 0;
             } else {
                 compare = 1;
             }
+        } else if ("PRIP_PROD_FEAT_ID".equals(productPriceCond.getString("inputParamEnumId"))) {
+            // if a ProductFeatureAppl exists for this productId and the specified productFeatureId
+            String productFeatureId = productPriceCond.getString("condValue");
+            List productFeatureAppls = delegator.findByAndCache("ProductFeatureAppl",
+                    UtilMisc.toMap("productId", productId, "productFeatureId", productFeatureId));
+            // and from/thru date within range
+            productFeatureAppls = EntityUtil.filterByDate(productFeatureAppls, nowTimestamp, null, null, true);
+            // then 0 (equals), otherwise 1 (not equals)
+            if (productFeatureAppls != null && productFeatureAppls.size() > 0) {
+                compare = 0;
+            } else {
+                compare = 1;
+            }
         } else if ("PRIP_PROD_CLG_ID".equals(productPriceCond.getString("inputParamEnumId"))) {
             if (UtilValidate.isNotEmpty(prodCatalogId)) {
                 compare = prodCatalogId.compareTo(productPriceCond.getString("condValue"));
@@ -1151,12 +1173,20 @@
                     // 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"));
                     // and from/thru date within range
-                    partyRelationshipList = EntityUtil.filterByDate(partyRelationshipList, true);
+                    partyRelationshipList = EntityUtil.filterByDate(partyRelationshipList, nowTimestamp, null, null, true);
                     // then 0 (equals), otherwise 1 (not equals)
                     if (partyRelationshipList != null && partyRelationshipList.size() > 0) {
                         compare = 0;
                     } else {
-                        compare = 1;
+                        // before setting 1 try one more query: look for a 2 hop relationship
+                        List 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 (partyRelationshipTwoHopList != null && partyRelationshipTwoHopList.size() > 0) {
+                            compare = 0;
+                        } else {
+                            compare = 1;
+                        }
                     }
                 }
             }
@@ -1168,7 +1198,7 @@
                 // find any PartyClassification
                 List partyClassificationList = delegator.findByAndCache("PartyClassification", UtilMisc.toMap("partyId", partyId, "partyClassificationGroupId", partyClassificationGroupId));
                 // and from/thru date within range
-                partyClassificationList = EntityUtil.filterByDate(partyClassificationList, true);
+                partyClassificationList = EntityUtil.filterByDate(partyClassificationList, nowTimestamp, null, null, true);
                 // then 0 (equals), otherwise 1 (not equals)
                 if (partyClassificationList != null && partyClassificationList.size() > 0) {
                     compare = 0;