Added: 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=1142915&view=auto ============================================================================== --- ofbiz/trunk/specialpurpose/scrum/script/org/ofbiz/scrum/ScrumServices.xml (added) +++ ofbiz/trunk/specialpurpose/scrum/script/org/ofbiz/scrum/ScrumServices.xml Tue Jul 5 08:15:32 2011 @@ -0,0 +1,2950 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. +--> + +<simple-methods xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:noNamespaceSchemaLocation="http://ofbiz.apache.org/dtds/simple-methods.xsd"> + <simple-method method-name="updateSprintBacklogseq" + short-description="Update the portal page sequence numbers"> + <if-compare field="parameters.statusId" operator="equals" value="Any"> + <clear-field field="parameters.statusId"/> + </if-compare> + <if-compare field="parameters.mode" value="UP" operator="equals"> + <!-- check custRequestTypeId --> + <entity-one value-field="custRequest" entity-name="CustRequest"/> + <if-compare field="custRequest.custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <!--<condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>--> + <condition-list combine="and"> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </condition-list> + <order-by field-name="sequenceNum" /> + </entity-condition> + <else> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <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" /> + </entity-condition> + </else> + </if-compare> + <loop count="${getNum}" field="i"> + <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" /> + + <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" /> + <if-empty field="firstup"> + <add-error><fail-message message="Cannot find with ID [${custReq[i].custRequestId}] and sequenceNum [${custReq[i].sequenceNum}]"/></add-error> + <check-errors/> + <else> + <store-value value-field="firstup" /> + </else> + </if-empty> + + <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" /> + <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> + <check-errors/> + <else> + <store-value value-field="lastup" /> + </else> + </if-empty> + </if-compare> + </if-compare> + </loop> + </if-compare> + <!-- DOWN --> + <if-compare field="parameters.mode" value="DWN" operator="equals"> + <entity-one value-field="custRequest" entity-name="CustRequest"/> + <if-compare field="custRequest.custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <!--<condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>--> + <condition-list combine="and"> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </condition-list> + <order-by field-name="sequenceNum" /> + </entity-condition> + <else> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <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" /> + </entity-condition> + </else> + </if-compare> + <loop count="${getNum-1}" field="i"> + <if-compare operator="equals" value="${parameters.custRequestId}" + 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" /> + + <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" /> + <if-empty field="first"> + <add-error><fail-message message="Cannot find with ID [${custReq[i].custRequestId}] and sequenceNum [${custReq[i].sequenceNum}]"/></add-error> + <check-errors/> + <else> + <store-value value-field="first" /> + </else> + </if-empty> + + <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" /> + <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> + <check-errors/> + <else> + <store-value value-field="last" /> + </else> + </if-empty> + </if-compare> + </if-compare> + </loop> + </if-compare> + <!-- TOP --> + <if-compare field="parameters.mode" value="TOP" operator="equals"> + <entity-one value-field="custRequest" entity-name="CustRequest"/> + <if-compare field="custRequest.custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <!--<condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>--> + <condition-list combine="and"> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </condition-list> + <order-by field-name="sequenceNum" /> + </entity-condition> + <else> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <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" /> + </entity-condition> + </else> + </if-compare> + <set field="index" value="${getNum}" /> + <set field="topCustReq" from-field="custReq[0]" /> + <!-- loop search selected custReq --> + <loop count="${index}" field="i"> + <if-compare operator="equals" value="${parameters.custRequestId}" + field="custReq[i].custRequestId"> + <set field="selectedCustReq" from-field="custReq[i]" /> + <set field="diffIndex" value="${index-i}" /> + <set field="selectedIndex" from-field="i" /> + </if-compare> + </loop> + <loop count="${selectedIndex}" field="j"> + <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" + 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> + <check-errors/> + <else> + <store-value value-field="custReqBottom" /> + </else> + </if-empty> + </loop> + + <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" + type="Long" /> + <if-empty field="updatetop"> + <add-error><fail-message message="Cannot find with ID [${selectedCustReq.custRequestId}] and sequenceNum [${topCustReq.sequenceNum}]"/></add-error> + <check-errors/> + <else> + <store-value value-field="updatetop" /> + </else> + </if-empty> + </if-compare> + <!-- buttom --> + <if-compare field="parameters.mode" value="BOT" operator="equals"> + <entity-one value-field="custRequest" entity-name="CustRequest"/> + <if-compare field="custRequest.custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_UNPLAN_BACKLOG"/> + <!--<condition-expr field-name="statusId" from-field="parameters.statusId" ignore-if-empty="true"/>--> + <condition-list combine="and"> + <condition-list combine="or"> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_REVIEWED"/> + </condition-list> + </condition-list> + </condition-list> + <order-by field-name="sequenceNum" /> + </entity-condition> + <else> + <entity-count count-field="getNum" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId"/> + <condition-expr field-name="custRequestTypeId" operator="equals" value="RF_PROD_BACKLOG"/> + <condition-expr field-name="statusId" operator="equals" value="CRQ_ACCEPTED"/> + </condition-list> + </entity-count> + <entity-condition list="custReq" entity-name="CustRequestAndCustRequestItem"> + <condition-list combine="and"> + <condition-expr field-name="productId" from-field="parameters.productId" /> + <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" /> + </entity-condition> + </else> + </if-compare> + <set field="index" value="${getNum-1}" /> + <set field="bottomCustReq" from-field="custReq[index]" /> + <!-- loop search selected custReq --> + <loop count="${index}" field="i"><log level="always" message="////////// i : ${i}"></log> + <if-compare-field operator="equals" + field="parameters.custRequestId" to-field="custReq[i].custRequestId"> + <set field="selectedCustReq" from-field="custReq[i]" /> + <set field="diffIndex" value="${index-i}" /> + <set field="selectedIndex" from-field="i" /> + </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" /> + + <entity-one value-field="update" entity-name="CustRequest"> + <field-map field-name="custRequestId" + from-field="custReq[j+selectedIndex+1].custRequestId" /> + </entity-one> + <if-empty field="update"> + <!-- + <add-error><fail-message message="Cannot find with ID [${custReq[j+selectedIndex+1]}]"/></add-error> + <check-errors/> + --> + <else> + <set field="update.sequenceNum" from-field="lowerSeqNum" type="Long" /> + <store-value value-field="update" /> + </else> + </if-empty> + </loop> + <entity-one value-field="update2" entity-name="CustRequest"> + <field-map field-name="custRequestId" from-field="selectedCustReq.custRequestId" /> + </entity-one> + <if-empty field="update2"> + <!-- + <add-error><fail-message message="Cannot find with ID [${selectedCustReq.custRequestId}] and sequenceNum [${bottomCustReq.sequenceNum}]"/></add-error> + <check-errors/> + --> + <else> + <set field="update2.sequenceNum" from-field="bottomCustReq.sequenceNum" type="Long" /> + <store-value value-field="update2" /> + </else> + </if-empty> + </if-compare> + </simple-method> + + <simple-method method-name="getProjectInfoFromTask" + short-description="Get the projectId when a sprint backlog or task is provided." + login-required="true"> + <if-empty field="parameters.taskId"> + <if-empty field="parameters.sprintId"> + <return /> + </if-empty> + </if-empty> + <if-not-empty field="parameters.taskId"><!-- taskId is provided --> + <entity-one entity-name="WorkEffort" value-field="task"> + <field-map field-name="workEffortId" from-field="parameters.taskId" /> + </entity-one> + <if-not-empty field="task"> + <entity-condition list="sprintList" entity-name="ProjectSprintBacklogAndTask"> + <condition-list combine="and"> + <condition-expr field-name="taskId" from-field="parameters.taskId"/> + <condition-expr field-name="sprintTypeId" operator="equals" value="SCRUM_SPRINT"/> + </condition-list> + </entity-condition> + <entity-one value-field="sprint" entity-name="WorkEffort"> + <field-map field-name="workEffortId" from-field="sprintList[0].sprintId"/> + </entity-one> + <else> + <return /> + </else> + </if-not-empty> + <else><!-- phaseId is provided --> + <entity-one entity-name="WorkEffort" value-field="sprint"> + <field-map field-name="workEffortId" from-field="parameters.sprintId" /> + </entity-one> + </else> + </if-not-empty> + + <!-- get project info --> + <if-not-empty field="sprint"> + <!-- get project from sprint --> + <entity-condition list="projectList" entity-name="ProjectSprintBacklogAndTask"> + <condition-list combine="and"> + <condition-expr field-name="sprintId" from-field="sprint.workEffortId"/> + <condition-expr field-name="sprintTypeId" operator="equals" value="SCRUM_SPRINT"/> + <condition-expr field-name="taskId" from-field="parameters.taskId"/> + </condition-list> + </entity-condition> + <first-from-list entry="project" list="projectList"/> + <field-to-result field="project.projectId" + result-name="projectId" /> + <field-to-result field="project.projectName" + result-name="projectName" /> + <field-to-result field="sprint.workEffortId" + result-name="sprintId" /> + <field-to-result field="sprint.workEffortName" + result-name="sprintName" /> + <field-to-result field="task.workEffortId" + result-name="taskId" /> + <field-to-result field="task.workEffortName" + result-name="taskName" /> + <!-- return backlogId and backlogName as result --> + <field-to-result field="project.custRequestId" + result-name="backlogId" /> + <field-to-result field="project.description" + result-name="backlogName" /> + <set field="taskWbsId" + value="${project.projectId}.${sprint.sequenceNum}.${task.sequenceNum}" /> + <field-to-result field="taskWbsId" /> + <else> + <entity-condition list="tasksDetail" entity-name="ProjectSprintBacklogTaskAndParty"> + <condition-list combine="and"> + <condition-expr field-name="taskId" from-field="task.workEffortId"/> + </condition-list> + </entity-condition> + <field-to-result field="task.workEffortId" result-name="taskId" /> + <field-to-result field="task.workEffortName" result-name="taskName" /> + <field-to-result field="tasksDetail[0].custRequestId" result-name="backlogId" /> + <field-to-result field="tasksDetail[0].description" result-name="backlogName" /> + </else> + </if-not-empty> + </simple-method> + + <simple-method method-name="updateTimesheetEntryByWorkeffort" + short-description="Update workeffort by workeffortId and timesheetId "> + <field-to-result field="parameters.timesheetId" + result-name="timesheetId" /> + <if-empty field="parameters.workEffortId"> + <return /> + </if-empty> + <if-compare field="parameters.workEffortId" operator="equals" + value="Totals"> + <return /> + </if-compare> + + <!-- Check : if parameter of workEffortId is leaveTypeId in EmplLeaveType --> + <entity-one value-field="emplLeaveTypeMap" entity-name="EmplLeaveType"> + <field-map field-name="leaveTypeId" from-field="parameters.workEffortId"/> + </entity-one> + <if-not-empty field="emplLeaveTypeMap"> + <!-- Check role --> + <entity-one entity-name="Timesheet" value-field="timesheet" /> + <entity-one entity-name="UserLogin" value-field="systemUserLogin"> + <field-map field-name="userLoginId" value="system"/> + </entity-one> + <entity-one value-field="partyRoleMap" entity-name="PartyRole"> + <field-map field-name="partyId" from-field="timesheet.partyId"/> + <field-map field-name="roleTypeId" value="EMPLOYEE"/> + </entity-one> + <if-empty field="partyRoleMap"> + <set field="partyRoleMap.partyId" from-field="timesheet.partyId"/> + <set field="partyRoleMap.roleTypeId" value="EMPLOYEE"/> + <set field="partyRoleMap.userLogin" from-field="systemUserLogin"/> + <call-service service-name="createPartyRole" in-map-name="partyRoleMap"/> + </if-empty> + <loop count="7" field="dayNr"> + <if> + <condition> + <and> + <if-compare field="parameters.hoursDay${dayNr}" value="-999999" operator="not-equals" /> + </and> + </condition> + <then> + <if-not-empty field="parameters.hoursDay${dayNr}"> + <!-- check day --> + <set field="fromDate" from-field="timesheet.fromDate"/> + <set field="days" value="${dayNr}" type="Integer"/> + <set field="hours" from-field="parameters.hoursDay${dayNr}" type="Integer" default-value="0"/> + <!-- for fromDate and thuDate with time--> + <set field="leaveFromDate" value="${groovy:import java.sql.Timestamp; + return new Timestamp(fromDate.getTime() + ((int) (24L*60L*60L*1000L*days)));}"/> + <set field="emplLeaveFromDate" from-field="leaveFromDate" type="Timestamp"/> + <set field="leaveThruDate" value="${groovy:import java.sql.Timestamp; + return new Timestamp(emplLeaveFromDate.getTime() + ((int) (60L*60L*1000L*hours)));}"/> + <set field="emplLeaveThruDate" from-field="leaveThruDate" type="Timestamp"/> + <entity-one value-field="emplLeaveMap" entity-name="EmplLeave"> + <field-map field-name="partyId" from-field="timesheet.partyId"/> + <field-map field-name="leaveTypeId" from-field="parameters.workEffortId"/> + <field-map field-name="fromDate" from-field="emplLeaveFromDate"/> + </entity-one> + <if-not-empty field="emplLeaveMap"> + <if-compare field="emplLeaveMap.leaveStatus" operator="not-equals" value="LEAVE_APPROVED" > + <if-compare field="parameters.checkComplete" value="Y" operator="equals"> + <set field="emplLeaveMap.leaveStatus" value="LEAVE_APPROVED"/> + <else> + <set field="emplLeaveMap.leaveStatus" value="LEAVE_CREATED"/> + </else> + </if-compare> + <set field="emplLeaveMap.thruDate" from-field="emplLeaveThruDate"/> + <store-value value-field="emplLeaveMap"/> + </if-compare> + <else> + <set field="leaveMap.partyId" from-field="timesheet.partyId"/> + <set field="leaveMap.leaveTypeId" from-field="emplLeaveTypeMap.leaveTypeId"/> + <set field="leaveMap.fromDate" from-field="emplLeaveFromDate"/> + <set field="leaveMap.thruDate" from-field="emplLeaveThruDate"/> + <set field="leaveMap.approverPartyId" value="admin"/> + <if-compare field="parameters.checkComplete" value="Y" operator="equals"> + <set field="leaveMap.leaveStatus" value="LEAVE_APPROVED"/> + <else> + <set field="leaveMap.leaveStatus" value="LEAVE_CREATED"/> + </else> + </if-compare> + <set field="leaveMap.description" from-field="emplLeaveTypeMap.description"/> + <set field="leaveMap.userLogin" from-field="systemUserLogin"/> + <if-compare-field field="emplLeaveThruDate" operator="not-equals" to-field="emplLeaveFromDate" type="Timestamp"> + <call-service service-name="createEmplLeave" in-map-name="leaveMap"/> + </if-compare-field> + </else> + </if-not-empty> + <else> + <set field="fromDate" from-field="timesheet.fromDate"/> + <set field="days" value="${dayNr}" type="Integer"/> + <set field="hours" from-field="parameters.hoursDay${dayNr}" type="Integer" default-value="0"/> + <set field="leaveFromDate" value="${groovy:import java.sql.Timestamp; + return new Timestamp(fromDate.getTime() + ((int) (24L*60L*60L*1000L*days)));}"/> + <set field="emplLeaveFromDate" from-field="leaveFromDate" type="Timestamp"/> + <set field="leaveThruDate" value="${groovy:import java.sql.Timestamp; + return new Timestamp(emplLeaveFromDate.getTime() + ((int) (60L*60L*1000L*hours)));}"/> + <set field="emplLeaveThruDate" from-field="leaveThruDate" type="Timestamp"/> + <entity-one value-field="emplLeave" entity-name="EmplLeave"> + <field-map field-name="partyId" from-field="timesheet.partyId"/> + <field-map field-name="leaveTypeId" from-field="parameters.workEffortId"/> + <field-map field-name="fromDate" from-field="emplLeaveFromDate"/> + </entity-one> + <!-- remove Leave Transaction --> + <if-not-empty field="emplLeave"> + <if-compare-field field="emplLeaveThruDate" operator="equals" to-field="emplLeaveFromDate" type="Timestamp"> + <remove-value value-field="emplLeave"/> + </if-compare-field> + </if-not-empty> + </else> + </if-not-empty> + </then> + </if> + </loop> + <else> + <entity-one entity-name="Timesheet" value-field="timesheet" /> + <entity-one entity-name="WorkEffort" value-field="taskStatus"> + <field-map field-name="workEffortId" from-field="parameters.workEffortId" /> + </entity-one> + + <!-- check if party assigned to task, when not add with roletype of project, if assigned check status --> + <entity-and entity-name="WorkEffortPartyAssignment" list="assigns" filter-by-date="true"> + <field-map field-name="workEffortId" from-field="parameters.workEffortId"/> + <field-map field-name="partyId" from-field="timesheet.partyId"/> + </entity-and> + <entity-and entity-name="ProjectSprintBacklogAndTask" list="meetingTasks"> + <field-map field-name="taskId" from-field="parameters.workEffortId"/> + <field-map field-name="sprintTypeId" value="SCRUM_SPRINT"/> + <field-map field-name="custRequestTypeId" value="RF_SCRUM_MEETINGS"/> + </entity-and> + <set field="parameters.partyId" from-field="timesheet.partyId"/> + <set field="isTaskAssings" value="Y"/> + <set field="isTaskMeeting" value="N"/> + <if-not-empty field="meetingTasks"> + <set field="isTaskMeeting" value="Y"/> + </if-not-empty> + <if-empty field="assigns"> + <set field="isTaskAssings" value="N"/> + </if-empty> + <check-errors /> + <!-- check if the task don't assign to partyId --> + <if-compare operator="equals" value="Y" field="isTaskAssings"> + <!-- check if the actual start date is set, when not set it to todays date --> + <if-empty field="project.actualStartDate"> + <entity-one entity-name="WorkEffort" value-field="workEffort" /> + <now-timestamp field="workEffort.actualStartDate" /> + <store-value value-field="workEffort" /> + </if-empty> + + <get-related value-field="timesheet" relation-name="TimeEntry" list="timeEntries" /> + <!-- update existing entries --> + <if-compare field="taskStatus.currentStatusId" value="STS_COMPLETED" operator="not-equals"> + <set field="hours" value="0" type="Double" /> + <set field="planHours" value="0" type="Double" /> + <if-not-empty field="timeEntries"> + <iterate entry="timeEntry" list="timeEntries"> + <if-compare-field field="timeEntry.workEffortId" to-field="parameters.workEffortId" operator="equals"> + <if-compare-field field="timeEntry.timesheetId" to-field="parameters.timesheetId" operator="equals"> + <if-compare-field field="timeEntry.partyId" to-field="parameters.partyId" operator="equals"> + <if> + <condition> + <or> + <not> + <if-empty field="timeEntry.hours" /> + </not> + <not> + <if-empty field="timeEntry.planHours" /> + </not> + </or> + </condition> + <then> + <remove-value value-field="timeEntry" /> + </then> + <else> + <!-- translate the date into the day number --> + <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" method-name="getIntervalInDays" ret-field="dayNumber"> + <field field="timesheet.fromDate" type="java.sql.Timestamp" /> + <field field="timeEntry.fromDate" type="java.sql.Timestamp" /> + </call-class-method> + <!-- get the related field --> + <if-not-empty field="parameters.hoursDay${dayNumber}"> + <set field="hours" from-field="parameters.hoursDay${dayNumber}" type="Double" /> + <else> + <set field="hours" value="0" type="Double" /> + </else> + </if-not-empty> + <if-not-empty field="parameters.planHoursDay${dayNumber}"> + <set field="planHours" from-field="parameters.planHoursDay${dayNumber}" type="Double" /> + <else> + <set field="planHours" value="0" type="Double" /> + </else> + </if-not-empty> + + <!-- update the time entry --> + <call-simple-method method-name="updateTimeEntry" /> + + <set field="parameters.hoursDay${dayNumber}" value="-999999" type="Double" /> + <set field="parameters.planHoursDay${dayNumber}" value="-999999" type="Double" /> + </else> + </if> + </if-compare-field> + </if-compare-field> + </if-compare-field> + </iterate> + </if-not-empty> + + <!-- process not yet done fields --> + <loop count="7" field="dayNr"> + <if> + <condition> + <and> + <if-compare field="parameters.hoursDay${dayNr}" value="-999999" operator="not-equals" /> + <if-compare field="parameters.planHoursDay${dayNr}" value="-999999" operator="not-equals" /> + <or> + <not> + <if-empty field="parameters.hoursDay${dayNr}" /> + </not> + <not> + <if-empty field="parameters.planHoursDay${dayNr}" /> + </not> + </or> + </and> + </condition> + <then> + <if-empty field="parameters.hoursDay${dayNr}"> + <set field="hours" value="0" type="Double" /> + <else> + <set field="hours" from-field="parameters.hoursDay${dayNr}" type="Double" /> + </else> + </if-empty> + <if-empty field="parameters.planHoursDay${dayNr}"> + <entity-one entity-name="WorkEffort" value-field="task" /> + <set field="planHours" value="${task.estimatedMilliSeconds/1000/60/60}" + type="Double" /> + <else> + <set field="planHours" from-field="parameters.planHoursDay${dayNr}" + type="Double" /> + </else> + </if-empty> + <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" + method-name="addDaysToTimestamp" ret-field="fromDate"> + <field field="timesheet.fromDate" type="java.sql.Timestamp" /> + <field field="dayNr" type="int" /> + </call-class-method> + <!-- update the time entry --> + <call-simple-method method-name="updateTimeEntry" /> + </then> + </if> + </loop> + <else> + <!-- update the time entry on task completed --> + <if-not-empty field="timeEntries"> + <iterate entry="timeEntry" list="timeEntries"> + <if-compare-field field="timeEntry.workEffortId" to-field="parameters.workEffortId" operator="equals"> + <if-compare-field field="timeEntry.timesheetId" to-field="parameters.timesheetId" operator="equals"> + <if-compare-field field="timeEntry.partyId" to-field="parameters.partyId" operator="equals"> + <set field="timeEntry.rateTypeId" from-field="parameters.rateTypeId" /> + <store-value value-field="timeEntry"/> + </if-compare-field> + </if-compare-field> + </if-compare-field> + </iterate> + </if-not-empty> + </else> + </if-compare> + + <if-empty field="parameters.planHours"> + <set field="parameters.planHours" from-field="planHours" /> + </if-empty> + <!-- Update plan hour --> + <if-not-empty field="parameters.planHours"> + <!-- Check plan hour --> + <if-compare operator="less" value="0" field="parameters.planHours" + type="Double"> + <property-to-field resource="scrumUiLabels" + property="ScrumNotAllowSetActualHours" field="scrumNotAllowSetActualHours" /> + <add-error> + <fail-message + message="Don't allow plan hours is less than zero on Task Id : ${parameters.workEffortId}" /> + </add-error> + <check-errors /> + </if-compare> + <if-compare field="parameters.checkComplete" value="Y" operator="equals"> + <if-compare field="taskStatus.currentStatusId" value="STS_COMPLETED" operator="equals"> + <if-compare-field operator="not-equals" field="parameters.planHours" to-field="parameters.actualHours" type="Double"> + <set field="parameters.planHours" from-field="parameters.actualHours" /> + </if-compare-field> + <else> + <set field="actualMap.taskId" from-field="parameters.workEffortId" /> + + <if-compare operator="equals" field="isTaskMeeting" value="Y"> + <set field="actualMap.partyId" from-field="userLogin.partyId" /> + </if-compare> + <call-service service-name="getScrumActualHour" in-map-name="actualMap"> + <result-to-field result-name="actualHours" /> + </call-service> + <if-compare-field operator="not-equals" field="parameters.planHours" to-field="actualHours" type="Double"> + <set field="parameters.planHours" from-field="actualHours" /> + </if-compare-field> + </else> + </if-compare> + </if-compare> + <now-timestamp field="nowTimestamp" /> + <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" + method-name="getDayStart" ret-field="dayStart"> + <field field="nowTimestamp" type="java.sql.Timestamp" /> + </call-class-method> + <call-class-method class-name="org.ofbiz.base.util.UtilDateTime" + method-name="getDayEnd" ret-field="dayEnd"> + <field field="nowTimestamp" type="java.sql.Timestamp" /> + </call-class-method> + <entity-condition entity-name="TimeEntry" list="lastTimeEntrys"> + <condition-list combine="and"> + <condition-expr field-name="workEffortId" from-field="parameters.workEffortId" /> + <condition-expr field-name="partyId" from-field="userLogin.partyId" /> + </condition-list> + <order-by field-name="-fromDate" /> + </entity-condition> + <first-from-list entry="lastTimeEntry" list="lastTimeEntrys" /> + <if-not-empty field="lastTimeEntry"> + <set field="lastTimeEntry.planHours" from-field="parameters.planHours" /> + <set field="lastTimeEntry.rateTypeId" from-field="parameters.rateTypeId" /> + <store-value value-field="lastTimeEntry" /> + <!--<else> + <set-service-fields service-name="createTimeEntry" map="parameters" to-map="teCreMap" /> + <set field="teCreMap.fromDate" from-field="dayStart" /> + <set field="teCreMap.partyId" from-field="userLogin.partyId"/> + <call-service service-name="createTimeEntry" in-map-name="teCreMap" /> + </else>--> + </if-not-empty> + </if-not-empty> + <!-- Check actual hour --> + <set field="taskActualMap.taskId" from-field="parameters.workEffortId" /> + <set field="taskActualMap.partyId" from-field="userLogin.partyId" /> + <call-service service-name="getScrumActualHour" + in-map-name="taskActualMap"> + <result-to-field result-name="actualHours" /> + </call-service> + <set field="taskPlanMap.taskId" from-field="parameters.workEffortId" /> + <set field="taskPlanMap.partyId" from-field="userLogin.partyId" /> + <call-service service-name="getScrumPlanHour" in-map-name="taskPlanMap"> + <result-to-field result-name="planHours" /> + </call-service> + <if-compare-field field="actualHours" operator="greater" type="Double" to-field="planHours"> + <property-to-field resource="scrumUiLabels" + property="ScrumNotAllowSetActualHours" field="scrumNotAllowSetActualHours" /> + <add-error> + <fail-message message="${scrumNotAllowSetActualHours} on Task Id : ${parameters.workEffortId}" /> + </add-error> + <check-errors /> + </if-compare-field> + <!-- update the assignment status if required --> + <if-compare field="parameters.checkComplete" value="Y" operator="equals"> + <if-compare field="hours" operator="not-equals" value="0"> + <entity-and entity-name="WorkEffortPartyAssignment" list="assigns" filter-by-date="true"> + <field-map field-name="workEffortId" from-field="parameters.workEffortId" /> + <field-map field-name="partyId" from-field="timesheet.partyId" /> + </entity-and> + <if-compare operator="not-equals" value="SCAS_COMPLETED" field="assigns[0].statusId"> + <first-from-list entry="alreadyAssign" list="assigns" /> + <if-compare field="alreadyAssign.statusId" value="SCAS_COMPLETED" operator="not-equals"> + <set field="upStat.partyId" from-field="timesheet.partyId" /> + <set field="upStat.statusId" value="SCAS_COMPLETED" /> + <set field="upStat.roleTypeId" from-field="alreadyAssign.roleTypeId" /> + <set field="upStat.workEffortId" from-field="parameters.workEffortId" /> + <set field="upStat.fromDate" from-field="alreadyAssign.fromDate" /> + <set field="upStat.webSiteId" from-field="parameters.webSiteId" /> + <call-service service-name="updateScrumTaskAssigment" in-map-name="upStat" /> + </if-compare> + </if-compare> + </if-compare> + </if-compare> + <else> + <get-related value-field="timesheet" relation-name="TimeEntry" list="timeEntries" /> + <!-- update the time entry on task completed --> + <if-not-empty field="timeEntries"> + <iterate entry="timeEntry" list="timeEntries"> + <if-compare-field field="timeEntry.workEffortId" to-field="parameters.workEffortId" operator="equals"> + <if-compare-field field="timeEntry.timesheetId" to-field="parameters.timesheetId" operator="equals"> + <if-compare-field field="timeEntry.partyId" to-field="parameters.partyId" operator="equals"> + <set field="timeEntry.rateTypeId" from-field="parameters.rateTypeId" /> + <store-value value-field="timeEntry"/> + </if-compare-field> + </if-compare-field> + </if-compare-field> + </iterate> + </if-not-empty> + </else> + </if-compare> + + <!--if plan hours(from task) more than first plan hours --> + <entity-and list="custRequestWorkEffortList" entity-name="CustRequestWorkEffort"> + <field-map field-name="workEffortId" from-field="parameters.workEffortId"/> + </entity-and> + <first-from-list entry="custRequestWorkEffortMap" list="custRequestWorkEffortList"/> + <set field="backlogPlanMap.custRequestId" from-field="custRequestWorkEffortMap.custRequestId" /> + <set field="taskPlanMap.custRequestId" from-field="custRequestWorkEffortMap.custRequestId" /> + <call-service service-name="getScrumPlanHour" in-map-name="backlogPlanMap"> + <result-to-field result-name="planHours" /> + </call-service> + <call-service service-name="getScrumPlanHour" in-map-name="taskPlanMap"> + <result-to-field result-name="initPlanHours"/> + </call-service> + <if-compare-field field="planHours" operator="greater" to-field="initPlanHours" type="Double"> + <entity-one value-field="custRequestMap" entity-name="CustRequest"> + <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"/> + <store-value value-field="custRequestMap"/> + <else> + <if-compare-field field="initPlanHours" operator="greater" to-field="planHours" type="Double"> + <entity-one value-field="custRequestMap" entity-name="CustRequest"> + <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"/> + <store-value value-field="custRequestMap"/> + </if-compare-field> + </else> + </if-compare-field> + </else> + </if-not-empty> + </simple-method> + + <simple-method method-name="updateTimeEntry" + short-description=""> + <if-compare field="hours" value="-1" operator="equals"> + <return /> + </if-compare> + <if-not-empty field="timeEntry.timeEntryId"> + <if-compare field="hours" operator="equals" value="0" type="Double"> + <set field="teDelMap.timeEntryId" from-field="timeEntry.timeEntryId" /> + <call-service service-name="deleteTimeEntry" + in-map-name="teDelMap" /> + <else> + <clear-field field="teUpdMap" /> + <set field="teUpdMap.hours" from-field="hours" type="Double" /> + <set field="teUpdMap.planHours" from-field="planHours" type="Double" /> + <set field="teUpdMap.timeEntryId" from-field="timeEntry.timeEntryId" /> + <set field="teUpdMap.workEffortId" from-field="parameters.workEffortId" /> + <set field="teUpdMap.timesheetId" from-field="parameters.timesheetId" /> + <set field="teUpdMap.rateTypeId" from-field="parameters.rateTypeId" /> + <set field="teUpdMap.partyId" from-field="parameters.partyId"/> + <call-service service-name="updateTimeEntry" + in-map-name="teUpdMap" /> + </else> + </if-compare> + <else> + <if> + <condition> + <or> + <not> + <if-empty field="hours" /> + </not> + <not> + <if-empty field="planHours" /> + </not> + </or> + </condition> + <then> + <if-compare field="hours" operator="greater" value="0" type="Double"> + <set-service-fields service-name="createTimeEntry" + map="parameters" to-map="teCreMap" /> + <set field="teCreMap.planHours" from-field="planHours" type="Double" /> + <set field="teCreMap.hours" from-field="hours" type="Double" /> + <set field="teCreMap.fromDate" from-field="fromDate" /> + <set field="teCreMap.partyId" from-field="parameters.partyId"/> + <set field="teCreMap.workEffortId" from-field="parameters.workEffortId" /> + <set field="teCreMap.timesheetId" from-field="parameters.timesheetId" /> + <call-service service-name="createTimeEntry" + in-map-name="teCreMap" /> + </if-compare> + </then> + </if> + </else> + </if-not-empty> + </simple-method> + + <simple-method method-name="getScrumActualHour" + short-description="Get actual hour from (Project, Sprint , Sprint Backlog and Task)."> + <if> + <condition> + <or> + <not> + <if-empty field="parameters.projectId" /> + </not> + <not> + <if-empty field="parameters.sprintId" /> + </not> + <not> + <if-empty field="parameters.custRequestId" /> + </not> + </or> + </condition> + <then> + <if-not-empty field="parameters.custRequestId"> + <entity-and entity-name="CustRequest" list="resultCustType"> + <field-map field-name="custRequestId" from-field="parameters.custRequestId" /> + <field-map field-name="custRequestTypeId" value="RF_UNPLAN_BACKLOG" /> + </entity-and> + </if-not-empty> + <if-empty field="resultCustType"> + <entity-condition list="tasks" entity-name="ProjectSprintBacklogAndTask"> + <condition-list combine="and"> + <condition-expr field-name="projectId" operator="equals" from-field="parameters.projectId" ignore-if-empty="true" /> + <condition-expr field-name="sprintId" operator="equals" from-field="parameters.sprintId" ignore-if-empty="true" /> + <condition-expr field-name="custRequestId" operator="equals" from-field="parameters.custRequestId" ignore-if-empty="true" /> + <condition-expr field-name="sprintTypeId" operator="equals" value="SCRUM_SPRINT" /> + <condition-list combine="or"> + <condition-expr field-name="taskTypeId" operator="equals" value="SCRUM_TASK_ERROR" /> + <condition-expr field-name="taskTypeId" operator="equals" value="SCRUM_TASK_IMPL" /> + <condition-expr field-name="taskTypeId" operator="equals" value="SCRUM_TASK_INST" /> + <condition-expr field-name="taskTypeId" 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.taskId" /> + </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> + <else> + <entity-condition list="tasks" entity-name="UnPlannedBacklogsAndTasks"> + <condition-list combine="and"> + <condition-expr field-name="custRequestId" from-field="parameters.custRequestId"/> + <condition-expr field-name="custRequestTypeId" value="RF_UNPLAN_BACKLOG"/> + <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> + </else> + </if-empty> + </then> + </if> + + <!-- get time entry from task --> + <if-not-empty field="parameters.taskId"> + <entity-condition list="timeEntries" entity-name="TimeEntry"> + <condition-list combine="and"> + <condition-expr field-name="workEffortId" from-field="parameters.taskId"/> + <condition-expr field-name="partyId" from-field="parameters.partyId" ignore-if-empty="true"/> + </condition-list> + </entity-condition> + <else> + <if-not-empty field="taskIdCond"> + <entity-condition list="timeEntries" entity-name="TimeEntry"> + <condition-list combine="and"> + <condition-expr field-name="workEffortId" operator="in" from-field="taskIdCond"/> + </condition-list> + </entity-condition> + <entity-condition list="listTimeEntriesNotBill" entity-name="TimeEntry"> + <condition-list combine="and"> + <condition-expr field-name="workEffortId" operator="in" from-field="taskIdCond"/> + <condition-expr field-name="invoiceId" operator="equals" from-field="nullField"/> + </condition-list> + </entity-condition> + </if-not-empty> + </else> + </if-not-empty> + <set field="actualHours" type="Double" value="0.0" /> + <if-not-empty field="timeEntries"> + <iterate entry="timeEntry" list="timeEntries"> + <if-not-empty field="timeEntry.hours"> + <calculate field="actualHours" type="Double"> + <calcop operator="add" field="timeEntry.hours"> + <calcop operator="get" field="actualHours" /> + </calcop> + </calculate> + </if-not-empty> + </iterate> + </if-not-empty> + <set field="actualHoursNotBillYet" type="Double" value="0.0" /> + <if-not-empty field="listTimeEntriesNotBill"> + <iterate entry="timeEntryNotBill" list="listTimeEntriesNotBill"> + <if-not-empty field="timeEntryNotBill.partyId"> + <entity-and entity-name="PartyRate" list="partyRates" filter-by-date="true"> + <field-map field-name="rateTypeId" from-field="timeEntryNotBill.rateTypeId"/> + <field-map field-name="partyId" from-field="timeEntryNotBill.partyId"/> + </entity-and> + <if-not-empty field="partyRates"> + <first-from-list entry="partyRate" list="partyRates"/> + <if-not-empty field="partyRate.percentageUsed"> + <calculate field="timeEntryNotBill.hours" type="Double"> + <calcop operator="multiply" field="timeEntryNotBill.hours"> + <calcop operator="get" field="partyRate.percentageUsed"/> + </calcop> + </calculate> + <calculate field="timeEntryNotBill.hours" type="Double"> + <calcop operator="divide" field="timeEntryNotBill.hours"> + <number value="100"/> + </calcop> + </calculate> + </if-not-empty> + </if-not-empty> + </if-not-empty> + <if-not-empty field="timeEntryNotBill.hours"> + <calculate field="actualHoursNotBillYet" type="Double"> + <calcop operator="add" field="timeEntryNotBill.hours"> + <calcop operator="get" field="actualHoursNotBillYet" /> + </calcop> + </calculate> + </if-not-empty> + </iterate> + </if-not-empty> + <field-to-result field="actualHours" result-name="actualHours" /> + <field-to-result field="actualHoursNotBillYet" result-name="actualHoursNotBillYet" /> + </simple-method> + + <simple-method method-name="getScrumActualHourByTimesheet" short-description=" Get actual hour from (TimeSheet)."> + <if-not-empty field="parameters.timesheetId"> + <entity-condition list="timeEntries" entity-name="TimeEntry"> + <condition-list combine="and"> + <condition-expr field-name="timesheetId" from-field="parameters.timesheetId"/> + </condition-list> + </entity-condition> + </if-not-empty> + <set field="actualHours" type="Double" value="0.0" /> + <if-not-empty field="timeEntries"> + <iterate entry="timeEntry" list="timeEntries"> + <calculate field="actualHours" type="Double"> + <calcop operator="add" field="timeEntry.hours"> + <calcop operator="get" field="actualHours" /> + </calcop> + </calculate> + </iterate> + </if-not-empty> + <field-to-result field="actualHours" result-name="actualHours" /> + </simple-method> + + <simple-method method-name="updateScrumTaskAssigment" + short-description="Update task to resource assignment, if required create a new one by re-assigment" + login-required="true"> + <field-to-result field="parameters.workEffortId" + result-name="workEffortId" /> + <if> + <!-- check if a change in partyId Or roletypeId: need to delete and create new --> + <condition> + <or> + <and> + <not> + <if-empty field="parameters.newPartyId" /> + </not> + <if-compare-field field="parameters.partyId" + to-field="parameters.newPartyId" operator="not-equals" /> + </and> + <and> + <not> + <if-empty field="parameters.newRoleTypeId" /> + </not> + <if-compare-field field="parameters.roleTypeId" + to-field="parameters.newRoleTypeId" operator="not-equals" /> + </and> + </or> + </condition> + <then> + <!-- roleType and/or partyId changed: end old and create new assign --> + <entity-one entity-name="WorkEffortPartyAssignment" + value-field="workEffortPartyAssignment" /> + <set field="workEffortPartyAssignment.delegateReasonEnumId" + from-field="parameters.delegateReasonEnumId" /> + <set field="workEffortPartyAssignment.comments" from-field="parameters.comments" /> + <set field="workEffortPartyAssignment.assignedByUserLoginId" + from-field="userLogin.userLoginId" /> + <now-timestamp field="workEffortPartyAssignment.thruDate" /> + <store-value value-field="workEffortPartyAssignment" /> + <!-- create a new one --> + <make-value value-field="newAssign" entity-name="WorkEffortPartyAssignment" /> + <set field="newAssign.workEffortId" from-field="parameters.workEffortId" /> + <set field="newAssign.partyId" from-field="parameters.newPartyId" /> + <set field="newAssign.roleTypeId" from-field="parameters.newRoleTypeId" /> + <set field="newAssign.assignedByUserLoginId" from-field="userLogin.userLoginId" /> + <now-timestamp field="newAssign.fromDate" /> + <set field="newAssign.statusId" value="SCAS_ASSIGNED" /> + <create-value value-field="newAssign" /> + </then> + <else> + <set field="fromDate" from-field="parameters.fromDate" type="Timestamp" /> + <entity-one entity-name="WorkEffortPartyAssignment" + value-field="assignment"> + <field-map field-name="workEffortId" from-field="parameters.workEffortId" /> + <field-map field-name="partyId" from-field="parameters.partyId" /> + <field-map field-name="roleTypeId" from-field="parameters.roleTypeId" /> + <field-map field-name="fromDate" from-field="fromDate" /> + </entity-one> + <if-not-empty field="assignment"> + <!-- status changed or assignment ended --> + <set-nonpk-fields value-field="assignment" map="parameters" /> + <store-value value-field="assignment" /> + <if-compare field="assignment.statusId" value="SCAS_COMPLETED" + operator="equals"> + <call-simple-method method-name="updateScrumTaskStatusToComplete" /> + </if-compare> + <else> + <!-- new assignment --> + <call-simple-method method-name="assignPartyToWorkEffort" + xml-resource="component://workeffort/script/org/ofbiz/workeffort/workeffort/WorkEffortSimpleServices.xml" /> + </else> + </if-not-empty> + </else> + </if> + </simple-method> + + <simple-method method-name="updateScrumTaskStatusToComplete" + short-description="Check partyassignments on a task, if all completes set task status to completed and set actual completiondate to now"> + <entity-and entity-name="WorkEffortPartyAssignment" list="assignments" + filter-by-date="true"> + <field-map field-name="workEffortId" from-field="parameters.workEffortId" /> + </entity-and> + <!-- check if all open assignments were completed --> + <if-not-empty field="assignments"> + <iterate entry="assignment" list="assignments"> + <if-compare field="assignment.statusId" value="SCAS_COMPLETED" operator="not-equals"> + <set field="status" value="notcomplete" /> + </if-compare> + </iterate> + </if-not-empty> + <if-empty field="status"> + <now-timestamp field="parameters.actualCompletionDate" /> + <set field="update.workEffortId" from-field="parameters.workEffortId" /> + <set field="update.currentStatusId" value="STS_COMPLETED"/> + <set field="update.webSiteId" from-field="parameters.webSiteId" /> + <call-service service-name="updateWorkEffort" in-map-name="update" /> + </if-empty> + </simple-method> + <simple-method method-name="addProductTimeToNewInvoice" + short-description="add all reported time on all completed timesheets from all workefforts for a product"> + <!-- 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" /> + <if-empty field="invoice"> + <add-error> + <fail-message + message="Could not find invoice with ID [${parameters.invoiceId}], not adding Timesheet Entries to it." /> + </add-error> + <check-errors /> + </if-empty> + <if-compare field="invoice.statusId" operator="not-equals" + value="INVOICE_IN_PROCESS"> + <add-error> + <fail-message + message="Invoice with ID [${parameters.invoiceId}], has the wrong status, not adding Timesheet Entries to it." /> + </add-error> + <check-errors /> + </if-compare> + <set field="invoice.partyId" from-field="parameters.partyId"/> + <store-value value-field="invoice"/> + <entity-and list="entries" entity-name="TimeEntry"> + <field-map field-name="invoiceId" from-field="parameters.invoiceId" /> + </entity-and> + <iterate list="entries" entry="timeEntry"> + <clear-field field="timeEntry.invoiceId" /> + <clear-field field="timeEntry.invoiceItemSeqId" /> + <store-value value-field="timeEntry" /> + </iterate> + <set field="removeItems.invoiceId" from-field="parameters.invoiceId" /> + <remove-by-and entity-name="InvoiceItem" map="removeItems" /> + <set field="notFirst" value="Y" /><!-- do not create, only add --> + </if-compare> + <!-- get partyId in Company --> + <entity-condition list="listPartyIdInCompany" entity-name="PartyRelationship"> + <condition-list combine="and"> + <condition-expr field-name="partyIdFrom" from-field="parameters.partyIdFrom"/> + <condition-expr field-name="roleTypeIdFrom" value="ACCOUNT" /> + <condition-expr field-name="roleTypeIdTo" value="CONTACT" /> + <condition-expr field-name="partyRelationshipTypeId" value="EMPLOYMENT" /> + </condition-list> + <select-field field-name="partyIdTo"/> + </entity-condition> + <iterate entry="partyRelationship" list="listPartyIdInCompany"> + <set field="partyIdAllInCompany[+0]" from-field="partyRelationship.partyIdTo"/> + </iterate> + <if-empty field="partyIdAllInCompany"> + <add-error> + <fail-message message="There is no party in this company" /> + </add-error> + <check-errors /> + </if-empty> + <if-compare field="parameters.includeMeeting" operator="equals" value="N"> + <set field="custRequestTypeId" value="RF_SCRUM_MEETINGS"/> + </if-compare> + <!-- get tasks from backlog item --> + <entity-condition entity-name="ProjectSprintBacklogTaskAndTimeEntryTimeSheet" + list="sprintTasks"> + <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"/> + <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"> + <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"/> + <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> + <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(unplannedTasks)}"/> + <if-empty field="tasks"> + <add-error> + <fail-message message="No timeentry items found" /> + </add-error> + <check-errors /> + </if-empty> + <iterate entry="task" list="tasks"> + <if-empty field="notFirst"> + <!-- first time so create invoice --> + <set-service-fields service-name="addWorkEffortTimeToNewInvoice" + 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" + in-map-name="addTaskToNewInvoice"> + <result-to-field result-name="invoiceId" field="parameters.invoiceId" /> + </call-service> + <set field="addTaskToInvoice.combineInvoiceItem" value="Y" /> + <field-to-result field="parameters.invoiceId" + result-name="invoiceId" /> + <set field="notFirst" value="Y" /> + <else> + <if> + <condition> + <or> + <if-empty field="oldWorkeffortId" /> + <if-compare-field operator="not-equals" field="oldWorkeffortId" + to-field="task.taskId" /> + </or> + </condition> + <then> + <!-- 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" /> + </then> + </if> + <set field="oldWorkeffortId" from-field="task.taskId" /> + </else> + </if-empty> + </iterate> + </simple-method> + <simple-method method-name="removeInvoiceInTimeEntry" short-description="Remove Invoice In TimeEntry"> + <entity-and list="timeEntryList" entity-name="TimeEntry"> + <field-map field-name="invoiceId" from-field="parameters.invoiceId"/> + </entity-and> + <if-not-empty field="timeEntryList"> + <iterate entry="timeEntryMap" list="timeEntryList"> + <set field="timeEntryMap.invoiceId" from-field="nullField"/> + <set field="timeEntryMap.invoiceItemSeqId" from-field="nullField"/> + <log level="info" message="Upadte value === >>> timeEntryId = ${timeEntryMap}"></log> + <store-value value-field="timeEntryMap"/> + </iterate> + </if-not-empty> + </simple-method> + + <simple-method method-name="getScrumPlanHour" + short-description="Get plan hour of backlog"> + <set field="planHours" type="Double" value="0.0" /> + <set field="initPlanHours" type="Double" value="0.0" /> + <!-- Get by CustRequest --> + <if-not-empty field="parameters.projectId"> + <call-simple-method method-name="getScrumProjectPlanHour" /> + <set field="planHours" type="Double" from-field="projectPlanHours" /> + <call-simple-method method-name="getScrumProjectInitPlanHour" /> + <set field="initPlanHours" type="Double" from-field="projectInitPlanHours" /> + <else> + <if-not-empty field="parameters.sprintId"> + <call-simple-method method-name="getScrumSprintPlanHour" /> + <set field="planHours" type="Double" from-field="sprintPlanHours" /> + <call-simple-method method-name="getScrumSprintInitPlanHour" /> + <set field="initPlanHours" type="Double" from-field="sprintInitPlanHours" /> + <else> + <if-not-empty field="parameters.custRequestId"> + <call-simple-method method-name="getScrumBacklogPlanHour" /> + <set field="planHours" type="Double" from-field="backlogPlanHours" /> + <call-simple-method method-name="getScrumBacklogInitPlanHour" /> + <set field="initPlanHours" type="Double" from-field="backlogInitPlanHours" /> + <else> + <if-not-empty field="parameters.taskId"> + <call-simple-method method-name="getScrumTaskPlanHour" /> + <set field="planHours" type="Double" from-field="taskPlanHours" /> + <set field="initPlanHours" type="Double" from-field="taskPlanHours" /> + </if-not-empty> + </else> + </if-not-empty> + </else> + </if-not-empty> + </else> + </if-not-empty> + <field-to-result field="initPlanHours" /> + <field-to-result field="planHours" /> + </simple-method> + + <simple-method method-name="getScrumTaskPlanHour" + short-description="Get Scrum Task Plan Hour"> + <!-- Get plan hours in a task --> + <set field="taskPlanHours" type="Double" value="0" /> + <entity-condition entity-name="TimeEntry" list="timeEntries"> + <condition-list combine="and"> + <condition-expr field-name="planHours" operator="greater" value="0" /> + <condition-expr field-name="workEffortId" operator="equals" from-field="parameters.taskId" /> + </condition-list> [... 1573 lines stripped ...] |
Free forum by Nabble | Edit this page |