MH: Urlaubsplaner optimiert

This commit is contained in:
2026-05-12 16:52:41 +02:00
parent bf5964fbc2
commit a65def4c19

View File

@@ -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<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
// 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<AbsenceTimeDC> urlaubstage = new List<AbsenceTimeDC>();
VacationService vs = PluginLoader.FindClass<VacationService>();
List<DateTime> arbeitsfreieTage = GetArbeitsfreieTage(info);
// Urlaube setzen so wie im Urlaubskonto
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
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<VacationService>();
// Krankheiten setzen so wie Urlaube im Urlaubskonto
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
// 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<AbsenceTimeDC> 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<AbsenceTimeDC> krankheitstage = new List<AbsenceTimeDC>();
List<DateTime> 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<DateTime> GetArbeitsfreieTage(AbwesenheitsInformationDC info)
{