svn commit: r1153071 [2/3] - in /ofbiz/trunk/specialpurpose/scrum: data/ entitydef/ script/org/ofbiz/scrum/ servicedef/ webapp/scrum/WEB-INF/actions/ widget/

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

svn commit: r1153071 [2/3] - in /ofbiz/trunk/specialpurpose/scrum: data/ entitydef/ script/org/ofbiz/scrum/ servicedef/ webapp/scrum/WEB-INF/actions/ widget/

hansbak-2
Modified: ofbiz/trunk/specialpurpose/scrum/script/org/ofbiz/scrum/ScrumServices.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/script/org/ofbiz/scrum/ScrumServices.xml?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/script/org/ofbiz/scrum/ScrumServices.xml (original)
+++ ofbiz/trunk/specialpurpose/scrum/script/org/ofbiz/scrum/ScrumServices.xml Tue Aug  2 09:00:06 2011
@@ -51,7 +51,7 @@
                             </condition-list>
                         </condition-list>
                     </condition-list>
-                    <order-by field-name="sequenceNum" />
+                    <order-by field-name="custSequenceNum" />
                 </entity-condition>
                 <else>
                     <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem">
@@ -67,7 +67,7 @@
                             <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/>
                             <condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>
                         </condition-list>
-                        <order-by field-name="sequenceNum" />
+                        <order-by field-name="custSequenceNum" />
                     </entity-condition>
                 </else>
             </if-compare>
@@ -75,16 +75,16 @@
                 <if-compare operator="equals" value="${parameters.custRequestId}"
                     field="custReq[i].custRequestId">
                     <if-compare operator="not-equals" value="0" field="i">
-                        <set field="temp" from-field="custReq[i].sequenceNum" /><log level="always" message="$$$$$$$$$ temp : ${temp}"></log>
-                        <set field="custReq[i].sequenceNum" from-field="custReq[i-1].sequenceNum" />
-                        <set field="custReq[i-1].sequenceNum" from-field="temp" />
+                        <set field="temp" from-field="custReq[i].custSequenceNum" /><log level="always" message="$$$$$$$$$ temp : ${temp}"></log>
+                        <set field="custReq[i].custSequenceNum" from-field="custReq[i-1].custSequenceNum" />
+                        <set field="custReq[i-1].custSequenceNum" from-field="temp" />
 
                         <entity-one value-field="firstup" entity-name="CustRequest">
                             <field-map field-name="custRequestId" from-field="custReq[i].custRequestId" />
                         </entity-one><log level="always" message="666666666666666666666 firstup : ${firstup}"></log>
-                        <set field="firstup.sequenceNum" from-field="custReq[i].sequenceNum" />
+                        <set field="firstup.custSequenceNum" from-field="custReq[i].custSequenceNum" />
                         <if-empty field="firstup">
-                            <add-error><fail-message message="Cannot find with ID [${custReq[i].custRequestId}] and sequenceNum [${custReq[i].sequenceNum}]"/></add-error>
+                            <add-error><fail-message message="Cannot find with ID [${custReq[i].custRequestId}] and custSequenceNum [${custReq[i].custSequenceNum}]"/></add-error>
                             <check-errors/>
                                 <else>
                                     <store-value value-field="firstup" />
@@ -94,9 +94,9 @@
                         <entity-one value-field="lastup" entity-name="CustRequest">
                             <field-map field-name="custRequestId" from-field="custReq[i-1].custRequestId" />
                         </entity-one>
-                        <set field="lastup.sequenceNum" from-field="custReq[i-1].sequenceNum" />
+                        <set field="lastup.custSequenceNum" from-field="custReq[i-1].custSequenceNum" />
                         <if-empty field="lastup">
-                            <add-error><fail-message message="Cannot find with ID [${custReq[i-1].custRequestId}] and sequenceNum [${custReq[i-1].sequenceNum}]"/></add-error>
+                            <add-error><fail-message message="Cannot find with ID [${custReq[i-1].custRequestId}] and custSequenceNum [${custReq[i-1].custSequenceNum}]"/></add-error>
                             <check-errors/>
                                 <else>
                                     <store-value value-field="lastup" />
@@ -132,7 +132,7 @@
                             </condition-list>
                         </condition-list>
                     </condition-list>
-                    <order-by field-name="sequenceNum" />
+                    <order-by field-name="custSequenceNum" />
                 </entity-condition>
                 <else>
                     <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem">
@@ -148,7 +148,7 @@
                             <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/>
                             <condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>
                         </condition-list>
-                        <order-by field-name="sequenceNum" />
+                        <order-by field-name="custSequenceNum" />
                     </entity-condition>
                 </else>
             </if-compare>
@@ -157,16 +157,16 @@
                     field="custReq[i].custRequestId">
                     <if-compare operator="not-equals" value="${getnum-1}"
                         field="i">
-                        <set field="temp" from-field="custReq[i].sequenceNum" />
-                        <set field="custReq[i].sequenceNum" from-field="custReq[i+1].sequenceNum" />
-                        <set field="custReq[i+1].sequenceNum" from-field="temp" />
+                        <set field="temp" from-field="custReq[i].custSequenceNum" />
+                        <set field="custReq[i].custSequenceNum" from-field="custReq[i+1].custSequenceNum" />
+                        <set field="custReq[i+1].custSequenceNum" from-field="temp" />
 
                         <entity-one value-field="first" entity-name="CustRequest">
                             <field-map field-name="custRequestId" from-field="custReq[i].custRequestId" />
                         </entity-one>
-                        <set field="first.sequenceNum" from-field="custReq[i].sequenceNum" />
+                        <set field="first.custSequenceNum" from-field="custReq[i].custSequenceNum" />
                         <if-empty field="first">
-                            <add-error><fail-message message="Cannot find with ID [${custReq[i].custRequestId}] and sequenceNum [${custReq[i].sequenceNum}]"/></add-error>
+                            <add-error><fail-message message="Cannot find with ID [${custReq[i].custRequestId}] and custSequenceNum [${custReq[i].custSequenceNum}]"/></add-error>
                             <check-errors/>
                                 <else>
                                     <store-value value-field="first" />
@@ -176,9 +176,9 @@
                         <entity-one value-field="last" entity-name="CustRequest">
                             <field-map field-name="custRequestId" from-field="custReq[i+1].custRequestId" />
                         </entity-one>
-                        <set field="last.sequenceNum" from-field="custReq[i+1].sequenceNum" />
+                        <set field="last.custSequenceNum" from-field="custReq[i+1].custSequenceNum" />
                         <if-empty field="last">
-                            <add-error><fail-message message="Cannot find with ID [${custReq[i+1].custRequestId}] and sequenceNum [${custReq[i+1].sequenceNum}]"/></add-error>
+                            <add-error><fail-message message="Cannot find with ID [${custReq[i+1].custRequestId}] and custSequenceNum [${custReq[i+1].custSequenceNum}]"/></add-error>
                             <check-errors/>
                                 <else>
                                     <store-value value-field="last" />
@@ -214,7 +214,7 @@
                             </condition-list>
                         </condition-list>
                     </condition-list>
-                    <order-by field-name="sequenceNum" />
+                    <order-by field-name="custSequenceNum" />
                 </entity-condition>
                 <else>
                     <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem">
@@ -230,7 +230,7 @@
                             <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/>
                             <condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>
                         </condition-list>
-                        <order-by field-name="sequenceNum" />
+                        <order-by field-name="custSequenceNum" />
                     </entity-condition>
                 </else>
             </if-compare>
@@ -249,10 +249,10 @@
                 <entity-one value-field="custReqBottom" entity-name="CustRequest">
                     <field-map field-name="custRequestId" from-field="custReq[j].custRequestId" />
                 </entity-one>
