232 lines
8.7 KiB
C#
232 lines
8.7 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using BeWo.Data.Entities;
|
|
using BeWo.Report.ReportObjects;
|
|
using BeWo.Service.Dienstplanung;
|
|
|
|
|
|
namespace BeWo.PsychosozialerTraegervereinReports
|
|
{
|
|
public class PstMitarbeiterstundenkontoBerechnungStundenzettel : MitarbeiterstundenkontoBerechnung
|
|
{
|
|
public override MitarbeiterstundenkontoRO.DayDetail CreateDayDetail(DateTime date, MitarbeiterstundenkontoRO.EmployeeDetail ed)
|
|
{
|
|
var dd = base.CreateDayDetail(date, ed);
|
|
dd.MaxHoursUntilBreak = 6;
|
|
dd.MaxHoursUntilBreak2 = 9;
|
|
dd.BreakMinutes = 30;
|
|
dd.BreakMinutes2 = 15;
|
|
return dd;
|
|
}
|
|
|
|
public override bool ShouldCreateDayDetails()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override bool SollPauseBerechnen()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override bool AddServiceRecordToDuration(StundenkontoServiceRecord item)
|
|
{
|
|
if (item.ServiceDescription.Category.Name.ToLower().Contains("arbeitszeit"))
|
|
{
|
|
if (!item.ServiceDescription.Name.ToLower().Contains("krank") && !item.ServiceDescription.Name.ToLower().Contains("urlaub"))
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
protected override ServiceRecordSummary BerechneStunden(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList<StundenkontoServiceRecord> groupFilteredRecords, DateTime berichtsAnfang,
|
|
DateTime berichtsEnde)
|
|
{
|
|
decimal flsGesamt = 0;
|
|
decimal arbeitszeit = 0;
|
|
|
|
var sum = new ServiceRecordSummary();
|
|
sum.RecordsImBerichtszeitraum = new List<StundenkontoServiceRecord>();
|
|
empDetail.ServiceRecordsInSelectedTimeSpan = new List<StundenkontoServiceRecord>();
|
|
|
|
foreach (var item in groupFilteredRecords)
|
|
{
|
|
if (!IsServiceRecordFehlzeit(item))
|
|
{
|
|
if (item.Start >= berichtsAnfang && item.Start < berichtsEnde)
|
|
{
|
|
//if (AddServiceRecordToDuration(item))
|
|
//{
|
|
empDetail.ServiceRecordsInSelectedTimeSpan.Add(item);
|
|
decimal duration = 0;
|
|
|
|
if (item.GroupRoundedDuration.HasValue)
|
|
{
|
|
duration = item.GroupRoundedDuration.Value;
|
|
}
|
|
else
|
|
{
|
|
duration = item.RoundedDuration;
|
|
}
|
|
|
|
if (item.ServiceDescription != null &&
|
|
item.ServiceDescription.Category != null)
|
|
{
|
|
if (!item.ServiceDescription.Category.Name.ToLower().Contains("arbeitszeit"))
|
|
{
|
|
flsGesamt += duration;
|
|
}
|
|
else if (!item.ServiceDescription.Name.ToLower().Contains("krank") && !item.ServiceDescription.Name.ToLower().Contains("urlaub"))
|
|
{
|
|
arbeitszeit += duration;
|
|
}
|
|
|
|
}
|
|
|
|
//}
|
|
|
|
sum.RecordsImBerichtszeitraum.Add(item);
|
|
}
|
|
}
|
|
}
|
|
|
|
//base.CorrectOverlappingTimes(groupFilteredRecords);
|
|
|
|
//var summary = base.BerechneStunden(empDetail, groupFilteredRecords, berichtsAnfang, berichtsEnde);
|
|
//var gesamt = summary.IstAbrechenbar + summary.IstNichtAbrechenbar;
|
|
sum.IstAbrechenbar = flsGesamt;
|
|
sum.IstNichtAbrechenbar = arbeitszeit - flsGesamt;
|
|
//summary.IstAbrechenbar = flsGesamt;
|
|
//summary.IstNichtAbrechenbar = gesamt - summary.IstAbrechenbar;
|
|
|
|
|
|
return sum;
|
|
}
|
|
|
|
public override decimal GetSollArbeitszeitProArbeitstag(Contract contract, MitarbeiterstundenkontoRO.EmployeeDetail ed)
|
|
{
|
|
// -> Frau Boos: die Arbeitsstunden pro Monat : 4,348 = Arbeitsstunde pro Woche : tatsächliche Arbeitstage pro Woche = Sollarbeitszeit pro Arbeitstag
|
|
|
|
if (contract.MonthlyTotalHours.HasValue && contract.WeeklyDays.HasValue)
|
|
{
|
|
return contract.MonthlyTotalHours.Value / 4.348m / contract.WeeklyDays.Value;
|
|
}
|
|
|
|
return base.GetSollArbeitszeitProArbeitstag(contract, ed);
|
|
}
|
|
|
|
public override decimal GetAdditionalHours(IList<MitarbeiterstundenkontoRO.DayDetail> days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<StundenkontoServiceRecord> recordsAll)
|
|
{
|
|
var ah = base.GetAdditionalHours(days, berichtStart, berichtEnde, ed, recordsAll);
|
|
|
|
foreach (var sr in recordsAll)
|
|
{
|
|
if (sr.Start >= berichtStart && sr.Start < berichtEnde)
|
|
{
|
|
var addKrank = false;
|
|
var addUrlaub = false;
|
|
|
|
//var dayDetail = FindDayDetail(sr, days);
|
|
|
|
var day = sr.Start;
|
|
var dayDetail = days.FirstOrDefault(dd => dd.Date.Day == day.Day);
|
|
|
|
var faktor = GetFeiertagsFaktor(day);
|
|
if (faktor < 1 && day.DayOfWeek != DayOfWeek.Saturday && day.DayOfWeek != DayOfWeek.Sunday)
|
|
{
|
|
if (sr.ServiceDescription.Name.ToLower().Contains("krank"))
|
|
{
|
|
if (dayDetail.HoursSick == 0)
|
|
{
|
|
addKrank = true;
|
|
|
|
}
|
|
}
|
|
else if (sr.ServiceDescription.Name.ToLower().Contains("urlaub"))
|
|
{
|
|
if (dayDetail.HoursInVacation == 0)
|
|
{
|
|
addUrlaub = true;
|
|
|
|
}
|
|
}
|
|
|
|
if (addKrank || addUrlaub)
|
|
{
|
|
var abwesenheitStunden = sr.RoundedDuration / 60;
|
|
|
|
if (ed.AbsenceTimeDays != null && ed.AbsenceTimeDays.TageProWocheDict != null && ed.AbsenceTimeDays.RestStundenProWocheDict != null)
|
|
{
|
|
foreach (var week in ed.AbsenceTimeDays.TageProWocheDict.Keys)
|
|
{
|
|
if (day.Date >= week.StartDate && day.Date <= week.EndDate)
|
|
{
|
|
if (!ed.AbsenceTimeDays.RestStundenProWocheDict.ContainsKey(week))
|
|
{
|
|
ed.AbsenceTimeDays.RestStundenProWocheDict.Add(week, ed.SollProWoche);
|
|
}
|
|
var rest = ed.AbsenceTimeDays.RestStundenProWocheDict[week];
|
|
if (rest < abwesenheitStunden)
|
|
{
|
|
abwesenheitStunden = rest;
|
|
}
|
|
|
|
rest -= abwesenheitStunden;
|
|
if (rest < 0)
|
|
{
|
|
rest = 0;
|
|
}
|
|
|
|
ed.AbsenceTimeDays.RestStundenProWocheDict[week] = rest;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (addKrank)
|
|
dayDetail.HoursSick += abwesenheitStunden;
|
|
else
|
|
dayDetail.HoursInVacation += abwesenheitStunden;
|
|
|
|
//if (!ed.UrlaubUndKrankheit.HasValue)
|
|
// ed.UrlaubUndKrankheit = 0;
|
|
|
|
dayDetail.MinutesTotal += abwesenheitStunden * 60;
|
|
ah += abwesenheitStunden;
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
return ah;
|
|
}
|
|
|
|
|
|
|
|
public override bool IstAnrechenbareAbsenceTime(AbsenceTime item)
|
|
{
|
|
if (!item.AbsenceReason.Description.ToLower().Contains("ü-frei freizeitausgleich"))
|
|
return true;
|
|
else
|
|
return false;
|
|
}
|
|
public override List<DateTime> GetFeiertage(int year)
|
|
{
|
|
var list = base.GetFeiertage(year);
|
|
|
|
list.Add(new DateTime(year, 12, 31));
|
|
|
|
return list;
|
|
}
|
|
|
|
public override bool IsUrlaubAbsenceTime(AbsenceTime absenceTime)
|
|
{
|
|
return !String.IsNullOrEmpty(absenceTime.AbsenceReason.Description) &&
|
|
(absenceTime.AbsenceReason.Description.ToLower().IndexOf("urlaub") >= 0 || absenceTime.AbsenceReason.Description.ToLower().IndexOf("regenerationstag") >= 0) ;
|
|
}
|
|
}
|
|
}
|
|
|