Files
BeWoPlaner/ReportImp/FabEv/FabEvMitarbeiterstundenkontoBerechnung.cs
2019-11-24 15:56:11 +01:00

303 lines
11 KiB
C#

using System;
using System.Collections.Generic;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BS.Shared.Core;
namespace FabEv
{
public class FabEvMitarbeiterstundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
{
public override decimal GetArbeitstageImBereich(DateTime von, DateTime bis, Employee emp)
{
Contract c = emp.GetValidContractForDate(von);
if (c == null) // Kein Vertrag vom 1. gefunden, gucken, ob es einen gibt, der mitten im Monat beginnt.
{
var c2 = GetNextValidContractForDate(von, emp);
if (c2 != null && c2.EntryDate.HasValue && c2.EntryDate.Value < bis)
c = c2;
}
if (c != null && c.WeeklyTotalHours.HasValue)
{
var sollProMonat = BerechneSollProMonat(emp, von, bis);
if (sollProMonat.HasValue)
{
if (c.WeeklyTotalHours.Value == 0)
{
return 0;
}
var sollProTag = c.WeeklyTotalHours.Value/6;
if (sollProTag == 0)
{
return 0;
}
return sollProMonat.Value/sollProTag;
}
}
return base.GetArbeitstageImBereich(von, bis, emp);
}
public override AbsenceTimeDays GetAbsenceTimeDays(IList<AbsenceTime> absenceTimes, DateTime start, DateTime end)
{
var atd = new AbsenceTimeDays();
var totalSpan = new DateTimeSpan();
totalSpan.StartDate = start;
totalSpan.EndDate = end.AddDays(-1);
var weeks = totalSpan.GetWeeks(true, false);
if (BerechneAlteAbwesenheitsStunden(start))
{
totalSpan.EndDate = end;
//weeks = totalSpan.GetWholeWeeks();
}
atd.TageProWocheDict = new Dictionary<DateTimeSpan, decimal>();
foreach (var week in weeks)
{
atd.TageProWocheDict.Add(week, 0);
}
decimal? tage = null;
if (absenceTimes != null)
{
foreach (var item in absenceTimes)
{
DateTimeSpan span = new DateTimeSpan();
span.StartDate = start;
if (item.Start.HasValue && item.Start.Value > span.StartDate)
{
span.StartDate = item.Start.Value;
}
span.EndDate = end;
if (item.End.HasValue && item.End.Value.Date.AddDays(1) < span.EndDate)
{
span.EndDate = item.End.Value.Date.AddDays(1);
}
if (span.EndDate >= start && span.StartDate < end)
{
DateTime day = span.StartDate;
while (day < end && day < span.EndDate)
{
if (day.DayOfWeek != DayOfWeek.Sunday && !IstRealFeiertag(day))
{
if (!tage.HasValue)
tage = 0;
var tag = 1m;
var std = 24m;
tage += std;
if (IsKrankheitAbsenceTime(item))
{
if (!atd.TageKrankheit.HasValue)
atd.TageKrankheit = 0;
atd.TageKrankheit += tag;
}
if (IsUrlaubAbsenceTime(item))
{
if (!atd.TageUrlaub.HasValue)
atd.TageUrlaub = 0;
atd.TageUrlaub += tag;
}
foreach (var week in weeks)
{
if (day >= week.StartDate && day <= week.EndDate)
{
if (atd.TageProWocheDict.ContainsKey(week))
{
atd.TageProWocheDict[week] += 1;
}
}
}
}
day = day.AddDays(1);
}
}
//}
}
}
if (tage.HasValue)
tage /= 24;
atd.TageGesamt = tage;
return atd;
}
public override bool IsKrankheitAbsenceTime(AbsenceTime absenceTime)
{
return !String.IsNullOrEmpty(absenceTime.AbsenceReason.Description) &&
(absenceTime.AbsenceReason.Description.ToLower().IndexOf("arbeitsunfähig") >= 0
|| absenceTime.AbsenceReason.Description.ToLower().IndexOf("krank") >= 0
|| absenceTime.AbsenceReason.Description.ToLower().IndexOf("ma au") >= 0);
}
public override bool IsUrlaubAbsenceTime(AbsenceTime absenceTime)
{
return !String.IsNullOrEmpty(absenceTime.AbsenceReason.Description) &&
absenceTime.AbsenceReason.Description.ToLower().IndexOf("urlaub") >= 0;
}
public override decimal BerechneSollProWoche(Contract c, MitarbeiterstundenkontoRO.EmployeeDetail ed)
{
if (c != null)
{
if (c.WeeklyTotalHours.HasValue && c.WeeklyTotalHours.Value > 0)
{
return c.WeeklyTotalHours.Value;
}
if (c.MonthlyTotalHours.HasValue && c.MonthlyTotalHours.Value > 0)
{
if (ed.ArbeitstageImBerichtszeitraum > 0)
{
decimal stundenProTag = GetSollArbeitszeitProArbeitstag(c, ed);
return (stundenProTag * ed.ArbeitstageProWoche);
//sollStundenProWoche = stundenProTag * ed.ArbeitstageProWoche;
//return (ath.TageGesamt.Value * stundenProTag);
}
}
}
return 0;
}
//Die Formel zum errechnen der Soll Stunden bei Mitarbeitern und auch bei
//den KlientIn, soll geändert werden in:
//Stunden x 52 Kalenderwochen : 12 Monate
//Beispiel: 30 Wochenstunden MitarbeiterIn mal 52, geteilt durch 12 ist 130 Monatsstunden
//5 Wochenstunden KlientInnen mal 52, geteilt durch 12
//ist = 21,67 Monatsstunden
//Alle Feiertage, ebenso 24.12 und 31.12 sind nicht relevant, werden also
//in der Berechnung nicht berücksichtigt.
public override decimal? BerechneSollProMonat(Employee emp, DateTime start, DateTime ende)
{
Contract c = emp.GetValidContractForDate(start);
if (c == null) // Kein Vertrag vom 1. gefunden, gucken, ob es einen gibt, der mitten im Monat beginnt.
{
var c2 = GetNextValidContractForDate(start, emp);
if (c2 != null && c2.EntryDate.HasValue && c2.EntryDate.Value < ende)
c = c2;
}
if (c != null && c.WeeklyTotalHours.HasValue)
{
var soll = (c.WeeklyTotalHours.Value * 52) / 12;
if (start.Day > 1 || ende.Day > 1)
{
DateTime startTemp = start;
int arbeitstage = 0;
while (startTemp < ende)
{
if (startTemp.DayOfWeek != DayOfWeek.Sunday)
{
arbeitstage++;
}
startTemp = startTemp.AddDays(1);
}
var sollProTag = c.WeeklyTotalHours.Value/6;
return sollProTag*arbeitstage;
}
return soll;
}
return 0;
}
public override bool AddServiceRecordToDuration(ServiceRecord item)
{
if (item.ServiceDescription != null && (item.ServiceDescription.Name == "Fehlzeit" || item.ServiceDescription.Name == "Freihalteregelung"))
{
return false;
}
return true;
}
public override void HandleServiceRecord(MitarbeiterstundenkontoRO.EmployeeDetail emp, ServiceRecord item)
{
if (item.ServiceDescription != null && item.ServiceDescription.ServiceCategory != null)
{
if (item.ServiceDescription.ServiceCategory.Name.Contains("Vertretung"))
{
decimal duration = 0;
if (item.GroupRoundedDuration.HasValue)
{
duration = item.GroupRoundedDuration.Value;
}
else
{
duration = item.RoundedDuration;
}
emp.Custom1 += duration/60;
}
}
}
public override List<DateTime> GetFeiertage(int year)
{
return new List<DateTime>();
}
private bool IstRealFeiertag(DateTime start)
{
List<DateTime> feiertage = GetRealFeiertage(start.Year);
foreach (var ft in feiertage)
{
if (start.Date == ft)
return true;
}
return false;
}
private List<DateTime> GetRealFeiertage(int year)
{
List<DateTime> list = new List<DateTime>();
list.Add(new DateTime(year, 1, 1)); // "Neujahr"));
list.Add(new DateTime(year, 5, 1)); // , "Tag der Arbeit"));
list.Add(new DateTime(year, 10, 3)); // , "Tag der dt. Einheit"));
list.Add(new DateTime(year, 12, 25)); // , "1. Weihnachtstag"));
list.Add(new DateTime(year, 12, 26)); // , "2. Weihnachtstag"));
if (year == 2017)
{
list.Add(new DateTime(year, 10, 31)); // , "Reformationstag"));
}
DateTime osterSonntag = GetOsterSonntag(year);
list.Add(osterSonntag.AddDays(-2)); // , "Karfreitag"));
list.Add(osterSonntag.AddDays(1)); // , "Ostermontag"));
list.Add(osterSonntag.AddDays(39)); // , "Christi Himmelfahrt"));
list.Add(osterSonntag.AddDays(50)); // , "Pfingstmontag"));
return list;
}
}
}