private IEnumerable <FunctionInfo> GetFormulaFunctions(ForecastColumn column)
        {
            var settings  = column.GetColumnSettings <FormulaSetting>();
            var formula   = settings.SummaryValue ?? settings.Value ?? new FormulaItem[0];
            var functions = FormulaUtilities.GetFunctions(formula);

            return(functions);
        }
        private IEnumerable <TableCell> InnerCalculate(IEnumerable <TableCell> cells, Guid recordId)
        {
            var calculatedCells     = new List <TableCell>(cells);
            var formulaSummaryCells = new List <TableCell>();
            IEnumerable <ForecastColumn> notFormulaColumns =
                ForecastColumns.Where(column => !column.GetColumnSettings <FormulaSetting>().UseInSummary);

            FormulaUtilities.IterateFormulaColumns(ForecastColumns,
                                                   (formulaColumn) => {
                if (notFormulaColumns.Contains(formulaColumn))
                {
                    return;
                }
                IEnumerable <TableCell> newCells = CalculateValuesForColumn(formulaColumn, calculatedCells, recordId);
                formulaSummaryCells.AddRange(newCells);
                calculatedCells.AddRange(newCells);
            });
            return(formulaSummaryCells);
        }
        private IEnumerable <TableCell> CalculateValuesForColumn(ForecastColumn calculationColumn,
                                                                 IEnumerable <TableCell> cells, Guid recordId)
        {
            var calculatedCells = new List <TableCell>();
            var formula         = FormulaUtilities.DeserializeFormula(calculationColumn);

            foreach (var period in Periods)
            {
                var     values = GetFormulaValues(formula, period, cells);
                decimal value  = FormulaUtilities.Calculate(formula, values);
                calculatedCells.Add(new TableCell {
                    GroupCode  = period,
                    ColumnCode = calculationColumn.Code,
                    Value      = (double)value,
                    RecordId   = recordId,
                    Id         = calculationColumn.Id
                });
            }
            return(calculatedCells);
        }