diff --git a/ReportImp/BetreuwoWesel/BetreuwoWesel.csproj b/ReportImp/BetreuwoWesel/BetreuwoWesel.csproj index e5055f6be..143458a89 100644 --- a/ReportImp/BetreuwoWesel/BetreuwoWesel.csproj +++ b/ReportImp/BetreuwoWesel/BetreuwoWesel.csproj @@ -58,6 +58,7 @@ + @@ -195,6 +196,7 @@ ServicesOverviewReportFLS.cs + Component diff --git a/ReportImp/BetreuwoWesel/Service/CustomDienstplanungsManager.cs b/ReportImp/BetreuwoWesel/Service/CustomDienstplanungsManager.cs new file mode 100644 index 000000000..cc461d6c0 --- /dev/null +++ b/ReportImp/BetreuwoWesel/Service/CustomDienstplanungsManager.cs @@ -0,0 +1,275 @@ +using BeWo.Data.Access; +using BeWo.Data.Entities; +using BeWo.Service.Configuration; +using BeWo.Service.Dienstplanung; +using BeWo.Service.Plugins; +using BeWo.Service.ServiceImplementations; +using BS.Shared.DataContracts; +using BS.Shared.Extensions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace BetreuwoWesel.Service +{ + public class CustomDienstplanungsManager : DienstplanungsManager + { + public override DienstplanerRootDC BuildDienstplanerRootObject(DateTime date, long wohnheimOid) + { + var anzahlZeilen = AppSettings.CreateSettings().DienstplanungStandardZeilenAnzahl; + var wh = DAOFactory.GenericDAO.GetByID(wohnheimOid); + + + + DienstplanerRootDC root = new DienstplanerRootDC(); + OperationsServiceImp os = new OperationsServiceImp(); + DienstplanungsManager manager = PluginLoader.FindClass(); + + + root.EnableDiensteAnFeiertagen = manager.SetEnableDiensteAnFeiertagen(); + root.EnableAbwesenheitenAnWochenenden = manager.SetEnableAbwesenheitenAnWochenenden(); + root.EnableSorting = SetEnableSorting(); + root.SortierMethoden = SetSortierMethoden(); + + root.ZeitraumFuerPflichtbesetzungStart = new DateTime(2000, 01, 01, 0, 0, 0); + root.ZeitraumFuerPflichtbesetzungEnde = new DateTime(2000, 01, 01, 0, 0, 0); +#if DEBUG + TimeSpan start, ende; + start = wh.PflichtbesetzungStart.IsNullOrEmpty() ? new TimeSpan(0, 0, 0) : TimeSpan.Parse(wh.PflichtbesetzungStart); + ende = wh.PflichtbesetzungEnde.IsNullOrEmpty() ? new TimeSpan(0, 0, 0) : TimeSpan.Parse(wh.PflichtbesetzungEnde); + + root.ZeitraumFuerPflichtbesetzungStart = new DateTime(2000, 01, 01, start.Hours, start.Minutes, 0); + root.ZeitraumFuerPflichtbesetzungEnde = new DateTime(2000, 01, 01, ende.Hours, ende.Minutes, 0); +#endif + root.AlleDienste = GetAllDienste(wohnheimOid).OrderBy(d => d.Start).ToList(); + root.AlleDienste.Insert(0, DienstInfoDC.Platzhalter); + + /////// + root.AbsenceTimes = GetAbsenceTimeVacationByWohnheim(wohnheimOid, date.Year, date.Month); + var ueberstundenAbsTimes = root.AbsenceTimes.Where(a => a.Reason.Description.ToLower().Contains("abbau von mehrarbeit")).ToList(); + root.AbsenceTimes.RemoveRange(ueberstundenAbsTimes); + + root.OverTimes = GetOverTimesByWohnheim(wohnheimOid, date.Year, date.Month); + foreach (var item in ueberstundenAbsTimes) + { + root.OverTimes.Add(new OvertimeDC() + { + Betrag = 0, + EmployeeOid = item.EmployeeOid, + Date = item.Start.Value, + Notice = "Abbau von Mehrarbeit", + Auszahlungsart = new AuszahlungsartDC() + { + AuszahlungsartOid = 9999, + Name = "Frei" + } + }); + } + /////// + + + root.RegelmaessigeDienste = GetRegelmaessigeDienste(wohnheimOid); + + root.TextBoxForeColor = GetColorForForeground(); + + root.AlleDienstEintraege = GetAllDienstEintraegeAsList(wohnheimOid, date.Year, date.Month); + + + #region Dienste, die eigentlich Einträge sind, aber irgendwie in Vertretungen gelandet sind, in die richtige Tabelle verschieben + + var emps = new List(); + foreach (var e in wh.Employee2WohnheimList) + emps.Add(e.Employee); + + List eintraegeToInsert = new List(); + List falscheVertretungen = new List(); + var vertretungen = DAOFactory.GenericDAO.GetAllActive().Where(v => v.WohnheimOid == wh.Oid); + + foreach (var emp in emps) + { + if (emp.Person.FirstName.Contains("Fabien")) + { + + } + falscheVertretungen = vertretungen.Where(v => v.EmployeeOid == emp.Oid && v.WohnheimOid == wh.Oid).ToList(); + + if (falscheVertretungen != null) + { + foreach (var vertretung in falscheVertretungen) + { + if (!root.AlleDienstEintraege.Any(e => e.Zeile == vertretung.Zeile && e.EmployeeOid == vertretung.EmployeeOid && e.WohnheimOid == vertretung.WohnheimOid)) + { + + var eintrag = new DienstEintrag() + { + Datum = vertretung.Datum, + DauerInStunden = vertretung.DauerInStunden, + DienstOid = vertretung.DienstOid, + EmployeeOid = vertretung.EmployeeOid, + Endzeit = vertretung.Endzeit, + IsActive = vertretung.IsActive, + Notice = vertretung.Notice, + Startzeit = vertretung.Startzeit, + Version = vertretung.Version, + WohnheimOid = vertretung.WohnheimOid, + Zeile = vertretung.Zeile + }; + eintraegeToInsert.Add(eintrag); + } + } + } + } + if (eintraegeToInsert.Count > 0) + { + + DAOFactory.GenericDAO.Insert(eintraegeToInsert); + DAOFactory.GenericDAO.Deactivate(falscheVertretungen); + } + + #endregion + + + foreach (var rd in root.RegelmaessigeDienste) + root.AlleDienstEintraege.AddRange(AddRegelmaessigeDiensteToDienstplaner(rd, root.AlleDienstEintraege, root.AlleDienstvertretungen, root.AbsenceTimes, root.Feiertage, + root.EnableDiensteAnFeiertagen, root.DienstZeilenListe, root.ZeitraumFuerPflichtbesetzungStart, root.ZeitraumFuerPflichtbesetzungEnde, root.EnableStatuszeile, date)); + + foreach (var e in root.AlleDienstEintraege) + { + + if (String.IsNullOrEmpty(e.Startzeit) || String.IsNullOrEmpty(e.Endzeit)) + { + var d = root.AlleDienste.FirstOrDefault(a => a.Oid == e.DienstOid); + if (d != null) + { + if (String.IsNullOrEmpty(e.Startzeit)) + { + e.Startzeit = String.Format("{0:HH:mm}", d.Start); + } + + if (String.IsNullOrEmpty(e.Endzeit)) + { + e.Endzeit = String.Format("{0:HH:mm}", d.Ende); + } + } + } + } + root.AlleDienstvertretungen = GetAllDienstvertretungenAsList(wohnheimOid, date.Year, date.Month); + var eintraegeAndrianarivo = root.AlleDienstEintraege.Where(dv => dv.EmployeeOid == 36).ToList(); // debug + var vertretungenAndrianarivo = root.AlleDienstvertretungen.Where(dv => dv.EmployeeOid == 36).ToList(); // debug + + root.DienstDCListe = GetDienstEintraege(wohnheimOid, date.Year, date.Month); //BP + var dienstvertretungen = GetDienstvertretungen(wohnheimOid, date.Year, date.Month); // Hier muss dringend eingebaut werden, dass bereits enthaltene Mitarbeiter ignoriert oder verrechnet werden + var dienstvertretungenAndrianarivo = dienstvertretungen.Where(dv => dv.Employee.EmployeeOid == 36).ToList(); // debug + + foreach (var dv in dienstvertretungen) + { + if (!root.DienstDCListe.Any(dc => dc.Employee.EmployeeOid == dv.Employee.EmployeeOid)) + root.DienstDCListe.Add(dv); + } + + if (wh.Sortierungsart == 0) // Alphabetisch + { + if (wh.AbsteigendeSortierung == 0) + root.DienstDCListe = root.DienstDCListe.OrderBy(d => d.Employee.LastName).ToList(); + else + root.DienstDCListe = root.DienstDCListe.OrderByDescending(d => d.Employee.LastName).ToList(); + } + else if (wh.Sortierungsart == 1) // Anzahl der Dienste + { + Dictionary diensteProMitarbeiter = new Dictionary(); + foreach (var elem in root.DienstDCListe) + { + if (!diensteProMitarbeiter.ContainsKey(elem.Employee.EmployeeOid)) + diensteProMitarbeiter.Add(elem.Employee.EmployeeOid, 0); + foreach (var dict in elem.DienstDictArray) + diensteProMitarbeiter[elem.Employee.EmployeeOid] += dict.Count; + } + + IOrderedEnumerable> diensteProMitarbeiterSortiert; + if (wh.AbsteigendeSortierung == 0) + diensteProMitarbeiterSortiert = diensteProMitarbeiter.OrderBy(d => d.Value); + else + diensteProMitarbeiterSortiert = diensteProMitarbeiter.OrderByDescending(d => d.Value); + + + var sortierteDienstDCListe = new List(); + foreach (var emp in diensteProMitarbeiterSortiert) + { + var block = root.DienstDCListe.FirstOrDefault(dc => dc.Employee.EmployeeOid == emp.Key); + if (block != null) + sortierteDienstDCListe.Add(block); + } + root.DienstDCListe = sortierteDienstDCListe; + } + else if (wh.Sortierungsart == 2) + { + if (wh.AbsteigendeSortierung == 0) + root.DienstDCListe = root.DienstDCListe.OrderBy(d => d.Employee.LastName).ToList(); + else + root.DienstDCListe = root.DienstDCListe.OrderByDescending(d => d.Employee.LastName).ToList(); + } + + + root.EnableStatuszeile = Convert.ToBoolean(wh.PflichtbesetzungEinblenden); + root.DienstZeilenListe = new List(); + + if (root.EnableStatuszeile) + root.DienstZeilenListe.Add(InitStatusZeile(date)); + + root.DienstZeilenListe.AddRange(root.DienstDCListe //BP + .SelectMany(x => Init(x, root.AlleDienste, date, wh.StandardZeilenanzahl)) + .ToList()); + + if (root.EnableStatuszeile) + { + var days = DateTime.DaysInMonth(date.Year, date.Month); + for (int i = 1; i <= days; i++) + { + root.DienstZeilenListe[0].StatusListe[i - 1].DauerhaftBesetztStatus = RefreshStatusForDay(root.AlleDienstEintraege, + root.AlleDienstvertretungen, i, root.ZeitraumFuerPflichtbesetzungStart, root.ZeitraumFuerPflichtbesetzungEnde); + } + } + + root.StatusColorTrue = "#FF228B22"; + root.StatusColorFalse = "#FFCD5C5C"; + + + List empOids = new List(); + #region EmployeeOids holen für Ist- und Saldoberechnung und die Liste der vorhandenen Mitarbeiter + // WIEDER EINKOMMENTIEREN FALLS FEHLER AUFTRETEN + //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); + //} + + foreach (var item in root.DienstDCListe) + empOids.Add((long)item.Employee.EmployeeOid); + + root.AllEmployee = new List(); + foreach (var block in root.DienstDCListe) + { + if (!root.AllEmployee.Contains(block.Employee)) + root.AllEmployee.Add(block.Employee); + } + #endregion + + var vs = PluginLoader.FindClass(); + var feiertageDaten = vs.GetFeiertage(date.Year); + root.Feiertage = new List(); + foreach (var datum in feiertageDaten) + root.Feiertage.Add(vs.GetFeiertag(datum)); + + root.MonatsZusammenfassung = BerechneSollSaldoUndIst(root, date, empOids); + + // Am Ende zu viele Einträge drin + return root; + } + } +}