You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by bi...@apache.org on 2008/08/18 15:30:36 UTC

svn commit: r686748 - in /ofbiz/trunk/applications: manufacturing/config/ manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ manufacturing/webapp/manufacturing/jobshopmgt/ manufacturing/...

Author: bibryam
Date: Mon Aug 18 06:30:35 2008
New Revision: 686748

URL: http://svn.apache.org/viewvc?rev=686748&view=rev
Log:
Add possibility for entering comments for configurable product options. The comments are attached to production runs as notes.
Thanks to Jacopo and BJ for their comments.
Internationalization note: this commit contains new UI labels.

Modified:
    ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml
    ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
    ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy
    ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml
    ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml
    ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl
    ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java
    ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java

Modified: ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml (original)
+++ ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml Mon Aug 18 06:30:35 2008
@@ -1379,6 +1379,9 @@
         <value xml:lang="th">รายการของการผลิตสินค้าจากสินทรัพย์ไม่ถาวร</value>
         <value xml:lang="zh">生产运行固定资产列表</value>
     </property>
+    <property key="ManufacturingListOfProductionRunNotes">
+        <value xml:lang="en">List Of Production Run Notes</value>
+    </property>    
     <property key="ManufacturingListOfProductionRunRoutingTasks">
         <value xml:lang="en">Tasks</value>
         <value xml:lang="es">Lista de tareas de la corrida de producción</value>

Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java (original)
+++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java Mon Aug 18 06:30:35 2008
@@ -2196,6 +2196,25 @@
                     componentQuantity = new Double(totalQuantity.doubleValue() + componentQuantity.doubleValue());
                 }
                 components.put(componentProductId, componentQuantity);
+                
+                //  create production run notes from comments
+                String comments = co.getComments();
+                if (UtilValidate.isNotEmpty(comments)) {
+                    resultService.clear();
+                    serviceContext.clear();
+                    serviceContext.put("workEffortId", productionRunId);
+                    serviceContext.put("internalNote", "Y");
+                    serviceContext.put("noteInfo", comments);
+                    serviceContext.put("noteName", co.getDescription());
+                    serviceContext.put("userLogin", userLogin);
+                    serviceContext.put("noteParty", userLogin.getString("partyId"));                                        
+                    try {
+                        resultService = dispatcher.runSync("createWorkEffortNote", serviceContext);
+                    } catch (GenericServiceException e) {
+                        Debug.logWarning(e.getMessage(), module);
+                        return ServiceUtil.returnError(e.getMessage());
+                    }
+                }
             }
         }
         

Modified: ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy (original)
+++ ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy Mon Aug 18 06:30:35 2008
@@ -63,5 +63,11 @@
         context.quantity = productionRun.getQuantity(); // this is useful to compute the total estimates runtime in the form
         //  Product component/parts list
         context.productionRunComponents = productionRun.getProductionRunComponents();;
+        
+        // Find all the notes linked to this production run.
+        productionRunNoteData = delegator.findByAnd("WorkEffortNoteAndData", [workEffortId : productionRunId]);
+        if (productionRunNoteData) {
+            context.productionRunNoteData = productionRunNoteData;
+        }        
     }
 }

Modified: ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml (original)
+++ ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml Mon Aug 18 06:30:35 2008
@@ -520,6 +520,15 @@
             <display-entity entity-name="StatusItem" />
         </field>
     </form>
+    <form name="ListProductionRunNotes" type="list" title="" list-name="productionRunNoteData"
+        odd-row-style="alternate-row" default-table-style="basic-table hover-bar">
+        <auto-fields-entity entity-name="WorkEffortNoteAndData" default-field-type="display" />
+        <field name="workEffortId"><hidden/></field>
+        <field name="internalNote"><hidden/></field>
+        <field name="noteId"><hidden/></field>
+        <field name="noteParty"><hidden/></field>
+        <field name="noteDateTime"><hidden/></field>
+    </form>     
     <form name="EditProductionRunTaskFixedAsset" type="single" target="EditProductionRun" title="" default-map-name="fixedAssetData"
         header-row-style="header-row" default-table-style="basic-table">
         <alt-target use-when="declarationScreen.equals(&quot;Y&quot;)" target="ProductionRunDeclaration" />

Modified: ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml (original)
+++ ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml Mon Aug 18 06:30:35 2008
@@ -177,7 +177,21 @@
                                     </widgets>
                                 </section>
                             </container>
-                           </container>                        
+                        </container>
+                        <container style="screenlet">
+                            <container style="screenlet-title-bar">
+                                <container style="h3">
+                                    <label text="${uiLabelMap.ManufacturingListOfProductionRunNotes}"/>
+                                </container>
+                            </container>
+                            <container style="screenlet-body">
+                                <section>
+                                    <widgets>                                        
+                                        <include-form name="ListProductionRunNotes" location="component://manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml"/>
+                                    </widgets>
+                                </section>
+                            </container>
+                        </container>
                     </decorator-section>
                 </decorator-screen>
             </widgets>

