2021-09-22 15:34:38 +02:00
|
|
|
|
using BS.Shared.DataContracts;
|
|
|
|
|
|
using BS.Shared.DataContracts.Compact;
|
|
|
|
|
|
using System;
|
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
|
using System.Globalization;
|
|
|
|
|
|
using System.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace BeWo.Report.ReportObjects
|
|
|
|
|
|
{
|
|
|
|
|
|
public class RosterIstRO : AbstractBeWoReportObject<RosterIstRO>
|
|
|
|
|
|
{
|
|
|
|
|
|
public List<PageObject> PageObjects { get; set; }
|
|
|
|
|
|
|
2023-02-28 12:29:16 +01:00
|
|
|
|
public static RosterIstRO Create(List<DienstEintragDC> dienstEintragDCs, List<DienstvertretungDC> dienstvertretungDCs, List<EmployeeDC> employee,
|
|
|
|
|
|
List<DienstInfoDC> dienstInfoDCs, CompactWohnheimDC compactWohnheimDC, int year, int month, List<FeiertagDC> feiertage, List<AbsenceTimeDC> absences,
|
2021-10-12 16:00:17 +02:00
|
|
|
|
Dictionary<long?, decimal> stundenBeiAbwesenheit)
|
2021-09-22 15:34:38 +02:00
|
|
|
|
{
|
|
|
|
|
|
RosterIstRO ro = new RosterIstRO();
|
|
|
|
|
|
ro.PageObjects = new List<PageObject>();
|
|
|
|
|
|
|
|
|
|
|
|
// (Vorerst) leere Einträge erstellen
|
2022-01-05 16:23:38 +01:00
|
|
|
|
List<Dictionary<int, List<Listeneintrag>>> alleEintraege = new List<Dictionary<int, List<Listeneintrag>>>();
|
2021-09-22 15:34:38 +02:00
|
|
|
|
int pos = 0;
|
2022-01-05 16:23:38 +01:00
|
|
|
|
|
2021-09-22 15:34:38 +02:00
|
|
|
|
foreach (var emp in employee)
|
2022-01-05 16:23:38 +01:00
|
|
|
|
{ // Es müsste nicht für jeden Tag was erstellt werden, sondern für jeden Mitarbeiter müsste die Anzahl der Schichten pro Tag
|
|
|
|
|
|
// ermittelt werden und anhand dessen die Zeilenmenge erstellt werden
|
|
|
|
|
|
Dictionary<int, List<Listeneintrag>> eintraegeDict = new Dictionary<int, List<Listeneintrag>>();
|
|
|
|
|
|
|
2021-09-22 15:34:38 +02:00
|
|
|
|
for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++)
|
|
|
|
|
|
{
|
2022-01-05 16:23:38 +01:00
|
|
|
|
var datum = new DateTime(year, month, i);
|
|
|
|
|
|
bool mitarbeiterDesWohnheims = false;
|
|
|
|
|
|
if (compactWohnheimDC.EmployeeOids.Contains(emp.EmployeeOid.Value))
|
|
|
|
|
|
mitarbeiterDesWohnheims = true;
|
|
|
|
|
|
else
|
|
|
|
|
|
mitarbeiterDesWohnheims = false;
|
|
|
|
|
|
|
|
|
|
|
|
var diensteFuerTag = mitarbeiterDesWohnheims ? dienstEintragDCs.Where(e => e.EmployeeOid == emp.EmployeeOid && e.Datum == datum).ToList() : null;
|
|
|
|
|
|
var vertretungenFuerTag = !mitarbeiterDesWohnheims ? dienstvertretungDCs.Where(e => e.EmployeeOid == emp.EmployeeOid && e.Datum == datum).ToList() : null;
|
2023-02-28 12:29:16 +01:00
|
|
|
|
var abwesenheitenFuerTag = absences.Where(a => datum >= a.AbsenceSpan.StartDate && datum <= a.AbsenceSpan.EndDate && a.EmployeeOid == emp.EmployeeOid).ToList();
|
2022-01-05 16:23:38 +01:00
|
|
|
|
|
2021-09-22 15:34:38 +02:00
|
|
|
|
string kr = null;
|
|
|
|
|
|
string ur = null;
|
|
|
|
|
|
if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("urlaub")))
|
|
|
|
|
|
{
|
2021-10-12 16:00:17 +02:00
|
|
|
|
ur = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]);
|
2021-09-22 15:34:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
else if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("krank")))
|
|
|
|
|
|
{
|
2021-10-12 16:00:17 +02:00
|
|
|
|
kr = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]);
|
2021-09-22 15:34:38 +02:00
|
|
|
|
}
|
2022-01-05 16:23:38 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (mitarbeiterDesWohnheims)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<Listeneintrag> listeneintraege = new List<Listeneintrag>();
|
2023-02-28 12:29:16 +01:00
|
|
|
|
foreach (var abs in abwesenheitenFuerTag)
|
|
|
|
|
|
{
|
|
|
|
|
|
string[] urlaubKrankheit = new string[2];
|
|
|
|
|
|
if (!diensteFuerTag.Any(d => d.Datum.Date == datum.Date))
|
|
|
|
|
|
{
|
|
|
|
|
|
// AUSPROGRAMMIEREN
|
|
|
|
|
|
if (abs.Reason.Description.ToLower().Contains("krank"))
|
|
|
|
|
|
urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[abs.EmployeeOid]);
|
|
|
|
|
|
else if (abs.Reason.Description.ToLower().Contains("urlaub"))
|
|
|
|
|
|
urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[abs.EmployeeOid]);
|
|
|
|
|
|
|
|
|
|
|
|
listeneintraege.Add(new Listeneintrag()
|
|
|
|
|
|
{
|
|
|
|
|
|
Position = pos,
|
|
|
|
|
|
Datum = datum,
|
|
|
|
|
|
EmployeeOid = (long)emp.EmployeeOid,
|
|
|
|
|
|
Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : abs.Reason.Description,
|
|
|
|
|
|
Krankheit = urlaubKrankheit[0],
|
|
|
|
|
|
Urlaub = urlaubKrankheit[1]
|
|
|
|
|
|
});
|
|
|
|
|
|
pos++;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-05 16:23:38 +01:00
|
|
|
|
foreach (var item in diensteFuerTag)
|
|
|
|
|
|
{
|
|
|
|
|
|
string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(item, null, absences, stundenBeiAbwesenheit);
|
|
|
|
|
|
listeneintraege.Add(new Listeneintrag()
|
|
|
|
|
|
{
|
|
|
|
|
|
Position = pos,
|
|
|
|
|
|
Datum = datum,
|
|
|
|
|
|
EmployeeOid = (long)emp.EmployeeOid,
|
|
|
|
|
|
DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden),
|
|
|
|
|
|
Dienst = dienstInfoDCs.First(di => di.Oid == item.DienstOid),
|
|
|
|
|
|
Endzeit = item.Endzeit,
|
|
|
|
|
|
Startzeit = item.Startzeit,
|
|
|
|
|
|
Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : item.Notice,
|
|
|
|
|
|
Krankheit = urlaubKrankheit[0],
|
|
|
|
|
|
Urlaub = urlaubKrankheit[1]
|
|
|
|
|
|
});
|
|
|
|
|
|
pos++;
|
|
|
|
|
|
}
|
|
|
|
|
|
eintraegeDict.Add(i, listeneintraege);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
2021-09-22 15:34:38 +02:00
|
|
|
|
{
|
2022-01-05 16:23:38 +01:00
|
|
|
|
List<Listeneintrag> listeneintraege = new List<Listeneintrag>();
|
|
|
|
|
|
foreach (var item in vertretungenFuerTag)
|
|
|
|
|
|
{
|
|
|
|
|
|
string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(null, item, absences, stundenBeiAbwesenheit);
|
|
|
|
|
|
listeneintraege.Add(new Listeneintrag()
|
|
|
|
|
|
{
|
|
|
|
|
|
Position = pos,
|
|
|
|
|
|
Datum = datum,
|
|
|
|
|
|
EmployeeOid = (long)emp.EmployeeOid,
|
|
|
|
|
|
DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden),
|
|
|
|
|
|
Dienst = dienstInfoDCs.First(di => di.Oid == item.DienstOid),
|
|
|
|
|
|
Endzeit = item.Endzeit,
|
|
|
|
|
|
Startzeit = item.Startzeit,
|
|
|
|
|
|
Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : item.Notice,
|
|
|
|
|
|
Krankheit = urlaubKrankheit[0],
|
|
|
|
|
|
Urlaub = urlaubKrankheit[1]
|
|
|
|
|
|
});
|
|
|
|
|
|
pos++;
|
|
|
|
|
|
}
|
|
|
|
|
|
eintraegeDict.Add(i, listeneintraege);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-09-22 15:34:38 +02:00
|
|
|
|
}
|
2022-01-05 16:23:38 +01:00
|
|
|
|
#region outdated
|
|
|
|
|
|
// for (int i = 1; i <= DateTime.DaysInMonth(year, month); i++)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// string kr = null;
|
|
|
|
|
|
// string ur = null;
|
|
|
|
|
|
// var datum = new DateTime(year, month, i);
|
|
|
|
|
|
// if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("urlaub")))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// ur = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]);
|
|
|
|
|
|
// }
|
|
|
|
|
|
// else if (absences.Any(a => datum >= a.Start && datum <= a.End && a.EmployeeOid == emp.EmployeeOid && a.Reason.Description.ToLower().Contains("krank")))
|
|
|
|
|
|
// {
|
|
|
|
|
|
// kr = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]);
|
|
|
|
|
|
// }
|
2021-09-22 15:34:38 +02:00
|
|
|
|
|
2022-01-05 16:23:38 +01:00
|
|
|
|
// eintraege.Add(new Listeneintrag()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// Position = pos,
|
|
|
|
|
|
// Datum = datum,
|
|
|
|
|
|
// EmployeeOid = (long)emp.EmployeeOid,
|
|
|
|
|
|
// DauerInStunden = null,
|
|
|
|
|
|
// Dienst = null,
|
|
|
|
|
|
// Endzeit = null,
|
|
|
|
|
|
// Startzeit = null,
|
|
|
|
|
|
// Notice = feiertage.Any(f => f.Datum == datum) ? feiertage.First(f => f.Datum == datum).Name : null,
|
|
|
|
|
|
// Krankheit = kr,
|
|
|
|
|
|
// Urlaub = ur,
|
|
|
|
|
|
// });
|
|
|
|
|
|
|
|
|
|
|
|
// pos++;
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//foreach (var item in dienstEintragDCs)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(item, null, absences, stundenBeiAbwesenheit);
|
|
|
|
|
|
|
|
|
|
|
|
// var temp = eintraege.FirstOrDefault(e => e.Datum == item.Datum && e.EmployeeOid == item.EmployeeOid && e.Dienst == null);
|
|
|
|
|
|
// var temp2 = eintraege.Where(e => e.Datum == item.Datum && e.EmployeeOid == item.EmployeeOid).ToList();
|
|
|
|
|
|
// if (temp != null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// eintraege[temp.Position] = new Listeneintrag()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// Datum = item.Datum,
|
|
|
|
|
|
// DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden),
|
|
|
|
|
|
// Dienst = dienstInfoDCs.First(i => i.Oid == item.DienstOid),
|
|
|
|
|
|
// EmployeeOid = item.EmployeeOid,
|
|
|
|
|
|
// Endzeit = item.Endzeit,
|
|
|
|
|
|
// Notice = item.Notice,
|
|
|
|
|
|
// Startzeit = item.Startzeit,
|
|
|
|
|
|
// Urlaub = urlaubKrankheit[0],
|
|
|
|
|
|
// Krankheit = urlaubKrankheit[1]
|
|
|
|
|
|
// };
|
|
|
|
|
|
// }
|
|
|
|
|
|
//}
|
|
|
|
|
|
//foreach (var item in dienstvertretungDCs)
|
|
|
|
|
|
//{
|
|
|
|
|
|
// string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(null, item, absences, stundenBeiAbwesenheit);
|
|
|
|
|
|
|
|
|
|
|
|
// var temp = eintraege.FirstOrDefault(e => e.Datum == item.Datum && e.EmployeeOid == item.EmployeeOid && e.Dienst == null);
|
|
|
|
|
|
// if (temp != null)
|
|
|
|
|
|
// {
|
|
|
|
|
|
// eintraege[temp.Position] = new Listeneintrag()
|
|
|
|
|
|
// {
|
|
|
|
|
|
// Datum = item.Datum,
|
|
|
|
|
|
// DauerInStunden = string.Format("{0:0.00}", item.DauerInStunden),
|
|
|
|
|
|
// Dienst = dienstInfoDCs.First(i => i.Oid == item.DienstOid),
|
|
|
|
|
|
// EmployeeOid = item.EmployeeOid,
|
|
|
|
|
|
// Endzeit = item.Endzeit,
|
|
|
|
|
|
// Notice = item.Notice,
|
|
|
|
|
|
// Startzeit = item.Startzeit,
|
|
|
|
|
|
// Urlaub = urlaubKrankheit[0],
|
|
|
|
|
|
// Krankheit = urlaubKrankheit[1]
|
|
|
|
|
|
// };
|
|
|
|
|
|
// }
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
alleEintraege.Add(eintraegeDict);
|
2021-09-22 15:34:38 +02:00
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2022-01-05 16:23:38 +01:00
|
|
|
|
int counter = 0;
|
|
|
|
|
|
int position = 0;
|
|
|
|
|
|
foreach (EmployeeDC emp in employee)
|
|
|
|
|
|
{
|
|
|
|
|
|
List<Listeneintrag> liste = new List<Listeneintrag>();
|
|
|
|
|
|
var temp = alleEintraege[counter];
|
|
|
|
|
|
foreach (var item in temp)
|
2021-09-22 15:34:38 +02:00
|
|
|
|
{
|
2022-01-05 16:23:38 +01:00
|
|
|
|
if (item.Value.Count == 0)
|
2021-09-22 15:34:38 +02:00
|
|
|
|
{
|
2022-01-05 16:23:38 +01:00
|
|
|
|
var date = new DateTime(year, month, item.Key, 0, 0, 0);
|
|
|
|
|
|
item.Value.Add(new Listeneintrag()
|
|
|
|
|
|
{
|
|
|
|
|
|
Datum = date,
|
|
|
|
|
|
DauerInStunden = null,
|
|
|
|
|
|
Dienst = null,
|
|
|
|
|
|
EmployeeOid = emp.EmployeeOid.Value,
|
|
|
|
|
|
Endzeit = null,
|
|
|
|
|
|
Krankheit = null,
|
|
|
|
|
|
Notice = feiertage.Any(f => f.Datum == date) ? feiertage.First(f => f.Datum == date).Name : null,
|
|
|
|
|
|
Startzeit = null,
|
|
|
|
|
|
Urlaub = null
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
//else
|
2023-02-28 12:29:16 +01:00
|
|
|
|
foreach (var v in item.Value)
|
|
|
|
|
|
liste.Add(v);
|
2021-09-22 15:34:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ro.PageObjects.Add(new PageObject()
|
|
|
|
|
|
{
|
|
|
|
|
|
Jahr = year,
|
|
|
|
|
|
Monat = new DateTime(year, month, 1).ToString("MMMM", CultureInfo.CreateSpecificCulture("de")),
|
|
|
|
|
|
Mitarbeiter = emp,
|
2022-01-05 16:23:38 +01:00
|
|
|
|
EintraegeProMitarbeiter = liste
|
2021-09-22 15:34:38 +02:00
|
|
|
|
});
|
2022-01-05 16:23:38 +01:00
|
|
|
|
counter++;
|
2021-09-22 15:34:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return ro;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2021-10-12 16:00:17 +02:00
|
|
|
|
private static string[] UrlaubUndKrankheitUeberpruefen(DienstEintragDC eintrag, DienstvertretungDC vertretung, List<AbsenceTimeDC> abwesenheiten, Dictionary<long?, decimal> stundenBeiAbwesenheit)
|
2021-09-22 15:34:38 +02:00
|
|
|
|
{
|
|
|
|
|
|
string[] urlaubKrankheit = new string[] { " ", " " };
|
|
|
|
|
|
if (eintrag != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var absence in abwesenheiten)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (eintrag.Datum >= absence.Start && eintrag.Datum <= absence.End.Value && eintrag.EmployeeOid == absence.EmployeeOid)
|
|
|
|
|
|
{
|
2023-02-28 12:29:16 +01:00
|
|
|
|
if (absence.Reason.Description.ToLower().Contains("krank"))
|
2021-10-12 16:00:17 +02:00
|
|
|
|
urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
|
2023-02-28 12:29:16 +01:00
|
|
|
|
else if (absence.Reason.Description.ToLower().Contains("urlaub"))
|
2021-10-12 16:00:17 +02:00
|
|
|
|
urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
|
2021-09-22 15:34:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
else if (vertretung != null)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var absence in abwesenheiten)
|
|
|
|
|
|
{
|
2021-09-27 15:11:22 +02:00
|
|
|
|
if (vertretung.Datum >= absence.Start && vertretung.Datum <= absence.End.Value && vertretung.EmployeeOid == absence.EmployeeOid)
|
2021-09-22 15:34:38 +02:00
|
|
|
|
{
|
2023-02-28 12:29:16 +01:00
|
|
|
|
if (absence.Reason.Description.ToLower().Contains("krank"))
|
2021-10-12 16:00:17 +02:00
|
|
|
|
urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
|
2023-02-28 12:29:16 +01:00
|
|
|
|
else if (absence.Reason.Description.ToLower().Contains("urlaub"))
|
2021-10-12 16:00:17 +02:00
|
|
|
|
urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
|
2021-09-22 15:34:38 +02:00
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return urlaubKrankheit;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class Listeneintrag
|
|
|
|
|
|
{
|
|
|
|
|
|
public int Position { get; set; }
|
|
|
|
|
|
|
|
|
|
|
|
public long EmployeeOid { get; set; }
|
|
|
|
|
|
public string Notice { get; set; }
|
|
|
|
|
|
public DienstInfoDC Dienst { get; set; }
|
|
|
|
|
|
public DateTime Datum { get; set; }
|
|
|
|
|
|
public string Startzeit { get; set; }
|
|
|
|
|
|
public string Endzeit { get; set; }
|
|
|
|
|
|
public string DauerInStunden { get; set; }
|
|
|
|
|
|
public string Urlaub { get; set; }
|
|
|
|
|
|
public string Krankheit { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
public class PageObject
|
|
|
|
|
|
{
|
|
|
|
|
|
public EmployeeDC Mitarbeiter { get; set; }
|
|
|
|
|
|
public string Monat { get; set; }
|
|
|
|
|
|
public int Jahr { get; set; }
|
|
|
|
|
|
public List<Listeneintrag> EintraegeProMitarbeiter { get; set; }
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2023-02-28 12:29:16 +01:00
|
|
|
|
|