protected Event CreateUnitTestResultEvent(
            IUnitTestCacheReadObject unitTest,
            SendUnitTestResultRequestData data,
            DateTime processDate)
        {
            data.Message = data.Message ?? string.Empty;

            if (data.Message.Length > 255)
            {
                data.Message = data.Message.Substring(0, 255);
            }

            var importance = EventImportanceHelper.Get(data.Result ?? UnitTestResult.Unknown);

            var cache        = new AccountCache(unitTest.AccountId);
            var unittestType = cache.UnitTestTypes.Read(unitTest.TypeId);

            var actualInterval = unitTest.ActualTime                                        // сначала берем из настроек проверки в ЛК
                                 ?? TimeSpanHelper.FromSeconds(unittestType.ActualTimeSecs) // потом из настроек типа проверки в ЛК
                                 ?? TimeSpanHelper.FromSeconds(data.ActualIntervalSeconds)  // потом из сообщения
                                 ?? TimeSpan.FromMinutes(5);                                // по умолчанию 5 мин

            var actualDate = processDate + actualInterval;

            var joinKeyHash = data.ReasonCode ?? 0;

            var result = new Event()
            {
                Id             = Guid.NewGuid(),
                Count          = 1,
                JoinKeyHash    = joinKeyHash,
                Importance     = importance,
                OwnerId        = unitTest.Id,
                ActualDate     = actualDate,
                CreateDate     = DateTime.Now,
                LastUpdateDate = processDate,
                StartDate      = processDate,
                EndDate        = processDate,
                Message        = data.Message,
                EventTypeId    = SystemEventType.UnitTestResult.Id,
                Category       = EventCategory.UnitTestResult
            };

            if (data.Properties != null)
            {
                result.Properties = ApiConverter.GetEventProperties(data.Properties);
            }
            return(result);
        }
        public IBulbCacheReadObject SendUnitTestResult(Guid accountId, SendUnitTestResultRequestData data)
        {
            // Проверка на наличие необходимых параметров
            if (data == null)
            {
                throw new ParameterRequiredException("Request.Data");
            }
            if (data.UnitTestId == null)
            {
                throw new ParameterRequiredException("Request.Data.UnitTestId");
            }

            using (var unitTest = AllCaches.UnitTests.Write(new AccountCacheRequest()
            {
                AccountId = accountId,
                ObjectId = data.UnitTestId.Value
            }))
            {
                var processDate = DateTime.Now;

                // получим актуальную колбасу, чтобы не было пробелов между результатами
                GetUnitTestResultInternal(unitTest, processDate);

                // если проверка выключена или выключен один из её родителей
                if (unitTest.CanProcess == false)
                {
                    throw new ResponseCodeException(Zidium.Api.ResponseCode.ObjectDisabled, "Проверка выключена");
                }

                var checker = AccountLimitsCheckerManager.GetCheckerForAccount(accountId);

                // Проверим лимит "Количество запросов в день"
                var accountDbContext = Context.GetAccountDbContext(accountId);
                checker.CheckUnitTestResultsPerDay(accountDbContext);

                // Проверим лимит размера хранилища
                var size = data.GetSize();
                checker.CheckStorageSize(accountDbContext, size);

                var resultEvent = CreateUnitTestResultEvent(unitTest, data, processDate);
                if (resultEvent.ActualDate < processDate)
                //todo это источник проблем из-за разного времени клиента и сервера
                {
                    // код ниже никогда не выполнится, но пусть на всякий случай будет
                    throw new ResponseCodeException(
                              Zidium.Api.ResponseCode.ServerError,
                              "Результат юнит-теста неактуален (date + actualInterval < now)");
                }

                //if (resultEvent.ActualDate < unitTest.StatusData.EndDate)
                //{
                //    // код ниже никогда не выполнится, но пусть на всякий случай будет
                //    throw new ResponseCodeException(
                //        Zidium.Api.ResponseCode.ServerError,
                //        "Результат юнит-теста неактуален (actualDate < unitTest.StatusData.EndDate)");


                // сохраним результаты
                var result = SaveResultEvent(processDate, unitTest, resultEvent);

                // увеличим счетчик лимита проверки "Количество запросов в день"
                checker.AddUnitTestsSizePerDay(accountDbContext, size);
                checker.AddUnitTestResultsPerDay(accountDbContext, unitTest.Id);

                return(result);
            }
        }