using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; namespace BeWo.Report.ReportObjects { public class RosterIstRO : AbstractBeWoReportObject { public List PageObjects { get; set; } public static RosterIstRO Create(List dienstEintragDCs, List dienstvertretungDCs, List employee, List dienstInfoDCs, CompactWohnheimDC compactWohnheimDC, int year, int month, List feiertage, List absences, Dictionary stundenBeiAbwesenheit) { RosterIstRO ro = new RosterIstRO(); ro.PageObjects = new List(); // (Vorerst) leere Einträge erstellen List>> alleEintraege = new List>>(); int pos = 0; foreach (var emp in employee) { // Es müsste nicht für jeden Tag was erstellt werden, sondern für jeden Mitarbeiter müsste die Anzahl der Schichten pro Tag // ermittelt werden und anhand dessen die Zeilenmenge erstellt werden Dictionary> eintraegeDict = new Dictionary>(); for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++) { var datum = new DateTime(year, month, i); bool mitarbeiterDesWohnheims = false; if (compactWohnheimDC.EmployeeOids.Contains(emp.EmployeeOid.Value)) mitarbeiterDesWohnheims = true; else mitarbeiterDesWohnheims = false; var diensteFuerTag = mitarbeiterDesWohnheims ? dienstEintragDCs.Where(e => e.EmployeeOid == emp.EmployeeOid && e.Datum == datum).ToList() : null; var vertretungenFuerTag = !mitarbeiterDesWohnheims ? dienstvertretungDCs.Where(e => e.EmployeeOid == emp.EmployeeOid && e.Datum == datum).ToList() : null; var abwesenheitenFuerTag = absences.Where(a => datum >= a.AbsenceSpan.StartDate && datum <= a.AbsenceSpan.EndDate && a.EmployeeOid == emp.EmployeeOid).ToList(); string kr = null; string ur = null; if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("urlaub"))) { ur = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]); } else if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("krank"))) { kr = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]); } if (mitarbeiterDesWohnheims) { List listeneintraege = new List(); foreach (var abs in abwesenheitenFuerTag) { string[] urlaubKrankheit = new string[2]; if (!diensteFuerTag.Any(d => d.Datum.Date == datum.Date)) { // AUSPROGRAMMIEREN if (abs.Reason.Description.ToLower().Contains("krank")) urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[abs.EmployeeOid]); else if (abs.Reason.Description.ToLower().Contains("urlaub")) urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[abs.EmployeeOid]); listeneintraege.Add(new Listeneintrag() { Position = pos, Datum = datum, EmployeeOid = (long)emp.EmployeeOid, Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : abs.Reason.Description, Krankheit = urlaubKrankheit[0], Urlaub = urlaubKrankheit[1] }); pos++; } } foreach (var item in diensteFuerTag) { string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(item, null, absences, stundenBeiAbwesenheit); listeneintraege.Add(new Listeneintrag() { Position = pos, Datum = datum, EmployeeOid = (long)emp.EmployeeOid, DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden), Dienst = dienstInfoDCs.First(di => di.Oid == item.DienstOid), Endzeit = item.Endzeit, Startzeit = item.Startzeit, Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : item.Notice, Krankheit = urlaubKrankheit[0], Urlaub = urlaubKrankheit[1] }); pos++; } eintraegeDict.Add(i, listeneintraege); } else { List listeneintraege = new List(); foreach (var item in vertretungenFuerTag) { string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(null, item, absences, stundenBeiAbwesenheit); listeneintraege.Add(new Listeneintrag() { Position = pos, Datum = datum, EmployeeOid = (long)emp.EmployeeOid, DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden), Dienst = dienstInfoDCs.First(di => di.Oid == item.DienstOid), Endzeit = item.Endzeit, Startzeit = item.Startzeit, Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : item.Notice, Krankheit = urlaubKrankheit[0], Urlaub = urlaubKrankheit[1] }); pos++; } eintraegeDict.Add(i, listeneintraege); } } #region outdated // for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++) // { // string kr = null; // string ur = null; // var datum = new DateTime(year, month, i); // if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("urlaub"))) // { // ur = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]); // } // else if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("krank"))) // { // kr = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]); // } // eintraege.Add(new Listeneintrag() // { // Position = pos, // Datum = datum, // EmployeeOid = (long)emp.EmployeeOid, // DauerInStunden = null, // Dienst = null, // Endzeit = null, // Startzeit = null, // Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : null, // Krankheit = kr, // Urlaub = ur, // }); // pos++; // } //} //foreach (var item in dienstEintragDCs) //{ // string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(item, null, absences, stundenBeiAbwesenheit); // var temp = eintraege.FirstOrDefault(e => e.Datum == item.Datum && e.EmployeeOid == item.EmployeeOid && e.Dienst == null); // var temp2 = eintraege.Where(e => e.Datum == item.Datum && e.EmployeeOid == item.EmployeeOid).ToList(); // if (temp != null) // { // eintraege[temp.Position] = new Listeneintrag() // { // Datum = item.Datum, // DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden), // Dienst = dienstInfoDCs.First(i => i.Oid == item.DienstOid), // EmployeeOid = item.EmployeeOid, // Endzeit = item.Endzeit, // Notice = item.Notice, // Startzeit = item.Startzeit, // Urlaub = urlaubKrankheit[0], // Krankheit = urlaubKrankheit[1] // }; // } //} //foreach (var item in dienstvertretungDCs) //{ // string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(null, item, absences, stundenBeiAbwesenheit); // var temp = eintraege.FirstOrDefault(e => e.Datum == item.Datum && e.EmployeeOid == item.EmployeeOid && e.Dienst == null); // if (temp != null) // { // eintraege[temp.Position] = new Listeneintrag() // { // Datum = item.Datum, // DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden), // Dienst = dienstInfoDCs.First(i => i.Oid == item.DienstOid), // EmployeeOid = item.EmployeeOid, // Endzeit = item.Endzeit, // Notice = item.Notice, // Startzeit = item.Startzeit, // Urlaub = urlaubKrankheit[0], // Krankheit = urlaubKrankheit[1] // }; // } #endregion alleEintraege.Add(eintraegeDict); } int counter = 0; int position = 0; foreach (EmployeeDC emp in employee) { List liste = new List(); var temp = alleEintraege[counter]; foreach (var item in temp) { if (item.Value.Count == 0) { var date = new DateTime(year, month, item.Key, 0, 0, 0); item.Value.Add(new Listeneintrag() { Datum = date, DauerInStunden = null, Dienst = null, EmployeeOid = emp.EmployeeOid.Value, Endzeit = null, Krankheit = null, Notice = feiertage.Any(f => f.Datum == date) ? feiertage.First(f => f.Datum == date).Name : null, Startzeit = null, Urlaub = null }); } //else foreach (var v in item.Value) liste.Add(v); } ro.PageObjects.Add(new PageObject() { Jahr = year, Monat = new DateTime(year, month, 1).ToString("MMMM", CultureInfo.CreateSpecificCulture("de")), Mitarbeiter = emp, EintraegeProMitarbeiter = liste }); counter++; } return ro; } private static string[] UrlaubUndKrankheitUeberpruefen(DienstEintragDC eintrag, DienstvertretungDC vertretung, List abwesenheiten, Dictionary stundenBeiAbwesenheit) { string[] urlaubKrankheit = new string[] { " ", " " }; if (eintrag != null) { foreach (var absence in abwesenheiten) { if (eintrag.Datum >= absence.Start && eintrag.Datum <= absence.End.Value && eintrag.EmployeeOid == absence.EmployeeOid) { if (absence.Reason.Description.ToLower().Contains("krank")) urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]); else if (absence.Reason.Description.ToLower().Contains("urlaub")) urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]); } } } else if (vertretung != null) { foreach (var absence in abwesenheiten) { if (vertretung.Datum >= absence.Start && vertretung.Datum <= absence.End.Value && vertretung.EmployeeOid == absence.EmployeeOid) { if (absence.Reason.Description.ToLower().Contains("krank")) urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]); else if (absence.Reason.Description.ToLower().Contains("urlaub")) urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]); } } } return urlaubKrankheit; } } public class Listeneintrag { public int Position { get; set; } public long EmployeeOid { get; set; } public string Notice { get; set; } public DienstInfoDC Dienst { get; set; } public DateTime Datum { get; set; } public string Startzeit { get; set; } public string Endzeit { get; set; } public string DauerInStunden { get; set; } public string Urlaub { get; set; } public string Krankheit { get; set; } } public class PageObject { public EmployeeDC Mitarbeiter { get; set; } public string Monat { get; set; } public int Jahr { get; set; } public List EintraegeProMitarbeiter { get; set; } } }