add global histogram who show the addition of all the sells of all the cashier on the main manager page

This commit is contained in:
Mylloon 2021-12-02 16:59:51 +01:00
parent b8a4b91b9f
commit 574e3eb357
3 changed files with 72 additions and 56 deletions

BIN
documentation/img/manager.png (Stored with Git LFS)

Binary file not shown.

99
main.py
View file

@ -599,7 +599,7 @@ class GesMag:
showerror(f"Erreur {self.nomApp}", "Vous ne pouvez pas accéder à cette interface.") showerror(f"Erreur {self.nomApp}", "Vous ne pouvez pas accéder à cette interface.")
return return
self.parent.title(f"Manager {manager['nom']} {manager['prenom']} {self.nomApp}") self.parent.title(f"Manager {manager['nom']} {manager['prenom']} {self.nomApp}")
self.dimensionsFenetre(self.parent, 580, 310) self.dimensionsFenetre(self.parent, 580, 530)
# Suppresssion de la dernière Frame # Suppresssion de la dernière Frame
self.f.destroy() self.f.destroy()
@ -767,6 +767,44 @@ class GesMag:
Button(enfant, text="Supprimer", command=___suppressionUtilisateur).grid(column=0, row=8, columnspan=3, sticky='w') Button(enfant, text="Supprimer", command=___suppressionUtilisateur).grid(column=0, row=8, columnspan=3, sticky='w')
Button(enfant, text="Quitter", command=enfant.destroy).grid(column=0, row=8, columnspan=3, sticky='e') Button(enfant, text="Quitter", command=enfant.destroy).grid(column=0, row=8, columnspan=3, sticky='e')
def __actualisationCanvas(canvas: Canvas, donnees: dict) -> None:
"""Affiche l'histogramme des vente d'un utilisateur dans un canvas."""
if len(donnees) <= 0:
canvas.create_text(10, 10, anchor='w', text="Aucun résultat récemment enregistré")
else:
# Les dates dans le fichier CSV ne sont pas dans l'ordre
# On retire l'ID et le pseudo du dictionnaire si présent dedans
donnees.pop("id", None)
donnees.pop("pseudo", None)
ecart = 10
couleurs = [
"CadetBlue3",
"HotPink2",
"IndianRed1",
"MediumPurple2",
"burlywood2",
"brown3",
"chocolate1",
"goldenrod2"
]
# On récupère la plus grosse vente
maxVente = 0 # par défaut la meilleur vente est de 0
for prix in donnees.values():
prix = float(prix)
if prix > maxVente: # si on trouve une valeure plus grande
maxVente = prix
canvas.create_text(3, 190, anchor='w', text="", font=("Arial", 7)) # affichage de la devise
for date in sorted(donnees.keys()): # on regarde les dates dans l'ordre
# Affichage de la date
canvas.create_text(ecart + 10, 60, anchor='w', text=date, font=("Arial", 8), angle=90)
# Affichage de la barre
hauteur = 190 - (float(donnees[date]) * 100) / maxVente # calcul de la hauteur en fonction de la plus grosse vente
# On fait `- 20` au résultat pour allonger la barre, aussi on met une barre de `2` pixel quand valeur petite
canvas.create_rectangle(ecart, 180, ecart + 15, hauteur - 20 if hauteur < 180 else 178, fill=couleurs.pop())
# Affichage du montant
canvas.create_text(ecart, 190, anchor='w', text=str(donnees[date]).replace('.', ','), font=("Arial", 7))
ecart += 33
def __afficherInformationsUtilisateur(_) -> None: def __afficherInformationsUtilisateur(_) -> None:
"""Permet d'afficher les informations d'un utilisateur""" """Permet d'afficher les informations d'un utilisateur"""
element = listeUtilisateurs.curselection() element = listeUtilisateurs.curselection()
@ -798,55 +836,11 @@ class GesMag:
frameSuivi = LabelFrame(enfant, text="Histogramme des ventes", font=self.font) frameSuivi = LabelFrame(enfant, text="Histogramme des ventes", font=self.font)
frameSuivi.grid(column=1, row=0, sticky="ns", padx=5) frameSuivi.grid(column=1, row=0, sticky="ns", padx=5)
def ___actualisationCanvas() -> None: histogrammeUtilisateur = Canvas(frameSuivi, width=270, height=200)
"""Affiche l'histogramme des vente d'un utilisateur dans un canvas.""" histogrammeUtilisateur.grid()
donnees = Stats().recuperationDonneesCSV(utilisateur['id'])
if len(donnees) <= 0:
histogramme.create_text(10, 10, anchor='w', text="Aucun résultat récemment enregistré")
else:
# Les dates dans le fichier CSV ne sont pas dans l'ordre
# On retire l'ID et le pseudo du dictionnaire
donnees.pop("id")
donnees.pop("pseudo")
ecart = 10
couleurs = [
"CadetBlue3",
"HotPink2",
"IndianRed1",
"MediumPurple2",
"burlywood2",
"brown3",
"chocolate1",
"goldenrod2"
]
# On remplace tous les prix `None` par `0.` (au cas où il y est des valeurs vide dans le `CSV`) donneesUtilisateur = Stats().recuperationDonneesCSV(utilisateur['id'])
for date, prix in donnees.items(): __actualisationCanvas(histogrammeUtilisateur, donneesUtilisateur)
if prix == None:
donnees[date] = 0.
# On récupère la plus grosse vente
maxVente = 0 # par défaut la meilleur vente est de 0
for prix in donnees.values():
prix = float(prix)
if prix > maxVente: # si on trouve une valeure plus grande
maxVente = prix
for date in sorted(donnees.keys()): # on regarde les dates dans l'ordre
# Affichage de la date
histogramme.create_text(ecart + 10, 60, anchor='w', text=date, font=("Arial", 8), angle=90)
# Affichage de la barre
hauteur = 190 - (float(donnees[date]) * 100) / maxVente # calcul de la hauteur en fonction de la plus grosse vente
# On fait `- 20` au résultat pour allonger la barre, aussi on met une barre de `2` pixel quand valeur petite
histogramme.create_rectangle(ecart, 180, ecart + 15, hauteur - 20 if hauteur < 180 else 178, fill=couleurs.pop())
# Affichage du montant
histogramme.create_text(ecart, 190, anchor='w', text=donnees[date], font=("Arial", 7))
ecart += 33
histogramme = Canvas(frameSuivi, width=270, height=200)
histogramme.grid()
___actualisationCanvas()
Button(enfant, text="Quitter", command=enfant.destroy).grid(column=0, row=1, columnspan=2) Button(enfant, text="Quitter", command=enfant.destroy).grid(column=0, row=1, columnspan=2)
@ -926,6 +920,13 @@ class GesMag:
Button(self.f, text="Passer en mode caissier", font=self.font, command=lambda: self._interfaceCaissier(id)).grid(column=0, row=6, columnspan=3, pady=10) Button(self.f, text="Passer en mode caissier", font=self.font, command=lambda: self._interfaceCaissier(id)).grid(column=0, row=6, columnspan=3, pady=10)
# Histogramme global
histogrammeUtilisateur = Canvas(self.f, width=270, height=200)
histogrammeUtilisateur.grid(column=0, row=7, columnspan=3)
donneesGlobales = Stats().recuperationDonneesCSV()
__actualisationCanvas(histogrammeUtilisateur, donneesGlobales)
if __name__ == "__main__": if __name__ == "__main__":
"""Application "GesMag" pour le module de Programmation d'interfaces (2021-2022)""" """Application "GesMag" pour le module de Programmation d'interfaces (2021-2022)"""
""" """

