package com.constellio.model.services.tasks;
import static com.constellio.model.services.search.query.logical.LogicalSearchQueryOperators.from;
import java.util.Map;
import com.constellio.data.utils.TimeProvider;
import com.constellio.model.entities.records.Record;
import com.constellio.model.entities.records.wrappers.ApprovalTask;
import com.constellio.model.entities.records.wrappers.WorkflowTask;
import com.constellio.model.entities.records.wrappers.User;
import com.constellio.model.entities.schemas.Metadata;
import com.constellio.model.entities.schemas.MetadataSchemaType;
import com.constellio.model.entities.schemas.MetadataSchemaTypes;
import com.constellio.model.entities.workflows.execution.WorkflowExecution;
import com.constellio.model.services.records.RecordServices;
import com.constellio.model.services.records.RecordServicesException;
import com.constellio.model.services.schemas.MetadataSchemasManager;
import com.constellio.model.services.search.SearchServices;
import com.constellio.model.services.search.query.logical.condition.LogicalSearchCondition;
import com.constellio.model.services.workflows.execution.WorkflowExecutionService;
public class TaskServices {
public static final String TASK_DONE = "currentUserTaskDone";
public static final String DONE = "done";
RecordServices recordServices;
WorkflowExecutionService workflowExecutionService;
SearchServices searchServices;
MetadataSchemasManager metadataSchemasManager;
public TaskServices(RecordServices recordServices, SearchServices searchServices,
WorkflowExecutionService workflowExecutionService, MetadataSchemasManager metadataSchemasManager) {
this.recordServices = recordServices;
this.searchServices = searchServices;
this.workflowExecutionService = workflowExecutionService;
this.metadataSchemasManager = metadataSchemasManager;
}
public WorkflowTask getCurrentWorkflowManualTask(WorkflowExecution execution) {
String collection = execution.getCollection();
MetadataSchemaTypes metadataSchemaTypes = metadataSchemasManager.getSchemaTypes(collection);
MetadataSchemaType metadataSchemaType = metadataSchemaTypes.getSchemaType(WorkflowTask.SCHEMA_TYPE);
Metadata workflowIdMetadata = metadataSchemaType.getDefaultSchema().getMetadata(WorkflowTask.WORKFLOW_ID);
LogicalSearchCondition condition = newCondition(execution, metadataSchemaType, workflowIdMetadata);
Record record = searchServices.searchSingleResult(condition);
if (record == null) {
return null;
}
return newRelativeTask(record, metadataSchemaTypes);
}
public WorkflowTask newRelativeTask(Record record, MetadataSchemaTypes metadataSchemaTypes) {
if (record.getSchemaCode().equals(ApprovalTask.SCHEMA_CODE)) {
return newAprovalTask(record, metadataSchemaTypes);
} else {
return newTask(record, metadataSchemaTypes);
}
}
public void finish(WorkflowTask task, User user) {
task.set(WorkflowTask.FINISHED_BY, user.getId());
task.set(WorkflowTask.FINISHED_ON, TimeProvider.getLocalDateTime());
try {
recordServices.update(task);
} catch (RecordServicesException e) {
throw new RuntimeException(e);
}
String workflowId = task.getWorkflowId();
if (workflowId != null) {
WorkflowExecution execution = workflowExecutionService.getWorkflow(task.getSchema().getCollection(), workflowId);
for (Map.Entry<String, String> variable : execution.getVariables().entrySet()) {
if (task.getSchema().hasMetadataWithCode(variable.getKey())) {
execution.setVariable(variable.getKey(), (String) task.get(variable.getKey()));
}
}
execution.setVariable(TASK_DONE, DONE);
workflowExecutionService.addUpdateWorkflowExecution(execution);
workflowExecutionService.markAsWaitingForSystem(task.getSchema().getCollection(), workflowId);
}
}
LogicalSearchCondition newCondition(WorkflowExecution execution, MetadataSchemaType metadataSchemaType,
Metadata workflowIdMetadata) {
LogicalSearchCondition condition = from(metadataSchemaType).where(workflowIdMetadata).isEqualTo(execution.getId());
return condition;
}
WorkflowTask newTask(Record record, MetadataSchemaTypes metadataSchemaTypes) {
return new WorkflowTask(record, metadataSchemaTypes);
}
ApprovalTask newAprovalTask(Record record, MetadataSchemaTypes metadataSchemaTypes) {
return new ApprovalTask(record, metadataSchemaTypes);
}
}