MH x Claude: Optimierung der Dienstsuche zur Pausenberechnung
This commit is contained in:
@@ -40,6 +40,7 @@ namespace BeWo.View.Detail.Report
|
||||
|
||||
private Dictionary<long, List<AbsenceTimeDC>> _AbsenceTimesDict;
|
||||
private Dictionary<long, List<OvertimeDC>> _OverTimesDict;
|
||||
private Dictionary<long, DienstInfoDC> _DienstProOidDict; // Claude: schneller Pausen-Lookup statt Listen-Suche pro Eintrag
|
||||
|
||||
private CompactWohnheimDC _AuswahlWohnheim;
|
||||
private DienstZeileDC _AuswahlDienstZeileDC;
|
||||
@@ -1815,12 +1816,12 @@ namespace BeWo.View.Detail.Report
|
||||
if (eintraegeEinerWoche != null)
|
||||
{
|
||||
foreach (var eintrag in eintraegeEinerWoche)
|
||||
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstplanerRootObj.AlleDienste)); // Claude: Pause abziehen
|
||||
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstProOidDict)); // Claude: Pause abziehen
|
||||
}
|
||||
if (vertretungenEinerWoche != null)
|
||||
{
|
||||
foreach (var vertretung in vertretungenEinerWoche)
|
||||
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstplanerRootObj.AlleDienste)); // Claude: Pause abziehen
|
||||
stundenWoche.Add(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstProOidDict)); // Claude: Pause abziehen
|
||||
}
|
||||
if (ueberstundenEinerWoche != null)
|
||||
{
|
||||
@@ -2130,7 +2131,7 @@ namespace BeWo.View.Detail.Report
|
||||
{
|
||||
if (tage.Contains(e.Datum))
|
||||
{
|
||||
res.Add(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, _DienstplanerRootObj.AlleDienste) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
res.Add(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, _DienstProOidDict) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
//_DienstplanerRootObj.MonatsZusammenfassung // Abzug von Monats-Ist
|
||||
// .First(z => z.Employee.EmployeeOid == e.EmployeeOid).Ist -= Convert.ToDecimal(e.DauerInStunden);
|
||||
}
|
||||
@@ -2142,7 +2143,7 @@ namespace BeWo.View.Detail.Report
|
||||
{
|
||||
if (tage.Contains(v.Datum))
|
||||
{
|
||||
res.Add(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, _DienstplanerRootObj.AlleDienste) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
res.Add(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, _DienstProOidDict) * -1); // Abzug von Wochen-Ist // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
//_DienstplanerRootObj.MonatsZusammenfassung // Abzug von Monats-Ist
|
||||
// .First(z => z.Employee.EmployeeOid == v.EmployeeOid).Ist -= Convert.ToDecimal(v.DauerInStunden);
|
||||
}
|
||||
@@ -2247,6 +2248,9 @@ namespace BeWo.View.Detail.Report
|
||||
}
|
||||
_OverTimesDict = overtimeTemp;
|
||||
|
||||
// Claude: Lookup-Dictionary für den Pausenabzug einmalig aufbauen
|
||||
_DienstProOidDict = DienstInfoDC.BuildDienstProOidDictionary(_DienstplanerRootObj.AlleDienste);
|
||||
|
||||
_GridControl.ItemsSource = _DienstplanerRootObj.DienstZeilenListe;
|
||||
}
|
||||
|
||||
@@ -2583,8 +2587,8 @@ namespace BeWo.View.Detail.Report
|
||||
private List<DienstplanerMonthlySummaryDC> CheckEintragAnAbwesenheitstagen(DienstEintragDC eintrag, DienstvertretungDC vertretung, EmployeeDC employee, bool plus)
|
||||
{
|
||||
// Claude: Pause des Dienstes von der Dauer abziehen, damit Ist/Saldo beim Eintragen/Löschen genauso berechnet werden wie beim Neuladen (BerechneSollSaldoUndIst)
|
||||
decimal dauerEintrag = eintrag != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstplanerRootObj.AlleDienste)) : 0m;
|
||||
decimal dauerVertretung = vertretung != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstplanerRootObj.AlleDienste)) : 0m;
|
||||
decimal dauerEintrag = eintrag != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, _DienstProOidDict)) : 0m;
|
||||
decimal dauerVertretung = vertretung != null ? Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, _DienstProOidDict)) : 0m;
|
||||
|
||||
if (!_DienstplanerRootObj.EnableDiensteAnFeiertagen)
|
||||
{
|
||||
|
||||
@@ -878,6 +878,9 @@ namespace BeWo.Service.Dienstplanung
|
||||
List<DienstplanerMonthlySummaryDC> monatsZusammenfassung = new List<DienstplanerMonthlySummaryDC>();
|
||||
root.StundenBeiAbwesenheit = new Dictionary<long?, decimal>();
|
||||
|
||||
// Claude: Lookup-Dictionary einmalig aufbauen statt pro Eintrag die Dienstliste zu durchsuchen
|
||||
var dienstProOid = DienstInfoDC.BuildDienstProOidDictionary(root.AlleDienste);
|
||||
|
||||
foreach (var item in konto.EmployeeDetailList)
|
||||
{
|
||||
root.StundenBeiAbwesenheit.Add(item.Employee.Oid, item.SollProTag);
|
||||
@@ -906,13 +909,13 @@ namespace BeWo.Service.Dienstplanung
|
||||
foreach (var eintrag in eintraegeFuerMitarbeiterMonat)
|
||||
{
|
||||
// Claude: Pause des Dienstes von der Dauer abziehen
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, root.AlleDienste));
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, dienstProOid));
|
||||
}
|
||||
}
|
||||
if (vertretungenFuerMitarbeiterMonat.Count > 0)
|
||||
{
|
||||
foreach (var vertretung in vertretungenFuerMitarbeiterMonat)
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, root.AlleDienste)); // Claude: Pause abziehen
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, dienstProOid)); // Claude: Pause abziehen
|
||||
}
|
||||
if (overTimesMonat.Count > 0)
|
||||
{
|
||||
@@ -1011,7 +1014,7 @@ namespace BeWo.Service.Dienstplanung
|
||||
if (abs.AbsenceSpan.ContainsDate(e.Datum.Date))
|
||||
{
|
||||
if (dauerAbwesenheit > 0.5m)
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, root.AlleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
}
|
||||
}
|
||||
foreach (var v in vertretungenFuerMitarbeiterMonat)
|
||||
@@ -1019,7 +1022,7 @@ namespace BeWo.Service.Dienstplanung
|
||||
if (abs.AbsenceSpan.ContainsDate(v.Datum.Date))
|
||||
{
|
||||
if (dauerAbwesenheit > 0.5m)
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, root.AlleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1069,8 +1072,18 @@ namespace BeWo.Service.Dienstplanung
|
||||
berechnung.CreateReport(konto);
|
||||
DienstplanerMonthlySummaryDC dc = new DienstplanerMonthlySummaryDC();
|
||||
|
||||
// Claude: Dienste laden, um deren Pausen von der Dauer der Einträge abziehen zu können
|
||||
var alleDienste = GetAllDienste(null);
|
||||
// Claude: Nur die von diesem Mitarbeiter tatsächlich verwendeten Dienste laden (statt aller Dienste),
|
||||
// um deren Pausen von der Dauer der Einträge abziehen zu können
|
||||
var dienstProOid = new Dictionary<long, DienstInfoDC>();
|
||||
var verwendeteDienstOids = dienstEintraege.Where(x => x.EmployeeOid == empOid).Select(x => x.DienstOid)
|
||||
.Concat(dienstvertretungen.Where(x => x.EmployeeOid == empOid).Select(x => x.DienstOid))
|
||||
.Distinct();
|
||||
foreach (var dienstOid in verwendeteDienstOids)
|
||||
{
|
||||
var dienstEntity = DAOFactory.GenericDAO.GetByID<DienstInfo>(dienstOid);
|
||||
if (dienstEntity != null)
|
||||
dienstProOid.Add(dienstOid, MapperFactory.DienstInfoDC_DienstInfo.MapToNewDC(dienstEntity));
|
||||
}
|
||||
|
||||
stundenBeiAbwesenheitKey = empOid;
|
||||
stundenBeiAbwesenheitValue = 0;
|
||||
@@ -1101,13 +1114,13 @@ namespace BeWo.Service.Dienstplanung
|
||||
foreach (var eintrag in eintraegeFuerMitarbeiterMonat)
|
||||
{
|
||||
// Claude: Pause des Dienstes von der Dauer abziehen
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, alleDienste));
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(eintrag.DauerInStunden, eintrag.DienstOid, dienstProOid));
|
||||
}
|
||||
}
|
||||
if (vertretungenFuerMitarbeiterMonat.Count > 0)
|
||||
{
|
||||
foreach (var vertretung in vertretungenFuerMitarbeiterMonat)
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, alleDienste)); // Claude: Pause abziehen
|
||||
stunden += Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(vertretung.DauerInStunden, vertretung.DienstOid, dienstProOid)); // Claude: Pause abziehen
|
||||
}
|
||||
if (overTimesMonat.Count > 0)
|
||||
{
|
||||
@@ -1145,7 +1158,7 @@ namespace BeWo.Service.Dienstplanung
|
||||
if (abs.AbsenceSpan.ContainsDate(e.Datum.Date))
|
||||
{
|
||||
if (dauerAbwesenheit > 0.5m)
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, alleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(e.DauerInStunden, e.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
}
|
||||
}
|
||||
foreach (var v in vertretungenFuerMitarbeiterMonat)
|
||||
@@ -1153,7 +1166,7 @@ namespace BeWo.Service.Dienstplanung
|
||||
if (abs.AbsenceSpan.ContainsDate(v.Datum.Date))
|
||||
{
|
||||
if (dauerAbwesenheit > 0.5m)
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, alleDienste)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
stunden -= Convert.ToDecimal(DienstInfoDC.DauerAbzueglichPause(v.DauerInStunden, v.DienstOid, dienstProOid)); // Claude: gleicher Pausenabzug wie beim Aufaddieren
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,23 +85,30 @@ namespace BS.Shared.DataContracts
|
||||
return dauer > 0 ? dauer : 0;
|
||||
}
|
||||
|
||||
// Claude: Überladung, die den Dienst anhand der DienstOid aus einer Liste sucht (unbekannte Oid => kein Abzug)
|
||||
public static double DauerAbzueglichPause(double dauerInStunden, long dienstOid, IEnumerable<DienstInfoDC> dienste)
|
||||
// Claude: Überladung mit Dictionary (DienstOid => Dienst) für schnelle Lookups in Schleifen (unbekannte Oid => kein Abzug)
|
||||
public static double DauerAbzueglichPause(double dauerInStunden, long dienstOid, IDictionary<long, DienstInfoDC> dienstProOid)
|
||||
{
|
||||
DienstInfoDC dienst = null;
|
||||
if (dienstProOid != null)
|
||||
dienstProOid.TryGetValue(dienstOid, out dienst);
|
||||
|
||||
return DauerAbzueglichPause(dauerInStunden, dienst);
|
||||
}
|
||||
|
||||
// Claude: Baut das Lookup-Dictionary für die Überladung oben einmalig auf
|
||||
public static Dictionary<long, DienstInfoDC> BuildDienstProOidDictionary(IEnumerable<DienstInfoDC> dienste)
|
||||
{
|
||||
var dict = new Dictionary<long, DienstInfoDC>();
|
||||
if (dienste != null)
|
||||
{
|
||||
foreach (var d in dienste)
|
||||
{
|
||||
if (d != null && d.Oid == dienstOid)
|
||||
{
|
||||
dienst = d;
|
||||
break;
|
||||
}
|
||||
if (d != null && d.Oid.HasValue && !dict.ContainsKey(d.Oid.Value))
|
||||
dict.Add(d.Oid.Value, d);
|
||||
}
|
||||
}
|
||||
|
||||
return DauerAbzueglichPause(dauerInStunden, dienst);
|
||||
return dict;
|
||||
}
|
||||
|
||||
public string DarstellungInPopUp
|
||||
|
||||
Reference in New Issue
Block a user