176 lines
7.7 KiB
C#
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; }
|
|
|
|
}
|
|
}
|