Files

309 lines
16 KiB
C#
Raw Permalink Normal View History

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; }
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,
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
List<Dictionary<int, List<Listeneintrag>>> alleEintraege = new List<Dictionary<int, List<Listeneintrag>>>();
2021-09-22 15:34:38 +02:00
int pos = 0;
2021-09-22 15:34:38 +02:00
foreach (var emp in employee)
{ // 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++)
{
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;
var abwesenheitenFuerTag = absences.Where(a => datum >= a.AbsenceSpan.StartDate && datum <= a.AbsenceSpan.EndDate && a.EmployeeOid == emp.EmployeeOid).ToList();
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")))
{
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")))
{
kr = string.Format("{0:0.00}", stundenBeiAbwesenheit[emp.EmployeeOid]);
2021-09-22 15:34:38 +02:00
}
if (mitarbeiterDesWohnheims)
{
List<Listeneintrag> listeneintraege = new List<Listeneintrag>();
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++;
}
}
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
{
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
}
#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
// 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
}
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
{
if (item.Value.Count == 0)
2021-09-22 15:34:38 +02: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
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,
EintraegeProMitarbeiter = liste
2021-09-22 15:34:38 +02:00
});
counter++;
2021-09-22 15:34:38 +02:00
}
return ro;
}
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)
{
if (absence.Reason.Description.ToLower().Contains("krank"))
urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
else if (absence.Reason.Description.ToLower().Contains("urlaub"))
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)
{
if (vertretung.Datum >= absence.Start && vertretung.Datum <= absence.End.Value && vertretung.EmployeeOid == absence.EmployeeOid)
2021-09-22 15:34:38 +02:00
{
if (absence.Reason.Description.ToLower().Contains("krank"))
urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
else if (absence.Reason.Description.ToLower().Contains("urlaub"))
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; }
}
}