Пример #1
0
 public ArticleMovementOperationCountIndicator(DateTime startDate, ArticleMovementOperationType articleMovementOperationType, short storageId, int count)
     : base(startDate)
 {
     ArticleMovementOperationType = articleMovementOperationType;
     StorageId = storageId;
     Count     = count;
 }
Пример #2
0
        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>());
 }
Пример #4
0
 /// <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>());
 }
Пример #5
0
        /// <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;
                }
            }
        }
Пример #6
0
 /// <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;
                }
            }
        }