using EPAServeur.Context;
using EPAServeur.Exceptions;
using EPAServeur.IServices;
using IO.Swagger.ApiCollaborateur;
using IO.Swagger.DTO;
using IO.Swagger.ModelCollaborateur;
using Microsoft.EntityFrameworkCore.ChangeTracking;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices.ComTypes;
using System.Threading.Tasks;
namespace EPAServeur.Services
{
///
/// Service permettant de récupérer les informations collaborateurs.
///
public class CollaborateurService : ICollaborateurService
{
#region Variables
///
/// API pour accéder aux données collaborateur en passant par le service collaborateur
///
private readonly ICollaborateurApi collaborateurApi;
#endregion
#region Constructeurs
public CollaborateurService(ICollaborateurApi _collaborateurApi)
{
collaborateurApi = _collaborateurApi;
}
#endregion
#region Services
///
/// Récupérer un collaborateur en fonction d'un id
///
/// Identifiant du collaborateur à renvoyer
/// Le collaborateur corresponant à l'id en paramètre
public CollaborateurDTO GetCollaborateurById(Guid? id)
{
Collaborateur collaborateur = collaborateurApi.ChercherCollabId(id);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetCollaborateurDTO(collaborateur);
}
///
/// Récupérer un collaborateur en fonction d'un id de manière asynchrone
///
/// Identifiant du collaborateur à renvoyer
/// Le collaborateur corresponant à l'id en paramètre
public async Task GetCollaborateurByIdAsync(Guid? id)
{
Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync(id);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetCollaborateurDTO(collaborateur);
}
///
/// Récupérer un collaborateur en fonction d'un mail
///
/// Mail du collaborateur à renvoyer
/// Le collaborateur correspondant au mail en paramètre
public CollaborateurDTO GetCollaborateurByMail(string mail)
{
Collaborateur collaborateur = collaborateurApi.ChercherCollabMail(mail);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetCollaborateurDTO(collaborateur);
}
///
/// Récupérer un collaborateur en fonction d'un mail de manière asynchrone
///
/// Mail du collaborateur à renvoyer
/// Le collaborateur correspondant au mail en paramètre
public async Task GetCollaborateurByMailAsync(string mail)
{
Collaborateur collaborateur = await collaborateurApi.ChercherCollabMailAsync(mail);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetCollaborateurDTO(collaborateur);
}
///
/// Récupérer la liste de tous les collaborateurs
///
///
/// Précise si la liste est trié dans l'ordre croissant ou décroissant
/// Numéro de la page qui est affiché du côté front
/// Nombre de collaborateurs à renvoyer
/// Liste des fonctions
/// id de l'agence à laquelle appartient les collaborateurs à récupérer
///
/// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte
/// Choisir l'attribut par lequel est trié la liste
///
/// idBU est à prendre en compte avant l'idAgence
/// idAgence n'est à prendre en compte que si idBU est nul
///
///
/// Renvoie la liste des collaborateurs en fonction des paramètres
public IEnumerable GetCollaborateurs(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri)
{
if (texte == null)
texte = "";
else
texte = texte.ToLower();
IEnumerable collaborateurs;
IEnumerable collaborateursDTO;
if(idBU != null)
collaborateurs = collaborateurApi.ChercherCollabBU(idBU);
else if( idAgence != null)
collaborateurs = collaborateurApi.ChercherCollabAgence(idAgence);
else
collaborateurs = collaborateurApi.ChercherCollab();
if (collaborateurs == null)
return new List();
int skip = (numPage.Value - 1) * parPage.Value;
int take = parPage.Value;
collaborateursDTO = (from c in collaborateurs
where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte)
select GetCollaborateurDTO(c)).Skip(skip).Take(take);
return collaborateursDTO;
}
///
/// Récupérer la liste de tous les collaborateurs de manière asynchrone
///
///
/// Précise si la liste est trié dans l'ordre croissant ou décroissant
/// Numéro de la page qui est affiché du côté front
/// Nombre de collaborateurs à renvoyer
/// Liste des fonctions
/// id de l'agence à laquelle appartient les collaborateurs à récupérer
///
/// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte
/// Choisir l'attribut par lequel est trié la liste
///
/// idBU est à prendre en compte avant l'idAgence
/// idAgence n'est à prendre en compte que si idBU est nul
///
///
/// Renvoie la liste des collaborateurs en fonction des paramètres
public async Task> GetCollaborateursAsync(bool? asc, int? numPage, int? parPage, List fonctions, long? idAgence, long? idBU, string texte, string tri)
{
if (texte == null)
texte = "";
else
texte = texte.ToLower();
IEnumerable collaborateurs;
IEnumerable collaborateursDTO;
if (idBU != null)
collaborateurs = await collaborateurApi.ChercherCollabBUAsync(idBU);
else if (idAgence != null)
collaborateurs = await collaborateurApi.ChercherCollabAgenceAsync(idAgence);
else
collaborateurs = await collaborateurApi.ChercherCollabAsync();
if (collaborateurs == null)
return new List();
int skip = (numPage.Value - 1) * parPage.Value;
int take = parPage.Value;
collaborateursDTO = (from c in collaborateurs
where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte)
select GetCollaborateurDTO(c)).Skip(skip).Take(take);
return collaborateursDTO;
}
///
/// Récupérer les collaborateurs d'un référent
///
/// id du référent des collaborateurs à récupérer
/// Précise si la liste est trié dans l'ordre croissant ou décroissant
/// Numéro de la page qui est affiché du côté front
/// Nombre de collaborateurs à renvoyer
/// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte
/// Choisir l'attribut par lequel est trié la liste
/// Renvoyer les collaborateurs du référent dont l'id est passé en paramètre
public IEnumerable GetCollaborateursByReferent(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri)
{
/*
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
stopwatch.Stop();
Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds);
stopwatch.Restart();
stopwatch.Stop();
Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds);
*/
Collaborateur referent = collaborateurApi.ChercherCollabId(idReferent);
if (referent == null)
throw new ReferentNotFoundException();
if (texte == null)
texte = "";
else
texte = texte.ToLower();
IEnumerable collaborateurs = collaborateurApi.ChercherCollabRef(idReferent);
int skip = (numPage.Value - 1) * parPage.Value;
int take = parPage.Value;
IEnumerable collaborateursDTO = (from c in collaborateurs
where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte)
select GetCollaborateurDTO(c)).Skip(skip).Take(take);
return collaborateursDTO;
}
///
/// Récupérer les collaborateurs d'un référent de manière asynchrone
///
/// id du référent des collaborateurs à récupérer
/// Précise si la liste est trié dans l'ordre croissant ou décroissant
/// Numéro de la page qui est affiché du côté front
/// Nombre de collaborateurs à renvoyer
/// permet de récupérer les collaborateurs dont le nom + prénom ou le prénom + nom contient le texte
/// Choisir l'attribut par lequel est trié la liste
/// Renvoyer les collaborateurs du référent dont l'id est passé en paramètre
public async Task> GetCollaborateursByReferentAsync(Guid? idReferent, bool? asc, int? numPage, int? parPage, string texte, string tri)
{
/*
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
stopwatch.Stop();
Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds);
stopwatch.Restart();
stopwatch.Stop();
Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds);
*/
Collaborateur referent = await collaborateurApi.ChercherCollabIdAsync(idReferent);
if (referent == null)
throw new ReferentNotFoundException();
if (texte == null)
texte = "";
else
texte = texte.ToLower();
IEnumerable collaborateurs = await collaborateurApi.ChercherCollabRefAsync(idReferent);
int skip = (numPage.Value - 1) * parPage.Value;
int take = parPage.Value;
IEnumerable collaborateursDTO = (from c in collaborateurs
where (c.Nom + " " + c.Prenom).ToLower().Contains(texte) || (c.Prenom + " " + c.Nom).ToLower().Contains(texte)
select GetCollaborateurDTO(c)).Skip(skip).Take(take);
return collaborateursDTO;
}
///
/// Récupérer le profil d'un collaborateur par mail
///
/// mail du collaborateur dont on cherche le profil
/// Renvoie le profil correspondant au mail passé en paramètre
public ProfilDTO GetProfilByMail(string mail)
{
Collaborateur collaborateur = collaborateurApi.ChercherCollabMail(mail);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetProfilDTO(collaborateur);
}
///
/// Récupérer le profil d'un collaborateur par mail de manière asynchrone
///
/// mail du collaborateur dont on cherche le profil
/// Renvoie le profil correspondant au mail passé en paramètre
public async Task GetProfilByMailAsync(string mail)
{
Collaborateur collaborateur = await collaborateurApi.ChercherCollabMailAsync(mail);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetProfilDTO(collaborateur);
}
///
/// Récupérer un profil d'un collaborateur par l'id
///
/// id du collaborateur dont on cherche le profil
/// Renvoie le profil correspondant à l'id passé en paramètre
public ProfilDTO GetProfilById(Guid? idCollaborateur)
{
//Stopwatch stopwatch = new Stopwatch();
//stopwatch.Start();
Collaborateur collaborateur = collaborateurApi.ChercherCollabId(idCollaborateur);
//stopwatch.Stop();
//Console.WriteLine("Durée d'exécution GetProfil: {0}", stopwatch.Elapsed.TotalSeconds);
//stopwatch.Restart();
//stopwatch.Stop();
//Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetProfilDTO(collaborateur);
}
///
/// Récupérer un profil d'un collaborateur par l'id de manière asynchrone
///
/// id du collaborateur dont on cherche le profil
/// Renvoie le profil correspondant à l'id passé en paramètre
public async Task GetProfilByIdAsync(Guid? idCollaborateur)
{
//Stopwatch stopwatch = new Stopwatch();
//stopwatch.Start();
Collaborateur collaborateur = await collaborateurApi.ChercherCollabIdAsync(idCollaborateur);
//stopwatch.Stop();
//Console.WriteLine("Durée d'exécution GetProfil: {0}", stopwatch.Elapsed.TotalSeconds);
//stopwatch.Restart();
//stopwatch.Stop();
//Console.WriteLine("Durée d'exécution numéro 1: {0}", stopwatch.Elapsed.TotalSeconds);
if (collaborateur == null)
throw new CollaborateurNotFoundException();
return GetProfilDTO(collaborateur);
}
#endregion
#region DTO To Object
///
/// Transformer un objet collaborateur en ProfilDTO
///
/// collaborateur a transformé en profilDTO
/// Renvoie le profil associé au collaborateur passé en paramètre
private ProfilDTO GetProfilDTO(Collaborateur collaborateur)
{
ProfilDTO profilDTO = new ProfilDTO()
{
Id = collaborateur.Id,
DateArrivee = collaborateur.DateArrivee,
MailApside = collaborateur.MailApside,
Nom = collaborateur.Nom,
Prenom = collaborateur.Prenom,
BusinessUnit = GetBusinessUnitDTO(collaborateur.BusinessUnit)
};
return profilDTO;
}
///
/// Transformer une agence en agenceDTO
///
/// agence à transformer en agenceDTO
/// Retourne la transformation DTO de l'agence
private AgenceDTO GetAgenceDTO(Agence agence)
{
if (agence == null)
return null;
AgenceDTO agenceDTO = new AgenceDTO()
{
Id = agence.Id,
Nom = agence.Nom,
Bu = new List()
};
agenceDTO.Bu = agence.Bus.Select(bu => new BusinessUnitDTO()
{
Id = bu.Id,
Nom = bu.Nom
}).ToList();
return agenceDTO;
}
///
/// Transforme une businessUnit en businessUnitDTO
///
/// businessUnit à transformer en businessUnitDTO
/// Retourne la transformation DTO de la businessUnit
private BusinessUnitDTO GetBusinessUnitDTO(BU businessUnit)
{
if (businessUnit == null)
return null;
BusinessUnitDTO businessUnitDTO = new BusinessUnitDTO()
{
Id = businessUnit.Id,
Nom = businessUnit.Nom,
Agence = GetAgenceDTO(businessUnit.Agence)
};
return businessUnitDTO;
}
///
/// Transforme un collaborateur en collaborateurDTO
///
/// collaborateur à transformer en collaborateurDTO
/// Renvoie la transformation DTO du collaborateur
private CollaborateurDTO GetCollaborateurDTO(Collaborateur collaborateur)
{
CollaborateurDTO collaborateurDTO = new CollaborateurDTO()
{
Id = collaborateur.Id,
Prenom = collaborateur.Prenom,
Nom = collaborateur.Nom,
MailApside = collaborateur.MailApside,
DateArrivee = collaborateur.DateArrivee,
};
collaborateurDTO.BusinessUnit = GetBusinessUnitDTO(collaborateur.BusinessUnit);
collaborateurDTO.Referent = GetReferentDTO(collaborateur.Referent);
return collaborateurDTO;
}
///
/// Transforme un referent en referentDTO
///
/// referent à transformer en referentDTO
/// Renvoie la transformation DTO du referent
private ReferentDTO GetReferentDTO(Referent referent)
{
if (referent == null)
return null;
ReferentDTO referentDTO = new ReferentDTO()
{
Id = referent.Id,
Prenom = referent.Prenom,
Nom = referent.Nom,
MailApside = referent.MailApside
};
return referentDTO;
}
#endregion
}
}