/// <summary>
 /// Calculates formula column's values.
 /// </summary>
 /// <param name="parameters">Parameters.</param>
 /// <returns>
 /// Modified parameters.
 /// </returns>
 /// <exception cref="System.NotImplementedException"></exception>
 public ForecastCalcParams Calculate(ForecastCalcParams parameters)
 {
     parameters.ForecastId.CheckArgumentEmpty(nameof(parameters.ForecastId));
     _parameters = parameters;
     InternalCalculation();
     return(parameters);
 }
        /// <summary>
        /// Calculates forecast object value column's values.
        /// </summary>
        /// <param name="parameters">Parameters.</param>
        /// <returns>
        /// Parameters with calculated cells.
        /// </returns>
        public ForecastCalcParams Calculate(ForecastCalcParams parameters)
        {
            InitData(parameters);
            var         objectValueColumns = GetObjectValueColumns();
            List <Cell> cells = new List <Cell>();

            if (objectValueColumns.IsNotEmpty())
            {
                CellRepository.DeleteCells(ForecastSheet, Periods, objectValueColumns);
            }
            _log.Info($"Forecast object value calculation. " +
                      $"Columns to count: {objectValueColumns.Count()}");
            foreach (ForecastColumn column in objectValueColumns)
            {
                var settings = ColumnSettingsMapper.GetForecastColumnSettingsData(UserConnection, column);
                if (settings == null)
                {
                    _log.Info($"Settings for forecast {ForecastSheet.Name} - {ForecastSheet.Id} " +
                              $"column {column.Name} - {column.Id} does not exists");
                    continue;
                }
                _log.Info($"Forecast object value calculation. " +
                          $"Periods to count: {Periods.Count()}");
                foreach (Period period in Periods)
                {
                    var esq = new EntitySchemaQuery(UserConnection.EntitySchemaManager, settings.SourceEntityName);
                    esq.IgnoreDisplayValues = true;
                    string columnPath      = GetEntityInCellColumnPath(settings);
                    var    refColumnName   = esq.AddColumn(settings.ReferenceColumnName);
                    var    rowIdColumnName = esq.AddColumn($"{columnPath}.Row");
                    var    valueColumn     = esq.AddColumn(esq.CreateAggregationFunction(
                                                               GetCalcFunction(settings.FuncCode), settings.FuncColumnName));
                    AddSettingsFilter(settings, esq);
                    AddPeriodFilter(period, settings.PeriodColumnName, esq);
                    AddEntitiesFilter(columnPath, esq);
                    List <Cell> periodCells = new List <Cell>();
                    Select      select      = esq.GetSelectQuery(UserConnection);
                    select.ExecuteReader((reader) => {
                        decimal value = reader.GetColumnValue <decimal>(valueColumn.ValueQueryAlias);
                        value         = CalcValue(settings, value);
                        periodCells.Add(new Cell {
                            Value    = value,
                            ColumnId = column.Id,
                            EntityId = reader.GetColumnValue <Guid>(refColumnName.ValueQueryAlias),
                            RowId    = reader.GetColumnValue <Guid>(rowIdColumnName.ValueQueryAlias),
                            PeriodId = period.Id
                        });
                    });
                    if (periodCells.Any())
                    {
                        cells.AddRange(periodCells);
                        _log.Info($"Forecast object value calculation. " +
                                  $"Has {periodCells.Count()} cells data for period {period.Name}");
                    }
                }
            }
            SaveCells(cells);
            parameters.Cells.AddRange(cells);
            return(parameters);
        }
        /// <summary>
        /// Executes job operation.
        /// </summary>
        /// <param name="userConnection">The user connection.</param>
        /// <param name="parameters">The parameters.</param>
        public void Execute(UserConnection userConnection, IDictionary <string, object> parameters)
        {
            var forecastId      = (Guid)parameters["ForecastId"];
            var periodIds       = parameters["PeriodIds"] as List <Guid>;
            var isUseSystemUser = (bool)parameters["IsUseSystemUser"];

            _log.Info($"Forecast calculation started. ForecastId:{forecastId}");
            var userConnectionForCalculation = userConnection;

            if (isUseSystemUser)
            {
                userConnectionForCalculation = userConnection.AppConnection.SystemUserConnection;
            }
            IForecastCalculator objectValueColumnsCalculator = GetForecastCalculator(userConnectionForCalculation,
                                                                                     ForecastConsts.ObjectValueColumnTypeName);
            var forecastParams = new ForecastCalcParams(forecastId, periodIds);

            objectValueColumnsCalculator.Calculate(forecastParams);
            IForecastCalculator formulaColumnsCalculator = GetForecastCalculator(userConnectionForCalculation,
                                                                                 ForecastConsts.FormulaColumnTypeName);

            formulaColumnsCalculator.Calculate(forecastParams);
            _log.Info($"Forecast calculation ended. ForecastId:{forecastId}");
            CreateReminding(userConnection, forecastId);
        }
 private void InitData(ForecastCalcParams parameters)
 {
     ForecastSheet = SheetRepository.GetSheet(parameters.ForecastId);
     InitPeriods(parameters.Periods);
     parameters.Cells     = parameters.Cells ?? new List <Cell>();
     EntityForecastSchema = UserConnection.EntitySchemaManager
                            .GetInstanceByUId(ForecastSheet.ForecastEntityInCellUId);
     ReferenceSchemaName = UserConnection.EntitySchemaManager
                           .GetItemByUId(ForecastSheet.ForecastEntityUId).Name;
     SchemaNamePrefix = Core.Configuration.SysSettings.GetDefValue(UserConnection,
                                                                   "SchemaNamePrefix") as string;
 }