MH: BetreuWo Wesel Diensplanung

This commit is contained in:
2025-09-22 11:33:05 +02:00
parent 1bfcdadaa7
commit 5cf8554ed0
2 changed files with 277 additions and 0 deletions

View File

@@ -58,6 +58,7 @@
<Reference Include="DevExpress.RichEdit.v23.2.Export, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraReports.v23.2, Version=23.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="PresentationCore" />
<Reference Include="PresentationFramework" />
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Drawing" />
@@ -195,6 +196,7 @@
<DependentUpon>ServicesOverviewReportFLS.cs</DependentUpon>
</Compile>
<Compile Include="Service\CustomCustomerService.cs" />
<Compile Include="Service\CustomDienstplanungsManager.cs" />
<Compile Include="Service\CustomEmployeeService.cs" />
<Compile Include="SettlementReport.cs">
<SubType>Component</SubType>

View File

@@ -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<Wohnheim>(wohnheimOid);
DienstplanerRootDC root = new DienstplanerRootDC();
OperationsServiceImp os = new OperationsServiceImp();
DienstplanungsManager manager = PluginLoader.FindClass<DienstplanungsManager>();
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<Employee>();
foreach (var e in wh.Employee2WohnheimList)
emps.Add(e.Employee);
List<DienstEintrag> eintraegeToInsert = new List<DienstEintrag>();
List<Dienstvertretung> falscheVertretungen = new List<Dienstvertretung>();
var vertretungen = DAOFactory.GenericDAO.GetAllActive<Dienstvertretung>().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<long?, int> diensteProMitarbeiter = new Dictionary<long?, int>();
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<KeyValuePair<long?, int>> diensteProMitarbeiterSortiert;
if (wh.AbsteigendeSortierung == 0)
diensteProMitarbeiterSortiert = diensteProMitarbeiter.OrderBy(d => d.Value);
else
diensteProMitarbeiterSortiert = diensteProMitarbeiter.OrderByDescending(d => d.Value);
var sortierteDienstDCListe = new List<DienstBlockDC>();
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<DienstZeileDC>();
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<long> empOids = new List<long>();
#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<EmployeeDC>();
foreach (var block in root.DienstDCListe)
{
if (!root.AllEmployee.Contains(block.Employee))
root.AllEmployee.Add(block.Employee);
}
#endregion
var vs = PluginLoader.FindClass<VacationService>();
var feiertageDaten = vs.GetFeiertage(date.Year);
root.Feiertage = new List<FeiertagDC>();
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;
}
}
}