MH: Urlaubsplaner optimiert
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user