nupes-elections/nupes-elections-front/src/utils.js

97 lines
2.7 KiB
JavaScript
Raw Normal View History

2024-06-17 16:40:26 +00:00
export function getNomZone(typeResultats, resultats) {
if (!resultats || resultats.length === 0)
return ""
else if (typeResultats === "france")
return "France"
else if (typeResultats === "region")
return `Région ${resultats.region.nom}`
else if (typeResultats === "departement")
return `Département ${resultats.departement.nom}`
else if (typeResultats === "circonscription")
return `Circonscription ${resultats.circonscription.id}`
else if (typeResultats === "commune")
return `Commune ${resultats.commune.nom}`
else if (typeResultats === "bureau_vote")
return resultats.bureau_vote.libelle
}
export function trierCandidats(candidats, voix_par_candidat) {
return candidats.toSorted((l1, l2) => {
return (voix_par_candidat[l2.numero] || 0) - (voix_par_candidat[l1.numero] || 0)
})
}
export function regrouperVoix(voixCandidats, candidats, blocs, nuances) {
if (!candidats || !voixCandidats || !blocs || !nuances
|| candidats.length === 0 || blocs.length === 0 || nuances.length === 0)
return [{}, {}]
const parBloc = {}
const parNuance = {}
for (let bloc of blocs) {
parBloc[bloc.nom] = 0
}
for (let nuance of nuances) {
parNuance[nuance.code] = 0
}
for (let candidat of candidats) {
parBloc[candidat.bloc] += voixCandidats[candidat.numero] || 0
parNuance[candidat.nuance] += voixCandidats[candidat.numero] || 0
}
return [parBloc, parNuance]
}
export function calculerSieges(listes, resultats, seuil = 0.05) {
if (!resultats['voix'])
return {}
const MAX_SIEGES = 81
const sieges = {}
const listesElues = []
let siegesAffectes = 0
let totalVoix = resultats.exprimes
for (let liste of listes) {
const voix = resultats?.voix[liste.numero] ?? 0
if (voix / resultats.exprimes < seuil) {
// Barre des 5 % non franchie
totalVoix -= voix
sieges[liste.numero] = 0
}
else {
listesElues.push(liste)
}
}
if (listesElues.length === 0)
return
for (let liste of listesElues) {
const voix = resultats?.voix[liste.numero] ?? 0
sieges[liste.numero] = Math.floor(MAX_SIEGES * voix / totalVoix)
siegesAffectes += sieges[liste.numero]
}
while (siegesAffectes < MAX_SIEGES) {
// Méthode de la plus forte moyenne pour affecter les sièges restants
let maxMoyenne = 0
let listeElue = null
for (let liste of listesElues) {
if (sieges[liste.numero] < MAX_SIEGES) {
const voix = resultats?.voix[liste.numero] ?? 0
const moyenne = voix / (sieges[liste.numero] + 1)
if (moyenne > maxMoyenne) {
maxMoyenne = moyenne
listeElue = liste
}
}
}
sieges[listeElue.numero]++
siegesAffectes++
}
return sieges
}