Rapport avancé - Personnel - Identifier les personnes disponibles (sans événements, ni affectations) (v2.20)

Description
On souhaite obtenir, par atelier, la liste des personnes qui ne sont pas affectés et qui n'ont pas d'événement.



Configuration du rapport
1) On commence par placer une brique temporelle avec comme période "1 jour".
2) On place ensuite une brique de type "Tableau de synthèse" avec comme type de source "Formule" et comme type de données dans le tableau "(formule)".
3) En ligne on met "Atelier" avec la case "Générer des lignes colonnes vides" cochée. En colonne on met "Début" avec la case "Générer des lignes colonnes vides" cochée.
4) Enfin on remplit la formule de la cellule
5) Ajouter si nécessaire un critère sur le type de contrat de travail pour n'avoir que les CDI.



String toDisplay = "";
IList<Team> teams = Source.TeamCalendar.GetTeamCalendars(Properties.TeamCalendar.Team.Workshop == Headers._Workshop).Select( Properties.TeamCalendar.Team ).GetItems() ;
if(teams.Count < 1)
{
toDisplay = "";
}
else
{
if(Source.Allocation.Count < 1)
{
toDisplay = Source.Personnel.Where(Properties.Personnel.Teams[Properties.Team.This.In( teams )])
.Available(AvailableMode.UnavailableIfAtLeastOneEvent, NotAvailLimitMode.TakeIntoAccountNotAvailLimit).List();


//TODO : modifier le cas du NA
}
{
//1. Recherche de l'ensemble des personnes en rotation
var availablePersonne = Source.Personnel.Where(Properties.Personnel.Teams[ Properties.Team.This.In( teams )] ).GetItems();


//2. Recherche d'affectation pour chacune des personnes en rotation.
foreach (var personne in availablePersonne)
{
bool addOK = true;
//toDisplay += personne.ToString() + " " + addOK.ToString() +"\n";


var allocations = Source.Allocation.Where(Properties.Allocation.Personnel == personne).GetItems();
foreach(var alloc in allocations)
{
if(alloc.Start.Day == Headers._Start.Start.Day)
{
addOK = false;
}
//toDisplay += alloc.Role.Role.Description + " " + alloc.Start.Day + " " + addOK.ToString() +"\n";
}


//3. Recherche des événements pour chacune des personnes en rotation.
CriteriaOperator crit = Properties.PeopleCalendar.Personnels[Properties.Personnel.This == personne];
var calendar = Source.PeopleCalendar.GetPeopleCalendars(NotAvailLimitMode.DoNotTakeIntoAccountNotAvailLimit, crit).GetItems();
foreach(var evt in calendar)
{
var limitAllDay = new TimeSpan(0,23,59,0); //La vérification du evt.allDay ne fonctionne pas car il renvoie toujours false.
if(evt.UnavailabilityType.Description == "Non Affectable"
&& evt.Start.Day == Headers._Start.Start.Day
&& evt.End.Subtract(evt.Start) < limitAllDay )
{
//toDisplay += personne.ToString() + " " + addOK.ToString() +"\n";
//toDisplay += evt.UnavailabilityType.Description + " " + evt.AllDay + " " + evt.Start.Day +" " + addOK.ToString() + "\n";
}
else
{
addOK = false;
}


//toDisplay += evt.UnavailabilityType.Description + " " + evt.AllDay + " " + evt.Start.Day +" " + addOK.ToString() + "\n";
}


//4. Ajout de la personne dans le toDisplay si jamais on peut
if(addOK)
{
toDisplay += personne.ToString() +"\n";
}
}
}
}


toDisplay




Commentaire sur la formule
Ce rapport comporte deux problèmes pour le but recherché :
1) On ne tient pas compte du pas affectable au delà de.
2) Quand il n'y a pas d'affectation, la formule est incorrecte d'un point de vue des événements NA.
Par ailleurs une version plus simple de la formule existe
Source.Personnel.Where(Properties.Personnel.Teams[ Properties.Team.This.In( teams )] & !Properties.Personnel.This.In_(Source.Allocation.Select(Properties.Allocation.Personnel ).Distinct())).Available(AvailableMode.UnavailableIfAtLeastOneEvent, NotAvailLimitMode.TakeIntoAccountNotAvailLimit).Count.ToString();


Mais il y a deux problèmes avec cette version simplifiée :
1) La partie qui vérifie les affectations peut envoyer des informations de la veille (problème des débuts de journées et du travail de nuit). Supprimant du coup des personnes disponibles.
2) On n'a pas la main sur les événements que l'on souhaite gérer via le pas affectable au dela de.


L'avantage c'est qu'elle ne nécessite pas de reconstruire complètement les informations et est du coup plus rapide.
Date de création: 02/06/2016 14:10      Mis à jour: 06/09/2016 13:56
Fichiers
5.png