using System; using System.Collections.Generic; using System.Diagnostics; using System.Drawing; using System.Runtime.Serialization; using BS.Shared.Core; namespace BS.Shared.DataContracts { [DebuggerDisplay("{DienstName}: {Start}-{Ende} ({Dauer}h)")] public class DienstInfoDC : IDataContract { [DataMember] public long? Oid { get; set; } [DataMember] public string Notice { get; set; } [DataMember] public long? Version { get; set; } [DataMember] public string DienstName { get; set; } [DataMember] public string Kurz { get; set; } [DataMember] public string Farbe { get; set; } [DataMember] public DateTime Start { get; set; } [DataMember] public DateTime Ende { get; set; } [DataMember] public int Pause { get; set; } [DataMember] public WohnheimDC Wohnheim{ get; set; } [DataMember] public double Dauer { get; set; } [DataMember] public DienstInfoDC UmschließenderDienst { get; set; } public override string ToString() { return Kurz; } public override bool Equals(object obj) { return obj is DienstInfoDC d && Oid == d.Oid; } public override int GetHashCode() { return GetType().Name.GetHashCode() ^ Oid.GetHashCode(); } public static DienstInfoDC Platzhalter => new DienstInfoDC { Farbe = "#FFFFFFFF", Oid = -1, Notice = "!?" }; public bool IsPlatzhalter => Oid == -1; //public double DurationHours => Start < Ende ? (Ende - Start).TotalHours : (Ende.AddDays(1) - Start).TotalHours; public double DurationHours => Dauer; // Claude: Zieht die am Dienst gepflegte Pause (in Minuten) von einer Dauer (in Stunden) ab, nie unter 0. // Wird im Dienstplaner für Wochen-Ist, Monats-Ist und Monatssaldo verwendet — die gespeicherte DauerInStunden bleibt unverändert. public static double DauerAbzueglichPause(double dauerInStunden, DienstInfoDC dienst) { if (dienst == null || dienst.Pause <= 0) return dauerInStunden; var dauer = dauerInStunden - dienst.Pause / 60.0; return dauer > 0 ? dauer : 0; } // 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 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 BuildDienstProOidDictionary(IEnumerable dienste) { var dict = new Dictionary(); if (dienste != null) { foreach (var d in dienste) { if (d != null && d.Oid.HasValue && !dict.ContainsKey(d.Oid.Value)) dict.Add(d.Oid.Value, d); } } return dict; } public string DarstellungInPopUp { get { string vonStunden = Start.TimeOfDay.Hours < 10 ? "0" + Start.TimeOfDay.Hours : Start.TimeOfDay.Hours.ToString(); string vonMinuten = Start.TimeOfDay.Minutes < 10 ? "0" + Start.TimeOfDay.Minutes : Start.TimeOfDay.Minutes.ToString(); string bisStunden = Ende.TimeOfDay.Hours < 10 ? "0" + Ende.TimeOfDay.Hours : Ende.TimeOfDay.Hours.ToString(); string bisMinuten = Ende.TimeOfDay.Minutes < 10 ? "0" + Ende.TimeOfDay.Minutes : Ende.TimeOfDay.Minutes.ToString(); string vonbis = vonStunden + ":" + vonMinuten + " Uhr - " + bisStunden + ":" + bisMinuten + " Uhr"; return string.IsNullOrEmpty(Kurz) ? "" : vonbis + " (" + DienstName + ")"; } } } }