129 lines
4.2 KiB
C#
129 lines
4.2 KiB
C#
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<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.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 + ")";
|
|
}
|
|
}
|
|
}
|
|
}
|