MH: Urlaubkonto in der Mitarbeitermaske gefixt (Urlaub und Endsumme stimmten nicht überein)

This commit is contained in:
Marcel Hirschle
2022-07-29 11:51:42 +02:00
parent c2b2075eee
commit 3d8f1f7419
2 changed files with 41 additions and 9 deletions

View File

@@ -944,7 +944,7 @@ namespace BeWo.Service.Dienstplanung
else
abs.End = new DateTime(date.Year, date.Month, DateTime.DaysInMonth(date.Year, date.Month));
var dauerAbwesenheit = vs.BerechneAnzahlUrlaubstage(null, abs, date.Year);
var dauerAbwesenheit = vs.BerechneAnzahlUrlaubstage(null, abs, date.Year, item.ArbeitstageProWoche);
if (abs.Reason.Description.ToLower().Contains("urlaub"))
dc.TageUrlaub += dauerAbwesenheit * item.SollProTag;
else if (abs.Reason.Description.ToLower().Contains("krank"))

View File

@@ -276,6 +276,7 @@ namespace BeWo.Service.Plugins
// Benötigt werden:
// 1. Vetragliche Urlaubstage für´s Jahr
List<ContractDC> contracts = new List<ContractDC>();
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
// Vertrag für Jahr raussuchen
foreach (var c in emp.Contracts)
@@ -286,15 +287,19 @@ namespace BeWo.Service.Plugins
else
contractEndDate = c.ContractEndDate.Value;
if (year >= c.EntryDate.Value.Year && year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt
{
contracts.Add(c);
contractsAndWeeklyDays.Add(c, c.WeeklyDays);
}
}
if (contracts.Count == 0) // Kein Vertrag = kein Urlaubskonto
return null;
// 2. Abzuziehende Tage wegen Vertragsbeginn mitten im Jahr
foreach (var contract in contracts)
foreach (var contractAndWeeklyDays in contractsAndWeeklyDays)
{
var contract = contractAndWeeklyDays.Key;
#region Vielleicht bald unnötig
// Zahlen für Darstellung in View
decimal tageNachAbzug = 0;
@@ -451,8 +456,18 @@ namespace BeWo.Service.Plugins
// Tage auf den Zähler addieren, solange das sich erhöhende Datum vor dem Enddatum ist und wenn das Datum kein Wochenend- oder Feiertag ist
while (startForLoop <= spanne.End.Value)
{
if (startForLoop.DayOfWeek != DayOfWeek.Saturday && startForLoop.DayOfWeek != DayOfWeek.Sunday && !_Feiertage.Contains(startForLoop))
summeTage++;
var currentContract = contractsAndWeeklyDays.FirstOrDefault(c => startForLoop >= c.Key.EntryDate && startForLoop <= c.Key.ContractEndDate || startForLoop >= c.Key.EntryDate && c.Key.ContractEndDate == null);
if (currentContract.Key == null)
{
if (startForLoop.DayOfWeek != DayOfWeek.Saturday && startForLoop.DayOfWeek != DayOfWeek.Sunday && !_Feiertage.Contains(startForLoop))
summeTage++;
}
else
{
if (!CheckIstWochenende(currentContract.Value, startForLoop.DayOfWeek) && !IstFeiertag(startForLoop))
summeTage++;
}
startForLoop = startForLoop.AddDays(1);
}
@@ -520,12 +535,15 @@ namespace BeWo.Service.Plugins
konten.Add(i, new UrlaubskontoDC());
}
int? workdays = 0;
// Jahresurlaubanspruch berechnen
foreach (var contract in emp.Contracts)
{
var start = contract.EntryDate?.Year ?? firstYear;
var end = contract.ContractEndDate?.Year ?? year;
if (year >= start && year <= end)
workdays = contract.WeeklyDays;
// Durch jedes Jahr des Vertrags gehen
for (int i = start; i <= end; i++)
{
@@ -627,7 +645,8 @@ namespace BeWo.Service.Plugins
var end = DateTimeExtensions.GetMin(absence.End, new DateTime(absYear, 12, 31));
// Dauer des Urlaubs unter Berücksichtigung von Wochenend- und Feiertagen berechnen
var dauer = BerechneAnzahlUrlaubstage(absence, null, absYear);
var dauer = BerechneAnzahlUrlaubstage(absence, null, absYear, workdays); // HIER MÜSSEN PARAMETER FÜR ISTWOCHENENDE() MITGEGEBEN WERDEN
// Verfallsdatum des Urlaubs festlegen
var expiration = GetExpirationDate(absYear);
current.UrlaubsVerfallsdatum = expiration;
@@ -643,7 +662,8 @@ namespace BeWo.Service.Plugins
// Urlaubstagzähler erhöhen, wenn aktueller Tag der Schleife weder ein Wochenend- noch ein Feiertag ist
while (zaehlerDatum <= firstEnd)
{
if (zaehlerDatum.DayOfWeek != DayOfWeek.Saturday && zaehlerDatum.DayOfWeek != DayOfWeek.Sunday && !_Feiertage.Contains(zaehlerDatum))
bool istWochenende = CheckIstWochenende(workdays, zaehlerDatum.DayOfWeek);
if (!istWochenende && !_Feiertage.Contains(zaehlerDatum))
dauerVorjahr++;
zaehlerDatum = zaehlerDatum.AddDays(1);
@@ -705,6 +725,18 @@ namespace BeWo.Service.Plugins
}
}
private bool CheckIstWochenende(int? workdays, DayOfWeek tag)
{
bool istWochenende = tag == DayOfWeek.Saturday || tag == DayOfWeek.Sunday;
if (workdays == 6)
istWochenende = tag == DayOfWeek.Sunday;
else if (workdays > 6)
istWochenende = false;
return istWochenende;
}
internal decimal BerechneAnzahlUrlaubstageMitWeeklyDays(AbsenceTimeDC absenceDC, int year, int weeklyDays)
{
decimal tage = 0;
@@ -826,7 +858,7 @@ namespace BeWo.Service.Plugins
return urlaubstage;
}
public decimal BerechneAnzahlUrlaubstage(AbsenceTime absence, AbsenceTimeDC absenceDC, int year)
public decimal BerechneAnzahlUrlaubstage(AbsenceTime absence, AbsenceTimeDC absenceDC, int year, int? workdays)
{
if (absence != null)
{
@@ -852,7 +884,7 @@ namespace BeWo.Service.Plugins
while (start <= end)
{
if (/*start.DayOfWeek != DayOfWeek.Saturday && start.DayOfWeek != DayOfWeek.Sunday &&*/ !IstFeiertag(start))
if (!CheckIstWochenende(workdays, start.DayOfWeek) && !IstFeiertag(start))
{
if (start.Date == end.Date && start.TimeOfDay != end.TimeOfDay)
days += 0.5m;
@@ -890,7 +922,7 @@ namespace BeWo.Service.Plugins
while (start <= end)
{
if (start.DayOfWeek != DayOfWeek.Saturday && start.DayOfWeek != DayOfWeek.Sunday && !IstFeiertag(start))
if (!CheckIstWochenende(workdays, start.DayOfWeek) && !IstFeiertag(start))
{
if (start.Date == end.Date && start.TimeOfDay != end.TimeOfDay)
days += 0.5m;