blob: 8cd6a03bd76f20beee04713e1624af8000642351 [file] [log] [blame]
/*
* 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.
*/
import java.util.*;
import java.lang.*;
import org.apache.ofbiz.base.util.*;
import org.apache.ofbiz.entity.*;
import org.apache.ofbiz.base.util.Debug;
import org.apache.ofbiz.base.util.UtilMisc;
import org.apache.ofbiz.base.util.UtilValidate;
import org.apache.ofbiz.base.util.UtilDateTime;
import org.apache.ofbiz.entity.util.*;
import org.apache.ofbiz.entity.condition.*;
import org.apache.ofbiz.webapp.website.WebSiteWorker;
import java.sql.Timestamp;
uiLabelMap = UtilProperties.getResourceBundleMap("scrumUiLabels", locale);
partyId = parameters.partyId;
if (!partyId) {
partyId = parameters.userLogin.partyId;
}
// show the requested timesheet, otherwise the current , if not exist create
timesheet = null;
timesheetId = parameters.timesheetId;
if (timesheetId) {
timesheet = from("Timesheet").where("timesheetId", timesheetId).queryOne();
partyId = timesheet.partyId; // use the party from this timesheet
} else {
// make sure because of timezone changes, not a duplicate timesheet is created
midweek = UtilDateTime.addDaysToTimestamp(UtilDateTime.getWeekStart(UtilDateTime.nowTimestamp()),3);
entryExprs = EntityCondition.makeCondition([
EntityCondition.makeCondition("fromDate", EntityComparisonOperator.LESS_THAN, midweek),
EntityCondition.makeCondition("thruDate", EntityComparisonOperator.GREATER_THAN, midweek),
EntityCondition.makeCondition("partyId", EntityComparisonOperator.EQUALS, partyId)
], EntityOperator.AND);
entryIterator = from("Timesheet").where(entryExprs).queryIterator();
timesheet = entryIterator.next();
entryIterator.close();
if (timesheet == null) {
result = runService('createProjectTimesheet', ["userLogin" : parameters.userLogin, "partyId" : partyId]);
if (result && result.timesheetId) {
timesheet = from("Timesheet").where("timesheetId", result.timesheetId).queryOne();
}
}
}
if (!timesheet) return;
context.timesheet = timesheet;
context.weekNumber = UtilDateTime.weekNumber(timesheet.fromDate);
// get the user names
context.partyNameView = from("PartyNameView").where("partyId", partyId).queryOne();
// get the default rate for this person
rateTypes = from("PartyRate").where("partyId", partyId, "defaultRate", "Y").filterByDate().queryList();
if (rateTypes) {
context.defaultRateTypeId = rateTypes[0].rateTypeId;
}
entries = [];
entry = ["timesheetId" : timesheet.timesheetId];
leaveEntry = ["timesheetId" : timesheet.timesheetId];
taskTotal = 0.00;
planTotal = 0.00;
leaveTaskTotal = 0.00;
leavePlanTotal = 0.00;
day0Total = 0.00; day1Total=0.00; day2Total=0.00; day3Total=0.00; day4Total=0.00; day5Total=0.00; day6Total=0.00;
pDay0Total = 0.00; pDay1Total=0.00; pDay2Total=0.00; pDay3Total=0.00; pDay4Total=0.00; pDay5Total=0.00; pDay6Total=0.00;
pHours = 0.00;
timeEntry = null;
lastTimeEntry = null;
emplLeaveEntry = null;
lastEmplLeaveEntry = null;
// retrieve work effort data when the workeffortId has changed.
void retrieveWorkEffortData() {
// get the planned number of hours
entryWorkEffort = lastTimeEntry.getRelatedOne("WorkEffort", false);
if (entryWorkEffort) {
plannedHours = entryWorkEffort.getRelated("WorkEffortSkillStandard", null, null, false);
pHours = 0.00;
plannedHours.each { plannedHour ->
if (plannedHour.estimatedDuration) {
pHours += plannedHour.estimatedDuration;
}
}
estimatedHour = 0.00;
estimatedMilliSeconds = entryWorkEffort.estimatedMilliSeconds
if (estimatedMilliSeconds > 0)
estimatedHour = estimatedMilliSeconds/3600000;
entry.plannedHours = estimatedHour;
//entry.plannedHours = pHours;
planHours = 0.0;
planHours = lastTimeEntry.planHours;
lastTimeEntryOfTasks = from("TimeEntry").where("workEffortId", lastTimeEntry.workEffortId, "partyId", partyId).orderBy("-fromDate").queryList();
if (lastTimeEntryOfTasks.size() != 0) lastTimeEntry = lastTimeEntryOfTasks[0];
if (planHours < 1) {
planHours = estimatedHour;
}
entry.planHours = lastTimeEntry.planHours;
actualHours = entryWorkEffort.getRelated("TimeEntry", null, null, false);
aHours = 0.00;
actualHours.each { actualHour ->
if (actualHour.hours) {
aHours += actualHour.hours;
}
}
entry.actualHours = aHours;
// get party assignment data to be able to set the task to complete
workEffortPartyAssigns = EntityUtil.filterByDate(entryWorkEffort.getRelated("WorkEffortPartyAssignment", ["partyId" : partyId], null, false));
if (workEffortPartyAssigns) {
workEffortPartyAssign = workEffortPartyAssigns[0];
entry.fromDate = workEffortPartyAssign.getTimestamp("fromDate");
entry.roleTypeId = workEffortPartyAssign.roleTypeId;
if ("SCAS_COMPLETED".equals(workEffortPartyAssign.statusId)) {
entry.checkComplete = "Y";
}
} else {
if ("STS_COMPLETED".equals(entryWorkEffort.currentStatusId)) {
entry.checkComplete = "Y";
}
}
// get project/phase information
entry.workEffortId = entryWorkEffort.workEffortId;
entry.workEffortName = entryWorkEffort.workEffortName;
result = runService('getProjectInfoFromTask', ["userLogin" : parameters.userLogin,"taskId" : entryWorkEffort.workEffortId]);
entry.phaseId = result.phaseId;
entry.phaseName = result.phaseName;
entry.projectId = result.projectId;
entry.projectName = result.projectName;
entry.taskWbsId = result.taskWbsId;
}
entry.acualTotal = taskTotal;
entry.planTotal = planTotal;
//Drop Down Lists
if (entry.checkComplete != "Y") {
if (aHours > 0.00)
entries.add(entry);
} else {
entries.add(entry);
}
// start new entry
taskTotal = 0.00;
planTotal = 0.00;
entry = ["timesheetId" : timesheet.timesheetId];
}
timeEntries = timesheet.getRelated("TimeEntry", null, ["workEffortId", "rateTypeId", "fromDate"], false);
te = timeEntries.iterator();
while (te.hasNext()) {
// only fill lastTimeEntry when not the first time
if (timeEntry!=void) {
lastTimeEntry = timeEntry;
}
timeEntry = te.next();
if (lastTimeEntry &&
(!lastTimeEntry.workEffortId.equals(timeEntry.workEffortId) ||
!lastTimeEntry.rateTypeId.equals(timeEntry.rateTypeId))) {
retrieveWorkEffortData();
}
if (timeEntry.hours) {
dayNumber = "d" + (timeEntry.fromDate.getTime() - timesheet.fromDate.getTime()) / (24*60*60*1000);
hours = timeEntry.hours.doubleValue();
entry.put(String.valueOf(dayNumber), hours);
if (dayNumber.equals("d0")) day0Total += hours;
if (dayNumber.equals("d1")) day1Total += hours;
if (dayNumber.equals("d2")) day2Total += hours;
if (dayNumber.equals("d3")) day3Total += hours;
if (dayNumber.equals("d4")) day4Total += hours;
if (dayNumber.equals("d5")) day5Total += hours;
if (dayNumber.equals("d6")) day6Total += hours;
taskTotal += hours;
}
if (timeEntry.planHours) {
dayNumber = "pd" + (timeEntry.fromDate.getTime() - timesheet.fromDate.getTime()) / (24*60*60*1000);
planHours = timeEntry.planHours.doubleValue();
entry.put(String.valueOf(dayNumber), planHours);
if (dayNumber.equals("pd0")) pDay0Total += planHours;
if (dayNumber.equals("pd1")) pDay1Total += planHours;
if (dayNumber.equals("pd2")) pDay2Total += planHours;
if (dayNumber.equals("pd3")) pDay3Total += planHours;
if (dayNumber.equals("pd4")) pDay4Total += planHours;
if (dayNumber.equals("pd5")) pDay5Total += planHours;
if (dayNumber.equals("pd6")) pDay6Total += planHours;
planTotal += planHours;
}
entry.rateTypeId = timeEntry.rateTypeId;
}
//retrieve Empl Leave data.
void retrieveEmplLeaveData() {
if (lastEmplLeaveEntry) {
//service get Hours
result = runService('getPartyLeaveHoursForDate',
["userLogin": parameters.userLogin, "partyId": lastEmplLeaveEntry.partyId, "leaveTypeId": lastEmplLeaveEntry.leaveTypeId, "fromDate": lastEmplLeaveEntry.fromDate]);
if (result.hours) {
leaveEntry.plannedHours = result.hours;
leaveEntry.planHours = result.hours;
}
if (lastEmplLeaveEntry.leaveStatus == "LEAVE_APPROVED") {
leaveEntry.checkComplete = "Y";
}
leaveEntry.partyId = lastEmplLeaveEntry.partyId;
leaveEntry.leaveTypeId = lastEmplLeaveEntry.leaveTypeId;
leaveEntry.leavefromDate = lastEmplLeaveEntry.fromDate;
leaveEntry.leavethruDate = lastEmplLeaveEntry.thruDate;
leaveEntry.description = lastEmplLeaveEntry.description;
}
leaveEntry.acualTotal = leaveTaskTotal;
leaveEntry.planHours = leavePlanTotal;
leaveEntry.actualHours = leaveTaskTotal;
//Drop Down Lists
entries.add(leaveEntry);
// start new leaveEntry
leaveTaskTotal = 0.00;
leavePlanTotal = 0.00;
leaveEntry = ["timesheetId" : timesheet.timesheetId];
}
// define condition
leaveExprs = [];
leaveExprs.add(EntityCondition.makeCondition("fromDate", EntityOperator.GREATER_THAN_EQUAL_TO, timesheet.fromDate));
leaveExprs.add(EntityCondition.makeCondition("fromDate", EntityOperator.LESS_THAN_EQUAL_TO, timesheet.thruDate));
leaveExprs.add(EntityCondition.makeCondition("partyId", EntityOperator.EQUALS, partyId));
emplLeave = from("EmplLeave").where(leaveExprs).cursorScrollInsensitive().distinct().queryIterator();
while ((emplLeaveMap = emplLeave.next())) {
if (emplLeaveEntry!=void) {
lastEmplLeaveEntry = emplLeaveEntry;
}
emplLeaveEntry = emplLeaveMap;
if (lastEmplLeaveEntry && (
!lastEmplLeaveEntry.leaveTypeId.equals(emplLeaveEntry.leaveTypeId) ||
!lastEmplLeaveEntry.partyId.equals(emplLeaveEntry.partyId))) {
retrieveEmplLeaveData();
}
resultHours = runService('getPartyLeaveHoursForDate',
["userLogin": parameters.userLogin, "partyId": emplLeaveEntry.partyId, "leaveTypeId": emplLeaveEntry.leaveTypeId, "fromDate": emplLeaveEntry.fromDate]);
if (resultHours.hours) {
leaveDayNumber = "d" + (emplLeaveEntry.fromDate.getTime() - timesheet.fromDate.getTime()) / (24*60*60*1000);
resultHours = runService('getPartyLeaveHoursForDate',
["userLogin": parameters.userLogin, "partyId": emplLeaveEntry.partyId, "leaveTypeId": emplLeaveEntry.leaveTypeId, "fromDate": emplLeaveEntry.fromDate]);
leaveHours = resultHours.hours.doubleValue();
leaveEntry.put(String.valueOf(leaveDayNumber), leaveHours);
if (leaveDayNumber.equals("d0")) day0Total += leaveHours;
if (leaveDayNumber.equals("d1")) day1Total += leaveHours;
if (leaveDayNumber.equals("d2")) day2Total += leaveHours;
if (leaveDayNumber.equals("d3")) day3Total += leaveHours;
if (leaveDayNumber.equals("d4")) day4Total += leaveHours;
if (leaveDayNumber.equals("d5")) day5Total += leaveHours;
if (leaveDayNumber.equals("d6")) day6Total += leaveHours;
leaveTaskTotal += leaveHours;
}
if (resultHours.hours) {
leavePlanDay = "pd" + (emplLeaveEntry.fromDate.getTime() - timesheet.fromDate.getTime()) / (24*60*60*1000);
resultPlanHours = runService('getPartyLeaveHoursForDate',
["userLogin": parameters.userLogin, "partyId": emplLeaveEntry.partyId, "leaveTypeId": emplLeaveEntry.leaveTypeId, "fromDate": emplLeaveEntry.fromDate]);
leavePlanHours = resultPlanHours.hours.doubleValue();
leaveEntry.put(String.valueOf(leavePlanDay), leavePlanHours);
if (leavePlanDay.equals("pd0")) pDay0Total += leavePlanHours;
if (leavePlanDay.equals("pd1")) pDay1Total += leavePlanHours;
if (leavePlanDay.equals("pd2")) pDay2Total += leavePlanHours;
if (leavePlanDay.equals("pd3")) pDay3Total += leavePlanHours;
if (leavePlanDay.equals("pd4")) pDay4Total += leavePlanHours;
if (leavePlanDay.equals("pd5")) pDay5Total += leavePlanHours;
if (leavePlanDay.equals("pd6")) pDay6Total += leavePlanHours;
leavePlanTotal += leavePlanHours;
}
leaveEntry.rateTypeId = "STANDARD";
}
emplLeave.close();
if (timeEntry) {
lastTimeEntry = timeEntry;
retrieveWorkEffortData();
}
if (emplLeaveEntry) {
lastEmplLeaveEntry = emplLeaveEntry;
retrieveEmplLeaveData();
}
// add empty lines if timesheet not completed
if (!timesheet.statusId.equals("TIMESHEET_COMPLETED")) {
for (c=0; c < 3; c++) { // add empty lines
entries.add(["timesheetId" : timesheet.timesheetId]);
}
}
// add the totals line if at least one entry
if (timeEntry || emplLeaveEntry) {
entry = ["timesheetId" : timesheet.timesheetId];
entry.d0 = day0Total;
entry.d1 = day1Total;
entry.d2 = day2Total;
entry.d3 = day3Total;
entry.d4 = day4Total;
entry.d5 = day5Total;
entry.d6 = day6Total;
entry.pd0 = pDay0Total;
entry.pd1 = pDay1Total;
entry.pd2 = pDay2Total;
entry.pd3 = pDay3Total;
entry.pd4 = pDay4Total;
entry.pd5 = pDay5Total;
entry.pd6 = pDay6Total;
entry.phaseName = uiLabelMap.ScrumTotals;
entry.workEffortId = "Totals";
entry.total = day0Total + day1Total + day2Total + day3Total + day4Total + day5Total + day6Total;
entries.add(entry);
}
context.timeEntries = entries;
// get all timesheets of this user, including the planned hours
timesheetsDb = from("Timesheet").where("partyId", partyId).orderBy("fromDate DESC").queryList();
timesheets = new LinkedList();
timesheetsDb.each { timesheetDb ->
//get hours from EmplLeave;
findOpts = new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true);
leaveExprsList = [];
leaveExprsList.add(EntityCondition.makeCondition("fromDate", EntityOperator.GREATER_THAN_EQUAL_TO, timesheetDb.fromDate));
leaveExprsList.add(EntityCondition.makeCondition("fromDate", EntityOperator.LESS_THAN_EQUAL_TO, timesheetDb.thruDate));
leaveExprsList.add(EntityCondition.makeCondition("partyId", EntityOperator.EQUALS, partyId));
emplLeaveList = from("EmplLeave").where(leaveExprsList).cursorScrollInsensitive().distinct().queryIterator();
leaveHours = 0.00;
while ((emplLeaveMap = emplLeaveList.next())) {
emplLeaveEntry = emplLeaveMap;
resultHour = runService('getPartyLeaveHoursForDate',
["userLogin": parameters.userLogin, "partyId": emplLeaveEntry.partyId, "leaveTypeId": emplLeaveEntry.leaveTypeId, "fromDate": emplLeaveEntry.fromDate]);
if (resultHour) {
leaveActualHours = resultHour.hours.doubleValue();
leaveHours += leaveActualHours;
}
}
//get hours from TimeEntry;
timesheet = [:];
timesheet.putAll(timesheetDb);
entries = timesheetDb.getRelated("TimeEntry", null, null, false);
hours = 0.00;
entries.each { timeEntry ->
if (timeEntry.hours) {
hours += timeEntry.hours.doubleValue();
}
}
timesheet.weekNumber = UtilDateTime.weekNumber(timesheetDb.fromDate);
timesheet.hours = hours + leaveHours;
timesheets.add(timesheet);
emplLeaveList.close();
}
context.timesheets = timesheets;
// get existing task that no assign
taskList=[];
projectSprintBacklogAndTaskList = [];
backlogIndexList = [];
projectAndTaskList = from("ProjectSprintBacklogAndTask").where("sprintTypeId" : "SCRUM_SPRINT","taskCurrentStatusId" : "STS_CREATED").orderBy("projectName ASC","taskActualStartDate DESC").queryList();
projectAndTaskList.each { projectAndTaskMap ->
userLoginId = userLogin.partyId;
sprintId = projectAndTaskMap.sprintId;
workEffortList = from("WorkEffortAndProduct").where("workEffortId", projectAndTaskMap.projectId).queryList();
backlogIndexList.add(workEffortList[0].productId);
partyAssignmentSprintList = from("WorkEffortPartyAssignment").where("workEffortId", sprintId, "partyId", userLoginId).queryList();
partyAssignmentSprintMap = partyAssignmentSprintList[0];
// if this userLoginId is a member of sprint
if (partyAssignmentSprintMap) {
workEffortId = projectAndTaskMap.taskId;
partyAssignmentTaskList = from("WorkEffortPartyAssignment").where("workEffortId", workEffortId).queryList();
partyAssignmentTaskMap = partyAssignmentTaskList[0];
// if the task do not assigned
if (partyAssignmentTaskMap) {
custRequestTypeId = projectAndTaskMap.custRequestTypeId;
backlogStatusId = projectAndTaskMap.backlogStatusId;
if (custRequestTypeId.equals("RF_SCRUM_MEETINGS") && backlogStatusId.equals("CRQ_REVIEWED")) {
projectSprintBacklogAndTaskList.add(projectAndTaskMap);
}
} else {
projectSprintBacklogAndTaskList.add(0,projectAndTaskMap);
}
}
}
// for unplanned taks.
unplanList=[];
if (backlogIndexList) {
backlogIndex = new HashSet(backlogIndexList);
custRequestList = from("CustRequest").where("custRequestTypeId", "RF_UNPLAN_BACKLOG","statusId", "CRQ_REVIEWED").orderBy("custRequestDate DESC").queryList();
if (custRequestList) {
custRequestList.each { custRequestMap ->
custRequestItemList = custRequestMap.getRelated("CustRequestItem", null, null, false);
custRequestItem =
productOut = custRequestItemList[0].productId;
product = from("Product").where("productId", productOut).queryOne();
backlogIndex.each { backlogProduct ->
productId = backlogProduct
if (productId.equals(productOut)) {
custRequestWorkEffortList = from("CustRequestWorkEffort").where("custRequestId", custRequestItemList[0].custRequestId).queryList();
custRequestWorkEffortList.each { custRequestWorkEffortMap ->
partyAssignmentTaskList = from("WorkEffortPartyAssignment").where("workEffortId", custRequestWorkEffortMap.workEffortId).queryList();
partyAssignmentTaskMap = partyAssignmentTaskList[0];
// if the task do not assigned
if (!partyAssignmentTaskMap) {
result = [:];
workEffortMap = from("WorkEffort").where("workEffortId", custRequestWorkEffortMap.workEffortId).queryOne();
result.description = custRequestMap.description;
result.productName = product.internalName;
result.taskId = workEffortMap.workEffortId;
result.taskName = workEffortMap.workEffortName;
result.custRequestTypeId = custRequestMap.custRequestTypeId;
result.taskTypeId = workEffortMap.workEffortTypeId;
unplanList.add(result);
}
}
}
}
}
}
}
projectSprintBacklogAndTaskList = UtilMisc.sortMaps(projectSprintBacklogAndTaskList, ["projectName","sprintName","-taskTypeId","custRequestId"]);
projectSprintBacklogAndTaskList.each { projectSprintBacklogAndTaskMap ->
blTypeId = projectSprintBacklogAndTaskMap.custRequestTypeId;
if (blTypeId == "RF_SCRUM_MEETINGS"){
taskList.add(projectSprintBacklogAndTaskMap);
}
}
projectSprintBacklogAndTaskList = UtilMisc.sortMaps(projectSprintBacklogAndTaskList, ["-projectName","sprintName","-taskTypeId","custRequestId"]);
projectSprintBacklogAndTaskList.each { projectSprintBacklogAndTaskMap ->
blTypeId = projectSprintBacklogAndTaskMap.custRequestTypeId;
if (blTypeId == "RF_PROD_BACKLOG"){
taskList.add(0,projectSprintBacklogAndTaskMap);
}
}
unplanList = UtilMisc.sortMaps(unplanList,["-productName","-taskTypeId","custRequestId"]);
unplanList.each { unplanMap->
taskList.add(0,unplanMap);
}
context.taskList = taskList;
// notification context
webSiteId = WebSiteWorker.getWebSiteId(request);
context.webSiteId = webSiteId;