protected IBulbCacheReadObject ProlongOrChangeStatus(BulbSignal signal, Guid statusDataId)
        {
            var request = new AccountCacheRequest()
            {
                AccountId = signal.AccountId,
                ObjectId  = statusDataId
            };
            IBulbCacheReadObject rBulb = null;

            using (var wStatusData = AllCaches.StatusDatas.Write(request))
            {
                rBulb = wStatusData;

                // если сигнал протух, то игнорируем его
                if (signal.ActualDate < wStatusData.EndDate)
                {
                    return(rBulb);
                }

                // вставим пробел
                var startTime = GetStartDate(wStatusData, signal);
                if (wStatusData.ActualDate < startTime)
                {
                    var noSignal = BulbSignal.CreateNoSignal(signal.AccountId, wStatusData.ActualDate, signal.NoSignalImportance);
                    ChangeStatus(noSignal, wStatusData);
                }

                // теперь лампочка актуальная, обработаем сигнал
                if (wStatusData.Status == signal.Status && wStatusData.HasSignal == signal.HasSignal)
                {
                    // продлим
                    ProlongStatus(signal, wStatusData);
                }
                else
                {
                    // изменим
                    ChangeStatus(signal, wStatusData);
                }

                // запомним к какому статусу привело событие
                // сервис юнит-тестов сам обновит LastStatusId (в целях оптимизации)
                // if (wStatusData.EventCategory != EventCategory.UnitTestStatus)
                {
                    UpdateLastStatusId(signal.AccountId, signal.EventId, wStatusData);
                }
                wStatusData.BeginSave();
            }

            return(rBulb);
        }
        public IBulbCacheReadObject GetActual(
            Guid accountId,
            Guid statusId,
            DateTime processDate,
            EventImportance noSignalImportance)
        {
            var request = new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId  = statusId
            };
            var data = AllCaches.StatusDatas.Find(request);

            // статус актуальный
            if (data.Actual(processDate))
            {
                return(data);
            }

            // статус протух
            IBulbCacheReadObject rStatus = null;

            using (var rStatus2 = AllCaches.StatusDatas.Write(request))
            {
                rStatus = rStatus2;
                if (rStatus.Actual(processDate))
                {
                    return(rStatus);
                }

                var signal = BulbSignal.CreateNoSignal(accountId, data.ActualDate, noSignalImportance);
                //var signal = new BulbSignal()
                //{
                //    AccountId = accountId,
                //    IsSpace = true,
                //    ActualDate = EventHelper.InfiniteActualDate,
                //    ProcessDate = processDate,
                //    StartDate = data.ActualDate, // data.ActualDate всегда меньше processDate
                //    Status = noSignalStatus,
                //    Message = "Нет данных",
                //    NoSignalImportance = noSignalImportance
                //};
                ProlongOrChangeStatus(signal, statusId);
            }
            UpdateParentByChild(rStatus);
            return(rStatus);
        }