コード例 #1
0
        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);
        }
コード例 #2
0
        /// <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);
        }