Пример #1
0
        /// <summary>
        /// Enregistre la commande dans la DB.
        /// </summary>
        /// <param name="order">commande à sauvegarder</param>
        /// <returns></returns>
        public Order Save(Order order)
        {
            DateTime thisDay = DateTime.Today;

            order.Date = thisDay.ToString("yyyy-MM-dd");

            DaoOrder.Create(order);
            //si la ref de la commande est différente de 0, cad que la commande a été ajoutée avec succès à la DB,
            //alors on va pouvoir linker les recettes et leur quantité respectives à la commande (dans table contenir)
            if (order.Ref != 0)
            {
                ServiceRecipe  serviceRecipe  = new ServiceRecipe();
                ServiceProduct serviceProduct = new ServiceProduct();

                AuthUser.Client.Cooks -= order.TotalCost;

                foreach (Recipe recipe in order.Recipes)
                {
                    //Pour chaque recette dans la commande,
                    serviceRecipe.Save(recipe);

                    //Ici on va maj les stocks actuels des produits de la recette
                    foreach (Product product in recipe.Products)
                    {
                        serviceProduct.Save(product);
                    }
                }

                ServiceClient serviceClient = new ServiceClient();
                //On sauvegarde les infos updates du client (notamment son solde)
                serviceClient.Save(AuthUser.Client);
            }

            return(order);
        }
        /// <summary>
        /// Récupère la liste de toutes les recettes avec les quantités de produit associées à chaque recette.
        /// Si le paramètre all est initié à false, alors naturellement on ne va pas récupérer toutes les recettes
        /// mais garder uniquement celles dont la quantité faisable (à partir des stocks de leur produit) est
        /// strictement supérieure à 0.
        /// </summary>
        /// <param name="all">True si on veut récupérer toutes les recettes et false si on veut simplement les recettes faisables</param>
        /// <returns>La liste des recettes</returns>
        public List <Recipe> All(bool all = false)
        {
            ServiceProduct serviceProduct = new ServiceProduct();
            //On récupère d'abord toutes les recettes de la DB
            List <Recipe> recipes = DaoRecipe.ReadAll();

            //Puis pour chaque recette, on récupère sa liste des produits et la quantité associée.
            foreach (Recipe recipe in recipes)
            {
                recipe.Products = serviceProduct.Of(recipe);
            }
            if (!all)
            {
                recipes = recipes.Where(recipi => recipi.QuantiteFaisable > 0).ToList();
            }
            return(recipes);
        }
        /// <summary>
        /// Met à jour les recettes (rémunération, nbr commande, prix) ou les crée totalement,
        /// les produits (stocks min et max) ou les crée totalement,
        /// et les cdr (solde)
        /// </summary>
        /// <param name="recipe">recette qu'on veut mettre à jour ou créer (contenant une liste de produits que l'on veut update ou ajouter à la DB)</param>
        /// <returns>true si on est dans le cas d'une création de recette et false si on est dans le cas d'une création de commande</returns>
        public bool Save(Recipe recipe)
        {
            ServiceProduct serviceProduct = new ServiceProduct();

            //Si la recette n'existe pas dans la DB, on la crée.
            //Ce cas n'arrive pas lors d'une commande mais uniquement lors de la création d'une recette
            if (recipe.Ref == 0)
            {
                ServiceProvider serviceProvider = new ServiceProvider();
                //On enregistre la recette dans la DB (sans ses produits et quantités associées)
                recipe = DaoRecipe.Create(recipe);

                foreach (Product product in recipe.Products)
                {
                    //On parcourt chaque produit de la recette
                    //Si la référence du produit est nulle, cela signifie que le produit n'est pas encore enregistré dans la DB
                    //car c'est le cdr qui a crée ce produit lors de sa création de recette. Normalement, le cas de la référence
                    //produit nulle n'arrive pas dans le cas de l'enregistrement d'une commande
                    if (product.Ref == 0)
                    {
                        //Pour le nouveau produit, on fixe sa quantité actuelle à 4 fois la quantité requise pour produire
                        //la recette pour laquelle il a été crée
                        product.CurrentStock = 4 * product.QuantityInRecipe;
                        //Inutile d'initialiser les stocks min et max de ce nouveau produit car ils sont définis après.

                        //On récupère tous les fournisseurs de la base de données et on en assigne un aléatoirement à ce nouveau produit
                        List <Provider> providers = serviceProvider.All();
                        Random          rnd       = new Random();
                        product.Provider = providers[rnd.Next(0, providers.Count - 1)];
                    }

                    product.MinStock = product.MinStock + 2 * product.QuantityInRecipe;
                    product.MaxStock = product.MaxStock + 5 * product.QuantityInRecipe;
                    //On enregistre le produit dans la DB
                    serviceProduct.Save(product);
                }
                //Une fois qu'on a fait ca pour chaque produit de la nouvelle recette, on update cette même recette
                //pour linker sa liste des produits et leur quantité dans la table necessiter
                return(DaoRecipe.Update(recipe) != null);
            }
            //Si la recette existe déjà (cas de la création de commande)
            else
            {
                //Dans un premier temps, on incrémente le nombre de fois que la recette a été commandée
                //et on modifie les valeurs du prix de la recette et de la rémunération du cdr en fonction
                int oldTimesOrdered = recipe.TimesOrdered;
                recipe.TimesOrdered += recipe.QuantityInOrder;

                if (oldTimesOrdered < 10 && recipe.TimesOrdered >= 10)
                {
                    recipe.Price += 2;
                }
                else if (oldTimesOrdered < 50 && recipe.TimesOrdered >= 50)
                {
                    recipe.Price        += 5;
                    recipe.Remuneration += 4;
                }
                //On update la recette pour changer sa rémunération, son nombre de commande et son prix
                DaoRecipe.Update(recipe);

                ServiceRecipeCreator serviceRecipeCreator = new ServiceRecipeCreator();

                //On récupère le cdr de la recette (ses informations, notamment son solde)
                recipe.RecipeCreator = serviceRecipeCreator.One(recipe.RecipeCreator.Id);

                //Si le créateur de la recette est le même que celui qui commande, alors on incrémente le solde de l'utilisateur et non seulement
                //le solde du cdr. La différence réside uniquement dans l'affichage du solde cook de l'utilisateur après sa commande.
                if (AuthUser.RecipeCreator != null && AuthUser.RecipeCreator.Id == recipe.RecipeCreator.Id)
                {
                    //On incrémente son solde cook par la rémunération de la recette multiplié par la quantité de cette recette dans la commande
                    AuthUser.Client.Cooks += recipe.Remuneration * recipe.QuantityInOrder;
                }
                else
                {
                    recipe.RecipeCreator.Cooks += recipe.Remuneration * recipe.QuantityInOrder;
                    serviceRecipeCreator.Save(recipe.RecipeCreator);
                }
                return(false);
            }
        }