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

285 lines
14 KiB
TeX
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

\documentclass{article}
\usepackage[T1]{fontenc} % encodage
\usepackage[hidelinks]{hyperref} % liens cliquable dans la table des matières
\usepackage{graphicx} % images
\usepackage{subfigure} % deux images côte à côte
\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)
\renewcommand{\familydefault}{\sfdefault} % police en "sans-serif"
\geometry{ % définition taille pages
a4paper,
left=20mm,
top=20mm
}
% Définition de la liste de choses à faire/faites (https://tex.stackexchange.com/a/502353)
\newlist{todolist}{itemize}{3}
\setlist[todolist]{label=$\square$}
\newcommand{\fait}{\rlap{\raisebox{0.3ex}{\hspace{0.4ex}\tiny \ding{52}}}$\square$}
\newcommand{\faitDifferemment}{\rlap{\raisebox{0.3ex}{\hspace{0.4ex}\scriptsize \ding{56}}}$\square$}
% Définition blocs de codes
\lstset{
breaklines=true,
extendedchars=true,
inputencoding=utf8/latin1
}
% Python definition (c) 1998 Michael Weber
% 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},
}
\renewcommand{\contentsname}{Table des matières} % traduction en FR
\title{\href{https://git.kennel.ml/Anri/GesMag}{Projet final Tkinter}}
\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}
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.
\subsection{Dépendances}
Les modules externes utilisés sont :
\begin{itemize}
\item[\textbullet] \texttt{tkinter} pour la GUI
\begin{itemize}
\item[\textopenbullet] \texttt{.ttk} pour la liste déroulante et les lignes qui séparent les cases du tableau
\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
\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}
\item[\textbullet] \texttt{random} pour la génération du stock (prix et quantité)
\end{itemize}
\subsection{Cahier des charges}
\begin{todolist}
\item[\fait] Page de login \texttt{/1.5}
\begin{figure}[!ht]
\centering
\includegraphics[height=0.4\textheight]{img/login.png}
\caption{Page de login}
\end{figure}
\begin{todolist}
\item[\fait] Nom d'utilisateur ne contient que des lettres et des chiffres
\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}
\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[\fait] Page de manager (définit par un nom d'utilisateur et un mot de passe) \texttt{/7.5}
\begin{figure}[!ht]
\centering
\includegraphics[height=0.3\textheight]{img/manager.png}
\caption{Page du Manager}
\end{figure}
\begin{todolist}
\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}
\begin{figure}[!ht]
\centering
\begin{minipage}{.5\textwidth}
\centering
\includegraphics[height=0.12\textheight]{img/add_cashier.png}
\caption{Ajout d'un caissier}
\end{minipage}%
\begin{minipage}{.5\textwidth}
\centering
\includegraphics[height=0.15\textheight]{img/remove_cashier.png}
\caption{Suppression d'un caissier}
\end{minipage}
\end{figure}
\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)}
\newpage
\item[\fait] 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}
\begin{figure}[!ht]
\centering
\includegraphics[height=0.3\textheight]{img/user_info.png}
\caption{Informations étendues sur un utilisateur}
\end{figure}
\item[\fait] Un bouton pour vider tous les champs de saisie
\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}
\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{figure}[!ht]
\hfill
\subfigure[En tant que Caissier]{\includegraphics[height=0.2\textheight]{img/cashier.png}}
\hfill
\subfigure[En tant que Manager]{\includegraphics[height=0.2\textheight]{img/cashier_as_manager.png}}
\hfill
\caption{Page du Caissier}
\end{figure}
\begin{todolist}
\item[\fait] Afficher le stock disponible
\begin{todolist}
\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}
\newpage
\item[\fait] Possibilité de rajouter des produits en stock
\begin{figure}[!ht]
\centering
\includegraphics[height=0.3\textheight]{img/add_stock.png}
\caption{Ajout d'éléments au stock}
\end{figure}
\item[\fait] Affichage d'un ticket de caisse
\begin{figure}[!ht]
\centering
\includegraphics[height=0.3\textheight]{img/receipt.png}
\caption{Ticket de caisse avec 2 éléments au panier}
\end{figure}
\begin{todolist}
\item[\fait] Date de vente
\item[\fait] ID, nom, quantité, prix des produits achetés
\item[\fait] Prix total
\item[\fait] Un bouton pour valider
\end{todolist}
\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}
\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}
\item[\faitDifferemment] Possibilité de recréer la base de donnée automatiquement si elle n'existe plus
\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}
\item[\faitDifferemment] Ajout d'autres fonctionnalités \texttt{/1}
\begin{todolist}
\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})
\end{todolist}
\item[\faitDifferemment] Lisibilité du code
\begin{todolist}
\item[\faitDifferemment] Toutes les fonctions sont commentés et typés (quand possible car j'utilises Python \texttt{3.9.7})
\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}
\item[\faitDifferemment] Affichage sous forme de tableau
\begin{todolist}
\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)
\end{todolist}
\end{todolist}
\clearpage
\section{Code}
\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}
\subsection[\texttt{users.py}]{\texttt{users.py}, implante la base de donnée pour les utilisateurs}
\begin{lstinputlisting}[language=iPython]{../users.py}\end{lstinputlisting}
\subsection[\texttt{stock.py}]{\texttt{stock.py}, implante la base de donnée pour le stock}
\begin{lstinputlisting}[language=iPython]{../stock.py}\end{lstinputlisting}
\subsection[\texttt{stats.py}]{\texttt{stats.py}, implante la gestion des statistiques et son export en format \texttt{CSV}}
\begin{lstinputlisting}[language=iPython]{../stats.py}\end{lstinputlisting}
\end{document}