package com.constellio.app.modules.tasks.ui.pages.workflowInstance;
import java.io.IOException;
import java.util.List;
import org.joda.time.LocalDate;
import com.constellio.app.modules.tasks.model.wrappers.Workflow;
import com.constellio.app.modules.tasks.model.wrappers.WorkflowInstance;
import com.constellio.app.modules.tasks.model.wrappers.types.TaskStatus;
import com.constellio.app.modules.tasks.navigation.TaskViews;
import com.constellio.app.modules.tasks.services.TasksSchemasRecordsServices;
import com.constellio.app.modules.tasks.services.WorkflowServices;
import com.constellio.app.modules.tasks.ui.builders.WorkflowInstanceToVoBuilder;
import com.constellio.app.modules.tasks.ui.entities.TaskVO;
import com.constellio.app.modules.tasks.ui.entities.WorkflowInstanceVO;
import com.constellio.app.modules.tasks.ui.entities.WorkflowTaskProgressionVO;
import com.constellio.app.ui.entities.RecordVO.VIEW_MODE;
import com.constellio.app.ui.pages.base.SessionContext;
import com.constellio.app.ui.pages.base.SingleSchemaBasePresenter;
import com.constellio.data.utils.TimeProvider;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.User;
public class DisplayWorkflowInstancePresenter extends SingleSchemaBasePresenter<DisplayWorkflowInstanceView> {
private WorkflowInstanceVO workflowInstanceVO;
private List<WorkflowTaskProgressionVO> workflowTaskProgressionVOs;
private transient WorkflowServices workflowServices;
private transient TasksSchemasRecordsServices tasksSchemas;
private WorkflowInstanceToVoBuilder workflowInstanceToVoBuilder;
public DisplayWorkflowInstancePresenter(DisplayWorkflowInstanceView view) {
super(view, Workflow.DEFAULT_SCHEMA);
initTransientObjects();
workflowInstanceToVoBuilder = new WorkflowInstanceToVoBuilder();
}
private void readObject(java.io.ObjectInputStream stream)
throws IOException, ClassNotFoundException {
stream.defaultReadObject();
initTransientObjects();
}
private void initTransientObjects() {
workflowServices = new WorkflowServices(collection, appLayerFactory);
tasksSchemas = new TasksSchemasRecordsServices(collection, appLayerFactory);
}
@Override
protected boolean hasPageAccess(String params, User user) {
return true;
}
void forParams(String params) {
Record workflowInstanceRecord = getRecord(params);
workflowInstanceVO = workflowInstanceToVoBuilder
.build(workflowInstanceRecord, VIEW_MODE.DISPLAY, view.getSessionContext());
view.setWorkflowInstanceVO(workflowInstanceVO);
SessionContext sessionContext = view.getSessionContext();
WorkflowInstance workflowInstance = new WorkflowInstance(workflowInstanceRecord, types());
workflowTaskProgressionVOs = workflowServices.getRootModelTaskProgressionsVOs(workflowInstance, sessionContext);
view.setWorkflowTaskProgressionVOs(workflowTaskProgressionVOs);
}
List<WorkflowTaskProgressionVO> getChildren(WorkflowTaskProgressionVO parent) {
String workflowInstanceId = workflowInstanceVO.getId();
Record workflowInstanceRecord = getRecord(workflowInstanceId);
WorkflowInstance workflowInstance = new WorkflowInstance(workflowInstanceRecord, types());
SessionContext sessionContext = view.getSessionContext();
return workflowServices.getChildModelTaskProgressions(workflowInstance, parent.getWorkflowTaskVO(), sessionContext);
}
void backButtonClicked() {
view.navigate().to(TaskViews.class).taskManagement();
}
boolean isFinished(WorkflowTaskProgressionVO workflowTaskProgressionVO) {
TaskVO taskVO = workflowTaskProgressionVO.getWorkflowTaskVO().getTaskVO();
TaskStatus status = tasksSchemas.getTaskStatus(taskVO.getStatus());
return status.isFinished();
}
boolean isTaskOverDue(WorkflowTaskProgressionVO workflowTaskProgressionVO) {
TaskVO task = workflowTaskProgressionVO.getWorkflowTaskVO().getTaskVO();
LocalDate dueDate = task.getDueDate();
if (dueDate == null) {
return false;
}
if (dueDate.isBefore(TimeProvider.getLocalDate())) {
LocalDate endDate = task.getEndDate();
if (endDate == null || endDate.isAfter(dueDate)) {
return true;
}
}
return false;
}
}