Why make donate

Analyse

author : Erwan NEMA <nemawan@hotmail.com>
author : Nolwenn Rannou <rannou@codelutin.com>
revision : 2738
date : 2009-08-20 17:12:21 +0200 (jeu 20 aoû 2009)

Les besoins

Le projet Pollen vise à mettre en place une application de vote libre en mode Web enrichie en fonctionnalités par rapport à ce qui existe déjà sur le marché. Le principe est le suivant. Un utilisateur crée un sondage puis il envoie le lien aux participants du sondage. Ensuite il peut suivre l'évolution du sondage en ligne. Les participants votent en saisissant leur nom et leur choix.

La création d'un vote doit être simple mais doit permettre les opérations suivantes :

  • définir des listes de votants
  • choisir d'autres types de votes (pourcentage, Condorcet...)
  • permettre à chaque votant d'ajouter de nouveaux choix de vote
  • voter anonymement si on utilise une liste de votants restreinte
  • relancer les personnes n'ayant pas encore voté (si liste de votants restreinte)
  • définir des dates de début et de fin de vote
  • définir le nombre de votes possibles par personne (1 choix ou N choix parmi les propositions)
  • pouvoir ajouter un commentaire global ou à son vote
  • définir avant le vote le poids des votants (si liste de votants restreinte)
  • rendre graphiquement le résultat des votes
  • exporter un vote dans un format standard (vote, liste de votant, résultat de votes) pour des échanges avec d'autres outils de vote.

Les concepts généraux

Ce paragraphe présente les différents concepts manipulés dans l’application de vote. Le tableau représente le dictionnaire de données de notre application.

  • Sondage (Poll) : Un sondage est une enquête effectuée auprès de participants (votants). Le sondage peut porter sur une question avec multi propositions, sur un choix de date.
  • Règles de fin de sondage (PreventRule) : Gestion des règles de terminaison de sondage (quotas de votants, date avant rappel, ...).
  • Sondage Libre (FreePoll) : Le sondage est accessible à n’importe quel votant.
  • Sondage restreint (RestrictedPoll) : Le sondage n’est accessible qu’aux personnes de la liste restreinte.
  • Sondage groupe (GroupPoll) : Le sondage est accessible à plusieurs liste restreintes.
  • Vote : Réponse d’un votant à la question formulée, cette réponse est enregistrée afin d’être exploitée, l’identité du votant est connue.
  • Vote anonyme (AnonymousVote) : Réponse à la question formulée sans connaître l’identité du votant.
  • Type de dépouillement (VoteCounting) : Exploitation des résultats du sondage, le dépouillement peut être effectué de manière normale (comptabilisation des réponses), dans le cas de choix multiple, selon la méthode Condorcet (un ordre de préférence est attribué à chaque réponse) où selon la méthode Condorcet en attribuant un pourcentage à chaque réponse.
  • Type de vote (ChoiceType) : Définit la formulation de la question et donc la réponse à apporter  (oui/non, choix d’une heure, réponse sous forme de texte, image,….).
  • Utilisateur (User) : Personne gérant le sondage, cette personne peut être identifiée ou non.
  • Votant (VotingPerson) : Personne votant à un sondage.
  • Créateur du sondage (PollAccount) : Personne déjà identifiée ou pas créant un sondage.
  • Liste de votants prédéfinie (PersonList) : Liste de votants prédéfinie créée par un utilisateur et sauve-gardée dans le système, cette liste peut servir de base à la mise en place d’une liste de votants restreinte.
  • Liste de votants (VotingList) : Liste des votants participants au sondage.
  • Type de liste de votant (ListType)
  • Liste de votants libre (FreeVotingList) : Liste de votants, les votants peuvent ne pas être préalablement enregistrés dans le système.
  • Liste de votants restreinte (RestrictedVotingList) : Liste de votants restreinte, tous les votants sont connus et seront identifiés à partir de cette liste.
  • Groupe de votants (VotingGroup) : Liste de votants restreinte pouvant faire l’objet d’une pondération globale lors d’un dépouillement (ex : groupe des développeurs).
  • Commentaire globale (Comment) : Commentaire sur le sondage.
  • Commentaire local (Vote.comment) : Commentaire sur un vote.

Les types de dépouillements

