%
%	TEMPLATE POUR LES DOSSIERS DE RH 
%
\documentclass[a4paper,10pt,titlepage]{article}
\usepackage[latin1]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[frenchb]{babel}
\usepackage{textcomp}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{slashbox}
\usepackage{mathrsfs}
\usepackage{hyperref}
\usepackage{pdfpages}
\usepackage{tgheros}
%\renewcommand*\familydefault{\sfdefault} %% Only if the base font of the document is to be sans serif
\usepackage[T1]{fontenc}
\usepackage{color}
\makeatletter
\def\thickhrulefill{\leavevmode \leaders \hrule height 1pt\hfill \kern \z@}
\renewcommand{\maketitle}{
\begin{titlepage}%
    \let\footnotesize\small
    \let\footnoterule\relax
    \parindent \z@
    \reset@font
    \vskip 10\p@
    \hbox{\mbox{%
        \hspace{4pt}%
       % \fbox{\includegraphics[width=3em]{eisti.png}}%
        \hspace{4pt}
        }%
      \vrule depth 0.9\textheight%
      \mbox{\hspace{2em}}
      \vtop{% %%%%%%%%%%%%%%%%%%
        \vskip 40\p@
        \begin{flushleft}
          \Large \@author \par
        \end{flushleft}
        \vskip 80\p@
        \begin{flushleft}
          \huge \bfseries \@title \par
        \end{flushleft}
        \vskip 240\p@
        \begin{flushleft}
          \large \@date \par
        \end{flushleft}
        \vfil
        }}
  \end{titlepage}%
  \setcounter{footnote}{0}%
}
\makeatother
\author{Vincent Alves\\Pierre Merlin d'Estreux de Beaugrenier\\Thibault Gimenez\\Benjamin Legrand}
\title{Projet Génie Logiciel 2: Livrable Final}

\begin{document}

\maketitle
\newpage
\thispagestyle{empty}
\mbox{}
%\newpage
%\section*{Remerciements}
%Nous tenons à remercier toute l'équipe éducative qui nous a encadrée durant ce projet.
\newpage
\setcounter{page}{1}
\tableofcontents
\newpage
\section{Introduction}
\large
Ce projet Génie Logiciel 2 que l'on nous a assigné doit aboutir à la réalisation d'un gestionnaire de QCM.\\
Le but du projet a été de développer un logiciel de gestion et de traitement de QCM : Questionnaires à choix multiples. Ce logiciel est destiné à une école et a pour but d'évaluer les élèves sur des modules en leur faisant passer des QCM. Il a également pour but de donner le ressenti des élèves à travers des QCM sur les modules.\\
L'équipe en charge de ce projet est formée de Pierre Merlin d'Estreux de Beaugrenier, Thibault Gimenez, Benjamin Legrand et Vincent Alves.\\

Dans ce document, nous rappellerons brièvement l'analyse des besoins du client que nous avions effectuée, puis parlerons de notre implémentation de cette analyse en java.
\newpage
\section{Rappel de l'analyse des besoins}
En se basant sur les demandes du client, nous avons établi les listes de besoins suivantes: 
\subsection{Besoins fonctionnels}

\begin{itemize}

\item[\textbullet]{Trois types d'utilisateurs : L'administrateur, les professeurs, et les élèves. 
	\begin{enumerate} 
	\item[-]{Créer des niveaux d'accès différents pour les trois types d'utilisateur: L'administrateur peut accéder à plus de ressources que le professeur, qui  peut accéder à plus de ressources que l'élève.} 
	\end{enumerate}}	
\item[\textbullet]{L'administrateur peut définir les utilisateurs et les promotions. Les promotions sont des listes d'élèves. Les élèves sont définis par leur nom et prénom.}\\
\item[\textbullet]{L'administrateur peut définir les modules enseignés à l'école par leur nom, la liste des modules prérequis et le syllabus du module.}\\
\item[\textbullet]{Un professeur peut créer des QCM, qui sont un ensemble de questions avec un libellé accompagné d'une liste non vide de réponses fermées.			\begin{enumerate} 
	\item{Les QCM définis peuvent être privés(utilisable par le professeur uniquement) ou publics(utilisable par tous les professeurs)} 
	\item{Chaque réponse d'un QCM est définie par un libellé et une information précisant si elle est vraie ou fausse.} \\
	\end{enumerate}}	
\item[\textbullet]{Un professeur peut créer des sessions de QCM. Une session est définie par ses dates de début/fin (attribut de la session) ainsi que le module et la promotion auxquelles elle est associée.} 
	\begin{enumerate}
	\item{Un professeur qui a créé une session de QCM peut consulter à tout moment les résultats partiels(si elle n'est pas terminée) ou définitifs de cette session. Il peut voir les résultats de chaque élève et les statistiques.} 
	\item{Les résultats demandés par le professeur peuvent être les scores individuels des élèves participants, ou des statistiques sur l'ensemble des élèves : Moyenne, écart-type, fréquence de bonnes réponses par question.}
	\end{enumerate}
\item[\textbullet]{On doit pouvoir connaître la liste des modules qu'enseigne un professeur.}\\

\item[\textbullet]{Un élève peut répondre à un QCM s'il est inscrit à la session et si la session est ouverte.}
	\begin{enumerate}
	\item{Un élève peut refaire une session de QCM tant qu'il n'a pas atteint un nombre de répétitions précisé par le professeur.}
	\item{Un élève peut consulter les résultats d'une session à laquelle il a participé, à la condition qu'elle se soit terminée.}\\
	\end{enumerate}


\item[\textbullet]{Le client nous impose l'utilisation de JAVA 1.7.}\\
\end{itemize}

\subsection{Besoins non-fonctionnels}

\begin{itemize}
\item[\textbullet]{Le logiciel doit avoir un temps de réponse inférieur à 10 secondes pour toute action.}\\

\item[\textbullet]{Le logiciel doit être facilement utilisable par des étudiants et professeurs n'ayant pas nécessairement de connaissances avancées en informatique.}\\

\item[\textbullet]{La réalisation du logiciel doit être divisée en plusieurs jalons.}
\item[\textbullet]{De ce fait, la communication avec le client doit être fréquente à tous les jalons pour vérifier que la réalisation va dans la direction souhaitée par le client.}\\

\item[\textbullet]{Le logiciel doit pouvoir fonctionner sous Windows ou GNU/Linux.}

\end{itemize}


\subsection{Diagramme de cas}
Le diagramme de cas sert à identifier :
\begin{itemize}

\item[\textbullet]{Le système}
\item[\textbullet]{Les acteurs qui interagissent avec le système}
\item[\textbullet]{Les actions des acteurs sur le système}
\end{itemize}

Ce qui nous a permis d'établir le diagramme de cas d'utilisation suivant :
\begin{center}
\includegraphics[scale=0.7]{cas.png}
\end{center}

Un acteur est une entité externe (personne, machine...) qui interagit avec le système. On distingue ainsi trois types d'utilisateur (administrateur, professeur et élève) avec des actions différentes. Tous les détails des actions des utilisateurs ne sont pas représentés pour une question de lisibilité.
\newpage

\subsection{Diagramme de classe}
Le diagramme de classe est le diagramme le plus indispensable à la programmation en Java. Le diagramme de classes est un schéma utilisé en génie logiciel pour présenter les classes et les interfaces des systèmes ainsi que les différentes relations entre celles-ci. Une classe est un ensemble de fonctions et de données (attributs) qui sont liées ensemble par un champ sémantique. Le diagramme de classe du projet est le suivant :

\centerline{\includegraphics[scale=0.6]{classe.png}}


Le diagramme de classe est divisé en trois parties. L'une comprenant les utilisateurs (professeur, élève et administrateur). Une autre comprenant les QCM, les modules et les promotions. C'est-à-dire les données créées par l'administrateur et les professeurs. La dernière partie du diagramme de classe contient les résultats des QCM.
\newpage
\subsection{Diagramme d'activité}
Voir le fichier joint « projet5 » pour les détails de ce diagramme. 
Il a été choisi de faire des boucles pour mettre en évidence le fait que l'utilisateur
puisse effectuer une nouvelle action après avoir effectué une action. Des sauvegardes ont
été rajoutées avant la déconnexion de l'utilisateur afin de sauvegarder les modifications de
l'utilisateur. Nous avons choisi une boucle pour la connexion avec trois essai de saisie de mot
de passe afin d'assurer la sécurité des données du logiciel.

\subsection{Diagramme de séquence}
Ci dessous, le diagramme de séquence pour le professeur.

\centerline{\includegraphics[scale=0.3]{sequence.png}}

Pour les autres diagrammes de séquence voir les pièces jointes.\\
Le diagramme de séquence donne l'ordre de l'action effectuée par l'utilisateur. Il a
été choisi de mettre des retours après la création et la modification des QCM pour indiquer à
l'utilisateur que les modifications ont été effectuées.

\section{Notre implémentation sous JAVA}
Nous avons utilisé l'environnement de développement Eclipse pour implémenter ce projet.

\subsection{Séparation en modules}
Le projet a été séparé en 4 modules principaux:
\begin{itemize}
\item[\textbullet]{Utilisateurs: Les classes ayant rapport aux utilisateurs: Utilisateur, Administrateur, Promotion, etc...}
\item[\textbullet]{QCM: Les classes ayant rapport aux QCMs: Sessions, Questions, Réponses, etc...}
\item[\textbullet]{Interface: La classe Menu, qui gère l'interaction avec l'utilisateur. }
\item[\textbullet]{Bases de Données: Les classes sauvegardées dans des fichiers et qui contiennent toutes les données.}
\end{itemize}
\par{}

Ces modules sont indépendants les uns des autres, ce qui permet de mieux organiser le code et d'éviter des erreurs dans un module dues à un autre.
(Par exemple, une erreur de l'interface suite à une absence de QCMs)

\subsection{Fonctionnement général}
La classe Menu recherche dans la UserDatabase le login/password entré par l'utilisateur, et le renvoie sur un menu correspondant à ses droits(ou pas de menus si le login n'existe pas.)

Depuis ces menus, différentes choses sont possibles selon les droits de l'utilisateur:
\begin{itemize}
\item[\textbullet]{Ajouter des Utilisateurs: Une nouvelle instance d'Utilisateur est crée et ajoutée à la base de données}
\item[\textbullet]{Ajouter des QCMs: Une nouvelle instance de QCM est crée et ajoutée à la base de données}
\item[\textbullet]{Ajouter des Sessions: On liste les QCMs crées et on prend l'un deux pour faire une session}
\item[\textbullet]{Participer à une Session: On liste les sessions créees. Si celle sélectionnée est ouverte et qu'il reste des essais à l'élève, on démarre la session de réponse.}
\item[\textbullet]{Observer les résultats des Sessions: On récupère tous les résultats à une session et on effectue des tests et calculs dessus.}
\item[\textbullet]{Modifier des Sessions: On récupère dans la base de données la session correspondante et on la modifie.}
\end{itemize}

Tous ces menus proposent également l'option logoff, qui si sélectionnée renvoie l'utilisateur à l'écran de login.

\subsection{Sérialisation}
Toutes les classes qui ont besoin d'être sauvegardées, c'est à dire les utilisateurs, les sessions et les QCMs, sont sérialisables via la définition \begin{verbatim}implements Serializable\end{verbatim}

Ces classes sont ensuite stockées dans deux classes principales du module Bases de Données:
\begin{itemize}
\item[UserDatabase:]{Utilisateurs, Modules, Promotions.}
\item[QCMDatabase:]{QCMs, Sessions, Réponses.}
\end{itemize}

A chaque logoff d'un utilisateur, le programme sauvegarde les bases de données affectées(User pour l'administrateur, QCM pour les professeurs) dans un fichier par classe.

Ces fichiers sont par la suite chargés au prochain démarrage du programme, si ils existent.


\subsection{Les résultats finaux}
Nous n'avons malheureusement pas fini d'implémenter toute l'analyse, suite à plusieurs erreurs au niveau de la sérialisation et de la création des classes.
Il nous manque donc les modules/promotions, ainsi qu'une réponse aux QCM fonctionnelle.

L'impémentation finale est proche de notre analyse originale, malgré certaines classes ajoutées(notamment les classes de bases de données)


\section{Manuel d'instruction}

Une fois le programme lancé via \begin{verbatim}java -jar "GL2.jar"\end{verbatim}
L'utilisateur est prompté de s'authentifier. Les identifiants ajoutés à la base de données par la suite fonctionneront, mais le programme vient avec deux comptes prédéfinis: \begin{itemize}
\item[]{Un administrateur \begin{verbatim}admin/admin\end{verbatim}}
\item[]{Un professeur \begin{verbatim}prof/prof\end{verbatim}}
\end{itemize}

Une fois authentifié sur un compte, l'utilisateur est présenté un menu d'options selon la classe du compte, comme vu dans l'analyse des besoins.
Au logoff, il est possible de s'authentifier sur un autre compte.

\newpage
\thispagestyle{empty}
\mbox{}

\end{document}

