Rapport avancé - Rapport d'imputation de T1 à T2 en fonction de la semaine (2.22)


Objectif
Le but du rapport est d'avoir par semaine le nombre d'heures d'imputations exactes. Donc si une imputation est à cheval sur deux semaines, elle doit être découpée entre ces deux semaines avec comme changement de semaine : minuit (0h00).




Contexte

Rapport de type imputation avec comme type de source dans le rapport : Formule
En ligne : Type d'imputation.
En colonne : rien.


Formule
bool debug = false;
//Définition des numéros de semaine.
var calendarWeekRule = System.Globalization.CalendarWeekRule.FirstFourDayWeek;
var firstDayOfWeek = System.DayOfWeek.Monday;
var calendar = System.Globalization.CultureInfo.InvariantCulture.Calendar;


var toDisplay = "";


if(Headers._Charge != null)
{
// Récupération des Imputations.
// Attention qu'il faut skipper le header, car le header ne concerne qu'un type d'imputation et pas l'arbre d'imputation.
var data = Source.ChargeInstance.SkipHeadersCriteria(Headers._Charge).GetItems();

// Construction d'un dictionnaire avec Key = numéro de semaine, Value = nombre d'heures d'imputations pour la semaine.
Dictionary<int,TimeSpan> hoursForWeek = new Dictionary<int,TimeSpan>();
foreach(var ci in data)
{
var week = calendar.GetWeekOfYear(ci.Start, calendarWeekRule,firstDayOfWeek);
if(!hoursForWeek.ContainsKey(week))
{
hoursForWeek.Add(week,new TimeSpan(0,0,0));
}
}


// Traitement des imputations
// Récupération de la partie enfant de l'arbre d'imputation par rapport à l'imputation d'entête
var chargeTree = Headers._Charge.GetFlattenChildren();
chargeTree.Add(Headers._Charge);

foreach (var ci in data.OrderBy(o => o.Start))
{
// Vérification de l'appartenance de l'imputation à l'arbre d'imputation de l'entête.
if(chargeTree.Contains(ci.Charge))
{
var ciWeek = calendar.GetWeekOfYear(ci.Start, calendarWeekRule, firstDayOfWeek);
//On travaille à la semaine, le dimanche nuit doit être splité sur les deux semaines.
if((int)(ci.Start.DayOfWeek) == 0 && (int)(ci.Start.DayOfWeek) != (int)(ci.End.DayOfWeek))
{
hoursForWeek[ciWeek] = hoursForWeek[ciWeek].Add((new TimeSpan(24-ci.Start.Hour,ci.Start.Minute,0)));
if(hoursForWeek.ContainsKey(ciWeek+1))
{
hoursForWeek[ciWeek+1] = hoursForWeek[ciWeek+1].Add(new TimeSpan(ci.End.Hour,ci.End.Minute,0));
}
if(debug && hoursForWeek.ContainsKey(ciWeek+1))
{
toDisplay += ci.Personnel + " " + ci.Charge.Description + "\n"
+ "Début " + ci.Start.ToString() + " - Fin " + ci.End.ToString()+ "\n"
+ "S" + ciWeek + " - H " + (new TimeSpan(24-ci.Start.Hour,ci.Start.Minute,0)).ToString() + "\n"
+ "S" + (ciWeek+1).ToString() + " - H " + (new TimeSpan(ci.End.Hour,ci.End.Minute,0)).ToString()
+"\n" ;
toDisplay += "Total S" + ciWeek + " " + hoursForWeek[ciWeek].ToString()+"\n"
+ "Total S" + (ciWeek+1).ToString() + " " + hoursForWeek[ciWeek+1].ToString()+ "\n";
}
}
else
{
hoursForWeek[ciWeek] = hoursForWeek[ciWeek].Add(ci.End.Subtract(ci.Start));
if(debug)
{
toDisplay += ci.Personnel + " " + ci.Charge.Description + "\n"
+ "Début " + ci.Start.ToString() + " - Fin " + ci.End.ToString()+ "\n"
+ "S" + ciWeek + " - H " + (ci.End.Subtract(ci.Start)).ToString() +"\n" ;
toDisplay += "Total S" + ciWeek + " " + hoursForWeek[ciWeek].ToString()+"\n";
}
}
}
}


foreach(KeyValuePair<int,TimeSpan> item in hoursForWeek)
{
toDisplay += "S" + item.Key.ToString() + " - " + string.Format ("{0:00}:{1:00}",(int)item.Value.TotalHours,item.Value.Minutes) + "\n";
}
}
toDisplay
Date de création: 27/03/2017 13:55      Mis à jour: 27/03/2017 13:56