From fd9c016295f8a88a2c1e38d350eafc8b0952f56a Mon Sep 17 00:00:00 2001
From: Guillaume Meinesz <guillaume.meinesz@gmail.com>
Date: Thu, 14 Mar 2024 16:37:16 +0100
Subject: [PATCH] 3 changements cf description
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

1) En cas de reconnexion après une session, l'utilisateur doit attendre 20mn pour pouvroir lancer la session suivante. Il peut se deconnecter pour laisser la tablette un autre utilisateur.
2) dans le json de structure des sessions/epreuves/items, les attributs d'epreuve "date" et "fin" sont rendus fonctionnels
3) dans les traces, le timestamp du lancement de chaques items est maintenant tracé.
4) si une session ne contient aucune epreuve eligible (en rapport aux dates de fin et date de début) alors l'utilisateurne passe pas par l'écran d'attente et on lui pousse la session qui suit.
---
 Assets/GestionProgression.cs           |  11 +-
 Assets/NewSystemeDeTraces.cs           |   4 +-
 Assets/Scenes/MainScene.unity          | 158 +++++++++++++++-
 Assets/mainManager.cs                  | 245 +++++++++++++++++++++++--
 ProjectSettings/ProjectSettings.asset  |   4 +-
 UserSettings/Layouts/default-2022.dwlt | 154 ++++++++--------
 6 files changed, 474 insertions(+), 102 deletions(-)

diff --git a/Assets/GestionProgression.cs b/Assets/GestionProgression.cs
index 85d279ee..48866ab8 100644
--- a/Assets/GestionProgression.cs
+++ b/Assets/GestionProgression.cs
@@ -12,7 +12,7 @@ public class GestionProgression : MonoBehaviour
         // Créer un objet contenant les données à sauvegarder, y compris le timestamp actuel
 
 
-
+        Debug.Log("SauveProgression forcezero="+ forcezero);
         // Charger la liste actuelle de sauvegardes ou créer une nouvelle liste si elle n'existe pas encore
         listDeDonnees sauvegardes = ChargerSauvegardes();
         bool foundinside = false;
@@ -27,7 +27,16 @@ public class GestionProgression : MonoBehaviour
                 }
                 if (forcezero)
                 {
+                    string AttributBannissement = "bannissement_" + NewSystemeDeTraces.returnUserIDFLuence_or_UserIDHM();
+                    if (PlayerPrefs.HasKey(AttributBannissement))
+                    {
+                        PlayerPrefs.SetString(AttributBannissement, "");
+
+                        Debug.Log("AttributBannissement exists and is earased AttributBannissement=" + AttributBannissement);
+                    }
+                    //
                     dd.NumeroSession = 0;
+                    
                 }
             }
         }
diff --git a/Assets/NewSystemeDeTraces.cs b/Assets/NewSystemeDeTraces.cs
index 1f35d49f..c8247334 100644
--- a/Assets/NewSystemeDeTraces.cs
+++ b/Assets/NewSystemeDeTraces.cs
@@ -56,6 +56,7 @@ public class NewSystemeDeTraces : MonoBehaviour
     [System.Serializable]
     public class NewSystemeDeTraces_item
     {
+        public string date;
         public string id;
         public string[] listeChoix;
         public float duree;
@@ -83,6 +84,7 @@ public class NewSystemeDeTraces : MonoBehaviour
             jsonContents = File.ReadAllText(jsonFilePath);
             //mM.texteCheat.text += " un json existe deja length= " + jsonContents.Length;
             //Debug.Log("Contenu JSON existant : " + jsonContents);
+            
         }
         else
         {
@@ -95,7 +97,6 @@ public class NewSystemeDeTraces : MonoBehaviour
         if (jsonContents.Length > 0)
         {
             traceJson = JsonUtility.FromJson<NewSystemeDeTracesJSONRoot>(jsonContents);
-
         }
     }
 
@@ -324,6 +325,7 @@ public class NewSystemeDeTraces : MonoBehaviour
 
         NewSystemeDeTraces_item newitem = new NewSystemeDeTraces_item();
         newitem.id = mM.i.id;
+        newitem.date = GetFormattedDate() + "-" + GetTimeAsString();
         newitem.duree = mM.user_dureeActionOnChoix;
         newitem.choix = mM.user_choix;
         newitem.scoreItem = mM.scoreItem;
diff --git a/Assets/Scenes/MainScene.unity b/Assets/Scenes/MainScene.unity
index 08470122..e3e2db9e 100644
--- a/Assets/Scenes/MainScene.unity
+++ b/Assets/Scenes/MainScene.unity
@@ -4605,6 +4605,9 @@ MonoBehaviour:
     modalite: 
     consigne: 
     fond: 
+    condition: 
+    debut: 
+    fin: 
     randomiser: 0
     nbItemsMax: 0
     items: []
@@ -4658,6 +4661,7 @@ MonoBehaviour:
   oreilleListenScript: {fileID: 532516272}
   gestionProg: {fileID: 761270584}
   clefPourSauvegardeUtilisateur: 
+  texteSessionQuestionNumero: {fileID: 1383918252}
   boutonDeconnexionText: {fileID: 1304225518}
   texteFinSession: {fileID: 2130757248}
   gameObjFin: {fileID: 234776227}
@@ -5801,6 +5805,142 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 1336072439}
   m_CullTransparentMesh: 1