-                <set field="custReqBottom.sequenceNum" from-field="custReq[j+1].sequenceNum"
+                <set field="custReqBottom.custSequenceNum" from-field="custReq[j+1].custSequenceNum"
                     type="Long" />
                 <if-empty field="custReqBottom">
-                    <add-error><fail-message message="Cannot find with ID [${custReq[j].custRequestId}] and sequenceNum [${custReq[j+1].sequenceNum}]"/></add-error>
+                    <add-error><fail-message message="Cannot find with ID [${custReq[j].custRequestId}] and custSequenceNum [${custReq[j+1].custSequenceNum}]"/></add-error>
                     <check-errors/>
                         <else>
                             <store-value value-field="custReqBottom" />
@@ -263,10 +263,10 @@
             <entity-one value-field="updatetop" entity-name="CustRequest">
                 <field-map field-name="custRequestId" from-field="selectedCustReq.custRequestId" />
             </entity-one>
-            <set field="updatetop.sequenceNum" from-field="topCustReq.sequenceNum"
+            <set field="updatetop.custSequenceNum" from-field="topCustReq.custSequenceNum"
                 type="Long" />
             <if-empty field="updatetop">
-                <add-error><fail-message message="Cannot find with ID [${selectedCustReq.custRequestId}] and sequenceNum [${topCustReq.sequenceNum}]"/></add-error>
+                <add-error><fail-message message="Cannot find with ID [${selectedCustReq.custRequestId}] and custSequenceNum [${topCustReq.custSequenceNum}]"/></add-error>
                 <check-errors/>
                     <else>
                         <store-value value-field="updatetop" />
@@ -299,7 +299,7 @@
                             </condition-list>
                         </condition-list>
                     </condition-list>
-                    <order-by field-name="sequenceNum" />
+                    <order-by field-name="custSequenceNum" />
                 </entity-condition>
                 <else>
                     <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem">
@@ -315,7 +315,7 @@
                             <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/>
                             <condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>
                         </condition-list>
-                        <order-by field-name="sequenceNum" />
+                        <order-by field-name="custSequenceNum" />
                     </entity-condition>
                 </else>
             </if-compare>
@@ -331,7 +331,7 @@
                 </if-compare-field>
             </loop>
             <loop count="${diffIndex}" field="j"><log level="always" message="////////// j : ${j}"></log>
-                <set field="lowerSeqNum" from-field="custReq[j+selectedIndex].sequenceNum" />
+                <set field="lowerSeqNum" from-field="custReq[j+selectedIndex].custSequenceNum" />
 
                 <entity-one value-field="update" entity-name="CustRequest">
                     <field-map field-name="custRequestId"
@@ -343,7 +343,7 @@
                     <check-errors/>
                     -->
                     <else>
-                        <set field="update.sequenceNum" from-field="lowerSeqNum" type="Long" />
+                        <set field="update.custSequenceNum" from-field="lowerSeqNum" type="Long" />
                         <store-value value-field="update" />
                     </else>
                 </if-empty>
@@ -353,11 +353,11 @@
             </entity-one>
             <if-empty field="update2">
                 <!--
-                <add-error><fail-message message="Cannot find with ID [${selectedCustReq.custRequestId}] and sequenceNum [${bottomCustReq.sequenceNum}]"/></add-error>
+                <add-error><fail-message message="Cannot find with ID [${selectedCustReq.custRequestId}] and custSequenceNum [${bottomCustReq.custSequenceNum}]"/></add-error>
                 <check-errors/>
                 -->
                     <else>
-                        <set field="update2.sequenceNum" from-field="bottomCustReq.sequenceNum" type="Long" />
+                        <set field="update2.custSequenceNum" from-field="bottomCustReq.custSequenceNum" type="Long" />
                         <store-value value-field="update2" />
                     </else>
             </if-empty>
@@ -849,7 +849,7 @@
                         <field-map field-name="custRequestId" from-field="custRequestWorkEffortMap.custRequestId"/>
                     </entity-one>
                     <set field="planHoursIn" from-field="planHours" type="Double"/>
-                    <set field="custRequestMap.estimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
+                    <set field="custRequestMap.custEstimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
                     <store-value value-field="custRequestMap"/>
                     <else>
                         <if-compare-field field="initPlanHours"  operator="greater" to-field="planHours"  type="Double">
@@ -857,7 +857,7 @@
                                 <field-map field-name="custRequestId" from-field="custRequestWorkEffortMap.custRequestId"/>
                             </entity-one>
                             <set field="planHoursIn" from-field="planHours" type="Double"/>
-                            <set field="custRequestMap.estimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
+                            <set field="custRequestMap.custEstimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
                             <store-value value-field="custRequestMap"/>
                         </if-compare-field>
                     </else>
@@ -991,6 +991,28 @@
                         </if-not-empty>
                     </else>
                 </if-empty>
+                <if-empty field="taskIdCond">
+                    <entity-condition list="tasks" entity-name="CustRequestAndWorkEffort">
+                        <condition-list combine="and">
+                            <condition-expr field-name="custRequestId" from-field="parameters.custRequestId"/>
+                            <condition-list combine="or">
+                                <condition-expr field-name="workEffortTypeId" operator="equals" value="SCRUM_TASK_ERROR" />
+                                <condition-expr field-name="workEffortTypeId" operator="equals" value="SCRUM_TASK_IMPL" />
+                                <condition-expr field-name="workEffortTypeId" operator="equals" value="SCRUM_TASK_INST" />
+                                <condition-expr field-name="workEffortTypeId" operator="equals" value="SCRUM_TASK_TEST" />
+                            </condition-list>
+                        </condition-list>
+                    </entity-condition>
+                    <if-not-empty field="tasks">
+                         <iterate entry="task" list="tasks">
+                             <set field="taskIdCond[+0]" from-field="task.workEffortId" />
+                         </iterate>
+                         <entity-condition list="timeEntries" entity-name="TimeEntry">
+                             <condition-expr field-name="workEffortId" operator="in" from-field="taskIdCond" />
+                             <order-by field-name="workEffortId" />
+                         </entity-condition>
+                     </if-not-empty>
+                </if-empty>
             </then>
         </if>
         
@@ -1185,6 +1207,7 @@
     </simple-method>
     <simple-method method-name="addProductTimeToNewInvoice"
         short-description="add all reported time on all completed timesheets from all workefforts for a product">
+        <set field="billingItemList" type="List"/>
         <!-- recreate the invoice if still in preparation in order to correct errors. -->
         <if-compare operator="equals" value="Y" field="parameters.reCreate">
             <entity-one entity-name="Invoice" value-field="invoice" />
@@ -1238,6 +1261,9 @@
         </if-empty>
         <if-compare field="parameters.includeMeeting" operator="equals" value="N">
             <set field="custRequestTypeId" value="RF_SCRUM_MEETINGS"/>
+            <else>
+                <set field="custRequestTypeId" value=""/>
+            </else>
         </if-compare>
         <!-- get tasks from backlog item -->
         <entity-condition entity-name="ProjectSprintBacklogTaskAndTimeEntryTimeSheet"
@@ -1246,12 +1272,23 @@
                 <condition-expr field-name="productId" operator="equals" from-field="parameters.productId" />
                 <condition-expr field-name="invoiceId" operator="equals" from-field="nullField" />
                 <condition-expr field-name="timesheetStatusId" operator="equals" value="TIMESHEET_COMPLETED" />
