/// <summary>
        /// Export d'une tournée au format XML
        /// </summary>
        /// <param name="To">la tournée a exporter</param>
        /// <param name="XmlDoc"></param>
        /// <returns></returns>
        public XmlElement GetTourneeToXml(Tournee To, XmlDocument XmlDoc)
        {
            XmlElement princ = XmlDoc.CreateElement("Tournee");

            XmlElement elem = XmlDoc.CreateElement("CleTournee");
            elem.InnerText = To.CleTournee.ToString();
            princ.AppendChild(elem);

            //elem = XmlDoc.CreateElement("CleUtilisateur");
            //elem.InnerText = To.CleUtilisateur.HasValue ? To.CleUtilisateur.Value.ToString() : string.Empty;
            //princ.AppendChild(elem);

            // Agent de mesure
            princ.AppendChild(XmlDoc.CreateElement("CleUtilisateur"));
            princ.AppendChild(XmlDoc.CreateElement("PrenomAgent"));
            princ.AppendChild(XmlDoc.CreateElement("NomAgent"));
            //Instruments
            princ.AppendChild(XmlDoc.CreateElement("Instruments"));

            elem = XmlDoc.CreateElement("Libelle");
            elem.InnerText = To.Libelle;
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("CodeTournee");
            elem.InnerText = To.CodeTournee;
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("Commentaire");
            elem.InnerText = To.Commentaire;
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("DateCreation");
            elem.InnerText = To.DateCreation.HasValue ? To.DateCreation.Value.ToString() : string.Empty;
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("Numero");
            elem.InnerText = To.Numero.ToString();
            princ.AppendChild(elem);

            XmlElement elemPPs = XmlDoc.CreateElement("PPs");
            XmlElement elemEQs = XmlDoc.CreateElement("Equipements");
            XmlElement elemPOs = XmlDoc.CreateElement("Portions");
            XmlElement elemEEs = XmlDoc.CreateElement("EnsemblesElectriques");

            // Composition par Equipement
            IEnumerable<Composition> EQs = To.Compositions.Where(co => co.CleEquipement.HasValue && !co.EqEquipement.Supprime).OrderBy(co => co.NumeroOrdre);
            foreach (var eq in EQs)
            {
                elemEQs.AppendChild(getEquipementToXML(eq, XmlDoc));
            }

            // Composition par PP
            IEnumerable<SortedPpAndTypeEval> PPs = To.Compositions.Where(co => co.ClePp.HasValue && !co.Pp.Supprime).Select(co => new SortedPpAndTypeEval() { NumeroOrdre = co.NumeroOrdre, Pp = co.Pp, TypeEval = co.RefEnumValeur });
            IEnumerable<int> clePPs = PPs.Select(p => p.Pp.ClePp);
            IEnumerable<SortedPpAndTypeEval> PPNonMesurees = EQs.Where(co => !clePPs.Contains(co.EqEquipement.ClePp)).GroupBy(co => new { co.EqEquipement.Pp, co.NumeroOrdre }).Select(c => new SortedPpAndTypeEval() { NumeroOrdre = c.Min(t => t.NumeroOrdre), Pp = c.Key.Pp }).Distinct();

            PPs = PPs.Union(PPNonMesurees).OrderBy(pp => pp.NumeroOrdre);
            foreach (var pp in PPs)
            {
                elemPPs.AppendChild(getPPToXML(pp.TypeEval, pp.Pp, XmlDoc));
            }

            //IEnumerable<Composition> PPs = To.Compositions.Where(co => co.ClePp.HasValue && !co.Pp.Supprime).OrderBy(co => co.NumeroOrdre);
            //foreach (var pp in PPs)
            //{
            //    elemPPs.AppendChild(getPPToXML(pp, null, XmlDoc));
            //}

            //IEnumerable<int> clePPs = PPs.Select(p => p.ClePp.Value);
            //IEnumerable<Pp> PPNonMesurees = EQs.Where(co => !clePPs.Contains(co.EqEquipement.ClePp)).Select(co => co.EqEquipement.Pp).Distinct();
            //foreach (var pp in PPNonMesurees)
            //{
            //    elemPPs.AppendChild(getPPToXML(null, pp, XmlDoc));
            //}

            // Composition par portion
            IEnumerable<PortionIntegrite> PIs = To.Compositions.Where(co => co.ClePortion.HasValue && !co.PortionIntegrite.Supprime).Select(co => co.PortionIntegrite).OrderBy(pi => pi.Libelle);
            if (!PIs.Any())
            {
                PIs = PPs.Select(co => co.Pp.PortionIntegrite);
                PIs = PIs.Union(EQs.Select(co => co.EqEquipement.Pp.PortionIntegrite)).Distinct().OrderBy(pi => pi.Libelle);
            }
            foreach (var pi in PIs)
            {
                elemPOs.AppendChild(getPortionIntegriteToXML(pi, XmlDoc));
            }

            // Composition par Ensemble électrique
            IEnumerable<EnsembleElectrique> EEs = To.Compositions.Where(co => co.CleEnsElectrique.HasValue && !co.EnsembleElectrique.Supprime).Select(co => co.EnsembleElectrique);
            EEs = EEs.Union(PIs.Select(pi => pi.EnsembleElectrique)).Distinct().OrderBy(ee => ee.Libelle);

            if (!EEs.Any())
            {
                EEs = PPs.Select(co => co.Pp.PortionIntegrite.EnsembleElectrique);
                EEs = EEs.Union(EQs.Select(co => co.EqEquipement.Pp.PortionIntegrite.EnsembleElectrique)).Distinct().OrderBy(ee => ee.Libelle);
            }
            foreach (var EE in EEs)
            {
                elemEEs.AppendChild(getEnsembleElectriqueToXML(EE, XmlDoc));
            }

            princ.AppendChild(elemEEs);
            princ.AppendChild(elemPOs);
            princ.AppendChild(elemPPs);
            princ.AppendChild(elemEQs);

            return princ;
        }
 /// <summary>
 /// Créez un nouvel objet Tournee.
 /// </summary>
 /// <param name="cleTournee">Valeur initiale de la propriété CleTournee.</param>
 /// <param name="libelle">Valeur initiale de la propriété Libelle.</param>
 /// <param name="supprime">Valeur initiale de la propriété Supprime.</param>
 /// <param name="verrouille">Valeur initiale de la propriété Verrouille.</param>
 public static Tournee CreateTournee(global::System.Int32 cleTournee, global::System.String libelle, global::System.Boolean supprime, global::System.Boolean verrouille)
 {
     Tournee tournee = new Tournee();
     tournee.CleTournee = cleTournee;
     tournee.Libelle = libelle;
     tournee.Supprime = supprime;
     tournee.Verrouille = verrouille;
     return tournee;
 }
        /// <summary>
        /// Export des données de référence pour les tournées
        /// </summary>
        /// <param name="To">la tournée a exporter</param>
        /// <param name="XmlDoc"></param>
        /// <returns></returns>
        public XmlElement GetTourneeRefDataToXml(Tournee To, XmlDocument XmlDoc)
        {
            XmlElement princ = XmlDoc.CreateElement("ListeReference");

            XmlElement elem = XmlDoc.CreateElement("Parametres");
            RefParametre param = this.ObjectContext.RefParametre.FirstOrDefault(r => r.Libelle == "SEUIL_INFERIEUR_UCANA");
            if (param != null)
            {
                XmlElement elemDetail = XmlDoc.CreateElement("Parametre");
                elemDetail.SetAttribute("Name", param.Libelle);
                elemDetail.SetAttribute("Valeur", param.Valeur);
                elem.AppendChild(elemDetail);
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("TypeEvaluations");
            IEnumerable<RefEnumValeur> vals = this.ObjectContext.RefEnumValeur.Where(r => r.CodeGroupe == "TYPE_EVAL").OrderBy(r => r.NumeroOrdre);
            foreach (RefEnumValeur item in vals)
            {
                elem.AppendChild(getRefEnumValeurToXML(item, "TypeEvaluation", XmlDoc));
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("DureeEnregistrements");
            vals = this.ObjectContext.RefEnumValeur.Where(r => r.CodeGroupe == "PP_DUREE_ENRG").OrderBy(r => r.NumeroOrdre);
            foreach (RefEnumValeur item in vals)
            {
                elem.AppendChild(getRefEnumValeurToXML(item, "DureeEnregistrement", XmlDoc));
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("Polarisations");
            vals = this.ObjectContext.RefEnumValeur.Where(r => r.CodeGroupe == "PP_POLARISATION").OrderBy(r => r.NumeroOrdre);
            foreach (RefEnumValeur item in vals)
            {
                elem.AppendChild(getRefEnumValeurToXML(item, "Polarisation", XmlDoc));
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("SurfaceTMEs");
            vals = this.ObjectContext.RefEnumValeur.Where(r => r.CodeGroupe == "PP_SURFACE_TME").OrderBy(r => r.NumeroOrdre);
            foreach (RefEnumValeur item in vals)
            {
                elem.AppendChild(getRefEnumValeurToXML(item, "SurfaceTME", XmlDoc));
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("SurfaceTMSs");
            vals = this.ObjectContext.RefEnumValeur.Where(r => r.CodeGroupe == "PP_SURFACE_TMS").OrderBy(r => r.NumeroOrdre);
            foreach (RefEnumValeur item in vals)
            {
                elem.AppendChild(getRefEnumValeurToXML(item, "SurfaceTMS", XmlDoc));
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("AnalyseEtats");
            vals = this.ObjectContext.RefEnumValeur.Where(r => r.CodeGroupe == "AN_ETAT_PC").OrderBy(r => r.NumeroOrdre);
            foreach (RefEnumValeur item in vals)
            {
                elem.AppendChild(getRefEnumValeurToXML(item, "AnalyseEtat", XmlDoc));
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("NiveauxSensibilites");
            foreach (RefNiveauSensibilitePp item in this.ObjectContext.RefNiveauSensibilitePp)
            {
                elem.AppendChild(getNiveauSensibiliteToXML(item, XmlDoc));
            }
            princ.AppendChild(elem);

            elem = XmlDoc.CreateElement("CategoriesPP");
            foreach (CategoriePp item in this.ObjectContext.CategoriePp)
            {
                elem.AppendChild(getCategoriePPToXML(item, XmlDoc));
            }
            princ.AppendChild(elem);

            // Données Utilisateurs
            XmlElement elemUtilisateur = XmlDoc.CreateElement("Utilisateurs");

            IQueryable<UsrUtilisateur> users = this.FindUsrUtilisateurByCleTournee(To.CleTournee);

            foreach (UsrUtilisateur user in users)
            {
                elemUtilisateur.AppendChild(getUsrUtilisateurToXML(user, XmlDoc));
            }
            princ.AppendChild(elemUtilisateur);

            // Données Instruments
            XmlElement elemInstrument = XmlDoc.CreateElement("Instruments");

            IQueryable<InsInstrument> instruments = FindInsInstrumentByCleTournee(To.CleTournee);
            foreach (InsInstrument instrument in instruments)
            {
                elemInstrument.AppendChild(getInsInstrumentToXML(instrument, XmlDoc));
            }
            princ.AppendChild(elemInstrument);

            return princ;
        }
 /// <summary>
 /// Méthode déconseillée pour ajouter un nouvel objet à l'EntitySet Tournees. Utilisez la méthode .Add de la propriété ObjectSet&lt;T&gt; associée à la place.
 /// </summary>
 public void AddToTournees(Tournee tournee)
 {
     base.AddObject("Tournees", tournee);
 }