From a65def4c19ada48d5bf462d454d13ba9f3adaeda Mon Sep 17 00:00:00 2001 From: HirschleM Date: Tue, 12 May 2026 16:52:41 +0200 Subject: [PATCH] MH: Urlaubsplaner optimiert --- .../Urlaubsplanung/UrlaubsplanungsManager.cs | 251 +++++------------- 1 file changed, 72 insertions(+), 179 deletions(-) diff --git a/Service/Urlaubsplanung/UrlaubsplanungsManager.cs b/Service/Urlaubsplanung/UrlaubsplanungsManager.cs index 9fb3d3a78..e4bf62bf9 100644 --- a/Service/Urlaubsplanung/UrlaubsplanungsManager.cs +++ b/Service/Urlaubsplanung/UrlaubsplanungsManager.cs @@ -48,46 +48,8 @@ namespace BeWo.Service.Urlaubsplanung AbsenceTimes = root.Abwesenheiten.Where(a => a.EmployeeOid == emp.EmployeeOid).ToList(), GeschenkteUrlaubstage = root.GeschenkteUrlaubstage.Where(u => u.Employee == emp.EmployeeOid).ToList() }; - - // Urlaube setzen so wie im Urlaubskonto - Dictionary contractsAndWeeklyDays = new Dictionary(); - - // Vertrag für Jahr raussuchen - foreach (var c in emp.Contracts) - { - DateTime contractEndDate = new DateTime(); - if (c.ContractEndDate == null) - contractEndDate = new DateTime(2099, 12, 31); - else - contractEndDate = c.ContractEndDate.Value; - - DateTime contractStartDate = new DateTime(); - if (c.EntryDate == null) - contractStartDate = new DateTime(filter.Year, 01, 01); - else - contractStartDate = c.EntryDate.Value; - - if (filter.Year >= contractStartDate.Year && filter.Year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt - { - contractsAndWeeklyDays.Add(c, c.WeeklyDays); - } - } - - // Urlaubstage im Zeitraum zählen - var urlaubAbsences = vs.GetAllVacationAbsences(infoDC.AbsenceTimes, filter.Year, true); - foreach (var abs in urlaubAbsences) - { - infoDC.TageUrlaub += vs.CountAbwesenheitstage(emp, abs, filter.Year, contractsAndWeeklyDays); - } - - // Krankheitstage im Zeitraum zählen - var sickAbsences = vs.GetAllSickAbsences(infoDC.AbsenceTimes, filter.Year, true); - foreach (var abs in sickAbsences) - { - // CountAbwesenheitstage zählt nur eine Liste an Abwesenheiten, also kann hier auch auf Krankheiten gefiltert und diese - // Liste übergeben werden. Es werden dann nach den selben Regeln die Krankheiten gezählt. - infoDC.TageKrankheit += vs.CountAbwesenheitstage(emp, abs, filter.Year, contractsAndWeeklyDays); - } + infoDC.TageUrlaub = CountUrlaubstage(infoDC); + infoDC.TageKrankheit = CountKrankheitstage(infoDC); root.AlleAbwesenheitsInformationDCs.Add(infoDC); } @@ -100,73 +62,84 @@ namespace BeWo.Service.Urlaubsplanung { decimal tageUrlaub = 0; - List urlaubstage = new List(); + VacationService vs = PluginLoader.FindClass(); - List arbeitsfreieTage = GetArbeitsfreieTage(info); + // Urlaube setzen so wie im Urlaubskonto + Dictionary contractsAndWeeklyDays = new Dictionary(); - foreach (var tag in info.AbsenceTimes) + // Vertrag für Jahr raussuchen + foreach (var c in info.Employee.Contracts) { - if (tag.Reason.Description.Equals("Urlaub")) - urlaubstage.Add(tag); - } + DateTime contractEndDate = new DateTime(); + if (c.ContractEndDate == null) + contractEndDate = new DateTime(2099, 12, 31); + else + contractEndDate = c.ContractEndDate.Value; - if (urlaubstage.Count > 0) - { - foreach (var spanne in urlaubstage) + DateTime contractStartDate = new DateTime(); + if (c.EntryDate == null) + contractStartDate = new DateTime(info.Year, 01, 01); + else + contractStartDate = c.EntryDate.Value; + + if (info.Year >= contractStartDate.Year && info.Year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt { - if (spanne.End == null) - spanne.End = new DateTime(info.Year, info.Month, DateTime.DaysInMonth(info.Year, info.Month)); - // Nur ein Tag - if (spanne.Start.Value.Date == spanne.End.Value.Date) - { - if (spanne.Start.Value.TimeOfDay != spanne.End.Value.TimeOfDay) - tageUrlaub += 0.5m; - else - tageUrlaub++; - - } - // Mehrere Tage - else - { - // Alle Tage in einem Monat - if (spanne.Start.Value.Month == spanne.End.Value.Month) - tageUrlaub += Convert.ToInt32((spanne.End.Value.Date - spanne.Start.Value.Date).TotalDays + 1); - // Tage über Monate verteilt - else - { - DateTime? tempStart = null; - DateTime? tempEnd = null; - // Prüfen, ob Start und/oder Ende nicht dem ausgewählten Monat entspricht - if (spanne.Start.Value.Month != info.Month) - { - tempStart = new DateTime(info.Year, info.Month, 1); - } - if (spanne.End.Value.Month != info.Month) - { - tempEnd = new DateTime(info.Year, info.Month, 1).AddMonths(1).AddTicks(-1); - } - - if (tempStart != null && tempEnd != null) - tageUrlaub += Convert.ToInt32((tempEnd.Value.Date - tempStart.Value.Date).TotalDays + 1); - else if (tempStart != null && tempEnd == null) - tageUrlaub += Convert.ToInt32((spanne.End.Value.Date - tempStart.Value.Date).TotalDays + 1); - else if (tempStart == null && tempEnd != null) - tageUrlaub += Convert.ToInt32((tempEnd.Value.Date - spanne.Start.Value.Date).TotalDays + 1); - } - } - if (tageUrlaub != 0) - { - foreach (var tag in arbeitsfreieTage) - { - if (spanne.AbsenceSpan.ContainsDate(tag)) - tageUrlaub--; - } - } + contractsAndWeeklyDays.Add(c, c.WeeklyDays); } } - return tageUrlaub; // Es wird die richtige Zahl zurückgegeben + // Urlaubstage im Zeitraum zählen + var urlaubAbsences = vs.GetAllVacationAbsences(info.AbsenceTimes, info.Year, true); + foreach (var abs in urlaubAbsences) + { + tageUrlaub += vs.CountAbwesenheitstage(info.Employee, abs, info.Year, contractsAndWeeklyDays); + } + + return tageUrlaub; } + + public decimal CountKrankheitstage(AbwesenheitsInformationDC info) + { + decimal tageKrankheit = 0; + + VacationService vs = PluginLoader.FindClass(); + + // Krankheiten setzen so wie Urlaube im Urlaubskonto + Dictionary contractsAndWeeklyDays = new Dictionary(); + + // Vertrag für Jahr raussuchen + foreach (var c in info.Employee.Contracts) + { + DateTime contractEndDate = new DateTime(); + if (c.ContractEndDate == null) + contractEndDate = new DateTime(2099, 12, 31); + else + contractEndDate = c.ContractEndDate.Value; + + DateTime contractStartDate = new DateTime(); + if (c.EntryDate == null) + contractStartDate = new DateTime(info.Year, 01, 01); + else + contractStartDate = c.EntryDate.Value; + + if (info.Year >= contractStartDate.Year && info.Year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt + { + contractsAndWeeklyDays.Add(c, c.WeeklyDays); + } + } + + // Krankheitstage im Zeitraum zählen + var sickAbsences = vs.GetAllSickAbsences(info.AbsenceTimes, info.Year, true); + foreach (var abs in sickAbsences) + { + // CountAbwesenheitstage zählt nur eine Liste an Abwesenheiten, also kann hier auch auf Krankheiten gefiltert und diese + // Liste übergeben werden. Es werden dann nach den selben Regeln die Krankheiten gezählt. + tageKrankheit += vs.CountAbwesenheitstage(info.Employee, abs, info.Year, contractsAndWeeklyDays); + } + + return tageKrankheit; + } + public List GetAllEmployeeAbsenceTimesForMonth(int year, int month) { try @@ -228,87 +201,7 @@ namespace BeWo.Service.Urlaubsplanung throw Utils.CreateBeWoFaultException(ex); } } - public decimal CountKrankheitstage(AbwesenheitsInformationDC info) - { - int tageKrankheit = 0; - List krankheitstage = new List(); - - List arbeitsfreieTage = GetArbeitsfreieTage(info); - - foreach (var tag in info.AbsenceTimes) - { - if (tag.Reason.Description.ToLower().Contains("krank")) - krankheitstage.Add(tag); - } - if (krankheitstage.Count > 0) - { - foreach (var spanne in krankheitstage) - { - // Nur ein Tag - if (spanne.Start == spanne.End) - tageKrankheit++; - // Mehrere Tage - else - { - // Wenn Krankheit ein Enddatum hat - if (spanne.End != null) - { - // Alle Tage in einem Monat - if (spanne.Start.Value.Month == spanne.End.Value.Month) - tageKrankheit += Convert.ToInt32((spanne.End.Value.Date - spanne.Start.Value.Date).TotalDays + 1); - // Tage über mehrere Monate verteilt - else - { - // Prüfen, ob Start und/oder Ende nicht dem ausgewählten Monat entspricht - DateTime? tempStart = null; - DateTime? tempEnd = null; - if (spanne.Start.Value.Month != info.Month) - { - tempStart = new DateTime(info.Year, info.Month, 1); - } - if (spanne.End.Value.Month != info.Month) - { - tempEnd = new DateTime(info.Year, info.Month, 1).AddMonths(1).AddTicks(-1); - } - - if (tempStart != null && tempEnd != null) - tageKrankheit += Convert.ToInt32((tempEnd.Value.Date - tempStart.Value.Date).TotalDays + 1); - else if (tempStart != null && tempEnd == null) - tageKrankheit += Convert.ToInt32((spanne.End.Value.Date - tempStart.Value.Date).TotalDays + 1); - else if (tempStart == null && tempEnd != null) - tageKrankheit += Convert.ToInt32((tempEnd.Value.Date - spanne.Start.Value.Date).TotalDays + 1); - } - } - // Wenn Krankheit kein Enddatum gesetzt wurde - else - { - if (spanne.Start.Value.Month != info.Month) - { - DateTime tempEnd = new DateTime(info.Year, info.Month, DateTime.DaysInMonth(info.Year, info.Month)); - DateTime tempStart = new DateTime(info.Year, info.Month, 1); ; - - tageKrankheit += Convert.ToInt32((tempEnd.Date - tempStart.Date).TotalDays + 1); - } - else - { - DateTime tempEnd = new DateTime(spanne.Start.Value.Year, spanne.Start.Value.Month, DateTime.DaysInMonth(spanne.Start.Value.Year, spanne.Start.Value.Month)); - tageKrankheit += Convert.ToInt32((tempEnd.Date - spanne.Start.Value.Date).TotalDays + 1); - } - } - } - if (tageKrankheit != 0) - { - foreach (var tag in arbeitsfreieTage) - { - if (spanne.AbsenceSpan.ContainsDate(tag)) - tageKrankheit--; - } - } - } - } - - return tageKrankheit; - } + private List GetArbeitsfreieTage(AbwesenheitsInformationDC info) {