/// <summary>
        /// Méthode reliée au bouton "Se connecter" côté client qui vérifie si l'identifiant et le mdp rentrés par l'utilisateur correspondent à un couple identifiant/mdp dans la database
        /// </summary>
        /// <param name="sender">Bouton "Se connecter"</param>
        /// <param name="e">Evenement Click</param>
        private void Button_Click_connect_client(object sender, RoutedEventArgs e)
        {
            // Récupération des input
            string id  = ID_client.Text;
            string mdp = MDP_client.Password;

            // sécurité sur le mdp pour éviter le caractère retournant une erreur MySQL (fonction Caractere_interdit ne fonctionne pas sur les passwordBox)
            if (mdp.Contains('"'))
            {
                error_label.Content = "Guillemets (\") interdits";
            }
            else
            {
                // query pour rechercher si le couple identifiant/mdp rentré par l'utilisateur correspondant à un couple dans la database
                string query = $"Select count(*) from cooking.client where Identifiant=\"{id}\" and Mot_de_passe=\"{mdp}\";";
                List <List <string> > liste = Commandes_SQL.Select_Requete(query);
                if (liste[0][0] == "1") // si on trouve une occurence de ce couple alors le client existe
                {
                    // on navigue vers la page client en conservant l'id
                    Page_Client page_client = new Page_Client(id);
                    this.NavigationService.Navigate(page_client);
                }
                else
                {
                    error_label.Content = "Erreur client non reconnu";
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// Initialisation de la Page_Demo_1, affiche le nombre de client
        /// </summary>
        public Page_Demo_1()
        {
            InitializeComponent();
            string query = "Select count(*) from cooking.client";
            List <List <string> > Liste_Nb = Commandes_SQL.Select_Requete(query);

            Nb.Content = Liste_Nb[0][0];
        }
Beispiel #3
0
        /// <summary>
        /// Initialisation de Page_Demo_4, affichage du Nom, Stock actuel et Stock minimum des produits dont le Stock actuel est inférieur à 2*Stock minimal dans une List View
        /// </summary>
        public Page_Demo_4()
        {
            InitializeComponent();
            string query = "SELECT Nom_Produit, Stock, Stock_min FROM cooking.produit where Stock < (2*Stock_min);";
            List <List <string> > Liste_Nom_Stock_Stockmini = Commandes_SQL.Select_Requete(query);

            for (int i = 0; i < Liste_Nom_Stock_Stockmini.Count; i++)
            {
                Liste_Produit.Items.Add(new Produit {
                    Nom = Liste_Nom_Stock_Stockmini[i][0], Stock = Liste_Nom_Stock_Stockmini[i][1], Stock_mini = Liste_Nom_Stock_Stockmini[i][2]
                });
            }
        }
Beispiel #4
0
        /// <summary>
        /// Initialisation de la page Validation_Paiement, affichage du montant total de la commande, du solde actuel,
        /// du solde restant après commande et du reste à payer après déduction du total au solde actuel.
        ///
        /// Affichage du montant qui sera remboursé post-paiement dans le cadre de la rémunération des CdR
        /// Passer le bouton Valider en mode "Confirmer" si le solde actuel est suffisant, "Payer le reste par CB" dans le cas contraire
        /// </summary>
        /// <param name="total">Montant total de la commande</param>
        /// <param name="solde">Solde actuel du client</param>
        /// <param name="id_client">Identifiant du client afin de procéder au paiement</param>
        /// <param name="liste_panier">Liste des objets dans le panier du client afin de décrémenter les quantités de produit</param>
        public Validation_Paiement(string total, string solde, string id_client, List <List <string> > liste_panier)
        {
            InitializeComponent();
            this.liste_panier = liste_panier;
            this.id_client    = id_client;
            Total.Content     = total;
            Solde.Content     = solde;

            Remuneration_cooks.Visibility      = Visibility.Hidden; //par défaut on cache ce label
            label_Remuneration.Visibility      = Visibility.Hidden; //par défaut on cache ce label
            label_cook_remuneration.Visibility = Visibility.Hidden; //par défaut on cache ce label

            //Si le client qui commande est le CdR d'une des recette du panier, on affiche la rémunération qu'il va percevoir de cette commande
            int           ajout_credit = 0;
            List <string> liste_CdR    = new List <string>();

            for (int i = 0; i < liste_panier.Count; i++)
            {
                string nom_recette = this.liste_panier[i][0];
                string query       = $"select Identifiant,Remuneration from cooking.recette where Nom_Recette = \"{nom_recette}\";";
                List <List <string> > Id_CdR_et_remuneration = Commandes_SQL.Select_Requete(query);

                if (this.id_client == Id_CdR_et_remuneration[i][0])
                {
                    int qt           = Convert.ToInt32(this.liste_panier[i][1]);
                    int remuneration = Convert.ToInt32(Id_CdR_et_remuneration[i][1]);
                    ajout_credit += remuneration * qt;
                    Remuneration_cooks.Visibility      = Visibility.Visible;
                    label_Remuneration.Visibility      = Visibility.Visible;
                    label_cook_remuneration.Visibility = Visibility.Visible;
                }
            }

            Remuneration_cooks.Content = Convert.ToString(ajout_credit);

            int difference = Convert.ToInt32(solde) - Convert.ToInt32(total);

            if (difference >= 0)
            {
                Reste_a_payer.Content = "0";
                Nv_Solde.Content      = Convert.ToString(difference);
                Valider.Content       = "Confirmer";
            }
            else
            {
                Nv_Solde.Content      = "0";
                Reste_a_payer.Content = Convert.ToString(Math.Abs(difference));
                Valider.Content       = "Payer le reste par CB";
            }
        }
        /// <summary>
        /// Méthode reliée au bouton "Tri par recette" permettant de trier les éléments de la listView contenant les recettes par rapport au nom des recettes
        /// </summary>
        /// <param name="sender">Bouton "Tri par recette"</param>
        /// <param name="e">Evenement Click</param>
        private void Trier_par_recette_Click(object sender, RoutedEventArgs e)
        {
            // query permettant d'obtenir les éléments triés ordre alphabétique par rapport aux identifiants
            string query = $"select Nom_Recette,Identifiant from cooking.recette order by Nom_Recette;";
            List <List <string> > liste_recette_nom_compteur = Commandes_SQL.Select_Requete(query);

            // on update la listView
            Recettes_id_ListView.Items.Clear();
            for (int i = 0; i < liste_recette_nom_compteur.Count; i++)
            {
                Recettes_id_ListView.Items.Add(new Recette_id_CdR {
                    Nom_Recette = liste_recette_nom_compteur[i][0], Identifiant_CdR = liste_recette_nom_compteur[i][1]
                });
            }
        }
Beispiel #6
0
        /// <summary>
        /// Méthode reliée au bouton "Afficher infos recette" permettant (en cliquant sur un produit au préalable) d'afficher dans une autre ListView les informations relatives aux recettes utilisant ce produit
        /// Notamment leur nom et la quantité de ce produit qu'elles utilisent
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Button_Click_Recette(object sender, RoutedEventArgs e)
        {
            Liste_Recette.Items.Clear();
            Produit selection = Liste_Produit.SelectedItem as Produit;
            string  nom       = selection.Nom;
            string  query     = $"SELECT Nom_Recette, Quantite_Produit FROM cooking.composition_recette where Nom_Produit = \"{nom}\";";
            List <List <string> > Liste_Nom_Qt = Commandes_SQL.Select_Requete(query);

            for (int i = 0; i < Liste_Nom_Qt.Count; i++)
            {
                Liste_Recette.Items.Add(new Recette {
                    Nom = Liste_Nom_Qt[i][0], Qt = Liste_Nom_Qt[i][1]
                });
            }
        }
Beispiel #7
0
        /// <summary>
        /// Méthode reliée au bouton CdR permettant de devenir CdR si on ne l'est pas, ou accéder à la page CdR si on l'est. Inaccessible pour les utilisateurs restreints en clients
        /// </summary>
        /// <param name="sender">Bouton ""</param>
        /// <param name="e">Evenement Click</param>
        private void CdR_Click(object sender, RoutedEventArgs e)
        {
            string query = $"select CdR from client where Identifiant = \"{this.id_client}\" ;";
            List <List <string> > liste = Commandes_SQL.Select_Requete(query);

            if (Convert.ToInt32(liste[0][0]) == 0)
            {
                string query2 = $"Update cooking.client set CdR = 1 where Identifiant = \"{this.id_client}\" ;";
                string ex     = Commandes_SQL.Insert_Requete(query2);
                CdR.Content = "Page CdR";
            }
            else
            {
                Page_CdR Page_CdR = new Page_CdR(this.id_client);
                this.NavigationService.Navigate(Page_CdR);
            }
        }
Beispiel #8
0
        /// <summary>
        /// Méthode reliée au bouton "Créer votre compte" qui crée un nouveau client dans la database
        /// </summary>
        /// <param name="sender">Bouton créer votre compte creer</param>
        /// <param name="e">Evenment Click</param>
        private void Button_Click_creer_compte_client(object sender, RoutedEventArgs e)
        {
            // récupération des input
            string id  = idTextBox.Text;
            string mdp = mdpTextBox.Text;
            string nom = nomTextBox.Text;
            string tel = telTextBox.Text;

            // sécurité pour les input
            if (id == "" || id.Length > 50)
            {
                error.Content = "Identifiant invalide (1-50 caractères)";
            }
            else if (mdp == "" || mdp.Length > 50)
            {
                error.Content = "Mot de passe invalide (1-50 caractères)";
            }
            else if (nom == "" || nom.Length > 50)
            {
                error.Content = "Nom invalide (1-50 caractères)";
            }
            else if (tel == "" || !int.TryParse(tel, out _) || tel.Length > 15)
            {
                error.Content = "Téléphone invalide (1-15 caractères)";
            }
            else
            {
                error.Content = "";

                // création du client dans la database à partir des input
                string requete = $"INSERT INTO cooking.client VALUES (\"{id}\",\"{mdp}\",\"{nom}\",\"{tel}\",0,False);";
                string ex      = Commandes_SQL.Insert_Requete(requete);

                if (ex == $"Duplicate entry '{id}' for key 'client.PRIMARY'") // si l'identifiant (clé primaire) existe déjà dans la database.client
                {
                    error.Content = "Identifiant déjà utilisé";
                }
                else
                {
                    // on navigue vers la page Interface_Home
                    Interface_Home homepage = new Interface_Home();
                    this.NavigationService.Navigate(homepage);
                }
            }
        }
        /// <summary>
        /// Initialisation de la page comprenant le message de bienvenue et la listView contenant les recettes
        /// </summary>
        /// <param name="id_admin"> identifiant de l'utilisateur que l'on a conservé depuis la page Interface_Home </param>
        public Page_Admin(string id_admin)
        {
            InitializeComponent();
            this.id_admin = id_admin;

            welcome_message.Content = "Bonjour " + id_admin;

            //Ajout recette CdR et id_CdR dans la listView associé
            string query = $"select Nom_Recette,Identifiant from cooking.recette;";
            List <List <string> > liste_recette_nom_compteur = Commandes_SQL.Select_Requete(query);

            for (int i = 0; i < liste_recette_nom_compteur.Count; i++)
            {
                Recettes_id_ListView.Items.Add(new Recette_id_CdR {
                    Nom_Recette = liste_recette_nom_compteur[i][0], Identifiant_CdR = liste_recette_nom_compteur[i][1]
                });
            }
        }
        /// <summary>
        /// Initialisation de la Page_Demo_2, affiche le nombre de CdR et une ListView contenant la liste pour chaque CdR de leur Identifant, Nom et le volume que représente les commandes de leurs recettes
        /// </summary>
        public Page_Demo_2()
        {
            InitializeComponent();

            string query = "Select Nom_Client, Identifiant from cooking.client where CdR = \"1\";";
            List <List <string> > Liste_Nom_Id = Commandes_SQL.Select_Requete(query);

            Nb_CdR.Content = Liste_Nom_Id.Count;

            for (int i = 0; i < Liste_Nom_Id.Count; i++)
            {
                string nom = Liste_Nom_Id[i][0];
                string id  = Liste_Nom_Id[i][1];
                query = $"SELECT sum(Compteur) FROM cooking.recette where Identifiant = \"{id}\" ;";
                List <List <string> > Liste_Qt = Commandes_SQL.Select_Requete(query);
                string qt = Liste_Qt[0][0];
                Liste_CdR.Items.Add(new Nom_QT {
                    Nom = nom, Qt = qt, Identifiant = id
                });
            }
        }
        /// <summary>
        /// Méthode reliée au bouton "Créer le fournisseur" qui crée un nouveau fournisseur dans la database
        /// </summary>
        /// <param name="sender">bouton "Créer le fournisseur"</param>
        /// <param name="e">Evenement Click</param>
        private void Creer_Fournisseur_Click(object sender, RoutedEventArgs e)
        {
            // récupération des input
            string nom  = textbox_nom.Text;
            string refe = textbox_ref.Text;
            string tel  = textbox_tel.Text;

            // sécurité pour les input
            if (nom == "" || nom.Length > 50)
            {
                Erreur_message.Content = "Nom invalide (1-50 caractères)";
            }
            else if (refe == "" || refe.Length > 50)
            {
                Erreur_message.Content = "Référence invalide (1-50 caractères)";
            }
            else if (tel == "" || !int.TryParse(tel, out _) || tel.Length > 15)
            {
                Erreur_message.Content = "Téléphone invalide (1-15 caractères)";
            }
            else
            {
                Erreur_message.Content = "";

                // création du fournisseur dans la database à partir des input
                string query = $"insert into cooking.fournisseur VALUES(\"{refe}\",\"{nom}\",\"{tel}\");";
                string ex    = Commandes_SQL.Insert_Requete(query);
                if (ex == $"Duplicate entry '{refe}' for key 'fournisseur.PRIMARY'") // si la ref_fournisseur (clé primaire) existe déjà dans la database.fournisseur
                {
                    Erreur_message.Content = "Nom déjà utilisé";
                }
                else
                {
                    // on navigue vers la page Admin
                    Page_Admin page_admin = new Page_Admin(this.id_admin);
                    this.NavigationService.Navigate(page_admin);
                }
            }
        }
Beispiel #12
0
        /// <summary>
        /// Méthode reliée au bouton "Tricher (+50cooks)" permettant d'augmenter le solde du client de 50 cooks.
        /// A l'heure actuelle si le solde d'un client n'est pas suffisant pour payer l'intégralité de la commande, le client est invité
        /// à payer le reste par CB. Comme indiqué dans le CdC cette page (Page_Payer_CB ici) n'avait pas à être réellement designée.
        /// Afin de permettre le test de nos fonctions, nous avons donc ajouté ce bouton permettant à un nouveau client de se donner des crédits cooks
        /// et ainsi pouvoir valider ses commandes.
        /// Après avoir triché la valeur du bouton valider est ré-évaluée
        /// Cette méthode serait évidemment retirée dans le cadre d'une réelle mise en ligne de l'application.
        /// </summary>
        /// <param name="sender">Bouton "Tricher"</param>
        /// <param name="e">Evenement Click</param>
        private void Tricher_Click(object sender, RoutedEventArgs e)
        {
            string updatesolde = Convert.ToString(Convert.ToInt32(Solde.Content) + 50);
            string query       = $"Update cooking.client set Credit_Cook = {updatesolde} where Identifiant = \"{this.id_client}\" ;";
            string ex          = Commandes_SQL.Insert_Requete(query);

            Solde.Content = updatesolde;

            int difference = Convert.ToInt32(Solde.Content) - Convert.ToInt32(Total.Content);

            if (difference >= 0)
            {
                Reste_a_payer.Content = "0";
                Nv_Solde.Content      = Convert.ToString(difference);
                Valider.Content       = "Confirmer";
            }
            else
            {
                Nv_Solde.Content      = "0";
                Reste_a_payer.Content = Convert.ToString(Math.Abs(difference));
                Valider.Content       = "Payer le reste par CB";
            }
        }
        /// <summary>
        /// Initialisation de la page comprenant le message de bienvenue, le solde du CdR, la listView contenant les produits et la listView contenant les recettes du CdR
        /// </summary>
        /// <param name="id_client"> identifiant de l'utilisateur que l'on a conservé depuis la page Interface_Home </param>
        public Page_CdR(string id_client)
        {
            InitializeComponent();
            this.id_client = id_client;
            string query = $"Select Nom_Client from cooking.client where Identifiant = \"{this.id_client}\" ;";
            List <List <string> > liste = Commandes_SQL.Select_Requete(query);

            welcome_message.Content = "Bonjour " + liste[0][0];

            // récupération du solde cook du CdR
            query         = $"select Credit_Cook from client where Identifiant = \"{this.id_client}\" ;";
            liste         = Commandes_SQL.Select_Requete(query);
            Solde.Content = liste[0][0];

            // ajout produit dans la listView associée
            query = $"select Nom_Produit,Unite from cooking.produit;";
            List <List <string> > liste_produit_nom_unite = Commandes_SQL.Select_Requete(query);

            for (int i = 0; i < liste_produit_nom_unite.Count; i++)
            {
                Produits_ListView.Items.Add(new Produit {
                    Nom_Produit = liste_produit_nom_unite[i][0], Unite = liste_produit_nom_unite[i][1]
                });
            }

            // ajout recette CdR dans la listView associée
            query = $"select Nom_Recette,Compteur from cooking.recette where Identifiant = \"{this.id_client}\";";
            List <List <string> > liste_recette_nom_compteur = Commandes_SQL.Select_Requete(query);

            for (int i = 0; i < liste_recette_nom_compteur.Count; i++)
            {
                Recettes_CdR_ListView.Items.Add(new Recette {
                    Nom_Recette = liste_recette_nom_compteur[i][0], Compteur = liste_recette_nom_compteur[i][1]
                });
            }
        }
Beispiel #14
0
        /// <summary>
        /// Initialisation de la page permettant l'écriture du welcome message, solde en cook, de la listview des recettes dispos ainsi que des différents bouton, textbox, ...
        /// </summary>
        /// <param name="id_client">Identifiant du client actuel</param>
        public Page_Client(string id_client)
        {
            InitializeComponent();
            Valider.IsEnabled = false;
            this.id_client    = id_client;
            string query = $"Select Nom_Client from cooking.client where Identifiant = \"{this.id_client}\" ;";
            List <List <string> > liste = Commandes_SQL.Select_Requete(query);

            welcome_message.Content = "Bonjour " + liste[0][0];

            // Ajout de toutes les recettes
            List <List <string> > list_recette = new List <List <string> >();

            query        = "Select Nom_Recette, Type, Prix_Vente, Descriptif from cooking.recette;";
            list_recette = Commandes_SQL.Select_Requete(query);

            for (int i = 0; i < list_recette.Count(); i++)
            {
                //déterminer nb de produit dans la recette
                query = $"select Nom_Produit, Quantite_Produit from cooking.composition_recette where Nom_Recette = \"{list_recette[i][0]}\";";
                List <List <string> > List_Produit_QT_dans_recette = Commandes_SQL.Select_Requete(query);

                int min_qt_faisable = int.MaxValue;
                for (int j = 0; j < List_Produit_QT_dans_recette.Count; j++) //pour chaque produit
                {
                    query = $"Select Stock from cooking.produit where Nom_Produit = \"{List_Produit_QT_dans_recette[j][0]}\";";
                    List <List <string> > List_Stock = Commandes_SQL.Select_Requete(query);
                    int stock_produit         = Convert.ToInt32(List_Stock[0][0]);
                    int quantite_pour_recette = Convert.ToInt32(List_Produit_QT_dans_recette[j][1]);
                    int qt_faisable           = stock_produit / quantite_pour_recette;
                    if (qt_faisable < min_qt_faisable)
                    {
                        min_qt_faisable = qt_faisable;
                    }
                }

                Liste_Recette.Items.Add(new Recette_complete {
                    Nom_Recette = list_recette[i][0], Type = list_recette[i][1], Descriptif = list_recette[i][3], Prix = list_recette[i][2], Qt_Faisable = min_qt_faisable
                });
            }



            string query2 = $"select CdR,Credit_Cook from client where Identifiant = \"{this.id_client}\" ;";

            liste = Commandes_SQL.Select_Requete(query2);
            if (Convert.ToInt32(liste[0][0]) == 0)
            {
                CdR.Content = "Devenir CdR";
            }
            if (Convert.ToInt32(liste[0][0]) == 1)
            {
                CdR.Content = "Page CdR";
            }
            if (Convert.ToInt32(liste[0][0]) == 2)
            {
                CdR.Content   = "Client";
                CdR.IsEnabled = false;
            }

            Solde.Content = liste[0][1];
        }
Beispiel #15
0
        /// <summary>
        /// Méthode reliée au bouton "Ajouter" permettant de passer le montant choisi de la recette sélectionnée dans le panier. La quantité faisable pour chaque recette se met à jour après l'ajout dans le panier
        /// Le montant total de la commande se met à jour après chaque ajout
        /// </summary>
        /// <param name="sender">Bouton "Ajouter"</param>
        /// <param name="e">Evenement Click</param>
        private void Ajouter_Click(object sender, RoutedEventArgs e)
        {
            Recette_complete selection = Liste_Recette.SelectedItem as Recette_complete;

            if (selection == null)
            {
                erreur.Content = "Aucune recette sélectionnée";
            }
            if (Quantité.Text == "" || !int.TryParse(Quantité.Text, out _) || Convert.ToInt32(Quantité.Text) <= 0)
            {
                erreur.Content = "Quantité invalide";
            }
            else
            {
                erreur.Content = "";
                Recette_Panier recette_selectionnee = new Recette_Panier {
                    Nom_Recette = selection.Nom_Recette, Quantite_Recette = Quantité.Text, Prix = selection.Prix
                };

                List <Recette_Panier> Liste_Recette_Panier = new List <Recette_Panier>();
                Liste_Recette_Panier.Add(recette_selectionnee);
                for (int i = 0; i < Panier.Items.Count; i++)
                {
                    Liste_Recette_Panier.Add(Panier.Items[i] as Recette_Panier);
                }

                //Liste_Recette_Panier contient toutes les recettes qu'on veut évaluer
                List <List <string> > Nom_Conso = new List <List <string> >();
                for (int i = 0; i < Liste_Recette_Panier.Count; i++)
                {
                    string query = $"select Nom_Produit, Quantite_Produit from cooking.composition_recette where Nom_Recette = \"{Liste_Recette_Panier[i].Nom_Recette}\";";
                    List <List <string> > List_Produit_QT_dans_recette = Commandes_SQL.Select_Requete(query);

                    for (int j = 0; j < List_Produit_QT_dans_recette.Count; j++) // pour chaque produit de cette recette
                    {
                        if (Nom_Conso.Count == 0)                                //premier item
                        {
                            List <string> premieritem = new List <string>();
                            premieritem.Add(List_Produit_QT_dans_recette[j][0]);
                            premieritem.Add(Convert.ToString(Convert.ToInt32(List_Produit_QT_dans_recette[j][1]) * Convert.ToInt32(Liste_Recette_Panier[i].Quantite_Recette)));
                            Nom_Conso.Add(premieritem);
                        }
                        else
                        {
                            bool copie = false;
                            for (int k = 0; k < Nom_Conso.Count; k++) //pour chaque produit déjà enregistré
                            {
                                if (Nom_Conso[k][0] == List_Produit_QT_dans_recette[j][0])
                                {
                                    copie           = true;
                                    Nom_Conso[k][1] = Convert.ToString(Convert.ToInt32(Nom_Conso[k][1]) + (Convert.ToInt32(List_Produit_QT_dans_recette[j][1]) * Convert.ToInt32(Liste_Recette_Panier[i].Quantite_Recette)));
                                }
                            }

                            if (!copie)
                            {
                                List <string> nv_item = new List <string>();
                                nv_item.Add(List_Produit_QT_dans_recette[j][0]);
                                nv_item.Add(Convert.ToString(Convert.ToInt32(List_Produit_QT_dans_recette[j][1]) * Convert.ToInt32(Liste_Recette_Panier[i].Quantite_Recette)));
                                Nom_Conso.Add(nv_item);
                            }
                        }
                    }
                }

                //on récupère le vrai stock

                string query2 = "Select Nom_Produit, Stock from cooking.produit";
                List <List <string> > Nom_Stock = Commandes_SQL.Select_Requete(query2);
                bool check = true;
                for (int i = 0; i < Nom_Stock.Count; i++)
                {
                    for (int j = 0; j < Nom_Conso.Count; j++)
                    {
                        if (Nom_Stock[i][0] == Nom_Conso[j][0])
                        {
                            Nom_Stock[i][1] = Convert.ToString(Convert.ToInt32(Nom_Stock[i][1]) - Convert.ToInt32(Nom_Conso[j][1]));
                            if (Convert.ToInt32(Nom_Stock[i][1]) < 0)
                            {
                                check = false;                                       //pas assez de stock
                            }
                        }
                    }
                }

                if (!check)
                {
                    erreur.Content = "ERREUR pas assez de stock";
                }
                else
                {
                    Valider.IsEnabled = true; // on réactive le bouton

                    erreur.Content = "";
                    List <Recette_complete> nouvelle_table = new List <Recette_complete>();
                    for (int i = 0; i < Liste_Recette.Items.Count; i++)
                    {
                        Recette_complete      recette_observee             = Liste_Recette.Items[i] as Recette_complete;
                        string                nom_recette                  = recette_observee.Nom_Recette;
                        string                query                        = $"select Nom_Produit, Quantite_Produit from cooking.composition_recette where Nom_Recette = \"{nom_recette}\";";
                        List <List <string> > List_Produit_QT_dans_recette = Commandes_SQL.Select_Requete(query);

                        int min_qt_faisable = int.MaxValue;
                        for (int j = 0; j < List_Produit_QT_dans_recette.Count; j++) //pour chaque produit
                        {
                            int stock_produit = 0;
                            for (int k = 0; k < Nom_Stock.Count; k++)
                            {
                                if (Nom_Stock[k][0] == List_Produit_QT_dans_recette[j][0])
                                {
                                    stock_produit = Convert.ToInt32(Nom_Stock[k][1]);
                                }
                            }

                            int quantite_pour_recette = Convert.ToInt32(List_Produit_QT_dans_recette[j][1]);
                            int qt_faisable           = stock_produit / quantite_pour_recette;
                            if (qt_faisable < min_qt_faisable)
                            {
                                min_qt_faisable = qt_faisable;
                            }
                        }

                        recette_observee.Qt_Faisable = min_qt_faisable;
                        Recette_complete copie_recette = new Recette_complete {
                            Nom_Recette = recette_observee.Nom_Recette, Type = recette_observee.Type, Descriptif = recette_observee.Descriptif, Prix = recette_observee.Prix, Qt_Faisable = min_qt_faisable
                        };
                        nouvelle_table.Add(copie_recette);
                    }

                    Liste_Recette.Items.Clear();
                    for (int i = 0; i < nouvelle_table.Count; i++)
                    {
                        Liste_Recette.Items.Add(nouvelle_table[i]);
                    }
                    int ajout = Convert.ToInt32(selection.Prix) * Convert.ToInt32(Quantité.Text);
                    Total.Content = Convert.ToString(Convert.ToInt32(Total.Content) + ajout);
                    Panier.Items.Add(new Recette_Panier {
                        Nom_Recette = selection.Nom_Recette, Quantite_Recette = Quantité.Text, Prix = selection.Prix
                    });
                    Quantité.Text = "";
                }
            }
        }
        /// <summary>
        ///  Méthode reliée au bouton "Carnet de commande des produits XML" permettant de générer un fichier XML contenant La liste des produits dont la quantité est inférieure à la quantité minimale classé par fournisseur puis par produit
        /// </summary>
        /// <param name="sender">Bouton "Carnet de commande des produits XML"</param>
        /// <param name="e">Evenement Click</param>
        private void Carnet_commandes_produit_XML_Click(object sender, RoutedEventArgs e)
        {
            // mise a jour stock min et max produits pas utilisés depuis 30 jours
            DateTime Trente_jours_avant = DateTime.Now.AddDays(-30);

            // on met la date en format AAAA-MM-JJ car MySLQ interprète la date comme cela
            string datelimite = $"{Trente_jours_avant.Year}/{Trente_jours_avant.Month}/{Trente_jours_avant.Day}";
            string auj        = $"{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}";

            // query permettant de récupérer le nom, stock_min, stock_max des produits qui n'ont pas été utilisé depuis 30 jours
            string query = $"select distinct(Nom_Produit), Stock_min, Stock_max " +
                           $"from cooking.produit " +
                           $"where Nom_Produit not in " +
                           $"(select distinct(Nom_Produit) " +
                           $"from (cooking.commande natural join cooking.composition_commande) natural join cooking.composition_recette " +
                           $"where Date between \"{datelimite}\" AND \"{auj}\");";
            List <List <string> > Liste_Produit_a_modifier = Commandes_SQL.Select_Requete(query);

            // pour chaque produit on fait la mise à jour des quantité

            for (int i = 0; i < Liste_Produit_a_modifier.Count; i++)
            {
                string nom_produit  = Liste_Produit_a_modifier[i][0];
                int    Nv_Stock_Min = Convert.ToInt32(Liste_Produit_a_modifier[i][1]) / 2;
                int    Nv_Stock_Max = Convert.ToInt32(Liste_Produit_a_modifier[i][2]) / 2;
                query = $"Update cooking.produit set Stock_min = {Nv_Stock_Min}, Stock_max = {Nv_Stock_Max} where Nom_Produit = \"{nom_produit}\";";
                string ex = Commandes_SQL.Insert_Requete(query);
            }

            // query permettant de récupérer les produits triés par fournisseur puis par leur nom
            query = "select Nom_Produit,Categorie,Unite,Stock,Stock_min,Stock_max,Ref_Fournisseur from cooking.produit where Stock < Stock_min order by Ref_Fournisseur,Nom_Produit;";
            List <List <string> > liste_produit_a_commander = Commandes_SQL.Select_Requete(query);

            List <Fournisseur> liste_Fournisser_XML = new List <Fournisseur>(); //liste finale qu'on va rentrer dans XML
            List <Produit>     liste_produits_pour_un_fournisseur = new List <Produit>();
            int  a = 0;                                                         // compteur utilisé pour rassembler les produits d'un même fournisseur dans une liste
            bool changement_fournisseur_iteration_precedente = true;            // pour savoir si on a changé de fournisseur à l'itération précédente

            for (int i = 0; i < liste_produit_a_commander.Count; i += a)
            {
                a = 0;
                // si on a changé de fournisseur à l'itération précédente, on doit rentrer dans la boucle
                // de même, si le fournisseur du produit regardé est le même que celui du produit de l'itération précédente, on doit rentrer dans la boucle
                // la condition du dessus est valable car les produits sont triés par fournisseur dans la liste des produits commandés
                while (changement_fournisseur_iteration_precedente || liste_produit_a_commander[i + a][6] == liste_produit_a_commander[i + a - 1][6])
                {
                    // infos du produit qu'on regarde
                    Produit produit_concerne = new Produit
                    {
                        Nom_Produit          = liste_produit_a_commander[i + a][0],
                        Categorie            = liste_produit_a_commander[i + a][1],
                        Unite                = liste_produit_a_commander[i + a][2],
                        Stock                = liste_produit_a_commander[i + a][3],
                        Stock_min            = liste_produit_a_commander[i + a][4],
                        Stock_max            = liste_produit_a_commander[i + a][5],
                        Ref_Fournisseur      = liste_produit_a_commander[i + a][6],
                        Quantite_a_commander = Convert.ToString(Convert.ToInt32(liste_produit_a_commander[i + a][5]) - Convert.ToInt32(liste_produit_a_commander[i + a][3]))
                    };

                    liste_produits_pour_un_fournisseur.Add(produit_concerne); //tous les produits à commander pour un fournisseur
                    a++;
                    if (i + a == liste_produit_a_commander.Count)
                    {
                        break;                                           //si on atteint la taille de la liste des produits à commander on sort du while
                    }
                    changement_fournisseur_iteration_precedente = false;
                }

                // jusque là, les produits avaient le même fournisseur

                //récupération des infos du fournisseur concerné
                query = $"select Ref_Fournisseur,Nom_Fournisseur,Numero_tel_Fournisseur from cooking.fournisseur where Ref_Fournisseur = \"{liste_produit_a_commander[i+a - 1][6]}\";";
                List <List <string> > liste_info_fournisseur = Commandes_SQL.Select_Requete(query);

                Fournisseur nouveau_fournisseur = new Fournisseur
                {
                    Ref_Fournisseur           = liste_info_fournisseur[0][0],
                    Nom_Fournisseur           = liste_info_fournisseur[0][1],
                    Numero_tel_Fournisseur    = liste_info_fournisseur[0][2],
                    liste_produit_a_commander = liste_produits_pour_un_fournisseur
                };

                liste_Fournisser_XML.Add(nouveau_fournisseur);

                liste_produits_pour_un_fournisseur = new List <Produit>(); //reset la liste des produits pour un fournisseur

                changement_fournisseur_iteration_precedente = true;
            }

            // Création du fichier XML
            XmlSerializer xs = new XmlSerializer(typeof(List <Fournisseur>));

            using (StreamWriter wr = new StreamWriter("Liste_des_produits_à_commander.xml"))
            {
                xs.Serialize(wr, liste_Fournisser_XML);
            }
        }
Beispiel #17
0
        /// <summary>
        /// Méthode reliée au bouton "Valider" permettant de Valider le paiement.
        /// Si le contenu du bouton est "Payer le reste par CB", aucune action n'est effectuée et le client est envoyé sur la page Page_Payer_CB
        /// Si le contenu du bouton est "Confirmer", on effectue les actions suivantes :
        /// - Décrémenter le nb de crédit du client
        /// - Créer une instance de Commande
        /// --> Pour chaque recette commandée
        ///         * Rémunérer le/les CdR
        ///         * Augmenter le compteur des recettes utilisées de la quantité prise
        ///         * Augmenter le prix de vente
        ///         * Augmenter la rémunération de la recette
        ///         * Créer ses instances de Recette_Commande
        ///         * Diminuer les produits
        /// </summary>
        /// <param name="sender">Bouton "Valider"</param>
        /// <param name="e">Evenement Click</param>
        private void Valider_Click(object sender, RoutedEventArgs e)
        {
            if (Valider.Content.ToString() == "Confirmer")
            {
                // Décrémenter le nb de crédit du client
                int    nouveau_solde = Convert.ToInt32(Nv_Solde.Content);
                string query         = $"Update cooking.client set Credit_Cook = {nouveau_solde}  where Identifiant = \"{this.id_client}\" ;";
                string ex            = Commandes_SQL.Insert_Requete(query);

                // Créer une instance de Commande

                string date = $"{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}";
                query = $"Insert into cooking.commande (Date, prix, Identifiant) VALUES(\"{date}\",{Total.Content},\"{this.id_client}\");";
                ex    = Commandes_SQL.Insert_Requete(query);

                // Actions pour chacune des recettes
                for (int i = 0; i < this.liste_panier.Count; i++)
                {
                    // Rémunérer le/les CdR

                    string nom_recette = this.liste_panier[i][0];
                    int    qt          = Convert.ToInt32(this.liste_panier[i][1]);
                    query = $"Select Identifiant, Remuneration, compteur, Prix_Vente from cooking.recette where Nom_Recette = \"{nom_recette}\";";
                    List <List <string> > info_recette = Commandes_SQL.Select_Requete(query);
                    string identifiant_CdR             = info_recette[0][0];
                    int    remuneration = Convert.ToInt32(info_recette[0][1]);
                    int    ajout_credit = remuneration * qt;

                    query = $"Select Credit_Cook from cooking.client where Identifiant = \"{identifiant_CdR}\";";
                    List <List <string> > Credit_CdR = Commandes_SQL.Select_Requete(query);

                    int nvCredit_CdR = Convert.ToInt32(Credit_CdR[0][0]) + ajout_credit;
                    query = $"Update cooking.client set Credit_Cook = {nvCredit_CdR} where Identifiant = \"{identifiant_CdR}\"; ";
                    ex    = Commandes_SQL.Insert_Requete(query);

                    // Augmenter le compteur des recettes utilisées de la quantité prise

                    int nvcompteur = Convert.ToInt32(info_recette[0][2]) + qt;
                    query = $"Update cooking.recette set compteur = {nvcompteur} where Nom_Recette = \"{nom_recette}\";";
                    ex    = Commandes_SQL.Insert_Requete(query);

                    // Augmenter le prix de vente
                    // Augmenter la rémunération de la recette

                    if (nvcompteur > 10 && Convert.ToInt32(info_recette[0][2]) <= 10) //nv compteur >10 et ancien <=10
                    {
                        int nv_prix          = 2 + Convert.ToInt32(info_recette[0][3]);
                        int remuneration_CdR = 2;
                        if (nvcompteur > 50 && Convert.ToInt32(info_recette[0][2]) <= 50)//nv compteur >50 et ancien <=50
                        {
                            nv_prix          = 5 + Convert.ToInt32(info_recette[0][3]);
                            remuneration_CdR = 4;
                        }
                        query = $"Update cooking.recette set Prix_Vente = {nv_prix}, Remuneration = {remuneration_CdR} where Nom_Recette = \"{nom_recette}\";";
                        ex    = Commandes_SQL.Insert_Requete(query);
                    }

                    // Créer ses instances de Recette_Commande
                    query = $"select count(*) from cooking.commande"; //notre commande est la dernière, donc Ref_Commande = count(*)
                                                                      //En effet ref_commande est un autoincrement
                    List <List <string> > List_Ref_Commande = Commandes_SQL.Select_Requete(query);


                    query = $"Insert into cooking.composition_commande VALUES (\"{nom_recette}\",{List_Ref_Commande[0][0]}, {qt} );";
                    ex    = Commandes_SQL.Insert_Requete(query);


                    //Diminuer les produits

                    query = $"select Nom_Produit, Quantite_Produit from cooking.composition_recette where Nom_Recette = \"{nom_recette}\";";
                    List <List <string> > List_Produit_QT_dans_recette = Commandes_SQL.Select_Requete(query);

                    for (int j = 0; j < List_Produit_QT_dans_recette.Count; j++)
                    {
                        int diminution = qt * Convert.ToInt32(List_Produit_QT_dans_recette[j][1]);
                        query = $"select Stock from cooking.produit where Nom_Produit = \"{List_Produit_QT_dans_recette[j][0]}\";";
                        List <List <string> > List_Stock = Commandes_SQL.Select_Requete(query);
                        int nv_Stock = Convert.ToInt32(List_Stock[0][0]) - diminution;
                        query = $"Update cooking.produit set Stock = \"{nv_Stock}\" where Nom_Produit = \"{List_Produit_QT_dans_recette[j][0]}\" ;";
                        Commandes_SQL.Insert_Requete(query);
                    }
                }

                Page_Client page_Client = new Page_Client(this.id_client);
                this.NavigationService.Navigate(page_Client);
            }
            else
            {
                Page_Payer_CB page_payer_cb = new Page_Payer_CB();
                this.NavigationService.Navigate(page_payer_cb);
            }
        }
        /// <summary>
        ///  Méthode reliée au bouton "Passer le CdR en client" permettant d'effectuer l'action correspondante, elle va donc rendre impossible pour ce client d'être CdR et va supprimer toutes ses recettes
        /// </summary>
        /// <param name="sender">Bouton "Passer le CdR en client"</param>
        /// <param name="e">Evenement Click</param>
        private void CdR_To_Client_Click(object sender, RoutedEventArgs e)
        {
            // sécurité
            if (id_CdR_Box.Text == "")
            {
                Erreur_Message.Content = "Aucun CdR rentré";
            }
            else
            {
                Erreur_Message.Content = "";

                // passer le CdR en client et l'empêcher de redevenir CdR (cela est représenté par la valeur 2)
                string query = $"Update cooking.client set CdR = 2 where Identifiant = \"{id_CdR_Box.Text}\";";
                string ex    = Commandes_SQL.Insert_Requete(query);

                // suppression de toutes les recettes du CdR
                // on veut récupérer toutes les recettes du CdR rentré en input
                query = $"select Nom_Recette from cooking.recette where Identifiant = \"{id_CdR_Box.Text}\";";
                List <List <string> > liste_nom_recette_CdR = Commandes_SQL.Select_Requete(query);

                if (liste_nom_recette_CdR.Count == 0)
                {
                    Erreur_Message.Content = "Ce CdR n'existe pas";
                }
                else
                {
                    for (int i = 0; i < liste_nom_recette_CdR.Count; i++)
                    {
                        //mettre à jour les stock mini et max de produit
                        //on recupère les infos relatives au produit dont on a besoin
                        query = $"Select Nom_Produit,Quantite_Produit,Stock_min,Stock_max from cooking.composition_recette natural join cooking.produit where Nom_Recette = \"{liste_nom_recette_CdR[i][0]}\";";
                        List <List <string> > Liste_Nom_Produit_QT_Min_Max = Commandes_SQL.Select_Requete(query);

                        string query5 = "";
                        for (int j = 0; j < Liste_Nom_Produit_QT_Min_Max.Count; j++)
                        {
                            // re-définition des termes pour que ce soit plus clair
                            string nom_produit_observe = Liste_Nom_Produit_QT_Min_Max[j][0];
                            int    quantite_necessaire_dans_recette = Convert.ToInt32(Liste_Nom_Produit_QT_Min_Max[j][1]);
                            int    stock_min = Convert.ToInt32(Liste_Nom_Produit_QT_Min_Max[j][2]);
                            int    stock_max = Convert.ToInt32(Liste_Nom_Produit_QT_Min_Max[j][3]);

                            //on adapte les stocks de la même manière que lorsque qu'une recette est créée, sauf qu'ici, le stock est impacté négativement
                            int nv_stock_min = stock_min - quantite_necessaire_dans_recette;
                            int nv_stock_max = stock_max - 2 * quantite_necessaire_dans_recette;

                            // query pour modifier les valeurs de stock_min et stock_max où le nom de produit est celui que l'on observe
                            // on fait "+=" pour cette query car veut minimiser les interactions avec MySQL
                            query5 += $"Update cooking.produit set Stock_min = {nv_stock_min}, Stock_max = {nv_stock_max} where Nom_Produit = \"{nom_produit_observe}\";";
                        }
                        // on exécute donc la query (contenant plusieurs commandes) dans MySQL à la fin de la boucle
                        ex = Commandes_SQL.Insert_Requete(query5);

                        //delete child rows
                        string query1 = $"delete from cooking.composition_recette where Nom_Recette = \"{liste_nom_recette_CdR[i][0]}\";";
                        string query2 = $"delete from cooking.composition_commande where Nom_Recette = \"{liste_nom_recette_CdR[i][0]}\";";

                        //delete parent row
                        string query4 = $"delete from cooking.recette where Nom_Recette = \"{liste_nom_recette_CdR[i][0]}\";";

                        //final query
                        string query_final = query1 + query2 + query4;
                        ex = Commandes_SQL.Insert_Requete(query_final);
                    }

                    //on actualise la listView contenant les recettes
                    Recettes_id_ListView.Items.Clear();
                    query = $"select Nom_Recette,Identifiant from cooking.recette;";
                    List <List <string> > liste_recette_nom_compteur = Commandes_SQL.Select_Requete(query);
                    for (int i = 0; i < liste_recette_nom_compteur.Count; i++)
                    {
                        Recettes_id_ListView.Items.Add(new Recette_id_CdR {
                            Nom_Recette = liste_recette_nom_compteur[i][0], Identifiant_CdR = liste_recette_nom_compteur[i][1]
                        });
                    }
                }
            }
        }
        /// <summary>
        /// Méthode reliée au bouton "Supprimer recette" permettant de supprimer une recette, et tout ce qui est associé à celle-ci, de la database
        /// </summary>
        /// <param name="sender">Bouton "Supprimer recette"</param>
        /// <param name="e">Evenement Click</param>
        private void Supprimer_recette_Click(object sender, RoutedEventArgs e)
        {
            // selection est un objet que l'on re-définit en tant classe Recette_id_CdR pour pouvoir accéder à ce qu'elle contient
            Recette_id_CdR selection = Recettes_id_ListView.SelectedItem as Recette_id_CdR;

            // sécurité
            if (selection == null)
            {
                Erreur_Message.Content = "Aucune recette sélectionnée";
            }
            else
            {
                Erreur_Message.Content = "";

                //mettre à jour les stock mini et max de produit
                //on recupère les infos relatives au produit dont on a besoin
                string query = $"Select Nom_Produit,Quantite_Produit,Stock_min,Stock_max from cooking.composition_recette natural join cooking.produit where Nom_Recette = \"{selection.Nom_Recette}\";";
                List <List <string> > Liste_Nom_Produit_QT_Min_Max = Commandes_SQL.Select_Requete(query);

                string query5 = "";
                for (int i = 0; i < Liste_Nom_Produit_QT_Min_Max.Count; i++)
                {
                    // re-définition des termes pour que ce soit plus clair
                    string nom_produit_observe = Liste_Nom_Produit_QT_Min_Max[i][0];
                    int    quantite_necessaire_dans_recette = Convert.ToInt32(Liste_Nom_Produit_QT_Min_Max[i][1]);
                    int    stock_min = Convert.ToInt32(Liste_Nom_Produit_QT_Min_Max[i][2]);
                    int    stock_max = Convert.ToInt32(Liste_Nom_Produit_QT_Min_Max[i][3]);

                    // on adapte les stocks de la même manière que lorsque qu'une recette est créée, sauf qu'ici, le stock est impacté négativement
                    int nv_stock_min = stock_min - quantite_necessaire_dans_recette;
                    int nv_stock_max = stock_max - 2 * quantite_necessaire_dans_recette;

                    // query pour modifier les valeurs de stock_min et stock_max où le nom de produit est celui que l'on observe
                    // on fait "+=" pour cette query car veut minimiser les interactions avec MySQL
                    query5 += $"Update cooking.produit set Stock_min = {nv_stock_min}, Stock_max = {nv_stock_max} where Nom_Produit = \"{nom_produit_observe}\";";
                }
                // on exécute donc la query (contenant plusieurs commandes) dans MySQL à la fin de la boucle
                string ex = Commandes_SQL.Insert_Requete(query5);

                // delete child rows
                string query1 = $"delete from cooking.composition_recette where Nom_Recette = \"{selection.Nom_Recette}\";";
                string query2 = $"delete from cooking.composition_commande where Nom_Recette = \"{selection.Nom_Recette}\";";

                // delete parent row
                string query4 = $"delete from cooking.recette where Nom_Recette = \"{selection.Nom_Recette}\";";

                // final query
                query = query1 + query2 + query4;
                ex    = Commandes_SQL.Insert_Requete(query);

                // update listView -> on veut aussi supprimer la recette selectionée de la listView
                List <Recette_id_CdR> liste_nv_Item = new List <Recette_id_CdR>();
                for (int i = 0; i < Recettes_id_ListView.Items.Count; i++)
                {
                    Recette_id_CdR recette_observee = Recettes_id_ListView.Items[i] as Recette_id_CdR;
                    if (recette_observee.Nom_Recette != selection.Nom_Recette)
                    {
                        Recette_id_CdR copie_recette = new Recette_id_CdR {
                            Nom_Recette = recette_observee.Nom_Recette, Identifiant_CdR = recette_observee.Identifiant_CdR
                        };
                        liste_nv_Item.Add(copie_recette);
                    }
                }
                Recettes_id_ListView.Items.Clear();
                for (int i = 0; i < liste_nv_Item.Count; i++)
                {
                    Recettes_id_ListView.Items.Add(liste_nv_Item[i]);
                }
            }
        }
 /// <summary>
 /// Méthode reliée au bouton "Reset BDD" nous permettant de réinitialiser notre database à partir de fichiers txt (équivalents à des scripts SQL ordinaires)
 /// </summary>
 /// <param name="sender">Bouton "Reset BDD"</param>
 /// <param name="e">Evenement Click</param>
 private void Button_Click_Reset_BDD(object sender, RoutedEventArgs e)
 {
     Commandes_SQL.Execution_Script_TXT("Initialisation_DB.txt");
     Commandes_SQL.Execution_Script_TXT("Dummy_Data.txt");
 }
        /// <summary>
        /// Méthode reliée au bouton "Créer le produit" qui crée un nouveau produit dans la database
        /// </summary>
        /// <param name="sender">Bouton "Créer le produit"</param>
        /// <param name="e">Evenement Click</param>
        private void Creer_Produit_Click(object sender, RoutedEventArgs e)
        {
            // récupération des input
            string nom_produit     = textbox_nom.Text;
            string categorie       = textbox_categorie.Text;
            string unite           = textbox_unite.Text;
            string ref_fournisseur = textbox_ref_fournisseur.Text;
            string stock           = textbox_stock.Text;
            string stock_min       = textbox_stock_min.Text;
            string stock_max       = textbox_stock_max.Text;

            // sécurité pour les input
            if (nom_produit == "" || nom_produit.Length > 50)
            {
                Erreur_message.Content = "Nom invalide (1-50 caractères)";
            }
            else if (categorie == "" || categorie.Length > 50)
            {
                Erreur_message.Content = "Categorie invalide (1-50 caractères)";
            }
            else if (unite == "" || unite.Length > 10)
            {
                Erreur_message.Content = "Unite invalide (1-10 caractères)";
            }
            else if (ref_fournisseur == "" || ref_fournisseur.Length > 50)
            {
                Erreur_message.Content = "Fournisseur invalide (1-50 caractères)";
            }
            else if (stock == "" || !int.TryParse(stock, out _))
            {
                Erreur_message.Content = "Stock invalide";
            }
            else if (stock_min == "" || !int.TryParse(stock_min, out _))
            {
                Erreur_message.Content = "Stock minimal invalide";
            }
            else if (stock_max == "" || !int.TryParse(stock_max, out _) || Convert.ToInt32(stock_max) < Convert.ToInt32(stock_min) || Convert.ToInt32(stock_max) < Convert.ToInt32(stock))
            {
                Erreur_message.Content = "Stock maximal invalide";
            }
            else
            {
                Erreur_message.Content = "";

                //on vérifie si le fournisseur du produit qu'on veut créer existe dans notre database car Ref_Fournisseur = Foreign key de l'entité produit
                string query = "select Ref_Fournisseur from cooking.fournisseur;";
                List <List <string> > liste_Ref_fournisseur = Commandes_SQL.Select_Requete(query);

                bool ref_fournisseur_dans_BDD = false;
                for (int i = 0; i < liste_Ref_fournisseur.Count; i++)
                {
                    if (liste_Ref_fournisseur[i][0] == ref_fournisseur)
                    {
                        ref_fournisseur_dans_BDD = true;
                    }
                }

                if (!ref_fournisseur_dans_BDD)
                {
                    Erreur_message.Content = "Fournisseur inconnu";
                }
                else
                {
                    // création du fournisseur dans la database à partir des input
                    query = $"insert into cooking.produit values (\"{nom_produit}\",\"{categorie}\",\"{unite}\",{stock},{stock_min},{stock_max},\"{ref_fournisseur}\")";
                    string ex = Commandes_SQL.Insert_Requete(query);

                    if (ex == $"Duplicate entry '{nom_produit}' for key 'produit.PRIMARY'") // si le nom_produit (clé primaire) existe déjà dans la database.produit
                    {
                        Erreur_message.Content = "Nom déjà utilisé";
                    }
                    else
                    {
                        // on navigue vers la page Admin
                        Page_Admin page_admin = new Page_Admin(this.id_admin);
                        this.NavigationService.Navigate(page_admin);
                    }
                }
            }
        }
        /// <summary>
        /// Méthode reliée au bouton "Créer la recette" permettant d'ajouter une nouvelle recette dans la database
        /// </summary>
        /// <param name="sender">Bouton "Créer la recette"</param>
        /// <param name="e">Evenement Click</param>
        private void Creer_Recette_Click(object sender, RoutedEventArgs e)
        {
            //récupération infos rentrées par l'utilisateur
            string nom_recette_input         = Nom_Recette_Box.Text;
            string type_recette_input        = Type_Recette_Box.Text;
            string prix_recette_input        = Prix_Recette_Box.Text;
            string description_recette_input = Description_Recette_Box.Text;
            List <List <string> > liste_produit_nom_quantite = new List <List <string> >();

            for (int i = 0; i < Produits_ListView.Items.Count; i++)
            {
                Produit produit_observe = Produits_ListView.Items[i] as Produit;

                // si la quantité du produit observé n'est pas nulle, il fait partie de la recette
                if (produit_observe.Quantite != null)
                {
                    List <string> temp = new List <string>();
                    temp.Add(produit_observe.Nom_Produit);
                    temp.Add(produit_observe.Quantite);
                    liste_produit_nom_quantite.Add(temp);
                }
            }

            // sécurité pour les input
            if (nom_recette_input == "" || nom_recette_input.Length > 100)
            {
                Erreur_Message.Content = "Nom doit contenir 1 à 100 caractères";
            }
            else if (type_recette_input == "" || !type_recette_input.All(Char.IsLetter))
            {
                Erreur_Message.Content = "Type invalide";
            }
            else if (prix_recette_input == "" || !int.TryParse(prix_recette_input, out _) || Convert.ToInt32(prix_recette_input) > 40 || Convert.ToInt32(prix_recette_input) < 10)
            {
                Erreur_Message.Content = "Prix doit être entre 10 et 40";
            }
            else if (description_recette_input == "" || description_recette_input.Length > 256)
            {
                Erreur_Message.Content = "Description est limitée à 256 caractères";
            }
            else if (liste_produit_nom_quantite.Count == 0)
            {
                Erreur_Message.Content = "Aucun produit ajouté";
            }
            else
            {
                Erreur_Message.Content = "";

                // query pour insérer la nouvelle recette dans la database avec les input comme valeurs
                string query1 = $"INSERT INTO cooking.recette VALUES (\"{nom_recette_input}\",\"{type_recette_input}\",\"{description_recette_input}\",\"{prix_recette_input}\",2,0,\"{this.id_client}\");";
                string query2 = "";
                string query4 = "";
                for (int i = 0; i < liste_produit_nom_quantite.Count; i++)
                {
                    // query pour insérer un nouveau produit relié à sa recette dans la database avec les input comme valeurs
                    query2 += $"INSERT INTO cooking.composition_recette VALUES (\"{nom_recette_input}\",\"{liste_produit_nom_quantite[i][0]}\",{liste_produit_nom_quantite[i][1]});";

                    // mise à jour des sotck min et max des produits
                    // on a décidé d'augmenter stock min de 1 fois la quantité nécessaire pour cette recette (choix expliqué dans le rapport)
                    // stock max est augmenté de 2 fois la quantité nécessaire pour cette recette
                    string query3 = $"Select Stock_min, Stock_max from cooking.produit where Nom_Produit = \"{liste_produit_nom_quantite[i][0]}\" ;";
                    List <List <string> > Liste_stock_min_max = Commandes_SQL.Select_Requete(query3);

                    int Nv_Stock_min = Convert.ToInt32(Liste_stock_min_max[0][0]) + Convert.ToInt32(liste_produit_nom_quantite[i][1]);
                    int Nv_Stock_max = Convert.ToInt32(Liste_stock_min_max[0][1]) + 2 * Convert.ToInt32(liste_produit_nom_quantite[i][1]);
                    query4 += $"Update cooking.produit set Stock_min = {Nv_Stock_min}, Stock_max = {Nv_Stock_max} where Nom_Produit = \"{liste_produit_nom_quantite[i][0]}\" ;";
                }
                string query = query1 + query2 + query4;                                      // si la recette porte le même nom qu'une recette existante, l'exécution échoue à la query1. Cela empêche l'exécution des query 2 et 4
                string ex    = Commandes_SQL.Insert_Requete(query);
                if (ex == $"Duplicate entry '{nom_recette_input}' for key 'recette.PRIMARY'") // si le nom_recette (clé primaire) existe déjà dans la database.recette
                {
                    Erreur_Message.Content = "Nom déjà utilisé";
                }
                else
                {
                    Page_CdR page_CdR = new Page_CdR(this.id_client);
                    this.NavigationService.Navigate(page_CdR);
                }
            }
        }
        /// <summary>
        /// Initialisaiton de la Page_Top, permettant l'affichage du CdR d'OR, de ses recettes les plus vendues, du CdR de la semaine actuelle
        /// ainsi que les 5 recettes les plus commandées de la semaine actuelle
        /// </summary>
        public Page_Top()
        {
            InitializeComponent();

            //On peut déjà mettre les informations du CdR d'Or

            //On recherche déjà son nom
            //On peut directement chercher dans Composition_Commande vu qu'on va prendre toutes les commandes
            string query = "SELECT Identifiant, sum(compteur) as SUMQT FROM cooking.recette group by Identifiant order by SUMQT desc limit 1;"; //query pour le CdR d'Or
            List <List <string> > Liste_Nom_CdR_Qte_vendue = Commandes_SQL.Select_Requete(query);

            if (Liste_Nom_CdR_Qte_vendue.Count != 0)
            {
                CdR_Or.Content = Liste_Nom_CdR_Qte_vendue[0][0];

                //On cherche ensuite ses recettes les plus vendues

                query = $"SELECT Nom_Recette, Type, Compteur FROM cooking.recette where Identifiant = \"{Liste_Nom_CdR_Qte_vendue[0][0]}\" order by Compteur desc limit 5;";
                List <List <string> > Liste_Recette_Infos = Commandes_SQL.Select_Requete(query);

                //On ajoute ensuite les informations de chaque recette à la ListView dédiée

                for (int i = 0; i < Liste_Recette_Infos.Count; i++)
                {
                    string Nom  = Liste_Recette_Infos[i][0];
                    string Type = Liste_Recette_Infos[i][1];
                    string Qte  = Liste_Recette_Infos[i][2];
                    Liste_Recette_Or.Items.Add(new Recette_Or {
                        Nom = Nom, Type = Type, Compteur = Qte
                    });
                }
            }
            else
            {
                CdR_Or.Content = "Pas de CdR d'Or";
            }



            //CdR Semaine
            int    jour     = (int)DateTime.Today.DayOfWeek; //jour de la semaine
            double decalage = 1 - jour;                      //on veut le decalage à lundi

            System.DateTime datelimite_system = DateTime.Today.AddDays(decalage);
            string          datelimite        = $"{datelimite_system.Year}/{datelimite_system.Month}/{datelimite_system.Day}"; // on a notre date limite
            string          date = $"{DateTime.Now.Year}/{DateTime.Now.Month}/{DateTime.Now.Day}";

            // on veut sélectionner toutes les commandes faites sur cette période
            query = $"select  recette.Identifiant " +
                    $"from (cooking.commande natural join cooking.composition_commande as T)  join cooking.recette " +
                    $"on cooking.recette.Nom_Recette=T.Nom_Recette " +
                    $"where Date between \"{datelimite}\" and \"{date}\" " +
                    $"group by cooking.recette.Identifiant " +
                    $"order by sum(Quantite_Recette) desc " +
                    $"limit 1;";
            List <List <string> > Liste_CdR_Semaine = Commandes_SQL.Select_Requete(query);

            if (Liste_CdR_Semaine.Count != 0)
            {
                CdR_Semaine.Content = Liste_CdR_Semaine[0][0];
            }
            else
            {
                CdR_Semaine.Content = "Pas de CdR Semaine";
            }

            //Top commande Semaine
            query = $"select recette.Nom_Recette, Type, recette.Identifiant, sum(Quantite_Recette), Compteur " +
                    $"from (cooking.commande natural join cooking.composition_commande as T)  join cooking.recette " +
                    $"on cooking.recette.Nom_Recette=T.Nom_Recette " +
                    $"where Date between \"{datelimite}\" and \"{date}\" " +
                    $"group by cooking.recette.Nom_Recette " +
                    $"order by sum(Quantite_Recette) desc " +
                    $"limit 5;";
            List <List <string> > Liste_Recette_Semaine = Commandes_SQL.Select_Requete(query);

            for (int i = 0; i < Liste_Recette_Semaine.Count; i++)
            {
                ListeView_Recette_Semaine.Items.Add(new Recette_Semaine
                {
                    Nom      = Liste_Recette_Semaine[i][0],
                    Type     = Liste_Recette_Semaine[i][1],
                    Createur = Liste_Recette_Semaine[i][2],
                    Volume_Achete_Semaine = Liste_Recette_Semaine[i][3],
                    Compteur = Liste_Recette_Semaine[i][4]
                });
            }
        }