public ArticleMovementOperationCountIndicator(DateTime startDate, ArticleMovementOperationType articleMovementOperationType, short storageId, int count) : base(startDate) { ArticleMovementOperationType = articleMovementOperationType; StorageId = storageId; Count = count; }
public ArticleMovementFactualFinancialIndicator(DateTime startDate, int?senderId, short?senderStorageId, int?recipientId, short?recipientStorageId, ArticleMovementOperationType articleMovementOperationType, Guid waybillId, decimal purchaseCostSum, decimal accountingPriceSum, decimal salePriceSum) : base(startDate) { #region Валидация параметров switch (articleMovementOperationType) { case ArticleMovementOperationType.Expenditure: case ArticleMovementOperationType.Writeoff: ValidationUtils.Assert(senderId.HasValue, "В индикаторе необходимо указать отправителя."); ValidationUtils.Assert(!recipientId.HasValue, "В индикаторе нельзя указать получателя."); ValidationUtils.Assert(senderStorageId.HasValue, "В индикаторе необходимо указать место хранения отправителя."); ValidationUtils.Assert(!recipientStorageId.HasValue, "В индикаторе нельзя указать место хранения получателя."); break; case ArticleMovementOperationType.ReturnFromClient: case ArticleMovementOperationType.Receipt: ValidationUtils.Assert(!senderId.HasValue, "В индикаторе нельзя указать отправителя."); ValidationUtils.Assert(recipientId.HasValue, "В индикаторе необходимо указать получателя."); ValidationUtils.Assert(!senderStorageId.HasValue, "В индикаторе нельзя указать место хранения отправителя."); ValidationUtils.Assert(recipientStorageId.HasValue, "В индикаторе необходимо указать место хранения получателя."); break; case ArticleMovementOperationType.IncomingMovement: case ArticleMovementOperationType.OutgoingMovement: ValidationUtils.Assert(senderId.HasValue, "В индикаторе необходимо указать отправителя."); ValidationUtils.Assert(recipientId.HasValue, "В индикаторе необходимо указать получателя."); ValidationUtils.Assert(senderStorageId.HasValue, "В индикаторе необходимо указать место хранения отправителя."); ValidationUtils.Assert(recipientStorageId.HasValue, "В индикаторе необходимо указать место хранения получателя."); break; } #endregion SenderId = senderId; SenderStorageId = senderStorageId; RecipientId = recipientId; RecipientStorageId = recipientStorageId; PurchaseCostSum = purchaseCostSum; AccountingPriceSum = accountingPriceSum; SalePriceSum = salePriceSum; ArticleMovementOperationType = articleMovementOperationType; WaybillId = waybillId; }
/// <summary> /// Получение показателей по параметрам >= указанной даты /// </summary> /// <param name="startDate">Дата начала выборки показателей</param> /// <param name="articleMovementOperationType">Тип операции товародвижения</param> /// <param name="storageId">Код МХ</param> public IEnumerable <ArticleMovementOperationCountIndicator> GetFrom(DateTime startDate, ArticleMovementOperationType articleMovementOperationType, short storageId) { return(Query <ArticleMovementOperationCountIndicator>() .Where(x => x.ArticleMovementOperationType == articleMovementOperationType && x.StorageId == storageId && (x.EndDate > startDate || x.EndDate == null)) .ToList <ArticleMovementOperationCountIndicator>()); }
/// <summary> /// Получение списка показателей по параметрам >= указанной даты /// </summary> public IEnumerable <ArticleMovementFactualFinancialIndicator> GetFrom(DateTime startDate, int?senderId, short?senderStorageId, int?recipientId, short?recipientStorageId, ArticleMovementOperationType articleMovementOperationType) { return(Query <ArticleMovementFactualFinancialIndicator>() .Where(x => ((x.RecipientId == null && recipientId == null) || (x.RecipientId == recipientId)) && ((x.RecipientStorageId == null && recipientStorageId == null) || (x.RecipientStorageId == recipientStorageId)) && ((x.SenderId == null && senderId == null) || (x.SenderId == senderId)) && ((x.SenderStorageId == null && senderStorageId == null) || (x.SenderStorageId == senderStorageId)) && x.ArticleMovementOperationType == articleMovementOperationType && (x.EndDate > startDate || x.EndDate == null)) .ToList <ArticleMovementFactualFinancialIndicator>()); }
/// <summary> /// Обновление значения показателя /// </summary> /// <param name="startDate">Дана начала действия нового показателя</param> /// <param name="articleMovementOperationType">Тип операции товародвижения</param> /// <param name="storageId">Код МХ</param> /// <param name="count">Значение прироста показателя</param> private void Update(DateTime startDate, ArticleMovementOperationType articleMovementOperationType, short storageId, int count) { var list = articleMovementOperationCountIndicatorRepository.GetFrom(startDate, articleMovementOperationType, storageId); // если нет показателя с датой окончания >= startDate или = null - добавляем его if (!list.Any()) { var ind = new ArticleMovementOperationCountIndicator(startDate, articleMovementOperationType, storageId, 1); articleMovementOperationCountIndicatorRepository.Save(ind); } else { // индикатор с минимальной датой начала среди индикаторов из list и сама эта дата var firstIndicator = list.OrderBy(x => x.StartDate).FirstOrDefault(); var minimalStartDate = firstIndicator.StartDate; // если дата нового показателя совпадает с датой начала минимального показателя из list if (startDate == minimalStartDate) { firstIndicator.Count += count; // меняем значение показателя } // если дата нового показателя меньше даты начала минимального показателя из list else if (startDate < minimalStartDate) { // добавляем новый показатель var _new = new ArticleMovementOperationCountIndicator(startDate, articleMovementOperationType, storageId, count); _new.EndDate = firstIndicator.StartDate; articleMovementOperationCountIndicatorRepository.Save(_new); firstIndicator.PreviousId = _new.Id; // устанавливаем ссылку на добавленный показатель } // если дата нового показателя больше даты начала минимального показателя из list else { firstIndicator.EndDate = startDate; // завершаем действие текущего показателя // ищем следующий после firstIndicator показатель var secondIndicator = list.Where(x => x.StartDate > startDate).OrderBy(x => x.StartDate).FirstOrDefault(); // добавляем новый показатель после текущего var _new = new ArticleMovementOperationCountIndicator(startDate, articleMovementOperationType, storageId, firstIndicator.Count + count); _new.PreviousId = firstIndicator.Id; // выставляем ссылку на предыдущую запись articleMovementOperationCountIndicatorRepository.Save(_new); // если есть следующий после firstIndicator показатель if (secondIndicator != null) { _new.EndDate = secondIndicator.StartDate; secondIndicator.PreviousId = _new.Id; } } // изменяем значение показателей с датой начала > minimalStartDate foreach (var item in list.Where(x => x.StartDate > startDate)) { item.Count += count; } } }
/// <summary> /// Уменьшение значения показателя на 1 /// </summary> /// <param name="startDate">Дата начала действия нового показателя</param> /// <param name="articleMovementOperationType">Тип операции товародвижения</param> /// <param name="storageId">Код МХ</param> public void DecrementIndicator(DateTime startDate, ArticleMovementOperationType articleMovementOperationType, short storageId) { Update(startDate, articleMovementOperationType, storageId, -1); }
/// <summary> /// Обновление значения показателя /// </summary> /// <param name="date"></param> /// <param name="senderId"></param> /// <param name="senderStorageId"></param> /// <param name="recipientId"></param> /// <param name="recipientStorageId"></param> /// <param name="articleMovementOperationType"></param> /// <param name="waybillId"></param> /// <param name="purchaseCostSumDelta">Сумма изменения в закупочных ценах</param> /// <param name="salePriceSumDelta">Сумма изменения в отпускных ценах</param> /// <param name="accountingPriceSumDelta">Сумма изменения в учетных ценах</param> public void Update(DateTime startDate, int?senderId, short?senderStorageId, int?recipientId, short?recipientStorageId, ArticleMovementOperationType articleMovementOperationType, Guid waybillId, decimal purchaseCostSumDelta, decimal accountingPriceSumDelta, decimal salePriceSumDelta) { var list = articleMovementFactualFinancialIndicatorRepository.GetFrom(startDate, senderId, senderStorageId, recipientId, recipientStorageId, articleMovementOperationType); // если нет показателя с датой окончания >= startDate или = null - добавляем его if (!list.Any()) { var ind = new ArticleMovementFactualFinancialIndicator(startDate, senderId, senderStorageId, recipientId, recipientStorageId, articleMovementOperationType, waybillId, purchaseCostSumDelta, accountingPriceSumDelta, salePriceSumDelta); articleMovementFactualFinancialIndicatorRepository.Save(ind); } else { // индикатор с минимальной датой начала среди индикаторов из list и сама эта дата var firstIndicator = list.OrderBy(x => x.StartDate).FirstOrDefault(); var minimalStartDate = firstIndicator.StartDate; // если дата нового показателя совпадает с датой начала минимального показателя из list if (startDate == minimalStartDate) { firstIndicator.PurchaseCostSum += purchaseCostSumDelta; // меняем значение показателя firstIndicator.AccountingPriceSum += accountingPriceSumDelta; firstIndicator.SalePriceSum += salePriceSumDelta; } // если дата нового показателя меньше даты начала минимального показателя из list else if (startDate < minimalStartDate) { // добавляем новый показатель var _new = new ArticleMovementFactualFinancialIndicator(startDate, senderId, senderStorageId, recipientId, recipientStorageId, articleMovementOperationType, waybillId, purchaseCostSumDelta, accountingPriceSumDelta, salePriceSumDelta); _new.EndDate = firstIndicator.StartDate; articleMovementFactualFinancialIndicatorRepository.Save(_new); firstIndicator.PreviousId = _new.Id; // устанавливаем ссылку на добавленный показатель } // если дата нового показателя больше даты начала минимального показателя из list else { firstIndicator.EndDate = startDate; // завершаем действие текущего показателя // ищем следующий после firstIndicator показатель var secondIndicator = list.Where(x => x.StartDate > startDate).OrderBy(x => x.StartDate).FirstOrDefault(); // добавляем новый показатель после текущего var _new = new ArticleMovementFactualFinancialIndicator(startDate, senderId, senderStorageId, recipientId, recipientStorageId, articleMovementOperationType, waybillId, firstIndicator.PurchaseCostSum + purchaseCostSumDelta, firstIndicator.AccountingPriceSum + accountingPriceSumDelta, firstIndicator.SalePriceSum + salePriceSumDelta); _new.PreviousId = firstIndicator.Id; // выставляем ссылку на предыдущую запись articleMovementFactualFinancialIndicatorRepository.Save(_new); // если есть следующий после firstIndicator показатель if (secondIndicator != null) { _new.EndDate = secondIndicator.StartDate; secondIndicator.PreviousId = _new.Id; } } // изменяем значение показателей с датой начала > minimalStartDate foreach (var item in list.Where(x => x.StartDate > startDate)) { item.PurchaseCostSum += purchaseCostSumDelta; item.AccountingPriceSum += accountingPriceSumDelta; item.SalePriceSum += salePriceSumDelta; } } }