+--- !u!1 &1383918250
+GameObject:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  serializedVersion: 6
+  m_Component:
+  - component: {fileID: 1383918251}
+  - component: {fileID: 1383918253}
+  - component: {fileID: 1383918252}
+  m_Layer: 5
+  m_Name: Text (TMP)
+  m_TagString: Untagged
+  m_Icon: {fileID: 0}
+  m_NavMeshLayer: 0
+  m_StaticEditorFlags: 0
+  m_IsActive: 1
+--- !u!224 &1383918251
+RectTransform:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1383918250}
+  m_LocalRotation: {x: -0, y: -0, z: -0, w: 1}
+  m_LocalPosition: {x: 0, y: 0, z: 0}
+  m_LocalScale: {x: 1, y: 1, z: 1}
+  m_ConstrainProportionsScale: 0
+  m_Children: []
+  m_Father: {fileID: 2006134183}
+  m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+  m_AnchorMin: {x: 1.02, y: 0.1}
+  m_AnchorMax: {x: 6, y: 0.99}
+  m_AnchoredPosition: {x: 0, y: 0}
+  m_SizeDelta: {x: 0.000005722046, y: 0}
+  m_Pivot: {x: 0.5, y: 0.5}
+--- !u!114 &1383918252
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1383918250}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_Material: {fileID: 0}
+  m_Color: {r: 1, g: 1, b: 1, a: 1}
+  m_RaycastTarget: 0
+  m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0}
+  m_Maskable: 1
+  m_OnCullStateChanged:
+    m_PersistentCalls:
+      m_Calls: []
+  m_text: 'session : 1/12
+
+    question : 1/12'
+  m_isRightToLeft: 0
+  m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
+  m_fontSharedMaterials: []
+  m_fontMaterial: {fileID: 0}
+  m_fontMaterials: []
+  m_fontColor32:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontColor: {r: 1, g: 1, b: 1, a: 1}
+  m_enableVertexGradient: 0
+  m_colorMode: 3
+  m_fontColorGradient:
+    topLeft: {r: 1, g: 1, b: 1, a: 1}
+    topRight: {r: 1, g: 1, b: 1, a: 1}
+    bottomLeft: {r: 1, g: 1, b: 1, a: 1}
+    bottomRight: {r: 1, g: 1, b: 1, a: 1}
+  m_fontColorGradientPreset: {fileID: 0}
+  m_spriteAsset: {fileID: 0}
+  m_tintAllSprites: 0
+  m_StyleSheet: {fileID: 0}
+  m_TextStyleHashCode: -1183493901
+  m_overrideHtmlColors: 0
+  m_faceColor:
+    serializedVersion: 2
+    rgba: 4294967295
+  m_fontSize: 22.55
+  m_fontSizeBase: 36
+  m_fontWeight: 400
+  m_enableAutoSizing: 1
+  m_fontSizeMin: 18
+  m_fontSizeMax: 72
+  m_fontStyle: 0
+  m_HorizontalAlignment: 1
+  m_VerticalAlignment: 256
+  m_textAlignment: 65535
+  m_characterSpacing: 0
+  m_wordSpacing: 0
+  m_lineSpacing: 0
+  m_lineSpacingMax: 0
+  m_paragraphSpacing: 0
+  m_charWidthMaxAdj: 0
+  m_enableWordWrapping: 1
+  m_wordWrappingRatios: 0.4
+  m_overflowMode: 0
+  m_linkedTextComponent: {fileID: 0}
+  parentLinkedComponent: {fileID: 0}
+  m_enableKerning: 1
+  m_enableExtraPadding: 0
+  checkPaddingRequired: 0
+  m_isRichText: 1
+  m_parseCtrlCharacters: 1
+  m_isOrthographic: 1
+  m_isCullingEnabled: 0
+  m_horizontalMapping: 0
+  m_verticalMapping: 0
+  m_uvLineOffset: 0
+  m_geometrySortingOrder: 0
+  m_IsTextObjectScaleStatic: 0
+  m_VertexBufferAutoSizeReduction: 0
+  m_useMaxVisibleDescender: 1
+  m_pageToDisplay: 1
+  m_margin: {x: 0, y: 0, z: 0, w: 0}
+  m_isUsingLegacyAnimationComponent: 0
+  m_isVolumetricText: 0
+  m_hasFontAssetChanged: 0
+  m_baseMaterial: {fileID: 0}
+  m_maskOffset: {x: 0, y: 0, z: 0, w: 0}
+--- !u!222 &1383918253
+CanvasRenderer:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 1383918250}
+  m_CullTransparentMesh: 1
 --- !u!1 &1448299096
 GameObject:
   m_ObjectHideFlags: 0
@@ -6184,6 +6324,7 @@ GameObject:
   - component: {fileID: 2006134186}
   - component: {fileID: 2006134185}
   - component: {fileID: 2006134184}
+  - component: {fileID: 2006134187}
   m_Layer: 5
   m_Name: boutonIEHM
   m_TagString: Untagged
@@ -6202,7 +6343,8 @@ RectTransform:
   m_LocalPosition: {x: 0, y: 0, z: 0}
   m_LocalScale: {x: 1, y: 1, z: 1}
   m_ConstrainProportionsScale: 0
-  m_Children: []
+  m_Children:
+  - {fileID: 1383918251}
   m_Father: {fileID: 1312748374}
   m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
   m_AnchorMin: {x: 0, y: 0.9}
