diff --git a/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs b/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs index c06f9960a..e04e4cb51 100644 --- a/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs +++ b/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs @@ -1694,28 +1694,40 @@ namespace BeWo.Report.ReportObjects return duration; } - //Mit "SpecialHours" sind Sonderzeiten wie Nachtzeiten oder Arbeitszeiten an Sonn und Feiertags gemeint. Da diese gesondert abgerechnet werden können. + //Mit "SpecialHours" sind Sonderzeiten wie Nachtzeiten oder Arbeitszeiten sonn- und feiertags gemeint. Da diese gesondert abgerechnet werden können. public virtual void CalculateSpecialHours(MitarbeiterstundenkontoRO.DayDetail dd, ServiceRecord sr, decimal duration) { - //Prüfe, ob der Start oder das Ende des Eintrags an einem Sonntag stattfindet, dann müssen die im Sonntag anfallenden Stunden berechnet werden - //Todo: Man müsste noch bei mehrtägigen Einträgen prüfen, ob diese vor einem Sonntag anfangen und nach einem Sonntag enden, ich weiß aber nicht, ob das in der Praxis überhaupt vorkommt und ob dann Sonntagszuschläge berechnet werden müssen + //Prüfe, ob Start oder Ende des Eintrags an einem Sonntag sind, dann die am Sonntag geleisteten Minuten berechnen + //Todo: Bei mehrtägigen Einträgen prüfen, ob sie vor einem Sonntag anfangen und nach einem Sonntag enden. Unklar, ob das vorkommen kann und ob dann Sonntagszuschläge berechnet werden müssen if (sr.Start.Value.DayOfWeek == DayOfWeek.Sunday || sr.End.Value.DayOfWeek == DayOfWeek.Sunday) { DateTime sonntag = sr.Start.Value.Date; - if (sr.Start.Value.DayOfWeek != DayOfWeek.Sunday && sr.End.Value.DayOfWeek == DayOfWeek.Sunday) { sonntag = sr.End.Value.Date; } - var minuten = GetOverlappingMinutes(sr.Start.Value, sr.End.Value, sonntag, sonntag.AddDays(1)); - - dd.HoursSunday += (decimal)minuten / 60; + var sonnatgsMinuten = GetOverlappingMinutes(sr.Start.Value, sr.End.Value, sonntag, sonntag.AddDays(1)); + dd.HoursSunday += (decimal)sonnatgsMinuten / 60; } - else if (IstFeiertag(sr.Start.Value)) + //Prüfe, ob Start oder Ende des Eintrags an einem Feiertag sind, dann die am Feiertag geleisteten Minuten berechnen + //Todo: Bei mehrtägigen Einträgen prüfen, ob sie vor einem Feiertag anfangen und nach einem Feiertag enden. Unklar, ob das vorkommen kann + else if (IstFeiertag(sr.Start.Value) || IstFeiertag(sr.End.Value)) { - dd.HoursHoliday += duration / 60; + var feiertagsMinuten = duration; + DateTime feiertag = sr.Start.Value.Date; + if (IstFeiertag(sr.Start.Value) && !IstFeiertag(sr.End.Value)) + { + feiertagsMinuten = (decimal) GetOverlappingMinutes(sr.Start.Value, sr.End.Value, feiertag, feiertag.AddDays(1)); + } + else if (!IstFeiertag(sr.Start.Value) && IstFeiertag(sr.End.Value)) + { + feiertag = sr.End.Value.Date; + feiertagsMinuten = (decimal) GetOverlappingMinutes(sr.Start.Value, sr.End.Value, feiertag, feiertag.AddDays(1)); + } + dd.HoursHoliday += feiertagsMinuten / 60; } + if (sr.Start.Value.Second == 0 && dd.NightEnd.HasValue && dd.NightStart.HasValue) { var minuten = CheckNachtzeiten(sr.Start.Value, dd.NightStart.Value, dd.NightEnd.Value, (double)duration);