202 lines
5.1 KiB
C#
202 lines
5.1 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using BeWo.Data.Access;
|
|
using BeWo.Data.Entities;
|
|
using BeWo.Report.ReportObjects;
|
|
using BeWo.Service.DCEntityMapper;
|
|
using BeWo.Service.Plugins;
|
|
using BS.Shared.DataContracts;
|
|
|
|
namespace AsbRheinErftDueren
|
|
{
|
|
public class CustomMitarbeiterstundenkontoBerechnung : MitarbeiterstundenkontoBerechnung
|
|
{
|
|
public VacationService VacationService = new VacationService();
|
|
|
|
public bool BerechneFerienTage { get; set; }
|
|
|
|
public override List<DateTime> GetFeiertage(int year)
|
|
{
|
|
var list = base.GetFeiertage(year);
|
|
var feiertage = DAOFactory.GenericDAO.GetAllActive<Feiertag>();
|
|
|
|
foreach (var ft in feiertage)
|
|
{
|
|
list.Add(ft.Datum);
|
|
}
|
|
|
|
DateTime osterSonntag = GetOsterSonntag(year);
|
|
list.Add(osterSonntag.AddDays(-48)); // , "Rosenmontag"));
|
|
return list;
|
|
}
|
|
|
|
//protected override void StarteBerechnung(DateTime berichtsAnfang, DateTime berichtsEnde, MitarbeiterstundenkontoRO.EmployeeDetail empDetail)
|
|
//{
|
|
|
|
// BerechneFerienTage = true;
|
|
// //Ansatz falls tatsächlich pro Schule/Organisation eigene Brückentage angelegt werden müssten...
|
|
// //foreach (var e2c in empDetail.Employee.Employee2CustomerList)
|
|
// //{
|
|
// // foreach (var sc in e2c.Customer.SupportConcepts)
|
|
// // {
|
|
// // foreach (var c2s in sc.CostBearer2SupportConceptList)
|
|
// // {
|
|
// // foreach (var item in c2s.CostBearer.Organisation.Feiertage)
|
|
// // {
|
|
|
|
// // }
|
|
// // }
|
|
// // }
|
|
|
|
|
|
//}
|
|
|
|
public override decimal GetFeiertagsFaktor(DateTime start)
|
|
{
|
|
if (BerechneFerienTage)
|
|
{
|
|
if (GetFerienTag(start) != null)
|
|
{
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
return base.GetFeiertagsFaktor(start);
|
|
}
|
|
|
|
public override void CreateEmployeeDetails(MitarbeiterstundenkontoRO ro)
|
|
{
|
|
foreach (var ed in ro.EmployeeDetailList)
|
|
{
|
|
//Setze Start auf Anfang des Jahres
|
|
var contracts = ed.Employee.Contracts;
|
|
|
|
var newcontracts = new List<Contract>();
|
|
|
|
DateTime startJahr = new DateTime(ro.ReportStartDate.Year, 1, 1);
|
|
|
|
foreach (var ctr in ed.Employee.Contracts)
|
|
{
|
|
bool add = false;
|
|
if (!ctr.ContractEndDate.HasValue)
|
|
{
|
|
add = true;
|
|
}
|
|
else if (ctr.ContractEndDate >= startJahr)
|
|
{
|
|
add = true;
|
|
}
|
|
|
|
if (add)
|
|
{
|
|
newcontracts.Add(ctr);
|
|
if (!ctr.EntryDate.HasValue || ctr.EntryDate < startJahr)
|
|
{
|
|
ctr.EntryDate = startJahr;
|
|
}
|
|
}
|
|
}
|
|
|
|
ed.Employee.Contracts = contracts; // muss das nicht newcontracts sein?
|
|
}
|
|
base.CreateEmployeeDetails(ro);
|
|
|
|
foreach (var ed in ro.EmployeeDetailList)
|
|
{
|
|
BerechneJahresSoll(ed, ro.ReportStartDate);
|
|
}
|
|
}
|
|
|
|
public override bool IstAnrechenbareAbsenceTime(AbsenceTime item)
|
|
{
|
|
return IsKrankheitAbsenceTime(item);
|
|
}
|
|
|
|
protected override bool StundenDurchAbwesenheitenDuerfenNegativSein()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public override bool AddServiceRecordToDuration(ServiceRecord item)
|
|
{
|
|
|
|
if (item.CostBearer2SupportConcept != null && item.CostBearer2SupportConcept.CostBearer.Organisation.Name != "Jugendamt Brühl")
|
|
{
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
private void BerechneJahresSoll(MitarbeiterstundenkontoRO.EmployeeDetail ed, DateTime monat)
|
|
{
|
|
if (ed.HasContract)
|
|
{
|
|
|
|
//Soll
|
|
ed.Custom1 = ed.StundenSollOhneUrlaubKrankheit + ed.Custom4; // Soll im aktuellen Monat + Soll Vormonat
|
|
//Ist = ueberstunden + soll (Überstunden = Ist - Soll)
|
|
ed.Custom2 = (ed.UeberstundenGesamt ?? 0) + ed.Custom1;
|
|
//Ist - Soll
|
|
ed.Custom3 = ed.Custom2 - ed.Custom1;
|
|
|
|
}
|
|
}
|
|
|
|
public override MitarbeiterstundenkontoRO.EmployeeDetail BerechneUeberstundenBis(MitarbeiterstundenkontoRO.EmployeeDetail edOrig, IList<ServiceRecord> records, DateTime monat, out decimal? ueberstunden,
|
|
out decimal alteExtraUeberstunden)
|
|
{
|
|
var edTotal = base.BerechneUeberstundenBis(edOrig, records, monat, out ueberstunden, out alteExtraUeberstunden);
|
|
|
|
edOrig.Custom4 = edTotal.StundenSollOhneUrlaubKrankheit; // Soll in den Vormonaten
|
|
|
|
return edTotal;
|
|
}
|
|
|
|
public override decimal BerechneStundenDurchAbwesenheiten(AbsenceTimeDays ath, DateTime start, DateTime ende, Contract c, MitarbeiterstundenkontoRO.EmployeeDetail ed)
|
|
{
|
|
decimal factor = 0.0545m; //Prozent pro Tag
|
|
decimal tageGesamt = 0;
|
|
|
|
if (c != null)
|
|
{
|
|
if (ath.TageGesamt.HasValue)
|
|
{
|
|
if (ed.ArbeitstageProWoche == 5)
|
|
{
|
|
tageGesamt = ath.TageGesamt.Value;
|
|
}
|
|
else if (ath.TageProWocheDict != null && ed.ArbeitstageProWoche > 0)
|
|
{
|
|
foreach (var week in ath.TageProWocheDict.Keys)
|
|
{
|
|
var tage = ath.TageProWocheDict[week];
|
|
|
|
if (tage > 0)
|
|
{
|
|
if (tage > ed.ArbeitstageProWoche)
|
|
{
|
|
tage = ed.ArbeitstageProWoche;
|
|
|
|
}
|
|
|
|
tageGesamt += tage;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
decimal monatsSoll = ed.StundenSollMax;
|
|
|
|
|
|
return (monatsSoll * factor) * tageGesamt;
|
|
|
|
}
|
|
|
|
public FerienDC GetFerienTag(DateTime start)
|
|
{
|
|
return VacationService.GetFerien(start, "nrw");
|
|
}
|
|
}
|
|
}
|