Ejemplo n.º 1
0
 public StockPosition(Nomenclature nomenclature, decimal wearPercent, Size wearSize, Size height)
 {
     Nomenclature = nomenclature ?? throw new ArgumentNullException(nameof(nomenclature));
     WearPercent  = wearPercent;
     WearSize     = wearSize;
     Height       = height;
 }
Ejemplo n.º 2
0
        public virtual void AddItem(Nomenclature nomenclature)
        {
            if (Operation != IncomeOperations.Enter)
                throw new InvalidOperationException ("Добавление номенклатуры возможно только во входящую накладную. Возвраты должны добавляться с указанием строки выдачи.");

            if(Items.Any (p => DomainHelper.EqualDomainObjects (p.Nomenclature, nomenclature)))
            {
                logger.Warn ("Номенклатура из уже добавлена. Пропускаем...");
                return;
            }

            var newItem = new IncomeItem () {
                Amount = 1,
                Nomenclature = nomenclature,
                Cost = 0,
                LifePercent = 1,
            };

            ObservableItems.Add (newItem);
        }
Ejemplo n.º 3
0
        public virtual void FindMatchedNomenclature(IUnitOfWork uow)
        {
            int neededCount = ActiveNormItem.Amount - Amount;

            if (neededCount <= 0)
            {
                logger.Debug ("Нет необходимости в выдаче <{0}>, пропускаем подбор...", Item.Name);
                return;
            }

            var nomenclatures = StockRepository.MatchNomenclaturesBySize (uow, Item, EmployeeCard);
            if(nomenclatures == null || nomenclatures.Count == 0)
            {
                logger.Warn ("Подходящая по размерам номенклатура, для типа <{0}> не найдена.", Item.Name);
                InStockState = StockStateInfo.UnknownNomenclature;
                return;
            }
            var stock = StockRepository.BalanceInStockDetail (uow, nomenclatures);

            if(stock.Count == 0)
            {
                if(MatchedNomenclature == null)
                {
                    logger.Debug ("Подходящие номенклатуры на складе отсутствуют, выбираем любую...");
                    matchedNomenclature = nomenclatures.OrderBy (n => n.Id).Last ();
                    SetInStockAmount (0);
                }
                else
                    logger.Debug ("Подходящие номенклатуры на складе отсутствуют, отставляем старую...");
                return;
            }

            var grouped = stock.GroupBy (s => s.NomenclatureId);

            var fullLife = grouped.FirstOrDefault (gp => gp.Where (s => s.Life == 1).Sum (s => s.Amount) >= neededCount);

            Nomenclature suggested = fullLife != null ? fullLife.First ().Nomenclature : null;

            if (suggested == null) {
                logger.Debug ("Достаточного количества новых <{0}> на складе не найдено.", Item.Name);

                int lastSum = -1;
                foreach(var gr in grouped)
                {
                    int newSum = gr.Sum (s => s.Amount);
                    if(newSum > lastSum)
                    {
                        suggested = gr.First ().Nomenclature;
                        lastSum = newSum;
                    }
                }
            }

            int suggestedAmount = grouped.First (gp => gp.Key == suggested.Id).Sum (s => s.Amount);

            if(DomainHelper.EqualDomainObjects (MatchedNomenclature, suggested))
            {
                logger.Debug ("Только обновляем количество на складе <{0}> -> <{1}>", InStock, suggestedAmount);
            }
            else
            {
                logger.Debug ("Изменяем подобранную номенклатуру <{0}> -> <{1}>",
                    MatchedNomenclature != null ? MatchedNomenclature.Name : String.Empty,
                    suggested);
                MatchedNomenclature = suggested;
            }

            SetInStockAmount (suggestedAmount);
        }