You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by sa...@apache.org on 2011/10/25 13:19:35 UTC

svn commit: r1188607 - in /ofbiz/trunk/applications/product: config/ProductUiLabels.xml servicedef/services_pricepromo.xml src/org/ofbiz/product/promo/PromoServices.java webapp/catalog/promo/FindProductPromoCode.ftl

Author: sascharodekamp
Date: Tue Oct 25 11:19:35 2011
New Revision: 1188607

URL: http://svn.apache.org/viewvc?rev=1188607&view=rev
Log:
Optimize Promo code generation. Promo Codes which llok like: GT4eI1a are bad to enter for a customer, furthermore there are some literals which could esaylie mixed up (ie "0" and "O"). So the generation should be a little bit smarter. 
So we add three different options to generate a PromoCode:
1.) "clever" only capital letters ans numeric values (no O,0,I,1 ...)
2.) "normal" all aplha numeric charachters 
3.) "sequenz" a sequenz number (default like before)

Modified:
    ofbiz/trunk/applications/product/config/ProductUiLabels.xml
    ofbiz/trunk/applications/product/servicedef/services_pricepromo.xml
    ofbiz/trunk/applications/product/src/org/ofbiz/product/promo/PromoServices.java
    ofbiz/trunk/applications/product/webapp/catalog/promo/FindProductPromoCode.ftl

Modified: ofbiz/trunk/applications/product/config/ProductUiLabels.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/config/ProductUiLabels.xml?rev=1188607&r1=1188606&r2=1188607&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/config/ProductUiLabels.xml (original)
+++ ofbiz/trunk/applications/product/config/ProductUiLabels.xml Tue Oct 25 11:19:35 2011
@@ -19816,6 +19816,10 @@
         <value xml:lang="en">: is not a valid promo code; must be between 1 and 20 characters</value>
         <value xml:lang="it">: non è un codice promozione valido; deve essere fra 1 e 20 caratteri</value>
     </property>
+    <property key="ProductPromoCodeLength">
+        <value xml:lang="de">Aktionscodelänge</value>
+        <value xml:lang="en">product promo code length</value>
+    </property>
     <property key="ProductPromoCodeParties">
         <value xml:lang="de">Aktionscode Akteure</value>
         <value xml:lang="en">Promo Code Parties</value>
@@ -19909,6 +19913,26 @@
         <value xml:lang="zh">用户输入</value>
         <value xml:lang="zh_TW">用戶輸入</value>
     </property>
+    <property key="ProductPromoLayoutSmart">
+        <value xml:lang="de">clever</value>
+        <value xml:lang="en">smart</value>
+    </property>
+    <property key="ProductPromoLayoutNormal">
+        <value xml:lang="de">normal</value>
+        <value xml:lang="en">normal</value>
+    </property>
+    <property key="ProductPromoLayoutSeqNum">
+        <value xml:lang="de">Sequenz</value>
+        <value xml:lang="en">sequence</value>
+    </property>
+    <property key="ProductPromoCodeLayout">
+        <value xml:lang="de">Aussehen vom Aktionscode</value>
+        <value xml:lang="en">Promo code layout</value>
+    </property>
+    <property key="ProductPromoCodeLayoutTooltip">
+        <value xml:lang="de">"clever": Vermeidet ähnliche Zeichen (0 und O, ...) | "normal": Alphanummerisch | "sequenz": Laufnummer</value>
+        <value xml:lang="en">"smart": Avoids equal Chars (0 and O, ...) | "normal": alphanumeric | "sequence": Sequence Number</value>
+    </property>
     <property key="ProductPromos">
         <value xml:lang="de">Aktionen</value>
         <value xml:lang="en">Promos</value>

Modified: ofbiz/trunk/applications/product/servicedef/services_pricepromo.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/servicedef/services_pricepromo.xml?rev=1188607&r1=1188606&r2=1188607&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/servicedef/services_pricepromo.xml (original)
+++ ofbiz/trunk/applications/product/servicedef/services_pricepromo.xml Tue Oct 25 11:19:35 2011
@@ -270,6 +270,8 @@ under the License.
             <exclude field-name="lastModifiedByUserLogin"/>
         </auto-attributes>
         <attribute name="quantity" type="Long" mode="IN" optional="false"/>
+        <attribute name="codeLength" type="Integer" mode="IN" optional="true" default-value="8"/>
+        <attribute name="promoCodeLayout" type="String" mode="IN" optional="true" default-value="sequence"/>
     </service>
 
     <service name="createProductPromoCond" default-entity-name="ProductPromoCond" engine="simple"

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/promo/PromoServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/promo/PromoServices.java?rev=1188607&r1=1188606&r2=1188607&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/promo/PromoServices.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/promo/PromoServices.java Tue Oct 25 11:19:35 2011
@@ -31,6 +31,7 @@ import java.util.Map;
 import javolution.util.FastList;
 import javolution.util.FastMap;
 
+import org.apache.commons.lang.RandomStringUtils;
 import org.ofbiz.base.util.Debug;
 import org.ofbiz.base.util.UtilDateTime;
 import org.ofbiz.base.util.UtilMisc;
