Mittelpunkt: Im Zuschläge-Arbeit-Bericht Zuschlag für geplante Abwesenheiten berechnen
SupportOID=160128
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user