Files
BeWoPlaner/ReportImp/PsychosozialerTraegervereinReports/PstMitarbeiterstundenkontoBerechnungStundenzettel.cs

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) ;
}
}
}