Example #1
0
        /// <summary>
        /// Получение статусов позиций накладной
        /// </summary>
        /// <param name="waybill"></param>
        /// <returns></returns>
        public IDictionary <Guid, OutgoingWaybillRowState> GetRowStates(MovementWaybill waybill)
        {
            var result = new Dictionary <Guid, OutgoingWaybillRowState>();

            IEnumerable <ArticleBatchAvailabilityShortInfo> articleBatchAvailability = null;

            // если накладная не проведена, то для позиций без ручного указания источников
            // необходимо найти точное наличие
            if (!waybill.IsAccepted)
            {
                // создаем подзапрос для партий для позиций без ручного указания источников
                var rowWithoutManualSourceBatchSubQuery = movementWaybillRepository.GetRowWithoutManualSourceBatchSubquery(waybill.Id);

                // получаем доступное для резервирования кол-во по партиям
                articleBatchAvailability = articleAvailabilityService.GetAvailableToReserveFromExactArticleAvailability(
                    rowWithoutManualSourceBatchSubQuery, waybill.SenderStorage.Id, waybill.Sender.Id, DateTime.Now);
            }

            // вычисляем статусы всех позиций
            foreach (var row in waybill.Rows)
            {
                var outgoingWaybillRowState = OutgoingWaybillRowState.ArticlePending;

                // если накладная проведена или по позиции известны источники - то статус уже известен
                if (waybill.IsAccepted || row.IsUsingManualSource)
                {
                    outgoingWaybillRowState = row.OutgoingWaybillRowState;
                }
                // если накладная не проведена и источники для позиции не указаны
                else
                {
                    // находим точное наличие по партии
                    var availability = articleBatchAvailability.Where(x => x.BatchId == row.ReceiptWaybillRow.Id).FirstOrDefault();

                    outgoingWaybillRowState = (availability != null && availability.Count >= row.MovingCount) ?
                                              OutgoingWaybillRowState.ReadyToArticleMovement : OutgoingWaybillRowState.ArticlePending;
                }

                result.Add(row.Id, outgoingWaybillRowState);
            }

            return(result);
        }