1719 lines
102 KiB
C#
1719 lines
102 KiB
C#
using BeWo.Data.Access;
|
||
using BeWo.Data.Entities;
|
||
using BeWo.Service.DCEntityMapper;
|
||
using BeWo.Service.ServiceImplementations;
|
||
using BS.Shared;
|
||
using BS.Shared.Core;
|
||
using BS.Shared.DataContracts;
|
||
using BS.Shared.Extensions;
|
||
using DevExpress.CodeParser;
|
||
using DevExpress.XtraRichEdit.Import.Html;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Diagnostics;
|
||
using System.Linq;
|
||
using System.Text.RegularExpressions;
|
||
|
||
namespace BeWo.Service.Plugins
|
||
{
|
||
public class VacationService : AbstractIDSpecificDefaultClass<VacationService>
|
||
{
|
||
private List<FeiertagDC> databaseFeiertage = null;
|
||
private IList<AbsenceReason> allAbsenceReasons = null;
|
||
private IList<GeschenkterUrlaubstag> allGeschenkteUrlaubstage = null;
|
||
private List<DateTime> _Feiertage { get;set; }
|
||
private string _Bundesland = "NRW";
|
||
|
||
public virtual string Bundesland
|
||
{
|
||
get
|
||
{
|
||
return _Bundesland;
|
||
}
|
||
set
|
||
{
|
||
_Bundesland = value;
|
||
}
|
||
}
|
||
|
||
public virtual bool IstFeiertag(DateTime start)
|
||
{
|
||
List<DateTime> feiertage = GetFeiertage(start.Year);
|
||
|
||
foreach (var ft in feiertage)
|
||
{
|
||
if (start.Date == ft)
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
|
||
public virtual List<DateTime> GetFeiertage(int year)
|
||
{
|
||
var list = GetFeiertage(year, Bundesland);
|
||
|
||
return list.Select(f => f.Datum).ToList();
|
||
}
|
||
|
||
public virtual FeiertagDC GetFeiertag(DateTime start)
|
||
{
|
||
var feiertage = GetFeiertage(start.Year, Bundesland);
|
||
|
||
foreach (var ft in feiertage)
|
||
{
|
||
if (start == ft.Datum)
|
||
return ft;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
public virtual FerienDC GetFerien(DateTime start, String bundesland)
|
||
{
|
||
var ferienList = GetFerien(bundesland);
|
||
|
||
foreach (var ferien in ferienList)
|
||
{
|
||
if (start >= ferien.Start && start <= ferien.Ende)
|
||
return ferien;
|
||
}
|
||
return null;
|
||
}
|
||
|
||
public virtual List<FeiertagDC> GetFeiertage(int year, String bundesland)
|
||
{
|
||
List<FeiertagDC> list = new List<FeiertagDC>();
|
||
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 1, 1), Name = "Neujahr" });
|
||
//list.Add(new DateTime(year, 1, 6)); // , "Heilige Drei Könige"));
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 5, 1), Name = "Tag der Arbeit" });
|
||
//list.Add(new DateTime(year, 8, 15)); // , "Mariä Himmelfahrt"));
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 10, 3), Name = "Tag der Deutschen Einheit" });
|
||
//list.Add(new DateTime(year, 10, 31)); // , "Reformationstag"));
|
||
|
||
if (bundesland.ToLower() == "bayern")
|
||
{
|
||
//ACHTUNG nicht überall in Bayern Feiertag!!!
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 8, 15), Name = "Mariä Himmelfahrt" });
|
||
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 1, 6), Name = "Heilige Drei Könige" });
|
||
}
|
||
|
||
if (bundesland.ToLower() == "nrw" || bundesland.ToLower() == "bayern" || bundesland.ToLower() == "rheinland-pfalz")
|
||
{
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 11, 1), Name = "Allerheiligen" });
|
||
}
|
||
|
||
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 12, 24), Name = "Heilig Abend" }); // Eigentlich kein gesetzlicher Feiertag, wird bei uns aber immer als Standard gesetzt, da in der Praxis die meisten Unternehmen einen halben für Heilig Abend und einen halben für Silvester geben.
|
||
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 12, 25), Name = "1. Weihnachtstag" });
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 12, 26), Name = "2. Weihnachtstag" });
|
||
|
||
if (year == 2017 || bundesland.ToLower() == "brandenburg" || bundesland.ToLower() == "niedersachsen")
|
||
list.Add(new FeiertagDC { Datum = new DateTime(year, 10, 31), Name = "Reformationstag" });
|
||
|
||
DateTime osterSonntag = GetOsterSonntag(year);
|
||
//list.Add(osterSonntag); // , "Ostersonntag"));
|
||
//list.Add(osterSonntag.AddDays(-3)); // , "Gründonnerstag")); q
|
||
//list.Add(osterSonntag.AddDays(-48)); // , "Rosenmontag"));
|
||
list.Add(new FeiertagDC { Datum = osterSonntag.AddDays(-2), Name = "Karfreitag" });
|
||
list.Add(new FeiertagDC { Datum = osterSonntag.AddDays(1), Name = "Ostermontag" });
|
||
list.Add(new FeiertagDC { Datum = osterSonntag.AddDays(39), Name = "Christi Himmelfahrt" });
|
||
list.Add(new FeiertagDC { Datum = osterSonntag.AddDays(50), Name = "Pfingstmontag" });
|
||
|
||
if (bundesland.ToLower() == "nrw" || bundesland.ToLower() == "hessen" || bundesland.ToLower() == "bayern" || bundesland.ToLower() == "rheinland-pfalz")
|
||
list.Add(new FeiertagDC { Datum = osterSonntag.AddDays(60), Name = "Fronleichnam" });
|
||
|
||
|
||
list.AddRange(GetDBFeiertage(year));
|
||
|
||
return list;
|
||
}
|
||
|
||
//Für zentrale Ablage der Feiertage
|
||
public virtual List<FeiertagDC> GetDBFeiertage(int year)
|
||
{
|
||
if (databaseFeiertage == null)
|
||
{
|
||
var feiertage = DAOFactory.GenericDAO.GetAllActive<Feiertag>();
|
||
|
||
databaseFeiertage = MapperFactory.FeiertagDC_Feiertag.MapToNewDCs(feiertage.Where(f => !f.OrganisationOid.HasValue));
|
||
|
||
}
|
||
|
||
|
||
return databaseFeiertage.Where(f => f.Datum >= new DateTime(year, 1, 1) && f.Datum < new DateTime(year + 1, 1, 1)).ToList();
|
||
}
|
||
|
||
private IList<AbsenceReason> AllAbsenceReasons
|
||
{
|
||
get
|
||
{
|
||
if (allAbsenceReasons == null)
|
||
{
|
||
allAbsenceReasons = DAOFactory.GenericDAO.GetAll<AbsenceReason>();
|
||
}
|
||
|
||
return allAbsenceReasons;
|
||
}
|
||
}
|
||
|
||
private IList<GeschenkterUrlaubstag> AllGeschenkteUrlaubstage
|
||
{
|
||
get
|
||
{
|
||
return allGeschenkteUrlaubstage;
|
||
}
|
||
set
|
||
{
|
||
allGeschenkteUrlaubstage = value;
|
||
}
|
||
}
|
||
|
||
public static DateTime GetOsterSonntag(int year)
|
||
{
|
||
|
||
int g, h, c, j, l, i;
|
||
|
||
g = year % 19;
|
||
c = year / 100;
|
||
h = ((c - (c / 4)) - (((8 * c) + 13) / 25) + (19 * g) + 15) % 30;
|
||
i = h - (h / 28) * (1 - (29 / (h + 1)) * ((21 - g) / 11));
|
||
j = (year + (year / 4) + i + 2 - c + (c / 4)) % 7;
|
||
|
||
l = i - j;
|
||
int month = (int)(3 + ((l + 40) / 44));
|
||
int day = (int)(l + 28 - 31 * (month / 4));
|
||
|
||
return new DateTime(year, month, day);
|
||
|
||
}
|
||
|
||
public virtual List<FerienDC> GetFerien(String bundesland = "nrw")
|
||
{
|
||
List<FerienDC> list = new List<FerienDC>();
|
||
|
||
if (bundesland.ToLower() == "nrw")
|
||
{
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2014", Start = new DateTime(2014, 7, 7), Ende = new DateTime(2014, 8, 19) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2014", Start = new DateTime(2014, 10, 6), Ende = new DateTime(2014, 10, 18) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2014", Start = new DateTime(2014, 12, 22), Ende = new DateTime(2015, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2015", Start = new DateTime(2015, 3, 30), Ende = new DateTime(2015, 4, 11) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2015", Start = new DateTime(2015, 6, 29), Ende = new DateTime(2015, 8, 11) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2015", Start = new DateTime(2015, 10, 5), Ende = new DateTime(2015, 10, 17) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2015", Start = new DateTime(2015, 12, 23), Ende = new DateTime(2016, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2016", Start = new DateTime(2016, 3, 21), Ende = new DateTime(2016, 4, 2) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2016", Start = new DateTime(2016, 7, 11), Ende = new DateTime(2016, 8, 23) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2016", Start = new DateTime(2016, 10, 10), Ende = new DateTime(2016, 10, 21) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2016", Start = new DateTime(2016, 12, 23), Ende = new DateTime(2017, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2017", Start = new DateTime(2017, 4, 10), Ende = new DateTime(2017, 4, 22) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2017", Start = new DateTime(2017, 7, 17), Ende = new DateTime(2017, 8, 29) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2017", Start = new DateTime(2017, 10, 23), Ende = new DateTime(2017, 11, 4) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2017", Start = new DateTime(2017, 12, 27), Ende = new DateTime(2018, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2018", Start = new DateTime(2018, 3, 26), Ende = new DateTime(2018, 4, 7) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2018", Start = new DateTime(2018, 7, 16), Ende = new DateTime(2018, 8, 28) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2018", Start = new DateTime(2018, 10, 15), Ende = new DateTime(2018, 10, 27) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2018", Start = new DateTime(2018, 12, 21), Ende = new DateTime(2019, 1, 4) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2019", Start = new DateTime(2019, 4, 15), Ende = new DateTime(2019, 4, 27) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2019", Start = new DateTime(2019, 7, 15), Ende = new DateTime(2019, 8, 27) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2019", Start = new DateTime(2019, 10, 14), Ende = new DateTime(2019, 10, 26) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2019", Start = new DateTime(2019, 12, 23), Ende = new DateTime(2020, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2020", Start = new DateTime(2020, 4, 6), Ende = new DateTime(2020, 4, 18) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2020", Start = new DateTime(2020, 6, 29), Ende = new DateTime(2020, 8, 11) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2020", Start = new DateTime(2020, 10, 12), Ende = new DateTime(2020, 10, 24) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2020", Start = new DateTime(2020, 12, 21), Ende = new DateTime(2021, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2021", Start = new DateTime(2021, 3, 29), Ende = new DateTime(2021, 4, 10) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2021", Start = new DateTime(2021, 7, 5), Ende = new DateTime(2021, 8, 17) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2021", Start = new DateTime(2021, 10, 11), Ende = new DateTime(2021, 10, 23) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2021", Start = new DateTime(2021, 12, 24), Ende = new DateTime(2022, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2022", Start = new DateTime(2022, 4, 11), Ende = new DateTime(2022, 4, 23) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2022", Start = new DateTime(2022, 6, 27), Ende = new DateTime(2022, 8, 9) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2022", Start = new DateTime(2022, 10, 4), Ende = new DateTime(2022, 10, 15) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2022", Start = new DateTime(2022, 12, 23), Ende = new DateTime(2023, 1, 7) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2023", Start = new DateTime(2023, 4, 3), Ende = new DateTime(2023, 4, 15) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2023", Start = new DateTime(2023, 6, 22), Ende = new DateTime(2023, 8, 5) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2023", Start = new DateTime(2023, 10, 2), Ende = new DateTime(2023, 10, 14) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2023", Start = new DateTime(2023, 12, 21), Ende = new DateTime(2024, 1, 5) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2024", Start = new DateTime(2024, 3, 25), Ende = new DateTime(2024, 4, 6) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2024", Start = new DateTime(2024, 5, 21), Ende = new DateTime(2024, 5, 21) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2024", Start = new DateTime(2024, 7, 8), Ende = new DateTime(2024, 8, 20) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2024", Start = new DateTime(2024, 10, 14), Ende = new DateTime(2024, 10, 26) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2024", Start = new DateTime(2024, 12, 23), Ende = new DateTime(2025, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2025", Start = new DateTime(2025, 4, 14), Ende = new DateTime(2025, 4, 26) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2025", Start = new DateTime(2025, 6, 10), Ende = new DateTime(2025, 6, 10) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2025", Start = new DateTime(2025, 7, 14), Ende = new DateTime(2025, 8, 26) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2025", Start = new DateTime(2025, 10, 13), Ende = new DateTime(2025, 10, 25) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2025", Start = new DateTime(2025, 12, 22), Ende = new DateTime(2026, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2026", Start = new DateTime(2026, 3, 30), Ende = new DateTime(2026, 4, 11) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2026", Start = new DateTime(2026, 5, 26), Ende = new DateTime(2026, 5, 26) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2026", Start = new DateTime(2026, 7, 20), Ende = new DateTime(2026, 9, 1) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2026", Start = new DateTime(2026, 10, 17), Ende = new DateTime(2026, 10, 31) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2026", Start = new DateTime(2026, 12, 23), Ende = new DateTime(2027, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2027", Start = new DateTime(2027, 3, 22), Ende = new DateTime(2027, 4, 3) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2027", Start = new DateTime(2027, 5, 18), Ende = new DateTime(2027, 5, 18) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2027", Start = new DateTime(2027, 7, 19), Ende = new DateTime(2027, 8, 31) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2027", Start = new DateTime(2027, 10, 23), Ende = new DateTime(2027, 11, 6) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2027", Start = new DateTime(2027, 12, 24), Ende = new DateTime(2028, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2028", Start = new DateTime(2028, 4, 10), Ende = new DateTime(2028, 4, 22) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2028", Start = new DateTime(2028, 7, 10), Ende = new DateTime(2028, 8, 22) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2028", Start = new DateTime(2028, 10, 23), Ende = new DateTime(2028, 11, 4) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2028", Start = new DateTime(2028, 12, 21), Ende = new DateTime(2029, 1, 5) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2029", Start = new DateTime(2029, 3, 26), Ende = new DateTime(2029, 4, 7) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2029", Start = new DateTime(2029, 5, 22), Ende = new DateTime(2029, 5, 22) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2029", Start = new DateTime(2029, 7, 2), Ende = new DateTime(2029, 8, 14) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2029", Start = new DateTime(2029, 10, 15), Ende = new DateTime(2029, 10, 27) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2029", Start = new DateTime(2029, 12, 20), Ende = new DateTime(2030, 1, 4) });
|
||
}
|
||
else if (bundesland.ToLower() == "niedersachsen")
|
||
{
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2020", Start = new DateTime(2020, 12, 21), Ende = new DateTime(2021, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2021", Start = new DateTime(2021, 3, 29), Ende = new DateTime(2021, 4, 09) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2021", Start = new DateTime(2021, 7, 22), Ende = new DateTime(2021, 9, 1) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2021", Start = new DateTime(2021, 10, 18), Ende = new DateTime(2021, 10, 29) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2021", Start = new DateTime(2021, 12, 23), Ende = new DateTime(2022, 1, 7) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2022", Start = new DateTime(2022, 1, 31), Ende = new DateTime(2022, 2, 1) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2022", Start = new DateTime(2022, 4, 4), Ende = new DateTime(2022, 4, 19) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2022", Start = new DateTime(2022, 5, 27), Ende = new DateTime(2022, 5, 27) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2022", Start = new DateTime(2022, 6, 7), Ende = new DateTime(2022, 6, 7) }); //Pfingstdienstag
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2022", Start = new DateTime(2022, 7, 14), Ende = new DateTime(2022, 8, 24) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2022", Start = new DateTime(2022, 10, 17), Ende = new DateTime(2022, 10, 28) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2022", Start = new DateTime(2022, 12, 23), Ende = new DateTime(2023, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2023", Start = new DateTime(2023, 1, 30), Ende = new DateTime(2023, 1, 31) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2023", Start = new DateTime(2023, 3, 27), Ende = new DateTime(2023, 4, 11) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2023", Start = new DateTime(2023, 5, 19), Ende = new DateTime(2023, 5, 19) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2023", Start = new DateTime(2023, 5, 30), Ende = new DateTime(2023, 5, 31) }); //Pfingstdienstag
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2023", Start = new DateTime(2023, 7, 6), Ende = new DateTime(2023, 8, 17) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2023", Start = new DateTime(2023, 10, 2), Ende = new DateTime(2023, 10, 3) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2023", Start = new DateTime(2023, 10, 16), Ende = new DateTime(2023, 10, 31) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2023", Start = new DateTime(2023, 12, 27), Ende = new DateTime(2024, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2024", Start = new DateTime(2024, 2, 1), Ende = new DateTime(2024, 2, 3) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2024", Start = new DateTime(2024, 3, 18), Ende = new DateTime(2024, 3, 29) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2024", Start = new DateTime(2024, 5, 10), Ende = new DateTime(2024, 5, 10) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2024", Start = new DateTime(2024, 5, 21), Ende = new DateTime(2024, 5, 21) }); //Pfingstdienstag
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2024", Start = new DateTime(2024, 6, 24), Ende = new DateTime(2024, 8, 3) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2024", Start = new DateTime(2024, 10, 4), Ende = new DateTime(2024, 10, 19) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2024", Start = new DateTime(2024, 11, 1), Ende = new DateTime(2024, 11, 1) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2024", Start = new DateTime(2024, 12, 23), Ende = new DateTime(2025, 1, 4) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2025", Start = new DateTime(2025, 2, 3), Ende = new DateTime(2025, 2, 4) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2025", Start = new DateTime(2025, 4, 7), Ende = new DateTime(2025, 4, 19) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2025", Start = new DateTime(2025, 4, 30), Ende = new DateTime(2025, 4, 30) }); //Brückentag 1.Mai
|
||
list.Add(new FerienDC() { Name = "Brückentag 2025", Start = new DateTime(2025, 5, 2), Ende = new DateTime(2025, 5, 2) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Brückentag 2025", Start = new DateTime(2025, 5, 30), Ende = new DateTime(2025, 5, 30) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2025", Start = new DateTime(2025, 6, 10), Ende = new DateTime(2025, 6, 10) }); //Pfingstdienstag
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2025", Start = new DateTime(2025, 7, 3), Ende = new DateTime(2025, 8, 13) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2025", Start = new DateTime(2025, 10, 13), Ende = new DateTime(2025, 10, 25) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2025", Start = new DateTime(2025, 12, 22), Ende = new DateTime(2026, 1, 5) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2026", Start = new DateTime(2026, 2, 2), Ende = new DateTime(2026, 2, 3) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2026", Start = new DateTime(2026, 3, 23), Ende = new DateTime(2026, 4, 7) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2026", Start = new DateTime(2026, 5, 15), Ende = new DateTime(2026, 5, 15) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Brückentag 2026", Start = new DateTime(2026, 5, 26), Ende = new DateTime(2026, 5, 26) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2026", Start = new DateTime(2026, 7, 2), Ende = new DateTime(2026, 8, 12) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2026", Start = new DateTime(2026, 10, 12), Ende = new DateTime(2026, 10, 24) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2026", Start = new DateTime(2026, 12, 23), Ende = new DateTime(2027, 1, 9) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2027", Start = new DateTime(2027, 2, 1), Ende = new DateTime(2027, 2, 2) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2027", Start = new DateTime(2027, 3, 22), Ende = new DateTime(2027, 4, 3) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2027", Start = new DateTime(2027, 5, 7), Ende = new DateTime(2027, 5, 7) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2027", Start = new DateTime(2027, 5, 18), Ende = new DateTime(2027, 5, 18) }); //Pfingstdienstag
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2027", Start = new DateTime(2027, 7, 8), Ende = new DateTime(2027, 8, 18) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2027", Start = new DateTime(2027, 10, 16), Ende = new DateTime(2027, 10, 30) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2027", Start = new DateTime(2027, 12, 23), Ende = new DateTime(2028, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2028", Start = new DateTime(2028, 1, 31), Ende = new DateTime(2028, 2, 1) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2028", Start = new DateTime(2028, 4, 10), Ende = new DateTime(2028, 4, 22) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2028", Start = new DateTime(2028, 5, 26), Ende = new DateTime(2028, 5, 26) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2028", Start = new DateTime(2028, 6, 6), Ende = new DateTime(2028, 6, 6) }); //Pfingstdienstag
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2028", Start = new DateTime(2028, 7, 20), Ende = new DateTime(2028, 8, 30) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2028", Start = new DateTime(2028, 10, 2), Ende = new DateTime(2028, 10, 2) }); //Brückentag Tag der Deutschen Einheit
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2028", Start = new DateTime(2028, 10, 23), Ende = new DateTime(2028, 11, 4) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2028", Start = new DateTime(2028, 12, 27), Ende = new DateTime(2029, 1, 6) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2029", Start = new DateTime(2029, 2, 1), Ende = new DateTime(2029, 2, 2) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2029", Start = new DateTime(2029, 3, 19), Ende = new DateTime(2029, 4, 3) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2029", Start = new DateTime(2029, 4, 30), Ende = new DateTime(2029, 4, 30) }); //Brückentag 1.Mai
|
||
list.Add(new FerienDC() { Name = "Brückentag 2029", Start = new DateTime(2029, 5, 11), Ende = new DateTime(2029, 5, 11) }); //Brückentag Himmelfahrt
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2029", Start = new DateTime(2029, 5, 22), Ende = new DateTime(2029, 5, 22) }); //Pfingstdienstag
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2029", Start = new DateTime(2029, 7, 19), Ende = new DateTime(2029, 8, 29) });
|
||
list.Add(new FerienDC() { Name = "Brückentag 2029", Start = new DateTime(2029, 10, 4), Ende = new DateTime(2029, 10, 5) }); //Brückentage Tag der Deutschen Einheit
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2029", Start = new DateTime(2029, 10, 22), Ende = new DateTime(2029, 11, 2) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2029", Start = new DateTime(2029, 12, 21), Ende = new DateTime(2030, 1, 5) });
|
||
|
||
}
|
||
|
||
else if (bundesland.ToLower() == "hessen")
|
||
{
|
||
list.Add(new FerienDC() { Name = "Osterferien 2021", Start = new DateTime(2021, 4, 6), Ende = new DateTime(2021, 4, 16) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2021", Start = new DateTime(2021, 7, 19), Ende = new DateTime(2021, 8, 27) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2021", Start = new DateTime(2021, 10, 11), Ende = new DateTime(2021, 10, 23) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2021", Start = new DateTime(2021, 12, 23), Ende = new DateTime(2022, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2022", Start = new DateTime(2022, 4, 11), Ende = new DateTime(2022, 4, 23) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2022", Start = new DateTime(2022, 7, 25), Ende = new DateTime(2022, 9, 2) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2022", Start = new DateTime(2022, 10, 24), Ende = new DateTime(2022, 10, 29) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2022", Start = new DateTime(2022, 12, 22), Ende = new DateTime(2023, 1, 7) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2023", Start = new DateTime(2023, 4, 3), Ende = new DateTime(2023, 4, 22) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2023", Start = new DateTime(2023, 7, 24), Ende = new DateTime(2023, 9, 1) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2023", Start = new DateTime(2023, 10, 23), Ende = new DateTime(2023, 10, 28) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2023", Start = new DateTime(2023, 12, 27), Ende = new DateTime(2024, 1, 13) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2024", Start = new DateTime(2024, 3, 25), Ende = new DateTime(2024, 4, 13) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2024", Start = new DateTime(2024, 7, 15), Ende = new DateTime(2024, 8, 23) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2024", Start = new DateTime(2024, 10, 14), Ende = new DateTime(2024, 10, 25) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2024", Start = new DateTime(2024, 12, 23), Ende = new DateTime(2025, 1, 10) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2025", Start = new DateTime(2025, 4, 7), Ende = new DateTime(2025, 4, 21) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2025", Start = new DateTime(2025, 7, 7), Ende = new DateTime(2025, 8, 15) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2025", Start = new DateTime(2025, 10, 6), Ende = new DateTime(2025, 10, 18) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2025", Start = new DateTime(2025, 12, 22), Ende = new DateTime(2026, 1, 10) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2026", Start = new DateTime(2026, 3, 30), Ende = new DateTime(2026, 4, 10) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2026", Start = new DateTime(2026, 6, 29), Ende = new DateTime(2026, 8, 7) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2026", Start = new DateTime(2026, 10, 5), Ende = new DateTime(2026, 10, 17) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2026", Start = new DateTime(2026, 12, 23), Ende = new DateTime(2027, 1, 12) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2027", Start = new DateTime(2027, 3, 22), Ende = new DateTime(2027, 4, 2) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2027", Start = new DateTime(2027, 6, 28), Ende = new DateTime(2027, 8, 6) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2027", Start = new DateTime(2027, 10, 4), Ende = new DateTime(2027, 10, 16) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2027", Start = new DateTime(2027, 12, 23), Ende = new DateTime(2028, 1, 11) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2028", Start = new DateTime(2028, 4, 3), Ende = new DateTime(2028, 4, 14) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2028", Start = new DateTime(2028, 7, 3), Ende = new DateTime(2028, 8, 11) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2028", Start = new DateTime(2028, 10, 9), Ende = new DateTime(2028, 10, 20) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2028", Start = new DateTime(2028, 12, 27), Ende = new DateTime(2029, 1, 12) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2029", Start = new DateTime(2029, 3, 29), Ende = new DateTime(2029, 4, 13) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2029", Start = new DateTime(2029, 7, 16), Ende = new DateTime(2029, 8, 24) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2029", Start = new DateTime(2029, 10, 15), Ende = new DateTime(2029, 10, 26) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2029", Start = new DateTime(2029, 12, 24), Ende = new DateTime(2030, 1, 11) });
|
||
}
|
||
else if (bundesland.ToLower() == "rheinland-pfalz")
|
||
{
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2023", Start = new DateTime(2023, 12, 27), Ende = new DateTime(2024, 1, 5) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2024", Start = new DateTime(2024, 3, 25), Ende = new DateTime(2024, 4, 2) });
|
||
list.Add(new FerienDC() { Name = "Pfingstferien 2024", Start = new DateTime(2024, 5, 21), Ende = new DateTime(2024, 5, 29) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2024", Start = new DateTime(2024, 7, 15), Ende = new DateTime(2024, 8, 23) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2024", Start = new DateTime(2024, 10, 14), Ende = new DateTime(2024, 10, 25) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2024", Start = new DateTime(2024, 12, 23), Ende = new DateTime(2025, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2025", Start = new DateTime(2025, 4, 14), Ende = new DateTime(2025, 4, 25) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2025", Start = new DateTime(2025, 7, 7), Ende = new DateTime(2025, 8, 15) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2025", Start = new DateTime(2025, 10, 13), Ende = new DateTime(2025, 10, 24) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2025", Start = new DateTime(2025, 12, 22), Ende = new DateTime(2026, 1, 7) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2026", Start = new DateTime(2026, 3, 30), Ende = new DateTime(2026, 4, 10) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2026", Start = new DateTime(2026, 6, 29), Ende = new DateTime(2026, 8, 7) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2026", Start = new DateTime(2026, 10, 5), Ende = new DateTime(2026, 10, 16) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2026", Start = new DateTime(2026, 12, 23), Ende = new DateTime(2027, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2027", Start = new DateTime(2027, 3, 22), Ende = new DateTime(2027, 4, 2) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2027", Start = new DateTime(2027, 6, 28), Ende = new DateTime(2027, 8, 6) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2027", Start = new DateTime(2027, 10, 4), Ende = new DateTime(2027, 10, 15) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2027", Start = new DateTime(2027, 12, 23), Ende = new DateTime(2028, 1, 7) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2028", Start = new DateTime(2028, 4, 10), Ende = new DateTime(2028, 4, 21) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2028", Start = new DateTime(2028, 7, 3), Ende = new DateTime(2028, 8, 11) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2028", Start = new DateTime(2028, 10, 9), Ende = new DateTime(2028, 10, 20) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2028", Start = new DateTime(2028, 12, 21), Ende = new DateTime(2029, 1, 8) });
|
||
|
||
list.Add(new FerienDC() { Name = "Osterferien 2029", Start = new DateTime(2029, 3, 26), Ende = new DateTime(2029, 4, 6) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2029", Start = new DateTime(2029, 7, 16), Ende = new DateTime(2029, 8, 24) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2029", Start = new DateTime(2029, 10, 22), Ende = new DateTime(2029, 11, 2) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2029", Start = new DateTime(2029, 12, 24), Ende = new DateTime(2030, 1, 9) });
|
||
}
|
||
else if (bundesland.ToLower() == "brandenburg")
|
||
{
|
||
list.Add(new FerienDC() { Name = "Winterferien 2025", Start = new DateTime(2025, 2, 3), Ende = new DateTime(2025, 2, 8) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2025", Start = new DateTime(2025, 4, 14), Ende = new DateTime(2025, 4, 25) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2025", Start = new DateTime(2025, 7, 24), Ende = new DateTime(2025, 9, 6) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2025", Start = new DateTime(2025, 10, 20), Ende = new DateTime(2025, 11, 1) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2025", Start = new DateTime(2025, 12, 22), Ende = new DateTime(2026, 1, 2) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2026", Start = new DateTime(2026, 2, 2), Ende = new DateTime(2026, 2, 7) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2026", Start = new DateTime(2026, 3, 30), Ende = new DateTime(2026, 4, 10) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2026", Start = new DateTime(2026, 7, 9), Ende = new DateTime(2026, 8, 22) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2026", Start = new DateTime(2026, 10, 19), Ende = new DateTime(2026, 10, 30) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2026", Start = new DateTime(2026, 12, 23), Ende = new DateTime(2027, 1, 2) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2027", Start = new DateTime(2027, 2, 1), Ende = new DateTime(2027, 2, 6) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2027", Start = new DateTime(2027, 3, 22), Ende = new DateTime(2027, 4, 3) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2027", Start = new DateTime(2027, 7, 1), Ende = new DateTime(2027, 8, 14) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2027", Start = new DateTime(2027, 10, 11), Ende = new DateTime(2027, 10, 23) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2027", Start = new DateTime(2027, 12, 23), Ende = new DateTime(2027, 12, 31) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2028", Start = new DateTime(2028, 1, 31), Ende = new DateTime(2028, 2, 5) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2028", Start = new DateTime(2028, 4, 10), Ende = new DateTime(2028, 4, 22) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2028", Start = new DateTime(2028, 6, 29), Ende = new DateTime(2028, 8, 12) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2028", Start = new DateTime(2028, 10, 2), Ende = new DateTime(2028, 10, 14) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2028", Start = new DateTime(2028, 12, 22), Ende = new DateTime(2029, 1, 2) });
|
||
|
||
list.Add(new FerienDC() { Name = "Winterferien 2029", Start = new DateTime(2029, 1, 29), Ende = new DateTime(2029, 2, 3) });
|
||
list.Add(new FerienDC() { Name = "Osterferien 2029", Start = new DateTime(2029, 3, 26), Ende = new DateTime(2029, 4, 6) });
|
||
list.Add(new FerienDC() { Name = "Sommerferien 2029", Start = new DateTime(2029, 6, 28), Ende = new DateTime(2029, 8, 11) });
|
||
list.Add(new FerienDC() { Name = "Herbstferien 2029", Start = new DateTime(2029, 10, 1), Ende = new DateTime(2029, 10, 12) });
|
||
list.Add(new FerienDC() { Name = "Weihnachtsferien 2029", Start = new DateTime(2029, 12, 21), Ende = new DateTime(2030, 1, 4) });
|
||
}
|
||
return list;
|
||
}
|
||
|
||
|
||
|
||
private void SetLokaleFeiertagListe(int year)
|
||
{
|
||
_Feiertage = GetFeiertage(year);
|
||
}
|
||
|
||
public virtual List<AbsenceTimeDC> GetAllVacationAbsences(IList<AbsenceTimeDC> absenceTimes, int year, bool inklEndeEinerAbsenceTime)
|
||
{
|
||
var absReason = GetVacationReasonIDs();
|
||
|
||
return GetAllAbsencesWithReasonOid(absenceTimes, absReason, year, inklEndeEinerAbsenceTime);
|
||
}
|
||
public virtual List<AbsenceTimeDC> GetAllSickAbsences(IList<AbsenceTimeDC> absenceTimes, int year, bool inklEndeEinerAbsenceTime)
|
||
{
|
||
var absReason = GetSickReasonIDs();
|
||
|
||
return GetAllAbsencesWithReasonOid(absenceTimes, absReason, year, inklEndeEinerAbsenceTime);
|
||
}
|
||
|
||
public virtual List<AbsenceTimeDC> GetAllAbsencesWithReasonOid(IList<AbsenceTimeDC> absenceTimes, IList<long> reasonOids, int year, bool inklEndeEinerAbsenceTime)
|
||
{
|
||
if (inklEndeEinerAbsenceTime)
|
||
{
|
||
return absenceTimes.Where(x => reasonOids.Contains(x.Reason.AbsenceReasonOid.Value) && (x.Start.HasValue && x.Start.Value.Year == year)
|
||
|| reasonOids.Contains(x.Reason.AbsenceReasonOid.Value) && (x.End.HasValue && x.End.Value.Year == year))
|
||
.OrderBy(x => x.Start).ToList();
|
||
}
|
||
return absenceTimes.Where(x => reasonOids.Contains(x.Reason.AbsenceReasonOid.Value) &&
|
||
(x.Start.HasValue && x.Start.Value.Year <= year))
|
||
.OrderBy(x => x.Start).ToList();
|
||
}
|
||
|
||
public virtual List<long> GetVacationReasonIDs()
|
||
{
|
||
var res = new List<long>();
|
||
var filters = new List<string> { "URLAUB" };
|
||
var reasons = AllAbsenceReasons;
|
||
|
||
foreach (var reason in reasons)
|
||
{
|
||
var desc = reason.Description.ToUpper();
|
||
|
||
foreach (var filter in filters)
|
||
{
|
||
if (desc.Contains(filter))
|
||
{
|
||
res.Add(reason.Oid.Value);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return res;
|
||
}
|
||
public virtual List<long> GetSickReasonIDs()
|
||
{
|
||
var res = new List<long>();
|
||
var filters = new List<string> { "KRANK" };
|
||
var reasons = AllAbsenceReasons;
|
||
|
||
foreach (var reason in reasons)
|
||
{
|
||
var desc = reason.Description.ToUpper();
|
||
|
||
foreach (var filter in filters)
|
||
{
|
||
if (desc.Contains(filter))
|
||
{
|
||
res.Add(reason.Oid.Value);
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
return res;
|
||
}
|
||
|
||
|
||
public virtual DateTime GetExpirationDate(int year)
|
||
{
|
||
return new DateTime(year, 3, 31);
|
||
}
|
||
|
||
// Faktor bestimmt zu welchem Anteil der übergebene Tag als Feiertag gewertet wird. 1 = ganzer Feiertag, 0 = kein Feiertag.
|
||
// Kann verwendet werden um z.B. halbe Feiertage zu definieren. Dann kann in abgeleiteter Klasse 0.5 zurückgegeben werden
|
||
public virtual decimal GetFeiertagsFaktor(DateTime start)
|
||
{
|
||
if (IstFeiertag(start))
|
||
{
|
||
return 1;
|
||
}
|
||
return 0;
|
||
}
|
||
|
||
|
||
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////// URLAUBSKONTO WAS MAN SIEHT///////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
// ------INHALTSVERZEICHNIS------
|
||
// 1. Vetragliche Urlaubstage für´s Jahr
|
||
// 2. Abzuziehende Tage wegen Vertragsbeginn mitten im Jahr
|
||
// 3. Geschenkte Urlaubstage im Jahr
|
||
// 4. Verfallener Resturlaub
|
||
// 5. Alle Urlaube, die Anfang oder Ende im gewählten Jahr haben
|
||
// 6. Anzahl der aus 1.-5. resultierenden Resturlaubstage fürs Jahr, also Resturlaub vom Urlaubskonto
|
||
// 7. Liste der DCs nach Datum sortieren, um eine zeitliche Hierarchie zu schaffen
|
||
|
||
public virtual List<UrlaubskontoDarstellungDC> BerechneUrlaubskontoZurDarstellung(Employee emp, int year, DateTime? endeDerBerechnung = null)
|
||
{
|
||
Stopwatch stopwatch = Stopwatch.StartNew();
|
||
|
||
|
||
|
||
List<UrlaubskontoDarstellungDC> dcs = new List<UrlaubskontoDarstellungDC>();
|
||
//EmployeeServiceImp es = PluginLoader.FindClass<EmployeeServiceImp>();
|
||
|
||
// Urlaubskonto erstellen
|
||
//var ent = DAOFactory.GenericDAO.LoadByID<Employee>((long)emp.EmployeeOid);
|
||
var urlaubskonten = BerechneUrlaubskonto(emp, year);
|
||
var aktuellesKonto = urlaubskonten.First(u => u.Key == year);
|
||
|
||
var geschenkteUrlaubstage = GetGeschenkteUrlaubstageForEmployee(emp.Oid.Value);
|
||
decimal sonderurlaub = 0;
|
||
|
||
|
||
// Benötigt werden:
|
||
// 1. Vetragliche Urlaubstage für´s Jahr
|
||
List<Contract> contracts = new List<Contract>();
|
||
Dictionary<Contract, int> contractsAndWeeklyDays = new Dictionary<Contract, 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(year, 01, 01);
|
||
else
|
||
contractStartDate = c.EntryDate.Value;
|
||
|
||
if (year >= contractStartDate.Year && year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt
|
||
{
|
||
contracts.Add(c);
|
||
contractsAndWeeklyDays.Add(c, c.WeeklyDays ?? 5);
|
||
}
|
||
}
|
||
if (contracts.Count == 0) // Kein Vertrag = kein Urlaubskonto
|
||
return null;
|
||
|
||
|
||
// 2. Abzuziehende Tage wegen Vertragsbeginn mitten im Jahr
|
||
foreach (var contractAndWeeklyDays in contractsAndWeeklyDays)
|
||
{
|
||
var contract = contractAndWeeklyDays.Key;
|
||
#region Vielleicht bald unnötig
|
||
// Zahlen für Darstellung in View
|
||
decimal tageNachAbzug = 0;
|
||
decimal abzuziehendeTage = 0;
|
||
|
||
int arbeitstage = contract.WeeklyDays ?? 5; // Vertragliche Arbeitstage
|
||
DateTime? endDate = contract.ContractEndDate == null ? new DateTime(year, 12, 31) : contract.ContractEndDate; // Ende des Vertrags auf letzten Tag des Jahres setzen, wenn kein Ende
|
||
var leaveDays = contract.EmploymentType?.LeaveDays == null ? contract.LeaveDays : contract.EmploymentType.LeaveDays; // Vertragliche Urlaubstage
|
||
if (!leaveDays.HasValue)
|
||
{
|
||
leaveDays = 0;
|
||
}
|
||
if (contract.EntryDate.HasValue && (contract.EntryDate.Value.Year == year || endDate.Value.Year == year)) // Wenn Vertrag im gewählten Jahr beginnt oder endet
|
||
{
|
||
if (contract.EntryDate.Value.Year == year) // Wenn Vertrag im gewählten Jahr beginnt
|
||
{
|
||
if (endDate >= new DateTime(contract.EntryDate.Value.Year, 12, 31)) // Wenn Vertrag länger gilt als das gewählte Jahr
|
||
{
|
||
int restlicheTageImJahr = Convert.ToInt32((new DateTime(contract.EntryDate.Value.Year, 12, 31) - contract.EntryDate.Value.Date).TotalDays);
|
||
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, endDate, arbeitstage, restlicheTageImJahr, leaveDays);
|
||
}
|
||
else // Wenn Ende des Vertrags im gleichen Jahr vor Jahresende ist
|
||
{
|
||
int restlicheTageImJahr = Convert.ToInt32((contract.ContractEndDate.Value.Date - contract.EntryDate.Value.Date).TotalDays);
|
||
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, endDate, arbeitstage, restlicheTageImJahr, leaveDays);
|
||
}
|
||
}
|
||
else if (endDate.Value.Year == year) // Wenn Vertrag im gewählten Jahr endet
|
||
{
|
||
int restlicheTageImJahr = Convert.ToInt32(((DateTime)endDate - new DateTime(year, 1, 1)).TotalDays);
|
||
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, endDate, arbeitstage, restlicheTageImJahr, leaveDays);
|
||
}
|
||
// Abzuziehende Tage = Vertragliche Urlaubstage - Tage, die nach Abzug der verfallenden Tage übrig bleiben
|
||
abzuziehendeTage = (decimal)leaveDays - tageNachAbzug;
|
||
}
|
||
#endregion
|
||
if (contract == null || contract != null && !contract.EntryDate.HasValue)
|
||
{
|
||
continue;
|
||
}
|
||
var contractStart = contract.EntryDate.Value.ToString().Split(' ');
|
||
var contractEnd = contract.ContractEndDate != null ? contract.ContractEndDate.Value.ToString().Split(' ') : null;
|
||
|
||
var anzahlTage = leaveDays - abzuziehendeTage;
|
||
|
||
var obereZeile = new UrlaubskontoDarstellungDC()
|
||
{
|
||
AnzahlTage = string.Format("{0:0.00}", anzahlTage),
|
||
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.Oid, contract.Oid),
|
||
Tooltip = null,
|
||
IsDeletable = false,
|
||
DatumZurSortierung = null
|
||
};
|
||
obereZeile.Erlaeuterung = contractEnd == null ? "Urlaubstage laut Vertrag vom " + contractStart[0] + ":" : "Urlaubstage laut Vertrag vom " + contractStart[0] + " bis " + contractEnd[0] + ":";
|
||
dcs.Add(obereZeile);
|
||
|
||
// Standardmäßig Sonderurlaub bei Schwerbehinderung, aber modifizierbar
|
||
List<UrlaubskontoDarstellungDC> sonderurlaubItems = CreateSonderurlaubItems(emp, contract, GetSonderurlaubForEmployee(emp, year), dcs);
|
||
//List<UrlaubskontoDarstellungDC> sonderurlaubItems = AddSonderurlaub(emp, contract, year);
|
||
if (sonderurlaubItems.Count > 0 && !dcs.Any(d => d.Erlaeuterung == "Sonderurlaub aufgrund von Behinderungsgrad über 50"))
|
||
{
|
||
dcs.AddRange(sonderurlaubItems);
|
||
sonderurlaub += sonderurlaubItems.Sum(s => Convert.ToDecimal(s.AnzahlTage));
|
||
}
|
||
|
||
#region Würde Code von 2. sparen, klappt aber leider nur dann, wenn es nicht mehr als einen Vertrag im Jahr gibt
|
||
//decimal anzGeschenkteTage = 0.0m;
|
||
//if (geschenkteUrlaubstage != null)
|
||
//{
|
||
// foreach (var item in geschenkteUrlaubstage)
|
||
// {
|
||
// if (item.Date.Year == year)
|
||
// anzGeschenkteTage += item.AnzahlTage;
|
||
// }
|
||
//}
|
||
//var testvar = aktuellesKonto.Value.Urlaubsanspruch - anzGeschenkteTage;
|
||
//var obereZeile = new UrlaubskontoDarstellungDC()
|
||
//{
|
||
// AnzahlTage = testvar,
|
||
// Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.EmployeeOid, contract.ContractOid),
|
||
// Tooltip = null,
|
||
// IsDeletable = false,
|
||
// DatumZurSortierung = null
|
||
//};
|
||
//obereZeile.Erlaeuterung = contractEnd == null ? "Urlaubstage laut Vertrag vom " + contractStart[0] + ":" : "Urlaubstage laut Vertrag vom " + contractStart[0] + " bis " + contractEnd[0] + ":";
|
||
//dcs.Add(obereZeile);
|
||
#endregion
|
||
}
|
||
|
||
// 3. Geschenkte Urlaubstage im Jahr
|
||
if (geschenkteUrlaubstage.Count > 0 && geschenkteUrlaubstage.Any(g => g.Date.Year == year))
|
||
{
|
||
// Einen Eintrag pro geschenktem Urlaubstag
|
||
foreach (var eintrag in geschenkteUrlaubstage)
|
||
{
|
||
if (eintrag.Date.Year == year)
|
||
{
|
||
var tempDate = eintrag.Date.ToString().Split(' ');
|
||
dcs.Add(new UrlaubskontoDarstellungDC()
|
||
{
|
||
Erlaeuterung = string.Format("Tage geschenkt am {0} von {1} ({2})", tempDate[0], eintrag.InsUser, eintrag.Notice),
|
||
AnzahlTage = eintrag.AnzahlTage > 0 ? string.Format("+{0:0.00}", eintrag.AnzahlTage) : string.Format("{0:0.00}", eintrag.AnzahlTage),
|
||
Herkunft = string.Format("GeschenkterUrlaubstagOid:{0}", eintrag.Oid),
|
||
Tooltip = eintrag.Notice,
|
||
IsDeletable = true,
|
||
DatumZurSortierung = eintrag.Date
|
||
});
|
||
}
|
||
}
|
||
}
|
||
|
||
// 4. Verfallener Resturlaub
|
||
// Verfallsdatum der Urlaubstage des letzten Jahres zur Darstellung (also ohne Uhrzeit)
|
||
|
||
|
||
// Resturlaub und den verbleibenden Resturlaub nach Verfall erstellen
|
||
if (aktuellesKonto.Value.ResturlaubVorjahrTotal > 0) // Wenn Urlaub aus dem Vorjahr mitgenommen wurde
|
||
{
|
||
dcs.Add(new UrlaubskontoDarstellungDC()
|
||
{
|
||
Erlaeuterung = "Resturlaub aus " + (year - 1) + " :",
|
||
AnzahlTage = string.Format("+{0:0.00}", aktuellesKonto.Value.ResturlaubVorjahrTotal),
|
||
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.Oid, year),
|
||
Tooltip = null,
|
||
IsDeletable = false
|
||
});
|
||
}
|
||
else if (urlaubskonten.ContainsKey(year - 1) && urlaubskonten[year - 1].Resturlaub > 0)
|
||
{
|
||
var vorherigesKonto = urlaubskonten[year - 1];
|
||
aktuellesKonto.Value.ResturlaubVorjahrTotal += vorherigesKonto.Resturlaub;
|
||
aktuellesKonto.Value.ResturlaubVorjahr += vorherigesKonto.Resturlaub;
|
||
|
||
dcs.Add(new UrlaubskontoDarstellungDC()
|
||
{
|
||
Erlaeuterung = "Resturlaub aus " + (year - 1) + " :",
|
||
AnzahlTage = string.Format("+{0:0.00}", aktuellesKonto.Value.ResturlaubVorjahrTotal),
|
||
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.Oid, year),
|
||
Tooltip = null,
|
||
IsDeletable = false
|
||
});
|
||
}
|
||
var expDate = GetExpirationDate(year);
|
||
if (expDate != null)
|
||
{
|
||
var expDateString = GetExpirationDate(year).ToString().Split(' ');
|
||
|
||
if (aktuellesKonto.Value.VerfallenerUrlaub > 0) // Wenn Urlaubstage verfallen sind
|
||
{
|
||
dcs.Add(new UrlaubskontoDarstellungDC()
|
||
{
|
||
Erlaeuterung = string.Format("Urlaub am {0} verfallen: ", expDateString[0]),
|
||
AnzahlTage = string.Format("-{0:0.00}", aktuellesKonto.Value.VerfallenerUrlaub),
|
||
DatumZurSortierung = GetExpirationDate(year),
|
||
Tooltip = null,
|
||
IsDeletable = false
|
||
});
|
||
}
|
||
}
|
||
|
||
var absDcs = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDCs(emp.AbsenceTimes);
|
||
|
||
// 5. Alle Urlaube, die Anfang oder Ende im gewählten Jahr haben
|
||
var absences = GetAllVacationAbsences(absDcs, year, true); // Abwesenheiten nur auf Urlaube filtern
|
||
|
||
if (absences.Count > 0) // Wenn es Urlaube in dem Jahr gibt
|
||
{
|
||
// Urlaube durchgehen und die Tage zählen
|
||
foreach (var spanne in absences)
|
||
{
|
||
// Im Stundenkonto wird auch Resturlaub angezeigt. Geht eine Abwesenheit über das Ende des Stundenkontomonats hinaus,
|
||
// Abwesenheit auf endeDerBerechnung setzen, damit Urlaubstage vom nachfolgenden Monat nicht zu früh abgezogen werden
|
||
if (endeDerBerechnung.HasValue && spanne.End.HasValue && spanne.End.Value > endeDerBerechnung.Value)
|
||
spanne.End = endeDerBerechnung;
|
||
if (spanne.End.HasValue && spanne.End.Value.Year > year)
|
||
spanne.End = new DateTime(year, 12, 31);
|
||
if (spanne.Start.HasValue && spanne.Start.Value.Year < year)
|
||
spanne.Start = new DateTime(year, 01, 01);
|
||
|
||
decimal summeTage = 0;
|
||
|
||
#region Urlaubstage zählen
|
||
summeTage = CountAbwesenheitstage(emp, spanne, year, contractsAndWeeklyDays);
|
||
|
||
#endregion
|
||
|
||
// Start- und Enddatum des Urlaubs für Darstellung vorbereiten
|
||
var startAsArray = spanne.Start.Value.ToString().Split(' ');
|
||
var endAsArray = spanne.End.Value.ToString().Split(' ');
|
||
// Eintrag für Urlaubstag setzen (Erläuterung abhängig davon, ob Urlaub nur ein Tag geht oder über mehrere
|
||
dcs.Add(new UrlaubskontoDarstellungDC()
|
||
{
|
||
Erlaeuterung = startAsArray[0] == endAsArray[0] ? string.Format("Urlaub genommen am {0}", startAsArray[0]) :
|
||
string.Format("Urlaub genommen vom {0} bis {1}", startAsArray[0], endAsArray[0]),
|
||
AnzahlTage = string.Format("-{0:0.00}", summeTage),
|
||
AnzahlTageUrlaub = summeTage,
|
||
Herkunft = string.Format("AbsenceOid: {0}", spanne.AbsenceTimeOid),
|
||
Tooltip = spanne.Notice,
|
||
IsDeletable = false,
|
||
DatumZurSortierung = spanne.Start.Value
|
||
});
|
||
}
|
||
}
|
||
|
||
// 6. Anzahl der aus 1.-5. resultierenden Resturlaubstage fürs Jahr, also Resturlaub vom Urlaubskonto
|
||
var anzTage = aktuellesKonto.Value.ResturlaubVorjahrTotal > 0 && aktuellesKonto.Value.VerfallenerUrlaub <= 0 ? aktuellesKonto.Value.Resturlaub + aktuellesKonto.Value.ResturlaubVorjahr : aktuellesKonto.Value.Resturlaub;
|
||
dcs.Add(new UrlaubskontoDarstellungDC()
|
||
{
|
||
AnzahlTage = string.Format("{0:0.00}", anzTage),
|
||
Erlaeuterung = "Summe der verbleibenden Urlaubstage: ",
|
||
Herkunft = "UrlaubskontoEmpOid" + aktuellesKonto.Value.EmployeeOid,
|
||
Tooltip = null,
|
||
IsDeletable = false,
|
||
DatumZurSortierung = new DateTime(2999, 12, 31)
|
||
});
|
||
|
||
// 7. Liste der DCs nach Datum sortieren, um eine zeitliche Hierarchie zu schaffen
|
||
var sortierteDCs = dcs.OrderBy(dc => dc.DatumZurSortierung).ToList();
|
||
|
||
|
||
stopwatch.Stop();
|
||
|
||
Console.WriteLine($"Laufzeit: {stopwatch.ElapsedMilliseconds} ms");
|
||
Console.WriteLine($"Laufzeit: {stopwatch.Elapsed}");
|
||
|
||
return sortierteDCs;
|
||
}
|
||
|
||
|
||
|
||
public virtual List<UrlaubskontoDarstellungDC> CreateSonderurlaubItems(Employee emp, Contract contract, Dictionary<string, decimal> sonderurlaubDict, List<UrlaubskontoDarstellungDC> darstellungList)
|
||
{
|
||
List<UrlaubskontoDarstellungDC> sonderurlaubItems = new List<UrlaubskontoDarstellungDC>();
|
||
|
||
// Standardmäßig ist nur ein Eintrag drin, nämlich Sonderurlaub bei Schwerbeinderung (5 Tage), kann aber ergänzt werden (hier oder EmployeeServiceImp)
|
||
foreach (var item in sonderurlaubDict)
|
||
{
|
||
var sonderurlaub = new UrlaubskontoDarstellungDC()
|
||
{
|
||
AnzahlTage = string.Format("{0:0.00}", item.Value), // Standardmäßig 5 Tage
|
||
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.Oid, contract.Oid),
|
||
Tooltip = "",
|
||
IsDeletable = false,
|
||
DatumZurSortierung = null,
|
||
Erlaeuterung = item.Key
|
||
};
|
||
sonderurlaubItems.Add(sonderurlaub);
|
||
}
|
||
|
||
return sonderurlaubItems;
|
||
}
|
||
|
||
public virtual List<UrlaubskontoDarstellungDC> AddSonderurlaub(EmployeeDC emp, ContractDC contract, int year)
|
||
{
|
||
List<UrlaubskontoDarstellungDC> sonderurlaub = new List<UrlaubskontoDarstellungDC>();
|
||
|
||
// Wenn eine Behinderung von mind. 50 vorliegt stehen standardmäßig 5 Sonderurlaubstage zu
|
||
if (emp.AusweisGueltigVon.HasValue && emp.AusweisGueltigVon.Value.Year >= contract.EntryDate.Value.Year && emp.AusweisGueltigVon.Value.Year <= emp.AusweisGueltigVon.Value.Year ||
|
||
emp.AusweisGueltigBis.HasValue && emp.AusweisGueltigBis.Value.Year >= contract.EntryDate.Value.Year && emp.AusweisGueltigBis.Value.Year <= emp.AusweisGueltigBis.Value.Year)
|
||
{
|
||
if (emp.GradDerBehinderung.IsNotNullOrEmpty())
|
||
{
|
||
int.TryParse(emp.GradDerBehinderung, out int grad);
|
||
if (grad >= 50)
|
||
{
|
||
var sonderurlaubBeiSchwerbehinderung = new UrlaubskontoDarstellungDC()
|
||
{
|
||
AnzahlTage = string.Format("{0:0.00}", 5), // Standardmäßig 5 Tage
|
||
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.EmployeeOid, contract.ContractOid),
|
||
Tooltip = "Sonderurlaub durch Grad der Behinderung über 50 (" + emp.GradDerBehinderung + ")",
|
||
IsDeletable = false,
|
||
DatumZurSortierung = null,
|
||
Erlaeuterung = "Sonderurlaub durch Schwerbehinderung"
|
||
};
|
||
sonderurlaub.Add(sonderurlaubBeiSchwerbehinderung);
|
||
}
|
||
}
|
||
}
|
||
|
||
return sonderurlaub;
|
||
}
|
||
|
||
public decimal CountAbwesenheitstage(Employee emp, AbsenceTimeDC spanne, int year, Dictionary<Contract, int> contractsAndWeeklyDays)
|
||
{
|
||
decimal summeTage = 0;
|
||
if (emp.Arbeitszeiten != null && emp.Arbeitszeiten.Count > 0)
|
||
{
|
||
foreach (var az in emp.Arbeitszeiten)
|
||
{
|
||
if (az.GueltigVon.HasValue)
|
||
{
|
||
var azEnde = !az.GueltigBis.HasValue ? new DateTime(year, 12, 31) : az.GueltigBis.Value;
|
||
if (new DateTimeSpan(az.GueltigVon.Value, azEnde).ContainsDate(spanne.AbsenceSpan.StartDate) && az.ArbeitszeitEintraege != null && az.ArbeitszeitEintraege.Count > 0)
|
||
{
|
||
summeTage = CountAbwesenheitstageArbeitszeiten(spanne, year, az);
|
||
break;
|
||
}
|
||
else
|
||
summeTage = CountAbwesenheistageStandard(spanne, year, contractsAndWeeklyDays);
|
||
}
|
||
else
|
||
summeTage = CountAbwesenheistageStandard(spanne, year, contractsAndWeeklyDays);
|
||
}
|
||
}
|
||
else
|
||
summeTage = CountAbwesenheistageStandard(spanne, year, contractsAndWeeklyDays);
|
||
|
||
return summeTage;
|
||
}
|
||
public decimal CountAbwesenheistageStandard(AbsenceTimeDC spanne, int year, Dictionary<Contract, int> contractsAndWeeklyDays)
|
||
{
|
||
var summeTage = 0m;
|
||
if (spanne.End == null) // Wenn es kein Ende gibt, Ende auf letzten Tag im Jahr setzen
|
||
spanne.End = new DateTime(year, 12, 31);
|
||
|
||
if (spanne.Start.Value.Date == spanne.End.Value.Date && spanne.Start.Value.TimeOfDay == spanne.End.Value.TimeOfDay) // ein ganzer Tag Urlaub
|
||
{
|
||
var ff = GetFeiertagsFaktor(spanne.Start.Value);
|
||
summeTage += (1 - ff);
|
||
}
|
||
else if (spanne.Start.Value.Date == spanne.End.Value.Date && spanne.Start.Value.TimeOfDay != spanne.End.Value.TimeOfDay) // ein halber Tag Urlaub
|
||
summeTage += 0.5m;
|
||
else // Mehr als ein Tag Urlaub
|
||
{
|
||
DateTime startForLoop = (spanne.Start.Value.Year == year) ? spanne.Start.Value : new DateTime(year, 1, 1);
|
||
|
||
// 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
|
||
|
||
#region neu
|
||
// Variable wird für jeden Tag hochgezählt und resettet, sobald wieder Montag ist. So kann vermieden werden, dass bei einer Arbeitswoche von unter 5 Tagen trotzdem 5 Tage Urlab abgezogen werden
|
||
var tageInDerWoche = 0;
|
||
#endregion
|
||
while (startForLoop <= spanne.End.Value)
|
||
{
|
||
if (startForLoop.DayOfWeek == DayOfWeek.Monday)
|
||
tageInDerWoche = 0;
|
||
|
||
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)
|
||
{
|
||
var ff = GetFeiertagsFaktor(startForLoop);
|
||
summeTage += (1 - ff);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (!CheckIstWochenende(currentContract.Value, startForLoop.DayOfWeek) && tageInDerWoche < currentContract.Value)
|
||
{
|
||
var ff = GetFeiertagsFaktor(startForLoop);
|
||
summeTage += (1 - ff);
|
||
tageInDerWoche++;
|
||
}
|
||
|
||
}
|
||
|
||
|
||
startForLoop = startForLoop.AddDays(1);
|
||
}
|
||
}
|
||
|
||
return summeTage;
|
||
}
|
||
public decimal CountAbwesenheitstageArbeitszeiten(AbsenceTimeDC spanne, int year, Arbeitszeit az)
|
||
{
|
||
//var feiertage = GetFeiertage(year);
|
||
var feiertage = GetFeiertage(year, Bundesland);
|
||
|
||
var summeTage = 0m;
|
||
if (spanne.End == null) // Wenn es kein Ende gibt, Ende auf letzten Tag im Jahr setzen
|
||
spanne.End = new DateTime(year, 12, 31);
|
||
|
||
if (spanne.Start.Value.Date == spanne.End.Value.Date && spanne.Start.Value.TimeOfDay == spanne.End.Value.TimeOfDay &&
|
||
az.ArbeitszeitEintraege.Any(e => BS.Shared.Core.DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(e.Tag) == spanne.Start.Value.DayOfWeek)) // ein ganzer Tag Urlaub
|
||
{
|
||
if (!feiertage.Any(f => f.Datum == spanne.Start.Value.Date))
|
||
summeTage++;
|
||
else
|
||
summeTage += (1 - GetFeiertagsFaktor(spanne.Start.Value));
|
||
}
|
||
else if (spanne.Start.Value.Date == spanne.End.Value.Date && spanne.Start.Value.TimeOfDay != spanne.End.Value.TimeOfDay &&
|
||
az.ArbeitszeitEintraege.Any(e => BS.Shared.Core.DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(e.Tag) == spanne.Start.Value.DayOfWeek) && !feiertage.Any(f => f.Datum == spanne.Start.Value.Date)) // ein halber Tag Urlaub
|
||
summeTage += 0.5m;
|
||
else // Mehr als ein Tag Urlaub
|
||
{
|
||
DateTime startForLoop = (spanne.Start.Value.Year == year) ? spanne.Start.Value : new DateTime(year, 1, 1);
|
||
|
||
// 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
|
||
|
||
#region neu
|
||
// Variable wird für jeden Tag hochgezählt und resettet, sobald wieder Montag ist. So kann vermieden werden, dass bei einer Arbeitswoche von unter 5 Tagen trotzdem 5 Tage Urlab abgezogen werden
|
||
var tageInDerWoche = 0;
|
||
#endregion
|
||
while (startForLoop <= spanne.End.Value)
|
||
{
|
||
if (az.ArbeitszeitEintraege.Any(e => BS.Shared.Core.DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(e.Tag) == startForLoop.DayOfWeek))
|
||
{
|
||
if (!feiertage.Any(f => f.Datum == startForLoop.Date) && GetFeiertagsFaktor(startForLoop.Date) == 0)
|
||
summeTage++;
|
||
else
|
||
summeTage += (1 - GetFeiertagsFaktor(startForLoop.Date));
|
||
}
|
||
|
||
if (startForLoop.DayOfWeek == DayOfWeek.Monday)
|
||
tageInDerWoche = 0;
|
||
|
||
|
||
startForLoop = startForLoop.AddDays(1);
|
||
}
|
||
}
|
||
|
||
return summeTage;
|
||
}
|
||
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////// URLAUBSKONTO IM HINTERGRUND /////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////
|
||
public virtual Dictionary<int, UrlaubskontoDC> BerechneUrlaubskonto(Employee emp, int year)
|
||
{
|
||
try
|
||
{
|
||
SetLokaleFeiertagListe(year);
|
||
|
||
// Alle Abwesenheiten bis zu dem Jahr raussuchen, für das man das Urlaubskonto berechnen will
|
||
var absences = new List<AbsenceTimeDC>();
|
||
|
||
// Abwesenheiten nur auf Urlaube filtern
|
||
if (emp.AbsenceTimes != null && emp.AbsenceTimes.Count > 0)
|
||
absences = GetAllVacationAbsences(MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDCs(emp.AbsenceTimes), year, false);
|
||
|
||
// Startzeitpunkt für Berechnung berechnen
|
||
var firstContractYear = emp.Contracts?.Min(x => x.EntryDate)?.Year ?? int.MaxValue; // Den Vetrag raussuchen, der am frühesten beginnt
|
||
var firstAbsenceTimeYear = absences.Min(x => x.Start)?.Year ?? int.MaxValue; // Jahr der ersten Abwesenheit
|
||
var firstYear = Math.Min(year, Math.Min(firstContractYear, firstAbsenceTimeYear)); // Erstes, für´s Urlaubskonto relevante Jahr
|
||
|
||
// Urlaubskonten erzeugen, eins für jedes Jahr ab dem ersten bis zum ausgewählten Jahr
|
||
var konten = new Dictionary<int, UrlaubskontoDC>();
|
||
for (int i = firstYear; i <= year; i++)
|
||
{
|
||
konten.Add(i, new UrlaubskontoDC());
|
||
}
|
||
|
||
int? workdays = 0;
|
||
List<ArbeitszeitDC> arbeitszeiten = new List<ArbeitszeitDC>();
|
||
Dictionary<Contract, int> contractsAndWeeklyDays = new Dictionary<Contract, int>();
|
||
|
||
// Jahresurlaubanspruch berechnen (noch kein Resturlaub Vorjahr in dieser Schleife, nur Jahresanspruch + Sonderfall Vertragsstart oder -ende mitten im Jahr)
|
||
foreach (var contract in emp.Contracts)
|
||
{
|
||
contractsAndWeeklyDays.Add(contract, contract.WeeklyDays.HasValue ? contract.WeeklyDays.Value : 0);
|
||
|
||
var start = contract.EntryDate?.Year ?? firstYear;
|
||
var end = contract.ContractEndDate?.Year ?? year;
|
||
|
||
if (emp.Arbeitszeiten != null && emp.Arbeitszeiten.Count > 0)
|
||
arbeitszeiten = MapperFactory.ArbeitszeitDC_Arbeitszeit.MapToNewDCs(emp.Arbeitszeiten);
|
||
|
||
if (year >= start && year <= end)
|
||
workdays = contract.WeeklyDays;
|
||
// Durch jedes Jahr des Vertrags gehen und vertr. Urlaubsanspruch setzen. Noch keine Abwesenheiten/ResturlaubVorjahr, nur Urlaubsanspruch
|
||
for (int i = start; i <= end; i++)
|
||
{
|
||
if (konten.ContainsKey(i))
|
||
{
|
||
// Konto für aktuelles Jahr in Schleife auswählen
|
||
var tmp = konten[i];
|
||
|
||
if (contract.EmploymentType?.LeaveDays != null)
|
||
contract.LeaveDays = contract.EmploymentType.LeaveDays;
|
||
|
||
//Hier wird nun der Urlaubsanspruch für ein Jahr errechnet, in dem der Vertrag beginnt oder aufhört. (Siehe CalcCorrectNumberOfLeaveDaysForSpecialContractSituation())
|
||
|
||
var urlaubsanspruchFuerVertragInLoop = contract.LeaveDays ?? 0;
|
||
|
||
int arbeitstage = contract.WeeklyDays != null ? (int)contract.WeeklyDays : 0;
|
||
DateTime? endDate = contract.ContractEndDate == null ? new DateTime(year, 12, 31) : contract.ContractEndDate;
|
||
|
||
if (contract != null && contract.EntryDate != null)
|
||
{
|
||
if (contract.EntryDate.Value.Year == i || endDate.Value.Year == i) // Endet oder beginnt Vertrag in gewähltem Jahr // HIER IST DAS PROBLEM
|
||
{
|
||
decimal errechneteTage = 0;
|
||
decimal weggefallen = 0;
|
||
if (contract.EntryDate.Value.Year == i)
|
||
{
|
||
if (endDate >= new DateTime(contract.EntryDate.Value.Year, 12, 31))
|
||
{
|
||
int restlicheTageImJahr = Convert.ToInt32((new DateTime(contract.EntryDate.Value.Year, 12, 31) - contract.EntryDate.Value.Date).TotalDays);
|
||
errechneteTage = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, null, arbeitstage, restlicheTageImJahr, urlaubsanspruchFuerVertragInLoop);
|
||
}
|
||
else // Wenn Ende des Vertrags im gleichen Jahr vor Ende des Jahres ist
|
||
{
|
||
int restlicheTageImJahr = Convert.ToInt32((contract.ContractEndDate.Value.Date - contract.EntryDate.Value.Date).TotalDays);
|
||
errechneteTage += CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, contract.ContractEndDate.Value.Date, arbeitstage, restlicheTageImJahr, urlaubsanspruchFuerVertragInLoop);
|
||
}
|
||
}
|
||
else if (endDate.Value.Year == i)
|
||
{
|
||
int restlicheTageImJahr = Convert.ToInt32(((DateTime)endDate - new DateTime(i, 1, 1)).TotalDays);
|
||
errechneteTage += CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, endDate, arbeitstage, restlicheTageImJahr, urlaubsanspruchFuerVertragInLoop);
|
||
}
|
||
|
||
// Resturlaub und Urlaubsanspruch auf errechnete Werte setzen
|
||
weggefallen = urlaubsanspruchFuerVertragInLoop - errechneteTage;
|
||
tmp.Resturlaub += errechneteTage;
|
||
tmp.Urlaubsanspruch += urlaubsanspruchFuerVertragInLoop - weggefallen;
|
||
}
|
||
else
|
||
{
|
||
tmp.Urlaubsanspruch += urlaubsanspruchFuerVertragInLoop;
|
||
tmp.Resturlaub = tmp.Urlaubsanspruch;
|
||
}
|
||
}
|
||
|
||
}
|
||
}
|
||
}
|
||
|
||
// Abwesenheiten in Jahr x zu einem Dictionary hinzufügen, noch kein Abzug vom Konto
|
||
var absencesYear = new List<Tuple<int, AbsenceTimeDC>>();
|
||
foreach (var abs in absences)
|
||
{
|
||
var till = Math.Min(abs.End?.Year ?? year, year);
|
||
for (int i = abs.Start.Value.Year; i <= till; i++)
|
||
{
|
||
absencesYear.Add(new Tuple<int, AbsenceTimeDC>(i, abs));
|
||
}
|
||
}
|
||
|
||
// Urlaubsanspruch berechnen
|
||
var berechnungsjahr = firstYear;
|
||
absencesYear = absencesYear.OrderBy(x => x.Item1).ToList();
|
||
|
||
Dictionary<int, decimal> zuVerfallZuAddieren = new Dictionary<int, decimal>();
|
||
var geschenkteUrlaubstage = GetGeschenkteUrlaubstageForEmployee((long)emp.Oid);
|
||
|
||
// Alle Abwesenheiten durchlaufen, deren Dauer berechnen und vom Resturlaub + Geschenkte Tage Vorjahr abziehen, sofern es nicht nutzbaren Resturlaub vom Vorjahr gibt
|
||
// Tuple = Key-Value-Paar
|
||
foreach (var tuple in absencesYear)
|
||
{
|
||
|
||
var absYear = tuple.Item1;
|
||
var absence = tuple.Item2;
|
||
|
||
// Claude: Original-Start/-Ende sichern. Bei einem Urlaub ueber den Jahreswechsel steckt dieselbe
|
||
// AbsenceTimeDC-Referenz fuer beide Jahre in absencesYear. Die Clamping-Mutation unten (Start/Ende auf
|
||
// das absYear-Fenster) bleibt sonst ueber die Iterationen hinweg erhalten: im zweiten Jahr ist das Ende
|
||
// bereits auf den 31.12. des Vorjahres gesetzt, der Start wird auf den 01.01. gezogen -> Start > Ende
|
||
// -> dauer = 0 (der Januar-Anteil wird nie gezaehlt, der Vorjahresurlaub nicht verbraucht und verfaellt).
|
||
// Am Ende der Iteration werden die Originalwerte wiederhergestellt (siehe unten).
|
||
var absOrigStart = absence.Start;
|
||
var absOrigEnd = absence.End;
|
||
|
||
if(absYear == 2026)
|
||
{ }
|
||
_Feiertage = GetFeiertage(absYear);
|
||
|
||
// Resturlaub aus Vorjahr übertragen
|
||
while (berechnungsjahr < absYear)
|
||
{
|
||
var geschenkteTageFuerAbrechnungsjahr = geschenkteUrlaubstage.Where(g => g.Date.Year == berechnungsjahr).ToList();
|
||
var sonderurlaubFuerAbrechnungsjahr = GetSonderurlaubForEmployee(emp, berechnungsjahr);
|
||
|
||
|
||
var tmp = konten[berechnungsjahr];
|
||
var tmp2 = konten[berechnungsjahr + 1];
|
||
|
||
tmp2.ResturlaubVorjahrTotal = tmp.Resturlaub + geschenkteTageFuerAbrechnungsjahr.Sum(g => g.AnzahlTage) + sonderurlaubFuerAbrechnungsjahr.Sum(s => s.Value);
|
||
tmp2.ResturlaubVorjahr = tmp.Resturlaub + geschenkteTageFuerAbrechnungsjahr.Sum(g => g.AnzahlTage) + sonderurlaubFuerAbrechnungsjahr.Sum(s => s.Value);
|
||
|
||
berechnungsjahr++;
|
||
}
|
||
|
||
var current = konten[absYear];
|
||
if (absYear == 2025)
|
||
{
|
||
|
||
}
|
||
|
||
// Start und Ende auf Jahresanfang/-ende setzen, wenn Start des Urlaubs im Vorjahr oder Ende des Urlaubs im nächsten Jahr liegt
|
||
var start = DateTimeExtensions.GetMax(absence.Start, new DateTime(absYear, 1, 1));
|
||
var end = DateTimeExtensions.GetMin(absence.End, new DateTime(absYear, 12, 31));
|
||
|
||
// Dauer des Urlaubs unter Berücksichtigung von Wochenend- und Feiertagen berechnen
|
||
|
||
// Berücksichtigung von Arbeitszeiten
|
||
decimal dauer = 0;
|
||
|
||
//var spanne = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDC(absence);
|
||
if (absence.End.HasValue && absence.End.Value.Year > absYear)
|
||
absence.End = new DateTime(absYear, 12, 31);
|
||
if (absence.Start.HasValue && absence.Start.Value.Year < absYear)
|
||
absence.Start = new DateTime(absYear, 01, 01);
|
||
|
||
dauer = CountAbwesenheitstage(emp, absence, absYear, contractsAndWeeklyDays);
|
||
|
||
//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;
|
||
|
||
// Resturlaub vom Vorjahr verwenden, wenn Resturlaub aus dem Vorjahr existiert und der Urlaub vor dem Verfallsdatum beginnt
|
||
if (expiration != null && current.ResturlaubVorjahr > 0 && start <= expiration || expiration == null && current.ResturlaubVorjahr > 0)
|
||
{
|
||
var firstEnd = GetFirstEnd(end, expiration); // Ende von Urlaub oder Verfallsdatum, je nachdem was früher ist
|
||
|
||
// Claude: dauerVorjahr wird jetzt mit derselben Zaehlweise wie "dauer" (CountAbwesenheitstage) ermittelt.
|
||
// Vorher lief hier eine eigene, abweichende Schleife (anderes Feiertags-Handling, einzelnes "workdays"
|
||
// statt des pro Tag passenden Vertrags). Wenn diese mehr Tage zaehlte als "dauer", wurde "dauer" negativ
|
||
// und die Differenz faelschlich als Verfall gebucht -> "Urlaub der genommen wurde verfaellt".
|
||
// Indem wir die Abwesenheit nur bis firstEnd kuerzen und exakt dieselbe Methode aufrufen, stimmen
|
||
// dauer und dauerVorjahr per Definition ueberein. (Behebt zugleich das falsche, ans Zieljahr gebundene workdays.)
|
||
var originalEnd = absence.End;
|
||
absence.End = firstEnd;
|
||
var dauerVorjahr = CountAbwesenheitstage(emp, absence, absYear, contractsAndWeeklyDays);
|
||
absence.End = originalEnd;
|
||
|
||
var bucheVorjahr = Math.Min(current.ResturlaubVorjahr, dauerVorjahr);
|
||
|
||
// Urlaub, der mit Resturlaub Vorjahr abgedeckt werden kann, von diesem abziehen
|
||
current.ResturlaubVorjahr -= bucheVorjahr;
|
||
// Die Anzahl der Tage, die der Urlaub geht, um die Anzahl Tage reduzieren, die vom Resturlaub genommen werden kann, da "dauer" vom Urlaubskontingent abgezogen wird
|
||
dauer -= bucheVorjahr;
|
||
if (dauer < 0)
|
||
{
|
||
if (!zuVerfallZuAddieren.ContainsKey(absYear))
|
||
zuVerfallZuAddieren.Add(absYear, 0);
|
||
|
||
zuVerfallZuAddieren[absYear] -= dauer;
|
||
}
|
||
}
|
||
else if (expiration != null && start > expiration) // Wenn der Urlaub nach dem Verfallsdatum beginnt, ist der verfallene Urlaub gleich dem Urlaub, der aus dem Vorjahr übrig ist
|
||
{
|
||
current.VerfallenerUrlaub = zuVerfallZuAddieren.ContainsKey(absYear) ? current.ResturlaubVorjahr + zuVerfallZuAddieren[absYear] : current.ResturlaubVorjahr;
|
||
}
|
||
|
||
// Restliche Dauer vom Urlaub abziehen
|
||
current.Resturlaub -= dauer < 0 ? 0 : dauer; // ausprobieren
|
||
|
||
// Claude: Geteilte Referenz wieder auf die Originalwerte zuruecksetzen, damit die naechste Iteration
|
||
// (z. B. das Folgejahr desselben jahresuebergreifenden Urlaubs) wieder mit den echten Daten rechnet.
|
||
absence.Start = absOrigStart;
|
||
absence.End = absOrigEnd;
|
||
}
|
||
|
||
// Als letztes geschenkte Urlaubstage draufrechnen auf aktuelles Jahr
|
||
foreach (var konto in konten)
|
||
{
|
||
var i = konto.Key;
|
||
|
||
// Wenn es geschenkte Tage gibt, Liste durchlaufen und für jeden Eintrag den Zähler entsprechend der Tage erhöhen
|
||
if (geschenkteUrlaubstage != null)
|
||
{
|
||
// Zähler für die Anzahl der geschenkten Tage für das ganze Jahr (i)
|
||
decimal anzGeschenkteTage = 0.0m;
|
||
|
||
foreach (var item in geschenkteUrlaubstage)
|
||
{
|
||
if (item.Date.Year == i)
|
||
anzGeschenkteTage += item.AnzahlTage;
|
||
}
|
||
// Geschenkte Tage auf Anspruch und Resturlaub addieren
|
||
konto.Value.Urlaubsanspruch += anzGeschenkteTage;
|
||
konto.Value.Resturlaub += anzGeschenkteTage;
|
||
}
|
||
// Wenn es Sonderurlaube gibt, Liste durchlaufen und für jeden Eintrag den Zähler entsprechend der Tage erhöhen
|
||
var sonderurlaube = GetSonderurlaubForEmployee(emp, i);
|
||
if (sonderurlaube != null)
|
||
{
|
||
decimal anzSonderurlaubTage = 0.0m;
|
||
|
||
foreach (var item in sonderurlaube)
|
||
{
|
||
anzSonderurlaubTage += item.Value;
|
||
}
|
||
// Geschenkte Tage auf Anspruch und Resturlaub addieren
|
||
konto.Value.Urlaubsanspruch += anzSonderurlaubTage;
|
||
konto.Value.Resturlaub += anzSonderurlaubTage;
|
||
}
|
||
}
|
||
|
||
|
||
return konten;
|
||
}
|
||
catch (Exception e)
|
||
{
|
||
throw e;
|
||
}
|
||
}
|
||
|
||
public virtual IList<GeschenkterUrlaubstag> GetGeschenkteUrlaubstageForEmployee(long oid)
|
||
{
|
||
if (AllGeschenkteUrlaubstage == null)
|
||
{
|
||
AllGeschenkteUrlaubstage = DAOFactory.GenericDAO.GetAllActive<GeschenkterUrlaubstag>();
|
||
}
|
||
return AllGeschenkteUrlaubstage.Where(u => u.Employee == oid).ToList();
|
||
}
|
||
|
||
public virtual Dictionary<string, decimal> GetSonderurlaubForEmployee(Employee employee, int berechnungsjahr)
|
||
{
|
||
Dictionary<string, decimal> sonderurlaub = new Dictionary<string, decimal>();
|
||
|
||
Contract contract = null;
|
||
foreach (var c in employee.Contracts)
|
||
{
|
||
if (c.EntryDate.HasValue && !c.ContractEndDate.HasValue || c.EntryDate.HasValue && c.ContractEndDate.HasValue &&
|
||
berechnungsjahr >= c.EntryDate.Value.Year && berechnungsjahr <= c.ContractEndDate.Value.Year)
|
||
{
|
||
contract = c;
|
||
break;
|
||
}
|
||
}
|
||
// Wenn eine Behinderung von mind. 50 vorliegt stehen standardmäßig 5 Sonderurlaubstage zu
|
||
if (contract != null && (contract.EntryDate.HasValue && contract.ContractEndDate.HasValue || contract.EntryDate.HasValue && !contract.ContractEndDate.HasValue))
|
||
{
|
||
var yearStart = new DateTime(berechnungsjahr, 1, 1);
|
||
var yearEnd = new DateTime(berechnungsjahr, 12, 31);
|
||
|
||
// Schnittmenge aus Vertrag + Ausweis
|
||
var overlapStart = contract.EntryDate > employee.AusweisGueltigVon ? contract.EntryDate : employee.AusweisGueltigVon;
|
||
var overlapEnd = (contract.ContractEndDate ?? DateTime.MaxValue) < (employee.AusweisGueltigBis ?? DateTime.MaxValue) ? (contract.ContractEndDate ?? DateTime.MaxValue) : (employee.AusweisGueltigBis ?? DateTime.MaxValue);
|
||
|
||
// Jetzt prüfen: gibt es davon etwas im Jahr?
|
||
if (overlapStart <= overlapEnd && overlapStart <= yearEnd && overlapEnd >= yearStart)
|
||
{
|
||
if (employee.GradDerBehinderung.IsNotNullOrEmpty())
|
||
{
|
||
int.TryParse(employee.GradDerBehinderung, out int grad);
|
||
if (grad >= 50)
|
||
{
|
||
// TODO Anteilig berechnen, (wenn Behinderung erst im Berechnungsjahr beginnt nur die "aktiven" Monate anrechnen und ab
|
||
|
||
// Wenn keine Anzahl der wöchentlichen Arbeitstage gesetzt ist, 5 Tage
|
||
// Sonst Anzahl der wöchentlichen Arbeitstage (gesdetzlich so geregelt)
|
||
sonderurlaub.Add("Sonderurlaub aufgrund von Behinderungsgrad über 50", 5);
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
return sonderurlaub;
|
||
|
||
}
|
||
|
||
public virtual DateTime GetFirstEnd(DateTime? end, DateTime expiration)
|
||
{
|
||
return (DateTime)DateTimeExtensions.GetMin(end, expiration);
|
||
}
|
||
|
||
public 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;
|
||
}
|
||
public bool CheckIstInArbeitszeiten(List<Arbeitszeit> arbeitszeiten, DateTime day)
|
||
{
|
||
if (arbeitszeiten == null || arbeitszeiten.Count == 0 || (arbeitszeiten != null && !arbeitszeiten.Any(a => a.ArbeitszeitEintraege.Count > 0)))
|
||
return true;
|
||
|
||
bool istInArbeitszeiten = false;
|
||
foreach (var az in arbeitszeiten)
|
||
{
|
||
if (az.GueltigVon.HasValue && day >= az.GueltigVon.Value && az.GueltigBis.HasValue && day <= az.GueltigBis ||
|
||
az.GueltigVon.HasValue && day >= az.GueltigVon.Value && !az.GueltigBis.HasValue)
|
||
{
|
||
if (az.ArbeitszeitEintraege.Any(e => BS.Shared.Core.DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(e.Tag) == day.DayOfWeek))
|
||
istInArbeitszeiten = true;
|
||
}
|
||
}
|
||
if (istInArbeitszeiten && !arbeitszeiten.Any(a => a.ArbeitszeitEintraege.Count > 0))
|
||
istInArbeitszeiten = true;
|
||
|
||
return istInArbeitszeiten;
|
||
}
|
||
internal decimal BerechneAnzahlUrlaubstageMitWeeklyDays(AbsenceTimeDC absenceDC, int year, int weeklyDays)
|
||
{
|
||
decimal tage = 0;
|
||
|
||
if (absenceDC.Start.HasValue)
|
||
{
|
||
DateTime start = (absenceDC.Start.Value.Year == year) ? absenceDC.Start.Value : new DateTime(year, 1, 1);
|
||
DateTime end = start;
|
||
DateTime maxend = new DateTime(year, 12, 31);
|
||
|
||
if (absenceDC.End.HasValue)
|
||
{
|
||
end = absenceDC.End.Value;
|
||
}
|
||
if (maxend < end)
|
||
{
|
||
end = maxend;
|
||
}
|
||
|
||
decimal tageInEinerWoche = 0; // Tage für die Ist- und Sollstunden
|
||
int wochentageVergangen = 0; // Vergangene Wochentage
|
||
while (start <= end)
|
||
{
|
||
// Wenn Wochentag Montag ist, werden Tage einer Woche resetted und die vergangenen Arbeitstage
|
||
var wochentag = start.DayOfWeek;
|
||
if (wochentag == DayOfWeek.Monday)
|
||
{
|
||
tageInEinerWoche = 0;
|
||
wochentageVergangen = 0;
|
||
}
|
||
|
||
if (!IstFeiertag(start))
|
||
{
|
||
if (wochentageVergangen < weeklyDays)
|
||
{
|
||
// Wenn nur ein halber Tag, dann..
|
||
if (start.Date == end.Date && start.TimeOfDay != end.TimeOfDay)
|
||
{
|
||
tageInEinerWoche += 0.5m;
|
||
if (tageInEinerWoche >= weeklyDays)
|
||
tage += tageInEinerWoche > weeklyDays ? 0 - tage + weeklyDays : 0.5m;
|
||
else
|
||
tage += 0.5m;
|
||
}
|
||
else
|
||
{
|
||
tageInEinerWoche++;
|
||
if (tageInEinerWoche >= weeklyDays)
|
||
tage += tageInEinerWoche > weeklyDays ? 0 - tage + weeklyDays : 1;
|
||
else
|
||
tage++;
|
||
}
|
||
}
|
||
wochentageVergangen++;
|
||
}
|
||
|
||
start = start.AddDays(1);
|
||
}
|
||
}
|
||
|
||
return tage;
|
||
}
|
||
|
||
// Methode zur Berechnung der Urlaubstage, wenn Vertrag mitten im Jahr beginnt oder endet.
|
||
// BSP: 30 Urlaubstage, Beginn am 01.06.; Dann entfallen eine bestimmte Anzahl an Tagen, das wird hier berechnet
|
||
public virtual decimal CalcCorrectNumberOfLeaveDaysForSpecialContractSituation(DateTime entryDate, DateTime? endDate, int anzahlArbeitstage, int restlicheTageImJahr, decimal? urlaubstageProJahr)
|
||
{
|
||
decimal urlaubstage = 0;
|
||
if (urlaubstageProJahr == null)
|
||
urlaubstageProJahr = 0m;
|
||
|
||
if (entryDate.Day == 1 && entryDate.Month == 1 || entryDate.Day == 2 && entryDate.Month == 1) //Erster Tag im Jahr
|
||
{
|
||
//Prüfen, ob Enddatum Ende des Jahres oder früher ist
|
||
if (endDate == null || (endDate.HasValue && endDate.Value.Day == 31 && endDate.Value.Month == 12))
|
||
urlaubstage = (decimal)urlaubstageProJahr;
|
||
else
|
||
urlaubstage = (decimal)urlaubstageProJahr / 365m * restlicheTageImJahr;
|
||
}
|
||
else
|
||
{
|
||
urlaubstage = (decimal)urlaubstageProJahr / 365m * restlicheTageImJahr;
|
||
}
|
||
|
||
// Runden
|
||
urlaubstage = UrlaubstageRunden(urlaubstage);
|
||
|
||
return urlaubstage;
|
||
|
||
#region Alte Version, die immer wieder zu Problemen führte. Sollte es mit der neuen mehr Probleme geben, dann das wieder rein und das obere raus.
|
||
//decimal urlaubstage = 0;
|
||
//if (urlaubstageProJahr == null)
|
||
// urlaubstageProJahr = 0m;
|
||
|
||
//if (entryDate.Day == 1 && entryDate.Month == 1 || entryDate.Day == 2 && entryDate.Month == 1) //Erster Tag im Jahr
|
||
//{
|
||
// //Prüfen, ob Enddatum Ende des Jahres oder früher ist
|
||
// if (endDate == null)
|
||
// urlaubstage = (decimal)urlaubstageProJahr;
|
||
|
||
// else if (endDate.Value.Day == 31 && endDate.Value.Month == 12)
|
||
// urlaubstage = (decimal)urlaubstageProJahr;
|
||
|
||
// else
|
||
// {
|
||
// if (anzahlArbeitstage < 5) // weniger als 5 Tage (Urlaubsanspruch / 12 Monate * Monate Arbeit) / 5 * Wochenarbeitstage
|
||
// urlaubstage = (decimal)urlaubstageProJahr / 12 * (Convert.ToDecimal((endDate.Value - entryDate).TotalDays) / 30) / 5m * anzahlArbeitstage;
|
||
// //urlaubstage = (decimal)urlaubstageProJahr / 5m * anzahlArbeitstage;
|
||
// else
|
||
// {
|
||
// if (anzahlArbeitstage == 5 || anzahlArbeitstage == 6 || anzahlArbeitstage == 7) // 5 oder 6 Tage
|
||
// urlaubstage = (decimal)urlaubstageProJahr / 365m * restlicheTageImJahr;
|
||
// }
|
||
// }
|
||
|
||
//}
|
||
//else if (/*entryDate.Day > 1 && */anzahlArbeitstage < 5) // Mitten im Jahr, weniger als 5 Tage
|
||
//{
|
||
// urlaubstage = (decimal)urlaubstageProJahr / 5m * anzahlArbeitstage / 365m * restlicheTageImJahr;
|
||
//}
|
||
//else if (/*entryDate.Day > 1 && */anzahlArbeitstage >= 5) // Mitten im Jahr, 5 oder 6 Tage
|
||
//{
|
||
// urlaubstage = (decimal)urlaubstageProJahr / 365m * restlicheTageImJahr;
|
||
//}
|
||
|
||
//// Runden
|
||
//urlaubstage = UrlaubstageRunden(urlaubstage);
|
||
|
||
//return urlaubstage;
|
||
#endregion
|
||
}
|
||
|
||
public virtual decimal UrlaubstageRunden(decimal urlaubstage)
|
||
{
|
||
// Bis 0.25 wird abgerundet
|
||
if (urlaubstage - (int)urlaubstage < 0.25m)
|
||
{
|
||
urlaubstage = Math.Round(urlaubstage, MidpointRounding.AwayFromZero);
|
||
}
|
||
// Zwischen 0.25 und 0.75 wird auf 0.5 gerundet
|
||
else if (urlaubstage - (int)urlaubstage < 0.75m)
|
||
{
|
||
decimal digits = urlaubstage - (int)urlaubstage;
|
||
urlaubstage = urlaubstage - digits + 0.5m;
|
||
}
|
||
// Ab 0.75 auf nächste volle Zahl aufrunden
|
||
else
|
||
{
|
||
urlaubstage = Math.Ceiling(urlaubstage);
|
||
}
|
||
|
||
return urlaubstage;
|
||
}
|
||
|
||
public decimal BerechneAnzahlUrlaubstage(AbsenceTime absence, AbsenceTimeDC absenceDC, int year, int? workdays)
|
||
{
|
||
if (absence != null)
|
||
{
|
||
if (absence.Start.HasValue)
|
||
{
|
||
decimal days = 0;
|
||
//int days = 0;
|
||
|
||
//DateTime start = absence.Start.Value;
|
||
DateTime start = (absence.Start.Value.Year == year) ? absence.Start.Value : new DateTime(year, 1, 1);
|
||
DateTime end = start;
|
||
DateTime maxend = new DateTime(year, 12, 31);
|
||
if (absence.End.HasValue)
|
||
{
|
||
end = absence.End.Value;
|
||
}
|
||
|
||
if (maxend < end)
|
||
{
|
||
end = maxend;
|
||
}
|
||
|
||
var tageInDerWoche = 0m;
|
||
while (start <= end)
|
||
{
|
||
if (start.DayOfWeek == DayOfWeek.Monday)
|
||
tageInDerWoche = 0;
|
||
if (!CheckIstWochenende(workdays, start.DayOfWeek) && !IstFeiertag(start) && tageInDerWoche < workdays.Value && tageInDerWoche + 1 <= workdays.Value)
|
||
{
|
||
if (start.Date == end.Date && start.TimeOfDay != end.TimeOfDay)
|
||
{
|
||
days += 0.5m;
|
||
tageInDerWoche += 0.5m;
|
||
}
|
||
else
|
||
{
|
||
days++;
|
||
tageInDerWoche++;
|
||
}
|
||
}
|
||
|
||
start = start.AddDays(1);
|
||
}
|
||
return (decimal)days;
|
||
}
|
||
}
|
||
|
||
else if (absenceDC != null)
|
||
{
|
||
if (absenceDC.Start.HasValue)
|
||
{
|
||
decimal days = 0;
|
||
//int days = 0;
|
||
|
||
//DateTime start = absence.Start.Value;
|
||
DateTime start = (absenceDC.Start.Value.Year == year) ? absenceDC.Start.Value : new DateTime(year, 1, 1);
|
||
DateTime end = start;
|
||
DateTime maxend = new DateTime(year, 12, 31);
|
||
if (absenceDC.End.HasValue)
|
||
{
|
||
end = absenceDC.End.Value;
|
||
}
|
||
|
||
if (maxend < end)
|
||
{
|
||
end = maxend;
|
||
}
|
||
|
||
|
||
while (start <= end)
|
||
{
|
||
if (!CheckIstWochenende(workdays, start.DayOfWeek) && !IstFeiertag(start))
|
||
{
|
||
if (start.Date == end.Date && start.TimeOfDay != end.TimeOfDay)
|
||
days += 0.5m;
|
||
else
|
||
days++;
|
||
}
|
||
|
||
start = start.AddDays(1);
|
||
}
|
||
return (decimal)days;
|
||
}
|
||
}
|
||
|
||
|
||
return 0;
|
||
}
|
||
public Dictionary<long?, decimal> BerechneAnzEinerAbwesenheitFuerMehrereMitarbeiter(List<long?> empOids, int year, string reason)
|
||
{
|
||
SetLokaleFeiertagListe(year);
|
||
|
||
EmployeeServiceImp es = new EmployeeServiceImp();
|
||
var absences = es.GetAllEmployeeAbsenceTimesForYear(year).Where(abs => abs.Reason.Description.ToLower().Contains(reason.ToLower()));
|
||
|
||
Dictionary<long?, decimal> urlaubGenommenProMitarbeiter = new Dictionary<long?, decimal>();
|
||
|
||
foreach (var oid in empOids)
|
||
{
|
||
var absencesForCurrentEmp = absences.Where(a => a.EmployeeOid == oid);
|
||
decimal tage = 0;
|
||
|
||
foreach (var abs in absencesForCurrentEmp)
|
||
{
|
||
var start = (DateTime)DateTimeExtensions.GetMax(abs.Start, new DateTime(year, 1, 1));
|
||
var end = (DateTime)DateTimeExtensions.GetMin(abs.End != null ? abs.End: new DateTime(year, 12, 31), new DateTime(year, 12, 31));
|
||
|
||
while (start <= end)
|
||
{
|
||
if (start.DayOfWeek != DayOfWeek.Saturday && start.DayOfWeek != DayOfWeek.Sunday && !_Feiertage.Contains(start))
|
||
{
|
||
if (start.Date == end.Date && start.TimeOfDay != end.TimeOfDay)
|
||
tage += 0.5m;
|
||
else
|
||
tage++;
|
||
}
|
||
|
||
|
||
start = start.AddDays(1);
|
||
}
|
||
}
|
||
|
||
urlaubGenommenProMitarbeiter.Add(oid, tage);
|
||
}
|
||
|
||
return urlaubGenommenProMitarbeiter;
|
||
}
|
||
}
|
||
}
|