/*
* 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.tools.ant.taskdefs.Parallel.TaskList
import org.apache.ofbiz.base.util.*
import org.apache.ofbiz.entity.*
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 java.sql.Timestamp

partyId = userLogin.partyId
taskUnplanList = []
taskPlanList = []
taskPartyList = []
taskListDropdown = []

//${projectId} - ${projectName} - ${sprintName} - ${groovy:description.substring(0,Math.min(description.length(),30))}[${custRequestId}] - ${groovy:taskName.substring(0,Math.min(taskName.length(),20))}[${taskId}]"/>

taskUnplanList = from("ProjectSprintBacklogTaskAndParty").where("partyId", partyId,"taskCurrentStatusId", "STS_CREATED","custRequestTypeId","RF_UNPLAN_BACKLOG").orderBy("taskTypeId").queryList()
taskUnplanList.each { taskUnplanMap ->
	unplanMap=[:]
	custRequestId = taskUnplanMap.custRequestId
	productlist = from("CustRequestItem").where("custRequestId", custRequestId).orderBy("productId").queryList()
	productlist.each { productMap ->
		productId = productMap.productId
		product = from("Product").where("productId", productId).queryOne()
			productName = product.internalName
			unplanMap.taskId = taskUnplanMap.taskId
			unplanMap.taskName = taskUnplanMap.taskName
			unplanMap.projectId = taskUnplanMap.projectId
			unplanMap.projectName = taskUnplanMap.projectName
			unplanMap.sprintId = taskUnplanMap.sprintId
			unplanMap.sprintName = taskUnplanMap.sprintName
			unplanMap.custRequestId = custRequestId
			unplanMap.description = taskUnplanMap.description
			unplanMap.productId = productId
			unplanMap.productName = productName
			
	}
	taskPartyList.add(taskUnplanMap)
	taskListDropdown.add(unplanMap)
}

exprBldr =  []
exprBldr.add(EntityCondition.makeCondition("custRequestTypeId", EntityOperator.EQUALS, "RF_PROD_BACKLOG"))
exprBldr.add(EntityCondition.makeCondition("custRequestTypeId", EntityOperator.EQUALS, "RF_SCRUM_MEETINGS"))
andExprs = []
andExprs.add(EntityCondition.makeCondition("taskCurrentStatusId", EntityOperator.EQUALS, "STS_CREATED"))
andExprs.add(EntityCondition.makeCondition("partyId", EntityOperator.EQUALS, partyId))
andExprs.add(EntityCondition.makeCondition(exprBldr, EntityOperator.OR))
custRequestTypeCond = EntityCondition.makeCondition(andExprs, EntityOperator.AND)

taskPlanList = from("ProjectSprintBacklogTaskAndParty").where(custRequestTypeCond).orderBy("taskTypeId","projectId","sprintId").queryList()
taskPlanList.each { taskPlanMap ->
    planMap=[:]
    if ("RF_SCRUM_MEETINGS".equals(taskPlanMap.custRequestTypeId)) {
        workEffPartyAssignedList = from("WorkEffortPartyAssignment").where("partyId", partyId, "workEffortId", taskPlanMap.taskId).queryList()
        workEffPartyAssignedMap = workEffPartyAssignedList[0]
        if (!"SCAS_COMPLETED".equals(workEffPartyAssignedMap.statusId)) {
            taskPartyList.add(taskPlanMap)
            taskListDropdown.add(taskPlanMap)
        }
    } else {
        if (taskPlanMap.projectId) {
            taskPartyList.add(taskPlanMap)
            taskListDropdown.add(taskPlanMap)
        } else {
            custRequestId = taskPlanMap.custRequestId
            productlist = from("CustRequestItem").where("custRequestId", custRequestId).orderBy("productId").queryList()
            product = from("Product").where("productId", productlist[0].productId).queryOne()
            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){
	context.taskPartyList = taskPartyList
}
if (taskListDropdown){
	context.taskListDropdown = taskListDropdown
}


