From ad4e4e33ec71dddef78c74b5e63604f15d8b34ad Mon Sep 17 00:00:00 2001
From: Emmanuel Viennet <emmanuel.viennet@gmail.com>
Date: Sat, 1 Jul 2023 08:21:40 +0200
Subject: [PATCH] Calcul ECTS dans le parcours BUT

---
 app/but/cursus_but.py | 24 ++++++++++++++++--------
 sco_version.py        |  2 +-
 2 files changed, 17 insertions(+), 9 deletions(-)

diff --git a/app/but/cursus_but.py b/app/but/cursus_but.py
index 6591592a9..622cdbb00 100644
--- a/app/but/cursus_but.py
+++ b/app/but/cursus_but.py
@@ -43,7 +43,7 @@ from app.models.formsemestre import FormSemestre, FormSemestreInscription
 from app.models.ues import UniteEns
 from app.models.validations import ScolarFormSemestreValidation
 from app.scodoc import codes_cursus as sco_codes
-from app.scodoc.codes_cursus import code_ue_validant, RED, UE_STANDARD
+from app.scodoc.codes_cursus import code_ue_validant, CODES_UE_VALIDES
 from app.scodoc import sco_utils as scu
 from app.scodoc.sco_exceptions import ScoNoReferentielCompetences, ScoValueError
 
@@ -365,18 +365,26 @@ class FormSemestreCursusBUT:
 
 
 def but_ects_valides(etud: Identite, referentiel_competence_id: int) -> float:
-    "Nombre d'ECTS validés par etud dans le BUT de référentiel indiqué"
-    # ne prend que les UE associées à des niveaux de compétences, et ne les compte qu'une fois
-    ects_dict = {
-        (v.ue.semestre_idx, v.ue.niveau_competence.id): v.ue.ects
-        for v in ScolarFormSemestreValidation.query.filter_by(etudid=etud.id)
+    """Nombre d'ECTS validés par etud dans le BUT de référentiel indiqué.
+    Ne prend que les UE associées à des niveaux de compétences,
+    et ne les compte qu'une fois même en cas de redoublement avec re-validation.
+    """
+    validations = (
+        ScolarFormSemestreValidation.query.filter_by(etudid=etud.id)
         .filter(ScolarFormSemestreValidation.ue_id != None)
         .join(UniteEns)
         .join(ApcNiveau)
         .join(ApcCompetence)
         .filter_by(referentiel_id=referentiel_competence_id)
-    }
-    return sum(ects_dict.values())
+    )
+
+    ects_dict = {}
+    for v in validations:
+        key = (v.ue.semestre_idx, v.ue.niveau_competence.id)
+        if v.code in CODES_UE_VALIDES:
+            ects_dict[key] = v.ue.ects
+
+    return sum(ects_dict.values()) if ects_dict else 0.0
 
 
 def etud_ues_de_but1_non_validees(
diff --git a/sco_version.py b/sco_version.py
index aa68bec3d..5b9938cf9 100644
--- a/sco_version.py
+++ b/sco_version.py
@@ -1,7 +1,7 @@
 # -*- mode: python -*-
 # -*- coding: utf-8 -*-
 
-SCOVERSION = "9.4.94"
+SCOVERSION = "9.4.95"
 
 SCONAME = "ScoDoc"
 
-- 
GitLab