Modified: ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl (original)
+++ ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl Mon Aug 18 06:30:35 2008
@@ -140,7 +140,13 @@
 });
 
 function getConfigDetails(event) {
-        new Ajax.Request('/ordermgr/control/getConfigDetailsEvent',{parameters: $('configFormId').serialize(),  requestHeaders: {Accept: 'application/json'},
+       var element = Event.element(event);
+       if (element.identify().startsWith('comments_')) {
+         //  don't update the price for comment change
+         return;
+       }
+
+       new Ajax.Request('/ordermgr/control/getConfigDetailsEvent',{parameters: $('configFormId').serialize(),  requestHeaders: {Accept: 'application/json'},
         
            onSuccess: function(transport){     
                 var data = transport.responseText.evalJSON(true);
@@ -477,8 +483,11 @@
             <#if question.isStandard()>
               <#-- Standard item: all the options are always included -->
               <#assign options = question.options>
+              <#assign optionCounter = 0>              
               <#list options as option>
                 <div>${option.description} <#if !option.isAvailable()> (*)</#if></div>
+                <div>${uiLabelMap.CommonComments}: <input type='text' name='comments_${counter}_${optionCounter}' id='comments_${counter}_${optionCounter}' value='${option.comments?if_exists}' ></div>                                  
+                <#assign optionCounter = optionCounter + 1>                 
               </#list>
             <#else>
               <#if question.isSingleChoice()>
@@ -495,6 +504,7 @@
                 <#if !question.isMandatory()>
                   <div><input type="radio" name='${counter}' value='<#if !question.isSelected()>checked</#if>'> No option</div>
                 </#if>
+                <#assign optionComment = "">
                 <#assign optionCounter = 0>              
                 <#list options as option>
                   <#assign componentCounter = 0>                  
@@ -503,6 +513,9 @@
                   <#else>
                     <#assign shownPrice = option.price>
                   </#if>
+                  <#if option.isSelected()>
+                    <#assign optionComment = option.getComments()?if_exists>
+                  </#if>                   
                     <#-- Render virtual compoennts -->
                     <#if option.hasVirtualComponent()>
                       <div >
@@ -530,6 +543,7 @@
                     </#if>
                   <#assign optionCounter = optionCounter + 1>
                 </#list>
+                <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_0' id='comments_${counter}_0' value='${optionComment?if_exists}' /></div>                
                 <#else>
                 <#-- And this is the select box implementation -->
                 <select name='${counter}'>
@@ -538,6 +552,7 @@
                 </#if>
                 <#assign options = question.options>
                 <#assign optionCounter = 0>
+                <#assign optionComment = "">
                 <#list options as option>
                   <#if showOffsetPrice?exists && "Y" == showOffsetPrice>
                     <#assign shownPrice = option.price - selectedPrice>
@@ -545,6 +560,7 @@
                     <#assign shownPrice = option.price>
                   </#if>
                   <#if option.isSelected()>
+                    <#assign optionComment = option.getComments()>
                     <#assign optionCounter = optionCounter + 1>
                   </#if>
                   <option value='${optionCounter}' <#if option.isSelected()>selected</#if>>
@@ -556,6 +572,7 @@
                   <#assign optionCounter = optionCounter + 1>
                 </#list>
                 </select>
+                <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_0' id='comments_${counter}_0' value='${optionComment?if_exists}' /></div>                 
                 </#if>
               <#else>
                 <#-- Multi choice question -->
@@ -585,13 +602,16 @@
                       ${option.description} +<@ofbizCurrency amount=option.price isoCode=price.currencyUsed/><#if !option.isAvailable()> (*)</#if>
                     </div>
                     </#if>
+                    <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_${optionCounter}' id='comments_${counter}_${optionCounter}' value='${option.comments?if_exists}'></div>                    
                   <#assign optionCounter = optionCounter + 1>
                 </#list>
               </#if>
             </#if>
             </td>
           </tr>
-          <tr><td><hr/></td></tr>
+          <#if question_has_next>
+            <tr><td><hr/></td></tr>
+          </#if>
           <#assign counter = counter + 1>
         </#list>
         </table>

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java Mon Aug 18 06:30:35 2008
@@ -87,13 +87,41 @@
         for (int k = 0; k < numOfQuestions; k++) {
             String[] opts = request.getParameterValues("" + k);
             if (opts == null) {
+                
+                //  check for standard item comments
+                ProductConfigWrapper.ConfigItem question = (ProductConfigWrapper.ConfigItem) configWrapper.getQuestions().get(k);
+                if (question.isStandard()) {
+                    int i = 0;
+                    while (i <= (question.getOptions().size() -1)) {
+                        String comments = request.getParameter("comments_" + k + "_" + i);
+                        if (UtilValidate.isNotEmpty(comments)) {
+                            try {
+                                configWrapper.setSelected(k, i, comments);
+                            } catch(Exception e) {
+                                Debug.logWarning(e.getMessage(), module);
+                            }                            
+                        }
+                        i++;
+                    }
+                }
                 continue;
             }
             for (int h = 0; h < opts.length; h++) {
                 int cnt = -1;
                 try {
                     cnt = Integer.parseInt(opts[h]);
+                    String comments = null;
+                    ProductConfigWrapper.ConfigItem question = (ProductConfigWrapper.ConfigItem) configWrapper.getQuestions().get(k);
+                    if (question.isSingleChoice()) {
+                        comments = request.getParameter("comments_" + k + "_" + "0");
+                    } else {
+                        comments = request.getParameter("comments_" + k + "_" + cnt);
+                    }
+                                        
+                    configWrapper.setSelected(k, cnt, comments);
                     ProductConfigWrapper.ConfigOption option = configWrapper.getItemOtion(k, cnt);
+                    
+                    //  set selected variant products 
                     if (UtilValidate.isNotEmpty(option) && (option.hasVirtualComponent())) {
                         List components = option.getComponents();
                         int variantIndex = 0;
@@ -105,7 +133,8 @@
                                 if (UtilValidate.isEmpty(selectedProdcutId)) {
                                     Debug.logWarning("ERROR: Request param [" + productParamName + "] not found!", module);
                                 } else {
-                                    //  handle both types of virtual variant methods
+                                    
+                                    //  handle also feature tree virtual variant methods
                                     if (ProductWorker.isVirtual((GenericDelegator)request.getAttribute("delegator"), selectedProdcutId)) {
                                         if ("VV_FEATURETREE".equals(ProductWorker.getProductvirtualVariantMethod((GenericDelegator)request.getAttribute("delegator"), selectedProdcutId))) {
                                             // get the selected features
@@ -136,10 +165,7 @@
                                 variantIndex ++;
                             }
                         }
-                    } else {
-                        configWrapper.setSelected(k, cnt);
-                    }
-
+                    } 
                 } catch(Exception e) {
                     Debug.logWarning(e.getMessage(), module);
                 }
@@ -190,9 +216,12 @@
                         Iterator selOpIt = selectedOptions.iterator();
                         while (selOpIt.hasNext()) {
                             ConfigOption oneOption = (ConfigOption)selOpIt.next();
-                            String configOptionId = oneOption.configOption.getString("configOptionId");
+                            String configOptionId = oneOption.configOption.getString("configOptionId");                            
                             if (productConfigConfig.getString("configOptionId").equals(configOptionId)) {
-                                configsToCheck.add(productConfigConfig);
+                                String comments = oneOption.getComments() != null ? oneOption.getComments() : "";
+                                if ((UtilValidate.isEmpty(comments) && UtilValidate.isEmpty(productConfigConfig.getString("description"))) || comments.equals(productConfigConfig.getString("description"))) {
+                                    configsToCheck.add(productConfigConfig);
+                                }                                                               
                             }
                         } 
                     }
@@ -315,11 +344,13 @@
                     List toBeStored = new LinkedList();
                     ConfigOption oneOption = (ConfigOption)selOpIt.next();
                     String configOptionId = oneOption.configOption.getString("configOptionId");
+                    String description = oneOption.getComments();
                     GenericValue productConfigConfig = delegator.makeValue("ProductConfigConfig");
                     productConfigConfig.put("configId", configId);
                     productConfigConfig.put("configItemId", configItemId);
                     productConfigConfig.put("sequenceNum", sequenceNum);
                     productConfigConfig.put("configOptionId", configOptionId);
+                    productConfigConfig.put("description", description);                    
                     toBeStored.add(productConfigConfig);
 
                     if (oneOption.hasVirtualComponent()) {                        

Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java?rev=686748&r1=686747&r2=686748&view=diff
==============================================================================
--- ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java (original)
+++ ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java Mon Aug 18 06:30:35 2008
@@ -145,13 +145,14 @@
                     String configItemId = pcc.getString("configItemId");
                     String configOptionId = pcc.getString("configOptionId");
                     Long sequenceNum = pcc.getLong("sequenceNum");
-                    this.setSelected(configItemId, sequenceNum, configOptionId);
+                    String comments = pcc.getString("description");
+                    this.setSelected(configItemId, sequenceNum, configOptionId, comments);
                 }
             }
         }
     }
 
-    public void setSelected(String configItemId, Long sequenceNum, String configOptionId) throws Exception {
+    public void setSelected(String configItemId, Long sequenceNum, String configOptionId, String comments) throws Exception {
         for (int i = 0; i < questions.size(); i++) {
             ConfigItem ci = (ConfigItem)questions.get(i);
             if (ci.configItemAssoc.getString("configItemId").equals(configItemId) && ci.configItemAssoc.getLong("sequenceNum").equals(sequenceNum)) {
@@ -159,7 +160,7 @@
                 for (int j = 0; j < avalOptions.size(); j++) {
                     ConfigOption oneOption = (ConfigOption)avalOptions.get(j);
                     if (oneOption.configOption.getString("configOptionId").equals(configOptionId)) {
-                        setSelected(i, j);
+                        setSelected(i, j, comments);
                         break;
                     }
                 }
@@ -175,6 +176,7 @@
                 for (int j = 0; j < options.size(); j++) {
                     ConfigOption co = (ConfigOption)options.get(j);
                     co.setSelected(false);
+                    co.setComments(null);
                 }
             }
         }
@@ -233,13 +235,14 @@
         return product;
     }
     
-    public void setSelected(int question, int option) throws Exception {
+    public void setSelected(int question, int option, String comments) throws Exception {
         ConfigItem ci = (ConfigItem)questions.get(question);
         List avalOptions = ci.getOptions();
         if (ci.isSingleChoice()) {
             for (int j = 0; j < avalOptions.size(); j++) {
                 ConfigOption oneOption = (ConfigOption)avalOptions.get(j);
                 oneOption.setSelected(false);
+                oneOption.setComments(null);
             }
         }
         ConfigOption theOption = null;
@@ -248,11 +251,11 @@
         }
         if (theOption != null) {
             theOption.setSelected(true);
+            theOption.setComments(comments);
         }
     }
     
     public void setSelected(int question, int option, int component, String componentOption) throws Exception {
-        setSelected(question, option);
         //  set variant products
         ConfigOption theOption = getItemOtion(question, option);
         List components = theOption.getComponents();
@@ -527,6 +530,7 @@
         boolean selected = false;
         boolean available = true;
         ConfigItem parentConfigItem = null;
+        String comments = null;  //  comments for production run entered during ordering
         
         public ConfigOption(GenericDelegator delegator, LocalDispatcher dispatcher, GenericValue option, ConfigItem configItem, String catalogId, String webSiteId, String currencyUomId, GenericValue autoUserLogin) throws Exception {
             configOption = option;
@@ -572,6 +576,7 @@
             optionPrice = co.optionPrice;
             available = co.available;
             selected = co.selected;
+            comments = co.getComments();
         }
         
         public void recalculateOptionPrice(ProductConfigWrapper pcw) throws Exception {
@@ -621,6 +626,14 @@
             return configOption.getString("configOptionId");
         }
         
+        public String getComments() {
+            return comments;
+        }
+        
+        public void setComments(String comments) {
+            this.comments = comments;
+        }
+        
         public double getPrice() {
             return optionPrice;
         }



Re: svn commit: r686748 - in /ofbiz/trunk/applications: manufacturing/config/ manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ manufacturing/webapp/manufacturing/jobshopmgt/ manufacturing/

Posted by Jacques Le Roux <ja...@les7arts.com>.
Thanks Bilgin for the i18n reminder :o)

Jacques

From: <bi...@apache.org>
> Author: bibryam
> Date: Mon Aug 18 06:30:35 2008
> New Revision: 686748
>
> URL: http://svn.apache.org/viewvc?rev=686748&view=rev
> Log:
> Add possibility for entering comments for configurable product options. The comments are attached to production runs as notes.
> Thanks to Jacopo and BJ for their comments.
> Internationalization note: this commit contains new UI labels.
>
> Modified:
>    ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml
>    ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
>    ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy
>    ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml
>    ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml
>    ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl
>    ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java
>    ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java
>
> Modified: ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml (original)
> +++ ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml Mon Aug 18 06:30:35 2008
> @@ -1379,6 +1379,9 @@
>         <value 
> xml:lang="th">รายการของการผลิตสินค้าจากสินทรัพย์ไม่ถาวร</value>
>         <value xml:lang="zh">生产运行固定资产列表</value>
>     </property>
> +    <property key="ManufacturingListOfProductionRunNotes">
> +        <value xml:lang="en">List Of Production Run Notes</value>
> +    </property>
>     <property key="ManufacturingListOfProductionRunRoutingTasks">
>         <value xml:lang="en">Tasks</value>
>         <value xml:lang="es">Lista de tareas de la corrida de producción</value>
>
> Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java (original)
> +++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java Mon Aug 18 06:30:35 
> 2008
> @@ -2196,6 +2196,25 @@
>                     componentQuantity = new Double(totalQuantity.doubleValue() + componentQuantity.doubleValue());
>                 }
>                 components.put(componentProductId, componentQuantity);
> +
> +                //  create production run notes from comments
> +                String comments = co.getComments();
> +                if (UtilValidate.isNotEmpty(comments)) {
> +                    resultService.clear();
> +                    serviceContext.clear();
> +                    serviceContext.put("workEffortId", productionRunId);
> +                    serviceContext.put("internalNote", "Y");
> +                    serviceContext.put("noteInfo", comments);
> +                    serviceContext.put("noteName", co.getDescription());
> +                    serviceContext.put("userLogin", userLogin);
> +                    serviceContext.put("noteParty", userLogin.getString("partyId"));
> +                    try {
> +                        resultService = dispatcher.runSync("createWorkEffortNote", serviceContext);
> +                    } catch (GenericServiceException e) {
> +                        Debug.logWarning(e.getMessage(), module);
> +                        return ServiceUtil.returnError(e.getMessage());
> +                    }
> +                }
>             }
>         }
>
>
> Modified: ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy (original)
> +++ ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy Mon Aug 18 
> 06:30:35 2008
> @@ -63,5 +63,11 @@
>         context.quantity = productionRun.getQuantity(); // this is useful to compute the total estimates runtime in the form
>         //  Product component/parts list
>         context.productionRunComponents = productionRun.getProductionRunComponents();;
> +
> +        // Find all the notes linked to this production run.
> +        productionRunNoteData = delegator.findByAnd("WorkEffortNoteAndData", [workEffortId : productionRunId]);
> +        if (productionRunNoteData) {
> +            context.productionRunNoteData = productionRunNoteData;
> +        }
>     }
> }
>
> Modified: ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml (original)
> +++ ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml Mon Aug 18 06:30:35 2008
> @@ -520,6 +520,15 @@
>             <display-entity entity-name="StatusItem" />
>         </field>
>     </form>
> +    <form name="ListProductionRunNotes" type="list" title="" list-name="productionRunNoteData"
> +        odd-row-style="alternate-row" default-table-style="basic-table hover-bar">
> +        <auto-fields-entity entity-name="WorkEffortNoteAndData" default-field-type="display" />
> +        <field name="workEffortId"><hidden/></field>
> +        <field name="internalNote"><hidden/></field>
> +        <field name="noteId"><hidden/></field>
> +        <field name="noteParty"><hidden/></field>
> +        <field name="noteDateTime"><hidden/></field>
> +    </form>
>     <form name="EditProductionRunTaskFixedAsset" type="single" target="EditProductionRun" title="" 
> default-map-name="fixedAssetData"
>         header-row-style="header-row" default-table-style="basic-table">
>         <alt-target use-when="declarationScreen.equals(&quot;Y&quot;)" target="ProductionRunDeclaration" />
>
> Modified: ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml (original)
> +++ ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml Mon Aug 18 06:30:35 2008
> @@ -177,7 +177,21 @@
>                                     </widgets>
>                                 </section>
>                             </container>
> -                           </container>
> +                        </container>
> +                        <container style="screenlet">
> +                            <container style="screenlet-title-bar">
> +                                <container style="h3">
> +                                    <label text="${uiLabelMap.ManufacturingListOfProductionRunNotes}"/>
> +                                </container>
> +                            </container>
> +                            <container style="screenlet-body">
> +                                <section>
> +                                    <widgets>
> +                                        <include-form name="ListProductionRunNotes" 
> location="component://manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml"/>
> +                                    </widgets>
> +                                </section>
> +                            </container>
> +                        </container>
>                     </decorator-section>
>                 </decorator-screen>
>             </widgets>
>
> Modified: ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl (original)
> +++ ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl Mon Aug 18 06:30:35 2008
> @@ -140,7 +140,13 @@
> });
>
> function getConfigDetails(event) {
> -        new Ajax.Request('/ordermgr/control/getConfigDetailsEvent',{parameters: $('configFormId').serialize(),  requestHeaders: 
> {Accept: 'application/json'},
> +       var element = Event.element(event);
> +       if (element.identify().startsWith('comments_')) {
> +         //  don't update the price for comment change
> +         return;
> +       }
> +
> +       new Ajax.Request('/ordermgr/control/getConfigDetailsEvent',{parameters: $('configFormId').serialize(),  requestHeaders: 
> {Accept: 'application/json'},
>
>            onSuccess: function(transport){
>                 var data = transport.responseText.evalJSON(true);
> @@ -477,8 +483,11 @@
>             <#if question.isStandard()>
>               <#-- Standard item: all the options are always included -->
>               <#assign options = question.options>
> +              <#assign optionCounter = 0>
>               <#list options as option>
>                 <div>${option.description} <#if !option.isAvailable()> (*)</#if></div>
> +                <div>${uiLabelMap.CommonComments}: <input type='text' name='comments_${counter}_${optionCounter}' 
> id='comments_${counter}_${optionCounter}' value='${option.comments?if_exists}' ></div>
> +                <#assign optionCounter = optionCounter + 1>
>               </#list>
>             <#else>
>               <#if question.isSingleChoice()>
> @@ -495,6 +504,7 @@
>                 <#if !question.isMandatory()>
>                   <div><input type="radio" name='${counter}' value='<#if !question.isSelected()>checked</#if>'> No option</div>
>                 </#if>
> +                <#assign optionComment = "">
>                 <#assign optionCounter = 0>
>                 <#list options as option>
>                   <#assign componentCounter = 0>
> @@ -503,6 +513,9 @@
>                   <#else>
>                     <#assign shownPrice = option.price>
>                   </#if>
> +                  <#if option.isSelected()>
> +                    <#assign optionComment = option.getComments()?if_exists>
> +                  </#if>
>                     <#-- Render virtual compoennts -->
>                     <#if option.hasVirtualComponent()>
>                       <div >
> @@ -530,6 +543,7 @@
>                     </#if>
>                   <#assign optionCounter = optionCounter + 1>
>                 </#list>
> +                <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_0' id='comments_${counter}_0' 
> value='${optionComment?if_exists}' /></div>
>                 <#else>
>                 <#-- And this is the select box implementation -->
>                 <select name='${counter}'>
> @@ -538,6 +552,7 @@
>                 </#if>
>                 <#assign options = question.options>
>                 <#assign optionCounter = 0>
> +                <#assign optionComment = "">
>                 <#list options as option>
>                   <#if showOffsetPrice?exists && "Y" == showOffsetPrice>
>                     <#assign shownPrice = option.price - selectedPrice>
> @@ -545,6 +560,7 @@
>                     <#assign shownPrice = option.price>
>                   </#if>
>                   <#if option.isSelected()>
> +                    <#assign optionComment = option.getComments()>
>                     <#assign optionCounter = optionCounter + 1>
>                   </#if>
>                   <option value='${optionCounter}' <#if option.isSelected()>selected</#if>>
> @@ -556,6 +572,7 @@
>                   <#assign optionCounter = optionCounter + 1>
>                 </#list>
>                 </select>
> +                <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_0' id='comments_${counter}_0' 
> value='${optionComment?if_exists}' /></div>
>                 </#if>
>               <#else>
>                 <#-- Multi choice question -->
> @@ -585,13 +602,16 @@
>                       ${option.description} +<@ofbizCurrency amount=option.price isoCode=price.currencyUsed/><#if 
> !option.isAvailable()> (*)</#if>
>                     </div>
>                     </#if>
> +                    <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_${optionCounter}' 
> id='comments_${counter}_${optionCounter}' value='${option.comments?if_exists}'></div>
>                   <#assign optionCounter = optionCounter + 1>
>                 </#list>
>               </#if>
>             </#if>
>             </td>
>           </tr>
> -          <tr><td><hr/></td></tr>
> +          <#if question_has_next>
> +            <tr><td><hr/></td></tr>
> +          </#if>
>           <#assign counter = counter + 1>
>         </#list>
>         </table>
>
> Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java (original)
> +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java Mon Aug 18 06:30:35 2008
> @@ -87,13 +87,41 @@
>         for (int k = 0; k < numOfQuestions; k++) {
>             String[] opts = request.getParameterValues("" + k);
>             if (opts == null) {
> +
> +                //  check for standard item comments
> +                ProductConfigWrapper.ConfigItem question = (ProductConfigWrapper.ConfigItem) configWrapper.getQuestions().get(k);
> +                if (question.isStandard()) {
> +                    int i = 0;
> +                    while (i <= (question.getOptions().size() -1)) {
> +                        String comments = request.getParameter("comments_" + k + "_" + i);
> +                        if (UtilValidate.isNotEmpty(comments)) {
> +                            try {
> +                                configWrapper.setSelected(k, i, comments);
> +                            } catch(Exception e) {
> +                                Debug.logWarning(e.getMessage(), module);
> +                            }
> +                        }
> +                        i++;
> +                    }
> +                }
>                 continue;
>             }
>             for (int h = 0; h < opts.length; h++) {
>                 int cnt = -1;
>                 try {
>                     cnt = Integer.parseInt(opts[h]);
> +                    String comments = null;
> +                    ProductConfigWrapper.ConfigItem question = (ProductConfigWrapper.ConfigItem) 
> configWrapper.getQuestions().get(k);
> +                    if (question.isSingleChoice()) {
> +                        comments = request.getParameter("comments_" + k + "_" + "0");
> +                    } else {
> +                        comments = request.getParameter("comments_" + k + "_" + cnt);
> +                    }
> +
> +                    configWrapper.setSelected(k, cnt, comments);
>                     ProductConfigWrapper.ConfigOption option = configWrapper.getItemOtion(k, cnt);
> +
> +                    //  set selected variant products
>                     if (UtilValidate.isNotEmpty(option) && (option.hasVirtualComponent())) {
>                         List components = option.getComponents();
>                         int variantIndex = 0;
> @@ -105,7 +133,8 @@
>                                 if (UtilValidate.isEmpty(selectedProdcutId)) {
>                                     Debug.logWarning("ERROR: Request param [" + productParamName + "] not found!", module);
>                                 } else {
> -                                    //  handle both types of virtual variant methods
> +
> +                                    //  handle also feature tree virtual variant methods
>                                     if (ProductWorker.isVirtual((GenericDelegator)request.getAttribute("delegator"), 
> selectedProdcutId)) {
>                                         if 
> ("VV_FEATURETREE".equals(ProductWorker.getProductvirtualVariantMethod((GenericDelegator)request.getAttribute("delegator"), 
> selectedProdcutId))) {
>                                             // get the selected features
> @@ -136,10 +165,7 @@
>                                 variantIndex ++;
>                             }
>                         }
> -                    } else {
> -                        configWrapper.setSelected(k, cnt);
> -                    }
> -
> +                    }
>                 } catch(Exception e) {
>                     Debug.logWarning(e.getMessage(), module);
>                 }
> @@ -190,9 +216,12 @@
>                         Iterator selOpIt = selectedOptions.iterator();
>                         while (selOpIt.hasNext()) {
>                             ConfigOption oneOption = (ConfigOption)selOpIt.next();
> -                            String configOptionId = oneOption.configOption.getString("configOptionId");
> +                            String configOptionId = oneOption.configOption.getString("configOptionId");
>                             if (productConfigConfig.getString("configOptionId").equals(configOptionId)) {
> -                                configsToCheck.add(productConfigConfig);
> +                                String comments = oneOption.getComments() != null ? oneOption.getComments() : "";
> +                                if ((UtilValidate.isEmpty(comments) && 
> UtilValidate.isEmpty(productConfigConfig.getString("description"))) || 
> comments.equals(productConfigConfig.getString("description"))) {
> +                                    configsToCheck.add(productConfigConfig);
> +                                }
>                             }
>                         }
>                     }
> @@ -315,11 +344,13 @@
>                     List toBeStored = new LinkedList();
>                     ConfigOption oneOption = (ConfigOption)selOpIt.next();
>                     String configOptionId = oneOption.configOption.getString("configOptionId");
> +                    String description = oneOption.getComments();
>                     GenericValue productConfigConfig = delegator.makeValue("ProductConfigConfig");
>                     productConfigConfig.put("configId", configId);
>                     productConfigConfig.put("configItemId", configItemId);
>                     productConfigConfig.put("sequenceNum", sequenceNum);
>                     productConfigConfig.put("configOptionId", configOptionId);
> +                    productConfigConfig.put("description", description);
>                     toBeStored.add(productConfigConfig);
>
>                     if (oneOption.hasVirtualComponent()) {
>
> Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java
> URL: 
> http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java (original)
> +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java Mon Aug 18 06:30:35 2008
> @@ -145,13 +145,14 @@
>                     String configItemId = pcc.getString("configItemId");
>                     String configOptionId = pcc.getString("configOptionId");
>                     Long sequenceNum = pcc.getLong("sequenceNum");
> -                    this.setSelected(configItemId, sequenceNum, configOptionId);
> +                    String comments = pcc.getString("description");
> +                    this.setSelected(configItemId, sequenceNum, configOptionId, comments);
>                 }
>             }
>         }
>     }
>
> -    public void setSelected(String configItemId, Long sequenceNum, String configOptionId) throws Exception {
> +    public void setSelected(String configItemId, Long sequenceNum, String configOptionId, String comments) throws Exception {
>         for (int i = 0; i < questions.size(); i++) {
>             ConfigItem ci = (ConfigItem)questions.get(i);
>             if (ci.configItemAssoc.getString("configItemId").equals(configItemId) && 
> ci.configItemAssoc.getLong("sequenceNum").equals(sequenceNum)) {
> @@ -159,7 +160,7 @@
>                 for (int j = 0; j < avalOptions.size(); j++) {
>                     ConfigOption oneOption = (ConfigOption)avalOptions.get(j);
>                     if (oneOption.configOption.getString("configOptionId").equals(configOptionId)) {
> -                        setSelected(i, j);
> +                        setSelected(i, j, comments);
>                         break;
>                     }
>                 }
> @@ -175,6 +176,7 @@
>                 for (int j = 0; j < options.size(); j++) {
>                     ConfigOption co = (ConfigOption)options.get(j);
>                     co.setSelected(false);
> +                    co.setComments(null);
>                 }
>             }
>         }
> @@ -233,13 +235,14 @@
>         return product;
>     }
>
> -    public void setSelected(int question, int option) throws Exception {
> +    public void setSelected(int question, int option, String comments) throws Exception {
>         ConfigItem ci = (ConfigItem)questions.get(question);
>         List avalOptions = ci.getOptions();
>         if (ci.isSingleChoice()) {
>             for (int j = 0; j < avalOptions.size(); j++) {
>                 ConfigOption oneOption = (ConfigOption)avalOptions.get(j);
>                 oneOption.setSelected(false);
> +                oneOption.setComments(null);
>             }
>         }
>         ConfigOption theOption = null;
> @@ -248,11 +251,11 @@
>         }
>         if (theOption != null) {
>             theOption.setSelected(true);
> +            theOption.setComments(comments);
>         }
>     }
>
>     public void setSelected(int question, int option, int component, String componentOption) throws Exception {
> -        setSelected(question, option);
>         //  set variant products
>         ConfigOption theOption = getItemOtion(question, option);
>         List components = theOption.getComponents();
> @@ -527,6 +530,7 @@
>         boolean selected = false;
>         boolean available = true;
>         ConfigItem parentConfigItem = null;
> +        String comments = null;  //  comments for production run entered during ordering
>
>         public ConfigOption(GenericDelegator delegator, LocalDispatcher dispatcher, GenericValue option, ConfigItem configItem, 
> String catalogId, String webSiteId, String currencyUomId, GenericValue autoUserLogin) throws Exception {
>             configOption = option;
> @@ -572,6 +576,7 @@
>             optionPrice = co.optionPrice;
>             available = co.available;
>             selected = co.selected;
> +            comments = co.getComments();
>         }
>
>         public void recalculateOptionPrice(ProductConfigWrapper pcw) throws Exception {
> @@ -621,6 +626,14 @@
>             return configOption.getString("configOptionId");
>         }
>
> +        public String getComments() {
> +            return comments;
> +        }
> +
> +        public void setComments(String comments) {
> +            this.comments = comments;
> +        }
> +
>         public double getPrice() {
>             return optionPrice;
>         }
>
> 


Re: svn commit: r686748 - in /ofbiz/trunk/applications: manufacturing/config/ manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ manufacturing/webapp/manufacturing/jobshopmgt/ manufacturing/...

Posted by BJ Freeman <bj...@free-man.net>.
some where there should be a disclaimer that using these comments may
skew the production run evaluations.

bibryam@apache.org sent the following on 8/18/2008 6:30 AM:
> Author: bibryam
> Date: Mon Aug 18 06:30:35 2008
> New Revision: 686748
> 
> URL: http://svn.apache.org/viewvc?rev=686748&view=rev
> Log:
> Add possibility for entering comments for configurable product options. The comments are attached to production runs as notes.
> Thanks to Jacopo and BJ for their comments.
> Internationalization note: this commit contains new UI labels.
> 
> Modified:
>     ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml
>     ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
>     ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy
>     ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml
>     ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml
>     ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl
>     ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java
>     ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java
> 
> Modified: ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml (original)
> +++ ofbiz/trunk/applications/manufacturing/config/ManufacturingUiLabels.xml Mon Aug 18 06:30:35 2008
> @@ -1379,6 +1379,9 @@
>          <value xml:lang="th">รายการของการผลิตสินค้าจากสินทรัพย์ไม่ถาวร</value>
>          <value xml:lang="zh">生产运行固定资产列表</value>
>      </property>
> +    <property key="ManufacturingListOfProductionRunNotes">
> +        <value xml:lang="en">List Of Production Run Notes</value>
> +    </property>    
>      <property key="ManufacturingListOfProductionRunRoutingTasks">
>          <value xml:lang="en">Tasks</value>
>          <value xml:lang="es">Lista de tareas de la corrida de producción</value>
> 
> Modified: ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java (original)
> +++ ofbiz/trunk/applications/manufacturing/src/org/ofbiz/manufacturing/jobshopmgt/ProductionRunServices.java Mon Aug 18 06:30:35 2008
> @@ -2196,6 +2196,25 @@
>                      componentQuantity = new Double(totalQuantity.doubleValue() + componentQuantity.doubleValue());
>                  }
>                  components.put(componentProductId, componentQuantity);
> +                
> +                //  create production run notes from comments
> +                String comments = co.getComments();
> +                if (UtilValidate.isNotEmpty(comments)) {
> +                    resultService.clear();
> +                    serviceContext.clear();
> +                    serviceContext.put("workEffortId", productionRunId);
> +                    serviceContext.put("internalNote", "Y");
> +                    serviceContext.put("noteInfo", comments);
> +                    serviceContext.put("noteName", co.getDescription());
> +                    serviceContext.put("userLogin", userLogin);
> +                    serviceContext.put("noteParty", userLogin.getString("partyId"));                                        
> +                    try {
> +                        resultService = dispatcher.runSync("createWorkEffortNote", serviceContext);
> +                    } catch (GenericServiceException e) {
> +                        Debug.logWarning(e.getMessage(), module);
> +                        return ServiceUtil.returnError(e.getMessage());
> +                    }
> +                }
>              }
>          }
>          
> 
> Modified: ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy (original)
> +++ ofbiz/trunk/applications/manufacturing/webapp/manufacturing/WEB-INF/actions/jobshopmgt/ViewProductionRun.groovy Mon Aug 18 06:30:35 2008
> @@ -63,5 +63,11 @@
>          context.quantity = productionRun.getQuantity(); // this is useful to compute the total estimates runtime in the form
>          //  Product component/parts list
>          context.productionRunComponents = productionRun.getProductionRunComponents();;
> +        
> +        // Find all the notes linked to this production run.
> +        productionRunNoteData = delegator.findByAnd("WorkEffortNoteAndData", [workEffortId : productionRunId]);
> +        if (productionRunNoteData) {
> +            context.productionRunNoteData = productionRunNoteData;
> +        }        
>      }
>  }
> 
> Modified: ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml (original)
> +++ ofbiz/trunk/applications/manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml Mon Aug 18 06:30:35 2008
> @@ -520,6 +520,15 @@
>              <display-entity entity-name="StatusItem" />
>          </field>
>      </form>
> +    <form name="ListProductionRunNotes" type="list" title="" list-name="productionRunNoteData"
> +        odd-row-style="alternate-row" default-table-style="basic-table hover-bar">
> +        <auto-fields-entity entity-name="WorkEffortNoteAndData" default-field-type="display" />
> +        <field name="workEffortId"><hidden/></field>
> +        <field name="internalNote"><hidden/></field>
> +        <field name="noteId"><hidden/></field>
> +        <field name="noteParty"><hidden/></field>
> +        <field name="noteDateTime"><hidden/></field>
> +    </form>     
>      <form name="EditProductionRunTaskFixedAsset" type="single" target="EditProductionRun" title="" default-map-name="fixedAssetData"
>          header-row-style="header-row" default-table-style="basic-table">
>          <alt-target use-when="declarationScreen.equals(&quot;Y&quot;)" target="ProductionRunDeclaration" />
> 
> Modified: ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml (original)
> +++ ofbiz/trunk/applications/manufacturing/widget/manufacturing/JobshopScreens.xml Mon Aug 18 06:30:35 2008
> @@ -177,7 +177,21 @@
>                                      </widgets>
>                                  </section>
>                              </container>
> -                           </container>                        
> +                        </container>
> +                        <container style="screenlet">
> +                            <container style="screenlet-title-bar">
> +                                <container style="h3">
> +                                    <label text="${uiLabelMap.ManufacturingListOfProductionRunNotes}"/>
> +                                </container>
> +                            </container>
> +                            <container style="screenlet-body">
> +                                <section>
> +                                    <widgets>                                        
> +                                        <include-form name="ListProductionRunNotes" location="component://manufacturing/webapp/manufacturing/jobshopmgt/ProductionRunForms.xml"/>
> +                                    </widgets>
> +                                </section>
> +                            </container>
> +                        </container>
>                      </decorator-section>
>                  </decorator-screen>
>              </widgets>
> 
> Modified: ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl (original)
> +++ ofbiz/trunk/applications/order/webapp/ordermgr/entry/catalog/configproductdetail.ftl Mon Aug 18 06:30:35 2008
> @@ -140,7 +140,13 @@
>  });
>  
>  function getConfigDetails(event) {
> -        new Ajax.Request('/ordermgr/control/getConfigDetailsEvent',{parameters: $('configFormId').serialize(),  requestHeaders: {Accept: 'application/json'},
> +       var element = Event.element(event);
> +       if (element.identify().startsWith('comments_')) {
> +         //  don't update the price for comment change
> +         return;
> +       }
> +
> +       new Ajax.Request('/ordermgr/control/getConfigDetailsEvent',{parameters: $('configFormId').serialize(),  requestHeaders: {Accept: 'application/json'},
>          
>             onSuccess: function(transport){     
>                  var data = transport.responseText.evalJSON(true);
> @@ -477,8 +483,11 @@
>              <#if question.isStandard()>
>                <#-- Standard item: all the options are always included -->
>                <#assign options = question.options>
> +              <#assign optionCounter = 0>              
>                <#list options as option>
>                  <div>${option.description} <#if !option.isAvailable()> (*)</#if></div>
> +                <div>${uiLabelMap.CommonComments}: <input type='text' name='comments_${counter}_${optionCounter}' id='comments_${counter}_${optionCounter}' value='${option.comments?if_exists}' ></div>                                  
> +                <#assign optionCounter = optionCounter + 1>                 
>                </#list>
>              <#else>
>                <#if question.isSingleChoice()>
> @@ -495,6 +504,7 @@
>                  <#if !question.isMandatory()>
>                    <div><input type="radio" name='${counter}' value='<#if !question.isSelected()>checked</#if>'> No option</div>
>                  </#if>
> +                <#assign optionComment = "">
>                  <#assign optionCounter = 0>              
>                  <#list options as option>
>                    <#assign componentCounter = 0>                  
> @@ -503,6 +513,9 @@
>                    <#else>
>                      <#assign shownPrice = option.price>
>                    </#if>
> +                  <#if option.isSelected()>
> +                    <#assign optionComment = option.getComments()?if_exists>
> +                  </#if>                   
>                      <#-- Render virtual compoennts -->
>                      <#if option.hasVirtualComponent()>
>                        <div >
> @@ -530,6 +543,7 @@
>                      </#if>
>                    <#assign optionCounter = optionCounter + 1>
>                  </#list>
> +                <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_0' id='comments_${counter}_0' value='${optionComment?if_exists}' /></div>                
>                  <#else>
>                  <#-- And this is the select box implementation -->
>                  <select name='${counter}'>
> @@ -538,6 +552,7 @@
>                  </#if>
>                  <#assign options = question.options>
>                  <#assign optionCounter = 0>
> +                <#assign optionComment = "">
>                  <#list options as option>
>                    <#if showOffsetPrice?exists && "Y" == showOffsetPrice>
>                      <#assign shownPrice = option.price - selectedPrice>
> @@ -545,6 +560,7 @@
>                      <#assign shownPrice = option.price>
>                    </#if>
>                    <#if option.isSelected()>
> +                    <#assign optionComment = option.getComments()>
>                      <#assign optionCounter = optionCounter + 1>
>                    </#if>
>                    <option value='${optionCounter}' <#if option.isSelected()>selected</#if>>
> @@ -556,6 +572,7 @@
>                    <#assign optionCounter = optionCounter + 1>
>                  </#list>
>                  </select>
> +                <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_0' id='comments_${counter}_0' value='${optionComment?if_exists}' /></div>                 
>                  </#if>
>                <#else>
>                  <#-- Multi choice question -->
> @@ -585,13 +602,16 @@
>                        ${option.description} +<@ofbizCurrency amount=option.price isoCode=price.currencyUsed/><#if !option.isAvailable()> (*)</#if>
>                      </div>
>                      </#if>
> +                    <div>${uiLabelMap.CommonComments}: <input type="text" name='comments_${counter}_${optionCounter}' id='comments_${counter}_${optionCounter}' value='${option.comments?if_exists}'></div>                    
>                    <#assign optionCounter = optionCounter + 1>
>                  </#list>
>                </#if>
>              </#if>
>              </td>
>            </tr>
> -          <tr><td><hr/></td></tr>
> +          <#if question_has_next>
> +            <tr><td><hr/></td></tr>
> +          </#if>
>            <#assign counter = counter + 1>
>          </#list>
>          </table>
> 
> Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java (original)
> +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWorker.java Mon Aug 18 06:30:35 2008
> @@ -87,13 +87,41 @@
>          for (int k = 0; k < numOfQuestions; k++) {
>              String[] opts = request.getParameterValues("" + k);
>              if (opts == null) {
> +                
> +                //  check for standard item comments
> +                ProductConfigWrapper.ConfigItem question = (ProductConfigWrapper.ConfigItem) configWrapper.getQuestions().get(k);
> +                if (question.isStandard()) {
> +                    int i = 0;
> +                    while (i <= (question.getOptions().size() -1)) {
> +                        String comments = request.getParameter("comments_" + k + "_" + i);
> +                        if (UtilValidate.isNotEmpty(comments)) {
> +                            try {
> +                                configWrapper.setSelected(k, i, comments);
> +                            } catch(Exception e) {
> +                                Debug.logWarning(e.getMessage(), module);
> +                            }                            
> +                        }
> +                        i++;
> +                    }
> +                }
>                  continue;
>              }
>              for (int h = 0; h < opts.length; h++) {
>                  int cnt = -1;
>                  try {
>                      cnt = Integer.parseInt(opts[h]);
> +                    String comments = null;
> +                    ProductConfigWrapper.ConfigItem question = (ProductConfigWrapper.ConfigItem) configWrapper.getQuestions().get(k);
> +                    if (question.isSingleChoice()) {
> +                        comments = request.getParameter("comments_" + k + "_" + "0");
> +                    } else {
> +                        comments = request.getParameter("comments_" + k + "_" + cnt);
> +                    }
> +                                        
> +                    configWrapper.setSelected(k, cnt, comments);
>                      ProductConfigWrapper.ConfigOption option = configWrapper.getItemOtion(k, cnt);
> +                    
> +                    //  set selected variant products 
>                      if (UtilValidate.isNotEmpty(option) && (option.hasVirtualComponent())) {
>                          List components = option.getComponents();
>                          int variantIndex = 0;
> @@ -105,7 +133,8 @@
>                                  if (UtilValidate.isEmpty(selectedProdcutId)) {
>                                      Debug.logWarning("ERROR: Request param [" + productParamName + "] not found!", module);
>                                  } else {
> -                                    //  handle both types of virtual variant methods
> +                                    
> +                                    //  handle also feature tree virtual variant methods
>                                      if (ProductWorker.isVirtual((GenericDelegator)request.getAttribute("delegator"), selectedProdcutId)) {
>                                          if ("VV_FEATURETREE".equals(ProductWorker.getProductvirtualVariantMethod((GenericDelegator)request.getAttribute("delegator"), selectedProdcutId))) {
>                                              // get the selected features
> @@ -136,10 +165,7 @@
>                                  variantIndex ++;
>                              }
>                          }
> -                    } else {
> -                        configWrapper.setSelected(k, cnt);
> -                    }
> -
> +                    } 
>                  } catch(Exception e) {
>                      Debug.logWarning(e.getMessage(), module);
>                  }
> @@ -190,9 +216,12 @@
>                          Iterator selOpIt = selectedOptions.iterator();
>                          while (selOpIt.hasNext()) {
>                              ConfigOption oneOption = (ConfigOption)selOpIt.next();
> -                            String configOptionId = oneOption.configOption.getString("configOptionId");
> +                            String configOptionId = oneOption.configOption.getString("configOptionId");                            
>                              if (productConfigConfig.getString("configOptionId").equals(configOptionId)) {
> -                                configsToCheck.add(productConfigConfig);
> +                                String comments = oneOption.getComments() != null ? oneOption.getComments() : "";
> +                                if ((UtilValidate.isEmpty(comments) && UtilValidate.isEmpty(productConfigConfig.getString("description"))) || comments.equals(productConfigConfig.getString("description"))) {
> +                                    configsToCheck.add(productConfigConfig);
> +                                }                                                               
>                              }
>                          } 
>                      }
> @@ -315,11 +344,13 @@
>                      List toBeStored = new LinkedList();
>                      ConfigOption oneOption = (ConfigOption)selOpIt.next();
>                      String configOptionId = oneOption.configOption.getString("configOptionId");
> +                    String description = oneOption.getComments();
>                      GenericValue productConfigConfig = delegator.makeValue("ProductConfigConfig");
>                      productConfigConfig.put("configId", configId);
>                      productConfigConfig.put("configItemId", configItemId);
>                      productConfigConfig.put("sequenceNum", sequenceNum);
>                      productConfigConfig.put("configOptionId", configOptionId);
> +                    productConfigConfig.put("description", description);                    
>                      toBeStored.add(productConfigConfig);
>  
>                      if (oneOption.hasVirtualComponent()) {                        
> 
> Modified: ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java?rev=686748&r1=686747&r2=686748&view=diff
> ==============================================================================
> --- ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java (original)
> +++ ofbiz/trunk/applications/product/src/org/ofbiz/product/config/ProductConfigWrapper.java Mon Aug 18 06:30:35 2008
> @@ -145,13 +145,14 @@
>                      String configItemId = pcc.getString("configItemId");
>                      String configOptionId = pcc.getString("configOptionId");
>                      Long sequenceNum = pcc.getLong("sequenceNum");
> -                    this.setSelected(configItemId, sequenceNum, configOptionId);
> +                    String comments = pcc.getString("description");
> +                    this.setSelected(configItemId, sequenceNum, configOptionId, comments);
>                  }
>              }
>          }
>      }
>  
> -    public void setSelected(String configItemId, Long sequenceNum, String configOptionId) throws Exception {
> +    public void setSelected(String configItemId, Long sequenceNum, String configOptionId, String comments) throws Exception {
>          for (int i = 0; i < questions.size(); i++) {
>              ConfigItem ci = (ConfigItem)questions.get(i);
>              if (ci.configItemAssoc.getString("configItemId").equals(configItemId) && ci.configItemAssoc.getLong("sequenceNum").equals(sequenceNum)) {
> @@ -159,7 +160,7 @@
>                  for (int j = 0; j < avalOptions.size(); j++) {
>                      ConfigOption oneOption = (ConfigOption)avalOptions.get(j);
>                      if (oneOption.configOption.getString("configOptionId").equals(configOptionId)) {
> -                        setSelected(i, j);
> +                        setSelected(i, j, comments);
>                          break;
>                      }
>                  }
> @@ -175,6 +176,7 @@
>                  for (int j = 0; j < options.size(); j++) {
>                      ConfigOption co = (ConfigOption)options.get(j);
>                      co.setSelected(false);
> +                    co.setComments(null);
>                  }
>              }
>          }
> @@ -233,13 +235,14 @@
>          return product;
>      }
>      
> -    public void setSelected(int question, int option) throws Exception {
> +    public void setSelected(int question, int option, String comments) throws Exception {
>          ConfigItem ci = (ConfigItem)questions.get(question);
>          List avalOptions = ci.getOptions();
>          if (ci.isSingleChoice()) {
>              for (int j = 0; j < avalOptions.size(); j++) {
>                  ConfigOption oneOption = (ConfigOption)avalOptions.get(j);
>                  oneOption.setSelected(false);
> +                oneOption.setComments(null);
>              }
>          }
>          ConfigOption theOption = null;
> @@ -248,11 +251,11 @@
>          }
>          if (theOption != null) {
>              theOption.setSelected(true);
> +            theOption.setComments(comments);
>          }
>      }
>      
>      public void setSelected(int question, int option, int component, String componentOption) throws Exception {
> -        setSelected(question, option);
>          //  set variant products
>          ConfigOption theOption = getItemOtion(question, option);
>          List components = theOption.getComponents();
> @@ -527,6 +530,7 @@
>          boolean selected = false;
>          boolean available = true;
>          ConfigItem parentConfigItem = null;
> +        String comments = null;  //  comments for production run entered during ordering
>          
>          public ConfigOption(GenericDelegator delegator, LocalDispatcher dispatcher, GenericValue option, ConfigItem configItem, String catalogId, String webSiteId, String currencyUomId, GenericValue autoUserLogin) throws Exception {
>              configOption = option;
> @@ -572,6 +576,7 @@
>              optionPrice = co.optionPrice;
>              available = co.available;
>              selected = co.selected;
> +            comments = co.getComments();
>          }
>          
>          public void recalculateOptionPrice(ProductConfigWrapper pcw) throws Exception {
> @@ -621,6 +626,14 @@
>              return configOption.getString("configOptionId");
>          }
>          
> +        public String getComments() {
> +            return comments;
> +        }
> +        
> +        public void setComments(String comments) {
> +            this.comments = comments;
> +        }
> +        
>          public double getPrice() {
>              return optionPrice;
>          }
> 
> 
> 
> 
>