public StockPosition(Nomenclature nomenclature, decimal wearPercent, Size wearSize, Size height) { Nomenclature = nomenclature ?? throw new ArgumentNullException(nameof(nomenclature)); WearPercent = wearPercent; WearSize = wearSize; Height = height; }
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); }
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); }