@@ -6304,6 +6446,20 @@ CanvasRenderer:
   m_PrefabAsset: {fileID: 0}
   m_GameObject: {fileID: 2006134182}
   m_CullTransparentMesh: 1
+--- !u!114 &2006134187
+MonoBehaviour:
+  m_ObjectHideFlags: 0
+  m_CorrespondingSourceObject: {fileID: 0}
+  m_PrefabInstance: {fileID: 0}
+  m_PrefabAsset: {fileID: 0}
+  m_GameObject: {fileID: 2006134182}
+  m_Enabled: 1
+  m_EditorHideFlags: 0
+  m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3}
+  m_Name: 
+  m_EditorClassIdentifier: 
+  m_AspectMode: 2
+  m_AspectRatio: 1
 --- !u!1 &2130757246
 GameObject:
   m_ObjectHideFlags: 0
diff --git a/Assets/mainManager.cs b/Assets/mainManager.cs
index 458f59ec..f775700e 100644
--- a/Assets/mainManager.cs
+++ b/Assets/mainManager.cs
@@ -6,6 +6,7 @@ using TMPro;
 using UnityEngine;
 using UnityEngine.SceneManagement;
 using UnityEngine.UI;
+using UnityEngine.Windows;
 using static ChargementJSONStructure;
 using static EpreuveCondition;
 
@@ -51,6 +52,11 @@ public class mainManager : MonoBehaviour
     public listenAnim oreilleListenScript;
     public GestionProgression gestionProg;
     public string clefPourSauvegardeUtilisateur;
+    private int durePauseBannissementEnMinutes = 20;
+    private bool bannissementIsOn;
+    private bool bannissementIsOver;
+    private DateTime bannissementExpirationDateTime;
+    public TextMeshProUGUI texteSessionQuestionNumero;
     public class groupemementChoixEtPrefabBoutonQCM
     {
         public ChargementJSONStructure.Choix choix;
@@ -65,8 +71,8 @@ public class mainManager : MonoBehaviour
         resetClasse();
         currentSession = 0;
         Time.timeScale = 1.0f;
-
-
+        bannissementIsOn = false;
+        bannissementIsOver = false;
         // Vérifier si la clé existe dans le dictionnaire
         clefPourSauvegardeUtilisateur = "gm2024E";
 
@@ -93,6 +99,34 @@ public class mainManager : MonoBehaviour
             Debug.Log("CLEF "+ clefPourSauvegardeUtilisateur +" NOT FOUND starting with session N °0");
         }
         toutessessionsacheves = false;
+
+        string AttributBannissement = "bannissement_" + NewSystemeDeTraces.returnUserIDFLuence_or_UserIDHM();
+
+        if (PlayerPrefs.HasKey(AttributBannissement))
+        {
+            string timestampString = PlayerPrefs.GetString(AttributBannissement);
+            if (!string.IsNullOrEmpty(timestampString))
+            {
+                DateTime timestampDateTime;
+                bool parseSuccess = DateTime.TryParseExact(timestampString, "yyyy-MM-dd HH:mm", null, System.Globalization.DateTimeStyles.None, out timestampDateTime);
+                if (parseSuccess)
+                {
+                    Debug.Log("Timestamp récupéré : " + timestampDateTime);
+                    bannissementExpirationDateTime = timestampDateTime.AddMinutes(20);
+                    DateTime now = DateTime.Now;
+                    if (now < bannissementExpirationDateTime)
+                    {
+                        bannissementIsOn = true;
+                    }
+                    // Tu peux maintenant utiliser timestampDateTime comme un objet DateTime
+                }
+                else
+                {
+                    Debug.LogError("Erreur lors de la conversion du timestamp.");
+                }
+            }
+        }
+        s = jsonStructureScript.data.sessions[currentSession];
         if (currentSession >= jsonStructureScript.data.sessions.Count)
         {
             toutessessionsacheves = true;
@@ -109,9 +143,15 @@ public class mainManager : MonoBehaviour
             i = e.items[currentItem];
             ouvrirMenu(false);
         }
+        else if (bannissementIsOn)
+        {
+            ouvrirMenu(false);
+        }
         else
         {
-            playSteps();
+            //playSteps();
+            Debug.Log("nextstep from start function");
+            nextEpreuve(true);
         }
 
     }
@@ -121,17 +161,26 @@ public class mainManager : MonoBehaviour
 
     public void boutonRAZPlayerprefsForthisuserClicked()
     {
+        Debug.Log("boutonRAZPlayerprefsForthisuserClicked");
         compteurdeclickOnBoutonRAZ++;
         if (compteurdeclickOnBoutonRAZ >= 15 && compteurdeclickOnBoutonRAZ<20)
         {
             deconnexionPlusRAZ = true;
             boutonDeconnexionText.text = "Déconnecter + RAZ progression";
             boutonDeconnexion.SetActive(true);
+
+            if (bannissementIsOn)
+            {
+                BoutonnextsessionTexte.text = "Lancer la session";
+                boutonSessionSuivante.SetActive(true);
+            }
+
         }
         else if (compteurdeclickOnBoutonRAZ >= 20)
         {
             deconnexionPlusRAZ = false;
             boutonDeconnexionText.text = "Déconnecter l'utilisateur sans RAZ progression";
+            compteurdeclickOnBoutonRAZ = 0;
         }
     }
     private void resetClasse()
@@ -321,7 +370,25 @@ public class mainManager : MonoBehaviour
         {
             e.nbItemsMax = e.items.Count;
         }
