Ejemplo n.º 1
0
        /// <summary>
        /// Возвращает историю обновлений указанного блюда
        /// </summary>
        /// <param name="ExpandedNamedish">Расширенное имя блюда</param>
        /// <returns>Список со всеми обновлениями для данного блюда</returns>
        public IEnumerable <IDish> HistoryDish(string ExpandedNamedish)
        {
            //получаем нужное блюдо
            ModelDB.Dish dish = Context.context.Dishes.FirstOrDefault(x => x.ExpandedNameDish == ExpandedNamedish);

            //находим все даты его калькуляции
            List <DateTime> HistoryDates = Context.context.Subdivisions
                                           .FirstOrDefault(subdiv => subdiv.NameSubdivision == SubdivisionController.CurrentSubdivision.NameSubdivision)
                                           .Menus
                                           .Where(x => x.Dishes.Any(y => y.ExpandedNameDish == ExpandedNamedish))
                                           .Select(x => CalculationDishDate(dish, x.UseDate)).Distinct().ToList();

            if (HistoryDates.Count == 0)//если блюдо не использовалось
            {
                Domain.Dish d = FillingDish(dish, DateTime.Now) as Domain.Dish;
                if (d == null)    //проверяем на существование всех необходимых ингредиентов для данного блюда
                {
                    return(null); // если не существует выводим null
                }
                else
                {
                    return(new List <IDish>()
                    {
                        d
                    });                            //если существует выводим калькуляцию текущим числом
                }
            }
            else//если блюдо использовалось создаем список блюд на каждую дату калькуляции
            {
                return(HistoryDates.Select(x => FillingDish(dish, x)).Where(x => x != null).OrderByDescending(d => d.DateCreate));
            }
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Создание калькуляции блюда, которое реализует IDish
        /// </summary>
        /// <param name="DishDB">Блюдо из контекста</param>
        /// <param name="DT">Дата</param>
        /// <returns>Калькуляция блюда</returns>
        public static IDish FillingDish(ModelDB.Dish DishDB, DateTime DT)
        {
            //создаем список DishItem для выбранного блюда
            List <DishItem> DI = DishDB.ItemDishes.Select(x => new DishItem()
            {
                Ingredient = x.Ingredient.Products
                             .Where(y => y.BeginDate <= DT && y.Subdivision.IDSubdivision == SubdivisionController.CurrentSubdivision.IDSubdivision)
                             .OrderByDescending(y => y.BeginDate).FirstOrDefault(),

                NormOn100Portions = x.NormOn100Portion
            }).ToList();

            //проверяем существуют ли все необходимые продукты на заданную дату в нужном подразделении
            if (DI.Select(x => x.Ingredient).Any(x => x == null))
            {
                //если не сущетвуют возвращаем null
                return(null);
            }
            else
            {
                return(new Domain.Dish()
                {
                    DateCreate = DT,
                    NumberDish = DishDB.IDDish,
                    NameDish = DishDB.NameDish,
                    ExpandedNameDish = DishDB.ExpandedNameDish,
                    WeightDish = DishDB.WeightDish,
                    NumberInCollectionOfRecipes = DishDB.NumberInCollectionOfRecipes,
                    TypeDish = DishDB.TypeDish,
                    DishItems = DI
                });
            }
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Поиск даты калькуляции блюда (первого использования)
        /// </summary>
        /// <param name="DishDB">Блюдо</param>
        /// <param name="DT">Дата</param>
        /// <returns>Дата калькуляции блюда</returns>
        public static DateTime CalculationDishDate(ModelDB.Dish DishDB, DateTime DT)
        {
            DateTime CreateDate;

            //находим все даты использования данного блюда
            List <DateTime> CreateDates = Context.context.Subdivisions
                                          .FirstOrDefault(subdiv => subdiv.NameSubdivision == SubdivisionController.CurrentSubdivision.NameSubdivision)
                                          .Menus
                                          .Where(Menu => Menu.UseDate <= DT && Menu.Dishes.Any(dish => dish.ExpandedNameDish == DishDB.ExpandedNameDish))
                                          .OrderByDescending(x => x.UseDate).Select(x => x.UseDate).ToList();

            if (CreateDates == null)                                //если блюдо не использовалось
            {
                if (FillingDish(DishDB, DT) == null)                //если на переданную дату нельзя создать блюдо
                {
                    CreateDate = new DateTime(0001, 1, 1, 0, 0, 0); //указываем минимально воможную дату
                }
                else//иначе высылаем переданную дату
                {
                    CreateDate = DT;
                }
            }
            else //если блюдо использовалось
            {
                //создаем список продуктов на переданную дату
                List <Product> Products = DishDB.ItemDishes.Select(x => x.Ingredient.Products
                                                                   .Where(y => y.BeginDate <= DT && y.Subdivision.IDSubdivision == SubdivisionController.CurrentSubdivision.IDSubdivision)
                                                                   .OrderByDescending(y => y.BeginDate).FirstOrDefault()).ToList();
                CreateDate = DT;
                //перебираем даты использования до тех пор, пока не найдется последовательность продуктов отличная от той что на текущую дату
                foreach (var Date in CreateDates)
                {
                    if (!DishDB.ItemDishes.Select(x => x.Ingredient.Products
                                                  .Where(y => y.BeginDate <= Date && y.Subdivision.IDSubdivision == SubdivisionController.CurrentSubdivision.IDSubdivision)
                                                  .OrderByDescending(y => y.BeginDate).FirstOrDefault()).ToList().SequenceEqual(Products))
                    {
                        break;
                    }
                    CreateDate = Date;
                }
            }
            return(CreateDate);
        }