Files
BeWoPlaner/Report/ReportObjects/RosterIstRO.cs

176 lines
7.7 KiB
C#

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)
{
RosterIstRO ro = new RosterIstRO();
ro.PageObjects = new List<PageObject>();
// (Vorerst) leere Einträge erstellen
List<Listeneintrag> eintraege = new List<Listeneintrag>();
int pos = 0;
foreach (var emp in employee)
{
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]);
}
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.First(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]
};
}
}
foreach (var item in dienstvertretungDCs)
{
string[] urlaubKrankheit = UrlaubUndKrankheitUeberpruefen(null, item, absences, stundenBeiAbwesenheit);
var temp = eintraege.First(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]
};
}
}
foreach (EmployeeDC emp in employee)
{
ro.PageObjects.Add(new PageObject()
{
Jahr = year,
Monat = new DateTime(year, month, 1).ToString("MMMM", CultureInfo.CreateSpecificCulture("de")),
Mitarbeiter = emp,
EintraegeProMitarbeiter = eintraege.Where(e => e.EmployeeOid == emp.EmployeeOid).OrderBy(e => e.Datum).ToList()
});
}
return ro;
}
private static string[] UrlaubUndKrankheitUeberpruefen(DienstEintragDC eintrag, DienstvertretungDC vertretung, List<AbsenceTimeDC> abwesenheiten, Dictionary<long?, decimal> stundenBeiAbwesenheit)
{
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("urlaub"))
urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
else if (absence.Reason.Description.ToLower().Contains("krank"))
urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
}
}
}
else if (vertretung != null)
{
foreach (var absence in abwesenheiten)
{
if (vertretung.Datum >= absence.Start && vertretung.Datum <= absence.End.Value && vertretung.EmployeeOid == absence.EmployeeOid)
{
if (absence.Reason.Description.ToLower().Contains("urlaub"))
urlaubKrankheit[0] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
else if (absence.Reason.Description.ToLower().Contains("krank"))
urlaubKrankheit[1] = string.Format("{0:0.00}", stundenBeiAbwesenheit[absence.EmployeeOid]);
}
}
}
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; }
}
}