private List <ScenarioCampaignMetricItem> GenerateCampaignKPIs(Guid runId, Guid scenarioId, IEnumerable <Recommendation> scenarioRecommendations) { _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, String.Format("Executing Campaign KPI processing (RunID={0}, ScenarioID={1})", runId, scenarioId))); var kpis = new List <ScenarioCampaignMetricItem>(); var calculator = new ScenarioCampaignKPIsCalculator(); var recommendations = scenarioRecommendations .GroupBy(x => x.ExternalCampaignNumber) .ToDictionary(x => x.Key, x => x.ToList()); foreach (var campaign in _campaignRepository.GetAllFlat()) { var nominalPrice = _spotRepository.GetNominalPriceByCampaign(campaign.ExternalId); var campaignRecommendations = recommendations.ContainsKey(campaign.ExternalId) ? recommendations[campaign.ExternalId] : Enumerable.Empty <Recommendation>(); kpis.Add(calculator.CalculateCampaignKPIs(campaign, campaignRecommendations, nominalPrice)); } _auditEventRepository.Insert(AuditEventFactory.CreateAuditEventForInformationMessage(0, 0, String.Format("Executed Campaign KPI processing (RunID={0}, ScenarioID={1})", runId, scenarioId))); return(kpis); }