-                <condition-expr field-name="custRequestTypeId" operator="not-equals" from-field="custRequestTypeId" ignore-if-empty="true"/>
+                <condition-expr field-name="custRequestTypeId" operator="not-equals" from-field="custRequestTypeId" ignore-if-empty="true" ignore-if-null="true"/>
+                <condition-expr field-name="fromDate" operator="greater-equals" from-field="parameters.fromDate" ignore-if-empty="true" />
+                <condition-expr field-name="fromDate" operator="less" from-field="parameters.thruDate" ignore-if-empty="true" />
+                <condition-expr field-name="partyId" operator="in" from-field="partyIdAllInCompany" />
+            </condition-list>
+        </entity-condition>
+        <!-- get tasks from cancelled backlog item -->
+        <entity-condition list="cancelledBacklogTasks" entity-name="CancelledBacklogsTaskAndTimeEntryTimeSheet">
+            <condition-list combine="and">
+                <condition-expr field-name="productId" operator="equals" from-field="parameters.productId" />
+                <condition-expr field-name="invoiceId" operator="equals" from-field="nullField" />
+                <condition-expr field-name="timesheetStatusId" operator="equals" value="TIMESHEET_COMPLETED" />
+                <condition-expr field-name="custRequestTypeId" operator="not-equals" from-field="custRequestTypeId" ignore-if-empty="true" ignore-if-null="true"/>
                 <condition-expr field-name="fromDate" operator="greater-equals" from-field="parameters.fromDate" ignore-if-empty="true" />
                 <condition-expr field-name="fromDate" operator="less" from-field="parameters.thruDate" ignore-if-empty="true" />
                 <condition-expr field-name="partyId" operator="in" from-field="partyIdAllInCompany" />
             </condition-list>
-            <order-by field-name="productId" />
         </entity-condition>
         <!-- get unplanned task -->
         <entity-condition list="unplannedTasks" entity-name="UnPlannedBacklogsTaskAndTimeEntryTimeSheet">
@@ -1259,7 +1296,6 @@
                 <condition-expr field-name="productId" operator="equals" from-field="parameters.productId" />
                 <condition-expr field-name="invoiceId" operator="equals" from-field="nullField" />
                 <condition-expr field-name="timesheetStatusId" operator="equals" value="TIMESHEET_COMPLETED" />
-                <condition-expr field-name="custRequestTypeId" operator="not-equals" from-field="custRequestTypeId" ignore-if-empty="true"/>
                 <condition-expr field-name="fromDate" operator="greater-equals" from-field="parameters.fromDate" ignore-if-empty="true" />
                 <condition-expr field-name="fromDate" operator="less" from-field="parameters.thruDate" ignore-if-empty="true" />
                 <condition-expr field-name="partyId" operator="in" from-field="partyIdAllInCompany" />
@@ -1267,6 +1303,7 @@
         </entity-condition>
         <call-class-method class-name="javolution.util.FastList" method-name="newInstance" ret-field="tasks"/>
         <set field="isAddAll" value="${groovy:tasks.addAll(sprintTasks)}"/>
+        <set field="isAddAll" value="${groovy:tasks.addAll(cancelledBacklogTasks)}"/>
         <set field="isAddAll" value="${groovy:tasks.addAll(unplannedTasks)}"/>
         <if-empty field="tasks">
             <add-error>
@@ -1274,17 +1311,23 @@
             </add-error>
             <check-errors />
         </if-empty>
+        <set field="orderBy" value="${groovy: orderBy = ['productId','custRequestId','taskId','fromDate']}" type="List"/>
+        <call-class-method method-name="sortMaps" class-name="org.ofbiz.base.util.UtilMisc" ret-field="tasks">
+            <field field="tasks" type="List"/>
+            <field field="orderBy" type="List"/>
+        </call-class-method>
         <iterate entry="task" list="tasks">
             <if-empty field="notFirst">
                 <!-- first time so create invoice -->
-                <set-service-fields service-name="addWorkEffortTimeToNewInvoice"
+                <set-service-fields service-name="scrumAddWorkEffortTimeToNewInvoice"
                     map="parameters" to-map="addTaskToNewInvoice" />
                 <set field="addTaskToNewInvoice.workEffortId" from-field="task.taskId" />
                 <set field="addTaskToNewInvoice.combineInvoiceItem" value="Y" />
                 <set field="addTaskToNewInvoice.thruDate" from-field="parameters.thruDate" />
-                <call-service service-name="addWorkEffortTimeToNewInvoice"
+                <call-service service-name="scrumAddWorkEffortTimeToNewInvoice"
                     in-map-name="addTaskToNewInvoice">
                     <result-to-field result-name="invoiceId" field="parameters.invoiceId" />
+                    <result-to-field result-name="billingMap" field="setBillingMap" />
                 </call-service>
                 <set field="addTaskToInvoice.combineInvoiceItem" value="Y" />
                 <field-to-result field="parameters.invoiceId"
@@ -1303,16 +1346,264 @@
                             <!-- add to created invoice -->
                             <set field="addTaskToInvoice.combineInvoiceItem" value="Y" />
                             <set field="addTaskToInvoice.invoiceId" from-field="parameters.invoiceId" />
-                            <set field="addTaskToInvoice.invoiceDate" from-field="parameters.invoiceDate" />
                             <set field="addTaskToInvoice.workEffortId" from-field="task.taskId" />
                             <set field="addTaskToInvoice.thruDate" from-field="parameters.thruDate" />
-                            <call-service service-name="addWorkEffortTimeToInvoice"
-                                in-map-name="addTaskToInvoice" />
+                            <call-service service-name="scrumAddWorkEffortTimeToInvoice"
+                                in-map-name="addTaskToInvoice">
+                                <result-to-field result-name="billingMap" field="setBillingMap" />
+                            </call-service>
                         </then>
                     </if>
                     <set field="oldWorkeffortId" from-field="task.taskId" />
                 </else>
             </if-empty>
