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()>255?invoiceItemDescription.substring(0,251)+" ...":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"/> |
Free forum by Nabble | Edit this page |