-
+        int numsess = currentSession + 1;
+        texteSessionQuestionNumero.text = "Session N°" + numsess.ToString() + "/" + jsonStructureScript.data.sessions.Count.ToString()+"\n";
+        int numiteTotal = 0;
+        int numIteCurrent = 1;
+        int indexxeppr = 0;
+        foreach (Epreuve eee in s.epreuves)
+        {
+            if(indexxeppr< currentEpreuve)
+            {
+                numIteCurrent += eee.items.Count;
+            }
+            else if (indexxeppr== currentEpreuve)
+            {
+                numIteCurrent += currentItem;
+            }
+            numiteTotal += eee.items.Count;
+            indexxeppr++;
+        }
+        texteSessionQuestionNumero.text += "Question N°" + numIteCurrent.ToString() + "/" + numiteTotal.ToString();
         if (!epreuveitemscurrentSet)
         {
             epreuvesitemsCurrent = e.items;
@@ -373,16 +440,42 @@ public class mainManager : MonoBehaviour
 
         return shuffled;
     }
-
-    public void nextEpreuve()
+    private bool initialisationFirstEpreuve_EnCours = false;
+    public void nextEpreuve(bool initialisation=false)
     {
-        Debug.Log("nextEpreuve");
-        // on regarde s'il y a une autre epreuve dans la m�me session � lancer
+        if (initialisation)
+        {
+            s = jsonStructureScript.data.sessions[currentSession];
+            currentEpreuve = -1;
+            initialisationFirstEpreuve_EnCours = true;
+        }
+
+        //Debug.Log("s = " + s + " currentEpreuve=" + currentEpreuve);
+        // on regarde s'il y a une autre epreuve dans la meme session a lancer
         if (s!=null && currentEpreuve >= s.epreuves.Count - 1)
         {
+            if (initialisationFirstEpreuve_EnCours)
+            {
+                // il n'y a aucune epreuve de valide dans cette session on regarde si il y a une session suivante
+                currentSession++;
+                if(currentSession>= jsonStructureScript.data.sessions.Count)
+                {
+                    // Dernière session atteinte. Fin du jeu
+                    Debug.Log("Dernière session atteinte. Fin du jeu");
+                    ouvrirMenu(true);
+                }
+                else
+                {
+                    //on initialise la session suivante existante sur sa premiere epreuve, sans passer par une deconnexion
+                    nextEpreuve(true);
+                }
+            }
+            else
+            {
+                ouvrirMenu(true);
+            }
             //pas d'autre epreuve dans cette session, on clot la session
-            Debug.Log("pas d'autre epreuve dans cette session, on clot la session currentEpreuve="+ currentEpreuve+ " s.epreuves.Count="+ s.epreuves.Count);
-            ouvrirMenu(true);
+            //Debug.Log("pas d'autre epreuve dans cette session, on clot la session currentEpreuve="+ currentEpreuve+ " s.epreuves.Count="+ s.epreuves.Count);
         }
         else
         {
@@ -393,11 +486,13 @@ public class mainManager : MonoBehaviour
                 currentItem = 0;
                 epreuveConsignebeenPlayed = false;
                 current_step = -1;
+                initialisationFirstEpreuve_EnCours = false;
                 resetItem();
                 playSteps();
             }
             else
             {
+                Debug.Log("next epreuve from next epreuve");
                 nextEpreuve();
             }
         }
@@ -405,8 +500,55 @@ public class mainManager : MonoBehaviour
 
     public bool playableEpreuve(Epreuve test_ep)
     {
-        EpreuveCondition cond = new EpreuveCondition(test_ep);
-        return cond.eval();
+        Debug.Log("testing playableEpreuve id="+test_ep.id+" titre ="+test_ep.titre);
+        bool epreuveIsPlayable = true;
+        DateTime dateNow = DateTime.Now;
+        DateTime dateTime;
+        if (test_ep!=null && test_ep.debut!=null && test_ep.debut.Length > 0)
+        {
+            if (DateTime.TryParse(test_ep.debut, out dateTime))
+            {
+                if(dateTime > dateNow)
+                {
+                    Debug.Log("dateTime debut ="+ dateTime+" exceeds dateNow="+ dateNow);
+                    epreuveIsPlayable = false;
+                }
+            }
+            else
+            {
+                Debug.Log("debut value does not match a valid date");
+
+            }
+        }
+        else
+        {
+            Debug.Log("this epreuve does not have a debut value");
+        }
+        if (test_ep != null && test_ep.fin != null && test_ep.fin.Length > 0)
+        {
+            if (DateTime.TryParse(test_ep.fin, out dateTime))
+            {
+                if (dateTime < dateNow)
+                {
+                    epreuveIsPlayable = false;
+                    Debug.Log("dateTime fin =" + dateTime + " bellow dateNow=" + dateNow);
+
+                }
+            }
+            else
+            {
+                Debug.Log("end value does not match a valid date");
+
+            }
+        }
+        else
+        {
+            Debug.Log("this epreuve does not have an end value");
+
+        }
+        Debug.Log("epreuveIsPlayable="+ epreuveIsPlayable);
+
+        return epreuveIsPlayable;
     }
 
 
@@ -466,6 +608,29 @@ public class mainManager : MonoBehaviour
             // reveil
             }
         }
