MH: Viel rund um Dienstplanung + neue Methode für MitarbeiterstundenkontoBerechnung

This commit is contained in:
Marcel Hirschle
2021-10-12 16:00:17 +02:00
parent 859b3e2170
commit 70126f8a20
33 changed files with 1241 additions and 469 deletions

View File

@@ -2,6 +2,8 @@
using BeWo.Data.Entities;
using BeWo.Service.Core;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BeWo.Service.ServiceImplementations;
using BS.Shared;
using BS.Shared.DataContracts;
using System;
@@ -18,9 +20,13 @@ namespace BeWo.Service.Dienstplanung
public static DienstplanerRootDC BuildDienstplanerRootObject(DateTime date, long wohnheimOid)
{
DienstplanerRootDC root = new DienstplanerRootDC();
OperationsServiceImp os = new OperationsServiceImp();
root.AlleDienste = GetAllDienste().OrderBy(d => d.Start).ToList();
root.AlleDienste = GetAllDienste(wohnheimOid).OrderBy(d => d.Start).ToList();
root.AlleDienste.Insert(0, DienstInfoDC.Platzhalter);
root.AbsenceTimes = GetAbsenceTimeVacationByWohnheim(wohnheimOid, date.Year, date.Month);
root.OverTimes = GetOverTimesByWohnheim(wohnheimOid, date.Year, date.Month);
root.RegelmaessigeDienste = GetRegelmaessigeDienste(wohnheimOid);
root.TextBoxForeColor = GetColorForForeground();
@@ -53,8 +59,39 @@ namespace BeWo.Service.Dienstplanung
root.StatusColorTrue = "#FF228B22";
root.StatusColorFalse = "#FFCD5C5C";
var wh = DAOFactory.GenericDAO.GetByID<Wohnheim>(wohnheimOid);
List<long> empOids = new List<long>();
#region EmployeeOids holen für Ist- und Saldoberechnung und die Liste der vorhandenen Mitarbeiter
foreach (var item in wh.Employee2WohnheimList)
{
empOids.Add((long)item.EmployeeOid);
}
foreach (var item in root.AlleDienstvertretungen)
{
if (!empOids.Contains(item.EmployeeOid))
empOids.Add((long)item.EmployeeOid);
}
root.AllEmployee = new List<EmployeeDC>();
foreach (var block in root.DienstDCListe)
{
if (!root.AllEmployee.Contains(block.Employee))
root.AllEmployee.Add(block.Employee);
}
#endregion
root.MonatsZusammenfassung = BerechneSollSaldoUndIst(root, date, empOids);
return root;
}
private static List<RegelmaessigerDienstDC> GetRegelmaessigeDienste(long wOid)
{
return MapperFactory.RegelmaessigerDienstDC_RegelmaessigerDienst.MapToNewDCs(DAOFactory.GenericDAO.GetAllActive<RegelmaessigerDienst>())
.Where(x => x.WohnheimOid == wOid).ToList();
}
public static List<AbsenceTimeDC> GetAbsenceTimeVacationByWohnheim(long wohnId, int year, int month)
{
var date = new DateTime(year, month, 1);
@@ -69,11 +106,29 @@ namespace BeWo.Service.Dienstplanung
return MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDCs(res);
}
public static List<DienstInfoDC> GetAllDienste()
public static List<OvertimeDC> GetOverTimesByWohnheim(long wohnId, int year, int month)
{
var temp = DAOFactory.GenericDAO.GetAllActive<DienstInfo>();
return MapperFactory.DienstInfoDC_DienstInfo.MapToNewDCs(temp);
var date = new DateTime(year, month, 1);
var date2 = date.AddMonths(1).AddTicks(-1);
var wh = DAOFactory.GenericDAO.GetByID<Wohnheim>(wohnId);
var emps = wh.Employee2WohnheimList.Select(x => x.Employee.Oid);
var allOvertimes = DAOFactory.GenericDAO.GetAllActive<Overtime>().Where(x => x.EmployeeOid.HasValue);
List<Overtime> ots = allOvertimes.Where(x => emps.Contains(x.EmployeeOid.Value) && x.Date >= date && x.Date <= date2).ToList();
return MapperFactory.OvertimeDC_Overtime.MapToNewDCs(ots);
}
public static List<DienstInfoDC> GetAllDienste(long? whOid)
{
List<DienstInfo> list = new List<DienstInfo>();
if (whOid == null)
list = DAOFactory.GenericDAO.GetAllActive<DienstInfo>().ToList();
else
list = DAOFactory.SearchDAO.FindDiensteForWohnheim(whOid).ToList();
return MapperFactory.DienstInfoDC_DienstInfo.MapToNewDCs(list);
}
public static void InsertNewDienst(List<DienstInfoDC> dienst)
{
@@ -154,9 +209,18 @@ namespace BeWo.Service.Dienstplanung
for (int i = 0; i < zeile.DienstDictArray.Length; i++)
{
var empDienste = dienstEintraegeDC
.Where(x => x.EmployeeOid == emp.EmployeeOid && x.Zeile == i);
.Where(x => x.EmployeeOid == emp.EmployeeOid && x.Zeile == i).ToList();
zeile.DienstDictArray[i] = empDienste
var empDiensteFinal = new List<DienstEintragDC>();
foreach (var item in empDienste)
{
if (!empDiensteFinal.Any(d => d.Datum == item.Datum && d.Zeile == item.Zeile))
empDiensteFinal.Add(item);
else
Console.WriteLine("Key existiert schon");
}
zeile.DienstDictArray[i] = empDiensteFinal
.ToDictionary(x => x.Datum.Day, x => x.DienstOid);
}
@@ -400,8 +464,96 @@ namespace BeWo.Service.Dienstplanung
{
return "#FF6495ED";
}
public static List<DienstplanerMonthlySummaryDC> BerechneSollSaldoUndIst(DienstplanerRootDC root, DateTime date, List<long> empOids)
{
VacationService vs = new VacationService();
var konto = MitarbeiterstundenkontoRO.Create(null, null, date, date.AddMonths(1), empOids);
var berechnung = new MitarbeiterstundenkontoBerechnung();
berechnung.CreateReport(konto);
List<DienstplanerMonthlySummaryDC> monatsZusammenfassung = new List<DienstplanerMonthlySummaryDC>();
root.StundenBeiAbwesenheit = new Dictionary<long?, decimal>();
foreach (var item in konto.EmployeeDetailList)
{
root.StundenBeiAbwesenheit.Add(item.Employee.Oid, item.SollProTag);
DienstplanerMonthlySummaryDC dc = new DienstplanerMonthlySummaryDC
{
Employee = MapperFactory.EmployeeDC_Employee.MapToNewDC(item.Employee),
Soll = item.StundenSollOhneUrlaubKrankheit,
ZeitkontoLetzterMonat = item.UeberstundenVormonat,
ZeitkontoAktualisiert = item.Ueberstunden,
TageUrlaub = 0,
TageKrank = 0
};
var eintraegeFuerMitarbeiterMonat = root.AlleDienstEintraege.FindAll(x => x.EmployeeOid == dc.Employee.EmployeeOid).ToList();
var vertretungenFuerMitarbeiterMonat = root.AlleDienstvertretungen.FindAll(x => x.EmployeeOid == dc.Employee.EmployeeOid).ToList();
var urlaubKrankheitMonat = root.AbsenceTimes.FindAll(x => x.EmployeeOid == dc.Employee.EmployeeOid).ToList();
var overTimesMonat = root.OverTimes.FindAll(x => x.EmployeeOid == dc.Employee.EmployeeOid).ToList();
decimal stunden = 0;
//decimal abzug = 0;
if (eintraegeFuerMitarbeiterMonat.Count > 0)
{
foreach (var eintrag in eintraegeFuerMitarbeiterMonat)
{
stunden += Convert.ToDecimal(eintrag.DauerInStunden);
}
}
if (vertretungenFuerMitarbeiterMonat.Count > 0)
{
foreach (var vertretung in vertretungenFuerMitarbeiterMonat)
stunden += Convert.ToDecimal(vertretung.DauerInStunden);
}
if (overTimesMonat.Count > 0)
{
foreach (var ot in overTimesMonat)
stunden += ot.Betrag;
}
if (urlaubKrankheitMonat.Count > 0)
{
decimal dauer = 0;
foreach (var abs in urlaubKrankheitMonat)
{
var dauerAbwesenheit = vs.BerechneAnzahlUrlaubstage(null, abs, date.Year);
if (abs.Reason.Description.ToLower().Contains("urlaub"))
dc.TageUrlaub += dauerAbwesenheit * item.SollProTag;
else if (abs.Reason.Description.ToLower().Contains("krank"))
dc.TageKrank += dauerAbwesenheit * item.SollProTag;
dauer += dauerAbwesenheit;
//Dienste an einem ganzen Abwesenheitstag von den Stunden abziehen
foreach (var e in eintraegeFuerMitarbeiterMonat)
{
if (abs.AbsenceSpan.ContainsDate(e.Datum.Date))
{
if (dauerAbwesenheit > 0.5m)
stunden -= Convert.ToDecimal(e.DauerInStunden);
}
}
foreach (var v in vertretungenFuerMitarbeiterMonat)
{
if (abs.AbsenceSpan.ContainsDate(v.Datum.Date))
{
if (dauerAbwesenheit > 0.5m)
stunden -= Convert.ToDecimal(v.DauerInStunden);
}
}
}
stunden += dauer * item.SollProTag;
}
dc.Ist = stunden;
dc.Saldo = dc.Ist - dc.Soll;
monatsZusammenfassung.Add(dc);
}
return monatsZusammenfassung;
}
}
}