14 #include <QMessageBox> 15 #include <QCryptographicHash> 86 qDebug() << Q_FUNC_INFO <<
"nbCasiers" << nbCasiers;
87 if(!nbCasiers.isEmpty())
89 for(
int i=0; i < nbCasiers.toInt(); i++)
92 connect(casier, SIGNAL(estOuvert(
int,
bool)),
ihm, SLOT(gererPageScanObjet(
int,
bool)));
109 return informationsArmoire;
130 QString requeteBDD =
"SELECT * from Utilisateur where Badge = '" + badge +
"';";
149 #ifdef CHANGE_PASSWORD_BEFORE 150 QString requete = QString(
"UPDATE Utilisateur SET MotDePasse='%1' WHERE Identifiant='%2'").arg(motDePasse).arg(identifiant);
154 QString requeteBDD =
"SELECT * from Utilisateur where Identifiant = '" + identifiant +
"' && MotDePasse = '" + motDePasse +
"';";
185 if(!motDePasse.isEmpty())
187 motDePasse = QString(QCryptographicHash::hash((motDePasse).toLatin1(), QCryptographicHash::Md5).toHex());
190 #ifdef DEBUG_SUPERVISION 191 qDebug() << Q_FUNC_INFO <<
"Mot de passe crypte" << motDePasse;
205 QDate dateValidite = dateValidite.fromString(stringDateValidite,
"yyyy-MM-dd");
206 QDate dateActuelle = QDate::currentDate();
208 #ifdef DEBUG_SUPERVISION 209 qDebug() <<
"Date actuelle" << dateActuelle;
210 qDebug() <<
"Date validité" << dateValidite;
213 if(dateActuelle <= dateValidite)
230 #ifdef DEBUG_SUPERVISON 231 qDebug() << Q_FUNC_INFO << donnees;
234 if(!donnees.isEmpty())
267 #ifdef DEBUG_SUPERVISION 271 #ifdef SUPERVISION_TEST_POIDS 272 QString trameTest =
"CASIERS;3;2;1745";
285 connect(
armoire, SIGNAL(informationsArmoire(QStringList)),
ihm, SLOT(afficherInformationsArmoire(QStringList)));
288 connect(
ihm, SIGNAL(badgeDetecte(QString)),
rfid, SLOT(traiterBadge(QString)));
289 connect(
rfid, SIGNAL(erreurBadgeInvalide(QString)),
ihm, SLOT(afficherErreurBadge(QString)));
301 connect(
this, SIGNAL(
articlesTrouves(QVector<QStringList>)),
ihm, SLOT(mettreAJourListeArticles(QVector<QStringList>)));
304 connect(
this, SIGNAL(
donneesArticleSelectionne(QVector<QStringList>)),
ihm, SLOT(afficherDonneesArticleSelectionne(QVector<QStringList>)));
308 connect(
ihm, SIGNAL(boutonPrendre(
bool)),
codeBarre, SLOT(prendreOuAjouter(
bool)));
309 connect(
ihm, SIGNAL(boutonAjouter(
bool)),
codeBarre, SLOT(prendreOuAjouter(
bool)));
310 connect(
ihm, SIGNAL(codeBarreObjetScanner(QString)),
codeBarre, SLOT(traiterCodeBarre(QString)));
314 connect(
ihm, SIGNAL(envoyerQuantite(
int)),
codeBarre, SLOT(changerQuantiteObjet(
int)));
328 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";
330 QVector<QStringList> listeArticlesTrouves;
343 #ifdef DEBUG_SUPERVISION 344 qDebug() << Q_FUNC_INFO <<
"Nom article" << nomArticle;
348 QVector<QStringList> donneesArticle;
352 #ifdef DEBUG_SUPERVISION 353 qDebug() << Q_FUNC_INFO <<
"nombreCasiers" << nombreCasiers;
356 if(nombreCasiers > 1)
358 QVector<QString> numeroDesCasiers;
362 for(
int i = 0; i < numeroDesCasiers.size(); i++)
368 if(!donneesArticle.isEmpty())
378 if(!donneesArticle.isEmpty())
393 #ifdef DEBUG_SUPERVISION 394 qDebug() << Q_FUNC_INFO << trame;
402 #ifdef DEBUG_SUPERVISION 410 int articleQuantite = strArticleQuantite.toInt();
412 if(nombreArticle > articleQuantite)
430 #ifdef DEBUG_SUPERVISION 431 qDebug() << Q_FUNC_INFO <<
"Article introuvable !";
445 int intNbArticleAvant = nbArticleAvant.toInt();
447 if(intNbArticleAvant > nbArticleApres)
466 int intNbArticleAvant = nbArticleAvant.toInt();
468 if(intNbArticleAvant > nbArticleApres)
470 return intNbArticleAvant - nbArticleApres;
474 return nbArticleApres - intNbArticleAvant;
487 QString poids = trame.section(
';',3,3);
489 #ifdef DEBUG_SUPERVISION 490 qDebug() << Q_FUNC_INFO <<
"poids:" << poids;
505 QString numCasier = trame.section(
';',2,2);
507 #ifdef DEBUG_SUPERVISION 508 qDebug() << Q_FUNC_INFO <<
"numCasier:" << numCasier;
524 double doublePoidsArticle = poidsArticle.toDouble();
525 double doublePoidsTotal = poidsTotal.toDouble();
526 double doubleTare = tare.toDouble();
530 double doubleNombreArticle = qRound((doublePoidsTotal - doubleTare) / doublePoidsArticle);
531 QString strNombreArticle = QString::number(doubleNombreArticle,
'f',
PRECISION);
532 int nombreArticle = strNombreArticle.toInt();
534 #ifdef DEBUG_SUPERVISION 535 qDebug() << Q_FUNC_INFO <<
"nombreArticle:" << nombreArticle;
538 return nombreArticle;
548 QDate qDate(QDate::currentDate());
549 QString date = qDate.toString(
"yyyy-MM-dd");
551 QTime time(QTime::currentTime());
552 QString heure = time.toString(
"hh:mm:ss");
554 return date +
" " + heure;
568 QString requete =
"INSERT INTO Mouvement(idUtilisateur, idStock, idAction, Quantite, Horodatage) VALUES('" + idUtilisateur +
"', '" + idStock +
"', '" + idAction +
"', '" + quantite +
"', '" + horodatage +
"');";
585 donneesArticle.push_back(donnees);
598 QString requete =
"SELECT idArticle FROM Stock WHERE numeroCasier = "+ numCasier +
";";
603 if(donnees == idArticle)
622 if(numeroCasier == -1)
625 #ifdef DEBUG_SUPERVISION 626 qDebug() << Q_FUNC_INFO <<
"codeBarre" << codeBarre <<
"casier" << numeroCasier;
629 unsigned int quantiteDisponible = this->codeBarre->recupererQuantiteDisponibleParNumeroCasier(QString::number(
casiers[numeroCasier]->getNumero()));
630 int quantite = quantiteDisponible - this->codeBarre->getQuantiteObjet();
631 QString idArticle = QString::number(this->codeBarre->recupererIdArticleAvecCodeBarres(codeBarre));
633 if(
casiers[numeroCasier]->estOuvert())
639 QString strQuantite = QString::number(quantite);
640 QString requete =
"UPDATE Stock SET Disponible = '" + strQuantite +
"' WHERE Stock.idArticle = '" + idArticle +
"'";
644 QString idAction =
"1";
645 QString quantiteMouvement = QString::number(this->codeBarre->getQuantiteObjet());
673 if(numeroCasier == -1)
676 #ifdef DEBUG_SUPERVISION 677 qDebug() << Q_FUNC_INFO <<
"codeBarre" << codeBarre <<
"casier" << numeroCasier;
680 unsigned int quantiteMax = this->codeBarre->recupererQuantiteMaxParNumeroCasier(QString::number(
casiers[numeroCasier]->getNumero()));
681 unsigned int quantiteDisponible = this->codeBarre->recupererQuantiteDisponibleParNumeroCasier(QString::number(
casiers[numeroCasier]->getNumero()));
682 unsigned int quantite = quantiteDisponible + this->codeBarre->getQuantiteObjet();
683 QString idArticle = QString::number(this->codeBarre->recupererIdArticleAvecCodeBarres(codeBarre));
685 if(
casiers[numeroCasier]->estOuvert())
689 if(quantite <= quantiteMax)
691 QString strQuantite = QString::number(quantite);
692 QString requete =
"UPDATE Stock SET Disponible = '" + strQuantite +
"' WHERE Stock.idArticle = '" + idArticle +
"'";
696 QString idAction =
"2";
697 QString quantiteMouvement = QString::number(this->codeBarre->getQuantiteObjet());
723 for(
int i=0; i <
casiers.size(); i++)
739 QString strNumeroCasier = QString::number(numeroCasier);
740 QString requete =
"SELECT idStock FROM Stock WHERE numeroCasier = " + strNumeroCasier +
";";
void erreurQuantiteTropElevee()
void verifierAuthentificationIdentifiant(QString identifiant, QString motDePasse)
Définition de la méthode verifierAuthentificationIdentifiant.
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.
La classe Article traite les articles.
unsigned int comptageAutomatiqueQuantite(QString nbArticleAvant, int nbArticleApres)
Définition de la méthode comptageAutomatiqueQuantite.
void mettreAJourMouvement(QString idUtilisateur, QString idStock, QString idAction, QString quantite)
Définition de la méthode mettreAJourMouvement.
Déclaration de la classe Rfid.
QString getIdentifiantUtilisateur()
Définition de la méthode getIdentifiantUtilisateur.
int rechercherCasierOuvert()
Définition de la méthode rechercherCasierOuvert.
void prendreObjetAvecCodeBarre(QString codeBarre)
Définition de la méthode prendreObjetAvecCodeBarre.
bool executer(QString requete)
exécute une requête SQL de type UPDATE, INSERT et DELETE
unsigned int comptageAutomatiqueAjouterOuPrendre(QString nbArticleAvant, int nbArticleApres)
Définition de la méthode comptageAutomatiqueAjouterOuPrendre.
Armoire * armoire
association d'un objet Armoire
void connecterSignauxSlots()
Définition de la méthode connecterSignauxSlots.
bool verifierDonneesUtilisateur(QStringList &donnees)
Définition de la méthode verifierDonneesUtilisateur.
~Supervision()
Définition du destructeur de Supervision.
Déclaration de la classe Ihm.
CodeBarre * codeBarre
association d'un objet CodeBarre
Communication * communication
association d'un objet Communication
QString getNbCasiers() const
Définition de la méthode getNbCasiers.
bool connecter()
Définition méthose connecter()
void erreurAucunArticleAvecCodeBarre()
void mettreAJourQuantite(QString quantite)
Définition de la méthode mettreAJourQuantite.
void traiterTramePoids(QString trame)
Définition de la méthode traiterTramePoids.
#define MESSAGE_ERREUR_UTILISATEUR_DATE_NON_VALIDE
La classe Casier gère le casier contenant des articles.
Bdd * bdd
association d'un objet Bdd (accès à la base de données)
QString extraireNumeroCasier(QString trame)
Définition de la méthode extraireNumeroCasier.
void crypterMotDepasse(QString &motDePasse)
Définition de la méthode crypterMotDepasse.
void placerCasiers(const QVector< Casier *> &casiers, int fenetre)
#define MESSAGE_ERREUR_UTILISATEUR_NON_VALIDE
QStringList getInformations()
Définition de la méthode getInformations.
void connecterUtilisateur(QStringList &donnees)
Définition de la méthode connecterUtilisateur.
QVector< Casier * > casiers
les casiers de l'armoire
Emplacment de la date de validite.
QString getIdUtilisateur()
Définition de la méthode getIdUtilisateur.
int compter(QString poidArticle, QString poidTotal, QString tare)
Définition de la méthode compter.
void erreurArticleInsuffisants()
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.
void ajouterDonneesArticle(Article *article, QVector< QStringList > &donneesArticle, QStringList &donnees)
Définition de la méthode ajouterDonneesArticle.
bool verifierArticlePresentDansCasier(QString numCasier, QString idArticle)
Définition de la méthode verifierArticlePresentDansCasier.
Déclaration de la classe Armoire.
Rfid * rfid
association d'un objet Rfid (le lecteur de badge)
Déclaration de la classe Bdd.
Déclaration de la classe CodeBarre.
void rechercherArticle(QString recherche)
Définition de la méthode rechercherArticle.
void deconnecterUtilisateur()
Méthode qui permet la déconnexion de l'utilisateur.
Déclaration de la classe CodeBare.
QStringList getInformationsArmoire()
Définition de la méthode getInformationsArmoire.
Déclaration de la classe Ihm.
bool verifierDateValidite(QString stringDateValidite)
Définition de la méthode verifierDateValidite.
bool recupererDonneesArticleParNom(QString nomArticle, int numCasier=0)
Récupère les données d'un article de l'armoire dans la base de données par son nomArticle.
Supervision(Ihm *parent=nullptr)
Définition du constructeur de la classe Supervision.
La classe Utilisateur gère les données relative à l'utilisateur.
QString extrairePoids(QString trame)
Définition de la méthode extrairePoids.
Déclaration de la classe Supervision.
void ajouterObjetAvecCodeBarre(QString codeBarre)
Définition de la méthode ajouterObjetAvecCodeBarre.
void selectionnerArticle(QString nomArticle)
Définition de la méthode selectionnerArticle.
QStringList recupererDonneesUtilisateur(QString requeteBDD)
Définition de la méthode recupererDonneesUtilisateur.
bool recuperer(QString requete, QString &donnees)
exécute une requête SQL de type SELECT et récupère un champ d'un seul enregistrement ...
void articlesTrouves(QVector< QStringList >)
La classe Communication permet de communiquer avec le port série.
void reponseDemandeDeConnexion(bool, QString)
void demarrerCommunicationPort()
Définition de la méthode demarrerCommunicationPort.
QVector< Casier * > getCasiers()
Définition de la méthode getCasiers.
Ihm * ihm
association d'un objet Ihm (fenêtre princiaple de l'application)
static QVector< QString > recupererNumeroCasierPourNomArticle(QString nomArticle)
Définition de la méthode recupererNumeroCasierPourNomArticle.
static unsigned int recupererNombreCasiersPourNomArticle(QString nomArticle)
Définition de la méthode recupererNombreCasiersPourNomArticle.
Déclaration de la classe Utilisateur.
La classe Armoire traite les articles.
void erreurDepassementQuantite()
bool recupererDonneesArticleParNumeroCasier(QString numeroCasier)
Définition de la méthode recupererDonneesArticleParNumeroCasier.
static Bdd * getInstance()
Définition méthode getInstance()
La classe Rfid traite la trame reçue d'un lecteur Rfid.
QString recupererHorodatage()
Définition de la méthode recupererHorodatage.
void erreurAucunCasierOuvert()
Utilisateur * utilisateur
association d'un objet Utilisateur (l'utilisateur authentifié)
QString recupererIdStockAvecNumeroCasier(int numeroCasier)
Définition de la méthode recupererIdStockAvecNumeroCasier.