+        if (bannissementIsOn)
+        {
+            DateTime now = DateTime.Now;
+
+            // Vérifie si la date actuelle est antérieure à la date d'expiration
+            if (now < bannissementExpirationDateTime)
+            {
+                // Calcule la durée restante jusqu'à la reprise
+                TimeSpan tempsRestant = bannissementExpirationDateTime - now;
+
+                // Affiche le temps restant
+                BoutonsessionActuelleTexte.text = "Utilisateur en pause. Reprise possible dans "+ tempsRestant.Minutes + " minutes et "+ tempsRestant.Seconds + " secondes";
+            }
+            else
+            {
+                BoutonsessionActuelleTexte.text = "Pause terminée. Lancer la session";
+                boutonDeconnexion.SetActive(false);
+                bannissementIsOn = false;
+                bannissementIsOver = true;
+                Debug.Log("La pause a déjà expiré.");
+            }
+
+        }
     }
 
     private void reveilDone()
@@ -718,29 +883,30 @@ public class mainManager : MonoBehaviour
         bool nbitempassesReached = false;
         int nbItemsTotauxDansCetteSession = 0;
 
+        int indexepreuveParsed = 0;
         foreach (Epreuve epp in s.epreuves)
         {
+            int indexItemParsed = 0;
             foreach (EpreuveItem eii in epp.items)
             {
-
-
                 if (!nbitempassesReached)
                 {
                     nbItemsPasses++;
                 }
                 nbItemsTotauxDansCetteSession++;
-                if (eii == i)
+                if (indexepreuveParsed > currentEpreuve || (indexepreuveParsed >= currentEpreuve && indexItemParsed >= currentItem))
                 {
                     nbitempassesReached = true;
                 }
+                indexItemParsed++;
             }
+            indexepreuveParsed++;
         }
         int maxsession = jsonStructureScript.data.sessions.Count - 1;
         int maxepreuve = jsonStructureScript.data.sessions[maxsession].epreuves.Count - 1;
         int maxitem = jsonStructureScript.data.sessions[maxsession].epreuves[maxepreuve].items.Count - 1;
 
 
-
         Debug.Log("nbItemsPasses = " + nbItemsPasses + " nbItemsTotauxDansCetteSession=" + nbItemsTotauxDansCetteSession + " i.id=" + i.id + " e.id=" + e.id);
         infoSessionItemEnCours.text += "\n\nQuestion\nN°" + nbItemsPasses.ToString() + "/" + nbItemsTotauxDansCetteSession.ToString();
         if (i == jsonStructureScript.data.sessions[maxsession].epreuves[maxepreuve].items[maxitem])
@@ -786,19 +952,45 @@ public class mainManager : MonoBehaviour
                 boutonSessionEnCours.SetActive(false);
                 boutonDeconnexion.SetActive(true);
             }
+            if (bannissementIsOn)
+            {
+                boutonDeconnexion.SetActive(true);
+
+            }
         }
 
 
     }
     public void clicRetourSessionEnCOurs()
     {
-        Time.timeScale = 1.0f;
-        Debug.Log("clicRetourSessionEnCOurs");
-        gameObjFin.SetActive(false);
+        if (!bannissementIsOn)
+        {
+            Time.timeScale = 1.0f;
+            Debug.Log("clicRetourSessionEnCOurs");
+            gameObjFin.SetActive(false);
+            if (bannissementIsOver)
+            {
+                bannissementIsOver = false;
+                nextEpreuve(true);
+                
+            }
+        }
     }
 
     public void clicSessionSuivante()
     {
+        if (bannissementIsOn)
+        {
+            bannissementIsOn = false;
+            string AttributBannissement = "bannissement_" + NewSystemeDeTraces.returnUserIDFLuence_or_UserIDHM();
+            if (PlayerPrefs.HasKey(AttributBannissement))
+            {
+                PlayerPrefs.SetString(AttributBannissement, "");
+                PlayerPrefs.Save();
+            }
+            boutonSessionSuivante.SetActive(false);
+            nextEpreuve(true);
+        }
         /*
         Debug.Log("clicSessionSuivante");
         resetItem();
@@ -815,6 +1007,7 @@ public class mainManager : MonoBehaviour
         gameObjFin.SetActive(false);*/
 
     }
