Compare commits

...

23 Commits
doc ... master

Author SHA1 Message Date
Rémi LAVERGNE e5fb512a35
FINAL
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE ceb9687010 Modif clients
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE f66979b697 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE e20530133e Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE f3c4f7377d Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE a82fdb4440 Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE 2264ead476 correction pointeur basket del
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE e5af19195d Merge branch 'master' of https://codefirst.iut.uca.fr/git/remi.lavergne/SAE1.01-Algorithmique
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE 7d7a69d06e correction tmax dans basket add
2 years ago
Rémi LAVERGNE 4fd98f2e4a Vidage du buffer dans tout les scanf par sécurité
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE a015a1936d Mise à jour
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE 720f8fdce0 Merge branch 'master' of https://codefirst.iut.uca.fr/git/remi.lavergne/SAE1.01-Algorithmique
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE 5d7ca408f9 correction du décalage pour basket add et delete
2 years ago
Rémi LAVERGNE bc60c29f50 Mise à jour
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE e423594cbb Ajout de la fonction d'opposition
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE 7acae0bc42 ajout de TOUTE la doc qui n'existait pas
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE 357442c950 ajout de doc pour bcp de fonctions
continuous-integration/drone/push Build is passing Details
2 years ago
Louis GERMAIN 53c55ac67b fix d'une petite erreur
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE ea6dc04acb Mise à jour de 'README.md'
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE 8c7436cc46 AJout du lien vers la documentation
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE c9d3ac91ce Mise à jour de '.drone.yml'
continuous-integration/drone/push Build is passing Details
2 years ago
Julien ABADIE b4b33be57f correction de basket reinit
continuous-integration/drone/push Build is passing Details
2 years ago
Rémi LAVERGNE d81ec53baf Merge pull request 'doc' (#33) from doc into master
continuous-integration/drone/push Build is passing Details
2 years ago

@ -15,7 +15,7 @@ steps:
image: hub.codefirst.iut.uca.fr/maxime.batista/codefirst-docdeployer:latest
failure: ignore
commands:
- /entrypoint.sh -l /doc -t doxygen
- /entrypoint.sh -l doc -t doxygen
when:
branch:
- master

@ -1,45 +1,171 @@
=====================================
SAÉ 1.01 - Implémentation d'un besoin client
=====================================
=================================
Par:
Rémi LAVERGNE - Julien ABADIE - Louis GERMAIN
Groupe 7/8 - 1A 2023-2024
<br>
**Répartition du Travail**
-----------------------
Rémi LAVERGNE : /
Louis GERMAIN : /
Julien ABADIE : /
**Rémi LAVERGNE :** Fonctions de traitement des fichiers (tris, chargement, sauvegarde), traitement des erreurs, connexion/inscription & fonction globale.<br>
**Louis GERMAIN :** Fonctions de vérification des contraintes, ajout/modification/suppression des clients/articles, menus annexes (client,admin), fonction globale.<br>
**Julien ABADIE :** Fonctions d'affichage (clients,articles,panier), gestion du panier et définition des contraintes, fonction globale.
<br><br>
Documentation réalisée par chacun.
<br>
**Documentation (Doxygen)**
-------------------------
📚 La documentation est générée et hebergée sur [**> CodeDoc <**](https://codefirst.iut.uca.fr/documentation/remi.lavergne/SAE1.01-Algorithmique/doxygen/) .
<br>
**Composition des fichiers sources**
--------------------------------
- *main.c* >> Juste la fonction main, se lançant lors de l'exécution du programme.
Pour les autres fichiers, voir la Documentation.<br>
- *main.c* >> Juste la fonction main, se lançant lors de l'exécution du programme. Avec elle, le menu principal et la fonction globale, coeur du programme.
- *main.h* >> Tous les prototypes des fonctions réalisées, ainsi que les inclusions de module et déclaration de constantes.
<br>
- *articles.txt* >> Fichier texte composé de x colonnes,
- *clients.txt* >> Fichier texte composé de x colonnes dans l'ordre qui suit :
- *articles.txt* >> Fichier texte composé de 4 colonnes : référence | poids | volume | prix unitaire
- *clients.txt* >> Fichier texte composé de 5 colonnes dans l'ordre qui suit :
identifiant | mot de passe | cagnotte | suspendu (0=actif ; 1=suspendu) | rôle (0=client ; 1=administrateur)
<br>
**Fonctionnement**
------------
Lors de l'exécution du programme, le menu principal s'affiche. Il est composé de 4 choix : connexion, inscription, opposition et quitter.
Le choix 1 permet de se connecter, le choix 2 de s'inscrire, le choix 3 de récupérer l'accès à sa carte suspendue et le choix 4 de quitter le programme.
- Si l'utilisateur se connecte, il est redirigé vers le menu client ou administrateur selon son rôle.
- Si l'utilisateur s'inscrit, il est redirigé vers le menu principal.
- Si l'utilisateur récupère l'accès à sa carte suspendue, il est redirigé vers le menu principal.
- Si l'utilisateur quitte le programme, il est déconnecté et le programme se ferme après la sauvegarde des données.
<br>
Jeu de données
Traces d'Exécution
===============
Trace #1 : https://youtu.be/MiiCGtzQzEM
<br>
Jeux de données
==============
articles.txt
```
/
1 33.80 1.62 64.50
2 45.97 1.21 193.57
3 91.03 0.57 79.36
4 59.32 0.71 100.99
5 34.18 1.43 42.44
6 75.43 2.43 57.86
7 26.11 2.32 155.97
8 31.89 0.92 190.94
9 90.74 0.59 61.87
10 15.63 1.81 148.95
11 62.08 1.47 185.78
12 84.46 2.00 49.14
13 71.74 0.46 177.15
14 81.59 1.08 69.27
15 76.09 1.28 92.17
16 50.92 2.37 28.14
17 73.27 1.07 142.01
18 99.08 2.16 5.51
19 76.33 1.28 66.87
20 47.91 1.28 14.79
21 49.92 0.92 86.80
22 88.98 1.18 127.61
23 11.72 1.97 189.64
24 22.72 0.56 106.91
25 99.43 1.61 52.19
26 73.17 1.78 112.36
27 17.10 2.26 72.91
28 96.59 2.43 43.50
29 16.39 1.36 77.74
30 47.78 1.85 36.03
31 12.49 0.96 170.42
32 53.07 0.32 83.83
33 42.26 0.72 198.57
34 86.22 1.03 195.66
35 46.83 0.37 23.29
36 95.86 1.14 163.49
37 21.67 1.08 188.90
38 16.15 0.32 169.18
39 39.76 2.45 111.22
40 16.23 2.15 142.99
41 13.15 1.05 58.28
42 46.66 0.30 45.97
43 67.64 2.28 23.28
44 98.52 1.71 10.28
45 96.39 1.11 59.34
46 96.30 0.67 159.19
47 45.94 0.62 169.54
48 20.28 1.78 145.46
49 44.08 1.57 169.84
50 80.91 2.13 67.70
```
clients.txt
```
/
1 7062 115.95 0 1
2 9392 446.75 0 0
3 7920 418.33 1 0
4 371 288.01 0 0
5 3762 175.85 0 0
6 3427 404.05 0 0
7 6861 148.23 0 0
8 57 201.61 0 0
9 6877 348.38 1 0
10 2497 66.83 0 0
11 5511 34.30 0 0
12 3377 236.79 0 0
13 8021 209.12 0 0
14 7696 283.08 0 0
15 4792 201.22 1 1
16 1423 334.40 0 0
17 919 360.44 0 0
18 3297 105.79 0 0
19 3569 410.50 0 0
20 457 69.42 0 0
21 8400 146.92 0 0
22 6401 205.69 0 0
23 4585 310.51 0 0
24 6228 406.27 0 0
25 635 12.86 0 0
26 9770 486.48 0 0
27 6919 67.96 0 0
28 6703 252.47 0 0
29 708 52.76 0 0
30 4440 425.78 0 0
31 5768 433.09 0 0
32 9810 442.02 0 0
33 6220 256.28 0 0
34 5317 473.44 0 0
35 3284 370.82 0 0
36 2998 426.58 0 0
37 8975 425.60 0 0
38 5877 106.48 0 0
39 1957 343.13 0 0
40 9020 378.99 0 0
41 9675 163.61 0 0
42 8637 288.33 0 0
43 5125 350.72 0 0
44 1318 79.63 0 0
45 2598 251.03 0 0
46 8815 302.61 0 0
47 8916 143.71 0 0
48 1503 452.92 0 0
49 7690 435.32 0 0
50 2999 57.94 0 0
```

@ -0,0 +1,50 @@
1 33.799999 1.620000 64.500000
2 45.970001 1.210000 193.570007
3 91.029999 0.570000 79.360001
4 59.320000 0.710000 100.989998
5 34.180000 1.430000 42.439999
6 75.430000 2.430000 57.860001
7 26.110001 2.320000 155.970001
8 31.889999 0.920000 190.940002
9 90.739998 0.590000 61.869999
10 15.630000 1.810000 148.949997
11 62.080002 1.470000 185.779999
12 84.459999 2.000000 49.139999
13 71.739998 0.460000 177.149994
14 81.589996 1.080000 69.269997
15 76.089996 1.280000 92.169998
16 50.919998 2.370000 28.139999
17 73.269997 1.070000 142.009995
18 99.080002 2.160000 5.510000
19 76.330002 1.280000 66.870003
20 47.910000 1.280000 14.790000
21 49.919998 0.920000 86.800003
22 88.980003 1.180000 127.610001
23 11.720000 1.970000 189.639999
24 22.719999 0.560000 106.910004
25 99.430000 1.610000 52.189999
26 73.169998 1.780000 112.360001
27 17.100000 2.260000 72.910004
28 96.589996 2.430000 43.500000
29 16.389999 1.360000 77.739998
30 47.779999 1.850000 36.029999
31 12.490000 0.960000 170.419998
32 53.070000 0.320000 83.830002
33 42.259998 0.720000 198.570007
34 86.220001 1.030000 195.660004
35 46.830002 0.370000 23.290001
36 95.860001 1.140000 163.490005
37 21.670000 1.080000 188.899994
38 16.150000 0.320000 169.179993
39 39.759998 2.450000 111.220001
40 16.230000 2.150000 142.990005
41 13.150000 1.050000 58.279999
42 46.660000 0.300000 45.970001
43 67.639999 2.280000 23.280001
44 98.519997 1.710000 10.280000
45 96.389999 1.110000 59.340000
46 96.300003 0.670000 159.190002
47 45.939999 0.620000 169.539993
48 20.280001 1.780000 145.460007
49 44.080002 1.570000 169.839996
50 80.910004 2.130000 67.699997

@ -1,2 +1,50 @@
1313 11 12.1 0 0
2010 22 12.1 0 0
1 7062 115.949997 1 0
2 9392 446.750000 0 0
3 7920 418.329987 1 0
4 371 288.010010 0 0
5 3762 175.850006 0 0
6 3427 404.049988 0 0
7 6861 148.229996 0 0
8 57 201.610001 0 0
9 6877 348.380005 0 1
10 2497 66.830002 0 0
11 5511 34.299999 0 0
12 3377 236.789993 0 0
13 8021 209.119995 0 0
14 7696 283.079987 0 0
15 4792 201.220001 1 1
16 1423 334.399994 0 0
17 919 360.440002 0 0
18 3297 105.790001 0 0
19 3569 410.500000 0 0
20 457 69.419998 0 0
21 8400 146.919998 0 0
22 6401 205.690002 0 0
23 4585 310.510010 0 0
24 6228 406.269989 0 0
25 635 12.860000 0 0
26 9770 486.480011 0 0
27 6919 67.959999 0 0
28 6703 252.470001 0 0
29 708 52.759998 0 0
30 4440 425.779999 0 0
31 5768 433.089996 0 0
32 9810 442.019989 0 0
33 6220 256.279999 0 0
34 5317 473.440002 0 0
35 3284 370.820007 0 0
36 2998 426.579987 0 0
37 8975 425.600006 0 0
38 5877 106.480003 0 0
39 1957 343.130005 0 0
40 9020 378.989990 0 0
41 9675 163.610001 0 0
42 8637 288.329987 0 0
43 5125 350.720001 0 0
44 1318 79.629997 0 0
45 2598 251.029999 0 0
46 8815 302.609985 0 0
47 8916 143.710007 0 0
48 1503 452.920013 0 0
49 7690 435.320007 0 0
50 2999 57.939999 0 0

@ -5,6 +5,7 @@
#include "main.h"
//TODO Non-terminé
void debugMenu(int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int clientID[], float cagnotte[], int suspended[], int isAdmin[], int tlogArticle, int tlogClient)
{
int choice;

@ -15,7 +15,7 @@ void errorHandling(int error)
//? Exemple d'erreurs (à adapter)
if (error < 0)
{
printf("\a"); // Bip d'erreur
printf("\a \x1B[31m"); // Bip d'erreur
switch (error)
{
case -1:
@ -45,28 +45,25 @@ void errorHandling(int error)
case -9:
printf("[ERREUR] - Le mot de passe est incorrect.\n");
break;
case -10:
printf("[ERREUR] - Votre compte est suspendu.\n");
break;
case -11:
printf("[ERREUR] - Le client n'est pas administrateur.\n");
break;
case -12:
printf("[ERREUR] - Vous ne pouvez pas supprimer plus d'articles que vous n'en avez dans votre panier, réessayez.\n");
break;
case -13:
printf("[ERREUR] - Le client n'a pas assez d'argent sur sa cagnotte.\n");
break;
case -14:
printf("[ERREUR] - vous ne pouvez pas supprimer un nombre nul ou négatif d'articles, réessayez.\n");
break;
default:
printf("[ERREUR] - Une erreur s'est produite.\n");
break;
}
printf("\x1B[0m");
}
}
void debugHandling(int code)
{
switch(code)
{
case 1:
printf("DEBUG: La fonction a été appelée.\n");
break;
case 2:
printf("DEBUG: La fonction a été appelée et s'est terminée correctement.\n");
break;
case 3:
printf("DEBUG: La fonction a été appelée et s'est terminée avec une erreur.\n");
break;
default:
printf("DEBUG: La fonction a été appelée avec un code inconnu.\n");
break;
}
}

Binary file not shown.

@ -10,9 +10,10 @@
* @param clientID: Tableau des identifiants client
* @param isAdmin: Tableau des statuts Administrateur des clients
* @param tlog: Taille logique des Tableaux
* @param suspended: Tableau des états de compte client
* @return Est Admin ? (1 > Oui, 0 > Non, -1 > Quitter)
*/
int login(int clientID[], int clientPassword[], int isAdmin[], int tlog, int *index)
int login(int clientID[], int clientPassword[], int isAdmin[], int suspended[], int tlog, int *index)
{
int id, password, found, tentative=3;
printf("Entrez votre identifiant: ");
@ -42,6 +43,12 @@ int login(int clientID[], int clientPassword[], int isAdmin[], int tlog, int *in
*index = searchTab(clientID, id, tlog, &found);
}
if(suspended[*index] == 1)
{
errorHandling(-10);
return -10;
}
printf("Entrez votre mot de passe: ");
scanf("%d%*c", &password);
while (password < 0)
@ -50,7 +57,7 @@ int login(int clientID[], int clientPassword[], int isAdmin[], int tlog, int *in
scanf("%d%*c", &password);
}
if (password == decrypt(clientPassword[*index]))
if (password == clientPassword[*index])
{
if (isAdmin[*index] == 1)
{
@ -88,6 +95,12 @@ int signup(int clientID[], int clientPassword[], float cagnotte[], int suspended
printf("Erreur, l'identifiant doit être positif, entrez votre identifiant ou 0 si vous souhaitez quitter: ");
scanf("%d%*c", &id);
}
if (id == 0)
{
errorHandling(-1);
return -1;
}
index = searchTab(clientID, id, *tlog, &found);
while(found == 1)
{
@ -95,6 +108,7 @@ int signup(int clientID[], int clientPassword[], float cagnotte[], int suspended
scanf("%d%*c", &id);
if (id == 0)
{
errorHandling(-1);
return -1;
}
index = searchTab(clientID, id, *tlog, &found);

@ -17,7 +17,6 @@ int displayMenu(void)
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
{
system("clear"); // Clear le terminal
@ -63,7 +62,7 @@ void global(void)
switch(choice)
{
case 1:
status = login(clientID, clientPassword, isAdmin, tLogClient, &index);
status = login(clientID, clientPassword, isAdmin, suspended, tLogClient, &index);
if(status == 1)
{
adminMenu(clientID, clientPassword, cagnotte, suspended, isAdmin, reference, weight, volume, unitPrice, &tLogItem, &tLogClient);
@ -75,7 +74,7 @@ void global(void)
else
{
printf("Connexion échouée.\nRetour au menu principal...\n");
sleep(3);
sleep(2);
}
break;
case 2:
@ -92,12 +91,11 @@ void global(void)
}
break;
case 3:
//TODO > Faire opposition
//opposition();
opposition(clientID, clientPassword, suspended, tLogClient);
break;
case 4:
sauvegardeDonnees(tLogItem, tLogClient, reference, weight, volume, unitPrice, clientID, clientPassword, cagnotte, isAdmin, suspended);
return;
break;
case 9:
debugMenu(reference, weight, volume, unitPrice, clientID, cagnotte, suspended, isAdmin, tLogItem, tLogClient);
break;
@ -108,6 +106,7 @@ void global(void)
}
choice = displayMenu();
}
sauvegardeDonnees(tLogItem, tLogClient, reference, weight, volume, unitPrice, clientID, clientPassword, cagnotte, isAdmin, suspended);
}
/**

@ -13,7 +13,6 @@
//! GESTION DES ERREURS & CODES
void errorHandling(int error);
void debugHandling(int code);
//! DEBUG
void debugMenu(int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int clientID[], float cagnotte[], int suspended[], int isAdmin[], int tlogArticle, int tlogClient);
@ -36,7 +35,7 @@ void decalageAGaucheFloat(float tab[], int index, int tlog);
//! GESTION CLIENTS
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);
void deleteClient(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int *tlog);
//! GESTION STOCKS
void inputItem(int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int *tlog);
@ -60,13 +59,10 @@ 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 clientPassword[], int isAdmin[], int tlog, int *index);
int login(int clientID[], int clientPassword[], int isAdmin[], int suspended[], 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);
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);
void opposition(int clientID[], int clientPassword[], int suspended[], int tlogClient);

@ -5,11 +5,34 @@
#include "main.h"
/**
* @brief La fonction `clientMenu` affiche un menu au client et lui laisse choisir d'effectuer
* des actions sur son panier.
*
* @param weight Pointeur float qui stocke la charge maximale (en Kg) du véicule.
* @param volume Pointeur float qui stocke le volume maximal (en metres cube) du véicule.
* @param price Pointeur float qui permet de stocker le budget maximum du client.
* @param tabItemRef Tableau int qui stocke les références des articles.
* @param unitPrice Tableau float qui stocke le prix des articles.
* @param cagnottePointeur Pointeur float qui stocke la cagnotte du client.
* @param basket_tab_ref Tableau contenant les références des articles dans le panier.
* @param basket_tab_qte Tableau stockant la quantité commandée des articles dans le panier.
* @param tabWeight Tableau float qui stocke le poids des articles.
* @param tabVolume Tableau float qui stocke le volume des articles.
* @param tlogItem Taille logique du tableau `tabItemRef`.
* @param tlogBasket Taille logique du tableau `tabBasketRef`.
*/
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("\nTapez sur Entrée pour continuer...");
if (getchar() == '\n') // getchar() pour récupérer le caractère entré par l'utilisateur
{
system("clear"); // Clear le terminal
}
printf("\n=================================\n");
printf(" Menu Client\n");
printf("=================================\n");
@ -18,10 +41,13 @@ void clientMenu(float *weight, float *volume, float *price, int tabItemRef[], fl
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("6\u2022 Déconnexion\n");
printf("=================================\n");
printf("Votre choix: ");
scanf("%d", &choice);
scanf("%d%*c", &choice);
system("clear");
switch (choice)
{
case 1:
@ -51,13 +77,38 @@ void clientMenu(float *weight, float *volume, float *price, int tabItemRef[], fl
}
}
/**
* @brief La fonction `adminMenu` permet à l'utilisateur administrateur de pouvoir utiliser des fonctions permettant
* d'ajouter/supprimer/modifier des articles du panier/ des clients, et afficher les informations
* du client/de l'article.
*
* @param clientID Tableau int qui stocke les identifiants des clients.
* @param clientPassword Tableau int qui stocke les mots de passe des clients.
* @param cagnotte Tableau float qui stocke les cagnonttes de chaque client.
* @param suspended Tableau int qui stocke l'état de suspention du compte des clients.
* Suspendu = 1, 0 sinon.
* @param isAdmin Tableau int qui indique si l'utilisateur de l'application est administrateur.
* Administrateur = 1, 0 sinon.
* @param tabReference Tableau int qui stocke les références des articles.
* @param tabWeight Tableau float qui stocke le poids des articles.
* @param tabVolume Tableau float qui stocke le volume des articles.
* @param unitPrice Tableau float qui stocke le prix des articles.
* @param tlogItem Taille logique du tableau `tabItemRef`.
* @param tlogClient Taille logique du tableau `clientID`.
*/
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("\nTapez sur Entrée pour continuer...");
if (getchar() == '\n') // getchar() pour récupérer le caractère entré par l'utilisateur
{
system("clear"); // Clear le terminal
}
printf("\n=================================\n");
printf(" Menu Client\n");
printf(" Menu Admin\n");
printf("=================================\n");
printf("1\u2022 Ajouter un client\n");
printf("2\u2022 Modifier les données d'un client\n");
@ -68,10 +119,13 @@ void adminMenu(int clientID[], int clientPassword[], float cagnotte[], int suspe
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("10\u2022 Déconnexion\n");
printf("=================================\n");
printf("Votre choix: ");
scanf("%d", &choice);
scanf("%d%*c", &choice);
system("clear");
switch (choice)
{
case 1:
@ -81,7 +135,7 @@ void adminMenu(int clientID[], int clientPassword[], float cagnotte[], int suspe
modifyClient(clientID, cagnotte, suspended, isAdmin, *tlogClient);
break;
case 3:
deleteClient(clientID, cagnotte, suspended, isAdmin, tlogClient);
deleteClient(clientID, clientPassword, cagnotte, suspended, isAdmin, tlogClient);
break;
case 4:
inputItem(tabReference, tabWeight, tabVolume, unitPrice, tlogItem);
@ -108,4 +162,44 @@ void adminMenu(int clientID[], int clientPassword[], float cagnotte[], int suspe
break;
}
}
}
/**
* @brief Pour faire opposition et débloquer son compte lorsqu'il est suspendu.
* @param clientID Tableau des identifiants client
* @param clientPassword Tableau des mots de passe
* @param suspended Tableau des états de compte
* @param tlogClient Taille logique du tableau des clients
*
* @return void
*/
void opposition(int clientID[], int clientPassword[], int suspended[], int tlogClient)
{
int id, password, index, found;
printf("Entrez votre identifiant: ");
scanf("%d%*c", &id);
index = searchTab(clientID, id, tlogClient, &found);
if (found == 0)
{
errorHandling(-7);
return;
}
if(suspended[index] == 0)
{
printf("Votre compte n'est pas suspendu.\n");
return;
}
printf("Entrez votre mot de passe: ");
scanf("%d%*c", &password);
if (password == clientPassword[index])
{
suspended[index] = 0;
printf("Votre compte a été réactivé.\n");
}
else
{
errorHandling(-9);
}
}

@ -23,7 +23,7 @@ void inputClient(int id, int passwd, int index, int clientID[], int clientPasswo
// 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");
errorHandling(-2);
return;
}
@ -34,7 +34,7 @@ void inputClient(int id, int passwd, int index, int clientID[], int clientPasswo
decalageADroiteInt(isAdmin, index, *tlog);
clientID[index] = id;
clientPassword[index] = encrypt(passwd);
clientPassword[index] = passwd;
cagnotte[index] = 0;
suspended[index] = 0;
isAdmin[index] = 0;
@ -64,7 +64,7 @@ void modifyClient(int clientID[], float cagnotte[], int suspended[], int isAdmin
scanf("%d%*c", &numClient);
}
index = searchTab(clientID, numClient, tlog, &found);
while (index == -1)
while(found == 0)
{
printf("Cet identifiant client n'existe pas, réessayer ou tapez 0 si vous souhaitez arrêter la saisie: ");
scanf("%d%*c", &numClient);
@ -85,7 +85,7 @@ void modifyClient(int clientID[], float cagnotte[], int suspended[], int isAdmin
else if (modif == 'c')
{
printf("Entrez le montant à ajouter à la cagnotte: ");
scanf("%f", &montant);
scanf("%f%*c", &montant);
cagnotte[index] += montant;
}
else if (modif == 'a')
@ -107,47 +107,64 @@ void modifyClient(int clientID[], float cagnotte[], int suspended[], int isAdmin
*/
void inputItem(int tabReference[], float tabWeight[], float tabVolume[], float unitPrice[], int *tlog)
{
int reference = -1;
int reference = -1, index, found;
float weight, volume, price;
while (reference != 0)
while(reference != 0)
{
printf("Entrez la référence du produit ou 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &reference);
scanf("%d%*c", &reference);
while (reference < 0)
{
printf("Erreur: la référence doit être positive, entrez la référence du produit ou 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &reference);
scanf("%d%*c", &reference);
}
tabReference[*tlog] = reference;
printf("Entrez le poids du produit: ");
scanf("%f", &weight);
while (weight <= 0)
{
printf("Erreur, le poids doit être positif");
scanf("%f", &weight);
}
tabWeight[*tlog] = weight;
index = searchTab(tabReference, reference, *tlog, &found);
printf("Entrez le volume du produit: ");
scanf("%f", &volume);
while (volume <= 0)
while(found == 1 && reference != 0)
{
printf("Erreur, le volume doit être positif");
scanf("%f", &volume);
printf("Cette référence existe déjà, réessayer ou tapez 0 si vous souhaitez arrêter la saisie: ");
scanf("%d%*c", &reference);
index = searchTab(tabReference, reference, *tlog, &found);
}
tabVolume[*tlog] = volume;
printf("Entrez le prix du produit: ");
scanf("%f", &price);
while (price <= 0)
if (reference != 0)
{
printf("Erreur, le prix doit être positif");
scanf("%f", &price);
}
unitPrice[*tlog] = price;
printf("Entrez le poids du produit: ");
scanf("%f%*c", &weight);
while (weight < 0)
{
printf("Erreur: le poids doit être positif, entrez le poids du produit: ");
scanf("%f%*c", &weight);
}
printf("Entrez le volume du produit: ");
scanf("%f%*c", &volume);
while (volume < 0)
{
printf("Erreur: le volume doit être positif, entrez le volume du produit: ");
scanf("%f%*c", &volume);
}
printf("Entrez le prix du produit: ");
scanf("%f%*c", &price);
while (price < 0)
{
printf("Erreur: le prix doit être positif, entrez le prix du produit: ");
scanf("%f%*c", &price);
}
//Décalage
decalageADroiteInt(tabReference, index, *tlog);
decalageADroiteFloat(tabWeight, index, *tlog);
decalageADroiteFloat(tabVolume, index, *tlog);
decalageADroiteFloat(unitPrice, index, *tlog);
tabReference[index] = reference;
tabWeight[index] = weight;
tabVolume[index] = volume;
unitPrice[index] = price;
*tlog++;
*tlog++;
}
}
}
@ -167,26 +184,25 @@ void deleteItem(int tabReference[], float tabWeight[], float tabVolume[], float
while (reference != 0)
{
printf("Entrez la référence du produit à supprimer ou 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &reference);
scanf("%d%*c", &reference);
while (reference < 0)
{
printf("Erreur: la référence doit être positive, entrez la référence du produit ou 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &reference);
scanf("%d%*c", &reference);
}
index = searchTab(tabReference, reference, *tlog, &found);
while (index == -1)
while(found == 0)
{
printf("Cette référence n'existe pas, réessayer ou tapez 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &reference);
scanf("%d%*c", &reference);
index = searchTab(tabReference, reference, *tlog, &found);
}
for (i=*tlog; i>index; i--)
{
tabReference[i-1] = tabReference[i];
tabWeight[i-1] = tabWeight[i];
tabVolume[i-1] = tabVolume[i];
unitPrice[i-1] = unitPrice[i];
}
decalageAGaucheInt(tabReference, index, *tlog);
decalageAGaucheFloat(tabWeight, index, *tlog);
decalageAGaucheFloat(tabVolume, index, *tlog);
decalageAGaucheFloat(unitPrice, index, *tlog);
*tlog--;
}
}
@ -201,34 +217,32 @@ void deleteItem(int tabReference[], float tabWeight[], float tabVolume[], float
* @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)
void deleteClient(int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[], int *tlog)
{
int numClient = -1, index, i, found;
while (numClient != 0)
{
printf("Entrez l'identifiant du client à supprimer ou 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &numClient);
scanf("%d%*c", &numClient);
while (numClient < 0)
{
printf("Erreur, le numéro du client doit être positif, entrez le numéro du client ou 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &numClient);
scanf("%d%*c", &numClient);
}
index = searchTab(clientID, numClient, *tlog, &found);
while (index == -1)
while(found == 0)
{
printf("Cet identifiant client n'existe pas, réessayer ou tapez 0 si vous souhaitez arrêter la saisie: ");
scanf("%d", &numClient);
scanf("%d%*c", &numClient);
index = searchTab(clientID, numClient, *tlog, &found);
}
for (i=*tlog; i>index; i--)
{
clientID[i-1] = clientID[i];
cagnotte[i-1] = cagnotte[i];
suspended[i-1] = suspended[i];
isAdmin[i-1] = isAdmin[i];
}
decalageAGaucheInt(clientID, index, *tlog);
decalageAGaucheInt(clientPassword, index, *tlog);
decalageAGaucheFloat(cagnotte, index, *tlog);
decalageAGaucheInt(suspended, index, *tlog);
decalageAGaucheInt(isAdmin, index, *tlog);
*tlog--;
}
}

@ -5,34 +5,64 @@
#include "main.h"
/**
* @brief La fonction `clientConstraint` demmande à l'utilisateur d'entrer la charge limite et le volume maximal
* du véicule.
* @param weight Pointeur float qui stocke la charge maximale (en Kg) du véicule.
* @param volume Pointeur float qui stocke le volume maximal (en metres cube) du véicule.
* @param price Pointeur float qui permet de stocker le budget maximum du client.
*/
void clientConstraint(float *weight, float *volume, float *price)
{
// Saisie des contraintes du client.
printf("Entrez la charge maximale de votre véhicule en kilogrammes: ");
scanf("%f", weight);
scanf("%f%*c", weight);
while (*weight < 0)
{
printf("Erreur, le poids doit être positif, entrez la charge maximale de votre véhicule en kilogrammes: ");
scanf("%f", weight);
scanf("%f%*c", weight);
}
printf("Entrez le volume du coffre de votre véhicule en mètres cubes: ");
scanf("%f", volume);
scanf("%f%*c", volume);
while (*volume < 0)
{
printf("Erreur: le volume doit être positif, entrez le volume du coffre de votre véhicule en mètres cubes: ");
scanf("%f", volume);
scanf("%f%*c", volume);
}
printf("Entrez votre budget maximum ou -1 si vous n'en avait pas: ");
scanf("%f", price);
while (*price < 0 || *price != -1)
printf("Entrez votre budget maximum ou -1 si vous n'en avez pas: ");
scanf("%f%*c", price);
while (*price < 0 && *price != -1)
{
printf("Erreur: le prix doit être positif, entrez votre budget maximum ou -1 si vous n'en avait pas: ");
scanf("%f", price);
printf("Erreur: le prix doit être positif, entrez votre budget maximum ou -1 si vous n'en avez pas: ");
scanf("%f%*c", price);
}
}
/**
* @brief constraintExceeded permet de regarder si la charge maximale, le volume maximal, et le prix maximal sont
* dépassés à partir des articles dans le panier
*
* @param weightConstraint Float qui stocke la charge maximale (en Kg) du véicule.
* @param volumeConstraint Float qui stocke le volume maximal (en metres cube) du véicule.
* @param priceConstraint Pointeur float qui permet de stocker le budget maximum du client.
* @param cagnotte Pointeur float qui stocke la cagnotte du client.
* @param tabWeight Tableau float qui stocke le poids des articles.
* @param tabVolume Tableau float qui stocke le volume des articles.
* @param tabPrice Tableau float qui stocke le prix des articles.
* @param tabItemRef Tableau int qui stocke les références des articles.
* @param tabBasketRef Tableau contenant les références des articles dans le panier.
* @param tabBasketQuantity Tableau stockant la quantité commandée des articles dans le panier.
* @param tlogItem Taille logique du tableau `tabItemRef`.
* @param tlogBasket Taille logique du tableau `tabBasketRef`.
* @return Renvoie 0 si tout ce passe sans erreur, renvoie -1 en cas d'erreur.
*/
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;
@ -67,7 +97,7 @@ int constraintExceeded(float weightConstraint, float volumeConstraint, float *pr
else
{
printf("Vous pouvez utiliser votre cagnotte, dont le montant est de %.2f, entrez le montant à utiliser ou -1 si vous voulez retirer un article: ", *cagnotte);
scanf("%f", &cagnotteUse);
scanf("%f%*c", &cagnotteUse);
if (cagnotteUse == -1)
return -1;
@ -77,7 +107,7 @@ int constraintExceeded(float weightConstraint, float volumeConstraint, float *pr
printf("Erreur: vous ne pouvez pas utiliser plus que vous n'avez, réessayez ou entrer -1 si vous souhaitez retirer un article: ");
if (totalPrice-cagnotteUse > *priceConstraint)
printf("Erreur: vous n'avez pas utilisé assez de votre cagnotte, vous devez utiliser au moins %.2f, veuillez rentrer le montant à utiliser ou -1 si vous voulez retirer un article: ", totalPrice - *priceConstraint);
scanf("%f", &cagnotteUse);
scanf("%f%*c", &cagnotteUse);
if (cagnotteUse == -1)
return -1;
*cagnotte -= cagnotteUse;
@ -91,24 +121,28 @@ int constraintExceeded(float weightConstraint, float volumeConstraint, float *pr
}
/**
* @brief Ajoute un article au panier et calcule les différents attributs pour la fonction `display_basket`
* @param tab_reference: tableau des références des articles
* @param weight: tableau des poids des articles
* @param volume: tableau du volume des articles
* @param unitPrice: tableau du prix unitaire des articles
* @param cagnotte: pointeur indiquant la valeur de la cagnotte
* @param basket_tab_ref: tableau des références du panier
* @param basket_tab_qte: tableau de la quantité de l'article du panier
* @param tlog: taille logique du tableau `tab_reference`
* @param tlog_basket: taille logique du panier
* @return taille logique du panier
* @brief Ajoute un article au panier et calcule les différents attributs pour la fonction `display_basket`.
* @param tab_reference: tableau des références des articles.
* @param weight: tableau des poids des articles.
* @param volume: tableau du volume des articles.
* @param unitPrice: tableau du prix unitaire des articles.
* @param cagnotte: pointeur indiquant la valeur de la cagnotte.
* @param basket_tab_ref: tableau des références du panier.
* @param basket_tab_qte: tableau de la quantité de l'article du panier.
* @param tlog: taille logique du tableau `tab_reference`.
* @param tlog_basket: taille logique du panier.
*/
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;
int i, ref_to_add, qte_to_add, trouve, index_ajout;
float total_weight[tmaxArticles], total_volume[tmaxArticles], total_price[tmaxArticles], total_cagnotte[tmaxArticles];
if (tlogItem+1>tmaxArticles)
{
printf("erreur, pas assez de place pour ajouter un autre article");
return;
}
printf("Quelle référence souhaitez-vous ajouter au panier?");
scanf("%d", &ref_to_add);
scanf("%d%*c", &ref_to_add);
index_ajout = searchTab(tab_reference, ref_to_add, tlogItem, &trouve);
while (trouve == 0)
{
@ -118,12 +152,17 @@ void basket_add(int tab_reference[], float unitPrice[], float *cagnotte, int ba
}
basket_tab_ref[index_ajout] = ref_to_add;
printf("Quelle quantité de cet article souhaitez-vous ajouter au panier?");
scanf("%d", &qte_to_add);
scanf("%d%*c", &qte_to_add);
while (qte_to_add <= 0)
{
printf("Vous ne pouvez pas ajouter une quantité nulle ou négative ressayez");
scanf("%d", &qte_to_add);
scanf("%d%*c", &qte_to_add);
}
for (i=*tlog_basket; i>=index_ajout; i--)
{
basket_tab_ref[i]=basket_tab_ref[i+1];
basket_tab_qte[i]=basket_tab_qte[i+1];
}
basket_tab_qte[index_ajout] = ref_to_add;
*cagnotte += (unitPrice[index_ajout]*qte_to_add) *0.1;
@ -131,9 +170,9 @@ void basket_add(int tab_reference[], float unitPrice[], float *cagnotte, int ba
}
/**
* @brief Supprime le panier en lui donnant sa taille_logique à 0
* @param tlog_basket: taille logique du panier
* @return taille logique du panier
* @brief Supprime le panier en lui donnant sa taille_logique à 0.
* @param tlog_basket: taille logique du panier.
* @return taille logique du panier.
*/
void reinit_basket(int *tlog_basket)
{
@ -141,44 +180,41 @@ void reinit_basket(int *tlog_basket)
// 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.
return tlog_basket;
}
/**
* @brief Supprime un article au panier ou modifie sa quantité si la quantité est supérieure à 1
* @param basket_tab_ref: tableau des références du panier
* @param basket_tab_qte: tableau de la quantité de l'article du panier
* @param tlog_basket: taille logique du panier
* @return taille logique du panier
* @brief Supprime un article au panier ou modifie sa quantité si la quantité est supérieure à 1.
* @param basket_tab_ref: tableau des références du panier.
* @param basket_tab_qte: tableau de la quantité de l'article du panier.
* @param tlog_basket: taille logique du panier.
* @return taille logique du panier.
*/
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);
scanf("%d%*c",&ref_to_del);
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);
scanf("%d%*c",&ref_to_del);
index_to_del = searchTab(basket_tab_ref, ref_to_del, *tlog_basket, &trouve);
}
if (basket_tab_qte[index_to_del]>1)
{
printf("Combien d'articles e ce type voulez-vous supprimer?");
scanf("%d",&qte_to_del);
scanf("%d%*c",&qte_to_del);
while(qte_to_del<=0)
{
printf("Erreur, vous ne pouvez pas supprimer un nombre nul ou négatif d'articles, réssayez");
//on pourrait supprimer un nombre nul d'articles,
//mais ça n'a pas de sens car cette fonction à pour but de supprimer des articles
scanf("%d",&qte_to_del);
errorHandling(-14);
scanf("%d%*c",&qte_to_del);
}
while(basket_tab_qte[index_to_del]-qte_to_del>=0)
{
printf("Erreur, vous ne pouvez pas supprimer plus d'articles que vous n'en avez dans votre panier, ressayez");
scanf("%d",&qte_to_del);
errorHandling(-12);
scanf("%d%*c",&qte_to_del);
}
if (qte_to_del<basket_tab_qte[index_to_del])
{
@ -186,7 +222,7 @@ void basket_del_article(int basket_tab_ref[], int basket_tab_qte[], int *tlog_ba
}
else if (qte_to_del==basket_tab_qte[index_to_del])
{
for (i=*tlog_basket; i>index_to_del; i--)
for (i=index_to_del; i<*tlog_basket; i++)
{
basket_tab_ref[i]=basket_tab_ref[i+1];
basket_tab_qte[i]=basket_tab_qte[i+1];

@ -1,28 +0,0 @@
/**
* @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;
}

@ -131,6 +131,8 @@ int chargeClients(int clientID[], int clientPassword[], float cagnotte[], int su
*/
void sauvegardeDonnees(int tLogArticle, int tLogClient, int reference[], float weight[], float volume[], float unitPrice[], int clientID[], int clientPassword[], float cagnotte[], int suspended[], int isAdmin[])
{
printf("[DEBUG] - Sauvegarde des données...\n");
sleep(2);
sauvegardeArticles(reference, weight, volume, unitPrice, tLogArticle);
sauvegardeClients(clientID, clientPassword, cagnotte, suspended, isAdmin, tLogClient);
}
@ -159,6 +161,7 @@ void sauvegardeArticles(int reference[], float weight[], float volume[], float u
fprintf(article, "%d %f %f %f\n", reference[i], weight[i], volume[i], unitPrice[i]);
}
printf("[DEBUG] - Sauvegarde articles réussie.\n");
fclose(article);
}
@ -187,5 +190,6 @@ void sauvegardeClients(int clientID[], int clientPassword[], float cagnotte[], i
fprintf(client, "%d %d %f %d %d\n", clientID[i], clientPassword[i], cagnotte[i], suspended[i], isAdmin[i]);
}
printf("[DEBUG] - Sauvegarde clients réussie.\n");
fclose(client);
}
Loading…
Cancel
Save