View file

@ -99,11 +99,26 @@ class Stats():
else: else:
fichier.writerow([utilisateurID, "Aucune ventes enregistrée"]) fichier.writerow([utilisateurID, "Aucune ventes enregistrée"])
def recuperationDonneesCSV(self, utilisateurID: int) -> dict: def recuperationDonneesCSV(self, utilisateurID: int = None) -> dict:
"""Renvoie les informations contenu dans le fichier `CSV` globale.""" """
Renvoie les informations contenu dans le fichier `CSV` globale.
Si un argument est renseignée pour `utilisateurID` alors seul l'utilisateur
renseigné sera renvoyé.
"""
self.miseAJourDatesCSV() # met à jour les dates du fichier `CSV` self.miseAJourDatesCSV() # met à jour les dates du fichier `CSV`
with open("stats.csv", 'r') as f: with open("stats.csv", 'r') as f:
fichier = list(csv.DictReader(f)) # lecture du fichier sous forme d'une liste de dictionnaire fichier = list(csv.DictReader(f)) # lecture du fichier sous forme d'une liste de dictionnaire
if utilisateurID == None: # si on renvoie les stats globales
dates = dict.fromkeys(self.datesDisponibles(), 0.)
for date in dates:
for utilisateur in fichier:
if utilisateur[date] == None: # On remplace tous les prix `None` par `0.`
utilisateur[date] = 0.
dates[date] += float(utilisateur[date])
return dates
else: # si on renvoie les stats spécifique à un utilisateur
for utilisateur in fichier: # on regarde tous les utilisateurs stockés dans le fichier for utilisateur in fichier: # on regarde tous les utilisateurs stockés dans le fichier
if utilisateur["id"] == str(utilisateurID): # si utilisateur trouvé if utilisateur["id"] == str(utilisateurID): # si utilisateur trouvé
return utilisateur # renvoie des infos de l'utilisateur return utilisateur # renvoie des infos de l'utilisateur