Files
BeWoPlaner/Report/ReportObjects/AuslastungBerechnung.cs
Christian 023ca37cdc cb
2017-12-11 14:31:59 +01:00

887 lines
35 KiB
C#

using System;
using System.Collections.Generic;
using System.Text;
using BeWo.Report;
using BeWo.Data.Entities;
using BeWo.Data.Access;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BeWo.Service.ServiceImplementations;
using BS.Shared.Core;
using BS.Shared;
using BS.Shared.Extensions;
using BS.Shared.Services;
namespace BeWo.Report.ReportObjects
{
public class AuslastungBerechnung
{
private Dictionary<String, MitarbeiterauslastungRO.SupportConceptDetail> betreuungDict;
public AuslastungBerechnung()
{
betreuungDict = new Dictionary<String, MitarbeiterauslastungRO.SupportConceptDetail>();
}
public virtual void CreateReport(MitarbeiterauslastungRO ro)
{
CreateEmployeeDetails(ro);
CreateEmployeeTotals(ro);
CreateTeamDetails(ro);
CreateTotals(ro);
}
private void CreateEmployeeTotals(MitarbeiterauslastungRO ro)
{
foreach (var empDetail in ro.EmployeeDetailList)
{
foreach (var scd in empDetail.SupportConceptDetailList)
{
scd.DirectIst /= 60;
scd.MittelbarIst /= 60;
scd.IstKw1 /= 60;
scd.IstKw2 /= 60;
scd.IstKw3 /= 60;
scd.IstKw4 /= 60;
scd.IstKw5 /= 60;
scd.IstKw6 /= 60;
empDetail.DirectIst += scd.DirectIst;
empDetail.MittelbarIst += scd.MittelbarIst;
empDetail.ApprovedHoursPerWeek += scd.ApprovedHoursPerWeek;
empDetail.ApprovedHoursPerWeekWithRateFactor += scd.ApprovedHoursPerWeekWithRateFactor;
}
}
}
public virtual void CreateTotals(MitarbeiterauslastungRO ro)
{
foreach (var empDetail in ro.EmployeeDetailList)
{
ro.DirectIst += empDetail.DirectIst;
ro.MittelbarIst += empDetail.MittelbarIst;
ro.ApprovedHoursPerWeek += empDetail.ApprovedHoursPerWeek;
ro.ApprovedHoursPerWeekWithRateFactor += empDetail.ApprovedHoursPerWeekWithRateFactor;
}
if (ro.ApprovedHoursPerWeek != 0)
ro.RelationIstSoll = (ro.DirectIst / ro.ApprovedHoursPerWeek) * 100m;
if (ro.DirectIst + ro.MittelbarIst != 0)
ro.RelationDirectToMittelbar = (ro.DirectIst / (ro.DirectIst + ro.MittelbarIst)) * 100;
}
public virtual void CreateTeamDetails(MitarbeiterauslastungRO ro)
{
foreach (var teamDetail in ro.TeamDetailList)
{
foreach (var empDetail in teamDetail.EmployeeDetailList)
{
teamDetail.DirectIst += empDetail.DirectIst;
teamDetail.MittelbarIst += empDetail.MittelbarIst;
teamDetail.ApprovedHoursPerWeek += empDetail.ApprovedHoursPerWeek;
teamDetail.ApprovedHoursPerWeekWithRateFactor += empDetail.ApprovedHoursPerWeekWithRateFactor;
foreach (var scd in empDetail.SupportConceptDetailList)
{
teamDetail.SupportConceptDetailList.Add(scd);
}
}
if (teamDetail.ApprovedHoursPerWeek != 0)
teamDetail.RelationIstSoll = (teamDetail.DirectIst / teamDetail.ApprovedHoursPerWeek) * 100m;
if (teamDetail.DirectIst + teamDetail.MittelbarIst != 0)
teamDetail.RelationDirectToMittelbar = (teamDetail.DirectIst / (teamDetail.DirectIst + teamDetail.MittelbarIst)) * 100;
teamDetail.SupportConceptDetailList.Sort((a, b) =>
{
if (a.Customer == null)
return 1;
if (b.Customer == null)
return -1;
return (a.Customer.Person.LastName + ", " + a.Customer.Person.FirstName).CompareTo(
b.Customer.Person.LastName + ", " + b.Customer.Person.FirstName);
});
}
}
public virtual void CreateEmployeeDetails(MitarbeiterauslastungRO ro)
{
foreach (var empDetail in ro.EmployeeDetailList)
{
if (empDetail.Employee != null)
{
CreateSupportConceptsForEmployee(ro, empDetail);
}
else if (empDetail.Customer != null)
{
CreateSupportConceptsForCustomer(ro, empDetail);
}
if (CreateIst())
{
CreateServiceRecordDetails(ro, empDetail);
}
empDetail.SupportConceptDetailList.Sort((a, b) =>
{
if (a.Customer == null)
return 1;
if (b.Customer == null)
return -1;
return (a.Customer.Person.LastName + ", " + a.Customer.Person.FirstName).CompareTo(
b.Customer.Person.LastName + ", " + b.Customer.Person.FirstName);
});
}
}
public virtual bool CreateIst()
{
return false;
}
private void CreateSupportConceptsForCustomer(MitarbeiterauslastungRO ro, MitarbeiterauslastungRO.EmployeeDetail empDetail)
{
var span = new DateTimeSpan();
span.StartDateTime = ro.ReportStartDate;
span.EndDateTime = ro.ReportEndDate;
//supportconcepts by SupportConceptApprovalPeriodOid
Dictionary<long, MitarbeiterauslastungRO.SupportConceptDetail> supportConceptByScapDict = new Dictionary<long, MitarbeiterauslastungRO.SupportConceptDetail>();
foreach (var sc in empDetail.Customer.SupportConcepts)
{
if (sc.IsActive != ActivationTypeId.Deleted && sc.CostBearer2SupportConceptList != null)
{
foreach (CostBearer2SupportConcept c2s in sc.CostBearer2SupportConceptList)
{
foreach (var scap in c2s.ApprovalPeriodList)
{
//scDC.ApprovedHoursPerWeek -= stundenVerbraucht;
//scDC.ApprovedHoursPerWeekWithRateFactor -= stundenVerbraucht;
if (!supportConceptByScapDict.ContainsKey(scap.Oid.Value))
{
MitarbeiterauslastungRO.SupportConceptDetail scDc =
GetOrCreateSupportConceptDetail(null, sc.Customer, scap, c2s,
ro.ReportStartDate, ro.ReportEndDate, null, false);
if (scDc != null &&
(scDc.ApprovedHoursPerWeek > 0 ||
scDc.ApprovedHoursPerWeekWithRateFactor > 0))
{
empDetail.SupportConceptDetailList.Add(scDc);
}
}
}
}
}
}
}
private void CreateSupportConceptsForEmployee(MitarbeiterauslastungRO ro, MitarbeiterauslastungRO.EmployeeDetail empDetail)
{
var emp = empDetail.Employee;
Contract contract = emp.GetValidContractForDate(ro.ReportStartDate);
if (contract != null)
{
empDetail.WeeklyTotalHoursByContract = contract.WeeklyTotalHours ?? 0;
empDetail.FLSTotalHoursByContract = contract.WeeklyFLS ?? 0;
}
empDetail.AbsenceTimeString = "";
if (emp.AbsenceTimes != null)
{
var sb = new StringBuilder();
var count = 1;
foreach (var at in emp.AbsenceTimes)
{
if (at.AbsenceSpan != null)
{
bool cont = true;
if (at.Start != null && at.Start >= ro.ReportEndDate)
{
cont = false;
}
if (cont && at.End != null && at.End < ro.ReportStartDate)
{
cont = false;
}
if (cont)
{
if (sb.Length > 0)
{
sb.Append(", ");
}
if (at.Start.HasValue)
{
sb.Append(string.Format("{0:00}", at.Start.Value.Day));
sb.Append(".");
sb.Append(string.Format("{0:00}", at.Start.Value.Month));
sb.Append(".");
sb.Append(at.Start.Value.Year.ToString().Substring(2));
if (at.End.HasValue)
{
sb.Append(" - ");
sb.Append(string.Format("{0:00}", at.End.Value.Day));
sb.Append(".");
sb.Append(string.Format("{0:00}", at.End.Value.Month));
sb.Append(".");
sb.Append(at.End.Value.Year.ToString().Substring(2));
}
}
sb.Append(" ");
sb.Append(at.AbsenceReason.Description);
count++;
}
}
}
if (sb.Length > 0)
{
empDetail.AbsenceTimeString = "Abwesenheiten: " + sb.ToString();
}
}
Dictionary<long, MitarbeiterauslastungRO.SupportConceptDetail> supportConceptByScapDict = new Dictionary<long, MitarbeiterauslastungRO.SupportConceptDetail>();
var anteile = CreateAuslastungAnteilig(emp);
foreach (var anteil in anteile)
{
var scap = anteil.SupportConceptApprovalPeriod;
var cb2sc = anteil.CostBearer2SupportConcept;
var sc = cb2sc.SupportConcept;
if (sc.IsActive != ActivationTypeId.Deleted && !supportConceptByScapDict.ContainsKey(scap.Oid.Value))
{
MitarbeiterauslastungRO.SupportConceptDetail scDc = GetOrCreateSupportConceptDetail(emp, sc.Customer, scap, cb2sc, ro.ReportStartDate, ro.ReportEndDate, anteil, false);
if (scDc != null)
{
supportConceptByScapDict.Add(scap.Oid.Value, scDc);
empDetail.SupportConceptDetailList.Add(scDc);
}
}
}
if (emp.Employee2CustomerList != null)
{
foreach (Employee2Customer e2c in emp.Employee2CustomerList)
{
bool isMainAttendant = false;
if (e2c.ValueList.Count > 0)
{
SystemEntryID? id = e2c.ValueList[0].Entry.SystemEntryID;
if (id.HasValue && id.Value == SystemEntryID.EmployeeRoleMainAttendant)
isMainAttendant = true;
}
if (isMainAttendant && e2c.Customer != null)
{
if (e2c.Customer.IsActive != ActivationTypeId.Deleted && e2c.Customer.SupportConcepts != null)
{
foreach (SupportConcept sc in e2c.Customer.SupportConcepts)
{
if (sc.IsActive != ActivationTypeId.Deleted && sc.CostBearer2SupportConceptList != null)
{
foreach (CostBearer2SupportConcept c2s in sc.CostBearer2SupportConceptList)
{
foreach (var scap in c2s.ApprovalPeriodList)
{
//scDC.ApprovedHoursPerWeek -= stundenVerbraucht;
//scDC.ApprovedHoursPerWeekWithRateFactor -= stundenVerbraucht;
if (!supportConceptByScapDict.ContainsKey(scap.Oid.Value))
{
MitarbeiterauslastungRO.SupportConceptDetail scDc = GetOrCreateSupportConceptDetail(emp, e2c.Customer, scap, c2s, ro.ReportStartDate, ro.ReportEndDate, null, true);
if (scDc != null)
{
if (scDc.ApprovedHoursPerWeek > 0 ||
scDc.ApprovedHoursPerWeekWithRateFactor > 0 ||
!CheckIfApprovedGreaterZero())
{
empDetail.SupportConceptDetailList.Add(scDc);
}
}
}
}
}
}
}
}
}
}
}
}
protected virtual bool CheckIfApprovedGreaterZero()
{
return true;
}
private MitarbeiterauslastungRO.SupportConceptDetail GetOrCreateSupportConceptDetail(Employee emp, Customer customer, SupportConceptApprovalPeriod scap, CostBearer2SupportConcept cb2sc, DateTime start, DateTime ende, AuslastungBerechnungHelper anteil, bool ausHauptbetreuung)
{
bool inTimeRange = true;
var realEnd = scap.EndDate;
//Prüfe ob vorher abgemeldet
if (customer.TerminationDate.HasValue &&
customer.TerminationDate.Value < realEnd)
{
realEnd = customer.TerminationDate.Value;
}
if (scap.StartDate.HasValue && realEnd.HasValue)
{
if (scap.StartDate >= ende || realEnd < ende.AddDays(-1))
{
inTimeRange = false;
}
}
if (inTimeRange)
{
String key = "";
if (emp != null)
{
key = String.Format("e{0}_{1}", emp.Oid.Value, scap.Oid.Value);
}
else
{
if (customer.Oid.Value == 277)
{
int test = 0;
}
key = String.Format("c{0}_{1}", customer.Oid.Value, scap.Oid.Value);
}
if (betreuungDict.ContainsKey(key))
{
return betreuungDict[key];
}
var scDC = new MitarbeiterauslastungRO.SupportConceptDetail();
scDC.Customer = customer;
scDC.SupportConceptApprovalPeriod = scap;
scDC.CostBearer2SupportConcept = cb2sc;
DateTime end = ende;
if (realEnd.HasValue && realEnd.Value < end)
{
end = realEnd.Value;
}
CalculateSoll(scDC, end);
if (ausHauptbetreuung)
{
var anteileAndererEmps = CreateAuslastungAnteilig(scap);
foreach (var ant in anteileAndererEmps)
{
var scDcAnteil =
GetOrCreateSupportConceptDetail(ant.Employee, customer, scap, cb2sc, start, ende, ant, false);
if (scDcAnteil != null)
{
scDC.ApprovedHoursPerWeek -= scDcAnteil.ApprovedHoursPerWeek;
scDC.ApprovedHoursPerWeekWithRateFactor -= scDcAnteil.ApprovedHoursPerWeekWithRateFactor;
}
}
}
else
{
ApplyBetreuungsschluessel(scDC, anteil);
}
if (betreuungDict.ContainsKey(key))
{
int test = 0;
}
else
{
betreuungDict.Add(key, scDC);
}
return scDC;
}
return null;
}
public virtual void ApplyBetreuungsschluessel(MitarbeiterauslastungRO.SupportConceptDetail scDc, AuslastungBerechnungHelper anteil)
{
if (anteil != null)
{
if (!anteil.IsBetreuungsschluesselAbsolut)
{
if (anteil.AnteilAnBetreuung == 33)
{
anteil.AnteilAnBetreuung = 100m / 3m;
}
else if (anteil.AnteilAnBetreuung == 67)
{
anteil.AnteilAnBetreuung = (100m / 3m) * 2;
}
scDc.ApprovedHoursPerWeek *= (anteil.AnteilAnBetreuung / 100);
scDc.ApprovedHoursPerWeekWithRateFactor *= (anteil.AnteilAnBetreuung / 100);
}
else
{
scDc.ApprovedHoursPerWeek = (anteil.AnteilAnBetreuung / 60) * (scDc.ApprovedHoursPerWeek / scDc.ApprovedHoursPerWeekWithRateFactor);
scDc.ApprovedHoursPerWeekWithRateFactor = anteil.AnteilAnBetreuung / 60;
}
}
}
public virtual IList<AuslastungBerechnungHelper> CreateAuslastungAnteilig(Employee emp)
{
var anteile = new List<AuslastungBerechnungHelper>();
var sp2eList = DAOFactory.SearchDAO.FindSupportConceptApprovalPeriod2Employees(emp);
foreach (var sp2e in sp2eList)
{
var helper = new AuslastungBerechnungHelper();
helper.SupportConceptApprovalPeriod = DAOFactory.GenericDAO.Unproxy(sp2e.SupportConceptApprovalPeriod);
helper.CostBearer2SupportConcept = DAOFactory.GenericDAO.Unproxy(helper.SupportConceptApprovalPeriod.CostBearer2SupportConcept);
helper.AnteilAnBetreuung = sp2e.Betreuungsschluessel;
helper.IsBetreuungsschluesselAbsolut = sp2e.IsAbsolut;
anteile.Add(helper);
}
return anteile;
}
public virtual IList<AuslastungBerechnungHelper> CreateAuslastungAnteilig(SupportConceptApprovalPeriod scap)
{
var anteile = new List<AuslastungBerechnungHelper>();
var sp2eList = DAOFactory.SearchDAO.FindSupportConceptApprovalPeriod2Employees(scap);
foreach (var sp2e in sp2eList)
{
var helper = new AuslastungBerechnungHelper();
helper.Employee = DAOFactory.GenericDAO.Unproxy(sp2e.Employee);
helper.SupportConceptApprovalPeriod = DAOFactory.GenericDAO.Unproxy(sp2e.SupportConceptApprovalPeriod);
helper.CostBearer2SupportConcept = DAOFactory.GenericDAO.Unproxy(helper.SupportConceptApprovalPeriod.CostBearer2SupportConcept);
helper.AnteilAnBetreuung = sp2e.Betreuungsschluessel;
helper.IsBetreuungsschluesselAbsolut = sp2e.IsAbsolut;
anteile.Add(helper);
}
return anteile;
}
public virtual void CreateServiceRecordDetails(MitarbeiterauslastungRO ro, MitarbeiterauslastungRO.EmployeeDetail empDetail)
{
IList<ServiceRecord> records = null;
var span = new DateTimeSpan();
span.StartDateTime = ro.ReportStartDate;
span.EndDateTime = ro.ReportEndDate.AddTicks(-1);
if (empDetail.Employee != null)
{
records = DAOFactory.SearchDAO.FindEmployeeServiceRecords(empDetail.Employee.Oid.Value, span, null, null);
}
else if (empDetail.Customer != null)
{
records = DAOFactory.SearchDAO.FindCustomerServiceRecords(empDetail.Customer.Oid.Value, span, null, null, false);
}
Dictionary<long, MitarbeiterauslastungRO.SupportConceptDetail> oid2SCDetailDict = new Dictionary<long, MitarbeiterauslastungRO.SupportConceptDetail>();
foreach (ServiceRecord sr in records)
{
if (sr.Start >= ro.ReportStartDate && sr.Start.Value < ro.ReportEndDate)
{
var scd = GetSupportConceptDetailForServiceRecord(empDetail, sr);
if (scd != null)
{
if (empDetail.Employee != null)
{
if (sr.EmployeeOid.HasValue && sr.EmployeeOid == empDetail.Employee.Oid)
{
AddServiceRecord(ro, scd, sr);
}
}
else if (empDetail.Customer != null)
{
AddServiceRecord(ro, scd, sr);
}
if (sr.GroupOid != null)
{
//groupBookingDict.Add(sr.GroupOid.Value, sr);
}
}
}
}
// foreach (var scd in empDetail.SupportConceptDetailList)
//{
// if (scd.CostBearer2SupportConcept != null)
// {
// Dictionary<long, bool> serviceRecordsProcessed = new Dictionary<long, bool>();
// Dictionary<long, ServiceRecord> groupBookingDict = new Dictionary<long, ServiceRecord>();
// foreach (ServiceRecord sr in records)
// {
// if (!serviceRecordsProcessed.ContainsKey(sr.Oid.Value) && sr.Start >= ro.ReportStartDate &&
// sr.Start.Value < ro.ReportEndDate)
// {
// if (empDetail.Employee != null)
// {
// if (sr.EmployeeOid.HasValue && sr.EmployeeOid == empDetail.Employee.Oid)
// {
// AddServiceRecord(ro, scd, sr);
// serviceRecordsProcessed.Add(sr.Oid.Value, true);
// }
// }
// else if (empDetail.Customer != null)
// {
// AddServiceRecord(ro, scd, sr);
// serviceRecordsProcessed.Add(sr.Oid.Value, true);
// }
// if (sr.GroupOid != null)
// {
// //groupBookingDict.Add(sr.GroupOid.Value, sr);
// }
// }
// }
// }
//}
//var emprecords = DAOFactory.SearchDAO.FindEmployeeServiceRecordsWithoutCustomer(empDetail.Employee.Oid.Value);
//foreach (var sr in emprecords)
//{
// empDetail.MinutesOfOtherActivities += sr.RoundedDuration;
//}
}
public virtual MitarbeiterauslastungRO.SupportConceptDetail GetSupportConceptDetailForServiceRecord(MitarbeiterauslastungRO.EmployeeDetail empDetail, ServiceRecord sr)
{
if (sr.CostBearer2SupportConcept == null)
{
foreach (var scdi in empDetail.SupportConceptDetailList)
{
if (scdi.SupportConceptApprovalPeriod == null)
{
return scdi;
}
}
}
SupportConceptApprovalPeriod scap = GetSupportConceptApprovalPeriodForServiceRecord(sr);
if (scap != null)
{
foreach (var scdi in empDetail.SupportConceptDetailList)
{
if (scdi.SupportConceptApprovalPeriod != null && scdi.SupportConceptApprovalPeriod.Oid == scap.Oid)
{
return scdi;
}
}
}
if (sr.ServiceDescription != null &&
sr.ServiceDescription.ServiceCategory != null &&
sr.ServiceDescription.ServiceCategory.IsBillable)
{
var scd = new MitarbeiterauslastungRO.SupportConceptDetail();
scd.Customer = sr.Customer;
scd.SupportConceptApprovalPeriod = scap;
scd.CostBearer2SupportConcept = sr.CostBearer2SupportConcept;
if (scd.SupportConceptApprovalPeriod != null)
{
scd.StartDate = scd.SupportConceptApprovalPeriod.StartDate;
scd.EndDate = scd.SupportConceptApprovalPeriod.EndDate;
}
else if (scd.CostBearer2SupportConcept != null)
{
scd.StartDate = scd.CostBearer2SupportConcept.StartDate;
scd.EndDate = scd.CostBearer2SupportConcept.EndDate;
}
empDetail.SupportConceptDetailList.Add(scd);
return scd;
}
return null;
}
public virtual SupportConceptApprovalPeriod GetSupportConceptApprovalPeriodForServiceRecord(ServiceRecord sr)
{
SupportConceptApprovalPeriod scapOhneCat = null;
if (sr.CostBearer2SupportConcept != null)
{
foreach (var scap in sr.CostBearer2SupportConcept.ApprovalPeriodList)
{
DateTime start = DateTime.MinValue;
DateTime end = DateTime.MaxValue;
if (scap.StartDate.HasValue)
start = scap.StartDate.Value;
if (scap.EndDate.HasValue && scap.EndDate.Value.Date < end)
end = scap.EndDate.Value.Date.AddDays(1);
if (sr.Start >= start && sr.End < end)
{
if (scap.ServiceCategory != null && scap.ServiceCategory.Oid == sr.ServiceDescription.ServiceCategory.Oid)
return scap;
if (scap.ServiceCategory == null)
{
scapOhneCat = scap;
}
}
}
}
return scapOhneCat;
}
public virtual void AddServiceRecord(MitarbeiterauslastungRO ro, MitarbeiterauslastungRO.SupportConceptDetail scDC, ServiceRecord sr)
{
var minutes = GetBillableDurationInMinutes(sr);
if (sr.ServiceDescription != null &&
sr.ServiceDescription.ServiceCategory != null &&
sr.ServiceDescription.ServiceCategory.IsBillable)
{
scDC.DirectIst += minutes;
AddToIstForKw(minutes, sr.Start.Value, ro.ReportStartDate, ro.ReportEndDate, scDC);
}
else
scDC.MittelbarIst += minutes;
}
private void AddToIstForKw(decimal minutes, DateTime datum, DateTime reportStart, DateTime reportEnd, MitarbeiterauslastungRO.SupportConceptDetail scDC)
{
DateTimeSpan kw1 = new DateTimeSpan();
kw1.StartDate = reportStart;
DateTime start = reportStart;
while (start.DayOfWeek != DayOfWeek.Sunday)
{
start = start.AddDays(1);
}
kw1.EndDate = start;
DateTimeSpan kw2 = new DateTimeSpan();
kw2.StartDate = kw1.EndDate.AddDays(1);
kw2.EndDate = kw2.StartDate.AddDays(6);
DateTimeSpan kw3 = new DateTimeSpan();
kw3.StartDate = kw2.EndDate.AddDays(1);
kw3.EndDate = kw3.StartDate.AddDays(6);
DateTimeSpan kw4 = new DateTimeSpan();
kw4.StartDate = kw3.EndDate.AddDays(1);
kw4.EndDate = kw4.StartDate.AddDays(6);
DateTimeSpan kw5 = new DateTimeSpan();
kw5.StartDate = kw4.EndDate.AddDays(1);
kw5.EndDate = kw5.StartDate.AddDays(6);
DateTimeSpan kw6 = new DateTimeSpan();
kw6.StartDate = kw5.EndDate.AddDays(1);
kw6.EndDate = kw6.StartDate.AddDays(6);
if (reportEnd <= kw5.EndDate)
{
kw5.EndDate = reportEnd.AddDays(-1);
}
if (reportEnd <= kw6.EndDate)
{
kw6.EndDate = reportEnd.AddDays(-1);
}
if (datum >= kw1.StartDate && datum.Date <= kw1.EndDate)
{
scDC.IstKw1 += minutes;
}
else if (datum >= kw2.StartDate && datum.Date <= kw2.EndDate)
{
scDC.IstKw2 += minutes;
}
else if (datum >= kw3.StartDate && datum.Date <= kw3.EndDate)
{
scDC.IstKw3 += minutes;
}
else if (datum >= kw4.StartDate && datum.Date <= kw4.EndDate && datum < reportEnd)
{
scDC.IstKw4 += minutes;
}
else if (datum >= kw5.StartDate && datum.Date <= kw5.EndDate && datum < reportEnd)
{
scDC.IstKw5 += minutes;
}
else if (datum >= kw6.StartDate && datum.Date <= kw6.EndDate && datum < reportEnd)
{
scDC.IstKw6 += minutes;
}
}
public virtual void AddServiceRecord(MitarbeiterauslastungRO.SupportConceptDetail scDC, ServiceRecord sr)
{
var minutes = GetBillableDurationInMinutes(sr);
if (sr.ServiceDescription != null &&
sr.ServiceDescription.ServiceCategory != null &&
sr.ServiceDescription.ServiceCategory.IsBillable)
scDC.DirectIst += minutes;
else
scDC.MittelbarIst += minutes;
}
public virtual decimal GetBillableDurationInMinutes(ServiceRecord record)
{
decimal rdMinutes = record.RoundedDuration;
if (record.ServiceDescription.ServiceCategory.Percentage != 100)
{
rdMinutes = (rdMinutes * record.ServiceDescription.ServiceCategory.Percentage) / 100;
}
if (record.GroupEmployeeCount.HasValue)
rdMinutes /= record.GroupEmployeeCount.Value;
return rdMinutes;
}
public virtual void CalculateSoll(MitarbeiterauslastungRO.SupportConceptDetail scDC, DateTime date)
{
if (scDC.CostBearer2SupportConcept != null && scDC.SupportConceptApprovalPeriod != null)
{
var calc = PluginLoader.FindClass<Calculations>(scDC.CostBearer2SupportConcept.CostBearer.ID) ?? Calculations.GetInstance(scDC.CostBearer2SupportConcept.CostBearer.ID);
var cb2scDc =
MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(scDC.CostBearer2SupportConcept);
var scapDc = MapperFactory.SupportConceptApprovalPeriodDC_SupportConceptApprovalPeriod.MapToNewDC(scDC.SupportConceptApprovalPeriod);
//scDC.ApprovedHoursPerWeek = calc.GetApprovedHoursPerWeek(cb2scDc, date) ?? 0m;
var bewilligt = calc.GetApprovedHoursPerWeek(scapDc, cb2scDc.CostBearer.CostRatePeriods) ?? 0m;
scDC.ApprovedHoursPerWeek = calc.ApplyIsCalculationWithFactor(cb2scDc, bewilligt) ?? 0m;
scDC.ApprovedHoursPerWeekWithRateFactor = bewilligt;
scDC.StartDate = scDC.SupportConceptApprovalPeriod.StartDate;
scDC.EndDate = scDC.SupportConceptApprovalPeriod.EndDate;
scDC.WeekCountUntilNow = calc.GetDurationInWeeksTillNow(cb2scDc, date) ?? 0;
}
else if (scDC.CostBearer2SupportConcept != null && scDC.SupportConceptApprovalPeriod == null)
{
var calc = PluginLoader.FindClass<Calculations>(scDC.CostBearer2SupportConcept.CostBearer.ID) ?? Calculations.GetInstance(scDC.CostBearer2SupportConcept.CostBearer.ID);
var cb2scDc =
MapperFactory.SupportConceptCostBearerRelDC_CostBearer2SupportConcept.MapToNewDC(scDC.CostBearer2SupportConcept);
scDC.ApprovedHoursPerWeek = calc.GetApprovedHoursPerWeek(cb2scDc, date) ?? 0m;
scDC.ApprovedHoursPerWeekWithRateFactor = calc.GetApprovedHoursPerWeek(cb2scDc, date, false) ?? 0m;
scDC.StartDate = scDC.CostBearer2SupportConcept.StartDate;
scDC.EndDate = scDC.CostBearer2SupportConcept.EndDate;
scDC.WeekCountUntilNow = calc.GetDurationInWeeksTillNow(cb2scDc, date) ?? 0;
}
}
public Contract GetNextValidContractForDate(DateTime dt, Employee emp)
{
Contract contractNextToStartDate = emp.GetValidContractForDate(dt);
if (contractNextToStartDate == null)
{
DateTime minDate = DateTime.MinValue;
DateTime maxDate = DateTime.MaxValue;
foreach (var item in emp.Contracts)
{
if (item.EntryDate.HasValue && item.EntryDate.Value >= dt)
{
if (contractNextToStartDate == null || item.EntryDate.Value < contractNextToStartDate.EntryDate.Value)
{
contractNextToStartDate = item;
}
}
}
}
return contractNextToStartDate;
}
}
public class AuslastungBerechnungHelper
{
public Employee Employee { get; set; }
public SupportConceptApprovalPeriod SupportConceptApprovalPeriod { get; set; }
public CostBearer2SupportConcept CostBearer2SupportConcept { get; set; }
public decimal AnteilAnBetreuung { get; set; }
public bool IsBetreuungsschluesselAbsolut { get; set; }
}
}