private OutputResult Sum(KeyOutputConfiguration keyOutput, int scenarioId, int kpiIdIndex = 0) { var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; var result = new OutputResult(); var kpiIds = keyOutput.KpiIds.Split(',').Select(x => int.Parse(x)).ToList(); var kpiId = keyOutput.Kpis.First(x => x.Id == kpiIds[kpiIdIndex]).Id; var assumptionIds = keyOutput.KeyAssumptionIds.Split(',').Select(x => int.Parse(x)).ToList(); var startId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[0]).Id; var endId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[1]).Id; var startAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == startId); var endAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == endId); if (startAssumption == null || endAssumption == null) { return new OutputResult(); } DateTime startForecast; DateTime endForecast; if (IsStartAndEndValid(startAssumption.ForecastValue, endAssumption.ForecastValue, out startForecast, out endForecast)) { var forecastValue = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Scenario.Id == scenarioId && x.Periode.Year >= startForecast.Year && x.Periode.Year <= endForecast.Year && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue) .Sum(x => x.Value); if (forecastValue.HasValue) result.Forecast = forecastValue.ToString(); } DateTime startActual; DateTime endActual; if (IsStartAndEndValid(startAssumption.ActualValue, endAssumption.ActualValue, out startActual, out endActual)) { var pastValue = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && x.Periode.Year >= startActual.Year && x.Periode.Year < currentYear && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue).Sum(x => x.Value); var futureValue = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Periode.Year <= endActual.Year && x.Periode.Year > currentYear && x.PeriodeType == PeriodeType.Yearly && x.Scenario.Id == scenarioId && x.Value.HasValue).Sum(x => x.Value); var untilNowThisYear = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && x.Periode.Year == currentYear && x.PeriodeType == PeriodeType.Monthly && x.Value.HasValue).OrderBy(x => x.Periode).ToList(); var startingForecastMonthCurrentYear = 1; if (untilNowThisYear.Count > 0) { startingForecastMonthCurrentYear = untilNowThisYear.Last().Periode.Month + 1; } var untilNowThisYearValue = untilNowThisYear.Sum(x => x.Value); var thisYearForecastValue = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Periode.Year == currentYear && x.Periode.Month >= startingForecastMonthCurrentYear && x.PeriodeType == PeriodeType.Monthly && x.Scenario.Id == scenarioId && x.Value.HasValue).Sum(x => x.Value); var actualValues = new List<double?> { pastValue, futureValue, untilNowThisYearValue, thisYearForecastValue }; if (actualValues.Any(x => x.HasValue)) { result.Actual = actualValues.Sum().ToString(); } } return result; }
private OutputResult Payback(KeyOutputConfiguration keyOutput, int scenarioId, bool fromCOD = true) { var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; var currentDate = DateTime.Now; var result = new OutputResult(); var kpiIds = keyOutput.KpiIds.Split(',').Select(x => int.Parse(x)).ToList(); var kpiId = keyOutput.Kpis.First(x => x.Id == kpiIds[0]).Id; var assumptionIds = keyOutput.KeyAssumptionIds.Split(',').Select(x => int.Parse(x)).ToList(); var startId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[0]).Id; var endId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[1]).Id; var commercialId = 0; KeyAssumptionData commercialAssumption = null; if (fromCOD) { commercialId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[2]).Id; commercialAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == commercialId); } var startAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == startId); var endAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == endId); if (startAssumption == null || endAssumption == null) { return new OutputResult(); } DateTime startForecast; DateTime endForecast; if (IsStartAndEndValid(startAssumption.ForecastValue, endAssumption.ForecastValue, out startForecast, out endForecast)) { var forecastList = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Scenario.Id == scenarioId && x.Periode.Year >= startForecast.Year && x.Periode.Year <= endForecast.Year && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue).ToList(); var accumulationForecastList = new List<KeyOperationData>(); foreach (var fc in forecastList.OrderBy(x => x.Periode).ToList()) { var accForecast = new KeyOperationData { Periode = fc.Periode, PeriodeType = fc.PeriodeType, Value = forecastList.Where(x => x.Periode <= fc.Periode).Sum(x => x.Value) }; accumulationForecastList.Add(accForecast); } var forecast = accumulationForecastList.OrderBy(x => x.Periode).FirstOrDefault(x => x.Value > 0); double breakEventYearWeight = 1; if (forecast != null && forecast.Periode.Year != startForecast.Year) { var prev = accumulationForecastList.FirstOrDefault(x => x.Periode.Year == (forecast.Periode.Year - 1)); if (prev != null && prev.Value - forecast.Value != 0) { breakEventYearWeight = double.Parse(string.Format("{0:0.0}", (prev.Value / (prev.Value - forecast.Value)))); } if (prev != null) { result.Forecast = (forecast.Periode.Year - startForecast.Year + breakEventYearWeight).ToString(); DateTime constForecast; DateTime commercialForecast; if (fromCOD && IsStartAndEndValid(startAssumption.ForecastValue, commercialAssumption.ForecastValue, out constForecast, out commercialForecast)) { result.Forecast = (double.Parse(result.Forecast) - ((commercialForecast - constForecast).Days / 365.00)).ToString(); } } } } DateTime startActual; DateTime endActual; if (IsStartAndEndValid(startAssumption.ActualValue, endAssumption.ActualValue, out startActual, out endActual)) { var pastValues = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && x.Periode.Year >= startActual.Year && x.Periode.Year < currentYear && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue).Select(x => new { Value = x.Value, Periode = x.Periode, PeriodeType = x.PeriodeType }).ToList(); var futureValues = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Periode.Year <= endActual.Year && x.Periode.Year > currentYear && x.PeriodeType == PeriodeType.Yearly && x.Scenario.Id == scenarioId && x.Value.HasValue).Select(x => new { Value = x.Value, Periode = x.Periode, PeriodeType = x.PeriodeType }).ToList(); var untilNowThisYear = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && x.Periode.Year == currentYear && x.PeriodeType == PeriodeType.Monthly && x.Value.HasValue).OrderBy(x => x.Periode).ToList(); var startingForecastMonthCurrentYear = 1; if (untilNowThisYear.Count > 0) { startingForecastMonthCurrentYear = untilNowThisYear.Last().Periode.Month + 1; } var untilNowThisYearValue = untilNowThisYear.Sum(x => x.Value); var thisYearForecastValue = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Periode.Year == currentYear && x.Periode.Month >= startingForecastMonthCurrentYear && x.PeriodeType == PeriodeType.Monthly && x.Scenario.Id == scenarioId && x.Value.HasValue).Sum(x => x.Value); var currentYearValue = new { Value = new List<double?> { thisYearForecastValue, untilNowThisYearValue }.Sum(), Periode = DateTime.Now, PeriodeType = PeriodeType.Yearly }; pastValues.Add(currentYearValue); var actualList = pastValues.Concat(futureValues); var accActualList = new List<KeyOperationData>(); foreach (var ac in actualList.OrderBy(x => x.Periode).ToList()) { var accActual = new KeyOperationData { Periode = ac.Periode, PeriodeType = ac.PeriodeType, Value = actualList.Where(x => x.Periode <= ac.Periode).Sum(x => x.Value) }; accActualList.Add(accActual); } var actual = accActualList.OrderBy(x => x.Periode).FirstOrDefault(x => x.Value > 0); double actualBreakEventYearWeight = 1; if (actual != null && actual.Periode.Year != startForecast.Year) { var prev = accActualList.FirstOrDefault(x => x.Periode.Year == (actual.Periode.Year - 1)); if (prev != null && prev.Value - actual.Value != 0) { actualBreakEventYearWeight = double.Parse(string.Format("{0:0.0}", (prev.Value / (prev.Value - actual.Value)))); } if (prev != null) { result.Actual = (actual.Periode.Year - startForecast.Year + actualBreakEventYearWeight).ToString(); DateTime constActual; DateTime commercialActual; if (fromCOD && IsStartAndEndValid(startAssumption.ActualValue, commercialAssumption.ActualValue, out constActual, out commercialActual)) { result.Actual = (double.Parse(result.Actual) - ((commercialActual - constActual).Days / 365.00)).ToString(); } } } } return result; }
private OutputResult ProfitInvestmentRatio(KeyOutputConfiguration keyOutput, int scenarioId) { var fcf = this.Sum(keyOutput, scenarioId); var projectCost = this.Sum(keyOutput, scenarioId, 1); var result = new OutputResult(); if (!string.IsNullOrEmpty(fcf.Actual) && !string.IsNullOrEmpty(projectCost.Actual)) { result.Actual = String.Format("{0:0.0}", double.Parse(fcf.Actual) / double.Parse(projectCost.Actual)); } if (!string.IsNullOrEmpty(fcf.Forecast) && !string.IsNullOrEmpty(projectCost.Forecast)) { result.Forecast = String.Format("{0:0.0}", double.Parse(fcf.Forecast) / double.Parse(projectCost.Forecast)); } return result; }
private OutputResult MinDate(KeyOutputConfiguration keyOutput, int scenarioId) { var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; var currentDate = DateTime.Now; var result = new OutputResult(); var kpiIds = keyOutput.KpiIds.Split(',').Select(x => int.Parse(x)).ToList(); var kpiId = keyOutput.Kpis.First(x => x.Id == kpiIds[0]).Id; var assumptionIds = keyOutput.KeyAssumptionIds.Split(',').Select(x => int.Parse(x)).ToList(); var startId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[0]).Id; var endId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[1]).Id; var startAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == startId); var endAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == endId); if (startAssumption == null || endAssumption == null) { return new OutputResult(); } DateTime startForecast; DateTime endForecast; if (IsStartAndEndValid(startAssumption.ForecastValue, endAssumption.ForecastValue, out startForecast, out endForecast)) { var minForecast = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Scenario.Id == scenarioId && x.Periode >= startForecast && x.Periode <= endForecast && x.PeriodeType == PeriodeType.Monthly && x.Value != keyOutput.ExcludeValue && x.Value.HasValue) .OrderBy(x => x.Value).FirstOrDefault(); if (minForecast != null) result.Forecast = minForecast.Periode.AddMonths(1).AddDays(-1).ToString(); } DateTime startActual; DateTime endActual; if (IsStartAndEndValid(startAssumption.ActualValue, endAssumption.ActualValue, out startActual, out endActual)) { var pastValues = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && x.Periode >= startActual && x.PeriodeType == PeriodeType.Monthly && x.Value != keyOutput.ExcludeValue && x.Value.HasValue).OrderBy(x => x.Periode).Select(x => new { Periode = x.Periode, Value = x.Value }); var startingDateForecast = startActual; if (pastValues.Count() > 0) { startingDateForecast = pastValues.Last().Periode.AddMonths(1); } var futureValues = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Periode >= startingDateForecast && x.Periode <= endForecast && x.PeriodeType == PeriodeType.Monthly && x.Scenario.Id == scenarioId && x.Value != keyOutput.ExcludeValue && x.Value.HasValue).Select(x => new { Periode = x.Periode, Value = x.Value }); var minActual = pastValues.Concat(futureValues).OrderBy(x => x.Value).FirstOrDefault(); if (minActual != null) result.Actual = minActual.Periode.AddMonths(1).AddDays(-1).ToString(); } return result; }
private OutputResult Irr(KeyOutputConfiguration keyOutput, int scenarioId) { var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; var currentDate = DateTime.Now; var result = new OutputResult(); var kpiId = keyOutput.Kpis[0].Id; var keyAssumptionIds = keyOutput.KeyAssumptionIds.Split(','); var startId = int.Parse(keyAssumptionIds[0]); var endId = int.Parse(keyAssumptionIds[1]); var startAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == startId); var endAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == endId); if (startAssumption == null || endAssumption == null) { return new OutputResult(); } DateTime startForecast; DateTime endForecast; if (IsStartAndEndValid(startAssumption.ForecastValue, endAssumption.ForecastValue, out startForecast, out endForecast)) { var forecast = DataContext.KeyOperationDatas.Where(x => x.Scenario.Id == scenarioId && x.Kpi.Id == kpiId && x.Periode.Year >= startForecast.Year && x.Periode.Year <= endForecast.Year && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue).OrderBy(x => x.Periode).Select(x => x.Value.Value).ToList().ToArray(); if (forecast.Length >= 2) { var forecastIrrCalculator = new NewtonRaphsonIRRCalculator(forecast); result.Forecast = forecastIrrCalculator.ComputeIRR().ToString(); } } DateTime startActual; DateTime endActual; if (IsStartAndEndValid(startAssumption.ActualValue, endAssumption.ActualValue, out startActual, out endActual)) { var past = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && startActual.Year <= x.Periode.Year && x.Periode.Year < currentYear && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue).OrderBy(x => x.Periode).Select(x => x.Value).ToList(); var future = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Scenario.Id == scenarioId && x.Periode.Year <= endActual.Year && x.Periode.Year > currentYear && x.PeriodeType == PeriodeType.Yearly && x.Value.HasValue).OrderBy(x => x.Periode).Select(x => x.Value).ToList(); var untilNowThisYear = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Monthly && x.Periode.Year == currentYear && x.Value.HasValue).OrderBy(x => x.Periode).ToList(); var startingMonthForecast = 1; if (untilNowThisYear.Count > 0) { startingMonthForecast = untilNowThisYear.Last().Periode.Month + 1; } var currentPastMonths = untilNowThisYear.Sum(x => x.Value); var currentNextMonths = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && x.Scenario.Id == scenarioId && x.Periode.Year == currentYear && x.Periode.Month >= startingMonthForecast && x.PeriodeType == PeriodeType.Monthly && x.Value.HasValue).OrderBy(x => x.Periode).Sum(x => x.Value); past.Add(currentPastMonths + currentNextMonths); var actualArray = past.Concat(future).ToArray(); if (actualArray.Length >= 2) { var actualIrrCalculator = new NewtonRaphsonIRRCalculator(actualArray.Select(x => x.HasValue ? x.Value : 0).ToArray()); result.Actual = actualIrrCalculator.ComputeIRR().ToString(); } } return result; }
//by default it will use sum as aggregator private OutputResult HeaderSubstruction(KeyOutputConfiguration keyOutput, int scenarioId, bool useAverage = false) { var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; var currentDate = DateTime.Now; var kpiIds = keyOutput.KpiIds.Split(',').Select(x => int.Parse(x)).ToList(); var headId = kpiIds[0]; var result = new OutputResult(); var assumptionIds = keyOutput.KeyAssumptionIds.Split(',').Select(x => int.Parse(x)).ToList(); var startId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[0]).Id; var endId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[1]).Id; var startAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == startId); var endAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == endId); if (startAssumption == null || endAssumption == null) { return new OutputResult(); } var headKeyOutpu = new KeyOutputConfiguration(); headKeyOutpu.KeyAssumptions = keyOutput.KeyAssumptions; headKeyOutpu.KeyAssumptionIds = keyOutput.KeyAssumptionIds; headKeyOutpu.Kpis = new List<Kpi> { keyOutput.Kpis.First(x => x.Id == headId) }; headKeyOutpu.KpiIds = headId.ToString(); var headResult = new OutputResult(); if (useAverage) { headResult = Average(headKeyOutpu, scenarioId); } else { headResult = Sum(headKeyOutpu, scenarioId); } var restResults = new List<OutputResult>(); foreach (var kpiId in kpiIds) { if (kpiId != headId) { var newKeyOutput = new KeyOutputConfiguration(); newKeyOutput.KeyAssumptions = keyOutput.KeyAssumptions; newKeyOutput.KeyAssumptionIds = keyOutput.KeyAssumptionIds; newKeyOutput.Kpis = new List<Kpi> { keyOutput.Kpis.First(x => x.Id == kpiId) }; newKeyOutput.KpiIds = kpiId.ToString(); if (useAverage) { restResults.Add(Average(newKeyOutput, scenarioId)); } else { restResults.Add(Sum(newKeyOutput, scenarioId)); } } } if (!string.IsNullOrEmpty(headResult.Forecast)) { result.Forecast = (double.Parse(headResult.Forecast) - restResults.Select(x => x.Forecast).Sum(x => string.IsNullOrEmpty(x) ? 0.00 : double.Parse(x))).ToString(); } if (!string.IsNullOrEmpty(headResult.Actual)) { result.Actual = (double.Parse(headResult.Actual) - restResults.Select(x => x.Actual).Sum(x => string.IsNullOrEmpty(x) ? 0.00 : double.Parse(x))).ToString(); } return result; }
private OutputResult CompletionDate(KeyOutputConfiguration keyOutput, int scenarioId) { var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; var currentDate = DateTime.Now; var result = new OutputResult(); var kpiId = keyOutput.Kpis[0].Id; var completionId = keyOutput.KeyAssumptions[0].Id; var completionAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == completionId); if (completionAssumption == null) { return new OutputResult(); } DateTime completionForecast; DateTime completionActual; if (IsStartAndEndValid(completionAssumption.ForecastValue, completionAssumption.ActualValue, out completionForecast, out completionActual)) { var forecast = DataContext.KeyOperationDatas.FirstOrDefault(x => x.Kpi.Id == kpiId && x.Scenario.Id == scenarioId && x.PeriodeType == PeriodeType.Monthly && x.Periode.Year == completionForecast.Year && x.Periode.Month == completionForecast.Month && x.Value.HasValue); if (forecast != null) result.Forecast = forecast.Value.ToString(); if (currentYear == completionActual.Year) { var untilNowThisYear = DataContext.KpiAchievements.Where(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Monthly && x.Periode.Year == completionForecast.Year && x.Value.HasValue).OrderBy(x => x.Periode).ToList(); var startingMonthForecast = 1; if (untilNowThisYear.Count > 0) { startingMonthForecast = untilNowThisYear.Last().Periode.Month + 1; } var pastMonthsThisYear = untilNowThisYear.Sum(x => x.Value); var nextMonthThisYear = DataContext.KeyOperationDatas.Where(x => x.Kpi.Id == kpiId && scenarioId == x.Scenario.Id && x.PeriodeType == PeriodeType.Monthly && x.Periode.Year == completionForecast.Year && x.Periode.Month >= startingMonthForecast && x.Value.HasValue).Sum(x => x.Value); if (pastMonthsThisYear.HasValue || nextMonthThisYear.HasValue) { result.Actual = (pastMonthsThisYear + nextMonthThisYear).ToString(); } } else { var actual = DataContext.KpiAchievements.FirstOrDefault(x => x.Kpi.Id == kpiId && x.PeriodeType == PeriodeType.Monthly && x.Periode.Year == completionForecast.Year && x.Periode.Month == completionForecast.Month && x.Value.HasValue); if (actual != null) result.Actual = actual.ToString(); } } return result; }
private OutputResult BreakEventYear(KeyOutputConfiguration keyOutput, int scenarioId) { var currentYear = DateTime.Now.Year; var currentMonth = DateTime.Now.Month; var currentDate = DateTime.Now; var result = new OutputResult(); var kpiIds = keyOutput.KpiIds.Split(',').Select(x => int.Parse(x)).ToList(); var kpiId = keyOutput.Kpis.First(x => x.Id == kpiIds[0]).Id; var assumptionIds = keyOutput.KeyAssumptionIds.Split(',').Select(x => int.Parse(x)).ToList(); var startId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[0]).Id; var endId = keyOutput.KeyAssumptions.First(x => x.Id == assumptionIds[1]).Id; var startAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == startId); var endAssumption = DataContext.KeyAssumptionDatas.FirstOrDefault(x => x.KeyAssumptionConfig.Id == endId); var payback = Payback(keyOutput, scenarioId, false); if (startAssumption == null || endAssumption == null) { return new OutputResult(); } DateTime startForecast; DateTime endForecast; if (!string.IsNullOrEmpty(payback.Forecast) && IsStartAndEndValid(startAssumption.ForecastValue, endAssumption.ForecastValue, out startForecast, out endForecast)) { var breakEventYear = startForecast.AddYears((int)Math.Floor(decimal.Parse(payback.Forecast))); var month = Math.Round((decimal.Parse(payback.Forecast) - Math.Floor(decimal.Parse(payback.Forecast))) * 12, 0); breakEventYear = breakEventYear.AddMonths((int)month); result.Forecast = breakEventYear.ToString(); } DateTime startActual; DateTime endActual; if (!string.IsNullOrEmpty(payback.Actual) && IsStartAndEndValid(startAssumption.ActualValue, endAssumption.ActualValue, out startActual, out endActual)) { var breakEventYear = startActual.AddYears((int)Math.Floor(decimal.Parse(payback.Actual))); var month = Math.Round((decimal.Parse(payback.Actual) - Math.Floor(decimal.Parse(payback.Actual))) * 12, 0); breakEventYear = breakEventYear.AddMonths((int)month); result.Actual = breakEventYear.ToString(); } return result; }