//string timeZoneId, bool isReadCalculatedValues,
        //  DateTime dtServerStart, DateTime dtServerEnd, EnumDataSourceType? dataSourceType,

        public FormulaInterpreterDB(FORMULAS_EXPRESSIONS fExpr, IDBInterfaceAdapter nameInterface
                                    , InterpretatorParams interpretatorParams
                                    , IMyListConverters myListConverters, IGetNotWorkedPeriodService IGetNotWorkedPeriodService, IDateTimeExtensions dateTimeExtensions)
        {
            _fExpr = fExpr;
            InterpretatorParams = interpretatorParams;
            //this.SubFormulas = new System.Collections.Hashtable();
            _recursionCallStack = new HashSet <string>();
            _variablesDict      = new Dictionary <string, Variable>();
            //_variablesDict.Add("myVar", new Variable("myVar", 0, 1440, new TFormulaConstant() { ArchiveValues = new List<TVALUES_DB>() { new TVALUES_DB(VALUES_FLAG_DB.DataCorrect, 20010) } }, "1666"));
            _nameInterface = nameInterface;

            _dateTimeExtensions = dateTimeExtensions;

            _formulaArchivesPrecalculator = new FormulaArchivesPrecalculator(interpretatorParams.TimeZoneId
                                                                             , interpretatorParams.IsReadCalculatedValues, interpretatorParams.ServerStartDateTime, interpretatorParams.ServerEndDateTime
                                                                             , interpretatorParams.DataSourceType, myListConverters, IGetNotWorkedPeriodService, _dateTimeExtensions);
        }
        public FormulaArchivesPrecalculator(string timeZoneId, bool isReadCalculatedValues, DateTime dtServerStart, DateTime dtServerEnd, EnumDataSourceType?dataSourceType, IMyListConverters myListConverters,
                                            IGetNotWorkedPeriodService IGetNotWorkedPeriodService, IDateTimeExtensions DateTimeExtensions)
        {
            _timeZoneId                     = timeZoneId;
            _isReadCalculatedValues         = isReadCalculatedValues;
            _dataSourceType                 = dataSourceType;
            _myListConverters               = myListConverters;
            this._getNotWorkedPeriodService = IGetNotWorkedPeriodService;
            _dateTimeExtensions             = DateTimeExtensions;
            _isRequestArchives              = dtServerStart != default(DateTime);
            if (_isRequestArchives)
            {
                _dtServerStart = RoundToHalfHour(dtServerStart, true);
                _dtServerEnd   = RoundToHalfHour(dtServerEnd, true);
                _dtClientStart = _dtServerStart.ServerToClient(_timeZoneId);
                _dtClientEnd   = _dtServerEnd.ServerToClient(_timeZoneId);
            }

            Errors = new StringBuilder();

            _precalculateArchives     = new List <TArchiveHierObjectPeriod>();
            _precalculateWorkedPeriod = new List <IWorkedPeriodHierObject>();
        }
        public FormulaWorkedPeriodHierObject(int tiId, DateTime dtStart, DateTime dtEnd, enumTimeDiscreteType discreteType, string timeZoneId, IMyListConverters MyListConverters, IDateTimeExtensions dateTimeExtensions, IGetNotWorkedPeriodService _iGetNotWorkedPeriodService)
        {
            TiId         = tiId;
            DiscreteType = discreteType;
            //Здесь запрашиваем и считаем количество отработанных часов
            var workedPeriods = _iGetNotWorkedPeriodService.GetNotWorkedPeriods(new List <int> {
                tiId
            }, dateTimeExtensions.ClientToServer(dtStart, timeZoneId), dateTimeExtensions.ClientToServer(dtEnd, timeZoneId));

            HoursByHalfhourNumber = new Dictionary <DateTime, double>();

            //Считаем отработанные часы
            if (discreteType == enumTimeDiscreteType.DBInterval)
            {
                HoursByHalfhourNumber.Add(dtStart, CalculateNumberWorkedHours(dtStart, dtEnd, workedPeriods, timeZoneId, MyListConverters));
            }
            else
            {
                var dts = MyListConverters.GetDateTimeListForPeriod(dtStart, dtEnd, discreteType, timeZoneId.GeTimeZoneInfoById());
                for (var i = 0; i < dts.Count; i++)
                {
                    var dt  = dts[i];
                    var dte = i < dts.Count - 1 ? dts[i + 1].AddMinutes(-30) : dtEnd;
                    HoursByHalfhourNumber.Add(dt, CalculateNumberWorkedHours(dt, dte, workedPeriods, timeZoneId, MyListConverters));
                }
            }
        }