package com.constellio.app.modules.tasks.model.wrappers; import com.constellio.app.modules.tasks.model.wrappers.structures.TaskFollower; import com.constellio.app.modules.tasks.model.wrappers.structures.TaskReminder; import com.constellio.app.modules.tasks.model.wrappers.types.TaskType; import com.constellio.model.entities.records.Content; import com.constellio.model.entities.records.Record; import com.constellio.model.entities.records.wrappers.RecordWrapper; import com.constellio.model.entities.schemas.MetadataSchemaTypes; import com.constellio.model.entities.structures.MapStringStringStructure; import org.joda.time.LocalDate; import java.util.*; public class Task extends RecordWrapper { public static final String SCHEMA_TYPE = "userTask"; public static final String DEFAULT_SCHEMA = SCHEMA_TYPE + "_default"; public static final String TYPE = "type"; public static final String ASSIGNEE = "assignee"; public static final String ASSIGNER = "assigner"; public static final String ASSIGNEE_USERS_CANDIDATES = "assigneeUsersCandidates"; public static final String ASSIGNEE_GROUPS_CANDIDATES = "assigneeGroupsCandidates"; public static final String ASSIGNED_ON = "assignedOn"; public static final String FOLLOWERS_IDS = "taskFollowersIds"; public static final String TASK_FOLLOWERS = "taskFollowers"; public static final String DESCRIPTION = "description"; public static final String CONTENTS = "contents"; public static final String NEXT_REMINDER_ON = "nextReminderOn"; public static final String REMINDERS = "reminders"; public static final String START_DATE = "startDate"; public static final String DUE_DATE = "dueDate"; public static final String END_DATE = "endDate"; public static final String STATUS = "status"; public static final String STATUS_TYPE = "statusType"; public static final String PROGRESS_PERCENTAGE = "progressPercentage"; public static final String PARENT_TASK = "parentTask"; public static final String PARENT_TASK_DUE_DATE = "parentTaskDueDate"; public static final String COMMENTS = "comments"; public static final String RELATIVE_DUE_DATE = "relativeDueDate"; public static final String MODEL_TASK = "modelTask"; public static final String WORKFLOW = "workflow"; public static final String WORKFLOW_INSTANCE = "workflowInstance"; public static final String IS_MODEL = "isModel"; public static final String WORKFLOW_TASK_SORT = "workflowTaskSort"; public static final String NEXT_TASKS_DECISIONS = "nextTasksDecisions"; public static final String NEXT_TASKS = "nextTasks"; public static final String DECISION = "decision"; public static final String NEXT_TASK_CREATED = "nextTaskCreated"; public static final String LINKED_FOLDERS = "linkedFolders"; public static final String LINKED_DOCUMENTS = "linkedDocuments"; public static final String LINKED_CONTAINERS = "linkedContainers"; public static final String REASON = "reason"; public static final String DEFAULT_NEXT_TASK = "default"; public Task(Record record, MetadataSchemaTypes types) { super(record, types, SCHEMA_TYPE); } public String getType() { return get(TYPE); } public Task setType(String type) { set(TYPE, type); return this; } public Task setType(TaskType type) { set(TYPE, type); return this; } public String getAssignee() { return get(ASSIGNEE); } public String getAssigner() { return get(ASSIGNER); } public Task setAssignee(String assignedTo) { set(ASSIGNEE, assignedTo); return this; } public Task setAssigner(String assignedBy) { set(ASSIGNER, assignedBy); return this; } public List<String> getAssigneeUsersCandidates() { return get(ASSIGNEE_USERS_CANDIDATES); } public Task setAssigneeUsersCandidates(List<String> users) { set(ASSIGNEE_USERS_CANDIDATES, users); return this; } public List<String> getAssigneeGroupsCandidates() { return get(ASSIGNEE_GROUPS_CANDIDATES); } public Task setAssigneeGroupsCandidates(List<String> groups) { set(ASSIGNEE_GROUPS_CANDIDATES, groups); return this; } public LocalDate getAssignedOn() { return get(ASSIGNED_ON); } public Task setAssignedOn(LocalDate assignedOn) { set(ASSIGNED_ON, assignedOn); return this; } public List<String> getFollowersIds() { return get(FOLLOWERS_IDS); } public List<TaskFollower> getTaskFollowers() { return get(TASK_FOLLOWERS); } public Task setTaskFollowers(List<TaskFollower> taskFollowers) { set(TASK_FOLLOWERS, taskFollowers); return this; } public Integer getRelativeDueDate() { return getInteger(RELATIVE_DUE_DATE); } public Task setRelativeDueDate(Integer relativeDueDate) { set(RELATIVE_DUE_DATE, relativeDueDate); return this; } public String getComments() { return get(COMMENTS); } public Task setComments(String comments) { set(COMMENTS, comments); return this; } public String getNextTask(String decision) { if (decision == null) { return hasNextTask() ? getSingleNextTask() : null; } else { return getNextTasksDecisions().get(decision); } } public List<String> getNextTasks() { return getList(NEXT_TASKS); } public List<String> getNextTasksDecisionsCodes() { List<String> decisionCodes = new ArrayList<>(); MapStringStringStructure nextTasks = getNextTasksDecisions(); if (nextTasks != null) { decisionCodes.addAll(nextTasks.keySet()); } Collections.sort(decisionCodes); return decisionCodes; } public boolean hasDecisions() { List<String> decisions = getNextTasksDecisionsCodes(); return decisions.size() > 1; } public MapStringStringStructure getNextTasksDecisions() { return get(NEXT_TASKS_DECISIONS); } public Task addNextTaskDecision(String decision, String reference) { MapStringStringStructure values = getNextTasksDecisions(); if (values == null) { setNextTasksDecisions(values = new MapStringStringStructure()); } //if (reference == null || reference.equals("null")) { // values.remove(decision); //} else { values.put(decision, reference); //} return this; } public Task setNextTasksDecisions(MapStringStringStructure decisions) { set(NEXT_TASKS_DECISIONS, decisions); return this; } public Task setNextTask(String nextTask) { Map<String, String> nextTaskDecisions = new HashMap<>(); nextTaskDecisions.put(DEFAULT_NEXT_TASK, nextTask); return setNextTasksDecisions(nextTaskDecisions); } public Task setNextTasksDecisions(Map<String, String> decisions) { set(NEXT_TASKS_DECISIONS, new MapStringStringStructure(decisions)); return this; } public String getDecision() { return get(DECISION); } public Task setDecision(String decision) { set(DECISION, decision); return this; } public String getWorkflow() { return get(WORKFLOW); } public Task setWorkflow(String workflow) { set(WORKFLOW, workflow); return this; } public Task setWorkflow(Record workflow) { set(WORKFLOW, workflow); return this; } public Task setWorkflow(Workflow workflow) { set(WORKFLOW, workflow); return this; } public String getModelTask() { return get(MODEL_TASK); } public Task setModelTask(String modelTaskId) { set(MODEL_TASK, modelTaskId); return this; } public Task setModelTask(Record modelTask) { set(MODEL_TASK, modelTask); return this; } public Task setModelTask(Task modelTask) { set(MODEL_TASK, modelTask); return this; } public String getWorkflowInstance() { return get(WORKFLOW_INSTANCE); } public Task setWorkflowInstance(String workflowInstanceId) { set(WORKFLOW_INSTANCE, workflowInstanceId); return this; } public Task setWorkflowInstance(Record workflowInstance) { set(WORKFLOW_INSTANCE, workflowInstance); return this; } public Task setWorkflowInstance(WorkflowInstance workflowInstance) { set(WORKFLOW_INSTANCE, workflowInstance); return this; } public boolean isModel() { return getBooleanWithDefaultValue(IS_MODEL, false); } public Task setModel(boolean isModel) { set(IS_MODEL, isModel); return this; } public int getWorkflowTaskSort() { return getInteger(WORKFLOW_TASK_SORT); } public String getDescription() { return get(DESCRIPTION); } public Task setDescription(String description) { set(DESCRIPTION, description); return this; } public List<Content> getContent() { return get(CONTENTS); } public Task setContent(List<Content> contents) { set(CONTENTS, contents); return this; } public LocalDate getNextReminderOn() { return get(NEXT_REMINDER_ON); } public List<TaskReminder> getReminders() { return get(REMINDERS); } public Task setReminders(List<TaskReminder> reminders) { set(REMINDERS, reminders); return this; } public LocalDate getStartDate() { return get(START_DATE); } public Task setStartDate(LocalDate startDate) { set(START_DATE, startDate); return this; } public LocalDate getParentTaskDueDate() { return get(PARENT_TASK_DUE_DATE); } public LocalDate getDueDate() { return get(DUE_DATE); } public LocalDate getEndDate() { return get(END_DATE); } public Task setDueDate(LocalDate dueDate) { set(DUE_DATE, dueDate); return this; } public Task setEndDate(LocalDate endDate) { set(END_DATE, endDate); return this; } public boolean isNextTaskCreated() { return getBooleanWithDefaultValue(NEXT_TASK_CREATED, false); } public Task setNextTaskCreated(boolean nextTaskCreated) { set(NEXT_TASK_CREATED, nextTaskCreated); return this; } public TaskStatusType getStatusType() { return get(STATUS_TYPE); } public String getStatus() { return get(STATUS); } public Task setStatus(String status) { set(STATUS, status); return this; } public Double getProgressPercentage() { return get(PROGRESS_PERCENTAGE); } public Task setProgressPercentage(Double progress) { set(PROGRESS_PERCENTAGE, progress); return this; } public String getParentTask() { return get(PARENT_TASK); } public Task setParentTask(Task task) { set(PARENT_TASK, task); return this; } public Task setParentTask(Record task) { set(PARENT_TASK, task); return this; } public Task setParentTask(String task) { set(PARENT_TASK, task); return this; } public Task setAssignationDate(LocalDate date) { set(ASSIGNED_ON, date); return this; } public Task setTitle(String title) { super.setTitle(title); return this; } public boolean hasNextTask() { return !getNextTasks().isEmpty(); } public String getSingleNextTask() { List<String> nextTasks = getNextTasksDecisionsCodes(); if (nextTasks.size() != 1) { throw new RuntimeException("Has no single next task"); } return getNextTasksDecisions().get(nextTasks.get(0)); } public String getReason() { return (String) get(REASON); } public Task setLinkedFolders(List<?> folderIds) { set(LINKED_FOLDERS, folderIds); return this; } public Task setLinkedContainers(List<?> containerIds) { set(LINKED_CONTAINERS, containerIds); return this; } public Task setLinkedDocuments(List<?> documentIds) { set(LINKED_DOCUMENTS, documentIds); return this; } }