Files
BeWoPlaner/ReportImp/SKMKrefeld/CustomMitarbeiterstundenkontoBerechnung.cs

83 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BeWo.Service.Configuration;
using BS.Shared.Core;
namespace SkmKrefeld
{
public class CustomMitarbeiterStundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
{
public override void CreateEmployeeDetails(MitarbeiterstundenkontoRO ro)
{
base.CreateEmployeeDetails(ro);
foreach (var ed in ro.EmployeeDetailList)
{
if (ed.Employee.AbsenceTimes != null)
{
var absFls = GetAbsenceFLS(ed, ed.Employee.AbsenceTimes.ToList(), ro.ReportStartDate, ro.ReportEndDate);
ed.FlsIst += absFls;
ed.FlsDiff += absFls;
}
}
}
public decimal GetAbsenceFLS(MitarbeiterstundenkontoRO.EmployeeDetail ed, List<AbsenceTime> absenceTimes, DateTime start, DateTime end)
{
decimal absFls = 0;
decimal flsFaktor = 0;
foreach (var abs in absenceTimes)
{
// Je nachdem, ob beim Mitarbeiter als Tätigkeitsschwerpunkt "Ergänzende Betreuungskraft" oder "Fallverantwortung" hinterlegt ist,
// müssen bei "SKM interne Fortbildung" auf das FLS-Ist 85% bzw 75% der Zeit der Abwesenheitszeit draufaddiert werden
if (abs.AbsenceReason.Description.ToLower().Contains("skm-interne veranstaltung") && abs.Start.HasValue && abs.End.HasValue &&
abs.Start.Value >= start && abs.Start.Value <= end)
{
// die tätigkeitsschwerpunkte sind valuelistentrys
if (ed.Employee.ValueList != null)
{
var taetigkeitsschwerpunkte = ed.Employee.ValueList.Where(v => v.Entry != null && v.Entry.Type == BS.Shared.ValueListEntryType.StaffActivityFocusType);
if (taetigkeitsschwerpunkte != null)
{
foreach (var item in taetigkeitsschwerpunkte)
{
if (item.Entry.Value == "Ergänzende Betreuungskraft")
flsFaktor = 0.85m;
else if (item.Entry.Value == "Fallverantwortung")
flsFaktor = 0.75m;
}
}
}
absFls += Convert.ToDecimal((abs.End.Value - abs.Start.Value).TotalHours) * flsFaktor;
}
}
return absFls;
}
public override bool ShouldCreateDayDetails()
{
return true;
}
public override MitarbeiterstundenkontoRO.DayDetail CreateDayDetail(DateTime date, MitarbeiterstundenkontoRO.EmployeeDetail ed)
{
var dd = base.CreateDayDetail(date, ed);
dd.MaxHoursUntilBreak = null;
dd.MaxHoursUntilBreak2 = null;
dd.BreakMinutes = null;
dd.BreakMinutes2 = null;
return dd;
}
}
}