/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * Copyright (c) 2013, MPL CodeInside http://codeinside.ru */ package ru.codeinside.gses.webui.data; import com.google.common.base.Objects; import com.google.common.collect.Lists; import org.activiti.engine.task.Task; import org.activiti.engine.task.TaskQuery; import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import ru.codeinside.adm.AdminServiceProvider; import ru.codeinside.adm.database.*; import ru.codeinside.gses.webui.Flash; import ru.codeinside.gses.webui.components.TasksQueryFilter; import java.util.ArrayList; import java.util.Date; import java.util.List; import static ru.codeinside.gses.service.impl.DeclarantServiceImpl.*; public class ControlledTasksQuery extends AbstractLazyLoadingQuery<Task> implements TasksQueryFilter { private static final long serialVersionUID = 1L; private List<String> controlledGroups; private String processInstanceId; private String serviceId; private ProcedureType type; private String taskKey; private String procedureId; private String declarantTypeName; private String declarantTypeValue; private String requester; private Date fromDate; private Date toDate; private boolean overdue; private List<String> orgGroups; private List<String> empGroups; private boolean superSupervisor; public ControlledTasksQuery(ItemBuilder<Task> itemBuilder, Employee emp){ super(itemBuilder); superSupervisor = emp.getRoles().contains(Role.SuperSupervisor); controlledGroups = new ArrayList<String>(emp.getOrganizationGroups().size() + emp.getEmployeeGroups().size()); for(Group group : emp.getOrganizationGroups()){ controlledGroups.add(group.getName()); } for(Group group : emp.getEmployeeGroups()){ controlledGroups.add(group.getName()); } } List<Task> items(int start, int count){ TaskQuery query = createTaskQuery(); query.orderByTaskPriority().desc(); if ("name".equals(orderBy)) { query.orderByTaskName(); } else if ("id".equals(orderBy)) { query.orderByTaskId(); } else { query.orderByDueDate(); } return listPage(query, start, count); } private TaskQuery createTaskQuery() { TaskQuery query = Flash.flash().getProcessEngine().getTaskService().createTaskQuery(); ((TaskQueryImpl2)query).setIgnoreAssignee(false); List<String> resultGroups; if (superSupervisor) { if(orgGroups == null && empGroups !=null){ resultGroups= empGroups; } else if(empGroups == null && orgGroups != null){ resultGroups = orgGroups; } else if(empGroups != null && orgGroups != null){ orgGroups.addAll(empGroups); resultGroups = orgGroups; } else { resultGroups = Lists.newArrayListWithExpectedSize(0); } } else { resultGroups = Lists.newArrayListWithExpectedSize(controlledGroups.size()); resultGroups.addAll(controlledGroups); if(orgGroups == null && empGroups !=null){ resultGroups.retainAll(empGroups); } else if(empGroups == null && orgGroups != null){ resultGroups.retainAll(orgGroups); } else if(empGroups != null && orgGroups != null){ orgGroups.addAll(empGroups); resultGroups.retainAll(orgGroups); } } if(!resultGroups.isEmpty()){ query.taskCandidateGroupIn(resultGroups); } if(processInstanceId != null){ query.processInstanceId(processInstanceId); } if(type != null){ query.processVariableValueEquals(VAR_PROCEDURE_TYPE_NAME, Integer.toString(type.ordinal())); } if(!StringUtils.isEmpty(serviceId)){ query.processVariableValueEquals(VAR_SERVICE_ID, serviceId); } if(taskKey !=null && !taskKey.isEmpty()){ query.taskDefinitionKey(taskKey); } if(procedureId != null && !procedureId.isEmpty()){ query.processVariableValueEquals(VAR_PROCEDURE_ID, procedureId); } if(declarantTypeName != null && declarantTypeValue != null){ query.processVariableValueEquals(declarantTypeName, declarantTypeValue); } if(requester != null && !requester.isEmpty()){ query.processVariableValueEquals(VAR_REQUESTER_LOGIN, requester); } if(fromDate != null){ query.taskCreatedAfter(DateUtils.addSeconds(fromDate, -1)); } if(toDate != null){ query.taskCreatedBefore(DateUtils.addSeconds(toDate, 1)); } if (overdue) { ((TaskQueryImpl2) query).setOverdue(true); } return query; } @Override Task singleResult(String id) { return createTaskQuery().taskDefinitionKey(id).singleResult(); } @Override public int size() { return (int)createTaskQuery().count(); } @Override public void setFromDate(Date fromDate) { this.fromDate = fromDate; } @Override public void setToDate(Date toDate) { this.toDate = toDate; } @Override public void setRequester(String requester) { this.requester = requester; } @Override public void setBidId(String bidId) { Bid bid = AdminServiceProvider.get().getBid(bidId); processInstanceId = bid!= null ? bid.getProcessInstanceId() : null; } @Override public void setProcedureType(String procedureType) { if(Objects.equal("Административная процедура", procedureType)){ type = ProcedureType.Administrative; }else if(Objects.equal("Межведомственная процедура", procedureType)){ type = ProcedureType.Interdepartmental; }else{ type = null; } } @Override public void setServiceId(String serviceId) { this.serviceId = serviceId; } @Override public void setProcedureId(String procedureId) { this.procedureId = procedureId; } @Override public void setTaskKey(String taskKey) { this.taskKey = taskKey; } @Override public void setDeclarantTypeName(String declarantTypeName) { this.declarantTypeName = declarantTypeName; } @Override public void setDeclarantTypeValue(String declarantTypeValue) { this.declarantTypeValue = declarantTypeValue; } @Override public void setOverdue(boolean value) { this.overdue = value; } @Override public void setControlledOrgGroups(List groups) { orgGroups = groups; } @Override public void setControlledEmpGroups(List groups) { empGroups = groups; } }