diff --git a/app/but/jury_but.py b/app/but/jury_but.py
index d4e7dd8cf2c133167e618f4602ecbe1e21211bee..bf39b7128cf940129546f8707ebb7909d356062a 100644
--- a/app/but/jury_but.py
+++ b/app/but/jury_but.py
@@ -1009,7 +1009,7 @@ class DecisionsProposeesRCUE(DecisionsProposees):
                 sco_codes.DEM if inscription_etat == scu.DEMISSION else sco_codes.DEF
             ]
             return
-        self.validation = rcue.query_validations().first()
+        self.validation: ApcValidationRCUE = rcue.query_validations().first()
         if self.validation is not None:
             self.code_valide = self.validation.code
         if rcue.est_compensable():
@@ -1379,30 +1379,36 @@ class DecisionsProposeesUE(DecisionsProposees):
         inscription_etat: str = scu.INSCRIT,
     ):
         self.paire = paire
+        self.formsemestre = formsemestre
+        "Le formsemestre courant auquel appartient l'UE, ou None si validation antérieure"
+        self.rcue: RegroupementCoherentUE = rcue
+        "Le rcue auquel est rattaché cette UE, ou None"
         self.ue: UniteEns = rcue.ue_2 if paire else rcue.ue_1
         self.inscription_etat = inscription_etat
         # Une UE peut être validée plusieurs fois en cas de redoublement
         # (qu'elle soit capitalisée ou non)
         # mais ici on a restreint au formsemestre donc une seule (prend la première)
-        validation = ScolarFormSemestreValidation.query.filter_by(
-            etudid=etud.id, formsemestre_id=formsemestre.id, ue_id=self.ue.id << XXX
-        ).first()
+
+        self.cur_validation = (
+            rcue.validation_ue_cur_pair if paire else rcue.validation_ue_cur_impair
+        )
+        "validation dans le formsemestre courant"
+        autre_validation = (
+            rcue.validation_ue_best_pair if paire else rcue.validation_ue_best_impair
+        )
+        "validation antérieure ou capitalisée"
+        # la validation à afficher est celle "en cours", sauf si UE antérieure
+        validation = self.cur_validation if self.formsemestre else autre_validation
         super().__init__(
             etud=etud,
             code_valide=validation.code if validation is not None else None,
         )
         self.validation = validation
-        "validation dans le formsemestre courant"
-        self.formsemestre = formsemestre
-        self.rcue: RegroupementCoherentUE = rcue
-        "Le rcue auquel est rattaché cette UE, ou None"
+        "validation dans le formsemestre courant ou à défaut celle enregistrée"
+
         # Editable ou pas ?
         # si ue courante, éditable.
-        self.editable = (
-            (self.rcue.ue_cur_pair is not None)
-            if paire
-            else (self.rcue.ue_cur_impair is not None)
-        )
+        self.editable = self.cur_validation is not None
         res: ResultatsSemestreBUT = (
             self.rcue.res_pair if paire else self.rcue.res_impair
         )
@@ -1427,8 +1433,9 @@ class DecisionsProposeesUE(DecisionsProposees):
 
         # Moyenne de l'UE ?
         ue_status = self.rcue.ue_status_pair if paire else self.rcue.ue_status_impair
-        self.moy_ue = ue_status["cur_moy_ue"]
-        self.moy_ue_with_cap = ue_status["moy"]
+        if ue_status:
+            self.moy_ue = ue_status["cur_moy_ue"]
+            self.moy_ue_with_cap = ue_status["moy"]
         self.ue_status = ue_status
         self.codes = [self.codes[0]] + sorted(self.codes[1:])
 
@@ -1440,6 +1447,11 @@ class DecisionsProposeesUE(DecisionsProposees):
         """Calcul des .codes attribuables et de l'explanation associée"""
         if self.inscription_etat != scu.INSCRIT:
             return
+        # Si UE validée antérieure, on ne peut pas changer le code
+        if not self.formsemestre:
+            self.codes = [self.validation.code] if self.validation else []
+            self.explanation = "enregistrée"
+            return
         if (
             self.moy_ue > (sco_codes.CursusBUT.BARRE_MOY - sco_codes.NOTES_TOLERANCE)
         ) or self.formsemestre.modalite == "EXT":
@@ -1499,6 +1511,8 @@ class DecisionsProposeesUE(DecisionsProposees):
     def erase(self):
         """Efface la décision de jury de cet étudiant pour cette UE"""
         # par prudence, on requete toutes les validations, en cas de doublons
+        if not self.formsemestre:
+            return  # antérieure, rien à effacer
         validations = ScolarFormSemestreValidation.query.filter_by(
             etudid=self.etud.id, formsemestre_id=self.formsemestre.id, ue_id=self.ue.id
         )
diff --git a/app/but/jury_but_view.py b/app/but/jury_but_view.py
index cfb778152b2794f6e8ec94684f6d46ab1ec18370..f2ead5ac2b70e6f27eb21849f9c833d8d66a4927 100644
--- a/app/but/jury_but_view.py
+++ b/app/but/jury_but_view.py
@@ -199,12 +199,40 @@ def _gen_but_niveau_ue(
             </div>
         </div>
         """
+    elif dec_ue.formsemestre is None:
+        # Validation d'UE antérieure (semestre hors année scolaire courante)
+        if dec_ue.validation:
+            moy_ue_str = f"""<span>{scu.fmt_note(dec_ue.validation.moy_ue)}</span>"""
+            scoplement = f"""<div class="scoplement">
+                <div>
+                    <b>UE {ue.acronyme} antérieure </b>
+                    <span>validée {dec_ue.validation.code}
+                    le {dec_ue.validation.event_date.strftime("%d/%m/%Y")}
+                    </span>
+                </div>
+                <div>Non reprise dans l'année en cours</div>
+            </div>
+            """
+        else:
+            moy_ue_str = """<span>-</span>"""
+            scoplement = """<div class="scoplement">
+                <div>
+                    <b>Pas d'UE en cours ou validée dans cette compétence de ce côté.</b>
+                </div>
+            </div>
+            """
     else:
         moy_ue_str = f"""<span>{scu.fmt_note(dec_ue.moy_ue)}</span>"""
         if dec_ue.code_valide:
-            scoplement = f"""<div class="scoplement">
-            <div>Code {dec_ue.code_valide} enregistré le {dec_ue.validation.event_date.strftime("%d/%m/%Y")}
+            date_str = (
+                f"""enregistré le {dec_ue.validation.event_date.strftime("%d/%m/%Y")}
             à {dec_ue.validation.event_date.strftime("%Hh%M")}
+            """
+                if dec_ue.validation and dec_ue.validation.event_date
+                else ""
+            )
+            scoplement = f"""<div class="scoplement">
+            <div>Code {dec_ue.code_valide} {date_str}
             </div>
             </div>
             """