diff --git a/README.md b/README.md index 74126dc..b0c9334 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,45 @@ -# SAE 1.01 - Implémentation d'un besoin client +===================================== +SAÉ 1.01 - Implémentation d'un besoin client +===================================== -__1A - Groupe 7/8:__ -- Rémi LAVERGNE -- Julien ABADIE -- Louis GERMAIN +Par: +Rémi LAVERGNE - Julien ABADIE - Louis GERMAIN +Groupe 7/8 - 1A 2023-2024 + +**Répartition du Travail** +----------------------- + +Rémi LAVERGNE : / +Louis GERMAIN : / +Julien ABADIE : / + +**Composition des fichiers sources** +-------------------------------- + +- *main.c* >> Juste la fonction main, se lançant lors de l'exécution du programme. +- *main.h* >> Tous les prototypes des fonctions réalisées, ainsi que les inclusions de module et déclaration de constantes. + + +- *articles.txt* >> Fichier texte composé de x colonnes, +- *clients.txt* >> Fichier texte composé de x colonnes dans l'ordre qui suit : + identifiant | mot de passe | cagnotte | suspendu (0=actif ; 1=suspendu) | rôle (0=client ; 1=administrateur) + + +**Fonctionnement** +------------ + + + +Jeu de données +============== + +articles.txt +``` +/ +``` + +clients.txt +``` +/ +``` \ No newline at end of file diff --git a/src/clients.txt b/src/clients.txt index 30acd5e..487c6f3 100644 --- a/src/clients.txt +++ b/src/clients.txt @@ -1,2 +1,2 @@ -1313 12.1 0 0 -2010 12.1 0 0 +1313 11 12.1 0 0 +2010 22 12.1 0 0 diff --git a/src/decalage.c b/src/decalage.c new file mode 100644 index 0000000..483a0cd --- /dev/null +++ b/src/decalage.c @@ -0,0 +1,33 @@ +/** + * @file decalage.c + * @brief Fonctions de décalage d'un tableau + * + * Contient les fonctions de décalage de tableau vers la droite (pour l'insertion) + * et vers la gauche (pour la suppression). +*/ + +#include "main.h" + +void decalageADroiteInt(int tab[], int index, int tlog) +{ + for (int i = tlog; i > index; i--) + tab[i] = tab[i-1]; +} + +void decalageAGaucheInt(int tab[], int index, int tlog) +{ + for (int i = index; i < tlog; i++) + tab[i] = tab[i+1]; +} + +void decalageADroiteFloat(float tab[], int index, int tlog) +{ + for (int i = tlog; i > index; i--) + tab[i] = tab[i-1]; +} + +void decalageAGaucheFloat(float tab[], int index, int tlog) +{ + for (int i = index; i < tlog; i++) + tab[i] = tab[i+1]; +} \ No newline at end of file diff --git a/src/display.c b/src/display.c index fb28a71..7925d39 100644 --- a/src/display.c +++ b/src/display.c @@ -1,5 +1,19 @@ +/** + * @file display.c + * @brief Fonctions d'affichage des articles et des clients +*/ + #include "main.h" +/** + * @brief Affichage d'un seul article + * @param tabReference: tableau des références des articles + * @param weight: tableau des poids des articles + * @param volume: tableau des volumes des articles + * @param unitPrice: tableau des prix à l'unité des articles + * @param tlog: taille logique des tableaux des articles + * @return void +*/ void displayItem(int tabReference[], float weight[], float volume[], float unitPrice[], int tlog) { int reference, index, found; @@ -20,21 +34,17 @@ void displayItem(int tabReference[], float weight[], float volume[], float unitP printf("%d\t%f\t%f\t%f", tabReference[index], weight[index], volume[index], unitPrice[index]); } +/** + * @brief Affichage de la liste des articles + * @param tabReference: tableau des références des articles + * @param weight: tableau des poids des articles + * @param volume: tableau des volumes des articles + * @param unitPrice: tableau des prix à l'unité des articles + * @param tlog: taille logique des tableaux des articles + * @return void +*/ void displayItemList(int reference[], float weight[], float volume[], float unitPrice[], int tlog) { - /* - Affichage de la liste des articles, un article par ligne, sous forme: - référence poids volume prix - Avec la référence unique du produit, le poids du produit, le volume du produit et son prix à l'unité. - - +param reference: tableau des références des articles - +param weight: tableau des poids des articles - +param volume: tableau des volumes des articles - +param unitPrice: tableau des prix à l'unité des articles - +param tlog: taille logique des tableaux des articles - - +var i: compteur servant à parcourir les données des tableaux jusqu'à leur taille logique - */ int i; printf("reference\tpoids\tvolume\tprix à l'unité"); for (i=0; i Oui, 0 > Non, -1 > Quitter) */ -int login(int clientID[], int isAdmin[], int tlog) +int login(int clientID[], int clientPassword[], int isAdmin[], int tlog, int *index) { - int id, index, found, tentative=3; + int id, password, found, tentative=3; printf("Entrez votre identifiant: "); scanf("%d%*c", &id); while (id < 0) @@ -17,16 +22,14 @@ int login(int clientID[], int isAdmin[], int tlog) printf("Erreur, l'identifiant doit être positif, entrez votre identifiant: "); scanf("%d%*c", &id); } - index = searchTab(clientID, id, tlog, &found); - printf("%d",found); + *index = searchTab(clientID, id, tlog, &found); while(found == 0) { printf("Erreur, l'identifiant n'existe pas, entrez votre identifiant: "); scanf("%d%*c", &id); if (id == 0) - { return -1; - } + // Nombre de tentatives restantes tentative--; if (tentative == 0) @@ -34,32 +37,61 @@ int login(int clientID[], int isAdmin[], int tlog) printf("Nombre de tentatives dépassé, retour au menu principal.\n"); return -1; } - index = searchTab(clientID, id, tlog, &found); + printf("Il vous reste %d tentatives.\n", tentative); + + *index = searchTab(clientID, id, tlog, &found); } - if (isAdmin[index] == 1) + + printf("Entrez votre mot de passe: "); + scanf("%d%*c", &password); + while (password < 0) + { + printf("Erreur, le mot de passe doit être positif, entrez votre mot de passe: "); + scanf("%d%*c", &password); + } + + if (password == decrypt(clientPassword[*index])) { - return 1; + if (isAdmin[*index] == 1) + { + return 1; + } + else + { + return 0; + } } else { - return 0; + errorHandling(-9); + return -9; } } -int signup(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int *tlog) +/** + * @brief Fonction d'inscription + * @param clientID: Tableau des identifiants client + * @param clientPassword: Tableau des mots de passe client + * @param cagnotte: Tableau des cagnottes client + * @param suspended: Tableau des états de compte client + * @param isAdmin: Tableau des statuts Administrateur des clients + * @param tlog: Taille logique des Tableaux + * @return 0 > Tout s'est bien passé, -1 > L'utilisateur a quitté, -2 > La taille physique du tableau est dépassée +*/ +int signup(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int *tlog) { - int id, index, found; - printf("Entrez votre identifiant: "); + int id, password, index, found; + printf("Entrez votre identifiant ou 0 si vous souhaitez quitter: "); scanf("%d%*c", &id); while (id < 0) { - printf("Erreur, l'identifiant doit être positif, entrez votre identifiant: "); + printf("Erreur, l'identifiant doit être positif, entrez votre identifiant ou 0 si vous souhaitez quitter: "); scanf("%d%*c", &id); } index = searchTab(clientID, id, *tlog, &found); while(found == 1) { - printf("Erreur, l'identifiant existe déjà, entrez votre identifiant: "); + printf("Erreur, l'identifiant existe déjà, entrez votre identifiant ou 0 si vous souhaitez quitter: "); scanf("%d%*c", &id); if (id == 0) { @@ -67,10 +99,16 @@ int signup(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int } index = searchTab(clientID, id, *tlog, &found); } - clientID[*tlog] = id; - cagnotte[*tlog] = 0; - suspended[*tlog] = 0; - isAdmin[*tlog] = 0; - *tlog ++; + + printf("Entrez votre mot de passe: "); + scanf("%d%*c", &password); + while (password < 0) + { + errorHandling(-6); + printf("Erreur, le mot de passe doit être positif, entrez votre mot de passe: "); + scanf("%d%*c", &password); + } + + inputClient(id, password, index, clientID, clientPassword, cagnotte, suspended, isAdmin, tlog); return 0; } \ No newline at end of file diff --git a/src/main.c b/src/main.c index 70d4f03..73224b8 100644 --- a/src/main.c +++ b/src/main.c @@ -1,21 +1,26 @@ +/** + * @file main.c + * @brief Fonctions principales du programme + * + * Contient les fonctions principales du programme, notamment le menu principal. + * La fonction main() se trouve dans ce fichier et est executée au lancement. + * La fonction global() est la fonction principale du programme. +*/ #include "main.h" +/** + * @brief Affichage du menu principal + * @return Choix de l'utilisateur +*/ int displayMenu(void) { - /* - Choix de l'action à réaliser - - +return: choix de l'action - - +var choice: choix de l'action - */ int choice; printf("\nTapez sur Entrée pour continuer..."); //TODO Clear le buffer pour éviter les problèmes if (getchar() == '\n') // getchar() pour récupérer le caractère entré par l'utilisateur { - printf("\e[1;1H\e[2J"); // Clear le terminal + system("clear"); // Clear le terminal } printf("\n=================================\n"); @@ -27,54 +32,45 @@ int displayMenu(void) printf("4. \u274C Quitter\n"); printf("9. \u26A0 Débug\n"); printf("=================================\n"); + printf("\u00A9 2023 - Pascal Inc.\n\n"); printf("Votre choix : "); scanf("%d%*c", &choice); - printf("\e[1;1H\e[2J"); + system("clear"); return choice; } +/** + * @brief Fonction globale du programme + * Crée les variables et les tableaux nécessaires au programme, + * charge les données depuis les fichiers, affiche le menu principal + * et appelle les fonctions nécessaires en fonction du choix de l'utilisateur. +*/ void global(void) { - /* - Fonction global: Exécute les autres fonctions selon les choix de l'utilisateur - - +var tLogArticle: taille logique des tableaux contenant les données des articles - +var tLogClient: taille logique des tableaux contenant les données des clients - +var choice: choix de l'action à réaliser - +var reference: tableau des références des articles - +var clientID: tableau des identifiants des clients - +var suspended: tableau de l'état du compte des clients - +var weight: tableau du poids des articles - +var volume: tableau du volume des articles - +var unitPrice: tableau du prix unitaire des actions - +var cagnotte: tableau des cagnottes des clients - */ // Déclaration des variables - int tLogArticle, tLogClient, choice, status, currentUser; - int reference[tmaxArticles], clientID[tmaxClients], suspended[tmaxClients], isAdmin[tmaxClients]; + int tLogItem, tLogClient, tlogBasket, choice, status, currentUser, index; + int reference[tmaxArticles], clientID[tmaxClients], clientPassword[tmaxClients], suspended[tmaxClients], isAdmin[tmaxClients], basket_tab_ref[tmaxArticles], basket_tab_qte[tmaxArticles]; float weight[tmaxArticles], volume[tmaxArticles], unitPrice[tmaxArticles], cagnotte[tmaxClients]; // Chargement de toute les données - chargeDonnees(&tLogArticle, &tLogClient, reference, weight, volume, unitPrice, clientID, cagnotte, suspended, isAdmin); + chargeDonnees(&tLogItem, &tLogClient, reference, weight, volume, unitPrice, clientID, clientPassword, cagnotte, suspended, isAdmin); // Affichage du menu choice = displayMenu(); - while (choice != 4) + while(choice != 4) { - switch (choice) + switch(choice) { case 1: - status = login(clientID, isAdmin, tLogClient); + status = login(clientID, clientPassword, isAdmin, tLogClient, &index); if(status == 1) { - //TODO > Menu Admin - //adminMenu(); + adminMenu(clientID, clientPassword, cagnotte, suspended, isAdmin, reference, weight, volume, unitPrice, &tLogItem, &tLogClient); } else if(status == 0) { - //TODO > Menu Client - //clientMenu(); + clientMenu(&weight[index], &volume[index], &unitPrice[index], reference, unitPrice, &cagnotte[index], basket_tab_ref, basket_tab_qte, weight, volume, tLogItem, &tlogBasket); } else { @@ -83,16 +79,16 @@ void global(void) } break; case 2: - status = signup(clientID, cagnotte, suspended, isAdmin, &tLogClient); + status = signup(clientID, clientPassword, cagnotte, suspended, isAdmin, &tLogClient); if(status == 0) { - printf("Inscription réussie.\nRetour au menu principal...\n"); - sleep(3); + printf("Inscription réussie, vous pouvez vous connecter.\nRetour au menu principal...\n"); + sleep(2); } else { printf("Inscription échouée.\nRetour au menu principal...\n"); - sleep(3); + sleep(2); } break; case 3: @@ -100,9 +96,10 @@ void global(void) //opposition(); break; case 4: + sauvegardeDonnees(tLogItem, tLogClient, reference, weight, volume, unitPrice, clientID, clientPassword, cagnotte, isAdmin, suspended); return; case 9: - debugMenu(reference, weight, volume, unitPrice, clientID, cagnotte, suspended, isAdmin, tLogArticle, tLogClient); + debugMenu(reference, weight, volume, unitPrice, clientID, cagnotte, suspended, isAdmin, tLogItem, tLogClient); break; default: printf("Erreur, veuillez entrer un choix valide.\n"); @@ -113,6 +110,10 @@ void global(void) } } +/** + * @brief Fonction principale du programme + * @return 0 si tout s'est bien passé et que le programme s'est terminé correctement +*/ int main(void) { global(); diff --git a/src/main.h b/src/main.h index 9d27a05..3cfefa9 100644 --- a/src/main.h +++ b/src/main.h @@ -19,16 +19,22 @@ void debugHandling(int code); void debugMenu(int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int clientID[], float cagnotte[], int suspended[], int isAdmin[], int tlogArticle, int tlogClient); //! TRAITEMENT DES FICHIERS -void chargeDonnees(int *tLogArticle, int *tLogClient,int reference[], float weight[], float volume[], float unitPrice[], int clientID[], float cagnotte[], int suspended[], int isAdmin[]); +void chargeDonnees(int *tLogArticle, int *tLogClient,int reference[], float weight[], float volume[], float unitPrice[], int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[]); int chargeArticles(int reference[], float weight[], float volume[], float unitPrice[]); -int chargeClients(int clientID[], float cagnotte[], int suspended[], int isAdmin[]); +int chargeClients(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[]); -void sauvegardeDonnees(int tLogArticle, int tLogClient, int reference[], float weight[], float volume[], float unitPrice[], int clientID[], float cagnotte[], int isAdmin[], int suspended[]); +void sauvegardeDonnees(int tLogArticle, int tLogClient, int reference[], float weight[], float volume[], float unitPrice[], int clientID[], int clientPassword[], float cagnotte[], int isAdmin[], int suspended[]); void sauvegardeArticles(int reference[], float weight[], float volume[], float unitPrice[], int tLogArticle); -void sauvegardeClients(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int tLogClient); +void sauvegardeClients(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int tLogClient); + +//! DECALAGES TABLEAUX +void decalageADroiteInt(int tab[], int index, int tlog); +void decalageAGaucheInt(int tab[], int index, int tlog); +void decalageADroiteFloat(float tab[], int index, int tlog); +void decalageAGaucheFloat(float tab[], int index, int tlog); //! GESTION CLIENTS -int inputClient(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int *tlog); +void inputClient(int id, int passwd, int index, int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int *tlog); void modifyClient(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int tlog); void deleteClient(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int *tlog); @@ -48,11 +54,19 @@ int searchTab(int targetTab[], int valSearched, int tLog, int *found); //! PANIER void clientConstraint(float *weight, float *volume, float *price); int constraintExceeded(float weightConstraint, float volumeConstraint, float *priceConstraint, float *cagnotte, float tabWeight[], float tabVolume[], float tabPrice[], int tabItemRef[], int tabBasketRef[], int tabBasketQuantity[], int tlogItem, int tlogBasket); -int basket_add (int tab_reference[], float weight[], float volume[], float unitPrice[], float *cagnotte, int basket_tab_ref[], int basket_tab_qte[],int tlog, int tlog_basket); -void display_basket(int basket_tab_ref[], int basket_qte[], float weight[], float volume[], float unitPrice[], float *cagnotte, int tlog, int tlog_basket); -int reinit_basket(int tlog_basket); -int basket_del_article( int basket_tab_ref[], int basket_tab_qte[], int tlog_basket); +void basket_add(int tab_reference[], float unitPrice[], float *cagnotte, int basket_tab_ref[], int basket_tab_qte[], int tlogItem, int *tlog_basket); +void display_basket(int basket_tab_ref[], int tabItemRef[], int basket_qte[], float tabWeight[], float tabVolume[], float cagnotte, float tabUnitPrice[], int tlogItem, int tlog_basket); +void reinit_basket(int *tlog_basket); +void basket_del_article(int basket_tab_ref[], int basket_tab_qte[], int *tlog_basket); //! LOGIN -int login(int clientID[], int isAdmin[], int tlog); -int signup(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int *tlog); \ No newline at end of file +int login(int clientID[], int clientPassword[], int isAdmin[], int tlog, int *index); +int signup(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int *tlog); + +//! MOT DE PASSE +int encrypt(int password); +int decrypt(int password); + +//! MENUS +void adminMenu(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int *tlogItem, int *tlogClient); +void clientMenu(float *weight, float *volume, float *price, int tabItemRef[], float unitPrice[], float *cagnotte, int basket_tab_ref[], int basket_tab_qte[], float tabWeight[], float tabVolume[], int tlogItem, int *tlogBasket); \ No newline at end of file diff --git a/src/menu.c b/src/menu.c new file mode 100644 index 0000000..c37aeb3 --- /dev/null +++ b/src/menu.c @@ -0,0 +1,111 @@ +/** + * @file menu.c + * @brief Menu client et administrateur +*/ + +#include "main.h" + +void clientMenu(float *weight, float *volume, float *price, int tabItemRef[], float unitPrice[], float *cagnotte, int basket_tab_ref[], int basket_tab_qte[], float tabWeight[], float tabVolume[], int tlogItem, int *tlogBasket) +{ + int choice = 0, constraint; + while (choice != 6) + { + printf("\n=================================\n"); + printf(" Menu Client\n"); + printf("=================================\n"); + printf("1\u2022 Entrer ses contraintes\n"); + printf("2\u2022 Ajouter un article au panier\n"); + printf("3\u2022 Afficher le panier\n"); + printf("4\u2022 Réinitialiser le panier\n"); + printf("5\u2022 Retirer un article du panier\n"); + printf("6\u2022 Quitter\n"); + printf("=================================\n"); + printf("Votre choix: "); + scanf("%d", &choice); + switch (choice) + { + case 1: + clientConstraint(weight, volume, price); + break; + case 2: + basket_add(tabItemRef, unitPrice, cagnotte, basket_tab_ref, basket_tab_qte, tlogItem, tlogBasket); + constraint = constraintExceeded(*weight, *volume, price, cagnotte, tabWeight, tabVolume, unitPrice, tabItemRef, basket_tab_ref, basket_tab_qte, tlogItem, *tlogBasket); + if (constraint == -1) + basket_del_article(basket_tab_ref, basket_tab_qte, tlogBasket); + break; + case 3: + display_basket(basket_tab_ref, tabItemRef, basket_tab_qte, tabWeight, tabVolume, *cagnotte, unitPrice, tlogItem, *tlogBasket); + break; + case 4: + reinit_basket(tlogBasket); + break; + case 5: + basket_del_article(basket_tab_ref, basket_tab_qte, tlogBasket); + break; + case 6: + return; + default: + printf("Erreur, veuillez entrer un choix valide.\n"); + break; + } + } +} + +void adminMenu(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int *tlogItem, int *tlogClient) +{ + int choice = 0; + while (choice != 10) + { + printf("\n=================================\n"); + printf(" Menu Client\n"); + printf("=================================\n"); + printf("1\u2022 Ajouter un client\n"); + printf("2\u2022 Modifier les données d'un client\n"); + printf("3\u2022 Supprimer un client\n"); + printf("4\u2022 Ajouter un article\n"); + printf("5\u2022 Supprimer un article\n"); + printf("6\u2022 Afficher les données d'un article\n"); + printf("7\u2022 Afficher la liste des articles\n"); + printf("8\u2022 Afficher les données d'un client\n"); + printf("9\u2022 Afficher la liste des clients\n"); + printf("10\u2022 Quitter\n"); + printf("=================================\n"); + printf("Votre choix: "); + scanf("%d", &choice); + switch (choice) + { + case 1: + signup(clientID, clientPassword, cagnotte, suspended, isAdmin, tlogClient); + break; + case 2: + modifyClient(clientID, cagnotte, suspended, isAdmin, *tlogClient); + break; + case 3: + deleteClient(clientID, cagnotte, suspended, isAdmin, tlogClient); + break; + case 4: + inputItem(tabReference, tabWeight, tabVolume, unitPrice, tlogItem); + break; + case 5: + deleteItem(tabReference, tabWeight, tabVolume, unitPrice, tlogItem); + break; + case 6: + displayItem(tabReference, tabWeight, tabVolume, unitPrice, *tlogItem); + break; + case 7: + displayItemList(tabReference, tabWeight, tabVolume, unitPrice, *tlogItem); + break; + case 8: + displayClient(clientID, cagnotte, suspended, isAdmin, *tlogClient); + break; + case 9: + displayClientList(clientID, cagnotte, suspended, isAdmin, *tlogClient); + break; + case 10: + return; + default: + printf("Erreur, veuillez entrer un choix valide.\n"); + break; + } + } +} \ No newline at end of file diff --git a/src/modif.c b/src/modif.c index 78f59d3..c442074 100644 --- a/src/modif.c +++ b/src/modif.c @@ -1,70 +1,58 @@ +/** + * @file modif.c + * @brief Fonctions de modification des données (ajout, suppression, modification) +*/ + #include "main.h" /** - * @brief Fonction d'inserion d'un client - * @param clientID: Tableau des identifiants client - * @param cagnotte: Tableau des cagnottes client - * @param suspended: Tableau des états de compte client - * @param isAdmin: Tableau des statuts Administrateur des clients - * @param tlog: Taille logique de ces tableaux - * @return 0 > Tout s'est bien passé, -1 > L'utilisateur a quitté, -2 > La taille physique du tableau est dépassée + * @brief Ajout d'un client dans les tableaux + * @param id: Tableau des identifiants des clients + * @param passwd: Tableau des mots de passe des clients + * @param index: Index du client à ajouter + * @param clientID: Tableau des identifiants des clients + * @param clientPassword: Tableau des mots de passe des clients + * @param cagnotte: Tableau des cagnottes des clients + * @param suspended: Tableau de l'état du compte des clients + * @param isAdmin: Tableau de l'état d'administrateur des clients + * @param tlog: Taille logique des tableaux + * @return 0 si tout s'est bien passé, -2 si la taille physique du tableau est dépassée */ -int inputClient(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int *tlog) +void inputClient(int id, int passwd, int index, int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int *tlog) { - int index, found, id = -1; - float cagnotteClient; - // Vérification du dépassement de la taille physique du tableau if (*tlog == tmaxClients) { printf("[ERREUR] - La taille physique du tableau est dépassée, impossible d'ajouter un nouveau client.\n"); - return -2; + return; } + + // Décalage + decalageADroiteInt(clientID, index, *tlog); + decalageADroiteFloat(cagnotte, index, *tlog); + decalageADroiteInt(suspended, index, *tlog); + decalageADroiteInt(isAdmin, index, *tlog); - while(id != 0) - { - printf("Entrez l'identifiant du client ou 0 si vous souhaitez arrêter la saisie: "); - scanf("%d%*c", &id); - while(id < 0) - { - printf("[ERREUR] - L'identifiant doit être positif, entrez l'identifiant du client ou 0 si vous souhaitez arrêter la saisie: "); - scanf("%d%*c", &id); - } - index = searchTab(clientID, id, *tlog, &found); - while(found == 1) - { - printf("Cet identifiant existe déjà, réessayer ou tapez 0 si vous souhaitez arrêter la saisie: "); - scanf("%d%*c", &id); - index = searchTab(clientID, id, *tlog, &found); - } - if(id != 0) - { - clientID[index] = id; - cagnotte[index] = 0; - suspended[index] = 0; - isAdmin[index] = 0; - *tlog++; - return 0; // Tout s'est bien passé - } - } - return -1; // L'utilisateur a quitté + clientID[index] = id; + clientPassword[index] = encrypt(passwd); + cagnotte[index] = 0; + suspended[index] = 0; + isAdmin[index] = 0; + + *tlog++; } +/** + * @brief Modification des données d'un client + * @param clientID: Tableau des identifiants des clients + * @param cagnotte: Tableau des cagnottes des clients + * @param suspended: Tableau de l'état du compte des clients + * @param isAdmin: Tableau de l'état d'administrateur des clients + * @param tlog: Taille logique des tableaux + * @return void +*/ void modifyClient(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int tlog) { - /* - Modification des données d'un client dans les tableaux - - +param clientID: tableau des identifiants des clients - +param cagnotte: tableau des cagnottes des clients - +param suspended: tableau de l'état du compte des clients - +param tlog: taille logique des tableaux des clients - - +var numClient: identifiant du client à modifier - +var index: index de l'article recherché dans le tableau pour le modifier - +var montant: montant à ajouter à la cagnotte - +var modif: modification à exécuter sur le client - */ int index, numClient, found; float montant; char modif; @@ -107,22 +95,18 @@ void modifyClient(int clientID[], float cagnotte[], int suspended[], int isAdmin isAdmin[index] = 0; } +/** + * @brief Ajout d'un ou plusieurs articles dans les tableaux d'articles (reference, poids, volume et prix) + * @param tabReference: tableau des références des articles + * @param weight: tableau des poids des articles + * @param volume: tableau des volumes des articles + * @param unitPrice: tableau des prix à l'unité des articles + * @param tlog: taille logique des tableaux des articles + * @return void + * @warning La saisie s'arrête lorsque l'utilisateur entre 0 +*/ void inputItem(int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int *tlog) { - /* - Ajout d'un ou plusieurs articles dans les tableaux d'articles (reference, poids, volume et prix) - - +param tabReference: tableau des références des articles - +param weight: tableau des poids des articles - +param volume: tableau des volumes des articles - +param unitPrice: tableau des prix à l'unité des articles - +param tlog: taille logique des tableaux des articles - - +var reference: reference de l'article à ajouter - +var weight: poids de l'article à ajouter - +var volume: volume de l'article à ajoueter - +var price: prix de l'article à ajouter - */ int reference = -1; float weight, volume, price; while (reference != 0) @@ -167,6 +151,16 @@ void inputItem(int tabReference[], float tabWeight[], float tabVolume[], float u } } +/** + * @brief Suppression d'un ou plusieurs articles dans les tableaux d'articles (reference, poids, volume et prix) + * @param tabReference: tableau des références des articles + * @param weight: tableau des poids des articles + * @param volume: tableau des volumes des articles + * @param unitPrice: tableau des prix à l'unité des articles + * @param tlog: taille logique des tableaux des articles + * @return void + * @warning La saisie s'arrête lorsque l'utilisateur entre 0 +*/ void deleteItem(int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int *tlog) { int reference = -1, index, i, found; @@ -197,6 +191,18 @@ void deleteItem(int tabReference[], float tabWeight[], float tabVolume[], float } } +/** + * @brief Suppression d'un ou plusieurs clients dans les tableaux des clients (clientID, clientPassword, cagnotte, suspended et isAdmin) + * @param clientID: tableau des identifiants des clients + * @param cagnotte: tableau des cagnottes des clients + * @param suspended: tableau de l'état du compte des clients + * @param isAdmin: tableau de l'état d'administrateur des clients + * @param tlog: taille logique des tableaux des clients + * @return void + * @warning La saisie s'arrête lorsque l'utilisateur entre 0 +*/ +//! Ajouter la suppression de la colonne mot de passe. +//! Utiliser la fonction décalaageAGauche void deleteClient(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int *tlog) { int numClient = -1, index, i, found; diff --git a/src/panier.c b/src/panier.c index 487200a..74982b5 100644 --- a/src/panier.c +++ b/src/panier.c @@ -1,10 +1,13 @@ +/** + * @file panier.c + * @brief Fonctions de gestion du panier client et des contraintes +*/ + #include "main.h" void clientConstraint(float *weight, float *volume, float *price) { - /* - Saisie des contraintes du client. - */ + // Saisie des contraintes du client. printf("Entrez la charge maximale de votre véhicule en kilogrammes: "); scanf("%f", weight); while (*weight < 0) @@ -30,29 +33,6 @@ void clientConstraint(float *weight, float *volume, float *price) } } - -// TODO réécrire cette documentation -/** - * The function checks if the weight, volume, and price constraints are exceeded based on the items in - * the basket and the given constraints. - * - * @param weightConstraint The maximum weight constraint for the vehicle. - * @param volumeConstraint The volume constraint is the maximum volume that the vehicle can hold. - * @param priceConstraint A pointer to a float variable representing the maximum budget constraint. - * @param cagnotte A pointer to a float variable representing the amount of money in the user's - * account. - * @param tabWeight An array containing the weights of each item in the log. - * @param tabVolume tabVolume is an array that stores the volume of each item in the shopping basket. - * @param tabPrice tabPrice is an array that stores the prices of items in a shopping basket. - * @param tabItemRef An array containing the reference numbers of the items in the inventory. - * @param tabBasketRef tabBasketRef is an array that contains the references of the items in the - * basket. - * @param tabBasketQuantity An array that stores the quantity of each item in the basket. - * @param tlogItem The parameter "tlogItem" represents the number of items in the log. - * @param tlogBasket The parameter "tlogBasket" represents the number of items in the shopping basket. - * @return an integer value. If the constraints for weight, volume, or price are exceeded, the function - * returns -1. Otherwise, it returns 0. - */ int constraintExceeded(float weightConstraint, float volumeConstraint, float *priceConstraint, float *cagnotte, float tabWeight[], float tabVolume[], float tabPrice[], int tabItemRef[], int tabBasketRef[], int tabBasketQuantity[], int tlogItem, int tlogBasket) { int index, found, i; @@ -123,18 +103,18 @@ int constraintExceeded(float weightConstraint, float volumeConstraint, float *pr * @param tlog_basket: taille logique du panier * @return taille logique du panier */ -int basket_add (int tab_reference[], float weight[], float volume[], float unitPrice[], float *cagnotte, int basket_tab_ref[], int basket_tab_qte[],int tlog, int tlog_basket) +void basket_add(int tab_reference[], float unitPrice[], float *cagnotte, int basket_tab_ref[], int basket_tab_qte[], int tlogItem, int *tlog_basket) { - int ref_to_add, qte_to_add, trouve, index_ajout, i; - float total_weight[tlog_basket], total_volume[tlog_basket], total_price[tlog_basket], total_cagnotte[tlog_basket]; + int ref_to_add, qte_to_add, trouve, index_ajout; + float total_weight[tmaxArticles], total_volume[tmaxArticles], total_price[tmaxArticles], total_cagnotte[tmaxArticles]; printf("Quelle référence souhaitez-vous ajouter au panier?"); scanf("%d", &ref_to_add); - index_ajout = searchTab(tab_reference, ref_to_add, tlog, &trouve); + index_ajout = searchTab(tab_reference, ref_to_add, tlogItem, &trouve); while (trouve == 0) { printf("L'élément que vous souhaitez ajouter n'existe pas, ressayez s'il vous plaît"); scanf("%d", &ref_to_add); - index_ajout = searchTab(tab_reference, ref_to_add, tlog, &trouve); + index_ajout = searchTab(tab_reference, ref_to_add, tlogItem, &trouve); } basket_tab_ref[index_ajout] = ref_to_add; printf("Quelle quantité de cet article souhaitez-vous ajouter au panier?"); @@ -145,20 +125,9 @@ int basket_add (int tab_reference[], float weight[], float volume[], float unitP scanf("%d", &qte_to_add); } basket_tab_qte[index_ajout] = ref_to_add; - - - index_ajout = basket_tab_ref[i]; - - total_weight[i] += weight[index_ajout]*qte_to_add; - total_volume[i] += volume[index_ajout]*qte_to_add; - total_price[i] += unitPrice[index_ajout]*qte_to_add; - *cagnotte = *cagnotte + *cagnotte*0.10; - tlog_basket = tlog_basket+1; - - display_basket( basket_tab_ref, basket_tab_qte, weight, volume, unitPrice, *cagnotte, tlog, tlog_basket); - // si jamais, mettre le display basket ailleurs - return tlog_basket; + *cagnotte += (unitPrice[index_ajout]*qte_to_add) *0.1; + *tlog_basket += 1; } /** @@ -166,9 +135,9 @@ int basket_add (int tab_reference[], float weight[], float volume[], float unitP * @param tlog_basket: taille logique du panier * @return taille logique du panier */ -int reinit_basket(int tlog_basket) +void reinit_basket(int *tlog_basket) { - tlog_basket=0; + *tlog_basket=0; // En mettant tlog_basket à 0, // on fait comme si la taille logique était à 0, faisant que l'on ne considère plus aucun élément des tableaux, //et donc qu'il est désormais vide. @@ -182,18 +151,18 @@ int reinit_basket(int tlog_basket) * @param tlog_basket: taille logique du panier * @return taille logique du panier */ -int basket_del_article( int basket_tab_ref[], int basket_tab_qte[], int tlog_basket) +void basket_del_article(int basket_tab_ref[], int basket_tab_qte[], int *tlog_basket) { int ref_to_del, trouve, index_to_del, qte_to_del, i; printf("Quelle référence voulez vous supprimer de votre panier?\n"); scanf("%d",&ref_to_del); - index_to_del = searchTab(basket_tab_ref, ref_to_del, tlog_basket, &trouve); + index_to_del = searchTab(basket_tab_ref, ref_to_del, *tlog_basket, &trouve); while (trouve == 0) { printf("Erreur, la valeur que vous voulez supprimer n'existe pas, réssayez"); scanf("%d",&ref_to_del); - index_to_del = searchTab(basket_tab_ref, ref_to_del, tlog_basket, &trouve); + index_to_del = searchTab(basket_tab_ref, ref_to_del, *tlog_basket, &trouve); } if (basket_tab_qte[index_to_del]>1) { @@ -214,16 +183,15 @@ int basket_del_article( int basket_tab_ref[], int basket_tab_qte[], int tlog_bas if (qte_to_delindex_to_del; i--) + for (i=*tlog_basket; i>index_to_del; i--) { basket_tab_ref[i]=basket_tab_ref[i+1]; basket_tab_qte[i]=basket_tab_qte[i+1]; } - return tlog_basket-1; + *tlog_basket -= 1; } } diff --git a/src/passwd.c b/src/passwd.c new file mode 100644 index 0000000..d4ac35e --- /dev/null +++ b/src/passwd.c @@ -0,0 +1,28 @@ +/** + * @file passwd.c + * @brief Gestion des mots de passe +*/ + +#include "main.h" + +/** + * @brief Encryption d'un mot de passe avec la méthode de César + * @param password: Mot de passe à encrypter + * @return int: Mot de passe encrypté +*/ +int encrypt(int password) +{ + password = password; + return password; +} + +/** + * @brief Décryption d'un mot de passe + * @param password: Mot de passe à décrypter + * @return int: Mot de passe décrypté +*/ +int decrypt(int password) +{ + password = password; + return password; +} \ No newline at end of file diff --git a/src/traitement.c b/src/traitement.c index 9dbe827..7670ed0 100644 --- a/src/traitement.c +++ b/src/traitement.c @@ -5,50 +5,42 @@ #include "main.h" -void chargeDonnees(int *tLogArticle, int *tLogClient,int reference[], float weight[], float volume[], float unitPrice[], int clientID[], float cagnotte[], int suspended[], int isAdmin[]) +/** + * @brief Chargement des données depuis les 2 fichiers vers les tableaux + * @param tLogArticle: Taille logique du tableau des articles + * @param tLogClient: Taille logique du tableau des clients + * @param reference: Tableau des références des articles + * @param weight: Tableau des poids des articles + * @param volume: Tableau des volumes des articles + * @param unitPrice: Tableau des prix à l'unité des articles + * @param clientID: Tableau des identifiants des clients + * @param clientPassword: Tableau des mots de passe des clients + * @param cagnotte: Tableau des cagnottes des clients + * @param suspended: Tableau de l'état du compte des clients + * @param isAdmin: Tableau de l'état d'administrateur des clients + * @return void +*/ +void chargeDonnees(int *tLogArticle, int *tLogClient,int reference[], float weight[], float volume[], float unitPrice[], int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[]) { - /* - Chargement des données des articles et clients de fichiers vers des tableaux - - +param tLogArticle: taille logique des tableaux des articles - +param tLogClient: taille logique des tableaux des clients - +param reference: tableau des références des articles - +param weight: tableau des poids des articles - +param volume: tableau des volumes des articles - +param unitPrice: tableau des prix à l'unité des articles - +param clientID: tableau des identifiants des clients - +param cagnotte: tableau des cagnottes des clients - +param suspended: tableau de l'état du compte des clients - */ *tLogArticle = chargeArticles(reference, weight, volume, unitPrice); - *tLogClient = chargeClients(clientID, cagnotte, suspended, isAdmin); + *tLogClient = chargeClients(clientID, clientPassword, cagnotte, suspended, isAdmin); } +/** + * @brief Chargement des données du fichier des articles vers les tableaux + * @param reference: Tableau des références des articles + * @param weight: Tableau des poids des articles + * @param volume: Tableau des volumes des articles + * @param unitPrice: Tableau des prix à l'unité des articles + * @return Taille logique des tableaux d'articles +*/ int chargeArticles(int reference[], float weight[], float volume[], float unitPrice[]) { - /* - Chargement des données des articles d'un fichier vers des tableaux - - +param reference: tableau des références des articles - +param weight: tableau des poids des articles - +param volume: tableau des volumes des articles - +param unitPrice: tableau des prix à l'unité des articles - - +return: taille logique des tableaux - - +var article: fichier 'articles.txt' ouvert en lecture - +var ref: reference de l'article - +var tL: taille logique des tableaux - +var w: poids de l'article - +var v: volume de l'article - +var up: prix de l'article à l'unité - */ FILE *article; article = fopen("articles.txt","r"); if(article==NULL) { - printf("ERREUR: Echec de l'ouverture en lecture de 'articles.txt'.\n"); - exit(1); + errorHandling(-4); } int ref, tL=0; @@ -59,7 +51,7 @@ int chargeArticles(int reference[], float weight[], float volume[], float unitPr { if(tL == tmaxArticles) { - printf("Tableau trop petit.\n"); + errorHandling(-3); return tL; } @@ -77,96 +69,88 @@ int chargeArticles(int reference[], float weight[], float volume[], float unitPr return tL; } -int chargeClients(int clientID[], float cagnotte[], int suspended[], int isAdmin[]) +/** + * @brief Chargement des données du fichier des clients vers les tableaux + * @param clientID: Tableau des identifiants des clients + * @param clientPassword: Tableau des mots de passe des clients + * @param cagnotte: Tableau des cagnottes des clients + * @param suspended: Tableau de l'état du compte des clients + * @param isAdmin: Tableau de l'état d'administrateur des clients + * @return Taille logique des tableaux des clients +*/ +int chargeClients(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[]) { - /* - Chargement des données des clients d'un fichier vers des tableaux - - +param clientID: tableau des identifiants des clients - +param cagnotte: tableau des cagnottes des clients - +param suspended: tableau de l'état du compte des clients - - +return: taille logique des tableaux - - +var client: fichier 'clients.txt' ouvert en lecture - +var id: identifiant du client - +var sus: état du compte du client - +var tL: taille logique des tableaux - +var cag: montant de la cagnotte du client - */ FILE *client; client = fopen("clients.txt","r"); if(client==NULL) { - printf("ERREUR: Echec de l'ouverture en lecture de 'clients.txt'.\n"); - exit(1); + errorHandling(-4); } - int id, sus, tL=0, adm; + int id, passwd, sus, tL=0, adm; float cag; - fscanf(client, "%d %f %d %d", &id, &cag, &sus, &adm); + fscanf(client, "%d %d %f %d %d", &id, &passwd, &cag, &sus, &adm); while(!feof(client)) { if(tL == tmaxArticles) { - printf("Tableau trop petit.\n"); + errorHandling(-3); return tL; } clientID[tL] = id; + clientPassword[tL] = passwd; cagnotte[tL] = cag; suspended[tL] = sus; isAdmin[tL] = adm; tL++; - fscanf(client, "%d %f %d", &id, &cag, &sus, &adm); + fscanf(client, "%d %d %f %d %d", &id, &passwd, &cag, &sus, &adm); } fclose(client); return tL; } -void sauvegardeDonnees(int tLogArticle, int tLogClient, int reference[], float weight[], float volume[], float unitPrice[], int clientID[], float cagnotte[], int suspended[], int isAdmin[]) +/** + * @brief Sauvegarde des données des tableaux vers les 2 fichiers correspondants + * @param tLogArticle: Taille logique du tableau des articles + * @param tLogClient: Taille logique du tableau des clients + * @param reference: Tableau des références des articles + * @param weight: Tableau des poids des articles + * @param volume: Tableau des volumes des articles + * @param unitPrice: Tableau des prix à l'unité des articles + * @param clientID: Tableau des identifiants des clients + * @param clientPassword: Tableau des mots de passe des clients + * @param cagnotte: Tableau des cagnottes des clients + * @param suspended: Tableau de l'état du compte des clients + * @param isAdmin: Tableau de l'état d'administrateur des clients + * @return void +*/ +void sauvegardeDonnees(int tLogArticle, int tLogClient, int reference[], float weight[], float volume[], float unitPrice[], int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[]) { - /* - Sauvegarde des données des articles et clients de tableaux vers des fichiers - - +param tLogArticle: taille logique des tableaux des articles - +param tLogClient: taille logique des tableaux des clients - +param reference: tableau des références des articles - +param weight: tableau des poids des articles - +param volume: tableau des volumes des articles - +param unitPrice: tableau des prix à l'unité des articles - +param clientID: tableau des identifiants des clients - +param cagnotte: tableau des cagnottes des clients - +param suspended: tableau de l'état du compte des clients - */ sauvegardeArticles(reference, weight, volume, unitPrice, tLogArticle); - sauvegardeClients(clientID, cagnotte, suspended, isAdmin, tLogClient); + sauvegardeClients(clientID, clientPassword, cagnotte, suspended, isAdmin, tLogClient); } +/** + * @brief Sauvegarde des données des articles de tableaux vers le fichier des articles + * @param reference: Tableau des références des articles + * @param weight: Tableau des poids des articles + * @param volume: Tableau des volumes des articles + * @param unitPrice: Tableau des prix à l'unité des articles + * @param tLogArticle: Taille logique des tableaux des articles + * @return void +*/ void sauvegardeArticles(int reference[], float weight[], float volume[], float unitPrice[], int tLogArticle) { - /* - Sauvegarde des données des articles de tableaux vers le fichier des articles - - +param reference: tableau des références des articles - +param weight: tableau des poids des articles - +param volume: tableau des volumes des articles - +param unitPrice: tableau des prix à l'unité des articles - +param tLogArticle: taille logique des tableaux des articles - - +var article: fichier 'articles.txt' ouvert en écriture - +var i: compteur permettant de parcourir les tableaux - */ FILE *article; article = fopen("articles.txt","w"); if(article==NULL) { - printf("ERREUR: Echec de l'ouverture en écriture de 'articles.txt'.\n"); - exit(1); + errorHandling(-5); } int i; @@ -178,31 +162,29 @@ void sauvegardeArticles(int reference[], float weight[], float volume[], float u fclose(article); } -void sauvegardeClients(int clientID[], float cagnotte[], int suspended[], int isAdmin[], int tLogClient) +/** + * @brief Sauvegarde des données des clients de tableaux vers le fichier des clients + * @param clientID: Tableau des identifiants des clients + * @param clientPassword: Tableau des mots de passe des clients + * @param cagnotte: Tableau des cagnottes des clients + * @param suspended: Tableau de l'état du compte des clients + * @param isAdmin: Tableau de l'état d'administrateur des clients + * @param tLogClient: Taille logique des tableaux des clients + * @return void +*/ +void sauvegardeClients(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int tLogClient) { - /* - Sauvegarde des données des articles de tableaux vers le fichier des articles - - +param clientID: tableau des identifiants des clients - +param cagnotte: tableau des cagnottes des clients - +param suspended: tableau de l'état du compte des clients - +param tLogClient: taille logique des tableaux des clients - - +var client: fichier 'clients.txt' ouvert en lecture - +var i: compteur permettant de parcourir les tableaux - */ FILE *client; client = fopen("clients.txt","w"); if(client==NULL) { - printf("ERREUR: Echec de l'ouverture en écriture de 'clients.txt'.\n"); - exit(1); + errorHandling(-5); } int i; for(i=0; i