+    private bool deconnexionViaClickBoutonDeconnexion;
     public void deconnexion()
     {
         Debug.Log("deconnexion");
@@ -823,20 +1016,32 @@ public class mainManager : MonoBehaviour
         boutonSessionSuivante.SetActive(false);
         boutonSessionEnCours.SetActive(false);
         boutonDeconnexion.SetActive(false);
+        deconnexionViaClickBoutonDeconnexion = true;
         StartCoroutine(terminateScene());
         //texteFinSession.text = "FIN DE SESSION / Envoi des traces au serveur en cours...";
     }
 
     public void launchTerminateScene()
     {
+        deconnexionViaClickBoutonDeconnexion = false;
         StartCoroutine(terminateScene());
     }
     public IEnumerator terminateScene()
     {
+        Debug.Log("terminateScene deconnexionPlusRAZ="+ deconnexionPlusRAZ);
         if (deconnexionPlusRAZ)
         {
             gestionProg.SauveProgression(0, true);
-
+        }
+        else if (!deconnexionViaClickBoutonDeconnexion)
+        {
+            // on enregistre dans les playerprefs une ref à ce userlogin+teachercode+timestamp à la minuté près pour le bannir
+            string AttributBannissement = "bannissement_" + NewSystemeDeTraces.returnUserIDFLuence_or_UserIDHM();
+            DateTime currentTime = DateTime.Now;
+            string timestampString = currentTime.ToString("yyyy-MM-dd HH:mm");
+            PlayerPrefs.SetString(AttributBannissement, timestampString);
+            PlayerPrefs.Save();
+            // Sauvegarde des modifica
         }
         Time.timeScale = 1.0f;
         Debug.Log("terminateScene");
diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset
index 1f41c2eb..b5a3c744 100644
--- a/ProjectSettings/ProjectSettings.asset
+++ b/ProjectSettings/ProjectSettings.asset
@@ -136,7 +136,7 @@ PlayerSettings:
   vulkanEnableLateAcquireNextImage: 0
   vulkanEnableCommandBufferRecycling: 1
   loadStoreDebugModeEnabled: 0
-  bundleVersion: 1.14
+  bundleVersion: 1.15
   preloadedAssets: []
   metroInputSource: 0
   wsaTransparentSwapchain: 0
@@ -166,7 +166,7 @@ PlayerSettings:
     iPhone: 0
     tvOS: 0
   overrideDefaultApplicationIdentifier: 1
-  AndroidBundleVersionCode: 6
+  AndroidBundleVersionCode: 7
   AndroidMinSdkVersion: 22
   AndroidTargetSdkVersion: 0
   AndroidPreferredInstallLocation: 1
diff --git a/UserSettings/Layouts/default-2022.dwlt b/UserSettings/Layouts/default-2022.dwlt
index 48be7dbe..dd916130 100644
--- a/UserSettings/Layouts/default-2022.dwlt
+++ b/UserSettings/Layouts/default-2022.dwlt
@@ -19,7 +19,7 @@ MonoBehaviour:
     width: 1536
     height: 772.8
   m_ShowMode: 4
-  m_Title: Project
+  m_Title: Game
   m_RootView: {fileID: 2}
   m_MinSize: {x: 875, y: 300}
   m_MaxSize: {x: 10000, y: 10000}
@@ -119,7 +119,7 @@ MonoBehaviour:
   m_MinSize: {x: 300, y: 100}
   m_MaxSize: {x: 24288, y: 16192}
   vertical: 0
-  controlID: 122
+  controlID: 49
 --- !u!114 &6
 MonoBehaviour:
   m_ObjectHideFlags: 52
@@ -139,12 +139,12 @@ MonoBehaviour:
     serializedVersion: 2
     x: 0
     y: 0
-    width: 1431.2
+    width: 1228.8
     height: 722.8
   m_MinSize: {x: 200, y: 100}
   m_MaxSize: {x: 16192, y: 16192}
   vertical: 1
-  controlID: 41
+  controlID: 50
 --- !u!114 &7
 MonoBehaviour:
   m_ObjectHideFlags: 52
@@ -164,12 +164,12 @@ MonoBehaviour:
     serializedVersion: 2
     x: 0
     y: 0
-    width: 1431.2
-    height: 402.4
+    width: 1228.8
+    height: 485.6
   m_MinSize: {x: 200, y: 50}
   m_MaxSize: {x: 16192, y: 8096}
   vertical: 0
-  controlID: 42
+  controlID: 40
 --- !u!114 &8
 MonoBehaviour:
   m_ObjectHideFlags: 52
@@ -187,8 +187,8 @@ MonoBehaviour:
     serializedVersion: 2
     x: 0
     y: 0
-    width: 388
-    height: 402.4
+    width: 292
+    height: 485.6
   m_MinSize: {x: 201, y: 221}
   m_MaxSize: {x: 4001, y: 4021}
   m_ActualView: {fileID: 13}
@@ -206,23 +206,23 @@ MonoBehaviour:
   m_Enabled: 1
   m_EditorHideFlags: 1
   m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
-  m_Name: SceneView
+  m_Name: GameView
   m_EditorClassIdentifier: 
   m_Children: []
   m_Position:
     serializedVersion: 2
-    x: 388
+    x: 292
     y: 0
-    width: 1043.2
-    height: 402.4
+    width: 936.80005
+    height: 485.6
   m_MinSize: {x: 202, y: 221}
   m_MaxSize: {x: 4002, y: 4021}
-  m_ActualView: {fileID: 14}
+  m_ActualView: {fileID: 12}
   m_Panes:
   - {fileID: 14}
   - {fileID: 12}
-  m_Selected: 0
-  m_LastSelected: 1
+  m_Selected: 1
+  m_LastSelected: 0
 --- !u!114 &10
 MonoBehaviour:
   m_ObjectHideFlags: 52
@@ -233,23 +233,23 @@ MonoBehaviour:
   m_Enabled: 1
   m_EditorHideFlags: 1
   m_Script: {fileID: 12006, guid: 0000000000000000e000000000000000, type: 0}
-  m_Name: ProjectBrowser
+  m_Name: ConsoleWindow
   m_EditorClassIdentifier: 
   m_Children: []
   m_Position:
     serializedVersion: 2
     x: 0
-    y: 402.4
-    width: 1431.2
-    height: 320.4
-  m_MinSize: {x: 231, y: 271}
-  m_MaxSize: {x: 10001, y: 10021}
-  m_ActualView: {fileID: 15}
+    y: 485.6
+    width: 1228.8
+    height: 237.19998
+  m_MinSize: {x: 101, y: 121}
+  m_MaxSize: {x: 4001, y: 4021}
+  m_ActualView: {fileID: 16}
   m_Panes:
   - {fileID: 15}
   - {fileID: 16}
-  m_Selected: 0
-  m_LastSelected: 1
+  m_Selected: 1
+  m_LastSelected: 0
 --- !u!114 &11
 MonoBehaviour:
   m_ObjectHideFlags: 52
@@ -265,12 +265,12 @@ MonoBehaviour:
   m_Children: []
   m_Position:
     serializedVersion: 2
-    x: 1431.2
+    x: 1228.8
     y: 0
-    width: 104.80005
+    width: 307.19995
     height: 722.8
-  m_MinSize: {x: 276, y: 71}
-  m_MaxSize: {x: 4001, y: 4021}
+  m_MinSize: {x: 275, y: 50}
+  m_MaxSize: {x: 4000, y: 4000}
   m_ActualView: {fileID: 17}
   m_Panes:
   - {fileID: 17}
@@ -296,10 +296,10 @@ MonoBehaviour:
     m_Tooltip: 
   m_Pos:
     serializedVersion: 2
-    x: 388
+    x: 292
     y: 73.6
-    width: 1041.2
-    height: 381.4
+    width: 934.80005
+    height: 464.6
   m_SerializedDataModeController:
     m_DataMode: 0
     m_PreferredDataMode: 0
@@ -316,7 +316,7 @@ MonoBehaviour:
   m_ShowGizmos: 0
   m_TargetDisplay: 0
   m_ClearColor: {r: 0, g: 0, b: 0, a: 0}
-  m_TargetSize: {x: 1301.5, y: 450.5}
+  m_TargetSize: {x: 1168.5, y: 554.5}
   m_TextureFilterMode: 0
   m_TextureHideFlags: 61
   m_RenderIMGUI: 1
@@ -331,10 +331,10 @@ MonoBehaviour:
     m_VRangeLocked: 0
     hZoomLockedByDefault: 0
     vZoomLockedByDefault: 0
-    m_HBaseRangeMin: -520.60004
-    m_HBaseRangeMax: 520.60004
-    m_VBaseRangeMin: -180.2
-    m_VBaseRangeMax: 180.2
+    m_HBaseRangeMin: -467.4
+    m_HBaseRangeMax: 467.4
+    m_VBaseRangeMin: -221.8
+    m_VBaseRangeMax: 221.8
     m_HAllowExceedBaseRangeMin: 1
     m_HAllowExceedBaseRangeMax: 1
     m_VAllowExceedBaseRangeMin: 1
@@ -352,23 +352,23 @@ MonoBehaviour:
       serializedVersion: 2
       x: 0
       y: 21
-      width: 1041.2
-      height: 360.4
-    m_Scale: {x: 0.9999999, y: 0.99999994}
-    m_Translation: {x: 520.6, y: 180.2}
+      width: 934.80005
+      height: 443.6
+    m_Scale: {x: 1, y: 1}
+    m_Translation: {x: 467.40002, y: 221.8}
     m_MarginLeft: 0
     m_MarginRight: 0
     m_MarginTop: 0
     m_MarginBottom: 0
     m_LastShownAreaInsideMargins:
       serializedVersion: 2
-      x: -520.60004
-      y: -180.20001
-      width: 1041.2001
-      height: 360.40002
+      x: -467.40002
+      y: -221.8
+      width: 934.80005
+      height: 443.6
     m_MinimalGUI: 1
-  m_defaultScale: 0.9999999
-  m_LastWindowPixelSize: {x: 1301.5, y: 476.75}
+  m_defaultScale: 1
+  m_LastWindowPixelSize: {x: 1168.5, y: 580.75}
   m_ClearInEditMode: 1
   m_NoCameraWarning: 1
   m_LowResolutionForAspectRatios: 01000000000000000000
@@ -396,8 +396,8 @@ MonoBehaviour:
     serializedVersion: 2
     x: 0
     y: 73.6
-    width: 387
-    height: 381.4
+    width: 291
+    height: 464.6
   m_SerializedDataModeController:
     m_DataMode: 0
     m_PreferredDataMode: 0
@@ -411,9 +411,9 @@ MonoBehaviour:
   m_SceneHierarchy:
     m_TreeViewState:
       scrollPos: {x: 0, y: 0}
-      m_SelectedIDs: 
+      m_SelectedIDs: 3cb90000
       m_LastClickedID: 0
-      m_ExpandedIDs: 9af4f9ffdef4f9ff6c15faff9e17faffb217faffd070faff4e77faff3078faffd27cfaff167dfaffd09efaff30a2faff4ca2faff9890fbff38b1fbff5206fcff0429fcffde2ffcffda97fcff1e98fcffacb8fcffdebafcfff2bafcfff41afdff245bfdffe8e2fdff1ce9fdff60e9fdff1a0bfeff7a0efeff960efeff0610feffa63dfeffa864feff9680feff4290feffaa2cffffd835ffff48daffff04fbffff389c0000849c00008e9c0000989c0000aa9c0000c2c5010038c6010028800300269e0300fc8b0400008c0400768c04007821080026810900b0810900c8840900f28f0900849009003a9c09003e9c0900989c0900b49c090080f70900faf70900f4100b00062e0b00
+      m_ExpandedIDs: 4e41fdffbe62fdffdcd3fdff6813feffd435feff0063feff5c68feff5488feff10a9feff6eaefeff2cdcfeffa4a6ffffe2ceffff0cd4ffffe6f4ffff16fbffff5ac4000038a801006ca80100aec80100eac80100e2e701001ee80100f622020032230200ee2302002a240200
       m_RenameOverlay:
         m_UserAcceptedRename: 0
         m_Name: 
@@ -457,10 +457,10 @@ MonoBehaviour:
     m_Tooltip: 
   m_Pos:
     serializedVersion: 2
-    x: 388
+    x: 409.6
     y: 73.6
-    width: 1041.2
-    height: 381.4
+    width: 649.2001
+    height: 464.6
   m_SerializedDataModeController:
     m_DataMode: 0
     m_PreferredDataMode: 0
@@ -475,8 +475,8 @@ MonoBehaviour:
       floating: 0
       collapsed: 0
       displayed: 1
-      snapOffset: {x: -156, y: -26.400024}
-      snapOffsetDelta: {x: -14.400024, y: 0}
+      snapOffset: {x: -164.79999, y: -26.400024}
+      snapOffsetDelta: {x: 0, y: 0}
       snapCorner: 3
       id: Tool Settings
       index: 0
@@ -806,9 +806,9 @@ MonoBehaviour:
   m_PlayAudio: 0
   m_AudioPlay: 0
   m_Position:
-    m_Target: {x: 620.1211, y: 334.8517, z: 1.8107476}
+    m_Target: {x: 1210.7328, y: -188.23718, z: 0}
     speed: 2
-    m_Value: {x: 620.1211, y: 334.8517, z: 1.8107476}
+    m_Value: {x: 1210.7328, y: -188.23718, z: 0}
   m_RenderMode: 0
   m_CameraMode:
     drawMode: 0
@@ -858,9 +858,9 @@ MonoBehaviour:
     speed: 2
     m_Value: {x: 0, y: 0, z: 0, w: 1}
   m_Size:
-    m_Target: 372.46674
+    m_Target: 1544.8628
     speed: 2
-    m_Value: 372.46674
+    m_Value: 1544.8628
   m_Ortho:
     m_Target: 1
     speed: 2
@@ -906,9 +906,9 @@ MonoBehaviour:
   m_Pos:
     serializedVersion: 2
     x: 0
-    y: 476
-    width: 1430.2
-    height: 299.4
+    y: 559.2
+    width: 1032.6
+    height: 216.19998
   m_SerializedDataModeController:
     m_DataMode: 0
     m_PreferredDataMode: 0
@@ -930,7 +930,7 @@ MonoBehaviour:
     m_SkipHidden: 0
     m_SearchArea: 1
     m_Folders:
-    - Assets
+    - Assets/Scenes
     m_Globs: []
     m_OriginalText: 
     m_ImportLogFlags: 0
@@ -938,16 +938,16 @@ MonoBehaviour:
   m_ViewMode: 1
   m_StartGridSize: 64
   m_LastFolders:
-  - Assets
+  - Assets/Scenes
   m_LastFoldersGridSize: -1
   m_LastProjectPath: C:\Users\guill\OneDrive\Bureau\LUCIOLE\EVALULULU_DEC2023_2\lulu-testing
   m_LockTracker:
     m_IsLocked: 0
   m_FolderTreeState:
     scrollPos: {x: 0, y: 79}
-    m_SelectedIDs: ba9b0000
-    m_LastClickedID: 39866
-    m_ExpandedIDs: 00000000ba9b0000bc9b0000be9b000000ca9a3bffffff7f
+    m_SelectedIDs: 34b90000
+    m_LastClickedID: 47412
+    m_ExpandedIDs: 00000000566300005863000038b9000000ca9a3b
     m_RenameOverlay:
       m_UserAcceptedRename: 0
       m_Name: 
@@ -975,7 +975,7 @@ MonoBehaviour:
     scrollPos: {x: 0, y: 0}
     m_SelectedIDs: 
     m_LastClickedID: 0
-    m_ExpandedIDs: 00000000ba9b0000bc9b0000be9b0000
+    m_ExpandedIDs: 000000005663000058630000
     m_RenameOverlay:
       m_UserAcceptedRename: 0
       m_Name: 
@@ -1000,9 +1000,9 @@ MonoBehaviour:
       m_Icon: {fileID: 0}
       m_ResourceFile: 
   m_ListAreaState:
-    m_SelectedInstanceIDs: 
-    m_LastClickedInstanceID: 0
-    m_HadKeyboardFocusLastEvent: 0
+    m_SelectedInstanceIDs: 3cb90000
+    m_LastClickedInstanceID: 47420
+    m_HadKeyboardFocusLastEvent: 1
     m_ExpandedInstanceIDs: c6230000
     m_RenameOverlay:
       m_UserAcceptedRename: 0
@@ -1052,9 +1052,9 @@ MonoBehaviour:
   m_Pos:
     serializedVersion: 2
     x: 0
-    y: 476
-    width: 1430.2
-    height: 299.4
+    y: 559.2
+    width: 1227.8
+    height: 216.19998
   m_SerializedDataModeController:
     m_DataMode: 0
     m_PreferredDataMode: 0
@@ -1085,9 +1085,9 @@ MonoBehaviour:
     m_Tooltip: 
   m_Pos:
     serializedVersion: 2
-    x: 1431.2001
+    x: 1228.8
     y: 73.6
-    width: 103.80005
+    width: 306.19995
     height: 701.8
   m_SerializedDataModeController:
     m_DataMode: 0
-- 
GitLab