/// <summary>
        /// Evénement lors du clic sur le bouton Ajout Prof
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAddProf_Click(object sender, EventArgs e)
        {
            int _lastSelected = 0;
            InfosClasse _infoClass = (InfosClasse)cmbClasse.SelectedItem;
            // Si la classe est nulle on est dans le cas d'une création sans liste
            if (_infoClass == null) { _infoClass = new InfosClasse(); }

            // On ajoute une Person
            Person _newPerson = new Person();
            _newPerson.Class = _infoClass.nameClass;
            _newPerson.ClassId = _infoClass.idClass;
            _newPerson.TypePerson = Constantes.cstProf;   // on crée un Prof
            int _maxId = ClassOutils.getMaxId(p_applClass.School.getListFromType(Constantes.cstIndividu));
            _newPerson.NumElement = ClassOutils.getMaxNumElement(p_SessionBase.Content.ListElement);
            _newPerson.Name = "P" + _newPerson.NumElement.ToString("D4");
            _newPerson.FirstName = String.Empty;
            _newPerson.Id = _maxId.ToString("D4");
            _newPerson.InfosPDV.IsGratis = true;    // Pour les PROFS, la photo est gratuite par défaut
            ListePersons.frmEditIndividu frmEdit = new ListePersons.frmEditIndividu(_newPerson, p_applClass.School, ModeAppel.Create);
            if (frmEdit.ShowDialog(this) == DialogResult.OK)
            {
                // On ajoute le Groupe dans la Session.
                // Il faut aussi l'ajouter dans la liste des éléments
                p_applClass.School.ListElement.Add(_newPerson);
                p_applClass.School.IsChanged = true;
                ClassOutils.saveSchoolFile(p_applClass);
                p_SessionBase.Content.ListElement.Add(_newPerson);

                // Dans le cas où on est en double vue on duplique l'élément
                if (p_applClass.School.DoubleView && p_SessionBase.Content.TypeSession == Constantes.cstIndividu)
                {
                    IElement _newElement = (IElement)_newPerson.Clone();
                    _newElement.Id = _newPerson.Id + "B";
                    _newElement.FirstName += "(BIS)";
                    _newElement.Photos = new List<FilePhoto>();
                    p_SessionBase.Content.ListElement.Add(_newElement);
                }
                // Il faut trier la liste pour etre cohérent à la liste affichée
                p_SessionBase.Content.ListElement = p_SessionBase.Content.ListElement.OrderBy(o => o.KeyAsc).ToList();
                _lastSelected = this.searchElement(_newPerson);
                this.ClearListe();
                this.ChargeListe(p_SessionBase.Content.ListElement);
            }
            if (lstPupils.Items.Count > 0)
            {
                lstPupils.Items[_lastSelected].Selected = true;
                lstPupils.Items[_lastSelected].EnsureVisible();
            }
            this.actualiseCompteurs();
        }
        /// <summary>
        /// Evénement lors du clic sur le bouton Ajout Eleve
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnAddEleve_Click(object sender, EventArgs e)
        {
            int _numElement;
            int _lastSelected = 0;
            InfosClasse _infoClass = (InfosClasse)cmbClasse.SelectedItem;
            // Si la classe est nulle on est dans le cas d'une création sans liste
            if (_infoClass == null) { _infoClass = new InfosClasse(); }

            switch (tabPriseDeVue.SelectedIndex)
            {
                case 0:
                    // On ajoute une Person
                    Person _newPerson = new Person();
                    _newPerson.Class = _infoClass.nameClass;
                    _newPerson.ClassId = _infoClass.idClass;
                    // Si la classe est toppé come gratuite, on ajoute tous les éléments en Gratuit
                    if (_infoClass.allGratis) { _newPerson.InfosPDV.IsGratis = true; }
                    _newPerson.TypePerson = Constantes.cstEleve;   // Par défaut, on crée un élève
                    int _maxId = ClassOutils.getMaxId(p_applClass.School.getListFromType(Constantes.cstIndividu));
                    _newPerson.Id = _maxId.ToString("D4");
                    _numElement = ClassOutils.getMaxNumElement(p_SessionBase.Content.ListElement);
                    _newPerson.NumElement = _numElement;
                    _newPerson.Name = "E" + _numElement.ToString("D4");
                    _newPerson.FirstName = String.Empty;
                    ListePersons.frmEditIndividu frmEdit = new ListePersons.frmEditIndividu(_newPerson, p_applClass.School, ModeAppel.Create);
                    if (frmEdit.ShowDialog(this) == DialogResult.OK)
                    {
                        // On ajoute le Groupe dans la Session.
                        // Il faut aussi l'ajouter dans la liste des éléments
                        p_applClass.School.ListElement.Add(_newPerson);
                        p_applClass.School.IsChanged = true;
                        ClassOutils.saveSchoolFile(p_applClass);
                        p_SessionBase.Content.ListElement.Add(_newPerson);

                        // Dans le cas où on est en double vue on duplique l'élément
                        if (p_applClass.School.DoubleView && p_SessionBase.Content.TypeSession == Constantes.cstIndividu)
                        {
                            _maxId++;
                            IElement _newElement = (IElement)_newPerson.Clone();
                            _newElement.Id = _newPerson.Id + "B";
                            _newElement.FirstName += "(BIS)";
                            _newElement.Photos = new List<FilePhoto>();
                            _newElement.InfosPDV = new InfoPdV();
                            p_SessionBase.Content.ListElement.Add(_newElement);
                        }
                        // Il faut trier la liste pour etre cohérent à la liste affichée
                        p_SessionBase.Content.ListElement = p_SessionBase.Content.ListElement.OrderBy(o => o.KeyAsc).ToList();
                        _lastSelected = this.searchElement(_newPerson);
                        this.ClearListe();
                        this.ChargeListe(p_SessionBase.Content.ListElement);
                    }
                    break;
                case 1:
                    // On ajoute un Group
                    Group _newGroup = new Group();
                    _newGroup.Class = _infoClass.nameClass;
                    _newGroup.ClassId = _infoClass.idClass;
                    // Si la classe est toppé come gratuite, on ajoute tous les éléments en Gratuit
                    if (_infoClass.allGratis) { _newGroup.InfosPDV.IsGratis = true; }
                    _newGroup.TypePerson = Constantes.cstGroup;   // Par défaut, on crée un élève
                    int _maxGrpId = ClassOutils.getMaxId(p_SessionBase.Content.ListElement);
                    _newGroup.NumElement = ClassOutils.getMaxNumElement(p_SessionBase.Content.ListElement);
                    _newGroup.Id = _maxGrpId.ToString("D4");
                    _newGroup.Name = "G" + _newGroup.NumElement.ToString("D4");
                    _newGroup.FirstName = String.Empty;
                    ListePersons.frmEditGroupe frmEditGrp = new ListePersons.frmEditGroupe(_newGroup, p_applClass.School, ModeAppel.Create);
                    if (frmEditGrp.ShowDialog(this) == DialogResult.OK)
                    {
                        // On ajoute le Groupe dans la Session.
                        // Il faut aussi l'ajouter dans la liste des éléments
                        p_applClass.School.ListElement.Add(_newGroup);
                        p_applClass.School.IsChanged = true;
                        ClassOutils.saveSchoolFile(p_applClass);
                        p_SessionBase.Content.ListElement.Add(_newGroup);
                        // Il faut trier la liste pour etre cohérent à la liste affichée
                        p_SessionBase.Content.ListElement = p_SessionBase.Content.ListElement.OrderBy(o => o.KeyAsc).ToList();
                        _lastSelected = this.searchElement(_newGroup);
                        this.ClearListe();
                        this.ChargeListe(p_SessionBase.Content.ListElement);
                    }
                    break;
                case 2:
                    // On ajoute une Fratrie
                    Person _newFratrie = new Person();
                    _newFratrie.Class = Constantes.cstFratrie;
                    _newFratrie.ClassId = 99999;
                    _newFratrie.TypePerson = Constantes.cstEleve;   // Une Fratrie est un Elève
                    int _maxFraId = ClassOutils.getMaxId(p_SessionBase.Content.ListElement);
                    _newFratrie.NumElement = ClassOutils.getMaxNumElement(p_SessionBase.Content.ListElement);
                    _newFratrie.Id = _maxFraId.ToString("D4");
                    _newFratrie.Name = "F" + _newFratrie.NumElement.ToString("D4");
                    _newFratrie.FirstName = String.Empty;
                    ListePersons.frmEditGroupe frmEditFratrie = new ListePersons.frmEditGroupe(_newFratrie, p_applClass.School, ModeAppel.Create);
                    if (frmEditFratrie.ShowDialog(this) == DialogResult.OK)
                    {
                        // On ajoute le Groupe dans la Session.
                        // Il faut aussi l'ajouter dans la liste des éléments
                        p_applClass.School.ListElement.Add(_newFratrie);
                        p_applClass.School.IsChanged = true;
                        ClassOutils.saveSchoolFile(p_applClass);
                        p_SessionBase.Content.ListElement.Add(_newFratrie);
                        // Il faut trier la liste pour etre cohérent à la liste affichée
                        p_SessionBase.Content.ListElement = p_SessionBase.Content.ListElement.OrderBy(o => o.KeyAsc).ToList();
                        _lastSelected = this.searchElement(_newFratrie);
                        this.ClearListe();
                        this.ChargeListe(p_SessionBase.Content.ListElement);
                    }
                    break;
            }
            if (lstPupils.Items.Count > 0)
            {
                lstPupils.Items[_lastSelected].Selected = true;
                lstPupils.Items[_lastSelected].EnsureVisible();
            }
            this.actualiseCompteurs();
        }
 private string getPhotoName(IElement _element, InfosClasse _infoClass)
 {
     return getPhotoName(_element, _infoClass.nameClass);
 }
        /// <summary>
        /// Création du Feuillet pour ProdLab
        /// </summary>
        /// <param name="_sessionContent"></param>
        public void createReportProdLab(List<IElement> _listElement, InfosClasse _infoClass)
        {
            Log.Debug("createReportProdLab ." + PIVOT_SHEETNAME);
            // Getting the worksheet by its name... 
            p_sheet = p_templateWorkbook.GetSheet(PIVOT_SHEETNAME);
            // Maintenant il faut balayer tous les élèves
            foreach (Person _person in _listElement)
            {
                if (_person.Passed)
                {
                    HSSFRow dataOrder = (HSSFRow)p_sheet.CreateRow(p_numRow);
                    ICell _newCell = dataOrder.CreateCell(0);
                    _newCell.SetCellValue(this.getPhotoName(_person, _infoClass));

                    _newCell = dataOrder.CreateCell(1);     // PhotoID
                    _newCell.SetCellValue("00000000");

                    _newCell = dataOrder.CreateCell(2);     // Classe
                    _newCell.SetCellValue(_person.Class);

                    _newCell = dataOrder.CreateCell(3);     // Pochette Complète
                    _newCell.SetCellValue(_person.InfosPDV.NbExemplaires.ToString());

                    p_numRow++;
                }
            }
        }
 /// <summary>
 /// Met à jour la classe
 /// </summary>
 /// <param name="_oldName"></param>
 /// <param name="_newName"></param>
 public void updateClass(InfosClasse _objectClass, string _newName, string _prefixeName, bool _allGratis, bool _isIgnore)
 {
     // On recherche l'objet InfoClasse correspondant à la classe à modifier
     // On vérifie que la nouvelle classe saisie n'existe pas déjà
     if (!this.IsClassExist(_newName)) { _objectClass.nameClass = _newName; _objectClass.PrefixeGroup = _prefixeName; }
     if (!_objectClass.PrefixeGroup.Equals(_prefixeName)) { _objectClass.PrefixeGroup = _prefixeName; }
     _objectClass.allGratis = _allGratis;
     _objectClass.isIgnore = _isIgnore;
     p_currentIdClass = _objectClass.idClass;
 }
        /// <summary>
        /// Initialisation de la Session Individuelle
        /// </summary>
        public void InitSession(ApplClass _applClass, InfosClasse _classSession, string _typeSession, DateTime _dateSession)
        {
            Log.Debug("Initialisation de la Session : " + _classSession.nameClass + " {" + _typeSession + "}");
            p_typeSession = _typeSession;
            #region Gestion du fichier
            FileInfo _file = this.getFileName(p_typeSession, _classSession.idClass, _applClass.DataDir, _dateSession);
            _fileName = _file.FullName;
            // Si le fichier de la session existe, on le lit
            // Sinon, on le créé
            if (_file.Exists)
            {
                #region Chargement Fichier session
                try
                {
                    Stream stream = File.Open(_fileName, FileMode.Open);
                    BinaryFormatter bFormatter = new BinaryFormatter();
                    p_sessionContent = (SessionContent)bFormatter.Deserialize(stream);
                    stream.Close();
                }
                catch (Exception e)
                {
                    Log.Error("Erreur chargement de la Session", e);
                    System.Windows.Forms.MessageBox.Show("Une erreur est survenue lors du chargement de la Session de Base.\r\nMessage : " + e.Message, "Anomalie lors du chargement !", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error, System.Windows.Forms.MessageBoxDefaultButton.Button1, System.Windows.Forms.MessageBoxOptions.RightAlign);
                    throw;
                }
                #endregion
            }
            else
            {
                #region Création de la Session
                Log.Info("Création de la Session");
                p_sessionContent = new SessionContent();
                p_sessionContent.InfoClass = _classSession;
                p_sessionContent.Effectif = 0;
                // On crée la liste des éléments à partir de la liste des élèves (et Profs)
                p_sessionContent.DateSession = _dateSession.ToString("dd-MM-yyyy");
                p_sessionContent.TypeSession = p_typeSession;
                p_sessionContent.ListElement = new List<IElement>();
                // On balaye l'ensemble des Individus
                int _newId = ClassOutils.getMaxId(_applClass.School.getListFromType(Constantes.cstIndividu));

                // A ce niveau-ci, dans le cadre d'une session Fratrie, il faut initialiser la liste avec la liste des noms des élèves
                if (_typeSession.Equals(Constantes.cstFratrie))
                {
                    Log.Info("Session FRATRIE");
                    _newId = 1;
                    // On créé une liste triée... et on renomme les doublons façon Windows
                    List<IElement> __sortedList = new List<IElement>(_applClass.School.getListFromType(Constantes.cstIndividu).Count);

                    _applClass.School.getListFromType(Constantes.cstIndividu).ForEach(item => { __sortedList.Add((IElement)item.Clone()); });

                    __sortedList = __sortedList.OrderBy(o => o.Name).ToList();
                    string _nameKey = "";
                    int numDoub = 0;
                    for (int _ind = 0; _ind <= __sortedList.Count - 1; _ind++)
                    {
                        if (_nameKey != __sortedList[_ind].Name)
                        {
                            numDoub = 0;
                            _nameKey = __sortedList[_ind].Name;
                        }
                        else
                        {
                            numDoub++;
                            __sortedList[_ind].Name += " (" + numDoub.ToString() + ")";
                        }
                    }

                    // On récupère l'ensemble des élèves
                    foreach (IElement _element in __sortedList)
                    {
                        if (!((Person)_element).TypePerson.Equals(Constantes.cstProf))
                        {
                            Person _newElement = (Person)_element.Clone();
                            _newElement.FirstName = String.Empty;
                            _newElement.Id = _newId.ToString("D4");
                            _newElement.Photos = new List<FilePhoto>();
                            _newElement.InfosPDV = new InfoPdV();
                            _newElement.NumElement = _newId;
                            _newElement.Passed = false;
                            _newElement.Absent = Constantes.cstNon;
                            _newElement.Class = _classSession.nameClass;
                            _newElement.ClassId = _classSession.idClass;
                            // Il faut vérifier que l'élément n'existe pas déjà (en cas de doublons)
                            // Si il existe, on flag le second...
                            p_sessionContent.ListElement.Add(_newElement);
                            _newId++;
                        }
                    }
                }
                else
                {
                    Log.Info("Session Individuels");
                    foreach (IElement _element in _applClass.School.getListFromType(p_typeSession))
                    {
                        if (_element.ClassId.Equals(_classSession.idClass))
                        {
                            _element.Passed = false;
                            _element.Photos = new List<FilePhoto>();
                            _element.Class = _classSession.nameClass;
                            p_sessionContent.ListElement.Add(_element);
                            // Dans le cas où on est en double vue on duplique l'élément
                            if (_applClass.School.DoubleView && p_sessionContent.TypeSession == Constantes.cstIndividu)
                            {
                                IElement _newElement = (IElement)_element.Clone();
                                //_newElement.Id = (_newId++).ToString("D4");
                                _newElement.Id = _newElement.Id + "B";
                                //_newElement.Name += "_BIS";
                                _newElement.FirstName += "(BIS)";
                                _newElement.Photos = new List<FilePhoto>();
                                _newElement.InfosPDV = new InfoPdV();
                                p_sessionContent.ListElement.Add(_newElement);
                            }
                        }
                    }
                }
                Log.Debug("Nb Eléments dans la nouvelle session = ");
                #endregion
            }

            if (p_sessionContent.InfoClass == null) { p_sessionContent.InfoClass = _classSession; }
            // On met à jour les infos Class
            p_sessionContent.InfoClass.PrefixeGroup = _classSession.PrefixeGroup;

            p_sessionContent.InfoClass = _classSession;

            // En cas de renumérotation de la classe on modifie les noms de classe
            foreach (IElement _element in p_sessionContent.ListElement)
            {
                // On met à jour le nom de la classe si elle a changé...
                if (!_element.Class.Equals(_classSession.nameClass))
                {
                    _element.Class = _classSession.nameClass;
                    foreach (FilePhoto _photo in _element.Photos) { _photo.ClassName = _classSession.nameClass; }
                }

            }

            // Il faut maintenant fusionner la liste des individus de la session avec celle de l'école pour resynchroniser les deux...
            // On balaye l'ensemble des Individus
            // pour les fratries, on fait un traitement spécifique
            // Il faut balayer tous les élèves et si le nom n'esxiste pas dans la liste des fratries, on l'ajoute
            Log.Info("Fusion des individus de la session avec la liste des élèves de l'école ...");
            if (_typeSession.Equals(Constantes.cstFratrie))
            {
                #region Synchronisation Fratries
                foreach (IElement _element in _applClass.School.getListPerson(Constantes.cstEleve))
                {
                    if (!this.IsFratrieExist(_element))
                    {
                        Person _newElement = (Person)_element.Clone();
                        int _maxFraId = ClassOutils.getMaxId(p_sessionContent.ListElement);
                        _newElement.Id = _maxFraId.ToString("D4");
                        _newElement.FirstName = String.Empty;
                        _newElement.Photos = new List<FilePhoto>();
                        _newElement.InfosPDV = new InfoPdV();
                        _newElement.NumElement = _maxFraId;
                        _newElement.Class = _classSession.nameClass;
                        _newElement.ClassId = _classSession.idClass;
                        _newElement.Passed = false;
                        _newElement.Absent = Constantes.cstNon;
                        p_sessionContent.ListElement.Add(_newElement);
                    }
                }
                #endregion
            }
            else
            {
                #region Synchronisation Individus

                foreach (IElement _element in _applClass.School.getListFromType(p_typeSession))
                {
                    if (_element.ClassId.Equals(_classSession.idClass))
                    {
                        if (!this.IsElementExist(_element))
                        {
                            _element.Passed = false;
                            _element.Photos = new List<FilePhoto>();
                            _element.Class = _classSession.nameClass;
                            p_sessionContent.ListElement.Add(_element);
                            // Dans le cas où on est en double vue on duplique l'élément
                            if (_applClass.School.DoubleView && p_sessionContent.TypeSession == Constantes.cstIndividu)
                            {
                                IElement _newElement = (IElement)_element.Clone();
                                int _maxId = ClassOutils.getMaxId(p_sessionContent.ListElement);
                                _maxId++;
                                //_newElement.Id = _maxId.ToString("D4");
                                _newElement.Id = _element.Id + "B";
                                //_newElement.Name += "_BIS";
                                _newElement.FirstName += "(BIS)";
                                _newElement.Photos = new List<FilePhoto>();
                                _newElement.InfosPDV = new InfoPdV();
                                p_sessionContent.ListElement.Add(_newElement);
                            }
                        }
                        else
                        {
                            // On met à jour le nom de la classe si elle a changé...
                            if (!_element.Class.Equals(_classSession.nameClass)) { _element.Class = _classSession.nameClass; }
                        }
                    }
                }
                #endregion
            }
            Log.Info("Nb total Eléments = ");
            // On trie la liste finale
            p_sessionContent.ListElement = p_sessionContent.ListElement.OrderBy(o => o.KeyAsc).ToList();
            #endregion
        }