package com.constellio.app.modules.tasks.model.validators;
import com.constellio.app.modules.tasks.model.wrappers.Task;
import com.constellio.model.entities.schemas.ConfigProvider;
import com.constellio.model.entities.schemas.MetadataSchema;
import com.constellio.model.entities.schemas.validation.RecordValidator;
import com.constellio.model.frameworks.validation.ValidationErrors;
import com.constellio.model.services.records.RecordValidatorParams;
public class TaskValidator implements RecordValidator {
public static final String ASSIGNATION_DATE_AND_ASSIGNED_ON_ASSIGNER_SHOULD_BE_ALL_NULL_OR_ALL_NOT_NULL = "assignationDateAndAssignedOnAndAssignerShouldBeAllNullOrAllNotNull";
public static final String DUE_DATE_MUST_BE_LESSER_OR_EQUAL_THAN_PARENT_DUE_DATE = "dueDateMustBeLesserOrEqualThanParentDueDate";
public static final String TASK_DECISION_IS_REQUIRED = "taskDecisionIsRequired";
@Override
public void validate(RecordValidatorParams params) {
Task task = new Task(params.getValidatedRecord(), params.getTypes());
validate(task, params.getSchema(), params.getConfigProvider(), params.getValidationErrors());
}
public void validate(Task task, MetadataSchema schema, ConfigProvider configProvider, ValidationErrors validationErrors) {
boolean taskAssignationIsNull = taskAssignationIsNull(task);
if (task.getAssigner() == null || task.getAssignedOn() == null || taskAssignationIsNull) {
if (!(task.getAssigner() == null && task.getAssignedOn() == null && task.getAssignee() == null)) {
validationErrors.add(getClass(), ASSIGNATION_DATE_AND_ASSIGNED_ON_ASSIGNER_SHOULD_BE_ALL_NULL_OR_ALL_NOT_NULL);
}
}
if (task.getDueDate() != null && task.getParentTaskDueDate() != null
&& task.getDueDate().isAfter(task.getParentTaskDueDate())) {
validationErrors.add(getClass(), DUE_DATE_MUST_BE_LESSER_OR_EQUAL_THAN_PARENT_DUE_DATE);
}
if (task.getWorkflowInstance() != null && task.getStatusType().isFinishedOrClosed()) {
if (task.hasDecisions() && !task.getNextTasksDecisionsCodes().contains(task.getDecision())) {
validationErrors.add(getClass(), TASK_DECISION_IS_REQUIRED);
}
}
}
private boolean taskAssignationIsNull(Task task) {
return task.getAssignee() == null && (task.getAssigneeGroupsCandidates() == null || task.getAssigneeGroupsCandidates()
.isEmpty())
&& (task.getAssigneeUsersCandidates() == null || task.getAssigneeUsersCandidates().isEmpty());
}
}