public IEnumerable <ValidationResult> Validate(ValidationContext validationContext) { var errors = new List <ValidationResult>(); if (ProjectExemptReportingYears != null && ProjectExemptReportingYears.Any(x => x.IsExempt) && string.IsNullOrWhiteSpace(Explanation)) { errors.Add(new ValidationResult(FirmaValidationMessages.ExplanationNecessaryForProjectExemptYears)); } var exemptYears = ProjectExemptReportingYears?.Where(x => x.IsExempt).Select(x => x.CalendarYear).ToList(); var performanceMeasureActualsWithDuplicatesDisplayNames = PerformanceMeasureActuals ?.GroupBy(x => new { x.PerformanceMeasureID, x.CalendarYear }) .Select(x => x.ToList()) .ToList() .Select(x => x) .Where(x => x.Select(m => m.PerformanceMeasureActualSubcategoryOptions).ToList() .Select(z => String.Join("_", z.Select(s => s.PerformanceMeasureSubcategoryOptionID).ToList())) .ToList().HasDuplicates()).SelectMany(x => x.Select(y => y.PerformanceMeasureActualName).Distinct()) .ToList(); var performanceMeasureActualsWithMissingDataDisplayNames = PerformanceMeasureActuals?.Where(x => x.ActualValue == null || x.PerformanceMeasureActualSubcategoryOptions.Any(y => y.PerformanceMeasureSubcategoryOptionID == null)) .Select(x => x.PerformanceMeasureActualName).Distinct().ToList(); var performanceMeasureActualsWithValuesInExemptYearsDisplayNames = PerformanceMeasureActuals ?.Where(x => exemptYears.Contains(x.CalendarYear)) .Select(x => x.PerformanceMeasureActualName).Distinct().ToList(); performanceMeasureActualsWithMissingDataDisplayNames?.ForEach(x => errors.Add(new ValidationResult($"{x} has rows with missing data. All values are required."))); performanceMeasureActualsWithDuplicatesDisplayNames?.ForEach(x => errors.Add(new ValidationResult($"{x} has duplicate rows. The {FieldDefinitionEnum.PerformanceMeasureSubcategory.ToType().GetFieldDefinitionLabelPluralized()} must be unique for each {MultiTenantHelpers.GetPerformanceMeasureName()}. Collapse the duplicate rows into one entry row then save the page."))); performanceMeasureActualsWithValuesInExemptYearsDisplayNames?.ForEach(x => errors.Add(new ValidationResult( $"{x} has reported values for exempt years. For years which it is indicated that there are no accomplishments to report, you cannot enter {MultiTenantHelpers.GetPerformanceMeasureNamePluralized()}. You must either correct the years for which you have no accomplishments to report, or the reported {MultiTenantHelpers.GetPerformanceMeasureNamePluralized()}."))); return(errors); }
public void UpdateModel(List <Models.PerformanceMeasureActual> currentPerformanceMeasureActuals, IList <Models.PerformanceMeasureActual> allPerformanceMeasureActuals, IList <PerformanceMeasureActualSubcategoryOption> allPerformanceMeasureActualSubcategoryOptions, Models.Project project) { UpdateModelImpl(currentPerformanceMeasureActuals, allPerformanceMeasureActuals, allPerformanceMeasureActualSubcategoryOptions); var currentProjectExemptYears = project.GetPerformanceMeasuresExemptReportingYears(); HttpRequestStorage.DatabaseEntities.ProjectExemptReportingYears.Load(); var allProjectExemptYears = HttpRequestStorage.DatabaseEntities.ProjectExemptReportingYears.Local; var projectExemptReportingYears = new List <ProjectExemptReportingYear>(); if (ProjectExemptReportingYears != null) { // Completely rebuild the list projectExemptReportingYears = ProjectExemptReportingYears.Where(x => x.IsExempt).Select(x => new ProjectExemptReportingYear(x.ProjectID, x.CalendarYear, ProjectExemptReportingType.PerformanceMeasures.ProjectExemptReportingTypeID)).ToList(); } currentProjectExemptYears.Merge(projectExemptReportingYears, allProjectExemptYears, (x, y) => x.ProjectID == y.ProjectID && x.CalendarYear == y.CalendarYear && x.ProjectExemptReportingTypeID == y.ProjectExemptReportingTypeID); project.PerformanceMeasureActualYearsExemptionExplanation = Explanation; }
public void UpdateModel(List <Models.PerformanceMeasureActual> currentPerformanceMeasureActuals, IList <Models.PerformanceMeasureActual> allPerformanceMeasureActuals, IList <PerformanceMeasureActualSubcategoryOption> allPerformanceMeasureActualSubcategoryOptions, Models.Project project) { var currentPerformanceMeasureActualSubcategoryOptions = currentPerformanceMeasureActuals.SelectMany(x => x.PerformanceMeasureActualSubcategoryOptions).ToList(); var performanceMeasureActualsUpdated = new List <Models.PerformanceMeasureActual>(); if (PerformanceMeasureActuals != null) { // Completely rebuild the list performanceMeasureActualsUpdated = PerformanceMeasureActuals.Select(x => { var performanceMeasureActual = new Models.PerformanceMeasureActual(x.PerformanceMeasureActualID.GetValueOrDefault(), x.ProjectID.GetValueOrDefault(), x.PerformanceMeasureID.GetValueOrDefault(), x.CalendarYear.GetValueOrDefault(), x.ActualValue.GetValueOrDefault()); if (x.PerformanceMeasureActualSubcategoryOptions != null) { performanceMeasureActual.PerformanceMeasureActualSubcategoryOptions = x.PerformanceMeasureActualSubcategoryOptions.Where(pmavsou => ModelObjectHelpers.IsRealPrimaryKeyValue(pmavsou.PerformanceMeasureSubcategoryOptionID)) .Select( y => new PerformanceMeasureActualSubcategoryOption(performanceMeasureActual.PerformanceMeasureActualID, y.PerformanceMeasureSubcategoryOptionID.GetValueOrDefault(), y.PerformanceMeasureID, y.PerformanceMeasureSubcategoryID)) .ToList(); } return(performanceMeasureActual); }).ToList(); } currentPerformanceMeasureActuals.Merge(performanceMeasureActualsUpdated, allPerformanceMeasureActuals, (x, y) => x.PerformanceMeasureActualID == y.PerformanceMeasureActualID, (x, y) => { x.CalendarYear = y.CalendarYear; x.ActualValue = y.ActualValue; }); currentPerformanceMeasureActualSubcategoryOptions.Merge( performanceMeasureActualsUpdated.SelectMany(x => x.PerformanceMeasureActualSubcategoryOptions).ToList(), allPerformanceMeasureActualSubcategoryOptions, (x, y) => x.PerformanceMeasureActualID == y.PerformanceMeasureActualID && x.PerformanceMeasureSubcategoryID == y.PerformanceMeasureSubcategoryID && x.PerformanceMeasureID == y.PerformanceMeasureID, (x, y) => x.PerformanceMeasureSubcategoryOptionID = y.PerformanceMeasureSubcategoryOptionID); var currentProjectExemptYears = project.GetPerformanceMeasuresExemptReportingYears(); HttpRequestStorage.DatabaseEntities.ProjectExemptReportingYears.Load(); var allProjectExemptYears = HttpRequestStorage.DatabaseEntities.ProjectExemptReportingYears.Local; var projectExemptReportingYears = new List <ProjectExemptReportingYear>(); if (ProjectExemptReportingYears != null) { // Completely rebuild the list projectExemptReportingYears = ProjectExemptReportingYears.Where(x => x.IsExempt) .Select(x => new ProjectExemptReportingYear(x.ProjectExemptReportingYearID, x.ProjectID, x.CalendarYear, ProjectExemptReportingType.PerformanceMeasures.ProjectExemptReportingTypeID)) .ToList(); } currentProjectExemptYears.Merge(projectExemptReportingYears, allProjectExemptYears, (x, y) => x.ProjectID == y.ProjectID && x.CalendarYear == y.CalendarYear && x.ProjectExemptReportingTypeID == y.ProjectExemptReportingTypeID); project.PerformanceMeasureActualYearsExemptionExplanation = Explanation; }