public async Task <List <SupportingDocumentModel> > BuildSupportingDocuments(IStageDetails stageDetails, CostType costType, IEnumerable <string> stageKeys, Guid costStageRevisionId, bool totalCostIncreased = false) { var stageDetailsForm = stageDetails.Data.ToModel <PgStageDetailsForm>(); var rules = (await _ruleService.GetCompiledByRuleType <SupportingDocumentRule>(RuleType.SupportingDocument)).ToArray(); var supportingDocs = new List <SupportingDocumentModel>(); var previousRevision = await _costStageRevisionService.GetPreviousRevision(costStageRevisionId); foreach (var stage in stageKeys) { var supportingDocRule = new SupportingDocumentRule { BudgetRegion = stageDetailsForm.BudgetRegion?.Key, ContentType = stageDetailsForm.ContentType?.Key, CostStage = stage, ProductionType = stageDetailsForm.ProductionType?.Key, CostType = costType.ToString(), TotalCostIncreased = totalCostIncreased, PreviousCostStage = previousRevision != null ? previousRevision?.Name : string.Empty }; List <SupportingDocumentModel> output; Func <SupportingDocumentRule, Rule, List <SupportingDocumentModel> > matched = (supportingDocumentRule, rule) => { var ruleDefinition = JsonConvert.DeserializeObject <SupportingDocumentRuleDefinition>(rule.Definition); return(new List <SupportingDocumentModel> { new SupportingDocumentModel { CanManuallyUpload = ruleDefinition.CanManuallyUpload, Name = ruleDefinition.Name, Key = ruleDefinition.Key ?? string.Empty, Generated = true, Required = ruleDefinition.Mandatory } }); }; Func <List <SupportingDocumentModel>, List <SupportingDocumentModel>, List <SupportingDocumentModel> > aggregator = (total, result) => { total.AddRange(result); return(total); }; _ruleService.TryMatchRule(rules, supportingDocRule, matched, aggregator, out output); if (output != null) { supportingDocs.AddRange(output); } } return(supportingDocs); }