130 lines
6.1 KiB
C#
130 lines
6.1 KiB
C#
using BeWo.Data.Access;
|
|
using BeWo.Data.Entities;
|
|
using BeWo.Report.ReportObjects;
|
|
using BeWo.Service.DCEntityMapper;
|
|
using BeWo.Service.Plugins;
|
|
using BeWo.Service.ServiceImplementations;
|
|
using BS.Shared.Extensions;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using BeWo.Service.Dienstplanung;
|
|
|
|
namespace AbwIlseFretz
|
|
{
|
|
public class CustomMitarbeiterstundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
|
|
{
|
|
public override void BerechneUrlaubskonto(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, MitarbeiterstundenkontoRO ro, DateTime berichtsEnde)
|
|
{
|
|
// Darstellungsvariante, da das normale Urlaubskonto nur den Resturlaubsstand vom Ende des Jahres anzeigt.
|
|
var konto = vacationService.BerechneUrlaubskontoZurDarstellung(empDetail.Employee, ro.ReportStartDate.Year, berichtsEnde.AddDays(-1));
|
|
if (konto != null && konto.Count > 0)
|
|
{
|
|
var alleVertraglichenBudgets = konto
|
|
.Where(k => k.DatumZurSortierung == null && ZaehltZuUrlaubsbudget(k.Erlaeuterung))
|
|
.ToList();
|
|
|
|
empDetail.Custom1 = alleVertraglichenBudgets.Sum(b => Convert.ToDecimal(b.AnzahlTage)); // Gesamter Jahresanspruch
|
|
empDetail.Resturlaub = alleVertraglichenBudgets.Sum(b => Convert.ToDecimal(b.AnzahlTage));
|
|
|
|
// Jeder Entry enthält den Zeitraum und die abzuziehenden Tage vom Gesamtbudget.
|
|
foreach (var entry in konto)
|
|
{
|
|
// Hat entry kein Datum, dann ist es nur eine Überschrift in der Darstellung und hat hier keinen Nutzen
|
|
if (entry.DatumZurSortierung != null || entry.Erlaeuterung.Contains("Resturlaub aus"))
|
|
{
|
|
// Ist das Datum nach dem Enddatum des Stundenkontos braucht nicht weitergerechnet werden
|
|
if (entry.DatumZurSortierung > ro.ReportEndDate.AddTicks(-1))
|
|
break;
|
|
|
|
empDetail.Resturlaub += Convert.ToDecimal(entry.AnzahlTage); // += weil Tage immer als Minus dargestellt sind
|
|
|
|
// Da Custom1 NUR das Budget + Resturlaub sein soll, durch Urlaub nicht mehr reduzieren
|
|
if (entry.DatumZurSortierung == null || entry.Herkunft.Contains("GeschenkterUrlaubstag"))
|
|
empDetail.Custom1 += Convert.ToDecimal(entry.AnzahlTage); // += weil Tage immer als Minus dargestellt sind
|
|
}
|
|
}
|
|
}
|
|
|
|
// In Custom2 alle Krankheiten und Klinikaufenthalte zusammenfassen bis ro.ReportEndDate
|
|
var alleKrankheitenImJahr = empDetail.Employee.AbsenceTimes.Where(a => a.Start.HasValue && a.End.HasValue && IsKrankheitAbsenceTime(a) &&
|
|
(a.Start.Value <= ro.ReportEndDate && a.End.Value >= new DateTime(ro.ReportStartDate.Year, 01, 01))).ToList();
|
|
var summeKrankheiten = 0m;
|
|
|
|
// Jede Krankheit durchgehen und evtl. Start und Enddatum anpassen, wenn vor Bericht beginnt oder danach endet
|
|
foreach (var abs in alleKrankheitenImJahr)
|
|
{
|
|
if (abs.Start.Value.Year != ro.ReportEndDate.AddDays(-1).Year)
|
|
abs.Start = new DateTime(ro.ReportEndDate.Year, 01, 01);
|
|
else if (abs.End.Value.Year != ro.ReportEndDate.AddDays(-1).Year)
|
|
abs.End = new DateTime(ro.ReportEndDate.Year, 12, 31);
|
|
|
|
// Jeden Krankheitstag einzeln prüfen, ob überhaupt gearbeitet werden müsste
|
|
var start = abs.Start;
|
|
while (start <= abs.End)
|
|
{
|
|
var soll = BerechneSollStundenFuerTag(empDetail, start.Value);
|
|
// Wenn Soll an dem aktuellen Tag nicht 0 ist, einen Krankheitstag hinzufügen
|
|
if (soll > 0)
|
|
summeKrankheiten++;
|
|
|
|
start = start.Value.AddDays(1);
|
|
}
|
|
}
|
|
empDetail.Custom2 = summeKrankheiten;
|
|
// Custom4 ist FLS-Ist bis Auswertungstag
|
|
// Custom5 ist FLS-Soll Ist bis Auswertungstag
|
|
empDetail.Custom3 = BerechneFlsIstZuSollQuote(empDetail, ro.ReportStartDate, ro.ReportEndDate);
|
|
}
|
|
|
|
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("klinik") >= 0
|
|
|| absenceTime.AbsenceReason.Description.ToLower().IndexOf("krank") >= 0 || absenceTime.AbsenceReason.Description.ToLower() == "au");
|
|
}
|
|
private decimal BerechneFlsIstZuSollQuote(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, DateTime reportStartDate, DateTime reportEndDate)
|
|
{
|
|
// Die Quote FLS zu Soll nach Krankheitsabzug soll bis zum "heutigen" Tag gemacht werden.
|
|
// Ist der Monat also vergangen, ganz normal, ansonsten nur bis heute
|
|
decimal quote = 0;
|
|
|
|
if (reportEndDate > DateTime.Now.Date)
|
|
reportEndDate = DateTime.Now.Date;
|
|
|
|
decimal sollInZeitraum = 0;
|
|
var start = reportStartDate;
|
|
while (start <= reportEndDate)
|
|
{
|
|
if (!empDetail.Employee.AbsenceTimes.Any(a => a.AbsenceSpan.ContainsDate(start)))
|
|
sollInZeitraum += BerechneSollStundenFuerTag(empDetail, start);
|
|
|
|
start = start.AddDays(1);
|
|
}
|
|
|
|
var serviceRecords = empDetail.AllServiceRecords.Where(s => s.Start.Date >= reportStartDate && s.Start.Date <= reportEndDate).ToList();
|
|
decimal flmInZeitraum = 0;
|
|
foreach (var item in serviceRecords)
|
|
{
|
|
if (item.Start.Date <= reportEndDate.Date)
|
|
{
|
|
if (item.ServiceDescription.Category.IsBillable)
|
|
{
|
|
flmInZeitraum += GetDuration(item, empDetail);
|
|
}
|
|
}
|
|
}
|
|
|
|
if (sollInZeitraum > 0)
|
|
quote = (flmInZeitraum / 60) / sollInZeitraum * 100;
|
|
|
|
empDetail.Custom4 = flmInZeitraum / 60;
|
|
empDetail.Custom5 = sollInZeitraum;
|
|
|
|
return quote;
|
|
}
|
|
}
|
|
}
|