2021-11-29 20:24:27 +01:00
|
|
|
import csv
|
|
|
|
|
2021-11-30 00:02:57 +01:00
|
|
|
from datetime import date, timedelta, datetime
|
2021-11-29 20:24:27 +01:00
|
|
|
|
2021-11-29 14:11:25 +01:00
|
|
|
from users import Utilisateurs
|
|
|
|
|
|
|
|
class Stats(Utilisateurs):
|
2021-11-29 14:21:23 +01:00
|
|
|
"""Gère les statistiques et son export en format CSV."""
|
2021-11-30 00:02:57 +01:00
|
|
|
def __init__(self):
|
|
|
|
self.formatDate = "%Y/%m/%d"
|
|
|
|
|
|
|
|
def datesDisponibles(self) -> list:
|
|
|
|
"""Renvoie les dates disponibles pour l'entête du fichier `CSV`."""
|
|
|
|
datesPossibles = []
|
|
|
|
dateAujourdHui = date.today() - timedelta(days=7)
|
|
|
|
for _ in range(0, 8):
|
|
|
|
datesPossibles.append(dateAujourdHui.strftime(self.formatDate))
|
|
|
|
dateAujourdHui = dateAujourdHui + timedelta(days=1)
|
|
|
|
return datesPossibles
|
|
|
|
|
2021-11-29 21:01:00 +01:00
|
|
|
def creationCSV(self, force: bool = False):
|
|
|
|
"""
|
|
|
|
Créer le fichier `CSV` qui stockera les statistiques pour tous les utilisateurs.
|
|
|
|
|
|
|
|
Possibilité de forcer la création (càd même si le fichier existe déjà) en renseignant
|
|
|
|
`force = True`
|
|
|
|
"""
|
|
|
|
if not self.fichierExiste("stats.csv") or force:
|
2021-11-29 20:24:27 +01:00
|
|
|
with open("stats.csv", 'w') as f:
|
2021-11-29 22:10:03 +01:00
|
|
|
fichier = csv.writer(f)
|
2021-11-30 00:02:57 +01:00
|
|
|
fichier.writerow(["id", "pseudo"] + self.datesDisponibles())
|
2021-11-29 14:11:25 +01:00
|
|
|
|
|
|
|
def miseAJourStatsUtilisateur(self, utilisateurID: int, prix: float):
|
|
|
|
"""
|
|
|
|
Récupère le prix d'une transaction et l'ajoute au total d'un utilisateur.
|
|
|
|
|
2021-11-29 14:21:23 +01:00
|
|
|
- si aucune date n'est précisé dans la base de donnée d'un utilisateur,
|
|
|
|
alors il n'a jamais enregistré de statistiques et on procède normalement
|
|
|
|
- si une date est déjà renseigné :
|
|
|
|
- si la date correspond à la date d'aujourd'hui, on procède normalement
|
|
|
|
- si la date ne correspond pas, on enregistre ce qu'il y a dans la base de donnée
|
2021-11-29 14:11:25 +01:00
|
|
|
dans un fichier `CSV`, ensuite on écrase l'ancien prix par `0` et la date par celle
|
|
|
|
d'aujourd'hui, ensuite on procède normalement
|
|
|
|
|
2021-11-29 14:21:23 +01:00
|
|
|
Procéder normalement consiste à ajouter le prix au prix totale stocké dans la base de donnée.
|
|
|
|
"""
|
2021-11-30 00:02:57 +01:00
|
|
|
self.miseAJourDatesCSV() # met à jour les dates du fichier `CSV`
|
|
|
|
aujourdHui = date.today().strftime(self.formatDate)
|
2021-11-29 21:01:00 +01:00
|
|
|
|
2021-11-30 00:02:57 +01:00
|
|
|
# Mets-à-jour le `CSV` avec le nouveau prix...
|
|
|
|
# TODO
|
2021-11-29 14:21:23 +01:00
|
|
|
|
2021-11-29 22:10:03 +01:00
|
|
|
def exporteCSV(self, chemin: str, utilisateurID: int):
|
2021-11-29 14:21:23 +01:00
|
|
|
"""
|
|
|
|
Exporte les statistiques d'un utilisateur dans un fichier `CSV`.
|
2021-11-29 22:10:03 +01:00
|
|
|
- N'exporte que les statistiques du jour.
|
2021-11-29 14:11:25 +01:00
|
|
|
"""
|
2021-11-29 22:10:03 +01:00
|
|
|
donnees = self.recuperationDonneesCSV(utilisateurID)
|
2021-11-30 00:02:57 +01:00
|
|
|
aujourdHui = date.today().strftime(self.formatDate)
|
2021-11-29 22:10:03 +01:00
|
|
|
with open(chemin, 'w') as f:
|
|
|
|
fichier = csv.writer(f)
|
|
|
|
fichier.writerow(["ID Utilisateur", f"Totales des ventes du jour ({aujourdHui})"])
|
|
|
|
if len(donnees) > 0: # si il y a des données enregistrées
|
|
|
|
fichier.writerow([utilisateurID, donnees[aujourdHui]])
|
|
|
|
else:
|
|
|
|
fichier.writerow([utilisateurID, "Aucune ventes enregistrée"])
|
|
|
|
|
|
|
|
def recuperationDonneesCSV(self, utilisateurID: int) -> dict:
|
|
|
|
"""Renvoie les informations contenu dans le fichier `CSV` globale."""
|
|
|
|
with open("stats.csv", 'r') as f:
|
|
|
|
return list(csv.DictReader(f))
|
2021-11-29 20:24:27 +01:00
|
|
|
|
|
|
|
def miseAJourDatesCSV(self):
|
|
|
|
"""Mets-à-jour les dates trop anciennes du fichier globales `CSV`."""
|
2021-11-30 00:02:57 +01:00
|
|
|
besoinDeMofication = False
|
2021-11-29 20:24:27 +01:00
|
|
|
with open("stats.csv", 'r') as f:
|
2021-11-30 00:02:57 +01:00
|
|
|
fichier = list(csv.reader(f))
|
|
|
|
if len(fichier) == 1: # si fichier vide (que l'entête)
|
|
|
|
self.creationCSV(True) # on recréer le fichier dans le doute (avec les bonnes dates)
|
|
|
|
else:
|
|
|
|
index = 2 # variable qui permet de savoir quel index on regarde (on commence à 2 car on ignore les 2 premières valeurs [id et pseudo])
|
|
|
|
mauvaisIndex = [] # liste qui va stocker les index trop vieux (> 1 semaine)
|
|
|
|
datesPresentes = [] # liste qui stock les dates valides présentes dans le fichier (< 1 semaine)
|
|
|
|
for dateFichier in fichier[0][index:]: # on regarde toutes les dates du fichier
|
|
|
|
if (date.today() - datetime.strptime(dateFichier, self.formatDate).date()).days > 7: # si trop vieux
|
|
|
|
mauvaisIndex.append(index) # on ajoute l'index à la liste
|
|
|
|
besoinDeMofication = True
|
|
|
|
else:
|
|
|
|
datesPresentes.append(dateFichier) # on ajoute la date à la liste
|
|
|
|
index += 1
|
|
|
|
|
|
|
|
if not besoinDeMofication: # vérification si on a besoin de rien faire
|
|
|
|
return # on quitte la fonction
|
|
|
|
|
|
|
|
datesPossible = [date for date in self.datesDisponibles() if date not in datesPresentes] # liste des dates possibles à rajouter
|
|
|
|
for idx in mauvaisIndex: # pour tous les mauvais index
|
|
|
|
for numLigne, ligne in enumerate(fichier): # on regarde toutes les lignes du fichier
|
|
|
|
if idx < len(ligne): # s'il y a un élément dans la ligne à l'index donnée ou si elle est vide de toute façon
|
|
|
|
if numLigne == 0: # si c'est la ligne d'entête
|
|
|
|
ligne[idx] = datesPossible[0] # on change la ligne avec la nouvelle date
|
|
|
|
else: # si c'est une ligne de donnée
|
|
|
|
ligne[idx] = '' # on change la ligne avec une valeur vide
|
|
|
|
fichier[numLigne] = ligne # on applique les changements
|
|
|
|
if besoinDeMofication: # vérification si on a besoin de faire des changements
|
|
|
|
with open("stats.csv", 'w') as f: # on applique les changements
|
|
|
|
ecriture = csv.writer(f)
|
|
|
|
ecriture.writerows(fichier)
|