Performance Verbesserungen Urlaubskonto/Stundenkonto

This commit is contained in:
2026-07-14 15:41:32 +02:00
parent 1f853494ad
commit a939947d31
26 changed files with 2059 additions and 955 deletions

View File

@@ -1,19 +1,21 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using BeWo.Report;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Data.Access;
using BeWo.Report;
using BeWo.Service.Configuration;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Dienstplanung;
using BeWo.Service.Plugins;
using BeWo.Service.ServiceImplementations;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using DevExpress.XtraCharts.Native;
using BS.Shared.DataContracts;
using BeWo.Service.Plugins;
using BeWo.Service.DCEntityMapper;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Windows.Forms;
namespace BeWo.Report.ReportObjects
{
@@ -23,8 +25,9 @@ namespace BeWo.Report.ReportObjects
private AppSettings appSettings;
private const int ANZ_WOCHENTAGE = 5;
protected VacationService vacationService;
private IList<ServiceRecord> serviceRecordPool = null;
public MitarbeiterstundenkontoRO.EmployeeDetail AktuellBearbeitetesEmployeeDetail { get; set; }
public MitarbeiterstundenkontoRO.EmployeeDetail AktuellBearbeitetesEmployeeDetail { get; set; }
@@ -68,6 +71,10 @@ namespace BeWo.Report.ReportObjects
public virtual void CreateReport(MitarbeiterstundenkontoRO ro)
{
if (ro.AllServiceRecords == null)
{
ro.BerechneServiceRecordPool();
}
CreateEmployeeDetails(ro);
CreateTeamDetails(ro);
@@ -154,7 +161,7 @@ namespace BeWo.Report.ReportObjects
}
ServiceRecordSummary summaryTotal = new ServiceRecordSummary();
summaryTotal.RecordsImBerichtszeitraum = new List<ServiceRecord>();
summaryTotal.RecordsImBerichtszeitraum = new List<StundenkontoServiceRecord>();
decimal pause1 = 0;
decimal pause2 = 0;
@@ -169,14 +176,14 @@ namespace BeWo.Report.ReportObjects
decimal tatSollStdGesamt = 0;
decimal azDurchFeiertage = 0;
IList<ServiceRecord> groupFilteredRecords = empDetail.AllServiceRecords;
IList<StundenkontoServiceRecord> groupFilteredRecords = empDetail.AllServiceRecords;
if (groupFilteredRecords == null)
{
IList<ServiceRecord> recordsAll = DAOFactory.SearchDAO.FindServiceRecords(emp.Oid, null);
recordsAll = AnalysisServiceImp.FilterActiveServiceRecords(recordsAll);
//
groupFilteredRecords = new List<ServiceRecord>();
Debug.WriteLine($"Hole ServiceRecords with EmpOid: {emp.Oid}");
IList<StundenkontoServiceRecord> recordsAll = ro.AllServiceRecords.Where(s => s.EmployeeOid.HasValue && s.EmployeeOid == emp.Oid).ToList();
//IList<StundenkontoServiceRecord> recordsAll = new List<StundenkontoServiceRecord>();
groupFilteredRecords = new List<StundenkontoServiceRecord>();
Dictionary<long, bool> groupBookingDict = new Dictionary<long, bool>();
foreach (var item in recordsAll)
{
@@ -456,15 +463,15 @@ namespace BeWo.Report.ReportObjects
BerechneUeberstundenBis(empDetail, groupFilteredRecords, ro.ReportStartDate, out ueberstundenVormonat,
out alteExtraUeberstunden);
var alleDiensteintraege = DAOFactory.GenericDAO.GetAllActive<DienstEintrag>().Where(d => d.EmployeeOid == empDetail.Employee.Oid).ToList();
var alleDienstvertretungen = DAOFactory.GenericDAO.GetAllActive<Dienstvertretung>().Where(d => d.EmployeeOid == empDetail.Employee.Oid).ToList();
//var alleDiensteintraege = DAOFactory.GenericDAO.GetAllActive<DienstEintrag>().Where(d => d.EmployeeOid == empDetail.Employee.Oid).ToList();
//var alleDienstvertretungen = DAOFactory.GenericDAO.GetAllActive<Dienstvertretung>().Where(d => d.EmployeeOid == empDetail.Employee.Oid).ToList();
decimal? ueberstundenVormonatFuerDienstplanung;
decimal? alteExtraUeberstundenDienstplanung;
empDetail.DienstplanIst += BerechneDienstplanIst(empDetail, alleDiensteintraege, alleDienstvertretungen, ro.ReportStartDate,
out ueberstundenVormonatFuerDienstplanung, out alteExtraUeberstundenDienstplanung); // ABCDEF
//decimal? ueberstundenVormonatFuerDienstplanung;
//decimal? alteExtraUeberstundenDienstplanung;
//empDetail.DienstplanIst += BerechneDienstplanIst(empDetail, alleDiensteintraege, alleDienstvertretungen, ro.ReportStartDate,
// out ueberstundenVormonatFuerDienstplanung, out alteExtraUeberstundenDienstplanung); // ABCDEF
var dienstplanIstAlsStunden = empDetail.DienstplanIst / 60;
//var dienstplanIstAlsStunden = empDetail.DienstplanIst / 60;
decimal extraStunden = 0;
@@ -495,9 +502,8 @@ namespace BeWo.Report.ReportObjects
GetAbsenceTimeDaysWithWorkWeeks(emp, new DateTime(monatsAnfang.Year, 1, 1), monatsEnde, empDetail.ArbeitstageProWoche).TageUrlaub;
// Aktuellen Resturlaub berechnen
var vs = PluginLoader.FindClass<VacationService>();
// Darstellungsvariante, da das normale Urlaubskonto nur den Resturlaubsstand vom Ende des Jahres anzeigt.
var konto = vs.BerechneUrlaubskontoZurDarstellung(MapperFactory.EmployeeDC_Employee.MapToNewDC(emp), ro.ReportStartDate.Year, berichtsEnde.AddDays(-1));
// Darstellungsvariante, da das normale Urlaubskonto nur den Resturlaubsstand vom Ende des Jahres anzeigt.
var konto = vacationService.BerechneUrlaubskontoZurDarstellung(emp, ro.ReportStartDate.Year, berichtsEnde.AddDays(-1));
if (konto != null && konto.Count > 0)
{
var alleVertraglichenBudgets = konto
@@ -505,7 +511,7 @@ namespace BeWo.Report.ReportObjects
.ToList();
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)
{
@@ -520,7 +526,7 @@ namespace BeWo.Report.ReportObjects
}
}
}
CalculateEmployeeSalary(empDetail, berichtsAnfang, berichtsEnde);
}
@@ -766,7 +772,7 @@ namespace BeWo.Report.ReportObjects
}
protected virtual AbsenceTimeHours GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, Contract c, IList<ServiceRecord> groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde)
protected virtual AbsenceTimeHours GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, Contract c, IList<StundenkontoServiceRecord> groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde)
{
return null;
}
@@ -1002,7 +1008,7 @@ namespace BeWo.Report.ReportObjects
{
foreach (var sr in empDetail.ServiceRecordsInSelectedTimeSpan)
{
if (sr.ServiceDescription.Name != "Freizeit" || sr.ServiceDescription.ServiceCategory.Name != "Selbstzahler Freizeit")
if (sr.ServiceDescription.Name != "Freizeit" || sr.ServiceDescription.Category.Name != "Selbstzahler Freizeit")
{
Contract con = empDetail.Employee.GetValidContractForDate(sr.Start);
if (con != null && con.HourlyRate.HasValue)
@@ -1017,21 +1023,21 @@ namespace BeWo.Report.ReportObjects
empDetail.EmployeeSalaryByHours = salary;
}
protected virtual ServiceRecordSummary BerechneStunden(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList<ServiceRecord> groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde)
protected virtual 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<ServiceRecord>();
sum.RecordsImBerichtszeitraum = new List<StundenkontoServiceRecord>();
empDetail.ServiceRecordsInSelectedTimeSpan = new List<ServiceRecord>();
empDetail.ServiceRecordsInSelectedTimeSpan = new List<StundenkontoServiceRecord>();
foreach (var item in groupFilteredRecords)
{
if (!IsServiceRecordFehlzeit(item))
{
if (item.Start.Value >= berichtsAnfang && item.Start.Value < berichtsEnde)
if (item.Start >= berichtsAnfang && item.Start < berichtsEnde)
{
//String test = String.Format("{0:dd.MM.yyyy HH:mm}, {1:0} Minuten, {2}, {3}", item.Start, item.RoundedDuration, item.ServiceDescription.Name, item.Notice);
@@ -1047,7 +1053,7 @@ namespace BeWo.Report.ReportObjects
{
arbeitszeit += duration;
}
else if (item.ServiceDescription != null && item.ServiceDescription.ServiceCategory != null && item.ServiceDescription.ServiceCategory.IsBillable)
else if (item.ServiceDescription != null && item.ServiceDescription.Category != null && item.ServiceDescription.Category.IsBillable)
{
flsGesamt += duration;
}
@@ -1059,8 +1065,8 @@ namespace BeWo.Report.ReportObjects
decimal duration = GetDuration(item, empDetail);
if (item.ServiceDescription != null &&
item.ServiceDescription.ServiceCategory != null &&
item.ServiceDescription.ServiceCategory.IsBillable)
item.ServiceDescription.Category != null &&
item.ServiceDescription.Category.IsBillable)
sum.IstAbrechenbar += duration;
else
sum.IstNichtAbrechenbar += duration;
@@ -1072,9 +1078,9 @@ namespace BeWo.Report.ReportObjects
{
prozent = item.ServiceDescription.ProzentStundenkonto.Value;
}
else if (item.ServiceDescription.ServiceCategory.ProzentStundenkonto.HasValue)
else if (item.ServiceDescription.Category.ProzentStundenkonto.HasValue)
{
prozent = item.ServiceDescription.ServiceCategory.ProzentStundenkonto.Value;
prozent = item.ServiceDescription.Category.ProzentStundenkonto.Value;
}
if (prozent == 0)
{
@@ -1110,17 +1116,17 @@ namespace BeWo.Report.ReportObjects
return false;
}
public virtual decimal BerechneAutoPausen(IList<ServiceRecord> recordsThisMonth)
public virtual decimal BerechneAutoPausen(IList<StundenkontoServiceRecord> recordsThisMonth)
{
return 0;
}
public virtual decimal BerechnePauseMinuten(IList<ServiceRecord> srList)
public virtual decimal BerechnePauseMinuten(IList<StundenkontoServiceRecord> srList)
{
decimal pausenZeit = 0;
List<ServiceRecord> pausen = new List<ServiceRecord>();
List<ServiceRecord> nichtpausen = new List<ServiceRecord>();
List<StundenkontoServiceRecord> pausen = new List<StundenkontoServiceRecord>();
List<StundenkontoServiceRecord> nichtpausen = new List<StundenkontoServiceRecord>();
foreach (var sr in srList)
{
@@ -1140,20 +1146,20 @@ namespace BeWo.Report.ReportObjects
{
var pauseSpan = new DateTimeSpan
{
StartDateTime = pause.Start.Value,
EndDateTime = pause.Start.Value.AddMinutes((double)pause.RoundedDuration)
StartDateTime = pause.Start,
EndDateTime = pause.Start.AddMinutes((double)pause.RoundedDuration)
};
var arbeitszeitSpan = new DateTimeSpan
{
StartDateTime = arbeitszeit.Start.Value,
EndDateTime = arbeitszeit.Start.Value.AddMinutes((double)arbeitszeit.RoundedDuration)
StartDateTime = arbeitszeit.Start,
EndDateTime = arbeitszeit.Start.AddMinutes((double)arbeitszeit.RoundedDuration)
};
if (arbeitszeit.GroupOid.HasValue)
{
arbeitszeitSpan.EndDateTime =
arbeitszeit.Start.Value.AddMinutes((double)(arbeitszeit.GroupRoundedDuration ?? 0));
arbeitszeit.Start.AddMinutes((double)(arbeitszeit.GroupRoundedDuration ?? 0));
}
@@ -1209,14 +1215,14 @@ namespace BeWo.Report.ReportObjects
return newEmpList;
}
public virtual void HandleServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList<ServiceRecord> groupFilteredRecords, Contract contract)
public virtual void HandleServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList<StundenkontoServiceRecord> groupFilteredRecords, Contract contract)
{
//do nothing
}
public virtual void CorrectOverlappingTimes(IList<ServiceRecord> serviceRecords)
public virtual void CorrectOverlappingTimes(IList<StundenkontoServiceRecord> serviceRecords)
{
List<ServiceRecord> oldRecords = new List<ServiceRecord>();
List<StundenkontoServiceRecord> oldRecords = new List<StundenkontoServiceRecord>();
foreach (var newRecord in serviceRecords)
{
@@ -1224,7 +1230,7 @@ namespace BeWo.Report.ReportObjects
{
continue;
}
if (newRecord.Start.HasValue && newRecord.Start.Value.Second > 0)
if (newRecord.Start.Second > 0)
{
continue;
}
@@ -1238,8 +1244,8 @@ namespace BeWo.Report.ReportObjects
}
var newSpan = new DateTimeSpan
{
StartDateTime = newRecord.Start.Value,
EndDateTime = newRecord.Start.Value.AddMinutes((double)minuten)
StartDateTime = newRecord.Start,
EndDateTime = newRecord.Start.AddMinutes((double)minuten)
};
foreach (var oldRecord in oldRecords)
@@ -1250,12 +1256,12 @@ namespace BeWo.Report.ReportObjects
}
var oldSpan = new DateTimeSpan
{
StartDateTime = oldRecord.Start.Value,
EndDateTime = oldRecord.Start.Value.AddMinutes((double)oldRecord.RoundedDuration)
StartDateTime = oldRecord.Start,
EndDateTime = oldRecord.Start.AddMinutes((double)oldRecord.RoundedDuration)
};
if (oldRecord.GroupRoundedDuration.HasValue)
{
oldSpan.EndDateTime = oldRecord.Start.Value.AddMinutes((double)oldRecord.GroupRoundedDuration);
oldSpan.EndDateTime = oldRecord.Start.AddMinutes((double)oldRecord.GroupRoundedDuration);
}
if (oldSpan.Overlaps(newSpan))
@@ -1283,11 +1289,11 @@ namespace BeWo.Report.ReportObjects
if (!isGroup)
{
newRecord.RoundedDuration =
(decimal)newRecord.End.Value.Subtract(newRecord.Start.Value).TotalMinutes;
(decimal)newRecord.End.Subtract(newRecord.Start).TotalMinutes;
}
else
{
newRecord.GroupRoundedDuration = (decimal)newRecord.End.Value.Subtract(newRecord.Start.Value).TotalMinutes;
newRecord.GroupRoundedDuration = (decimal)newRecord.End.Subtract(newRecord.Start).TotalMinutes;
}
}
else
@@ -1304,11 +1310,11 @@ namespace BeWo.Report.ReportObjects
if (!oldRecord.GroupRoundedDuration.HasValue)
//if (!isGroup)
{
oldRecord.RoundedDuration = (decimal)oldRecord.End.Value.Subtract(oldRecord.Start.Value).TotalMinutes;
oldRecord.RoundedDuration = (decimal)oldRecord.End.Subtract(oldRecord.Start).TotalMinutes;
}
else
{
oldRecord.GroupRoundedDuration = (decimal)oldRecord.End.Value.Subtract(oldRecord.Start.Value).TotalMinutes;
oldRecord.GroupRoundedDuration = (decimal)oldRecord.End.Subtract(oldRecord.Start).TotalMinutes;
}
}
@@ -1320,12 +1326,12 @@ namespace BeWo.Report.ReportObjects
}
}
public virtual bool CorrectOverlappingTime(ServiceRecord newRecord)
public virtual bool CorrectOverlappingTime(StundenkontoServiceRecord newRecord)
{
return true;
}
public virtual bool CorrectOverlappingTime(ServiceRecord record1, ServiceRecord record2)
public virtual bool CorrectOverlappingTime(StundenkontoServiceRecord record1, StundenkontoServiceRecord record2)
{
return true;
}
@@ -1396,7 +1402,7 @@ namespace BeWo.Report.ReportObjects
return null;
}
public virtual void HandleServiceRecord(MitarbeiterstundenkontoRO.EmployeeDetail emp, ServiceRecord item)
public virtual void HandleServiceRecord(MitarbeiterstundenkontoRO.EmployeeDetail emp, StundenkontoServiceRecord item)
{
//do nothing
}
@@ -1416,7 +1422,7 @@ namespace BeWo.Report.ReportObjects
return false;
}
public virtual IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
public virtual IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<StundenkontoServiceRecord> recordsAll)
{
if (ShouldCreateDayDetailsForEachServiceRecord())
{
@@ -1433,13 +1439,9 @@ namespace BeWo.Report.ReportObjects
foreach (var sr in recordsAll)
{
if (sr.Start.HasValue && sr.Start >= berichtStart && sr.Start < berichtEnde && sr.End.HasValue)
if (sr.Start >= berichtStart && sr.Start < berichtEnde)
{
if (sr.Start.Value.Year == 2023 && sr.Start.Value.Month == 10 && sr.Start.Value.Day == 3)
{
int test = 0;
}
var dd = dayToDetail[sr.Start.Value.Day];
var dd = dayToDetail[sr.Start.Day];
if (!IsServiceRecordFehlzeit(sr) && AddServiceRecordToDuration(sr))
{
@@ -1448,7 +1450,7 @@ namespace BeWo.Report.ReportObjects
TimeSpan tspan = TimeSpan.FromMinutes((double)dd.MinutesTotal);
dd.TimeTotal = String.Format("{0:00}:{1:00}", tspan.Hours, tspan.Minutes);
if (dd.ServiceRecords == null)
dd.ServiceRecords = new List<ServiceRecord>();
dd.ServiceRecords = new List<StundenkontoServiceRecord>();
dd.ServiceRecords.Add(sr);
CalculateSpecialHours(dd, sr, duration);
@@ -1474,14 +1476,14 @@ namespace BeWo.Report.ReportObjects
foreach (var sr in orderedList)
{
if (sr.Start.HasValue && sr.Start.Value.Hour == 0 && sr.Start.Value.Second > 0)
if (sr.Start.Hour == 0 && sr.Start.Second > 0)
{
continue;
}
decimal duration = GetDuration(sr, ed);
DateTime dtEnd = sr.Start.Value.AddMinutes((double)duration);
DateTime dtEnd = sr.Start.AddMinutes((double)duration);
if (sr.Start > lastEnd)
{
gapCount++;
@@ -1507,7 +1509,7 @@ namespace BeWo.Report.ReportObjects
if (sr.Start < currentSpan.StartDateTime)
{
currentSpan.StartDateTime = sr.Start.Value;
currentSpan.StartDateTime = sr.Start;
}
if (dtEnd > currentSpan.EndDateTime)
{
@@ -1568,21 +1570,21 @@ namespace BeWo.Report.ReportObjects
return dayToDetail.Values.OrderBy(dd => dd.Date).ToList();
}
public virtual IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetailsForEachServiceRecord(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
public virtual IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetailsForEachServiceRecord(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<StundenkontoServiceRecord> recordsAll)
{
var details = new List<MitarbeiterstundenkontoRO.DayDetail>();
foreach (var sr in recordsAll)
{
if (sr.Start.HasValue && sr.Start >= berichtStart && sr.Start < berichtEnde && sr.End.HasValue)
if (sr.Start >= berichtStart && sr.Start < berichtEnde)
{
if (sr.Start.Value.Day == 8)
if (sr.Start.Day == 8)
{
int test = 0;
}
if (!IsServiceRecordFehlzeit(sr) && AddServiceRecordToDuration(sr))
{
var dd = CreateDayDetail(sr.Start.Value, ed);
var dd = CreateDayDetail(sr.Start, ed);
details.Add(dd);
decimal duration = GetDuration(sr, ed);
@@ -1592,14 +1594,14 @@ namespace BeWo.Report.ReportObjects
TimeSpan tspan = TimeSpan.FromMinutes((double)dd.MinutesTotal);
dd.TimeTotal = String.Format("{0:00}:{1:00}", tspan.Hours, tspan.Minutes);
if (dd.ServiceRecords == null)
dd.ServiceRecords = new List<ServiceRecord>();
dd.ServiceRecords = new List<StundenkontoServiceRecord>();
dd.ServiceRecords.Add(sr);
dd.Date = sr.Start.Value;
dd.Date = sr.Start;
if (sr.Start.Value.Second == 0)
if (sr.Start.Second == 0)
{
DateTime dtEnd = sr.Start.Value.AddMinutes((double)duration);
DateTime dtEnd = sr.Start.AddMinutes((double)duration);
dd.StartDateTime1 = sr.Start;
dd.EndDateTime1 = dtEnd;
@@ -1615,7 +1617,7 @@ namespace BeWo.Report.ReportObjects
return details.OrderBy(dd => dd.Date).ToList();
}
protected virtual decimal GetDuration(ServiceRecord sr, MitarbeiterstundenkontoRO.EmployeeDetail ed)
protected virtual decimal GetDuration(StundenkontoServiceRecord sr, MitarbeiterstundenkontoRO.EmployeeDetail ed)
{
foreach (var at in ed.Employee.AbsenceTimes)
@@ -1660,13 +1662,13 @@ namespace BeWo.Report.ReportObjects
}
else
{
duration = (decimal)sr.End.Value.Subtract(sr.Start.Value).TotalMinutes;
duration = (decimal)sr.End.Subtract(sr.Start).TotalMinutes;
}
}
if (UseServiceDescriptionPercentage())
{
decimal prozent = sr.ServiceDescription.ServiceCategory.ProzentStundenkonto ?? sr.ServiceDescription.ServiceCategory.ProzentAbrechnung;
decimal prozent = sr.ServiceDescription.Category.ProzentStundenkonto ?? sr.ServiceDescription.Category.Percentage;
if (sr.ServiceDescription.ProzentStundenkonto.HasValue)
{
@@ -1681,9 +1683,9 @@ namespace BeWo.Report.ReportObjects
{
prozent = sr.ServiceDescription.ProzentStundenkonto.Value;
}
else if (sr.ServiceDescription.ServiceCategory.ProzentStundenkonto.HasValue)
else if (sr.ServiceDescription.Category.ProzentStundenkonto.HasValue)
{
prozent = sr.ServiceDescription.ServiceCategory.ProzentStundenkonto.Value;
prozent = sr.ServiceDescription.Category.ProzentStundenkonto.Value;
}
@@ -1695,42 +1697,42 @@ namespace BeWo.Report.ReportObjects
}
//Mit "SpecialHours" sind Sonderzeiten wie Nachtzeiten oder Arbeitszeiten sonn- und feiertags gemeint. Da diese gesondert abgerechnet werden können.
public virtual void CalculateSpecialHours(MitarbeiterstundenkontoRO.DayDetail dd, ServiceRecord sr, decimal duration)
public virtual void CalculateSpecialHours(MitarbeiterstundenkontoRO.DayDetail dd, StundenkontoServiceRecord sr, decimal duration)
{
//Prüfe, ob Start oder Ende des Eintrags an einem Sonntag sind, dann die am Sonntag geleisteten Minuten berechnen
//Todo: Bei mehrtägigen Einträgen prüfen, ob sie vor einem Sonntag anfangen und nach einem Sonntag enden. Unklar, ob das vorkommen kann und ob dann Sonntagszuschläge berechnet werden müssen
if (sr.Start.Value.DayOfWeek == DayOfWeek.Sunday || sr.End.Value.DayOfWeek == DayOfWeek.Sunday)
if (sr.Start.DayOfWeek == DayOfWeek.Sunday || sr.End.DayOfWeek == DayOfWeek.Sunday)
{
DateTime sonntag = sr.Start.Value.Date;
if (sr.Start.Value.DayOfWeek != DayOfWeek.Sunday && sr.End.Value.DayOfWeek == DayOfWeek.Sunday)
DateTime sonntag = sr.Start.Date;
if (sr.Start.DayOfWeek != DayOfWeek.Sunday && sr.End.DayOfWeek == DayOfWeek.Sunday)
{
sonntag = sr.End.Value.Date;
sonntag = sr.End.Date;
}
var sonnatgsMinuten = GetOverlappingMinutes(sr.Start.Value, sr.End.Value, sonntag, sonntag.AddDays(1));
var sonnatgsMinuten = GetOverlappingMinutes(sr.Start, sr.End, sonntag, sonntag.AddDays(1));
dd.HoursSunday += (decimal)sonnatgsMinuten / 60;
}
//Prüfe, ob Start oder Ende des Eintrags an einem Feiertag sind, dann die am Feiertag geleisteten Minuten berechnen
//Todo: Bei mehrtägigen Einträgen prüfen, ob sie vor einem Feiertag anfangen und nach einem Feiertag enden. Unklar, ob das vorkommen kann
else if (IstFeiertag(sr.Start.Value) || IstFeiertag(sr.End.Value))
else if (IstFeiertag(sr.Start) || IstFeiertag(sr.End))
{
var feiertagsMinuten = duration;
DateTime feiertag = sr.Start.Value.Date;
if (IstFeiertag(sr.Start.Value) && !IstFeiertag(sr.End.Value))
DateTime feiertag = sr.Start.Date;
if (IstFeiertag(sr.Start) && !IstFeiertag(sr.End))
{
feiertagsMinuten = (decimal) GetOverlappingMinutes(sr.Start.Value, sr.End.Value, feiertag, feiertag.AddDays(1));
feiertagsMinuten = (decimal) GetOverlappingMinutes(sr.Start, sr.End, feiertag, feiertag.AddDays(1));
}
else if (!IstFeiertag(sr.Start.Value) && IstFeiertag(sr.End.Value))
else if (!IstFeiertag(sr.Start) && IstFeiertag(sr.End))
{
feiertag = sr.End.Value.Date;
feiertagsMinuten = (decimal) GetOverlappingMinutes(sr.Start.Value, sr.End.Value, feiertag, feiertag.AddDays(1));
feiertag = sr.End.Date;
feiertagsMinuten = (decimal) GetOverlappingMinutes(sr.Start, sr.End, feiertag, feiertag.AddDays(1));
}
dd.HoursHoliday += feiertagsMinuten / 60;
}
if (sr.Start.Value.Second == 0 && dd.NightEnd.HasValue && dd.NightStart.HasValue)
if (sr.Start.Second == 0 && dd.NightEnd.HasValue && dd.NightStart.HasValue)
{
var minuten = CheckNachtzeiten(sr.Start.Value, dd.NightStart.Value, dd.NightEnd.Value, (double)duration);
var minuten = CheckNachtzeiten(sr.Start, dd.NightStart.Value, dd.NightEnd.Value, (double)duration);
if (minuten > 0)
{
@@ -2174,7 +2176,7 @@ namespace BeWo.Report.ReportObjects
}
public virtual bool AddServiceRecordToDuration(ServiceRecord item)
public virtual bool AddServiceRecordToDuration(StundenkontoServiceRecord item)
{
if (Settings.ShowWorktime && Settings.EnableArbeitszeiterfassung)
{
@@ -2185,11 +2187,11 @@ namespace BeWo.Report.ReportObjects
return true;
}
public virtual bool IstArbeitszeit(ServiceRecord item)
public virtual bool IstArbeitszeit(StundenkontoServiceRecord item)
{
if (item.ServiceDescription != null && item.ServiceDescription.ServiceCategory != null)
if (item.ServiceDescription != null && item.ServiceDescription.Category != null)
{
if (item.ServiceDescription.Name.StartsWith("Arbeitszeit") || item.ServiceDescription.ServiceCategory.Name.StartsWith("Arbeitszeit")) //Arbeitszeit und Arbeitszeiterfassung etc.
if (item.ServiceDescription.Name.StartsWith("Arbeitszeit") || item.ServiceDescription.Category.Name.StartsWith("Arbeitszeit")) //Arbeitszeit und Arbeitszeiterfassung etc.
{
return true;
}
@@ -2202,7 +2204,7 @@ namespace BeWo.Report.ReportObjects
return 1;
}
public virtual MitarbeiterstundenkontoRO.EmployeeDetail BerechneUeberstundenBis(MitarbeiterstundenkontoRO.EmployeeDetail edOrig, IList<ServiceRecord> records, DateTime monat, out decimal? ueberstunden, out decimal alteExtraUeberstunden)
public virtual MitarbeiterstundenkontoRO.EmployeeDetail BerechneUeberstundenBis(MitarbeiterstundenkontoRO.EmployeeDetail edOrig, IList<StundenkontoServiceRecord> records, DateTime monat, out decimal? ueberstunden, out decimal alteExtraUeberstunden)
{
MitarbeiterstundenkontoRO.EmployeeDetail edTotal = new MitarbeiterstundenkontoRO.EmployeeDetail();
@@ -2218,7 +2220,7 @@ namespace BeWo.Report.ReportObjects
if (c != null)
{
Dictionary<String, IList<ServiceRecord>> srDict = CreateServiceRecordDictByDate(records);
Dictionary<String, IList<StundenkontoServiceRecord>> srDict = CreateServiceRecordDictByDate(records);
DateTime start = c.EntryDate.HasValue ? c.EntryDate.Value : new DateTime(2011, 1, 1);
if (BerechnungsStartdatum > start)
@@ -2260,14 +2262,14 @@ namespace BeWo.Report.ReportObjects
if (contractEnd < DateTime.MaxValue && contractEnd.Date.AddDays(1) < ende)
ende = contractEnd.Date.AddDays(1);
IList<ServiceRecord> recordsThisMonth = new List<ServiceRecord>();
IList<StundenkontoServiceRecord> recordsThisMonth = new List<StundenkontoServiceRecord>();
String key = String.Format("{0:yyyyMM}", start);
if (srDict.ContainsKey(key))
{
foreach (var item in srDict[key])
{
if (item.Start.HasValue && item.Start >= start && item.Start < ende)
if (item.Start >= start && item.Start < ende)
{
if (AddServiceRecordToDuration(item))
{
@@ -2278,8 +2280,8 @@ namespace BeWo.Report.ReportObjects
minutenMonat += duration;
if (item.ServiceDescription != null &&
item.ServiceDescription.ServiceCategory != null &&
item.ServiceDescription.ServiceCategory.IsBillable)
item.ServiceDescription.Category != null &&
item.ServiceDescription.Category.IsBillable)
flsIst += duration;
else
mittelbarIst += duration;
@@ -2783,35 +2785,34 @@ namespace BeWo.Report.ReportObjects
return stunden;
}
public virtual Dictionary<string, IList<ServiceRecord>> CreateServiceRecordDictByDate(IList<ServiceRecord> records)
public virtual Dictionary<string, IList<StundenkontoServiceRecord>> CreateServiceRecordDictByDate(IList<StundenkontoServiceRecord> records)
{
var dict = new Dictionary<string, IList<ServiceRecord>>();
var dict = new Dictionary<string, IList<StundenkontoServiceRecord>>();
foreach (var item in records)
{
if (!IsServiceRecordFehlzeit(item))
{
if (item.Start.HasValue)
{
String key = String.Format("{0:yyyyMM}", item.Start.Value);
String key = String.Format("{0:yyyyMM}", item.Start);
IList<ServiceRecord> list;
if (!dict.ContainsKey(key))
{
list = new List<ServiceRecord>();
dict.Add(key, list);
}
else
{
list = dict[key];
}
list.Add(item);
IList<StundenkontoServiceRecord> list;
if (!dict.ContainsKey(key))
{
list = new List<StundenkontoServiceRecord>();
dict.Add(key, list);
}
else
{
list = dict[key];
}
list.Add(item);
}
}
return dict;
}
public virtual decimal GetAdditionalHours(IList<MitarbeiterstundenkontoRO.DayDetail> days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
public virtual decimal GetAdditionalHours(IList<MitarbeiterstundenkontoRO.DayDetail> days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<StundenkontoServiceRecord> recordsAll)
{
decimal addHours = 0;
@@ -3497,13 +3498,13 @@ namespace BeWo.Report.ReportObjects
return GetAbsenceTimeDaysWithWorkWeeks(absenceTimes, start, end, ANZ_WOCHENTAGE);
}
public virtual decimal? GetFehlzeiten(IList<ServiceRecord> records, DateTime monat)
public virtual decimal? GetFehlzeiten(IList<StundenkontoServiceRecord> records, DateTime monat)
{
return GetFehlzeiten(records, monat, monat.AddMonths(1));
}
public virtual decimal? GetFehlzeiten(IList<ServiceRecord> records, DateTime start, DateTime ende)
public virtual decimal? GetFehlzeiten(IList<StundenkontoServiceRecord> records, DateTime start, DateTime ende)
{
decimal? stunden = null;
decimal minuten = 0;
@@ -3513,7 +3514,7 @@ namespace BeWo.Report.ReportObjects
{
if (IsServiceRecordFehlzeit(item))
{
if (item.Start.Value >= start && item.Start.Value < ende)
if (item.Start >= start && item.Start < ende)
{
if (item.GroupRoundedDuration.HasValue)
{
@@ -3527,7 +3528,7 @@ namespace BeWo.Report.ReportObjects
}
else
{
minuten += (decimal)item.End.Value.Subtract(item.Start.Value).TotalMinutes;
minuten += (decimal)item.End.Subtract(item.Start).TotalMinutes;
}
}
}
@@ -3684,9 +3685,9 @@ namespace BeWo.Report.ReportObjects
return VacationService.GetOsterSonntag(year);
}
public virtual bool IsServiceRecordFehlzeit(ServiceRecord sr)
public virtual bool IsServiceRecordFehlzeit(StundenkontoServiceRecord sr)
{
if (sr.ServiceDescription != null && sr.ServiceDescription.ServiceCategory != null && !String.IsNullOrEmpty(sr.ServiceDescription.ServiceCategory.Name) && sr.ServiceDescription.ServiceCategory.Name.ToLower().IndexOf("fehlzeit") >= 0)
if (sr.ServiceDescription != null && sr.ServiceDescription.Category != null && !String.IsNullOrEmpty(sr.ServiceDescription.Category.Name) && sr.ServiceDescription.Category.Name.ToLower().IndexOf("fehlzeit") >= 0)
return true;
return false;
}
@@ -3772,6 +3773,6 @@ namespace BeWo.Report.ReportObjects
public decimal IstNichtAbrechenbar { get; set; }
public IList<ServiceRecord> RecordsImBerichtszeitraum { get; set; }
public IList<StundenkontoServiceRecord> RecordsImBerichtszeitraum { get; set; }
}
}

View File

@@ -1,15 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using BeWo.Report;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Data.Access;
using BeWo.Report;
using BeWo.Service.Configuration;
using BeWo.Service.Dienstplanung;
using BeWo.Service.Plugins;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.Extensions;
using BeWo.Service.Plugins;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace BeWo.Report.ReportObjects
{
@@ -20,6 +21,8 @@ namespace BeWo.Report.ReportObjects
DateTime start = ro.ReportStartDate;
var list = new List<MitarbeiterstundenkontoRO>();
List<StundenkontoServiceRecord> allServiceRecords = null;
while (start < ro.ReportEndDate)
{
DateTime monatStart = new DateTime(start.Year, start.Month, 1);
@@ -27,6 +30,17 @@ namespace BeWo.Report.ReportObjects
MitarbeiterstundenkontoRO roMonat = MitarbeiterstundenkontoRO.Create(ro.EmployeeOid, ro.TeamOids,
monatStart, monatEnde, ro.EmployeeOids);
if (allServiceRecords == null)
{
roMonat.BerechneServiceRecordPool();
allServiceRecords = roMonat.AllServiceRecords;
}
else
{
roMonat.AllServiceRecords = allServiceRecords;
}
var b = CreateMitarbeiterstundenkontoBerechnung();
b.CreateReport(roMonat);

View File

@@ -1,13 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using BS.Shared.Core;
using BeWo.Data.Access;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.Dienstplanung;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace BeWo.Report.ReportObjects
{
@@ -15,8 +17,8 @@ namespace BeWo.Report.ReportObjects
{
List<EmployeeDetail> _EmployeeDetailList = new List<EmployeeDetail>();
List<TeamDetail> _TeamDetailList = new List<TeamDetail>();
public DateTime ReportStartDate { get; set; }
List<StundenkontoServiceRecord> _AllServiceRecords = null;
public DateTime ReportStartDate { get; set; }
public DateTime ReportEndDate { get; set; }
public decimal SollGesamt { get; set; }
@@ -50,7 +52,13 @@ namespace BeWo.Report.ReportObjects
set { this._TeamDetailList = value; }
}
public static MitarbeiterstundenkontoRO Create(long? employeeOid, IList<long> teamOids, DateTime startDate, DateTime endDate, IEnumerable<long> employeeOids)
public List<StundenkontoServiceRecord> AllServiceRecords
{
get { return this._AllServiceRecords; }
set { this._AllServiceRecords = value; }
}
public static MitarbeiterstundenkontoRO Create(long? employeeOid, IList<long> teamOids, DateTime startDate, DateTime endDate, IEnumerable<long> employeeOids)
{
Team team = null;
@@ -171,7 +179,73 @@ namespace BeWo.Report.ReportObjects
return ro;
}
public void BerechneServiceRecordPool()
{
_AllServiceRecords = new List<StundenkontoServiceRecord>();
var allServiceDescs = DAOFactory.GenericDAO.GetAll<ServiceDescription>();
Dictionary<long, ServiceDescriptionDC> serviceDict = new Dictionary<long, ServiceDescriptionDC>();
foreach (var item in allServiceDescs)
{
serviceDict.Add(item.Oid.Value, MapperFactory.ServiceDescriptionDC_ServiceDescription.MapToNewDC(item));
}
String sql = "SELECT Oid, StartDate, EndDate, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid, DistanceInMeter, Betrag, CostBearer2SupportConceptOid, ServiceDescriptionOid, CustomerOid, EmployeeOid FROM servicerecord";
sql += String.Format(" WHERE EmployeeOid in ({0})", String.Join(",", EmployeeDetailList.Select(e => e.Employee.Oid.Value)));
sql += String.Format(" AND (CustomerOid is null OR CustomerOID not in (select oid from customer where isactive = 0))");
sql += String.Format(" AND (CostBearer2SupportConceptOid is null OR CostBearer2SupportConceptOid not in (select c2s.oid from CostBearer2SupportConcept c2s join supportconcept sc on c2s.SupportConceptOid = sc.Oid where sc.isactive = 0))");
var sqlresult = DAOFactory.SearchDAO.GetSqlResult(sql);
//
//update customer set debitornumber = '5' + debitornumber where debitornumber is not null
foreach (object[] srRow in sqlresult)
{
var sr = CreateServiceRecord(srRow, serviceDict);
_AllServiceRecords.Add(sr);
}
}
private static StundenkontoServiceRecord CreateServiceRecord(object[] sqlRow, Dictionary<long, ServiceDescriptionDC> serviceDict)
{
var dc = new StundenkontoServiceRecord();
//"SELECT Oid, StartDate, EndDate, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid, DistanceInMeter, Betrag, CostBearer2SupportConceptOid, ServiceDescriptionOid, CustomerOid, EmployeeOid FROM servicerecord";
dc.ServiceRecordOid = (long?)sqlRow[0];
dc.Start = (DateTime)sqlRow[1];
dc.End = (DateTime)sqlRow[2];
dc.RoundedDuration = (decimal)sqlRow[3];
dc.GroupEmployeeCount = (int?)sqlRow[4];
dc.GroupPersonCount = (int?)sqlRow[5];
dc.GroupRoundedDuration = (decimal?)sqlRow[6];
dc.GroupOid = (long?)sqlRow[7];
var test = sqlRow[8];
if (test != null)
{
decimal meter = 0;
if (Decimal.TryParse(test.ToString(), out meter))
{
dc.DistanceInMeter = meter;
}
}
dc.Betrag = (decimal?)sqlRow[9];
dc.CostBearer2SupportConceptOid = (long?)sqlRow[10];
long? sdOid = (long?)sqlRow[11];
if (sdOid.HasValue && serviceDict.ContainsKey(sdOid.Value))
{
dc.ServiceDescription = serviceDict[sdOid.Value];
}
dc.CustomerOid = (long?)sqlRow[12];
dc.EmployeeOid = (long?)sqlRow[13];
return dc;
}
private static Contract GetNextValidContractForDate(DateTime dt, Employee emp)
{
Contract contractNextToStartDate = emp.GetValidContractForDate(dt);
@@ -277,9 +351,9 @@ namespace BeWo.Report.ReportObjects
public IList<DayDetail> Days { get; set; }
public IList<ServiceRecord> AllServiceRecords { get; set; }
public IList<StundenkontoServiceRecord> AllServiceRecords { get; set; }
public IList<ServiceRecord> ServiceRecordsInSelectedTimeSpan { get; set; }
public IList<StundenkontoServiceRecord> ServiceRecordsInSelectedTimeSpan { get; set; }
public Employee Employee { get; set; }
@@ -488,7 +562,7 @@ namespace BeWo.Report.ReportObjects
public String Custom10 { get; set; }
public IList<ServiceRecord> ServiceRecords { get; set; }
public IList<StundenkontoServiceRecord> ServiceRecords { get; set; }
public int? NightStart { get; set; }