diff --git a/README.md b/README.md
index e904069735c6ac67ec3d4ea6fd688146d8c0f4db..ca24f06c7bdde84d4271fd4997994777a73b1059 100644
--- a/README.md
+++ b/README.md
@@ -6,7 +6,7 @@
 
 - Visualisation des résultats sous forme de cartographie, flux d'actualité, ou résultats détaillés par circonscription ou ville
 - Saisie des résultats par bureau de vote pour les personnes ayant le droit de saisie et administrateurs
-- Gestion des élections : 
+- Gestion des élections :
   - création du modèle d'une élection (découpage en circonscription, ville puis bureau)
   - gestion des listes de candidats par circonscription
   - gestion des tendances politiques
@@ -14,6 +14,8 @@
   - validation des résultats
   - identification des candidats pouvant poser problème (cumul de mandat) et possibilité de supprimer les candidats refusant leur élection pour prendre automatiquement le suivant.
 
+Une documentation utilisateur est disponible dans l'application après connexion dans le menu "Aide"
+
 ## Démarrage pour tests / dev
 
 ### Identifiants de démonstration
@@ -72,6 +74,7 @@ Le répertoire `./web/assets/maps` contient les cartes qui peuvent être utilis
 Avec docker-compose : docker cp <fichier-à-importer> <nom-du-conteneur>:/app/web/assets/maps/<fichier-à-importer>
 
 ### Utilisateurs et droits
+
 **Utilisateurs techniques**
 Les utilisateurs techniques permettent de s'authentifier à l'application et d'accéder aux API en fonction du rôle de l'utilisateur qui définit alors ses droits.
 La source de création et d'authentification des utilisateurs technique est double. Elle peut soit provenir directement de la base de donnée locale d'utilisateurs de l'application (./data/users.db) ou d'un fournisseur d'identité avec le protocole OAuth2 (configuré dans le fichier .env).
@@ -83,7 +86,8 @@ Dans le cas d'une connexion avec OAuth2, l'utilisateur est crée dans la base lo
 **Utilisateurs applicatif**
 Les utilisateurs applicatifs sont créés dans la base locale de données (./data/test.db) avec l'identifiant de l'utilisateur technique qui permet de faire la jointure entre un utilisateur applicatif et un utilisateur technique.
 
-Les utilisateurs techniques sont : 
+Les utilisateurs techniques sont :
+
 - les administrateurs `admin` qui créent le modèle de donnée des élections, valident les votes et crée les utilisateurs en leur affectant des droits.
 - les saisisseurs `capturer` qui peuvent saisir les résultats des bureaux de votes qui leurs sont affectés
 - les visualiseurs `visualizer` qui peuvent simplement consulter les résultats
@@ -94,10 +98,40 @@ Les utilisateurs techniques sont :
 Les tests unitaires sont définis dans le répertoire de chaque paquet (ex : `auth_test.go` dans le package `auth`)
 
 **Tests d'intégration**
-Les tests d'intégration  sont dans le répertoire `./rootmux`. 
+Les tests d'intégration sont dans le répertoire `./rootmux`.
 Les tests métiers (ex : marqué un bureau de vote comme complété lorsque tous les votes ont étaient saisis pour ce bureau) sont définis dans le fichier `rootmux_test.go`.
 Les tests concernant les droits et les réponses attendues par utilisateur (ex : un saisisseur ne peut saisir les votes que des bureaux qui lui sont rattachés et pas aux autres) sont écrits dans des fichiers différent par type de droits différent (ex : `capturer_test.go` pour tester les droits des saisisseurs)
 
+## Ajouter un type d'élection
+
+Pour ajouter un type d'élection il faut ajouter le code qui permet de déterminer les élus.
+
+Pour ce faire, dans le fichier `web/services/calculate-election-generic.js` ajouter une fonction qui permet de calculer les élus pour le nouveaux mode de scrutin (par exemple : getElectedsMyNewBallotType). Modifier le switch case de la fonction `getElecteds` pour prendre en compte le nouveau scrutin en appelant la fonction que vous venez de créer.
+
+```javascript
+switch (election.BallotType) {
+  case "local-counsil-direct":
+    return this.getElectedsLocalCounsilDirect(area);
+  case "my-new-ballot-type":
+    return this.getElectedsMyNewBallotType(area);
+}
+```
+
+Puis pour que ce mode de scrutin puisse être pris en compte pour une élection, modifier le menu de sélection du type de scrutin d'une élection pour ajouter une nouvelle option dans le fichier `web/components/management/election.js`
+
+```html
+<div class="control select">
+  <select name="ballot-type" id="election-modal-ballot-type">
+    <option value="local-counsil-direct"
+      >Conseil communautaire au suffrage direct</option
+    >
+    <option value="my-new-ballot-type"
+      >Mon nouveau type de scrutin</option
+    >
+  </select>
+</div>
+```
+
 ## Contribution
 
 Un bug découvert ? Une demande d'amélioration ? Une contribution à la documentation ?