Dans un premier temps, nous allons implémenter les types de dépouillements les plus usuels.

  • Le vote simple ou libre : c'est le vote uninominal, chaque réponse recueille un suffrage, la somme des suffrages par réponse représente les résultats du sondage.
  • Le vote condorcet : le votant classe ses choix par ordre de préférence (ex a>b>c), on compare chaque choix aux autres votes en notant les duels gagnés ou perdus, le résultat de cette comparaison représente les résultats du sondage.
  • Le vote pondéré par note : chaque choix est noté (en fonction d'un barème), le cumul des notes par réponse représente les résultats du sondage.

La pondération

Chaque votant peut ne pas avoir le même poids lors d'un vote, cette pondération aura donc des conséquences lors du dépouillement des résultats. La pondération sur chaque votant est possible dans le cas d'une liste restreinte. De même un groupe de votant pourra lui aussi être pondéré lors de la participation de plusieurs listes à un sondage.

Le vote anonyme

L'application permet de voter anonymement dans le cas des sondages basés sur une liste restreinte de votant. L'anonymat est assuré pour la totalité des votants de la liste. Dans ce cas, le vote sera comptabilisé pour le votant, mais l'application ne liera pas le vote au votant. Le fait de fournir son identité dans le cas d'un vote anonyme (seul moyen de savoir si le votant a déjà participé au sondage) est gênant pour le votant. Donc dans le cas du vote anonyme, le votant s'identifiera grâce à un numéro d'anonymat. Le votant ne connaît pas le fonctionnement interne de l'application pour la gestion des votes anonymes, cette approche le confortera concernant la prise en compte de son anonymat dans le sondage.

Les fonctionnalités (cas d'utilisation)

Le diagramme de cas d'utilisation au format UML 2.0 de l'application permet de présenter de manière simple et concise les différents acteurs de l'application ainsi que ses fonctionnalités. Pour rappel, le stéréotype <<includes>> précise une décomposition du use case avec une prise en compte obligatoire du cas d'utilisation inclus, le stéréotype <<extends>> précise une extension optionnel de fonctionnalité, le stéréotype <<generalize>> fait référence à la notion d'héritage.

Les acteurs du système sont au nombre de 3 :

  • L'administrateur gère les utilisateurs et est habilité à modérer un sondage.
  • L'utilisateur peut gérer un sondage et voter.
  • Le votant peut voter.
Les fonctionnalités

Les cas d'utilisations « créer un sondage », « voter » et « dépouiller un sondage » seront explicités dans les paragraphes suivants.

Créer un sondage

Le scénario détaillé de la création d'un sondage.

Acteur :

l'utilisateur.

Pré-conditions :

Scénario de base :

  1. L'utilisateur choisit de créer un sondage.
  2. L'utilisateur choisit le type de sondage libre.
  3. L'utilisateur renseigne le titre du sondage.
  4. L'utilisateur renseigne une description pour le sondage.
  5. L'utilisateur saisit son nom.
  6. L'utilisateur saisit le date de fin de sondage.
  7. L'utilisateur choisit le type de vote options textuelles.
  8. L'utilisateur saisit les différentes options.
  9. L'utilisateur choisit sondage à choix unique.
  10. L'utilisateur valide la création.
  11. Deux URLs sont automatiquement générées par l'application : Une URL pour administrer le sondage. Une URL pour voter.
  12. L'utilisateur est invité à sauvegarder les URLs.
  13. Un email est automatiquement envoyé par l'application à l'administrateur chargé de modérer les sondages.

Variations :

1a. L'utilisateur s'authentifie.
   1a1. Si le user est black listé, la connexion est impossible, un message d'erreur apparaît.
2a. L'utilisateur choisit un sondage de type restreint.
   2a1. L'utilisateur choisit une liste prédéfinie.
      - L'utilisateur peut pondérer chaque votant de la liste pour le sondage.
   2a2. L'utilisateur choisit plusieurs listes prédéfinies (groupes).
      - L'utilisateur peut pondérer chaque votant de chaque groupe
      - L'utilisateur peut pondérer chaque groupe
   2a3. L'utilisateur choisit de créer une liste restreinte en saisissant le nom et l'adresse email des votants.
 L'utilisateur spécifie si un choix peut être ajouté par un des votants.
 L'utilisateur spécifie s'il s'agit d'un sondage anonyme.
5a. Si l'utilisateur est black listé, la création est impossible, un message d'erreur apparaît.
7a. L'utilisateur choisit le type de vote options de date.
7b. L'utilisateur choisit le type de vote options d'image.
9a. L'utilisateur peut choisir un sondage à choix multiple si le nombre d'options >2
L'utilisateur choisit le type de dépouillement.
10a. Si l'utilisateur s'est authentifier ou a saisi son email : le système demande si l'utilisateur souhaite recevoir un email lors de chaque vote.
11a. Si l'utilisateur a saisi son email, un email contenant les 2 URLs du sondage est automatiquement envoyé au créateur du sondage.
11b. Si l'utilisateur est authentifié, un mail contenant les 2 URLs du sondage est automatiquement envoyé lors de la création du sondage.
11c. Dans le cas d'un sondage sur liste restreinte, un email contenant l'URL pour voter et l'identifiant de vote du votant est automatiquement envoyé à tous les votants du sondage.
12a. L'utilisateur non authentifié ne sauvegarde pas les URLs : l'utilisateur ne peut pas accéder au sondage.
13a. Si le sondage est invalidé par l'administrateur : le sondage sera supprimé, les URLs ne seront plus accessibles.
Si l'utilisateur a saisi des informations d'authentification ou possède un compte, celui ci est black listé.

Extensions :

5a. L'utilisateur saisit son nom et son email.
    5a1. voir variation 5a.
10a. L'utilisateur peut saisir un commentaire avant de valider le sondage.

Une illustration des actions reprenant le scénario de base et ses variations est fournie par le diagramme d'activité suivant :

Créer Sondage partie 1Créer Sondage partie 2

Voter

Acteur :

Le votant

Pré-conditions :

Le votant connaît l'URL du sondage. Le sondage est accessible.

Scénario de base :

  1. Le votant se connecte au sondage à partir d'une URL.
  2. Le votant saisit son ou ses choix.
  3. Le votant saisit son identifiant de vote.
  4. Le votant valide son vote.

Variations :

2a. Si le sondage est restreint et si cette option est autorisé sur le sondage en cours, le votant peut ajouter un choix de vote, le créateur du sondage et tous les participants sont alertés par email de la modification du sondage.
4a. Si le votant n'a pas saisi un identifiant de vote valide: un message d'erreur apparaît, le vote n'est pas comptabilisé.
4b. Si le votant est black listé par le créateur du vote, il n'est pas autorisé à voter : un message apparaît, le vote n'est pas enregistré.

Extensions :

3a. L'utilisateur saisit son identifiant de vote + son email.
3b. Le votant saisit un commentaire sur son vote.
4a. L'utilisateur reçoit un email de confirmation de vote.
4b. Le créateur du sondage reçoit un email concernant le vote du votant.
4c. Le votant peut modifier son vote.

Voter

Dépouiller les résultats

Acteur

L'utilisateur

Pré-conditions

Le sondage est terminé.

Scénario de base :

  1. L'utilisateur se connecte au sondage par l'intermédiaire de l'URL
  2. L'utilisateur choisit de dépouiller les résultats
  3. L'application exécute l'algorithme de calcul des résultats du sondage
  4. Les résultats (votants, réponses) du sondage sont affichés

Variations :

1a. L'utilisateur s'authentifie dans l'application et choisit le sondage dans une liste de ces sondages
    1a1. voir 1b
1b. Si le sondage a déjà été dépouillé, les résultats sont affichés.
2a. Le sondage est automatiquement dépouillé lorsque la date de fin de sondage est atteinte.
4a. Dans le cas d'un sondage avec une liste de votants anonymes: les informations concernant les votants ne sont pas affichées.

Extensions :

4a. Les résultats peuvent être exportés au format XML.

La chronologie des interactions entre les différentes entités définies dès l'étape d'analyse est présentée dans le diagramme de séquence d'analyse suivant :

Scénario de baseVariation 1a

Exigences non fonctionnelles

L'application ne doit pas seulement prendre en compte les exigences formulées dans le cahier des charges par la maîtrise d'ouvrage. Un certain nombre de contraintes doivent être obligatoirement étudiées. Ces exigences sont les suivantes :

  • Le système doit assurer la mise à disposition et la sauvegarde des informations manipulées: l'utilisation d'un SGBD permettra de gérer ces besoins concernant les données.
  • L'application ne sera pas fortement liée à un SGBD du marché : l'utilisation d'une couche de persistance s'impose.
  • L'application doit assurer une ergonomie et une facilité d'utilisation au moins équivalente aux produits concurrents sur le marché.
  • L'application doit être totalement orientée service, toute la logique métier sera donc facilement découplée de la couche de présentation.
  • Le système doit assurer aux utilisateurs une sécurité totale dans le cadre des transactions effectuées vers et à partir du serveur ainsi que dans l'utilisation même du logiciel. Ceci implique la mise en place d'une politique de gestion de droits adéquats au niveau de l'application.

Les classes métiers

Le processus d'analyse fournit le diagramme de classe cohérent de la partie données de l'application. Ce diagramme servira de base pour l'implantation du schéma de base de données.

Diagramme de classes d'analyse

Classes et commentaire associé :

  • PollType, Type de sondage.
  • ChoiceType, Type de choix.
  • VoteCounting, Type de dépouillement.
  • UserAccount, Utilisateur enregistré dans l'application.
  • PollAccount, Compte pour un sondage englobe la notion de votant et de créateur d'une sondage.
  • PersonList, Liste prédéfinie de comptes.
  • VotingList, Liste de votants.
  • PersonToList, Votants d'une liste.
  • Vote, Vote.
  • Choice, Choix de vote.
  • VoteToChoice, Valeur des choix lors d'un ordre de préférence pour un sondage multichoix.

Classe Result (Résultat du sondage) :

Attribut :

  • byGroup, Indique que le résultat a été dépouillé par groupe.

Classe Poll (Sondage) :

Attributs :

  • pollId, Identifiant unique du sondage.
  • beginChoiceDate, Date d'ouverture à l'ajout de choix.
  • maxChoiceNb, Nombre de choix maximum pour le votant.
  • choiceAddAllowed, Autorise l'ajout de choix au sondage.
  • closed, Indique que le sondage est terminé.
  • anonymous, Sondage avec votants et votes anonymes.
  • anonymousVoteAllowed, vote anonyme autorisé.
  • publicResults, Indique si les résultats du sondage sont publics.
  • continuousResults, Indique si les résultats du sondage sont visibles en continue lors du vote.

Classe PreventRule (Règles de notification) :

Des règles de notification sont associées aux sondages. Elles sont utilisées pour exécuter des actions (affichage d'un message, envoi d'un email...) en fonction de certains critères.

Attributs :

  • method, Action à déclencher.
  • scope, Contexte dans lequel l'action peut se déclencher.
  • sensibility, Valeur provoquant le déclenchement de l'action.
  • active, Indique si la règle est actuellement active
  • oneTime, Indique si l'action doit se déclencher une seule fois (la règle est désactivée après sa première exécution).
  • repeated, Indique si l'action peut se déclencher de manière répétitive (une action de sensibilité 2 est déclenché pour les valeurs 2, 4, 6, 8...).
Cycle de vie d'un sondage

La classe PreventRuleManager permet de gérer des règles de notification. Lorsque la méthode execute() est appelée, la méthode définie par la règle est exécutée à condition que sa sensibilité et sa portée soient valides.

Exemple : affichage d'un message tous les 100 votes :

// Définition d'une règle : portée "vote", sensibilité 100, répétitive
PreventRuleDTO preventRule = new PreventRuleDTO("vote", 100, true,
            PreventRuleManager.PRINT_ACTION);
PreventRuleManager manager = new PreventRuleManager(preventRule);

// On lance l'exécution en précisant une portée et une sensibilité
// Le manager se charge de vérifier si l'action doit être effectuée
// en fonction de la règle et des paramètres
manager.execute("vote",100,"un message");    // affiche "un message"
manager.execute("vote",200,"autre message"); // affiche "autre message"

// Exemples n'exécutant rien
manager.execute("scope",100);    // "scope" n'est pas la bonne portée
manager.execute("vote",50);  // 50 n'est pas la bonne sensibilité

Les notifications sont utilisées dans Pollen pour envoyer un message de confirmation à la création d'un compte, pour prévenir le créateur d'un sondage lorsque des votes ont lieu ou pour relancer les personnes qui n'ont pas encore voté...

Cycle de vie d'un sondage

Initialement un sondage ne possédait que deux états : ouvert et fermé, auxquels s'ajoutait une notion de date de début et de date de fin. Une fois qu'il a été rendu possible d'ajouter des choix à un sondage en cours, il est devenu nécessaire d'ajouter une date de début d'ajout de choix ainsi que les états définis dans le diagramme suivant.

Cycle de vie d'un sondage