Mittelpunkt: Im Zuschläge-Arbeit-Bericht Zuschlag für geplante Abwesenheiten berechnen

SupportOID=160128
This commit is contained in:
2026-04-15 10:18:44 +02:00
parent c272ab474c
commit 750a7b91a2

View File

@@ -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<MitarbeiterstundenkontoRO>
{
using BS.Shared.Extensions;
namespace Mittelpunkt
{
public partial class ZuschlaegeArbeit : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<MitarbeiterstundenkontoRO>
{
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<Employee> employees = DAOFactory.GenericDAO.GetAllActiveAndArchived<Employee>();
Dictionary<long, Employee> empDict = new Dictionary<long, Employee>();
foreach (var item in employees)
{
empDict.Add(item.Oid.Value, item);
}
DateTime monatsAnfang = pRO.ReportStartDate;
LesePreise(monatsAnfang);
IList<Employee> employees = DAOFactory.GenericDAO.GetAllActiveAndArchived<Employee>();
Dictionary<long, Employee> empDict = new Dictionary<long, Employee>();
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<AbsenceTime> 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;
}
}
}
}