diff --git a/web/components/management/election.js b/web/components/management/election.js
index 92d194e5678da60fd4a0c7b69d4c6dcd61536f81..2b53498e175afd3271ecb91440df26e4215286e5 100644
--- a/web/components/management/election.js
+++ b/web/components/management/election.js
@@ -119,8 +119,8 @@ class Election {
                 <option value="local-counsil-direct"
                   >Conseil communautaire au suffrage direct</option
                 >
-                <option value="local-counsil-indirect"
-                  >Conseil communautaire au suffrage indirect</option
+                <option value="all-for-first"
+                  >FAUX : tout pour le premier</option
                 >
               </select>
             </div>
@@ -172,11 +172,10 @@ class Election {
         </header>
         <section class="modal-card-body">
           <div class="field">
-            <label>Id</label>
             <div class="control">
               <input
                 class="input"
-                type="number"
+                type="hidden"
                 id="election-modal-id-clone"
                 disabled
               />
@@ -188,19 +187,6 @@ class Election {
               <input class="input" type="text" id="election-modal-name-clone" />
             </div>
           </div>
-          <div class="field">
-            <label>Système de vote</label><br />
-            <div class="control select">
-              <select name="ballot-type" id="election-modal-ballot-type-clone">
-                <option value="local-counsil-direct"
-                  >Conseil communautaire au suffrage direct</option
-                >
-                <option value="local-counsil-indirect"
-                  >Conseil communautaire au suffrage indirect</option
-                >
-              </select>
-            </div>
-          </div>
         </section>
         <footer class="modal-card-foot">
           <button id="election-clone-modal-save" class="button is-success">
@@ -393,8 +379,6 @@ class Election {
     document.getElementById("election-modal-id-clone").value = election.ID;
     document.getElementById("election-modal-name-clone").value =
       election.Name + " (New)";
-    document.getElementById("election-modal-ballot-type-clone").value =
-      election.BallotType;
   }
 
   async saveCloneElection() {
@@ -407,7 +391,9 @@ class Election {
       "POST",
       null,
       document.getElementById("election-modal-name-clone").value,
-      document.getElementById("election-modal-ballot-type-clone").value
+      electionToClone.BallotType,
+      electionToClone.MapAreaFile,
+      electionToClone.MapSectionFile
     );
 
     await this.parent.areaHandler.cloneAreas(electionCloned, electionToClone);
diff --git a/web/services/election/calculate-election-generic.js b/web/services/election/calculate-election-generic.js
index c6179aec9095ed8b4fc31a5b2ea0bcd2be9adb4d..989cbef8acdf5976ba51ac9c9e313c77c8587a55 100644
--- a/web/services/election/calculate-election-generic.js
+++ b/web/services/election/calculate-election-generic.js
@@ -10,12 +10,12 @@ import * as VoteModel from "/services/model/vote-model.js";
 import * as CandidateListModel from "/services/model/candidateList-model.js";
 
 export async function mountCalculator(round) {
-  const directMetropolitanCalculator = new DirectMetropolitanCalculator(round);
-  await directMetropolitanCalculator.initModel();
-  return directMetropolitanCalculator;
+  const electionCalculator = new ElectionCalculator(round);
+  await electionCalculator.initModel();
+  return electionCalculator;
 }
 
-class DirectMetropolitanCalculator {
+class ElectionCalculator {
   constructor(round) {
     this.round = round;
     this.ElectionModel = ElectionModel.getElectionModel();
@@ -238,7 +238,7 @@ class DirectMetropolitanCalculator {
       return b.VoiceNumber - a.VoiceNumber;
     });
 
-    area.Electeds = this.getElecteds(area);
+    area.Electeds = await this.getElecteds(area);
 
     area.candidateLists.sort((a, b) => {
       return b.VoiceNumber - a.VoiceNumber;
@@ -356,7 +356,17 @@ class DirectMetropolitanCalculator {
     };
   }
 
-  getElecteds(area) {
+  async getElecteds(area) {
+    let election = await this.ElectionModel.getElection(this.round.ElectionID);
+    switch (election.BallotType) {
+      case "local-counsil-direct":
+        return this.getElectedsLocalCounsilDirect(area);
+      case "all-for-first":
+        return this.getElectedsAllForFirst(area);
+    }
+  }
+
+  getElectedsLocalCounsilDirect(area) {
     let electeds = [];
 
     // order candidates by rank and remove refused or removed candidates
@@ -452,4 +462,30 @@ class DirectMetropolitanCalculator {
 
     return electeds;
   }
+
+  getElectedsLocalCounsilDirect(area) {
+    let electeds = [];
+
+    // order candidates by rank and remove refused or removed candidates
+    area.candidateLists.forEach((candidateList) => {
+      candidateList.Candidates.sort(function (a, b) {
+        return a.Rank - b.Rank;
+      });
+      for (let i = 0; i < candidateList.Candidates.length; i++) {
+        if (
+          candidateList.Candidates[i].Refused ||
+          candidateList.Candidates[i].Removed
+        ) {
+          candidateList.Candidates.splice(i, 1);
+        }
+      }
+    });
+
+    let seatForFirst = area.SeatNumber;
+    electeds = electeds.concat(
+      area.candidateLists[0].Candidates.splice(0, seatForFirst)
+    );
+
+    return electeds;
+  }
 }