diff --git a/app/comp/bonus_spo.py b/app/comp/bonus_spo.py
index cd74b81506..5204453720 100644
--- a/app/comp/bonus_spo.py
+++ b/app/comp/bonus_spo.py
@@ -1197,6 +1197,88 @@ class BonusRoanne(BonusSportAdditif):
proportion_point = 1
+class BonusSceaux(BonusSportAdditif): # atypique
+ """IUT de Sceaux
+
+ L’IUT de Sceaux (Université de Paris-Saclay) propose aux étudiants un seul enseignement
+ non rattaché aux UE : l’option Sport.
+
+ Cette option donne à l’étudiant qui la suit une bonification qui s’applique uniquement
+ si sa note est supérieure à 10.
+
+
+ Cette bonification s’applique sur l’ensemble des UE d’un semestre de la façon suivante :
+
+
+
+ [ (Note – 10) / Nb UE du semestre ] / Total des coefficients de chaque UE
+
+
+
+
+ Exemple : un étudiant qui a obtenu 16/20 à l’option Sport en S1
+ (composé par exemple de 3 UE:UE1.1, UE1.2 et UE1.3)
+ aurait les bonifications suivantes :
+
+
+ - UE1.1 (Total des coefficients : 15) ⇒ Bonification UE1.1 = [ (16 – 10) / 3 ] /15
+
+
+ - UE1.2 (Total des coefficients : 14) ⇒ Bonification UE1.2 = [ (16 – 10) / 3 ] /14
+
+
+ - UE1.3 (Total des coefficients : 12,5) ⇒ Bonification UE1.3 = [ (16 – 10) / 3 ] /12,5
+
+
+
+ """
+
+ name = "bonus_iut_sceaux"
+ displayed_name = "IUT de Sceaux"
+ proportion_point = 1.0
+
+ def __init__(
+ self,
+ formsemestre: "FormSemestre",
+ sem_modimpl_moys: np.array,
+ ues: list,
+ modimpl_inscr_df: pd.DataFrame,
+ modimpl_coefs: np.array,
+ etud_moy_gen,
+ etud_moy_ue,
+ ):
+ # Pour ce bonus, il faut conserver:
+ # - le nombre d'UEs
+ self.nb_ues = len([ue for ue in ues if ue.type != UE_SPORT])
+ # - le total des coefs de chaque UE
+ # modimpl_coefs : DataFrame, lignes modimpl, col UEs (sans sport)
+ self.sum_coefs_ues = modimpl_coefs.sum() # Series, index ue_id
+ super().__init__(
+ formsemestre,
+ sem_modimpl_moys,
+ ues,
+ modimpl_inscr_df,
+ modimpl_coefs,
+ etud_moy_gen,
+ etud_moy_ue,
+ )
+
+ def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan):
+ """Calcul du bonus IUT de Sceaux 2023
+ sem_modimpl_moys_inscrits: les notes de sport
+ En APC: ndarray (nb_etuds, nb_mod_sport, nb_ues_non_bonus)
+ En classic: ndarray (nb_etuds, nb_mod_sport)
+
+ Attention: si la somme des coefs de modules dans une UE est nulle, on a un bonus Inf
+ (moyenne d'UE cappée à 20).
+ """
+ if (0 in sem_modimpl_moys_inscrits.shape) or (self.nb_ues == 0):
+ # pas d'étudiants ou pas d'UE ou pas de module...
+ return
+ super().compute_bonus(sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan)
+ self.bonus_ues = (self.bonus_ues / self.nb_ues) / self.sum_coefs_ues
+
+
class BonusStEtienne(BonusSportAdditif):
"""IUT de Saint-Etienne.
diff --git a/sco_version.py b/sco_version.py
index 3a258add87..c34d6085fd 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -1,7 +1,7 @@
# -*- mode: python -*-
# -*- coding: utf-8 -*-
-SCOVERSION = "9.4.60"
+SCOVERSION = "9.4.61"
SCONAME = "ScoDoc"