This repository has been archived on 2022-03-31. You can view files and clone it, but cannot push or open issues or pull requests.
GesMag/documentation/documentation.tex

224 lines
12 KiB
TeX
Raw Normal View History

\documentclass{article}
\usepackage[french]{babel} % français
\usepackage[T1]{fontenc} % encodage
\usepackage[hidelinks]{hyperref} % liens cliquable dans la table des matières
\usepackage{graphicx} % images
\usepackage{listingsutf8} % intégration code
\usepackage{xcolor} % couleurs personnalisés
\usepackage{geometry} % change les dimensions de la page
\usepackage{enumitem} % liste personnalisée
\usepackage{amssymb, pifont} % police (todolist)
2021-11-20 00:23:13 +01:00
\renewcommand{\familydefault}{\sfdefault} % police en "sans-serif"
\geometry{ % définition taille pages
a4paper,
left=20mm,
top=20mm
}
2021-11-20 02:50:07 +01:00
% Définition de la liste de choses à faire/faites (https://tex.stackexchange.com/a/502353)
\newlist{todolist}{itemize}{3}
\setlist[todolist]{label=$\square$}
2021-11-20 00:15:59 +01:00
\newcommand{\fait}{\rlap{\raisebox{0.3ex}{\hspace{0.4ex}\tiny \ding{52}}}$\square$}
2021-11-20 18:42:14 +01:00
\newcommand{\faitDifferemment}{\rlap{\raisebox{0.3ex}{\hspace{0.4ex}\scriptsize \ding{56}}}$\square$}
2021-11-29 09:19:32 +01:00
% Définition blocs de codes
\lstset{
breaklines=true,
extendedchars=true,
inputencoding=utf8/latin1
}
% Python definition (c) 1998 Michael Weber
2021-11-20 00:30:55 +01:00
% Définitions supplémentaires (2013) Alexis Dimitriadis
% Modifié par https://tex.stackexchange.com/q/235783 et par moi-même
\definecolor{maroon}{cmyk}{0, 0.87, 0.68, 0.32}
\definecolor{halfgray}{gray}{0.55}
\definecolor{ipython_frame}{RGB}{207, 207, 207}
\definecolor{ipython_bg}{RGB}{247, 247, 247}
\definecolor{ipython_red}{RGB}{186, 33, 33}
\definecolor{ipython_green}{RGB}{0, 128, 0}
\definecolor{ipython_cyan}{RGB}{64, 128, 128}
\definecolor{ipython_purple}{RGB}{170, 34, 255}
\lstdefinelanguage{iPython}{
morekeywords={access,and,break,class,continue,def,del,elif,else,except,exec,finally,for,from,global,if,import,in,is,lambda,not,or,pass,print,raise,return,try,while},
morekeywords=[2]{abs,all,any,basestring,bin,bool,bytearray,callable,chr,classmethod,cmp,compile,complex,delattr,dict,dir,divmod,enumerate,eval,execfile,file,filter,float,format,frozenset,getattr,globals,hasattr,hash,help,hex,id,input,int,isinstance,issubclass,iter,len,list,locals,long,map,max,memoryview,min,next,object,oct,open,ord,pow,property,range,raw_input,reduce,reload,repr,reversed,round,set,setattr,slice,sorted,staticmethod,str,sum,super,tuple,type,unichr,unicode,vars,xrange,zip,apply,buffer,coerce,intern},
sensitive=true,
morecomment=[l]\#,
morestring=[b]',
morestring=[b]",
morecomment=[s]{"""}{"""},
morestring=[s]{'''}{'''},
morestring=[s]{r'}{'},
morestring=[s]{r"}{"},
morestring=[s]{r'''}{'''},
morestring=[s]{r"""}{"""},
morestring=[s]{u'}{'},
morestring=[s]{u"}{"},
morestring=[s]{u'''}{'''},
morestring=[s]{u"""}{"""},
literate=
*{+}{{{\color{ipython_purple}+}}}1
{-}{{{\color{ipython_purple}-}}}1
{*}{{{\color{ipython_purple}$^\ast$}}}1
{/}{{{\color{ipython_purple}/}}}1
{^}{{{\color{ipython_purple}\^{}}}}1
{?}{{{\color{ipython_purple}?}}}1
{!}{{{\color{ipython_purple}!}}}1
{\%}{{{\color{ipython_purple}\%}}}1
{<}{{{\color{ipython_purple}<}}}1
{>}{{{\color{ipython_purple}>}}}1
{|}{{{\color{ipython_purple}|}}}1
{\&}{{{\color{ipython_purple}\&}}}1
{~}{{{\color{ipython_purple}~}}}1
{==}{{{\color{ipython_purple}==}}}2
{<=}{{{\color{ipython_purple}<=}}}2
{>=}{{{\color{ipython_purple}>=}}}2
{+=}{{{+=}}}2
{-=}{{{-=}}}2
{*=}{{{$^\ast$=}}}2
{/=}{{{/=}}}2,
commentstyle=\color{ipython_cyan}\ttfamily,
stringstyle=\color{ipython_red}\ttfamily,
keepspaces=true,
showspaces=false,
showstringspaces=false,
rulecolor=\color{ipython_frame},
frame=single,
frameround={t}{t}{t}{t},
framexleftmargin=6mm,
numbers=left,
numberstyle=\tiny\color{halfgray},
backgroundcolor=\color{ipython_bg},
basicstyle=\scriptsize\ttfamily,
keywordstyle=\color{ipython_green}\ttfamily,
escapechar=,
escapebegin=\color{ipython_green},
}
\title{\href{https://git.kennel.ml/Anri/GesMag}{Projet final Tkinter}}
2021-11-19 21:37:54 +01:00
\author{Anri Kennel\thanks{Numéro d'étudiant : 20010664}\, (L2-A)\\Module Programmation dinterfaces $\cdot$ Paris 8}
\date{Année universitaire 2021-2022}
\begin{document}
\maketitle
\tableofcontents
\begin{center}
\emph{Les explications sont en commentaire du code.}
\end{center}
\clearpage
\section{Consigne}
2021-11-26 13:17:40 +01:00
Ici ce trouve le cahier des charges du programme. Toutes les améliorations, apportés au programme sont rangés à côtés du champs correspondant, en gras.
Pour les éléments ajoutés au programme qui ne rentre dans aucune cases, il y a une catégorie "À savoir" à la fin du cahier des charges qui les précise. Il y a aussi des informations complémentaire par rapport au projet.
2021-11-29 00:27:16 +01:00
\subsection{Dépendances}
Les modules externes utilisés sont :
\begin{itemize}
\item[\textbullet] \texttt{tkinter} pour la GUI
\begin{itemize}
2021-11-29 11:33:57 +01:00
\item[\textopenbullet] \texttt{.ttk} pour la liste déroulante et les lignes qui séparent les cases du tableau
2021-11-29 00:27:16 +01:00
\item[\textopenbullet] \texttt{.messagebox} pour les messages pop-up
\item[\textopenbullet] \texttt{.filedialog} pour la boîte de dialogue du fichier
\end{itemize}
\item[\textbullet] \texttt{sqlite3} pour la base de donnée SQLite
2021-11-30 09:56:10 +01:00
\item[\textbullet] \texttt{datetime} pour la date
\item[\textbullet] \texttt{re} pour le regex
\item[\textbullet] \texttt{csv} pour la gestion du fichier \texttt{CSV}
2021-11-30 09:56:10 +01:00
\item[\textbullet] \texttt{random} pour la génération du stock (prix et quantité)
2021-11-29 00:27:16 +01:00
\end{itemize}
\subsection{Cahier des charges}
\begin{todolist}
\item[\fait] Page de login \texttt{/1.5}
\begin{todolist}
\item[\fait] Nom d'utilisateur ne contient que des lettres et des chiffres
2021-11-20 18:45:03 +01:00
\item[\fait] Mot de passe de minimum 8 caractères dont 1 caractère spécial, une majuscule et une minuscule \textbf{$\Rightarrow$ possibilité d'afficher ou non le mot de passe en clair}
2021-11-20 18:42:14 +01:00
\item[\fait] Un bouton de connexion \textbf{$\Rightarrow$ possibilité aussi d'utiliser la touche \texttt{Entrer} \textit{(pour aller plus vite)} qui permet de se rendre sur l'interface Caissier ou Manager}
\item[\fait] Un bouton pour quitter l'application
\end{todolist}
\item Page de manager (définit par un nom d'utilisateur et un mot de passe) \texttt{/7.5}
\begin{todolist}
2021-11-26 13:17:40 +01:00
\item[\faitDifferemment] Peut ajouter et supprimer un caissier \textbf{$\Rightarrow$ lisiblité accru pour les champs mal renseignés, l'ID n'est pas à renseigné car assigné automatiquent par la base de donnée}
2021-11-20 18:42:14 +01:00
\item[\faitDifferemment] Peut voir la liste des caissiers \textbf{$\Rightarrow$ possibilité d'ouvrir des informations étendues sur un utilisateur, ainsi que de filtrer les utilisateurs (manager et caissiers) mais impossible de tout déselectionner (caissier par défaut)}
2021-11-29 13:56:00 +01:00
\item Un histogramme présentant l'évolution des sommes totales des ventes journalières de la semaine passée d'un utilisateur \textbf{$\Rightarrow$ accessible au double-clique dans la fenêtre des informations étendues d'un utilisateur}
2021-11-20 19:47:25 +01:00
\item[\fait] Un bouton pour vider tous les champs de saisie
2021-11-26 13:17:40 +01:00
\item[\faitDifferemment] Un bouton pour quitter l'application \textbf{$\Rightarrow$ j'ai préféré mettre un bouton pour se déconnecter}
\item[\fait] Un bouton pour se mettre en "mode caissier"
\end{todolist}
2021-11-30 13:54:14 +01:00
\item[\fait] Page de caissier (définit par un identifiant, un nom d'utilisateur, un mot de passe, un nom, un prenom, une date de naissance, une adresse et un code postal) \texttt{/6}
\begin{todolist}
2021-11-26 13:17:40 +01:00
\item[\fait] Afficher le stock disponible
\begin{todolist}
2021-11-26 13:17:40 +01:00
\item[\faitDifferemment] 4 rayons de chacun au moins 10 articles de votre choix (fruits/légumes, boulangerie, boucherie/poissonnerie ou produits d'entretien) \textbf{$\Rightarrow$ toutes les images sont aux dimensions 50x50 et ont étés converties avec le logiciel Gimp}
\item[\faitDifferemment] Au clic sur le produit, l'identifiant, le nom, la quantité en stock et le prix s'affichent \textbf{$\Rightarrow$ tout est affiché directement, pas besoin de cliquer sur le produit, il y a aussi un système de pages pour une meilleur lisibilité (10 éléments par page au maximum)}
\end{todolist}
2021-11-28 12:53:07 +01:00
\item[\fait] Possibilité de rajouter des produits en stock
2021-11-30 13:49:01 +01:00
\item[\fait] Affichage d'un ticket de caisse
\begin{todolist}
2021-11-29 13:12:30 +01:00
\item[\fait] Date de vente
\item[\fait] ID, nom, quantité, prix des produits achetés
\item[\fait] Prix total
2021-11-30 13:49:01 +01:00
\item[\fait] Un bouton pour valider
\end{todolist}
2021-11-30 13:49:01 +01:00
\item[\fait] Interface d'export des statistiques (stock le montant total de vente par jour) \textbf{$\Rightarrow$ export au format \texttt{CSV}}
\end{todolist}
\end{todolist}
Avec à savoir :
\begin{todolist}
2021-11-20 18:42:14 +01:00
\item[\fait] Ergonomie \texttt{/2}
\begin{todolist}
\item[\faitDifferemment] Utilisation de \texttt{Frame} et peu de \texttt{TopLevel}, ainsi qu'une seule fenêtre \texttt{Tk} pour éviter de multiples ouverture/fermeture de fenêtre durant l'utilisation de l'application
\end{todolist}
\item[\fait] Utilisateurs stockés dans la base de donnée \texttt{/2}
\begin{todolist}
2021-11-20 18:42:14 +01:00
\item[\faitDifferemment] Possibilité de recréer la base de donnée automatiquement si elle n'existe plus
2021-11-30 09:56:10 +01:00
\item[\faitDifferemment] Utilisation, en plus de \texttt{SQLite}, d'un fichier \texttt{CSV} pour exporter les statistiques des caissiers, et ainsi pouvoir traiter ces informations dans un tableur (outil externe) à l'avenir
\end{todolist}
2021-11-20 18:42:14 +01:00
\item[\faitDifferemment] Ajout d'autres fonctionnalités \texttt{/1}
\begin{todolist}
2021-11-20 18:46:59 +01:00
\item[\faitDifferemment] J'ai pas vraiment ajouter une toute nouvelle fonctionnalité, mais améliorer ce qui était demandé pour une plus grande souplesse à l'utilisation (cf. les cases cochés avec des \ding{56})
2021-11-20 18:42:14 +01:00
% \item Heure de connexion stricte pour les caissiers
% \item Meilleur caissier (avec le plus de ventes sur la journée/semaine précédente par exemple)
% \item Exporter le ticket de caisse en format image
% \item Chiffrer les mots de passes dans la base de donnée
\end{todolist}
2021-11-20 18:42:14 +01:00
\item[\faitDifferemment] Lisibilité du code
\begin{todolist}
2021-11-20 18:47:41 +01:00
\item[\faitDifferemment] Toutes les fonctions sont commentés et typés (quand possible car j'utilises Python \texttt{3.9.7})
2021-11-20 18:42:14 +01:00
\item[\faitDifferemment] Tous le code est dans une classe et non directement dans le code (donc aucune variable globale)
\item[\faitDifferemment] Plusieurs fichiers pour une meilleur lisibilité
\end{todolist}
2021-11-26 13:17:40 +01:00
\item[\faitDifferemment] Affichage sous forme de tableau
\begin{todolist}
2021-11-28 23:23:06 +01:00
\item[\faitDifferemment] J'ai évité d'utiliser le widget \texttt{Treeview} du module \texttt{ttk} de tkinter car je le trouve que peu pratique/flexible (exemple : impossibilité de mettre des images dans les colonnes du tableau) alors j'ai développé une alternative (cf. l'affiche du stock avec un système de page)
2021-11-26 13:17:40 +01:00
\end{todolist}
\end{todolist}
\clearpage
\section{Code}
2021-11-20 02:53:26 +01:00
\subsection[\texttt{main.py}]{\texttt{main.py}, fichier principal}
\begin{lstinputlisting}[language=iPython]{../main.py}\end{lstinputlisting}
\subsection[\texttt{db.py}]{\texttt{db.py}, gère la communication avec la base de donnée en sa globalité}
\begin{lstinputlisting}[language=iPython]{../db.py}\end{lstinputlisting}
2021-11-20 02:53:26 +01:00
\subsection[\texttt{users.py}]{\texttt{users.py}, implante la base de donnée pour les utilisateurs}
\begin{lstinputlisting}[language=iPython]{../users.py}\end{lstinputlisting}
2021-11-29 14:03:26 +01:00
\subsection[\texttt{stock.py}]{\texttt{stock.py}, implante la base de donnée pour le stock}
\begin{lstinputlisting}[language=iPython]{../stock.py}\end{lstinputlisting}
2021-11-29 14:30:41 +01:00
\subsection[\texttt{stats.py}]{\texttt{stats.py}, implante la gestion des statistiques et son export en format \texttt{CSV}}
2021-11-29 14:11:25 +01:00
\begin{lstinputlisting}[language=iPython]{../stats.py}\end{lstinputlisting}
2021-11-29 14:03:26 +01:00
\end{document}