Files
BeWoPlaner/ReportImp/AsbRheinErftDueren/CustomMitarbeiterstundenkontoBerechnung.cs

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