303 lines
11 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|