public async Task <List <ValidationIssue> > ValidateAndUpdateProcess(Instance instance, string taskId) { // Todo. Figure out where to get this from Dictionary <string, Dictionary <string, string> > serviceText = new Dictionary <string, Dictionary <string, string> >(); _logger.LogInformation($"Validation of {instance.Id}"); List <ValidationIssue> messages = new List <ValidationIssue>(); ModelStateDictionary validationResults = new ModelStateDictionary(); await _altinnApp.RunTaskValidation(instance, taskId, validationResults); messages.AddRange(MapModelStateToIssueList(validationResults, instance, serviceText)); Application application = _appResourcesService.GetApplication(); foreach (DataType dataType in application.DataTypes.Where(et => et.TaskId == taskId)) { List <DataElement> elements = instance.Data.Where(d => d.DataType == dataType.Id).ToList(); if (dataType.MaxCount > 0 && dataType.MaxCount < elements.Count) { ValidationIssue message = new ValidationIssue { InstanceId = instance.Id, Code = ValidationIssueCodes.InstanceCodes.TooManyDataElementsOfType, Severity = ValidationIssueSeverity.Error, Description = AppTextHelper.GetAppText( ValidationIssueCodes.InstanceCodes.TooManyDataElementsOfType, serviceText, null, "nb"), Field = dataType.Id }; messages.Add(message); } if (dataType.MinCount > 0 && dataType.MinCount > elements.Count) { ValidationIssue message = new ValidationIssue { InstanceId = instance.Id, Code = ValidationIssueCodes.InstanceCodes.TooFewDataElementsOfType, Severity = ValidationIssueSeverity.Error, Description = AppTextHelper.GetAppText( ValidationIssueCodes.InstanceCodes.TooFewDataElementsOfType, null, null, "nb"), Field = dataType.Id }; messages.Add(message); } foreach (DataElement dataElement in elements) { messages.AddRange(await ValidateDataElement(instance, dataType, dataElement)); } } if (messages.Count == 0) { instance.Process.CurrentTask.Validated = new ValidationStatus { CanCompleteTask = true, Timestamp = DateTime.Now }; } else { instance.Process.CurrentTask.Validated = new ValidationStatus { CanCompleteTask = false, Timestamp = DateTime.Now }; } instance = await _instanceService.UpdateProcess(instance); return(messages); }
/// <summary> /// Validate an instance for a specified process step. /// </summary> /// <param name="instance">The instance to validate</param> /// <param name="taskId">The task to validate the instance for.</param> /// <returns>A list of validation errors if any were found</returns> public async Task <List <ValidationIssue> > ValidateAndUpdateProcess(Instance instance, string taskId) { _logger.LogInformation($"Validation of {instance.Id}"); List <ValidationIssue> messages = new List <ValidationIssue>(); ModelStateDictionary validationResults = new ModelStateDictionary(); await _altinnApp.RunTaskValidation(instance, taskId, validationResults); messages.AddRange(MapModelStateToIssueList(validationResults, instance)); Application application = _appResourcesService.GetApplication(); foreach (DataType dataType in application.DataTypes.Where(et => et.TaskId == taskId)) { List <DataElement> elements = instance.Data.Where(d => d.DataType == dataType.Id).ToList(); if (dataType.MaxCount > 0 && dataType.MaxCount < elements.Count) { ValidationIssue message = new ValidationIssue { InstanceId = instance.Id, Code = ValidationIssueCodes.InstanceCodes.TooManyDataElementsOfType, Severity = ValidationIssueSeverity.Error, Description = ValidationIssueCodes.InstanceCodes.TooManyDataElementsOfType, Field = dataType.Id }; messages.Add(message); } if (dataType.MinCount > 0 && dataType.MinCount > elements.Count) { ValidationIssue message = new ValidationIssue { InstanceId = instance.Id, Code = ValidationIssueCodes.InstanceCodes.TooFewDataElementsOfType, Severity = ValidationIssueSeverity.Error, Description = ValidationIssueCodes.InstanceCodes.TooFewDataElementsOfType, Field = dataType.Id }; messages.Add(message); } foreach (DataElement dataElement in elements) { messages.AddRange(await ValidateDataElement(instance, dataType, dataElement)); } } instance.Process.CurrentTask.Validated = new ValidationStatus { // The condition for completion is met if there are no errors (or other weirdnesses). CanCompleteTask = messages.Count == 0 || messages.All(m => m.Severity != ValidationIssueSeverity.Error && m.Severity != ValidationIssueSeverity.Unspecified), Timestamp = DateTime.Now }; await _instanceService.UpdateProcess(instance); return(messages); }