/// <summary> /// Обновление значения показателя по словарю "Дата/значение прироста показателя" /// </summary> /// <param name="deltasInfo">Словарь "Дата/значение прироста показателя"</param> public void Update(DynamicDictionary <DateTime, decimal> deltasInfo, short storageId, int accountOrganizationId) { if (!deltasInfo.Any()) { return; } // определяем минимальную дату, начиная с которой необходимо внести изменения var minDate = deltasInfo.Keys.Min(); // список текущих показателей var allIndicators = articleRevaluationIndicatorRepository.GetFrom(minDate, storageId, accountOrganizationId).ToList(); // накопительная сумма изменений var totalDelta = 0.0M; // выстраиваем необходимые временные интервалы foreach (var deltaInfo in deltasInfo.OrderBy(x => x.Key).Where(x => x.Value != 0)) { // ищем текущий показатель var foundedIndicator = allIndicators.FirstOrDefault(x => x.StartDate <= deltaInfo.Key && (x.EndDate > deltaInfo.Key || x.EndDate == null)); // если показатель найден if (foundedIndicator != null) { // если даты не совпадают - создаем новый показатель if (foundedIndicator.StartDate != deltaInfo.Key) { var _new = new T(); _new.StartDate = foundedIndicator.StartDate; _new.StorageId = storageId; _new.AccountOrganizationId = accountOrganizationId; _new.RevaluationSum = foundedIndicator.RevaluationSum; _new.EndDate = deltaInfo.Key; _new.PreviousId = foundedIndicator.PreviousId; // выставляем ссылку на предыдущую запись articleRevaluationIndicatorRepository.Save(_new); allIndicators.Add(_new); foundedIndicator.StartDate = deltaInfo.Key; foundedIndicator.PreviousId = _new.Id; } } else { // если показатель переоценки не найден, создаем его var _new = new T(); _new.StartDate = deltaInfo.Key; _new.StorageId = storageId; _new.AccountOrganizationId = accountOrganizationId; _new.RevaluationSum = 0; // значение будет обновлено далее в цикле articleRevaluationIndicatorRepository.Save(_new); // если в allIndicators уже есть показатели if (allIndicators.Any()) { // находим первый показатель из имеющихся var firstIndicator = allIndicators.OrderBy(x => x.StartDate).First(); var minStartDate = firstIndicator.StartDate; if (minStartDate > _new.StartDate) { // устанавливаем дату окончания для добавленного показателя _new.EndDate = minStartDate; firstIndicator.PreviousId = _new.Id; } } allIndicators.Add(_new); } } // обновляем значения показателей foreach (var ind in allIndicators.OrderBy(x => x.StartDate)) { var curDeltaInfo = deltasInfo.FirstOrDefault(x => x.Key == ind.StartDate); if (curDeltaInfo.Key != null) { totalDelta += curDeltaInfo.Value; } ind.RevaluationSum += totalDelta; } }