From 750a7b91a2eb296d3a7c6145f4c02476c9ea97fe Mon Sep 17 00:00:00 2001 From: Kojo Date: Wed, 15 Apr 2026 10:18:44 +0200 Subject: [PATCH] =?UTF-8?q?Mittelpunkt:=20Im=20Zuschl=C3=A4ge-Arbeit-Beric?= =?UTF-8?q?ht=20Zuschlag=20f=C3=BCr=20geplante=20Abwesenheiten=20berechnen?= =?UTF-8?q?=20SupportOID=3D160128?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReportImp/Mittelpunkt/ZuschlaegeArbeit.cs | 185 +++++++++++++++------- 1 file changed, 129 insertions(+), 56 deletions(-) diff --git a/ReportImp/Mittelpunkt/ZuschlaegeArbeit.cs b/ReportImp/Mittelpunkt/ZuschlaegeArbeit.cs index 417161d72..e97ef4f5e 100644 --- a/ReportImp/Mittelpunkt/ZuschlaegeArbeit.cs +++ b/ReportImp/Mittelpunkt/ZuschlaegeArbeit.cs @@ -1,44 +1,44 @@ -using System; +using System; using System.Collections.Generic; using System.Linq; using BeWo.Data.Access; using BeWo.Data.Entities; -using BeWo.Report; -using BeWo.Report.ReportObjects; +using BeWo.Report; +using BeWo.Report.ReportObjects; using BeWo.Service.DCEntityMapper; using BS.Shared; using BS.Shared.Core; -using BS.Shared.Extensions; - -namespace Mittelpunkt -{ - public partial class ZuschlaegeArbeit : DevExpress.XtraReports.UI.XtraReport, IBeWoReport - { +using BS.Shared.Extensions; + +namespace Mittelpunkt +{ + public partial class ZuschlaegeArbeit : DevExpress.XtraReports.UI.XtraReport, IBeWoReport + { private decimal wechselschichtZulageMtl = 0; - private decimal wechselschichtZulageStdl = 0; + private decimal wechselschichtZulageStdl = 0; private decimal schichtarbeitZulageMtl = 0; - private decimal schichtarbeitZulageStdl = 0; - - public ZuschlaegeArbeit() - { - InitializeComponent(); - } - - public void SetReportDataSource(MitarbeiterstundenkontoRO pRO) - { - var msb = new CustomMitarbeiterstundenkontoBerechnung(); + private decimal schichtarbeitZulageStdl = 0; + + public ZuschlaegeArbeit() + { + InitializeComponent(); + } + + public void SetReportDataSource(MitarbeiterstundenkontoRO pRO) + { + var msb = new CustomMitarbeiterstundenkontoBerechnung(); msb.CreateReport(pRO); - IList employees = DAOFactory.GenericDAO.GetAllActiveAndArchived(); - Dictionary empDict = new Dictionary(); - foreach (var item in employees) - { - empDict.Add(item.Oid.Value, item); - } - - DateTime monatsAnfang = pRO.ReportStartDate; - LesePreise(monatsAnfang); - + IList employees = DAOFactory.GenericDAO.GetAllActiveAndArchived(); + Dictionary empDict = new Dictionary(); + foreach (var item in employees) + { + empDict.Add(item.Oid.Value, item); + } + + DateTime monatsAnfang = pRO.ReportStartDate; + LesePreise(monatsAnfang); + foreach (var empDetail in pRO.EmployeeDetailList) { // Custom1 Stundensatz @@ -50,12 +50,17 @@ namespace Mittelpunkt if (isLMHD) { - // Custom 16+17 Abwesenheiten der letzten drei Monate + // Custom 16+17 geplante Abwesenheiten decimal geplanteAbwesenheitsTage = ErmittleGeplanteAbwesenheitsTage(monatsAnfang, empDetail.Employee.AbsenceTimes); if (geplanteAbwesenheitsTage > 0) { empDetail.Custom16 = geplanteAbwesenheitsTage; + decimal vormonatsZuschlaege = 0; + for (int i = 1; i <= 3; i++) + vormonatsZuschlaege += BerechneZuschlagssummeFuerMonat(empDetail.Employee, monatsAnfang.AddMonths(-i)); + if (vormonatsZuschlaege > 0) + empDetail.Custom17 = Math.Round((vormonatsZuschlaege / 3 / 31) * geplanteAbwesenheitsTage, 2, MidpointRounding.AwayFromZero); } } @@ -68,17 +73,17 @@ namespace Mittelpunkt foreach (var day in empDetail.Days) { var alleRecordsAnDiesemTag = empDetail.AllServiceRecords.Where(s => s.Start.Value.Date == day.Date.Date).ToList(); - + foreach (var sr in alleRecordsAnDiesemTag) //day.ServiceRecords) - { - var d1 = sr.Start.Value; - + { + var d1 = sr.Start.Value; + var duration = sr.GroupRoundedDuration != null ? Convert.ToDouble(sr.GroupRoundedDuration.Value) : sr.DurationMinutes; var unroundedEnd = d1.AddMinutes(duration); // Custom2+3 Samstagsarbeit 13-21 Uhr - var samstag = d1.GetNextDayOfWeek(DayOfWeek.Saturday); - var samstagStart = new DateTime(samstag.Year, samstag.Month, samstag.Day, 13, 0, 0); + var samstag = d1.GetNextDayOfWeek(DayOfWeek.Saturday); + var samstagStart = new DateTime(samstag.Year, samstag.Month, samstag.Day, 13, 0, 0); var samstagEnde = new DateTime(samstag.Year, samstag.Month, samstag.Day, 21, 0, 0); empDetail.Custom2 += Math.Round((decimal)d1.GetIntersectingMinutes(unroundedEnd, samstagStart, samstagEnde) / 60, 2, MidpointRounding.AwayFromZero); @@ -118,15 +123,15 @@ namespace Mittelpunkt { anzahlNachtschichten++; empDetail.Custom8 += day.SpecialHours; - } - + } + if (day.MinutesTotal >= 420 && day.StartDateTime1 != null && day.EndDateTime1 != null) { if (((DateTime)day.StartDateTime1).Hour < 8 && ((DateTime)day.EndDateTime1).Hour < 15) { - anzahlFruehschichten++; + anzahlFruehschichten++; fruehschichtMinuten += day.MinutesTotal; - } + } else if (((DateTime)day.StartDateTime1).Hour > 13 && ((DateTime)day.EndDateTime1).Hour > 20) { anzahlSpaetschichten++; @@ -150,7 +155,7 @@ namespace Mittelpunkt empDetail.Custom9 = empDetail.Custom8 * empDetail.Custom1 * 0.2m; empDetail.Custom23 = empDetail.Custom22 * empDetail.Custom1 * 0.2m; - // Wechselschicht- und Schichtzulagen nur für LMHD-Mitarbeiter + // Wechselschicht- und Schichtzulagen nur fuer LMHD-Mitarbeiter if (isLMHD) { // Wechselschichtzulagen wenn es Nachtschichten gab und zusaetzlich auch Frueh- oder Spaetschichten @@ -182,11 +187,11 @@ namespace Mittelpunkt } // Summe Zulagen (Sa, So, Nacht, Feiertag) - empDetail.Bu = empDetail.Custom3 + empDetail.Custom5 + empDetail.Custom7 + empDetail.Custom9 + empDetail.Bu = empDetail.Custom3 + empDetail.Custom5 + empDetail.Custom7 + empDetail.Custom9 + empDetail.Custom19 + empDetail.Custom21 + empDetail.Custom23; - } - - this.bindingSource1.DataSource = pRO; + } + + this.bindingSource1.DataSource = pRO; } private void LesePreise(DateTime datum) @@ -239,8 +244,8 @@ namespace Mittelpunkt var varFieldValue = BS.Shared.Core.Utils.XMLDeserializeFromString(vv.SerializedValue, Type.GetType(vv.TypeName)); if (varFieldValue != null) { - Decimal.TryParse(varFieldValue.ToString(), out stundensatzFuerZuschlaege); - } + Decimal.TryParse(varFieldValue.ToString(), out stundensatzFuerZuschlaege); + } } } return stundensatzFuerZuschlaege; @@ -256,24 +261,24 @@ namespace Mittelpunkt var varFieldValue = BS.Shared.Core.Utils.XMLDeserializeFromString(vv.SerializedValue, Type.GetType(vv.TypeName)); if (varFieldValue != null) { - Boolean.TryParse(varFieldValue.ToString(), out lmhd); - } + Boolean.TryParse(varFieldValue.ToString(), out lmhd); + } } } return lmhd; } private decimal ErmittleGeplanteAbwesenheitsTage(DateTime monatsAnfang, IList absenceTimes) - { + { DateTime folgeMonatsAnfang = monatsAnfang.AddMonths(1); decimal geplanteAbwesenheitsTage = 0; - foreach(var at in absenceTimes) + foreach (var at in absenceTimes) { if (at.AbsenceReason.Description.ToLower().StartsWith("urlaub")) { if (at.Start.Value.Date >= monatsAnfang && (at.End.HasValue && at.End.Value < folgeMonatsAnfang)) - { + { DateTimeSpan span = new DateTimeSpan(); span.StartDate = monatsAnfang; @@ -289,11 +294,79 @@ namespace Mittelpunkt } geplanteAbwesenheitsTage += span.EndDate.Subtract(span.StartDate).Days + 1; ; - } + } } } return geplanteAbwesenheitsTage; - } + } + + private decimal BerechneZuschlagssummeFuerMonat(Employee employee, DateTime monatsAnfang) + { + var vormonatRO = MitarbeiterstundenkontoRO.Create(employee.Oid, null, monatsAnfang, monatsAnfang.AddMonths(1), null); + var vormonatMsb = new CustomMitarbeiterstundenkontoBerechnung(); + vormonatMsb.CreateReport(vormonatRO); + + var empDetail = vormonatRO.EmployeeDetailList.FirstOrDefault(); + if (empDetail == null) + return 0; + + decimal stundensatz = ErmittleStundensatz(empDetail.Employee, monatsAnfang); + if (!(stundensatz > 0)) + return 0; + + foreach (var day in empDetail.Days) + { + var alleRecordsAnDiesemTag = empDetail.AllServiceRecords.Where(s => s.Start.Value.Date == day.Date.Date).ToList(); + + foreach (var sr in alleRecordsAnDiesemTag) + { + var d1 = sr.Start.Value; + var duration = sr.GroupRoundedDuration != null ? Convert.ToDouble(sr.GroupRoundedDuration.Value) : sr.DurationMinutes; + var unroundedEnd = d1.AddMinutes(duration); + + var samstag = d1.GetNextDayOfWeek(DayOfWeek.Saturday); + var samstagStart = new DateTime(samstag.Year, samstag.Month, samstag.Day, 13, 0, 0); + var samstagEnde = new DateTime(samstag.Year, samstag.Month, samstag.Day, 21, 0, 0); + empDetail.Custom2 += Math.Round((decimal)d1.GetIntersectingMinutes(unroundedEnd, samstagStart, samstagEnde) / 60, 2, MidpointRounding.AwayFromZero); + + if (sr.ServiceDescription != null && sr.ServiceDescription.Name.Trim().ToLower().Equals("krank (x)")) + { + DateTime sonntag = sr.Start.Value.Date; + if (sr.Start.Value.DayOfWeek != DayOfWeek.Sunday && sr.End.Value.DayOfWeek == DayOfWeek.Sunday) + sonntag = sr.End.Value.Date; + empDetail.Custom18 += Math.Round((decimal)d1.GetIntersectingMinutes(unroundedEnd, sonntag, sonntag.AddDays(1)) / 60, 2, MidpointRounding.AwayFromZero); + + DateTime feiertag = sr.Start.Value.Date; + if (!day.IstFeiertag) + feiertag = sr.End.Value.Date; + empDetail.Custom20 += Math.Round((decimal)d1.GetIntersectingMinutes(unroundedEnd, feiertag, feiertag.AddDays(1)) / 60, 2, MidpointRounding.AwayFromZero); + + if (day.NightEnd.HasValue && day.NightStart.HasValue) + { + DateTime nachtStart = sr.Start.Value.AddHours(day.NightStart.Value); + DateTime nachtEnde = sr.Start.Value.AddDays(1).AddHours(day.NightEnd.Value); + empDetail.Custom22 += Math.Round((decimal)d1.GetIntersectingMinutes(unroundedEnd, nachtStart, nachtEnde) / 60, 2, MidpointRounding.AwayFromZero); + } + } + } + + empDetail.Custom4 += day.HoursSunday; + empDetail.Custom6 += day.HoursHoliday; + if (day.SpecialHours > 0) + empDetail.Custom8 += day.SpecialHours; + } + + empDetail.Custom3 = empDetail.Custom2 * stundensatz * 0.2m; + empDetail.Custom5 = empDetail.Custom4 * stundensatz * 0.25m; + empDetail.Custom19 = empDetail.Custom18 * stundensatz * 0.25m; + empDetail.Custom7 = empDetail.Custom6 * stundensatz * 0.35m; + empDetail.Custom21 = empDetail.Custom20 * stundensatz * 0.35m; + empDetail.Custom9 = empDetail.Custom8 * stundensatz * 0.2m; + empDetail.Custom23 = empDetail.Custom22 * stundensatz * 0.2m; + + return empDetail.Custom3 + empDetail.Custom5 + empDetail.Custom7 + empDetail.Custom9 + + empDetail.Custom19 + empDetail.Custom21 + empDetail.Custom23; + } } -} +}