+            <if-not-empty field="setBillingMap">
+                <field-to-list list="billingItemList" field="setBillingMap"/>
+            </if-not-empty>
+        </iterate>
+        <!-- Check the billing option in CustRequest -->
+        <set field="billingItemIndexList" type="List"/>
+        <set field="realBillingItemList" type="List"/>
+        <set field="billingItemListSize" value="${groovy: billingItemList.size();}" type="Double"/>
+        <if-not-empty field="billingItemList">
+            <iterate entry="billingItemMap" list="billingItemList">
+                <field-to-list list="billingItemIndexList" field="billingItemMap.invoiceItemSeqId"/>
+            </iterate>
+        </if-not-empty>
+        <if-not-empty field="billingItemIndexList">
+            <set field="billingItemIndexToSet" value="${groovy: import java.util.Set; new HashSet(billingItemIndexList);}"/>
+            <set field="billingItemIndexList" from-field="billingItemIndexToSet" type="List"/>
+            <iterate entry="billingItemIndexMap" list="billingItemIndexList">
+                <set field="inputMap" type="NewMap"/>
+                <loop count="${billingItemListSize}" field="i">
+                    <if>
+                        <condition>
+                            <and>
+                                <if-compare-field field="billingItemList[i].invoiceItemSeqId" operator="equals" to-field="billingItemIndexMap" type="Integer"/>
+                                <if-empty field="inputMap"/>
+                            </and>
+                        </condition>
+                        <then>
+                            <set field="inputMap" from-field="billingItemList[i]"/>
+                            <field-to-list list="realBillingItemList" field="inputMap"/>
+                        </then>
+                    </if>
+                </loop>
+                <clear-field field="inputMap"/>
+            </iterate>
+        </if-not-empty>
+        <if-not-empty field="realBillingItemList">
+            <iterate entry="realBillingItemMap" list="realBillingItemList">
+                <entity-one value-field="custRequestMap" entity-name="CustRequest">
+                    <field-map field-name="custRequestId" from-field="realBillingItemMap.custRequestId"/>
+                </entity-one>
+                <if-compare field="custRequestMap.billed" operator="equals" value="N" type="String">
+                    <set field="invoiceItems.invoiceId" from-field="realBillingItemMap.invoiceId"/>
+                    <set field="invoiceItems.invoiceItemSeqId" from-field="realBillingItemMap.invoiceItemSeqId"/>
+                    <set field="invoiceItems.amount" value="0.0" type="BigDecimal"/>
+                    <call-service service-name="updateInvoiceItem" in-map-name="invoiceItems"/>
+                </if-compare>
+            </iterate>
+        </if-not-empty>
+    </simple-method>
+    <simple-method method-name="scrumAddWorkEffortTimeToInvoice" short-description="Scrum Add Work Effort Time to Invoice">
+        <check-permission permission="WORKEFFORTMGR" action="_CREATE">
+            <fail-property resource="WorkEffortUiLabels" property="WorkEffortCreatePermissionError"/>
+        </check-permission>
+        <check-errors/>
+        <entity-one entity-name="WorkEffort" value-field="workEffort"/>
+        <if-empty field="parameters.invoiceId">
+            <set-service-fields service-name="createInvoice" map="parameters" to-map="createInvoiceMap"/>
+            <set field="createInvoiceMap.invoiceTypeId" value="SALES_INVOICE"/>
+            <set field="createInvoiceMap.statusId" value="INVOICE_IN_PROCESS"/>
+            <call-service service-name="createInvoice" in-map-name="createInvoiceMap">
+                <result-to-field result-name="invoiceId" field="parameters.invoiceId"/>
+            </call-service>
+            <field-to-result field="parameters.invoiceId" result-name="invoiceId"/>
+        </if-empty>
+        <entity-one entity-name="Invoice" value-field="invoice"/>
+        <if-empty field="invoice">
+            <add-error>
+                <fail-property resource="WorkEffortUiLabels" property="WorkEffortTimesheetCannotFindInvoice"/>
+            </add-error>
+            <check-errors/>
+        </if-empty>
+        <entity-one entity-name="Party" value-field="party">
+            <field-map field-name="partyId" value="${invoice.partyId}"/>
+        </entity-one>
+        <if-empty field="party.preferredCurrencyUomId">
+            <property-to-field resource="general" property="currency.uom.id.default" field="party.preferredCurrencyUomId"/>
+        </if-empty>
+        <set field="updateInvoiceMap.invoiceId" from-field="parameters.invoiceId"/>
+        <set field="updateInvoiceMap.currencyUomId" from-field="party.preferredCurrencyUomId"/>
+        <if-not-empty field="parameters.invoiceDate">
+            <set field="updateInvoiceMap.invoiceDate" from-field="parameters.invoiceDate" type="Timestamp"/>
+            <else>
+                <now-timestamp field="updateInvoiceMap.invoiceDate"/>
+            </else>
+        </if-not-empty>
+        <if-empty field="updateInvoiceMap.currencyUomId">
+            <property-to-field field="invoice.currencyUomId" resource="general" property="currency.uom.id.default" default="USD"/>
+        </if-empty>
+        <call-service service-name="updateInvoice" in-map-name="updateInvoiceMap"/>
+        <entity-one entity-name="Invoice" value-field="invoice"/>
+        <call-simple-method method-name="scrumCreateTimeEntryInvoiceItemsInline"/>
+        <field-to-result field="setBillingMap" result-name="billingMap"/>
+    </simple-method>
+    <simple-method method-name="scrumCreateTimeEntryInvoiceItemsInline" short-description="scrumCreateTimeEntryInvoiceItemsInline">
+        <set field="orderBy[]" value="rateTypeId"/>
+        <get-related value-field="workEffort" relation-name="TimeEntry" list="timeEntryList" order-by-list="orderBy"/>
+        <set field="invoiceItemMap.invoiceId" from-field="parameters.invoiceId"/>
+        <set field="invoiceItemMap.taxableFlag" value="N"/>
+        <set field="invoiceItemMap.invoiceItemTypeId" value="INV_TE_ITEM"/>
+        <set field="invoiceItemMap.uomId" value="TF_hr"/>
+        <set field="invoiceItemMap.description" value="${workEffort.workEffortName} [Task:${workEffort.workEffortId}]"/>
+        <get-related value-field="workEffort" relation-name="CustRequestWorkEffort" list="custRequestWorkEfforts"/>
+        <if-not-empty field="custRequestWorkEfforts">
+            <first-from-list entry="custRequestWorkEffort" list="custRequestWorkEfforts"/>
+            <get-related-one value-field="custRequestWorkEffort" relation-name="CustRequest" to-value-field="custRequest"/>
+            <if-not-empty field="custRequest">
+                <if-compare field="custRequest.custRequestTypeId" operator="equals" value="RF_SCRUM_MEETINGS" >
+                    <set field="invoiceItemDescription" value="${custRequest.custRequestName} [CRQ:${custRequest.custRequestId}]"/>
+                    <else>
+                        <if-empty field="custRequest.description">
+                            <set field="invoiceItemDescription" value="[CRQ:${custRequest.custRequestId}] ${custRequest.custRequestName}"/>
+                            <else>
+                                <set field="invoiceItemDescription" value="[CRQ:${custRequest.custRequestId}] ${custRequest.description}"/>
+                            </else>
+                        </if-empty>
+                    </else>
+                </if-compare>
+                <set field="invoiceItemMap.description" value="${groovy:invoiceItemDescription.size()&gt;255?invoiceItemDescription.substring(0,251)+&quot; ...&quot;:invoiceItemDescription}"/>
+            </if-not-empty>
+        </if-not-empty>
+        <iterate entry="timeEntry" list="timeEntryList">
+            <if>
+                <condition>
+                    <or>
+                        <and>
+                            <not><if-empty field="parameters.thruDate"/></not>
+                            <if-compare-field operator="less" field="timeEntry.fromDate" to-field="parameters.thruDate"/>
+                        </and>
+                        <if-empty field="parameters.thruDate"/>
+                    </or>
+                </condition>
+                <then>
+                    <!-- check invoice -->
+                    <if-compare field="invoice.statusId" operator="equals" value="INVOICE_IN_PROCESS">
+                        <!-- only add to invoice if it is not already on an invoice-->
+                        <if-empty field="timeEntry.invoiceId">
+                            <!-- check if only a percentage of the hours need to be used -->
+                            <if-empty field="timeEntry.partyId">
+                                <if-not-empty field="timeEntry.timesheetId">
+                                    <entity-one entity-name="Timesheet" value-field="timesheet">
+                                        <field-map field-name="timesheetId" from-field="timeEntry.timesheetId"/>
+                                    </entity-one>
+                                    <set field="timeEntry.partyId" from-field="timesheet.partyId"/>
+                                </if-not-empty>
+                            </if-empty>
+                            <if-not-empty field="timeEntry.partyId">
+                                <entity-and entity-name="PartyRate" list="partyRates" filter-by-date="true">
+                                    <field-map field-name="rateTypeId" from-field="timeEntry.rateTypeId"/>
+                                    <field-map field-name="partyId" from-field="timeEntry.partyId"/>
+                                </entity-and>
+                                <if-not-empty field="partyRates">
+                                    <first-from-list entry="partyRate" list="partyRates"/>
+                                    <if-not-empty field="partyRate.percentageUsed">
+                                        <calculate field="timeEntry.hours" type="Double">
+                                            <calcop operator="multiply" field="timeEntry.hours">
+                                                <calcop operator="get" field="partyRate.percentageUsed"/>
+                                            </calcop>
+                                        </calculate>
+                                        <calculate field="timeEntry.hours" type="Double">
+                                            <calcop operator="divide" field="timeEntry.hours">
+                                                <number value="100"/>
+                                            </calcop>
+                                        </calculate>
+                                    </if-not-empty>
+                                </if-not-empty>
+                            </if-not-empty>
+                            <set field="getTimeEntryRate.timeEntryId" from-field="timeEntry.timeEntryId"/>
+                            <set field="getTimeEntryRate.currencyUomId" from-field="invoice.currencyUomId"/>
+                            <call-service service-name="getTimeEntryRate" in-map-name="getTimeEntryRate">
+                                <result-to-field result-name="rateAmount"/>
+                            </call-service>
+                            <!--  check if the RateTypeId changed or the first time entry record and invoice item is not exist with the same amount and description-->
+                            <entity-and list="existAmountAndDescriptionInvoiceItems" entity-name="InvoiceItem">
+                                <field-map field-name="invoiceId" from-field="invoiceItemMap.invoiceId"/>
+                                <field-map field-name="amount" from-field="rateAmount"/>
+                                <field-map field-name="description" from-field="invoiceItemMap.description"/>
+                            </entity-and>
+                            <set field="invoiceItemMap.invoiceItemSeqId" from-field="existAmountAndDescriptionInvoiceItems[0].invoiceItemSeqId"/>
+                            <if>
+                                <condition>
+                                    <and>
+                                        <or>
+                                            <if-empty field="oldRateAmount"/>
+                                            <if-compare-field field="rateAmount" operator="not-equals" to-field="oldRateAmount"/>
+                                        </or>
+                                        <if-empty field="existAmountAndDescriptionInvoiceItems"/>
+                                    </and>
+                                </condition>
+                                <then>
+                                    <set field="invoiceItemMap.amount" from-field="rateAmount" default-value="0.0" type="BigDecimal"/>
+                                    <if-compare field="parameters.combineInvoiceItem" operator="equals" value="Y" >
+                                        <set field="invoiceItemMap.quantity" from-field="timeEntry.hours" default-value="0.0" type="BigDecimal"/>
+                                        <clear-field field="invoiceItemMap.invoiceItemSeqId"/><!-- make sure a new one is created -->
+                                        <call-service service-name="createInvoiceItem" in-map-name="invoiceItemMap">
+                                            <result-to-field result-name="invoiceItemSeqId" field="invoiceItemMap.invoiceItemSeqId"/>
+                                        </call-service>
+                                    </if-compare>
+                                    <set field="setBillingMap.custRequestId" from-field="custRequest.custRequestId"></set>
+                                    <set field="setBillingMap.invoiceId" from-field="invoiceItemMap.invoiceId"></set>
+                                    <set field="setBillingMap.invoiceItemSeqId" from-field="invoiceItemMap.invoiceItemSeqId"></set>
+                                </then>
+                                <else>
+                                    <if-compare field="parameters.combineInvoiceItem" operator="equals" value="Y" >
+                                        <!-- or combine them when it is the same rate, amount and description-->
+                                        <set field="invoiceItemMap.quantity" from-field="existAmountAndDescriptionInvoiceItems[0].quantity"/>
+                                        <calculate field="invoiceItemMap.quantity">
+                                            <calcop operator="get" field="invoiceItemMap.quantity"/>
+                                            <calcop operator="add" field="timeEntry.hours"/>
+                                        </calculate>
+                                        <call-service service-name="updateInvoiceItem" in-map-name="invoiceItemMap"/>
+                                    </if-compare>
+                                </else>
+                            </if>
+                            <set field="oldRateAmount" from-field="rateAmount"/>
+
+                            <!-- create an invoiceitem for every time entry -->
+                            <if-compare field="parameters.combineInvoiceItem" operator="not-equals" value="Y" >
+                                <set field="invoiceItemMap.description" from-field="timeEntry.comments"/>
+                                <if-empty field="invoiceItemMap.description">
+                                    <set field="invoiceItemMap.description" from-field="workEffort.workEffortName"/>
+                                </if-empty>
+                                <set field="invoiceItemMap.quantity" from-field="timeEntry.hours" default-value="0.0" type="BigDecimal"/>
+                                <clear-field field="invoiceItemMap.invoiceItemSeqId"/><!-- make sure a new one is created -->
+                                <call-service service-name="createInvoiceItem" in-map-name="invoiceItemMap">
+                                    <result-to-field result-name="invoiceItemSeqId" field="invoiceItemMap.invoiceItemSeqId"/>
+                                </call-service>
+                            </if-compare>
+                            <!--  update the time entry -->
+                            <set field="updTimeEntry.timeEntryId" from-field="timeEntry.timeEntryId"/>
+                            <set field="updTimeEntry.invoiceId" from-field="invoiceItemMap.invoiceId"/>
+                            <set field="updTimeEntry.invoiceItemSeqId" from-field="invoiceItemMap.invoiceItemSeqId"/>
+                            <call-service service-name="updateTimeEntry" in-map-name="updTimeEntry"/>
+                            <!-- else>
+                                <log level="info" message="Timeentry: ${timeEntry.timeEntryId} already connected to invoiceId: ${timeEntry.invoiceId}...not added to invoiceItem"/>
+                            </else-->
+                        </if-empty>
+                        <else>
+                            <set field="errMsg" value="Invoice ${invoiceId} should have the status 'in progress', the status is however: ${invoice.statusId}"/>
+                            <log level="error" message="${errMsg}"/>
+                            <add-error error-list-name="errorMessageList">
+                                <fail-property resource="WorkEffortUiLabels" property="WorkEffortTimesheetInvoiceShuoldBeInProgressStatus"/>
+                            </add-error>
+                            <return response-code="error"/>
+                        </else>
+                    </if-compare>
+                </then>
+            </if>
         </iterate>
     </simple-method>
     <simple-method method-name="removeInvoiceInTimeEntry" short-description="Remove Invoice In TimeEntry">
