256 lines
9.1 KiB
C#
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;
|
|
// }
|
|
// }
|
|
//}
|
|
}
|
|
}
|
|
}
|