@@ -55,33 +56,68 @@ public class PromoServices {
 
     public final static String module = PromoServices.class.getName();
     public static final String resource = "ProductUiLabels";
-    
+    protected final static char[] smartChars = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'K', 'L', 'M', 'N', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
+            'Z', '2', '3', '4', '5', '6', '7', '8', '9' };
+
     public static Map<String, Object> createProductPromoCodeSet(DispatchContext dctx, Map<String, ? extends Object> context) {
-        //Delegator delegator = dctx.getDelegator();
+        Delegator delegator = dctx.getDelegator();
         LocalDispatcher dispatcher = dctx.getDispatcher();
         Long quantity = (Long) context.get("quantity");
-        Locale locale = (Locale) context.get("locale");
-        //Long useLimitPerCode = (Long) context.get("useLimitPerCode");
-        //Long useLimitPerCustomer = (Long) context.get("useLimitPerCustomer");
-        //GenericValue promoItem = null;
-        //GenericValue newItem = null;
+        int codeLength = (Integer) context.get("codeLength");
+        String promoCodeLayout = (String) context.get("promoCodeLayout");
 
+        // For PromoCodes we give the option not to use chars that are easy to mix up like 0<>O, 1<>I, ...
+        boolean useSmartLayout = false;
+        boolean useNormalLayout = false;
+        if ("smart".equals(promoCodeLayout)) {
+            useSmartLayout = true;
+        } else if ("normal".equals(promoCodeLayout)) {
+            useNormalLayout = true;
+        }
+
+        String newPromoCodeId = "";
         StringBuilder bankOfNumbers = new StringBuilder();
-        for (long i = 0; i < quantity.longValue(); i++) {
+        bankOfNumbers.append("Following PromoCodes have been created: ");
+        for (long i = 0; i < quantity; i++) {
             Map<String, Object> createProductPromoCodeMap = null;
+            boolean foundUniqueNewCode = false;
+            long count = 0;
+
+            while (!foundUniqueNewCode) {
+                if (useSmartLayout) {
+                    newPromoCodeId = RandomStringUtils.random(codeLength, smartChars);
+                } else if (useNormalLayout) {
+                    newPromoCodeId = RandomStringUtils.randomAlphanumeric(codeLength);
+                }
+                GenericValue existingPromoCode = null;
+                try {
+                    existingPromoCode = delegator.findByPrimaryKeyCache("ProductPromoCode", "productPromoCodeId", newPromoCodeId);
+                }
+                catch (GenericEntityException e) {
+                    Debug.logWarning("Could not find ProductPromoCode for just generated ID: " + newPromoCodeId, module);
+                }
+                if (existingPromoCode == null) {
+                    foundUniqueNewCode = true;
+                }
+
+                count++;
+                if (count > 999999) {
+                    return ServiceUtil.returnError("Unable to locate unique PromoCode! Length [" + codeLength + "]");
+                }
+            }
             try {
-                createProductPromoCodeMap = dispatcher.runSync("createProductPromoCode", dctx.makeValidContext("createProductPromoCode", "IN", context));
+                Map<String, Object> newContext = dctx.makeValidContext("createProductPromoCode", "IN", context);
+                newContext.put("productPromoCodeId", newPromoCodeId);
+                createProductPromoCodeMap = dispatcher.runSync("createProductPromoCode", newContext);
             } catch (GenericServiceException err) {
-                return ServiceUtil.returnError(UtilProperties.getMessage(resource, 
-                        "ProductPromoCodeCannotBeCreated",  locale), null, null, createProductPromoCodeMap);
+                return ServiceUtil.returnError("Could not create a bank of promo codes", null, null, createProductPromoCodeMap);
             }
             if (ServiceUtil.isError(createProductPromoCodeMap)) {
                 // what to do here? try again?
-                return ServiceUtil.returnError(UtilProperties.getMessage(resource, 
-                        "ProductPromoCodeCannotBeCreated",  locale), null, null, createProductPromoCodeMap);
+                return ServiceUtil.returnError("Could not create a bank of promo codes", null, null, createProductPromoCodeMap);
             }
             bankOfNumbers.append((String) createProductPromoCodeMap.get("productPromoCodeId"));
-            bankOfNumbers.append("<br/>");
+            bankOfNumbers.append(",");
         }
 
         return ServiceUtil.returnSuccess(bankOfNumbers.toString());

Modified: ofbiz/trunk/applications/product/webapp/catalog/promo/FindProductPromoCode.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/webapp/catalog/promo/FindProductPromoCode.ftl?rev=1188607&r1=1188606&r2=1188607&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/webapp/catalog/promo/FindProductPromoCode.ftl (original)
+++ ofbiz/trunk/applications/product/webapp/catalog/promo/FindProductPromoCode.ftl Tue Oct 25 11:19:35 2011
@@ -53,6 +53,15 @@ under the License.
             <form method="post" action="<@o...@ofbizUrl>">
                 <input type="hidden" name="productPromoId" value="${productPromoId}"/>
                 <span class="label">${uiLabelMap.CommonQuantity}:</span><input type="text" size="5" name="quantity" />
+                <span class="label">${uiLabelMap.ProductPromoCodeLength}:</span><input type="text" size="12" name="codeLength" />
+                <span class="label">${uiLabelMap.ProductPromoCodeLayout}:</span>
+                    <select name="promoCodeLayout">
+                        <option value="smart">${uiLabelMap.ProductPromoLayoutSmart}</option>
+                        <option value="normal">${uiLabelMap.ProductPromoLayoutNormal}</option>
+                        <option value="sequence">${uiLabelMap.ProductPromoLayoutSeqNum}</option>
+                    </select>
+                <span class="tooltip">${uiLabelMap.ProductPromoCodeLayoutTooltip}</span>
+                <br />
                 <span class="label">${uiLabelMap.ProductPromoUserEntered}:</span>
                     <select name="userEntered">
                         <option value="Y">${uiLabelMap.CommonY}</option>