diff --git a/app/but/cursus_but.py b/app/but/cursus_but.py
index 34a3295eb9..6591592a94 100644
--- a/app/but/cursus_but.py
+++ b/app/but/cursus_but.py
@@ -364,6 +364,21 @@ class FormSemestreCursusBUT:
"cache { competence_id : competence }"
+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)
+ .filter(ScolarFormSemestreValidation.ue_id != None)
+ .join(UniteEns)
+ .join(ApcNiveau)
+ .join(ApcCompetence)
+ .filter_by(referentiel_id=referentiel_competence_id)
+ }
+ return sum(ects_dict.values())
+
+
def etud_ues_de_but1_non_validees(
etud: Identite, formation: Formation, parcour: ApcParcours
) -> list[UniteEns]:
diff --git a/app/but/jury_but_pv.py b/app/but/jury_but_pv.py
index 29630af045..d0933c7a6c 100644
--- a/app/but/jury_but_pv.py
+++ b/app/but/jury_but_pv.py
@@ -12,6 +12,7 @@ from openpyxl.styles import Font, Border, Side, Alignment, PatternFill
from app import log
from app.but import jury_but
+from app.but.cursus_but import but_ects_valides
from app.models.etudiants import Identite
from app.models.formsemestre import FormSemestre
from app.scodoc.gen_tables import GenTable
@@ -109,6 +110,11 @@ def pvjury_table_but(
"""
# remplace pour le BUT la fonction sco_pv_forms.pvjury_table
annee_but = (formsemestre.semestre_id + 1) // 2
+ referentiel_competence_id = formsemestre.formation.referentiel_competence_id
+ if referentiel_competence_id is None:
+ raise ScoValueError(
+ "pas de référentiel de compétences associé à la formation de ce semestre !"
+ )
titles = {
"nom": "Code" if anonymous else "Nom",
"cursus": "Cursus",
@@ -153,7 +159,7 @@ def pvjury_table_but(
etudid=etud.id,
),
"cursus": _descr_cursus_but(etud),
- "ects": f"{deca.ects_annee():g}",
+ "ects": f"""{deca.ects_annee():g}
Tot. {but_ects_valides(etud, referentiel_competence_id ):g}""",
"ues": deca.descr_ues_validation(line_sep=line_sep) if deca else "-",
"niveaux": deca.descr_niveaux_validation(line_sep=line_sep)
if deca