@@ -1498,10 +1789,25 @@
             </if-not-empty>
         </else>
         </if-empty>
+        <entity-one value-field="custRequestMap" entity-name="CustRequest"/>
+        <if-compare field="custRequestMap.statusId" operator="equals" value="CRQ_ACCEPTED">
+            <get-related relation-name="CustRequestWorkEffort" list="custWorkEffList" value-field="custRequestMap"/>
+            <if-not-empty field="custWorkEffList">
+                <iterate entry="task" list="custWorkEffList">
+                    <set field="parameters.taskId" from-field="task.workEffortId" />
+                    <call-simple-method method-name="getScrumTaskPlanHour" />
+                    <calculate field="backlogPlanHours" type="Double">
+                        <calcop operator="add" field="taskPlanHours">
+                            <calcop operator="get" field="backlogPlanHours" />
+                        </calcop>
+                    </calculate>
+                </iterate>
+            </if-not-empty>
+        </if-compare>
         <!-- Check plan from backlog -->
         <if-compare field="backlogPlanHours" operator="less-equals" value="0">
             <entity-one entity-name="CustRequest" value-field="custRequest" />
-            <set field="backlogPlanHours" value="${custRequest.estimatedMilliSeconds/1000/60/60}" type="Double" />
+            <set field="backlogPlanHours" value="${custRequest.custEstimatedMilliSeconds/1000/60/60}" type="Double" />
         </if-compare>
     </simple-method>
     
@@ -1509,7 +1815,7 @@
         <!-- Get plan hours in a Backlog -->
         <set field="backlogInitPlanHours" type="Double" value="0" />
         <entity-one entity-name="CustRequest" value-field="custRequest" />
-        <set field="backlogInitPlanHours" value="${custRequest.estimatedMilliSeconds/1000/60/60}" type="Double" />
+        <set field="backlogInitPlanHours" value="${custRequest.custEstimatedMilliSeconds/1000/60/60}" type="Double" />
     </simple-method>
     
     <simple-method method-name="getScrumSprintPlanHour"
@@ -1797,11 +2103,11 @@
             </if-not-empty>
             <if-not-empty field="custRequest">
                 <calculate field="defaultBacklogPlanHours" type="Double">
-                    <calcop field="custRequest.estimatedMilliSeconds" operator="divide">
+                    <calcop field="custRequest.custEstimatedMilliSeconds" operator="divide">
                         <number value="3600000" />
                     </calcop>
                 </calculate>
-                <if-empty field="custRequest.estimatedMilliSeconds">
+                <if-empty field="custRequest.custEstimatedMilliSeconds">
                     <set field="defaultBacklogPlanHours" type="Double" value="0" />
                 </if-empty>
                 <set field="taskPlanHours" type="Double" value="0" />
