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;
+ }
+ }
+}