Files
BeWoPlaner/ReportImp/BetreuWoReports/CustomMitarbeiterstundenkontoBerechnung.cs
Christian 8768b226f0 cb
2022-05-12 12:08:52 +02:00

256 lines
9.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BS.Shared.Core;
namespace BetreuWoReports
{
public class CustomMitarbeiterstundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
{
public override decimal GetFeiertagsFaktor(DateTime start)
{
if (start.Year >= 2021)
{
return base.GetFeiertagsFaktor(start);
}
if (start.Year >= 2019 && start.Month == 12 && (start.Day == 24 || start.Day == 31))
{
return 0.5m;
}
return base.GetFeiertagsFaktor(start);
}
public override List<DateTime> GetFeiertage(int year)
{
var list = base.GetFeiertage(year);
if (year >= 2019)
{
list.Add(new DateTime(year, 12, 31));
}
return list;
}
public override MitarbeiterstundenkontoRO.DayDetail CreateDayDetail(DateTime date, MitarbeiterstundenkontoRO.EmployeeDetail ed)
{
var dd = base.CreateDayDetail(date, ed);
dd.MaxHoursUntilBreak = 0;
dd.BreakMinutes = 0;
dd.MaxHoursUntilBreak2 = 0;
dd.BreakMinutes2 = 0;
if (date.Year >= 2021)
{
dd.NightStart = 22;
dd.NightEnd = 6;
}
return dd;
}
public override void CalculateAbsenceTimesForDay(MitarbeiterstundenkontoRO.DayDetail dd,
MitarbeiterstundenkontoRO.EmployeeDetail ed)
{
//do nothing
}
public override bool ShouldCreateDayDetails()
{
return true;
}
public override bool ShouldCreateDayDetailsForEachServiceRecord()
{
return true;
}
public override IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
{
IList<MitarbeiterstundenkontoRO.DayDetail> dayDetailList = base.CreateDayDetails(berichtStart, berichtEnde, ed, recordsAll);
decimal stundenDurchAbwesenheitenGesamt = 0;
for (int i = berichtStart.Day; i <= DateTime.DaysInMonth(berichtStart.Year, berichtStart.Month); i++)
{
var start = new DateTime(berichtStart.Year, berichtStart.Month, i);
decimal sollProTag = ed.SollProTag;
var test = base.GetSollNachArbeitszeiten(ed.Employee, start, start.AddDays(1));
if (test.HasValue)
{
sollProTag = test.Value;
}
var ah = GetAbsenceTimeDaysWithWorkWeeks(ed.Employee.AbsenceTimes, start, start.AddDays(1), ed.ArbeitstageProWoche);
decimal stundenDurchAbwesenheiten = 0;
if ((ah.TageKrankheit.HasValue && ah.TageKrankheit > 0) || (ah.TageUrlaub.HasValue && ah.TageUrlaub > 0))
{
if (ah.TageKrankheit.HasValue && ah.TageKrankheit > 0)
{
if (berichtStart < new DateTime(2019, 12, 1))
{
stundenDurchAbwesenheiten = sollProTag / ah.TageKrankheit.Value;
}
else
{
var tage = ah.TageKrankheit.Value;
if (tage > 1)
{
tage = 1;
}
stundenDurchAbwesenheiten = sollProTag * tage;
}
}
else if (ah.TageUrlaub.HasValue && ah.TageUrlaub > 0)
{
if (berichtStart < new DateTime(2019, 12, 1))
{
stundenDurchAbwesenheiten = sollProTag / ah.TageUrlaub.Value;
}
else
{
var tage = ah.TageUrlaub.Value;
if (tage > 1)
{
tage = 1;
}
stundenDurchAbwesenheiten = sollProTag * tage;
}
}
}
if (stundenDurchAbwesenheiten > 0)
{
stundenDurchAbwesenheitenGesamt += stundenDurchAbwesenheiten;
MitarbeiterstundenkontoRO.DayDetail dd = CreateDayDetail(start, ed);
dd.Custom2 = GetAbsenceReason(ed.Employee.AbsenceTimes, start);
dd.MinutesTotal = stundenDurchAbwesenheiten * 60;
dayDetailList.Add(dd);
}
}
ed.StundenGesamtIst += stundenDurchAbwesenheitenGesamt;
return dayDetailList.OrderBy(dd => dd.Date).ToList();
}
public override bool IsKrankheitAbsenceTime(AbsenceTime absenceTime)
{
return !IsUrlaubAbsenceTime(absenceTime);
}
private string GetAbsenceReason(IList<AbsenceTime> absenceTimes, DateTime start)
{
foreach (var at in absenceTimes)
{
if ((!at.Start.HasValue || at.Start.Value <= start) && (!at.End.HasValue || at.End.Value >= start))
{
return at.AbsenceReason.Description;
}
}
return null;
}
public override decimal BerechneSollProWoche(Contract c, MitarbeiterstundenkontoRO.EmployeeDetail ed)
{
if (c != null)
{
if (c.MonthlyTotalHours.HasValue && c.MonthlyTotalHours.Value > 0)
{
if (ed.ArbeitstageImBerichtszeitraum > 0)
{
if (c.WeeklyTotalHours.HasValue && c.WeeklyTotalHours.Value > 0)
{
//return (c.WeeklyTotalHours.Value / c.WeeklyDays.Value) * 5;
//var test = ed.Employee.Person.LastNameFirstName;
return c.WeeklyTotalHours.Value;
}
}
}
}
return base.BerechneSollProWoche(c, ed);
}
protected override void CalculateEmployeeSalary(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, DateTime start, DateTime ende)
{
base.CalculateEmployeeSalary(empDetail, start, ende);
Dictionary<decimal, decimal> stundensatzZuStunden = new Dictionary<decimal, decimal>();
if (empDetail.ServiceRecordsInSelectedTimeSpan != null)
{
foreach (var sr in empDetail.ServiceRecordsInSelectedTimeSpan)
{
var duration = sr.RoundedDuration;
if (sr.GroupRoundedDuration.HasValue)
{
duration = sr.GroupRoundedDuration.Value;
}
Contract con = empDetail.Employee.GetValidContractForDate(sr.Start);
if (con != null && con.HourlyRate.HasValue)
{
if (!stundensatzZuStunden.ContainsKey(con.HourlyRate.Value))
{
stundensatzZuStunden.Add(con.HourlyRate.Value, 0);
}
stundensatzZuStunden[con.HourlyRate.Value] += duration;
}
}
}
decimal salary = 0;
foreach (var stundensatz in stundensatzZuStunden.Keys)
{
var stunden = stundensatzZuStunden[stundensatz] / 60;
salary += Math.Round(stunden, 2, MidpointRounding.AwayFromZero) * stundensatz;
}
empDetail.EmployeeSalaryByHours = Math.Round(salary, 2, MidpointRounding.AwayFromZero); ;
// if (empDetail.EmploymentType != null &&
// (empDetail.EmploymentType.Oid == 19 ||
// empDetail.EmploymentType.Oid == 34 ||
// empDetail.EmploymentType.Oid == 47 ||
// empDetail.EmploymentType.Oid == 50 ||
// empDetail.EmploymentType.Oid == 54 ||
// empDetail.EmploymentType.Oid == 57 ||
// empDetail.EmploymentType.Oid == 60 ||
// empDetail.EmploymentType.Oid == 63 ||
// empDetail.EmploymentType.Oid == 66))
//{
// if (start >= new DateTime(2013, 1, 1))
// {
// if (empDetail.EmployeeSalaryByHours.HasValue && empDetail.EmployeeSalaryByHours.Value > 450)
// {
// empDetail.EmployeeSalaryByHours = 450;
// }
// }
// else
// {
// if (empDetail.EmployeeSalaryByHours.HasValue && empDetail.EmployeeSalaryByHours.Value > 400)
// {
// empDetail.EmployeeSalaryByHours = 400;
// }
// }
//}
}
}
}