@@ -1889,7 +2195,7 @@
     </simple-method>
     <simple-method method-name="reOrderProductBacklogItemSequenceNumber"
         short-description="Re-order product backlog item's sequence number">
-        <!-- get all product backlog items of product order by sequenceNum -->
+        <!-- get all product backlog items of product order by custSequenceNum -->
         <entity-condition list="custRequestAndCustRequestItems"
             entity-name="CustRequestAndCustRequestItem">
             <condition-list combine="and">
@@ -1903,12 +2209,12 @@
         <set field="newSequenceNum" value="1" type="Long" />
         <set field="sequenceNumStep" value="1" type="Long" />
         <iterate entry="custRequestAndCustRequestItem" list="custRequestAndCustRequestItems">
-            <!-- update sequenceNum field of cust request -->
+            <!-- update custSequenceNum field of cust request -->
             <entity-one value-field="custRequest" entity-name="CustRequest">
                 <field-map field-name="custRequestId"
                     from-field="custRequestAndCustRequestItem.custRequestId" />
             </entity-one>
-            <set field="custRequest.sequenceNum" from-field="newSequenceNum"
+            <set field="custRequest.custSequenceNum" from-field="newSequenceNum"
                 type="Long" />
             <store-value value-field="custRequest" />
 
@@ -2419,7 +2725,7 @@
                             <field-map field-name="custRequestId" from-field="custRequestWorkEffortMap.custRequestId"/>
                         </entity-one>
                         <set field="planHoursIn" from-field="planHours" type="Double"/>
-                        <set field="custRequestMap.estimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
+                        <set field="custRequestMap.custEstimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
                         <store-value value-field="custRequestMap"/>
                         <else>
                             <if-compare-field field="initPlanHours"  operator="greater" to-field="planHours"  type="Double">
@@ -2427,7 +2733,7 @@
                                     <field-map field-name="custRequestId" from-field="custRequestWorkEffortMap.custRequestId"/>
                                 </entity-one>
                                 <set field="planHoursIn" from-field="planHours" type="Double"/>
-                                <set field="custRequestMap.estimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
+                                <set field="custRequestMap.custEstimatedMilliSeconds" value="${groovy:planHoursIn*1000*60*60}" type="Double"/>
                                 <store-value value-field="custRequestMap"/>
                             </if-compare-field>
                         </else>

Modified: ofbiz/trunk/specialpurpose/scrum/servicedef/services.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/servicedef/services.xml?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/servicedef/services.xml (original)
+++ ofbiz/trunk/specialpurpose/scrum/servicedef/services.xml Tue Aug  2 09:00:06 2011
@@ -128,6 +128,27 @@
         <attribute name="reCreate" type="String" mode="IN" optional="true"/>
         <attribute name="includeMeeting" type="String" mode="IN" optional="true"/>
     </service>
