diff --git a/app/comp/bonus_spo.py b/app/comp/bonus_spo.py index 4efa7374..436ace89 100644 --- a/app/comp/bonus_spo.py +++ b/app/comp/bonus_spo.py @@ -1208,7 +1208,7 @@ class BonusStDenis(BonusSportAdditif): bonus_max = 0.5 -class BonusStNazaire(BonusSportMultiplicatif): +class BonusStNazaire(BonusSport): """IUT de Saint-Nazaire Trois bonifications sont possibles : sport, culture et engagement citoyen @@ -1230,9 +1230,37 @@ class BonusStNazaire(BonusSportMultiplicatif): name = "bonus_iutSN" displayed_name = "IUT de Saint-Nazaire" classic_use_bonus_ues = True # s'applique aux UEs en DUT et LP - seuil_moy_gen = 0.0 # tous les points comptent amplitude = 0.01 / 4 # 4pt => 1% factor_max = 0.1 # 10% max + # Modifié 2022-11-29: calculer chaque bonus + # (de 1 à 3 modules) séparément. + def compute_bonus(self, sem_modimpl_moys_inscrits, modimpl_coefs_etuds_no_nan): + """Calcul du bonus St Nazaire 2022 + 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) + """ + if 0 in sem_modimpl_moys_inscrits.shape: + # pas d'étudiants ou pas d'UE ou pas de module... + return + # Prend les 3 premiers bonus trouvés + # ignore les coefficients + bonus_mod_moys = sem_modimpl_moys_inscrits[:, :3] + bonus_mod_moys = np.nan_to_num(bonus_mod_moys, copy=False) + factor = bonus_mod_moys * self.amplitude + # somme les bonus: + factor = factor.sum(axis=1) + # et limite à 10%: + factor.clip(0.0, self.factor_max, out=factor) + + # Applique aux moyennes d'UE + if len(factor.shape) == 1: # classic + factor = factor[:, np.newaxis] + bonus = self.etud_moy_ue * factor + self.bonus_ues = bonus # DataFrame + + # Les bonus multiplicatifs ne s'appliquent pas à la moyenne générale + self.bonus_moy_gen = None class BonusTarbes(BonusIUTRennes1):