Projet e-stock  0.2
BTS SNIR LaSalle Avignon 2020
Supervision.cpp
Aller à la documentation de ce fichier.
1 #include "Supervision.h"
2 #include "Ihm.h"
3 #include "Bdd.h"
4 #include "CodeBarre.h"
5 #include "Communication.h"
6 #include "Rfid.h"
7 #include "Utilisateur.h"
8 #include "Armoire.h"
9 #include "Article.h"
10 #include "Communication.h"
11 #include "Casier.h"
12 #include <QDate>
13 #include <QMessageBox>
14 #include <QCryptographicHash>
15 
36 Supervision::Supervision(Ihm *parent) : QObject(parent), ihm(parent)
37 {
38  // Instancie les objets dont la classe Supervision coordonne les actions
40  bdd->connecter();
41  codeBarre = new CodeBarre(this);
42  //portSerie = new Communication(this);
43  rfid = new Rfid(this);
44  utilisateur = nullptr;
45  armoire = new Armoire(this);
46  communication = new Communication(this);
47 
49 
51 
52  #ifdef SUPERVISION_TEST_POIDS
53  QString trameTest = "CASIERS;3;1;2100";
54  traiterTramePoids(trameTest);
55  #endif
56 
57  //envoyer demande trame poids au démarrage pour mettre à jour le stock au démarrage
59 }
60 
67 {
68 
69 }
70 
77 {
78  if(utilisateur != nullptr)
79  {
80  delete utilisateur;
81  utilisateur = nullptr;
82  }
83 }
84 
91 {
92  QString nbCasiers = armoire->getNbCasiers();
93  qDebug() << Q_FUNC_INFO << "nbCasiers" << nbCasiers;
94  if(!nbCasiers.isEmpty())
95  {
96  for(int i=0; i < nbCasiers.toInt(); i++)
97  {
98  Casier* casier = new Casier(i+1, ihm);
99  casiers.push_back(casier);
100  ihm->placerCasier(casier);
101  }
102  }
103 }
104 
112 {
113  QStringList informationsArmoire = armoire->getInformations();
114 
115  return informationsArmoire;
116 }
117 
126 {
127  QString requeteBDD = "SELECT * from Utilisateur where Badge = '" + badge + "';";
128  QStringList donnees = recupererDonneesUtilisateur(requeteBDD);
129  if(verifierDonneesUtilisateur(donnees))
130  {
131  connecterUtilisateur(donnees);
132  }
133 }
135 
143 void Supervision::verifierAuthentificationIdentifiant(QString identifiant, QString motDePasse)
145 {
146  this->crypterMotDepasse(motDePasse);
147 
148  #ifdef CHANGE_PASSWORD_BEFORE
149  QString requete = QString("UPDATE Utilisateur SET MotDePasse='%1' WHERE Identifiant='%2'").arg(motDePasse).arg(identifiant);
150  bdd->executer(requete);
151  #endif
152 
153  QString requeteBDD = "SELECT * from Utilisateur where Identifiant = '" + identifiant + "' && MotDePasse = '" + motDePasse + "';";
154  QStringList donnees = recupererDonneesUtilisateur(requeteBDD);
155  if(verifierDonneesUtilisateur(donnees))
156  {
157  connecterUtilisateur(donnees);
158  }
159 }
161 
169 QStringList Supervision::recupererDonneesUtilisateur(QString requeteBDD)
171 {
172  QStringList donnees;
173  bdd->recuperer(requeteBDD, donnees);
174 
175  return donnees;
176 }
178 
185 void Supervision::crypterMotDepasse(QString &motDePasse)
187 {
188  if(!motDePasse.isEmpty())
189  {
190  motDePasse = QString(QCryptographicHash::hash((motDePasse).toLatin1(), QCryptographicHash::Md5).toHex());
191  }
192 
193  #ifdef DEBUG_SUPERVISION
194  qDebug() << Q_FUNC_INFO << "Mot de passe crypte" << motDePasse;
195  #endif
196 }
198 
206 bool Supervision::verifierDateValidite(QString stringDateValidite)
207 {
208  // Verification de la date de validité
209  QDate dateValidite = dateValidite.fromString(stringDateValidite,"yyyy-MM-dd");
210  QDate dateActuelle = QDate::currentDate();
211 
212  #ifdef DEBUG_SUPERVISION
213  qDebug() << "Date actuelle" << dateActuelle;
214  qDebug() << "Date validité" << dateValidite;
215  #endif
216 
217  if(dateActuelle <= dateValidite)
218  {
219  return true;
220  }
221 
222  return false;
223 }
224 
232 bool Supervision::verifierDonneesUtilisateur(QStringList &donnees)
234 {
235  #ifdef DEBUG_SUPERVISON
236  qDebug() << Q_FUNC_INFO << donnees;
237  #endif
238 
239  if(!donnees.isEmpty())
240  {
242  {
243  emit reponseDemandeDeConnexion(true, "");
244  return true;
245  }
246  else
247  {
249  return false;
250  }
251  }
252  else
253  {
255  return false;
256  }
257 }
259 
266 void Supervision::connecterUtilisateur(QStringList &donnees)
268 {
269  if(utilisateur != nullptr)
270  {
272  }
273  utilisateur = new Utilisateur(donnees, this);
274  #ifdef DEBUG_SUPERVISION
275  qDebug() << Q_FUNC_INFO << utilisateur->getIdentifiantUtilisateur() << "authentifié";
276  #endif
277 }
279 
286 {
287  // Armoire
288  connect(armoire, SIGNAL(informationsArmoire(QStringList)), ihm, SLOT(afficherInformationsArmoire(QStringList)));
289 
290  // Authentification Badge
291  connect(ihm, SIGNAL(badgeDetecte(QString)), rfid, SLOT(traiterBadge(QString)));
292  connect(rfid, SIGNAL(erreurBadgeInvalide(QString)), ihm, SLOT(afficherErreurBadge(QString)));
293  connect(rfid, SIGNAL(nouveauUidBadge(QString)), this, SLOT(verifierAuthentificationBadge(QString)));
294 
295  // Authentification Identifiant
296  connect(ihm, SIGNAL(identifiantDetecte(QString, QString)), this, SLOT(verifierAuthentificationIdentifiant(QString, QString)));
297 
298  // Authentification Utilisateur
299  connect(this, SIGNAL(reponseDemandeDeConnexion(bool,QString)), ihm, SLOT(traiterDemandeDeConnexion(bool,QString)));
300 
301  // Article
302  connect(communication, SIGNAL(envoieTramePoids(QString)), this, SLOT(traiterTramePoids(QString)));
303  connect(ihm, SIGNAL(rechercheArticle(QString)), this, SLOT(rechercherArticle(QString)));
304  connect(this, SIGNAL(articlesTrouves(QVector<QStringList>)), ihm, SLOT(mettreAJourListeArticles(QVector<QStringList>)));
305  connect(ihm, SIGNAL(articleSelectionne(QString)), this, SLOT(selectionnerArticle(QString)));
306  connect(this, SIGNAL(donneesArticleSelectionne(QStringList)), ihm, SLOT(afficherDonneesArticleSelectionne(QStringList)));
307  connect(this, SIGNAL(donneesArticleSelectionne(QVector<QStringList>)), ihm, SLOT(afficherDonneesArticleSelectionne(QVector<QStringList>)));
308  connect(this, SIGNAL(erreurDepassementQuantite()), ihm, SLOT(afficherErreurDepassementQuantite()));
309 }
310 
317 void Supervision::rechercherArticle(QString recherche)
319 {
320  QString requete = "SELECT Stock.NumeroCasier, Article.idType, Article.Nom, Stock.Quantite, Stock.Disponible, Article.Designation FROM Stock INNER JOIN Article ON Stock.idArticle = Article.idArticle WHERE Article.Nom LIKE '%" + recherche + "%' OR Article.Code LIKE '%" + recherche + "%' OR Article.Designation LIKE '%" + recherche + "%' ORDER BY Stock.NumeroCasier ASC";
321 
322  QVector<QStringList> listeArticlesTrouves;
323  bdd->recuperer(requete, listeArticlesTrouves);
324 
325  emit articlesTrouves(listeArticlesTrouves);
326 }
328 
334 void Supervision::selectionnerArticle(QString nomArticle)
336 {
337  #ifdef DEBUG_SUPERVISION
338  qDebug() << Q_FUNC_INFO << "Nom article" << nomArticle;
339  #endif
340 
341  Article *article = new Article(this);
342  QVector<QStringList> donneesArticle;
343  QStringList donnees;
344 
345  unsigned int nombreCasiers = Article::recupererNombreCasiersPourNomArticle(nomArticle);
346  #ifdef DEBUG_SUPERVISION
347  qDebug() << Q_FUNC_INFO << "nombreCasiers" << nombreCasiers;
348  #endif
349 
350  if(nombreCasiers > 1)
351  {
352  QVector<QString> numeroDesCasiers;
353 
354  numeroDesCasiers = Article::recupererNumeroCasierPourNomArticle(nomArticle);
355 
356  for(int i = 0; i < numeroDesCasiers.size(); i++)
357  {
358  article->recupererDonneesArticleParNumeroCasier(numeroDesCasiers[i]);
359  ajouterDonneesArticle(article, donneesArticle, donnees);
360  }
361 
362  if(!donneesArticle.isEmpty())
363  {
364  emit donneesArticleSelectionne(donneesArticle);
365  }
366  }
367  else
368  {
369  article->recupererDonneesArticleParNom(nomArticle);
370  ajouterDonneesArticle(article, donneesArticle, donnees);
371 
372  if(!donneesArticle.isEmpty())
373  {
374  emit donneesArticleSelectionne(donneesArticle.at(0));
375  }
376  }
377 }
379 
387 {
388  #ifdef DEBUG_SUPERVISION
389  qDebug() << Q_FUNC_INFO << trame;
390  #endif
391 
392  QString numCasier = extraireNumeroCasier(trame);
393 
394  Article *article = new Article(this);
395  if(article->recupererDonneesArticleParNumeroCasier(numCasier))
396  {
397  #ifdef DEBUG_SUPERVISION
398  qDebug() << Q_FUNC_INFO << "Article" << article->get(TABLE_ARTICLE_NOM_ARTICLE) << article->get(TABLE_ARTICLE_QUANTITE) << article->get(TABLE_ARTICLE_DISPONIBLE);
399  #endif
400 
401  int nombreArticle = compter(article->get(TABLE_ARTICLE_POIDS), extrairePoids(trame), article->get(TABLE_ARTICLE_TARE));
402 
403  QString strArticleQuantite = article->get(TABLE_ARTICLE_QUANTITE);
404 
405  int articleQuantite = strArticleQuantite.toInt();
406 
407  if(nombreArticle > articleQuantite)
408  {
410  }
411  else
412  {
413  article->mettreAJourQuantite(QString::number(nombreArticle));
414  }
415  }
416  else
417  {
418  #ifdef DEBUG_SUPERVISION
419  qDebug() << Q_FUNC_INFO << "Article introuvable !";
420  #endif
421  }
422 }
423 
431 QString Supervision::extrairePoids(QString trame)
432 {
433  QString poids = trame.section(';',3,3);
434 
435  #ifdef DEBUG_SUPERVISION
436  qDebug() << Q_FUNC_INFO << "poids:" << poids;
437  #endif
438 
439  return poids;
440 }
441 
449 QString Supervision::extraireNumeroCasier(QString trame)
450 {
451  QString numCasier = trame.section(';',2,2);
452 
453  #ifdef DEBUG_SUPERVISION
454  qDebug() << Q_FUNC_INFO << "numCasier:" << numCasier;
455  #endif
456 
457  return numCasier;
458 }
459 
468 int Supervision::compter(QString poidsArticle, QString poidsTotal, QString tare)
469 {
470  //arrondie et conversion en entier
471  int intPoidsArticle = arrondir(poidsArticle);
472 
473  #ifdef DEBUG_SUPERVISION
474  qDebug() << Q_FUNC_INFO << "intPoidsArticle:" << intPoidsArticle;
475  #endif
476 
477  int intPoidsTotal = arrondir(poidsTotal);
478 
479  #ifdef DEBUG_SUPERVISION
480  qDebug() << Q_FUNC_INFO << "intPoidsTotal:" << intPoidsTotal;
481  #endif
482 
483  int intTare = arrondir(tare);
484 
485  #ifdef DEBUG_SUPERVISION
486  qDebug() << Q_FUNC_INFO << "tare:" << intTare;
487  #endif
488 
489  //comptage du nombre d'articles
490 
491  double doubleNombreArticle = (intPoidsTotal - intTare) / intPoidsArticle;
492  QString strNombreArticle = QString::number(doubleNombreArticle, 'f', PRECISION);
493  int nombreArticle = strNombreArticle.toInt();
494 
495  #ifdef DEBUG_SUPERVISION
496  qDebug() << Q_FUNC_INFO << "nombreArticle:" << nombreArticle;
497  #endif
498 
499  return nombreArticle;
500 }
501 
508 int Supervision::arrondir(QString arrondire)
509 {
510  double doubleArrondire = arrondire.toDouble();
511  QString strArrondire = QString::number(doubleArrondire, 'f', PRECISION);
512  int doubleArrondie = strArrondire.toInt();
513 
514  return doubleArrondie;
515 }
516 
524 void Supervision::ajouterDonneesArticle(Article *article, QVector<QStringList> &donneesArticle, QStringList &donnees)
525 {
526  donnees << article->get(TABLE_ARTICLE_QUANTITE);
527  donnees << article->get(TABLE_ARTICLE_DISPONIBLE);
528  donnees << article->get(TABLE_ARTICLE_NUMERO_CASIER);
529 
530  donneesArticle.push_back(donnees);
531  donnees.clear();
532 }
void verifierAuthentificationIdentifiant(QString identifiant, QString motDePasse)
[verifierAuthentificationBadge]
Déclaration de la classe Article.
Déclaration de la classe Casier.
void donneesArticleSelectionne(QVector< QStringList >)
void creerCasiers()
Définition de la méthode creerCasiers.
Definition: Supervision.cpp:90
La classe Article traite les articles.
Definition: Article.h:63
Déclaration de la classe Rfid.
QString getIdentifiantUtilisateur()
Définition de la méthode getIdentifiantUtilisateur.
Definition: Utilisateur.cpp:78
bool executer(QString requete)
exécute une requête SQL de type UPDATE, INSERT et DELETE
Definition: Bdd.cpp:146
Armoire * armoire
association d&#39;un objet Armoire
Definition: Supervision.h:84
void connecterSignauxSlots()
[connecterUtilisateur]
bool verifierDonneesUtilisateur(QStringList &donnees)
Définition de la méthode verifierDonneesUtilisateur.
~Supervision()
Définition du destructeur de Supervision.
Definition: Supervision.cpp:66
Definition: Article.h:46
Déclaration de la classe Ihm.
CodeBarre * codeBarre
association d&#39;un objet CodeBarre
Definition: Supervision.h:83
Communication * communication
association d&#39;un objet Communication
Definition: Supervision.h:85
Definition: Article.h:41
QString getNbCasiers() const
Définition de la méthode getNbCasiers.
Definition: Armoire.cpp:127
bool connecter()
Définition méthose connecter()
Definition: Bdd.cpp:93
void mettreAJourQuantite(QString quantite)
Définition de la méthode mettreAJourQuantite.
Definition: Article.cpp:329
void traiterTramePoids(QString trame)
[selectionnerArticle_supervision]
#define MESSAGE_ERREUR_UTILISATEUR_DATE_NON_VALIDE
Definition: Ihm.h:36
La classe Casier gère le casier contenant des articles.
Definition: Casier.h:32
Bdd * bdd
association d&#39;un objet Bdd (accès à la base de données)
Definition: Supervision.h:80
QString extraireNumeroCasier(QString trame)
Définition de la méthode extraireNumeroCasier.
void crypterMotDepasse(QString &motDePasse)
[recupererDonneesUtilisateur]
Definition: Article.h:40
#define MESSAGE_ERREUR_UTILISATEUR_NON_VALIDE
Definition: Ihm.h:35
QStringList getInformations()
Définition de la méthode getInformations.
Definition: Armoire.cpp:78
void connecterUtilisateur(QStringList &donnees)
[verifierDonneesUtilisateur]
QVector< Casier * > casiers
les casiers de l&#39;armoire
Definition: Supervision.h:86
Emplacment de la date de validite.
Definition: Utilisateur.h:32
void placerCasier(Casier *casier)
Définition de la méthode placerCasier.
Definition: Ihm.cpp:87
int compter(QString poidArticle, QString poidTotal, QString tare)
Définition de la méthode compter.
void verifierAuthentificationBadge(QString badge)
Définition de la méthode verifierAuthentificationBadge.
Définition de la classe Communication.
QString get(ChampArticle champ)
Définition de la méthode get.
Definition: Article.cpp:266
void ajouterDonneesArticle(Article *article, QVector< QStringList > &donneesArticle, QStringList &donnees)
Définition de la méthode ajouterDonneesArticle.
Déclaration de la classe Armoire.
Rfid * rfid
association d&#39;un objet Rfid (le lecteur de badge)
Definition: Supervision.h:81
Déclaration de la classe Bdd.
Déclaration de la classe CodeBarre.
Definition: CodeBarre.h:31
void rechercherArticle(QString recherche)
Définition de la méthode rechercherArticle.
void deconnecterUtilisateur()
Méthode qui permet la déconnexion de l&#39;utilisateur.
Definition: Supervision.cpp:76
Déclaration de la classe CodeBare.
QStringList getInformationsArmoire()
Définition de la méthode getInformationsArmoire.
Déclaration de la classe Ihm.
Definition: Ihm.h:65
bool verifierDateValidite(QString stringDateValidite)
[crypterMotDepasse]
bool recupererDonneesArticleParNom(QString nomArticle, int numCasier=0)
Récupère les données d&#39;un article de l&#39;armoire dans la base de données par son nomArticle.
Definition: Article.cpp:103
Supervision(Ihm *parent=nullptr)
Définition du constructeur de la classe Supervision.
Definition: Supervision.cpp:36
La classe Utilisateur gère les données relative à l&#39;utilisateur.
Definition: Utilisateur.h:52
QString extrairePoids(QString trame)
Définition de la méthode extrairePoids.
Déclaration de la classe Supervision.
Definition: Article.h:43
void selectionnerArticle(QString nomArticle)
[Supervision_rechercherArticle]
QStringList recupererDonneesUtilisateur(QString requeteBDD)
[verifierAuthentificationIdentifiant]
bool recuperer(QString requete, QString &donnees)
exécute une requête SQL de type SELECT et récupère un champ d&#39;un seul enregistrement ...
Definition: Bdd.cpp:187
#define PRECISION
Definition: Supervision.h:26
void articlesTrouves(QVector< QStringList >)
La classe Communication permet de communiquer avec le port série.
Definition: Communication.h:46
La classe QObject est la classe de base de tous les objets Qt. Elle permet à ces objets Qt de dispose...
void reponseDemandeDeConnexion(bool, QString)
Definition: Article.h:42
void demarrerCommunicationPort()
Définition de la méthode demarrerCommunicationPort.
int arrondir(QString arrondire)
Définition de la méthode arrondir.
Ihm * ihm
association d&#39;un objet Ihm (fenêtre princiaple de l&#39;application)
Definition: Supervision.h:79
static QVector< QString > recupererNumeroCasierPourNomArticle(QString nomArticle)
Définition de la méthode recupererNumeroCasierPourNomArticle.
Definition: Article.cpp:250
static unsigned int recupererNombreCasiersPourNomArticle(QString nomArticle)
Définition de la méthode recupererNombreCasiersPourNomArticle.
Definition: Article.cpp:218
Déclaration de la classe Utilisateur.
La classe Armoire traite les articles.
Definition: Armoire.h:49
void erreurDepassementQuantite()
bool recupererDonneesArticleParNumeroCasier(QString numeroCasier)
Définition de la méthode recupererDonneesArticleParNumeroCasier.
Definition: Article.cpp:156
static Bdd * getInstance()
Définition méthode getInstance()
Definition: Bdd.cpp:53
Definition: Article.h:33
void envoyerRequetePoids(QString numeroCasier=0)
Définition de la méthode envoyerRequetePoids.
La classe Rfid traite la trame reçue d&#39;un lecteur Rfid.
Definition: Rfid.h:35
Utilisateur * utilisateur
association d&#39;un objet Utilisateur (l&#39;utilisateur authentifié)
Definition: Supervision.h:82