+    <service name="scrumAddWorkEffortTimeToInvoice" default-entity-name="Timesheet" engine="simple" auth="true"
+        location="component://scrum/script/org/ofbiz/scrum/ScrumServices.xml" invoke="scrumAddWorkEffortTimeToInvoice">
+        <description>Add WorkEffort Time to existing Invoice</description>
+        <permission-service service-name="workEffortGenericPermission" main-action="CREATE"/>
+        <attribute name="workEffortId" type="String" mode="IN" optional="false"/>
+        <attribute name="invoiceId" type="String" mode="IN" optional="false"/>
+        <attribute name="invoiceDate" type="Timestamp" mode="IN" optional="true"/>
+        <attribute name="combineInvoiceItem" mode="IN" type="String" optional="true"/>
+        <attribute name="billingMap" type="Map" mode="OUT" optional="true"/>
+    </service>
+    <service name="scrumAddWorkEffortTimeToNewInvoice" default-entity-name="Timesheet" engine="simple" auth="true"
+        location="component://scrum/script/org/ofbiz/scrum/ScrumServices.xml" invoke="scrumAddWorkEffortTimeToInvoice">
+        <description>Add WorkEffort Time to a new Invoice</description>
+        <attribute name="workEffortId" type="String" mode="IN" optional="false"/>
+        <attribute name="partyIdFrom" type="String" mode="IN" optional="false"/>
+        <attribute name="partyId" type="String" mode="IN" optional="false"/>
+        <attribute name="invoiceId" type="String" mode="OUT" optional="false"/>
+        <attribute name="combineInvoiceItem" mode="IN" type="String" optional="true"/>
+        <attribute name="thruDate" mode="IN" type="Timestamp" optional="true"/>
+        <attribute name="billingMap" type="Map" mode="OUT" optional="true"/>
+    </service>
     <service name="removeInvoiceInTimeEntry" engine="simple" auth="true"
         location="component://scrum/script/org/ofbiz/scrum/ScrumServices.xml" invoke="removeInvoiceInTimeEntry">
         <description>Remove invoiceId in TimeEntry</description>

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/AddProductBacklogItem.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/AddProductBacklogItem.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/AddProductBacklogItem.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/AddProductBacklogItem.groovy Tue Aug  2 09:00:06 2011
@@ -40,7 +40,7 @@ if(parameters.statusId == null){
 inputFields.putAll(parameters);
 inputFields.custRequestTypeId = "RF_PROD_BACKLOG";
 performFindInMap.inputFields = inputFields;
-performFindInMap.orderBy = "sequenceNum";
+performFindInMap.orderBy = "custSequenceNum";
 def performFindResults = dispatcher.runSync("performFind", performFindInMap);
 def custRequestAndItems = performFindResults.listIt.getCompleteList();
 performFindResults.listIt.close();
@@ -51,8 +51,8 @@ def custRequestAndCustRequestItems = [];
 custRequestAndItems.each() { custRequestAndItem ->
     def tempCustRequestAndItem = [:];
     tempCustRequestAndItem.putAll(custRequestAndItem);
-    tempCustRequestAndItem.sequenceNum = countSequence;
-    tempCustRequestAndItem.realSequenceNum = custRequestAndItem.sequenceNum;
+    tempCustRequestAndItem.custSequenceNum = countSequence;
+    tempCustRequestAndItem.realSequenceNum = custRequestAndItem.custSequenceNum;
     // if custRequest has task then get Actual Hours
     custWorkEffortList = delegator.findByAnd("CustRequestWorkEffort",["custRequestId" : custRequestAndItem.custRequestId]);
     if (custWorkEffortList) {
@@ -103,15 +103,15 @@ mainConditionList.add(orConditions);
 mainConditionList.add(conditions);
 mainConditions = EntityCondition.makeCondition(mainConditionList, EntityOperator.AND);
 
-unplannedList = delegator.findList("CustRequestAndCustRequestItem", mainConditions, ["custRequestId", "sequenceNum", "statusId", "description", "estimatedMilliSeconds", "custRequestName", "parentCustRequestId"] as Set, ["sequenceNum"], null, false);
+unplannedList = delegator.findList("CustRequestAndCustRequestItem", mainConditions, ["custRequestId", "custSequenceNum", "statusId", "description", "custEstimatedMilliSeconds", "custRequestName", "parentCustRequestId"] as Set, ["custSequenceNum"], null, false);
 
 def countSequenceUnplanned = 1;
 def unplanBacklogItems = [];
 unplannedList.each() { unplannedItem ->
     def tempUnplanned = [:];
     tempUnplanned.putAll(unplannedItem);
-    tempUnplanned.sequenceNum = countSequenceUnplanned;
-    tempUnplanned.realSequenceNum = unplannedItem.sequenceNum;
+    tempUnplanned.custSequenceNum = countSequenceUnplanned;
+    tempUnplanned.realSequenceNum = unplannedItem.custSequenceNum;
     // if custRequest has task then get Actual Hours
     unplanCustWorkEffortList = delegator.findByAnd("CustRequestWorkEffort",["custRequestId" : unplannedItem.custRequestId]);
     if (unplanCustWorkEffortList) {

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/FindProductBacklogItem.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/FindProductBacklogItem.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/FindProductBacklogItem.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/FindProductBacklogItem.groovy Tue Aug  2 09:00:06 2011
@@ -59,7 +59,7 @@ if ((parameters.billed != null)||(parame
     }
     
     if(!"Any".equals(parameters.statusId)){
-        orderBy = "sequenceNum";
+        orderBy = "custSequenceNum";
         conditionBacklogList.add(EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, parameters.statusId));
     }
     
@@ -96,14 +96,14 @@ if ((parameters.billed != null)||(parame
     mainConditionBacklogList.add(conditionsBacklog);
     mainConditionsBacklog = EntityCondition.makeCondition(mainConditionBacklogList, EntityOperator.AND);
     
-    backlogList = delegator.findList("CustRequestAndCustRequestItem", mainConditionsBacklog, ["custRequestId","custRequestTypeId", "sequenceNum", "statusId", "description", "estimatedMilliSeconds", "custRequestName", "parentCustRequestId","productId","billed","custRequestDate","fromPartyId"] as Set, ["-custRequestTypeId",orderBy], null, false);
+    backlogList = delegator.findList("CustRequestAndCustRequestItem", mainConditionsBacklog, ["custRequestId","custRequestTypeId", "custSequenceNum", "statusId", "description", "custEstimatedMilliSeconds", "custRequestName", "parentCustRequestId","productId","billed","custRequestDate","fromPartyId"] as Set, ["-custRequestTypeId",orderBy], null, false);
     def countSequenceBacklog = 1;
     def backlogItems = [];
     backlogList.each() { backlogItem ->
         def tempBacklog = [:];
         tempBacklog.putAll(backlogItem);
-        tempBacklog.sequenceNum = countSequenceBacklog;
-        tempBacklog.realSequenceNum = backlogItem.sequenceNum;
+        tempBacklog.custSequenceNum = countSequenceBacklog;
+        tempBacklog.realSequenceNum = backlogItem.custSequenceNum;
         // if custRequest has task then get Actual Hours
         backlogCustWorkEffortList = delegator.findByAnd("CustRequestWorkEffort",["custRequestId" : backlogItem.custRequestId]);
         if (backlogCustWorkEffortList) {

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentProducts.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentProducts.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentProducts.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentProducts.groovy Tue Aug  2 09:00:06 2011
@@ -48,7 +48,11 @@ if (userLogin) {
         paramCond.add(EntityCondition.makeCondition("internalName", EntityOperator.LIKE, "%" + internalName + "%"));
     }
     if(UtilValidate.isNotEmpty(statusId)){
-        paramCond.add(EntityCondition.makeCondition("statusId", EntityOperator.EQUALS, statusId));
+        if ("PRODUCT_ACTIVE".equals(statusId)) {
+            paramCond.add(EntityCondition.makeCondition("supportDiscontinuationDate", EntityOperator.EQUALS, null));
+        } else {
+             paramCond.add(EntityCondition.makeCondition("supportDiscontinuationDate", EntityOperator.NOT_EQUAL, null));
+        }
     }
     
     paramCond.add(EntityCondition.makeCondition("productTypeId", EntityOperator.EQUALS, "SCRUM_ITEM"));
@@ -109,7 +113,7 @@ if (userLogin) {
                    //check in product.
                     if (ismember == false) {
                         productAndRoleList = delegator.findByAnd("ProductAndRole", ["productId" : product.productId, "partyId" : userLogin.partyId
-                            , "roleTypeId" : "STAKEHOLDER", "statusId" : "PRODUCT_ACTIVE", "thruDate" : null]);
+                            , "roleTypeId" : "STAKEHOLDER", "supportDiscontinuationDate" : null, "thruDate" : null]);
                         if (productAndRoleList) {
                             ismember = true;
                         }
@@ -118,7 +122,7 @@ if (userLogin) {
                     //check in product.
                     productRoleList = [];
                     productRoleList = delegator.findByAnd("ProductAndRole", ["productId" : product.productId, "partyId" : userLogin.partyId
-                        , "roleTypeId" : "SCRUM_MASTER", "statusId" : "PRODUCT_ACTIVE", "thruDate" : null]);
+                        , "roleTypeId" : "SCRUM_MASTER", "supportDiscontinuationDate" : null, "thruDate" : null]);
                     if (productRoleList) {
                         ismember = true;
                     }

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentSprints.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentSprints.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentSprints.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListCurrentSprints.groovy Tue Aug  2 09:00:06 2011
@@ -86,7 +86,7 @@ allSprints.each { sprint ->
                //check in product.
                if (ismember == false) {
                    productAndRoleList = delegator.findByAnd("ProductAndRole", ["productId" : sprint.productId, "partyId" : userLogin.partyId
-                       , "roleTypeId" : "STAKEHOLDER", "statusId" : "PRODUCT_ACTIVE", "thruDate" : null]);
+                       , "roleTypeId" : "STAKEHOLDER", "supportDiscontinuationDate" : null, "thruDate" : null]);
                    if (productAndRoleList) {
                        ismember = true;
                    }
@@ -95,7 +95,7 @@ allSprints.each { sprint ->
                //check in product
                productRoleList = [];
                productRoleList = delegator.findByAnd("ProductAndRole", ["productId" : sprint.productId, "partyId" : userLogin.partyId
-                   , "roleTypeId" : "SCRUM_MASTER", "statusId" : "PRODUCT_ACTIVE", "thruDate" : null]);
+                   , "roleTypeId" : "SCRUM_MASTER", "supportDiscontinuationDate" : null, "thruDate" : null]);
                if (productRoleList) {
                    ismember = true;
                }
@@ -168,7 +168,7 @@ allSprints.each { sprint ->
                        //check in product.
                        if (ismember == false) {
                            productAndRoleList = delegator.findByAnd("ProductAndRole", ["productId" : sprint.productId, "partyId" : userLogin.partyId
-                               , "roleTypeId" : "STAKEHOLDER", "statusId" : "PRODUCT_ACTIVE", "thruDate" : null]);
+                               , "roleTypeId" : "STAKEHOLDER", "supportDiscontinuationDate" : null, "thruDate" : null]);
                            if (productAndRoleList) {
                                ismember = true;
                            }
@@ -177,7 +177,7 @@ allSprints.each { sprint ->
                        //check in product
                        productRoleList = [];
                        productRoleList = delegator.findByAnd("ProductAndRole", ["productId" : sprint.productId, "partyId" : userLogin.partyId
-                           , "roleTypeId" : "SCRUM_MASTER", "statusId" : "PRODUCT_ACTIVE", "thruDate" : null]);
+                           , "roleTypeId" : "SCRUM_MASTER", "supportDiscontinuationDate" : null, "thruDate" : null]);
                        if (productRoleList) {
                            ismember = true;
                        }

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListUnplanBacklog.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListUnplanBacklog.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListUnplanBacklog.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ListUnplanBacklog.groovy Tue Aug  2 09:00:06 2011
@@ -43,7 +43,7 @@ andExprs =  FastList.newInstance();
     andExprs.add(EntityCondition.makeCondition(orStsExprs, EntityOperator.OR));
     andExprs.add(EntityCondition.makeCondition(orCurentExprs, EntityOperator.OR));
 unplannedBacklogCond = EntityCondition.makeCondition(andExprs, EntityOperator.AND);
-unplannedBacklogList = delegator.findList("UnPlannedBacklogsAndTasks", unplannedBacklogCond, null,["-custRequestId","workEffortTypeId","sequenceNum"],null, false);
+unplannedBacklogList = delegator.findList("UnPlannedBacklogsAndTasks", unplannedBacklogCond, null,["-custRequestId","workEffortTypeId","custSequenceNum"],null, false);
 
 context.listIt = unplannedBacklogList;
 context.paraBacklogStatusId = paraBacklogStatusId;

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ProductBilling.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ProductBilling.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ProductBilling.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/ProductBilling.groovy Tue Aug  2 09:00:06 2011
@@ -75,13 +75,17 @@ if ("N".equals(includeMeeting)) {
 // get sprint task list
 def sprintTasks = delegator.findList("ProjectSprintBacklogTaskAndTimeEntryTimeSheet", EntityCondition.makeCondition(taskConds), null, null, null, false);
 
+// get cancelled backlog task list
+def cancelledBacklogTasks = delegator.findList("CancelledBacklogsTaskAndTimeEntryTimeSheet", EntityCondition.makeCondition(taskConds), null, null, null, false);
+
 // get unplanned task list
 def unplannedTasks = delegator.findList("UnPlannedBacklogsTaskAndTimeEntryTimeSheet", EntityCondition.makeCondition(taskConds), null, null, null, false);
 
 def hoursNotYetBilledTasks = [];
 hoursNotYetBilledTasks.addAll(sprintTasks);
+hoursNotYetBilledTasks.addAll(cancelledBacklogTasks);
 hoursNotYetBilledTasks.addAll(unplannedTasks);
-context.hoursNotYetBilledTasks = UtilMisc.sortMaps(hoursNotYetBilledTasks, ["custRequestId","fromDate"])
+context.hoursNotYetBilledTasks = UtilMisc.sortMaps(hoursNotYetBilledTasks, ["productId","custRequestId","taskId","fromDate"])
 
 // get time entry date
 timeEntryList = UtilMisc.sortMaps(hoursNotYetBilledTasks, ["fromDate"])

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/SprintBacklogListItems.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/SprintBacklogListItems.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/SprintBacklogListItems.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/SprintBacklogListItems.groovy Tue Aug  2 09:00:06 2011
@@ -67,7 +67,7 @@ andExprs =  FastList.newInstance();
     andExprs.add(EntityCondition.makeCondition("sprintTypeId", EntityOperator.EQUALS, "SCRUM_SPRINT"));
     
 projectSprintCond = EntityCondition.makeCondition(andExprs, EntityOperator.AND);
-projectSprintList = delegator.findList("ProjectSprintBacklogAndTask", projectSprintCond, null,["sequenceNum","custRequestId","taskTypeId"],null, false);
+projectSprintList = delegator.findList("ProjectSprintBacklogAndTask", projectSprintCond, null,["custSequenceNum","custRequestId","taskTypeId"],null, false);
 
 context.listIt = projectSprintList;
 context.paraBacklogStatusId = paraBacklogStatusId;

Modified: ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/TaskList.groovy
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/TaskList.groovy?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/TaskList.groovy (original)
+++ ofbiz/trunk/specialpurpose/scrum/webapp/scrum/WEB-INF/actions/TaskList.groovy Tue Aug  2 09:00:06 2011
@@ -74,6 +74,7 @@ custRequestTypeCond = EntityCondition.ma
 
 taskPlanList = delegator.findList("ProjectSprintBacklogTaskAndParty", custRequestTypeCond, null,["taskTypeId","projectId","sprintId"] ,null, false);
 taskPlanList.each { taskPlanMap ->
+    planMap=[:];
     if ("RF_SCRUM_MEETINGS".equals(taskPlanMap.custRequestTypeId)) {
         workEffPartyAssignedList = delegator.findByAnd("WorkEffortPartyAssignment",["partyId" : partyId, "workEffortId" : taskPlanMap.taskId]);
         workEffPartyAssignedMap = workEffPartyAssignedList[0];
@@ -82,8 +83,29 @@ taskPlanList.each { taskPlanMap ->
             taskListDropdown.add(taskPlanMap);
         }
     } else {
-        taskPartyList.add(taskPlanMap);
-        taskListDropdown.add(taskPlanMap);
+        if (taskPlanMap.projectId) {
+            taskPartyList.add(taskPlanMap);
+            taskListDropdown.add(taskPlanMap);
+        } else {
+            custRequestId = taskPlanMap.custRequestId;
+            productlist = delegator.findByAnd("CustRequestItem", ["custRequestId" : custRequestId],["productId"]);
+            product = delegator.findByPrimaryKey("Product",["productId":productlist[0].productId]);
+            productName = product.internalName;
+            planMap.taskId = taskPlanMap.taskId;
+            planMap.taskTypeId = taskPlanMap.taskTypeId;
+            planMap.taskName = taskPlanMap.taskName;
+            planMap.projectId = taskPlanMap.projectId;
+            planMap.projectName = taskPlanMap.projectName;
+            planMap.sprintId = taskPlanMap.sprintId;
+            planMap.sprintName = taskPlanMap.sprintName;
+            planMap.custRequestId = custRequestId;
+            planMap.description = taskPlanMap.description;
+            planMap.productId = productlist[0].productId;
+            planMap.productName = productName;
+            taskPartyList.add(planMap);
+            taskListDropdown.add(planMap);
+        }
+
     }
 }
 if (taskPartyList){

Modified: ofbiz/trunk/specialpurpose/scrum/widget/CommonScreens.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/widget/CommonScreens.xml?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/widget/CommonScreens.xml (original)
+++ ofbiz/trunk/specialpurpose/scrum/widget/CommonScreens.xml Tue Aug  2 09:00:06 2011
@@ -147,7 +147,7 @@
                             <condition-expr field-name="statusId" operator="equals" value="CRQ_REOPENED"/>
                         </condition-list>
                     </condition-list>
-                    <order-by field-name="sequenceNum"/>
+                    <order-by field-name="custSequenceNum"/>
                     <order-by field-name="custRequestId"/>
                     <order-by field-name="workEffortTypeId"/>
                 </entity-condition>

Modified: ofbiz/trunk/specialpurpose/scrum/widget/OpenTestForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/widget/OpenTestForms.xml?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/widget/OpenTestForms.xml (original)
+++ ofbiz/trunk/specialpurpose/scrum/widget/OpenTestForms.xml Tue Aug  2 09:00:06 2011
@@ -115,7 +115,7 @@
             <drop-down allow-empty="true">
                 <entity-options description=" ${internalName} [${productId}]" entity-name="Product" key-field-name="productId">
                      <entity-constraint name="productTypeId" value="SCRUM_ITEM"/>
-                     <entity-constraint name="statusId" value="PRODUCT_ACTIVE"/>
+                     <entity-constraint name="supportDiscontinuationDate" operator="equals" value=""/>
                      <entity-order-by field-name="internalName"/>
                 </entity-options>
             </drop-down>

Modified: ofbiz/trunk/specialpurpose/scrum/widget/ResourceForms.xml
URL: http://svn.apache.org/viewvc/ofbiz/trunk/specialpurpose/scrum/widget/ResourceForms.xml?rev=1153071&r1=1153070&r2=1153071&view=diff
==============================================================================
--- ofbiz/trunk/specialpurpose/scrum/widget/ResourceForms.xml (original)
+++ ofbiz/trunk/specialpurpose/scrum/widget/ResourceForms.xml Tue Aug  2 09:00:06 2011
@@ -349,7 +349,7 @@
                 <condition-list combine="and">
                     <condition-expr field-name="thruDate" value="" operator="equals"/>
                     <condition-expr field-name="productId" operator="equals" from-field="productId"/>
-                    <condition-expr field-name="statusId" operator="equals" value="PRODUCT_ACTIVE"/>
+                    <condition-expr field-name="supportDiscontinuationDate" operator="equals" value=""/>
                     <condition-list combine="or">
                         <condition-expr field-name="roleTypeId" value="SCRUM_TEAM" operator="not-equals"/>
                         <condition-expr field-name="roleTypeId" value="SCRUM_MASTER" operator="not-equals"/>