diff --git a/ReportImp/HwHilfswerkInklusionUndTeilhabe/CustomMitarbeiterstundenkontoBerechnung.cs b/ReportImp/HwHilfswerkInklusionUndTeilhabe/CustomMitarbeiterstundenkontoBerechnung.cs index 9096af582..88997a391 100644 --- a/ReportImp/HwHilfswerkInklusionUndTeilhabe/CustomMitarbeiterstundenkontoBerechnung.cs +++ b/ReportImp/HwHilfswerkInklusionUndTeilhabe/CustomMitarbeiterstundenkontoBerechnung.cs @@ -1,5 +1,6 @@ using BeWo.Data.Entities; using BeWo.Report.ReportObjects; +using BS.Shared; // Claude: für ActivationTypeId using BS.Shared.Core; using BS.Shared.Extensions; using DevExpress.Utils.Filtering.Internal; @@ -38,6 +39,19 @@ namespace HwHilfswerkInklusionUndTeilhabe dd.BreakMinutes2 = 0; } + // Claude: Feiertagsgutschrift (WeeklyTotalHours / WeeklyDays bei Ambulant-Vertrag) + // auch in der Tagesansicht als Arbeitszeit darstellen. + if (dd.Feiertag != null) + { + var gutschrift = GetFeiertagsGutschriftStunden(ed != null ? ed.Employee : null, date) * GetFeiertagsFaktor(date); + if (gutschrift > 0 && MussAnTagGearbeitetWerden(ed, date)) + { + dd.MinutesTotal = gutschrift * 60; + TimeSpan tspan = TimeSpan.FromMinutes((double)dd.MinutesTotal); + dd.TimeTotal = String.Format("{0:00}:{1:00}", tspan.Hours, tspan.Minutes); + } + } + return dd; } @@ -126,10 +140,91 @@ namespace HwHilfswerkInklusionUndTeilhabe return sum; } + #region Feiertagsgutschrift (nur Vertragsart "Ambulant") + + // Claude: Bei Vertragsart "Ambulant" wird an Feiertagen automatisch + // contract.WeeklyTotalHours / contract.WeeklyDays als Arbeitszeit gutgeschrieben - + // aber nur, wenn an dem Tag laut Vertrag/Arbeitszeiten überhaupt gearbeitet werden + // müsste (Tagessoll ohne Feiertagsbetrachtung > 0). Ein Feiertag an einem Samstag + // (z.B. 03.10.2026) erzeugt bei einer Mo-Fr-Woche also keine Gutschrift. + // Die Gutschrift läuft über BerechneGesamtArbeitszeitDurchFeiertage und wird in der + // Basisklasse auf StundenGesamtIst addiert (bzw. in der Vormonatsberechnung vom Soll + // abgezogen) - sie wirkt damit direkt auf die Überstunden, nicht nur auf die Anzeige. + // Das Monatssoll bleibt unverändert (Standardverhalten der Basisklasse). + + // Claude: Schalter nur für MussAnTagGearbeitetWerden: Die Basisklasse setzt das + // Tagessoll an Feiertagen sonst immer auf 0, für die Prüfung "müsste an dem Tag + // gearbeitet werden?" muss der Feiertag aber ausgeblendet werden. + private bool feiertagBeiSollBerechnungIgnorieren = false; + + public override bool BerechneFeiertageAlsArbeitszeit() + { + return feiertagBeiSollBerechnungIgnorieren; + } + + // Claude: true, wenn der Mitarbeiter an dem Tag laut Vertrag/Arbeitszeiten arbeiten + // müsste, d.h. das Tagessoll (ohne Feiertagsbetrachtung) größer 0 ist. + private bool MussAnTagGearbeitetWerden(MitarbeiterstundenkontoRO.EmployeeDetail ed, DateTime tag) + { + feiertagBeiSollBerechnungIgnorieren = true; + try + { + return BerechneSollStundenFuerTag(ed, tag) > 0; + } + finally + { + feiertagBeiSollBerechnungIgnorieren = false; + } + } + + // Claude: Gutschrift-Stunden für einen Feiertag laut Vertrag; 0, wenn an dem Tag kein + // Ambulant-Vertrag gilt oder keine Wochenstunden hinterlegt sind. + private decimal GetFeiertagsGutschriftStunden(Employee emp, DateTime tag) + { + if (emp == null) + return 0; + + var contract = emp.GetValidContractForDate(tag); + if (!HatEmployeeAmbulantContract(contract)) + return 0; + + if (!contract.WeeklyTotalHours.HasValue || contract.WeeklyTotalHours.Value <= 0) + return 0; + + decimal weeklyDays = 5; + if (contract.WeeklyDays.HasValue && contract.WeeklyDays.Value > 0) + { + weeklyDays = contract.WeeklyDays.Value; + } + + return contract.WeeklyTotalHours.Value / weeklyDays; + } + + public override decimal BerechneGesamtArbeitszeitDurchFeiertage(MitarbeiterstundenkontoRO.EmployeeDetail ed, DateTime start, DateTime ende) + { + decimal az = 0; + if (ed != null && ed.Employee != null && ed.Employee.IsActive == ActivationTypeId.Active) + { + DateTime dt = start; + while (dt < ende) + { + var faktor = GetFeiertagsFaktor(dt); + if (faktor > 0 && MussAnTagGearbeitetWerden(ed, dt)) + { + az += GetFeiertagsGutschriftStunden(ed.Employee, dt) * faktor; + } + dt = dt.AddDays(1); + } + } + return az; + } + + #endregion + private bool HatEmployeeAmbulantContract(Contract contract) { bool ambulant = false; - if (contract.ContractTypeValueListEntry != null && contract.ContractTypeValueListEntry.Value.IsNotNullOrEmpty()) + if (contract != null && contract.ContractTypeValueListEntry != null && contract.ContractTypeValueListEntry.Value.IsNotNullOrEmpty()) { if (contract.ContractTypeValueListEntry.Value.ToLower().Contains("ambulant")) ambulant = true;