public void BestChoise_IssuingMultipleRows_TwoNomeclatureSameNeedsTest()
        {
            var ask = Substitute.For <IInteractiveQuestion>();

            ask.Question(string.Empty).ReturnsForAnyArgs(true);
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var warehouse = new Warehouse();
                uow.Save(warehouse);

                var nomenclatureType = new ItemsType();
                nomenclatureType.Name     = "Тестовый тип номенклатуры";
                nomenclatureType.Category = ItemTypeCategory.wear;
                uow.Save(nomenclatureType);

                var nomenclature = new Nomenclature {
                    Type = nomenclatureType
                };
                uow.Save(nomenclature);

                var nomenclature2 = new Nomenclature {
                    Type = nomenclatureType
                };
                uow.Save(nomenclature2);

                var protectionTools = new ProtectionTools {
                    Name = "Номенклатура нормы"
                };
                protectionTools.AddNomeclature(nomenclature);
                protectionTools.AddNomeclature(nomenclature2);
                uow.Save(protectionTools);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Year;
                normItem.PeriodCount = 1;
                uow.Save(norm);

                var employee = new EmployeeCard();
                employee.AddUsedNorm(norm);
                Assert.That(employee.WorkwearItems.Count, Is.GreaterThan(0));
                uow.Save(employee);
                uow.Commit();

                var income = new Income {
                    Warehouse = warehouse,
                    Date      = new DateTime(2020, 07, 20),
                    Operation = IncomeOperations.Enter
                };
                var incomeItem1 = income.AddItem(nomenclature);
                incomeItem1.Amount = 10;
                var incomeItem2 = income.AddItem(nomenclature2);
                incomeItem2.Amount = 5;
                income.UpdateOperations(uow, ask);
                uow.Save(income);

                uow.Commit();
                Assert.That(uow.GetAll <WarehouseOperation>().Count(), Is.EqualTo(2));

                employee.FillWearInStockInfo(uow, baseParameters, warehouse, new DateTime(2020, 07, 22));
                Assert.That(employee.GetUnderreceivedItems(baseParameters).Count(), Is.GreaterThan(0));
                var employeeCardItem = employee.GetUnderreceivedItems(baseParameters).First();
                Assert.That(employeeCardItem.BestChoiceInStock.Count(), Is.GreaterThan(0));

                var bestChoice = employeeCardItem.BestChoiceInStock.First();

                Assert.That(bestChoice.Nomenclature, Is.EqualTo(nomenclature));
            }
        }
        public void BestChoise_IssuingMultipleRows_TwoNomeclatureShoesTypeSameNeedsTest()
        {
            var ask = Substitute.For <IInteractiveQuestion>();

            ask.Question(string.Empty).ReturnsForAnyArgs(true);
            var baseParameters = Substitute.For <BaseParameters>();

            baseParameters.ColDayAheadOfShedule.Returns(0);

            using (var uow = UnitOfWorkFactory.CreateWithoutRoot()) {
                var warehouse = new Warehouse();
                uow.Save(warehouse);

                var shoes = new SizeType {
                    Name = "Обувь"
                };
                uow.Save(shoes);
                var winterShoes = new SizeType {
                    Name = "Зимняя обувь"
                };
                uow.Save(winterShoes);

                var nomenclatureType = new ItemsType {
                    Name     = "Обувь",
                    Category = ItemTypeCategory.wear,
                    SizeType = shoes
                };
                uow.Save(nomenclatureType);

                var nomenclatureType2 = new ItemsType {
                    Name     = "Зимняя обувь",
                    Category = ItemTypeCategory.wear,
                    SizeType = winterShoes
                };
                uow.Save(nomenclatureType2);

                var nomenclature = new Nomenclature {
                    Type = nomenclatureType,
                    Sex  = ClothesSex.Men
                };
                uow.Save(nomenclature);

                var nomenclature2 = new Nomenclature {
                    Type = nomenclatureType2,
                    Sex  = ClothesSex.Men
                };
                uow.Save(nomenclature2);

                var nomenclature3 = new Nomenclature {
                    Type = nomenclatureType,
                    Sex  = ClothesSex.Men
                };
                uow.Save(nomenclature3);

                var protectionTools = new ProtectionTools {
                    Name = "Номеклатура нормы"
                };
                protectionTools.AddNomeclature(nomenclature);
                protectionTools.AddNomeclature(nomenclature3);

                uow.Save(protectionTools);

                var protectionTools2 = new ProtectionTools {
                    Name = "Номенклатура нормы_2"
                };
                protectionTools2.AddNomeclature(nomenclature2);
                uow.Save(protectionTools2);

                var norm     = new Norm();
                var normItem = norm.AddItem(protectionTools);
                normItem.Amount      = 1;
                normItem.NormPeriod  = NormPeriodType.Year;
                normItem.PeriodCount = 1;

                var normItem2 = norm.AddItem(protectionTools2);
                normItem2.Amount      = 1;
                normItem2.NormPeriod  = NormPeriodType.Year;
                normItem2.PeriodCount = 1;
                uow.Save(norm);

                var shoesSize = new Size {
                    SizeType = shoes, Name = "42"
                };
                var winterShoesSize = new Size {
                    SizeType = winterShoes, Name = "43"
                };
                uow.Save(shoesSize);
                uow.Save(winterShoesSize);

                var employee = new EmployeeCard();
                employee.AddUsedNorm(norm);
                employee.Sex = Sex.M;
                Assert.That(employee.WorkwearItems.Count, Is.GreaterThan(0));
                uow.Save(employee);
                uow.Commit();

                var employeeShoesSize = new EmployeeSize {
                    Size = shoesSize, SizeType = shoes, Employee = employee
                };
                var employeeWinterShoesSize = new EmployeeSize {
                    Size = winterShoesSize, SizeType = winterShoes, Employee = employee
                };
                uow.Save(employeeShoesSize);
                uow.Save(employeeWinterShoesSize);

                employee.Sizes.Add(employeeShoesSize);
                employee.Sizes.Add(employeeWinterShoesSize);

                var income = new Income {
                    Warehouse = warehouse,
                    Date      = new DateTime(2020, 07, 20),
                    Operation = IncomeOperations.Enter
                };

                var incomeItem1 = income.AddItem(nomenclature);
                incomeItem1.Amount   = 1;
                incomeItem1.WearSize = shoesSize;

                var incomeItem2 = income.AddItem(nomenclature2);
                incomeItem2.Amount   = 2;
                incomeItem2.WearSize = winterShoesSize;

                var incomeItem3 = income.AddItem(nomenclature3);
                incomeItem3.Amount   = 3;
                incomeItem3.WearSize = shoesSize;

                income.UpdateOperations(uow, ask);
                uow.Save(income);
                uow.Commit();
                Assert.That(uow.GetAll <WarehouseOperation>().Count(), Is.EqualTo(3));

                employee.FillWearInStockInfo(uow, baseParameters, warehouse, new DateTime(2020, 07, 22));
                Assert.That(employee.GetUnderreceivedItems(baseParameters).Count(), Is.GreaterThan(0));

                Assert.That(employee.GetUnderreceivedItems(baseParameters).Count(), Is.EqualTo(2));

                var employeeCardItem = employee.GetUnderreceivedItems(baseParameters).First();
                Assert.That(employeeCardItem.InStock.Count(), Is.GreaterThan(0));

                var bestChoiceInStock = employeeCardItem.BestChoiceInStock;
                var bestChoiceCount   = employeeCardItem.BestChoiceInStock.Count();
                Assert.That(employeeCardItem.BestChoiceInStock.Count(), Is.GreaterThan(0));

                Assert.That(employeeCardItem.BestChoiceInStock.Count(), Is.EqualTo(2));
            }
        }