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

@@ -43,12 +43,12 @@
<TargetCulture>de-DE</TargetCulture>
<ProductName>BeWoPlaner</ProductName>
<PublisherName>ownSoft GmbH</PublisherName>
<MinimumRequiredVersion>2.0.1.298</MinimumRequiredVersion>
<MinimumRequiredVersion>2.0.1.299</MinimumRequiredVersion>
<CreateWebPageOnPublish>true</CreateWebPageOnPublish>
<WebPage>publish.htm</WebPage>
<OpenBrowserOnPublish>false</OpenBrowserOnPublish>
<TrustUrlParameters>true</TrustUrlParameters>
<ApplicationRevision>299</ApplicationRevision>
<ApplicationRevision>300</ApplicationRevision>
<ApplicationVersion>2.0.1.%2a</ApplicationVersion>
<UseApplicationTrust>false</UseApplicationTrust>
<CreateDesktopShortcut>true</CreateDesktopShortcut>

View File

@@ -94,14 +94,9 @@ namespace BeWo.View.Detail.Report
try
{
var filter = _SelectedFilter;
UrlaubsplanerRootObj = await Task.Run(() =>
ServiceFacade.DoEmployeeServiceSync(s => s.BuildUrlaubsplanerRootObject(filter)));
var absenceOverview = await Task.Run(() =>
ServiceFacade.DoEmployeeServiceSync(x => x.GetAbsenceOverview(filter)));
UpdateScheduler(false, absenceOverview);
ServiceFacade.DoEmployeeServiceSync(s => s.BuildUrlaubsplanerRootObject(_SelectedFilter)));
UpdateScheduler(false);
ColorizeFeiertage();
ApplyFeiertagCellStyle();
}
@@ -276,14 +271,19 @@ namespace BeWo.View.Detail.Report
}
// Claude - optionaler Parameter absenceOverview: vorgeladene Daten aus Button_Click werden übergeben, um doppelten Serviceaufruf zu vermeiden
public void UpdateScheduler(bool neuLaden, List<EmployeeDC> absenceOverview = null)
public async void UpdateScheduler(bool neuLaden)
{
if (neuLaden || UrlaubsplanerRootObj == null)
{
UrlaubsplanerRootObj = await Task.Run(() =>
ServiceFacade.DoEmployeeServiceSync(s => s.BuildUrlaubsplanerRootObject(_SelectedFilter)));
}
var absenceReasons = _AbsenceReasonDCs;
if (absenceOverview == null)
absenceOverview = ServiceFacade.DoEmployeeServiceSync(x => x.GetAbsenceOverview(_SelectedFilter));
_ListOfEmployee = absenceOverview;
_ListOfEmployee = UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs.Select(i => i.Employee).ToList();
var start = new DateTime(_SelectedFilter.Year, _SelectedFilter.Month, 1);
try
@@ -314,14 +314,14 @@ namespace BeWo.View.Detail.Report
_AppointmentStorage.Clear();
//UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs = new List<AbwesenheitsInformationDC>();
int counter = 0;
foreach (var employee in absenceOverview)
foreach (var employee in _ListOfEmployee)
{
if (neuLaden == true)
{
var tageUrlaub = ServiceFacade.DoEmployeeServiceSync(s => s.CountUrlaubstage(UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter]));
UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter].TageUrlaub = ServiceFacade.DoEmployeeServiceSync(s => s.CountUrlaubstage(UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter]));
UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter].TageKrankheit = ServiceFacade.DoEmployeeServiceSync(s => s.CountKrankheitstage(UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter]));
}
//if (neuLaden == true)
//{
// var tageUrlaub = ServiceFacade.DoEmployeeServiceSync(s => s.CountUrlaubstage(UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter]));
// UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter].TageUrlaub = ServiceFacade.DoEmployeeServiceSync(s => s.CountUrlaubstage(UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter]));
// UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter].TageKrankheit = ServiceFacade.DoEmployeeServiceSync(s => s.CountKrankheitstage(UrlaubsplanerRootObj.AlleAbwesenheitsInformationDCs[counter]));
//}
#region auskommentiert
//AbwesenheitsInformationDC infoDC = new AbwesenheitsInformationDC

View File

@@ -71,7 +71,7 @@ namespace BeWo.View.Detail
urlaubskonto = new List<UrlaubskontoDarstellungDC>();
urlaubskonto.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = "Es existiert kein Vertrag für ausgewähltes Jahr",
Erlaeuterung = "Es existiert kein Vertrag für das ausgewählte Jahr",
});
button_openLeaveDayDialogue.Visibility = Visibility.Collapsed;
}

View File

@@ -44,9 +44,13 @@ namespace Host
var test = Request.Params["mode"];
var report = CreateReport();
var sw = System.Diagnostics.Stopwatch.StartNew();
using (var repxStream = new MemoryStream())
var report = CreateReport();
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
using (var repxStream = new MemoryStream())
{
if (Request.Params["mode"] == "pdf")
{

View File

@@ -1369,17 +1369,18 @@ namespace BeWo.Report
public override XtraReport CreateAbsenceReport(DateTime dt, List<long> abs, List<long> empTypes, List<long> teams, List<int> feiertage)
{
var report = FindReportImp<AbsenceRO>();
var service = new OperationsServiceImp();
var es = new EmployeeServiceImp();
var os = new OperationsServiceImp();
var filter = new AbsenceOverviewFilterDC() { AbsenceReasons = abs, EmploymentType = empTypes, Year = dt.Year, Month = dt.Month, Teams = teams };
List<CompactTeamDC> compactTeams = new List<CompactTeamDC>();
if (teams != null)
{
if (teams.Count > 0)
compactTeams = service.GetCertainTeamsById(teams);
compactTeams = os.GetCertainTeamsById(teams);
}
report.SetReportDataSource(AbsenceRO.Create(service.GetAbsenceOverview(filter), filter, compactTeams, feiertage));
report.SetReportDataSource(AbsenceRO.Create(es.GetAbsenceOverview(filter), filter, compactTeams, feiertage));
return report as XtraReport;
}

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);
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<ServiceRecord>();
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
@@ -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);
IList<ServiceRecord> list;
if (!dict.ContainsKey(key))
{
list = new List<ServiceRecord>();
dict.Add(key, list);
}
else
{
list = dict[key];
}
list.Add(item);
String key = String.Format("{0:yyyyMM}", item.Start);
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,6 +179,72 @@ 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)
{
@@ -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; }

View File

@@ -0,0 +1,118 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BeWo.Data;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.DefaultReports;
using BeWo.Report.ReportObjects;
using BeWo.Service.Plugins;
using BS.Shared;
using BS.Shared.Core;
using BS.Shared.DataContracts;
using DevExpress.XtraReports.UI;
namespace LebenshilfeBadKreuznachAutismuszentrum
{
public class CustomReportCreator : DefaultReportCreator
{
public override XtraReport CreateQueryReport(long queryOid, string queryReportId)
{
if (queryOid == 1000)
{
return CreateStundenkontrolleAbwNachWochen(CreateQueryRO(queryOid, queryReportId));
}
if (queryOid == 1100)
{
return CreateStundenkontrolleAbwGesamt(CreateQueryRO(queryOid, queryReportId));
}
return base.CreateQueryReport(queryOid, queryReportId);
}
private XtraReport CreateStundenkontrolleAbwNachWochen(QueryRO qro)
{
var ro = CreateFLSSollIstReportRO(qro);
if (ro != null)
{
var druck = new FLSSollIstWeeklyReport();
druck.SetReportDataSource(ro);
return druck;
}
return new XtraReport();
}
private XtraReport CreateStundenkontrolleAbwGesamt(QueryRO qro)
{
var ro = CreateFLSSollIstReportRO(qro);
if (ro != null)
{
var druck = new LebenshilfeBadKreuznachAutismuszentrum.FLSSollIstReport();
druck.SetReportDataSource(ro);
return druck;
}
return new XtraReport();
}
private FLSSollIstReportRO CreateFLSSollIstReportRO(QueryRO qro)
{
if (qro.Rows.Count > 0)
{
DateTime start = DateTime.Now;
start = new DateTime(start.Year, start.Month, 1);
DateTime dt = DateTime.Now;
if (DateTime.TryParse(qro.Rows[0].Field1.ToString(), out dt) && dt > DateTime.MinValue)
{
start = dt;
}
DateTime ende = start.AddMonths(1).AddTicks(-1);
if (DateTime.TryParse(qro.Rows[0].Field2.ToString(), out dt) && dt < DateTime.MaxValue.Date)
{
ende = dt.AddTicks(-1);
}
var config = new FLSAnalysisConfigDC();
config.StartDate = start;
config.EndDate = ende;
config.FetchApprovedFLS = true;
config.ReportType = FLSReportType.Customer;
if (qro.Rows[0].Field3 != null && Int64.TryParse(qro.Rows[0].Field3.ToString(), out var catOid))
{
if (catOid > 0)
{
config.ServiceDescriptionOids = DAOFactory.SearchDAO.FindServiceDescriptionForCategory(catOid).Select(d => d.Oid.Value).ToList();
}
}
if (qro.Rows[0].Field4 != null && Int64.TryParse(qro.Rows[0].Field4.ToString(), out var teamOid))
{
if (teamOid > 0)
{
config.TeamOids = new List<long> { teamOid };
}
}
var plugin = PluginLoader.FindClass<StundenuebersichtAuswertung>();
var reportDcList = plugin.GetCustomerFLSAnalysis(config);
return FLSSollIstReportRO.Create(reportDcList, config);
}
return null;
}
}
}

View File

@@ -0,0 +1,835 @@
using BeWo.Report.ReportObjects;
namespace LebenshilfeBadKreuznachAutismuszentrum
{
partial class FLSSollIstReport
{
/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.IContainer components = null;
/// <summary>
/// Clean up any resources being used.
/// </summary>
/// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
#region Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
DevExpress.XtraReports.UI.XRWatermark xrWatermark1 = new DevExpress.XtraReports.UI.XRWatermark();
this.Detail = new DevExpress.XtraReports.UI.DetailBand();
this.xrTableCell1 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableRow1 = new DevExpress.XtraReports.UI.XRTableRow();
this.xrTable1 = new DevExpress.XtraReports.UI.XRTable();
this.Detail1 = new DevExpress.XtraReports.UI.DetailBand();
this.DetailReport = new DevExpress.XtraReports.UI.DetailReportBand();
this.DetailReport1 = new DevExpress.XtraReports.UI.DetailReportBand();
this.Detail2 = new DevExpress.XtraReports.UI.DetailBand();
this.xrTable4 = new DevExpress.XtraReports.UI.XRTable();
this.xrTableRow4 = new DevExpress.XtraReports.UI.XRTableRow();
this.xrTableCell3 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell9 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell13 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell4 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell17 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell18 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell19 = new DevExpress.XtraReports.UI.XRTableCell();
this.GroupHeader2 = new DevExpress.XtraReports.UI.GroupHeaderBand();
this.xrTable2 = new DevExpress.XtraReports.UI.XRTable();
this.xrTableRow2 = new DevExpress.XtraReports.UI.XRTableRow();
this.xrTableCell5 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell7 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell12 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell2 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell14 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell15 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell16 = new DevExpress.XtraReports.UI.XRTableCell();
this.GroupFooter3 = new DevExpress.XtraReports.UI.GroupFooterBand();
this.xrTable3 = new DevExpress.XtraReports.UI.XRTable();
this.xrTableRow3 = new DevExpress.XtraReports.UI.XRTableRow();
this.xrTableCell6 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell8 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell10 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell11 = new DevExpress.XtraReports.UI.XRTableCell();
this.formattingRuleDiffNegativ = new DevExpress.XtraReports.UI.FormattingRule();
this.xrTableCell20 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell21 = new DevExpress.XtraReports.UI.XRTableCell();
this.xrTableCell22 = new DevExpress.XtraReports.UI.XRTableCell();
this.ReportHeader = new DevExpress.XtraReports.UI.ReportHeaderBand();
this.xrLabel5 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel4 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel3 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel2 = new DevExpress.XtraReports.UI.XRLabel();
this.xrLabel1 = new DevExpress.XtraReports.UI.XRLabel();
this.pageFooterBand1 = new DevExpress.XtraReports.UI.PageFooterBand();
this.xrPageInfo2 = new DevExpress.XtraReports.UI.XRPageInfo();
this.xrPageInfo1 = new DevExpress.XtraReports.UI.XRPageInfo();
this.Title = new DevExpress.XtraReports.UI.XRControlStyle();
this.FieldCaption = new DevExpress.XtraReports.UI.XRControlStyle();
this.PageInfo = new DevExpress.XtraReports.UI.XRControlStyle();
this.DataField = new DevExpress.XtraReports.UI.XRControlStyle();
this.fieldFLS = new DevExpress.XtraReports.UI.CalculatedField();
this.topMarginBand1 = new DevExpress.XtraReports.UI.TopMarginBand();
this.bottomMarginBand1 = new DevExpress.XtraReports.UI.BottomMarginBand();
this.fieldDifferenzWoche1 = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldDifferenzWoche2 = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldDifferenzWoche3 = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldDifferenzWoche4 = new DevExpress.XtraReports.UI.CalculatedField();
this.fieldDifferenzGesamt = new DevExpress.XtraReports.UI.CalculatedField();
this.formattingRuleBetragNegativ = new DevExpress.XtraReports.UI.FormattingRule();
this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
((System.ComponentModel.ISupportInitialize)(this.xrTable1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable4)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable2)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable3)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
((System.ComponentModel.ISupportInitialize)(this)).BeginInit();
//
// Detail
//
this.Detail.HeightF = 0F;
this.Detail.Name = "Detail";
this.Detail.Padding = new DevExpress.XtraPrinting.PaddingInfo(0, 0, 0, 0, 100F);
this.Detail.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopLeft;
//
// xrTableCell1
//
this.xrTableCell1.Borders = DevExpress.XtraPrinting.BorderSide.None;
this.xrTableCell1.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.Name")});
this.xrTableCell1.Font = new DevExpress.Drawing.DXFont("Arial", 12F, DevExpress.Drawing.DXFontStyle.Bold);
this.xrTableCell1.Name = "xrTableCell1";
this.xrTableCell1.StylePriority.UseBorderColor = false;
this.xrTableCell1.StylePriority.UseBorders = false;
this.xrTableCell1.StylePriority.UseFont = false;
this.xrTableCell1.Text = "xrTableCell1";
this.xrTableCell1.Weight = 6.9183673469387754D;
//
// xrTableRow1
//
this.xrTableRow1.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] {
this.xrTableCell1});
this.xrTableRow1.Name = "xrTableRow1";
this.xrTableRow1.Weight = 1D;
//
// xrTable1
//
this.xrTable1.Borders = ((DevExpress.XtraPrinting.BorderSide)(((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Right)
| DevExpress.XtraPrinting.BorderSide.Bottom)));
this.xrTable1.LocationFloat = new DevExpress.Utils.PointFloat(0F, 30F);
this.xrTable1.Name = "xrTable1";
this.xrTable1.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] {
this.xrTableRow1});
this.xrTable1.SizeF = new System.Drawing.SizeF(560F, 25F);
this.xrTable1.StylePriority.UseBorders = false;
this.xrTable1.StylePriority.UsePadding = false;
//
// Detail1
//
this.Detail1.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrTable1});
this.Detail1.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F, DevExpress.Drawing.DXFontStyle.Regular, DevExpress.Drawing.DXGraphicsUnit.Point, new DevExpress.Drawing.DXFontAdditionalProperty[] {
new DevExpress.Drawing.DXFontAdditionalProperty("GdiCharSet", ((byte)(0)))});
this.Detail1.HeightF = 69.66665F;
this.Detail1.KeepTogether = true;
this.Detail1.KeepTogetherWithDetailReports = true;
this.Detail1.Name = "Detail1";
this.Detail1.StylePriority.UseFont = false;
//
// DetailReport
//
this.DetailReport.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {
this.Detail1,
this.DetailReport1});
this.DetailReport.DataMember = "RootObjectList";
this.DetailReport.DataSource = this.bindingSource1;
this.DetailReport.Level = 0;
this.DetailReport.Name = "DetailReport";
//
// DetailReport1
//
this.DetailReport1.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {
this.Detail2,
this.GroupHeader2,
this.GroupFooter3});
this.DetailReport1.DataMember = "RootObjectList.Groups";
this.DetailReport1.DataSource = this.bindingSource1;
this.DetailReport1.Level = 0;
this.DetailReport1.Name = "DetailReport1";
//
// Detail2
//
this.Detail2.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrTable4});
this.Detail2.HeightF = 25F;
this.Detail2.Name = "Detail2";
//
// xrTable4
//
this.xrTable4.Borders = ((DevExpress.XtraPrinting.BorderSide)(((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Right)
| DevExpress.XtraPrinting.BorderSide.Bottom)));
this.xrTable4.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F);
this.xrTable4.Name = "xrTable4";
this.xrTable4.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 0, 0, 0, 100F);
this.xrTable4.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] {
this.xrTableRow4});
this.xrTable4.SizeF = new System.Drawing.SizeF(890F, 25F);
this.xrTable4.StylePriority.UseBorders = false;
this.xrTable4.StylePriority.UsePadding = false;
//
// xrTableRow4
//
this.xrTableRow4.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] {
this.xrTableCell3,
this.xrTableCell9,
this.xrTableCell13,
this.xrTableCell4,
this.xrTableCell18,
this.xrTableCell17,
this.xrTableCell19});
this.xrTableRow4.Name = "xrTableRow4";
this.xrTableRow4.Weight = 1D;
//
// xrTableCell3
//
this.xrTableCell3.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.Groups.Name", "{0:dd/MM/yyyy}")});
this.xrTableCell3.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F);
this.xrTableCell3.Name = "xrTableCell3";
this.xrTableCell3.StylePriority.UseFont = false;
this.xrTableCell3.Text = "xrTableCell3";
this.xrTableCell3.Weight = 1.3605442176870746D;
//
// xrTableCell9
//
this.xrTableCell9.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F);
this.xrTableCell9.Name = "xrTableCell9";
this.xrTableCell9.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell9.StylePriority.UseFont = false;
this.xrTableCell9.StylePriority.UsePadding = false;
this.xrTableCell9.StylePriority.UseTextAlignment = false;
this.xrTableCell9.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell9.TextFormatString = "{0:0.00}";
this.xrTableCell9.Weight = 0.68027210884353728D;
//
// xrTableCell13
//
this.xrTableCell13.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.Groups.IstGesamt")});
this.xrTableCell13.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F);
this.xrTableCell13.Multiline = true;
this.xrTableCell13.Name = "xrTableCell13";
this.xrTableCell13.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell13.StylePriority.UseFont = false;
this.xrTableCell13.StylePriority.UsePadding = false;
this.xrTableCell13.StylePriority.UseTextAlignment = false;
this.xrTableCell13.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell13.TextFormatString = "{0:0.00}";
this.xrTableCell13.Weight = 0.6802721088435375D;
//
// xrTableCell4
//
this.xrTableCell4.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F);
this.xrTableCell4.Multiline = true;
this.xrTableCell4.Name = "xrTableCell4";
this.xrTableCell4.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell4.StylePriority.UseFont = false;
this.xrTableCell4.StylePriority.UsePadding = false;
this.xrTableCell4.StylePriority.UseTextAlignment = false;
this.xrTableCell4.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell4.Weight = 0.6802721088435375D;
//
// xrTableCell17
//
this.xrTableCell17.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.Groups.CustomValue1")});
this.xrTableCell17.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F);
this.xrTableCell17.Multiline = true;
this.xrTableCell17.Name = "xrTableCell17";
this.xrTableCell17.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell17.StylePriority.UseFont = false;
this.xrTableCell17.StylePriority.UsePadding = false;
this.xrTableCell17.StylePriority.UseTextAlignment = false;
this.xrTableCell17.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell17.Weight = 0.88435374149659873D;
//
// xrTableCell18
//
this.xrTableCell18.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.Groups.CustomValue2")});
this.xrTableCell18.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F);
this.xrTableCell18.Multiline = true;
this.xrTableCell18.Name = "xrTableCell18";
this.xrTableCell18.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell18.StylePriority.UseFont = false;
this.xrTableCell18.StylePriority.UsePadding = false;
this.xrTableCell18.StylePriority.UseTextAlignment = false;
this.xrTableCell18.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell18.Weight = 0.88435374149659873D;
//
// xrTableCell19
//
this.xrTableCell19.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.Groups.CustomValue3")});
this.xrTableCell19.Font = new DevExpress.Drawing.DXFont("Arial", 9.75F);
this.xrTableCell19.Multiline = true;
this.xrTableCell19.Name = "xrTableCell19";
this.xrTableCell19.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell19.StylePriority.UseFont = false;
this.xrTableCell19.StylePriority.UsePadding = false;
this.xrTableCell19.StylePriority.UseTextAlignment = false;
this.xrTableCell19.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell19.Weight = 0.88435374149659873D;
//
// GroupHeader2
//
this.GroupHeader2.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrTable2});
this.GroupHeader2.HeightF = 40F;
this.GroupHeader2.Name = "GroupHeader2";
this.GroupHeader2.RepeatEveryPage = true;
//
// xrTable2
//
this.xrTable2.Borders = ((DevExpress.XtraPrinting.BorderSide)((((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Top)
| DevExpress.XtraPrinting.BorderSide.Right)
| DevExpress.XtraPrinting.BorderSide.Bottom)));
this.xrTable2.Font = new DevExpress.Drawing.DXFont("Arial", 10F, DevExpress.Drawing.DXFontStyle.Bold);
this.xrTable2.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F);
this.xrTable2.Name = "xrTable2";
this.xrTable2.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 0, 0, 0, 100F);
this.xrTable2.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] {
this.xrTableRow2});
this.xrTable2.SizeF = new System.Drawing.SizeF(890F, 40F);
this.xrTable2.StylePriority.UseBorders = false;
this.xrTable2.StylePriority.UseFont = false;
this.xrTable2.StylePriority.UsePadding = false;
//
// xrTableRow2
//
this.xrTableRow2.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] {
this.xrTableCell5,
this.xrTableCell7,
this.xrTableCell12,
this.xrTableCell2,
this.xrTableCell15,
this.xrTableCell14,
this.xrTableCell16});
this.xrTableRow2.Name = "xrTableRow2";
this.xrTableRow2.Weight = 1.6D;
//
// xrTableCell5
//
this.xrTableCell5.Name = "xrTableCell5";
this.xrTableCell5.Text = "Mitarbeiter/in";
this.xrTableCell5.Weight = 1.3605442176870746D;
//
// xrTableCell7
//
this.xrTableCell7.Name = "xrTableCell7";
this.xrTableCell7.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell7.StylePriority.UsePadding = false;
this.xrTableCell7.StylePriority.UseTextAlignment = false;
this.xrTableCell7.Text = "Soll";
this.xrTableCell7.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell7.Weight = 0.6802721088435375D;
//
// xrTableCell12
//
this.xrTableCell12.Multiline = true;
this.xrTableCell12.Name = "xrTableCell12";
this.xrTableCell12.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell12.StylePriority.UsePadding = false;
this.xrTableCell12.StylePriority.UseTextAlignment = false;
this.xrTableCell12.Text = "Ist";
this.xrTableCell12.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell12.Weight = 0.68027210884353739D;
//
// xrTableCell2
//
this.xrTableCell2.Multiline = true;
this.xrTableCell2.Name = "xrTableCell2";
this.xrTableCell2.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell2.StylePriority.UsePadding = false;
this.xrTableCell2.StylePriority.UseTextAlignment = false;
this.xrTableCell2.Text = "Diff.";
this.xrTableCell2.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell2.Weight = 0.6802721088435375D;
//
// xrTableCell14
//
this.xrTableCell14.Multiline = true;
this.xrTableCell14.Name = "xrTableCell14";
this.xrTableCell14.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell14.StylePriority.UsePadding = false;
this.xrTableCell14.StylePriority.UseTextAlignment = false;
this.xrTableCell14.Text = "erwirtschafteter\r\nBetrag";
this.xrTableCell14.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell14.Weight = 0.88435374149659862D;
//
// xrTableCell15
//
this.xrTableCell15.Multiline = true;
this.xrTableCell15.Name = "xrTableCell15";
this.xrTableCell15.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell15.StylePriority.UsePadding = false;
this.xrTableCell15.StylePriority.UseTextAlignment = false;
this.xrTableCell15.Text = "Möglicher Betrag";
this.xrTableCell15.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell15.Weight = 0.88435374149659862D;
//
// xrTableCell16
//
this.xrTableCell16.Multiline = true;
this.xrTableCell16.Name = "xrTableCell16";
this.xrTableCell16.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell16.StylePriority.UsePadding = false;
this.xrTableCell16.StylePriority.UseTextAlignment = false;
this.xrTableCell16.Text = "Differenz";
this.xrTableCell16.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell16.Weight = 0.88435374149659862D;
//
// GroupFooter3
//
this.GroupFooter3.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrTable3});
this.GroupFooter3.HeightF = 25F;
this.GroupFooter3.Name = "GroupFooter3";
//
// xrTable3
//
this.xrTable3.Borders = ((DevExpress.XtraPrinting.BorderSide)(((DevExpress.XtraPrinting.BorderSide.Left | DevExpress.XtraPrinting.BorderSide.Right)
| DevExpress.XtraPrinting.BorderSide.Bottom)));
this.xrTable3.Font = new DevExpress.Drawing.DXFont("Arial", 10F, DevExpress.Drawing.DXFontStyle.Bold);
this.xrTable3.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F);
this.xrTable3.Name = "xrTable3";
this.xrTable3.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 0, 0, 0, 100F);
this.xrTable3.Rows.AddRange(new DevExpress.XtraReports.UI.XRTableRow[] {
this.xrTableRow3});
this.xrTable3.SizeF = new System.Drawing.SizeF(890F, 25F);
this.xrTable3.StylePriority.UseBorders = false;
this.xrTable3.StylePriority.UseFont = false;
this.xrTable3.StylePriority.UsePadding = false;
//
// xrTableRow3
//
this.xrTableRow3.Cells.AddRange(new DevExpress.XtraReports.UI.XRTableCell[] {
this.xrTableCell6,
this.xrTableCell8,
this.xrTableCell10,
this.xrTableCell11,
this.xrTableCell21,
this.xrTableCell20,
this.xrTableCell22});
this.xrTableRow3.Name = "xrTableRow3";
this.xrTableRow3.Weight = 1D;
//
// xrTableCell6
//
this.xrTableCell6.Name = "xrTableCell6";
this.xrTableCell6.Text = "Summe";
this.xrTableCell6.Weight = 1.3605442176870746D;
//
// xrTableCell8
//
this.xrTableCell8.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.SollGesamt")});
this.xrTableCell8.Name = "xrTableCell8";
this.xrTableCell8.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell8.StylePriority.UsePadding = false;
this.xrTableCell8.StylePriority.UseTextAlignment = false;
this.xrTableCell8.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell8.TextFormatString = "{0:0.00}";
this.xrTableCell8.Weight = 0.6802721088435375D;
//
// xrTableCell10
//
this.xrTableCell10.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.IstGesamt")});
this.xrTableCell10.Multiline = true;
this.xrTableCell10.Name = "xrTableCell10";
this.xrTableCell10.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell10.StylePriority.UsePadding = false;
this.xrTableCell10.StylePriority.UseTextAlignment = false;
this.xrTableCell10.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell10.TextFormatString = "{0:0.00}";
this.xrTableCell10.Weight = 0.68027210884353739D;
//
// xrTableCell11
//
this.xrTableCell11.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.DifferenzSollIstGesamt")});
this.xrTableCell11.FormattingRules.Add(this.formattingRuleDiffNegativ);
this.xrTableCell11.Multiline = true;
this.xrTableCell11.Name = "xrTableCell11";
this.xrTableCell11.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell11.StylePriority.UsePadding = false;
this.xrTableCell11.StylePriority.UseTextAlignment = false;
this.xrTableCell11.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell11.TextFormatString = "{0:0.00}";
this.xrTableCell11.Weight = 0.6802721088435375D;
//
// formattingRuleDiffNegativ
//
this.formattingRuleDiffNegativ.Condition = "[DifferenzSollIstGesamt] < 0";
this.formattingRuleDiffNegativ.DataMember = "RootObjectList";
this.formattingRuleDiffNegativ.Formatting.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.formattingRuleDiffNegativ.Name = "formattingRuleDiffNegativ";
//
// xrTableCell20
//
this.xrTableCell20.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.CustomValue1")});
this.xrTableCell20.Multiline = true;
this.xrTableCell20.Name = "xrTableCell20";
this.xrTableCell20.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell20.StylePriority.UsePadding = false;
this.xrTableCell20.StylePriority.UseTextAlignment = false;
this.xrTableCell20.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell20.Weight = 0.88435374149659873D;
//
// xrTableCell21
//
this.xrTableCell21.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.CustomValue2")});
this.xrTableCell21.Multiline = true;
this.xrTableCell21.Name = "xrTableCell21";
this.xrTableCell21.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell21.StylePriority.UsePadding = false;
this.xrTableCell21.StylePriority.UseTextAlignment = false;
this.xrTableCell21.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell21.Weight = 0.88435374149659873D;
//
// xrTableCell22
//
this.xrTableCell22.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "RootObjectList.CustomValue3")});
this.xrTableCell22.FormattingRules.Add(this.formattingRuleBetragNegativ);
this.xrTableCell22.Multiline = true;
this.xrTableCell22.Name = "xrTableCell22";
this.xrTableCell22.Padding = new DevExpress.XtraPrinting.PaddingInfo(5, 5, 0, 0, 100F);
this.xrTableCell22.StylePriority.UsePadding = false;
this.xrTableCell22.StylePriority.UseTextAlignment = false;
this.xrTableCell22.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrTableCell22.Weight = 0.88435374149659873D;
//
// ReportHeader
//
this.ReportHeader.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrLabel5,
this.xrLabel4,
this.xrLabel3,
this.xrLabel2,
this.xrLabel1});
this.ReportHeader.HeightF = 50F;
this.ReportHeader.Name = "ReportHeader";
//
// xrLabel5
//
this.xrLabel5.Font = new DevExpress.Drawing.DXFont("Arial", 12F);
this.xrLabel5.LocationFloat = new DevExpress.Utils.PointFloat(175F, 25F);
this.xrLabel5.Name = "xrLabel5";
this.xrLabel5.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel5.SizeF = new System.Drawing.SizeF(17F, 25F);
this.xrLabel5.StylePriority.UseFont = false;
this.xrLabel5.StylePriority.UseTextAlignment = false;
this.xrLabel5.Text = "-";
this.xrLabel5.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopCenter;
//
// xrLabel4
//
this.xrLabel4.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "ReportEndDate", "{0:dd/MM/yyyy}")});
this.xrLabel4.Font = new DevExpress.Drawing.DXFont("Arial", 12F);
this.xrLabel4.LocationFloat = new DevExpress.Utils.PointFloat(192.0001F, 25F);
this.xrLabel4.Name = "xrLabel4";
this.xrLabel4.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel4.SizeF = new System.Drawing.SizeF(367.9999F, 25F);
this.xrLabel4.StylePriority.UseFont = false;
this.xrLabel4.Text = "xrLabel4";
//
// xrLabel3
//
this.xrLabel3.DataBindings.AddRange(new DevExpress.XtraReports.UI.XRBinding[] {
new DevExpress.XtraReports.UI.XRBinding("Text", null, "ReportStartDate", "{0:dd/MM/yyyy}")});
this.xrLabel3.Font = new DevExpress.Drawing.DXFont("Arial", 12F);
this.xrLabel3.LocationFloat = new DevExpress.Utils.PointFloat(83F, 25F);
this.xrLabel3.Name = "xrLabel3";
this.xrLabel3.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel3.SizeF = new System.Drawing.SizeF(92F, 25F);
this.xrLabel3.StylePriority.UseFont = false;
this.xrLabel3.StylePriority.UseTextAlignment = false;
this.xrLabel3.Text = "xrLabel3";
this.xrLabel3.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
//
// xrLabel2
//
this.xrLabel2.Font = new DevExpress.Drawing.DXFont("Arial", 12F);
this.xrLabel2.LocationFloat = new DevExpress.Utils.PointFloat(0F, 25F);
this.xrLabel2.Name = "xrLabel2";
this.xrLabel2.Padding = new DevExpress.XtraPrinting.PaddingInfo(2, 2, 0, 0, 100F);
this.xrLabel2.SizeF = new System.Drawing.SizeF(83F, 25F);
this.xrLabel2.StylePriority.UseFont = false;
this.xrLabel2.Text = "Zeitraum:";
//
// xrLabel1
//
this.xrLabel1.Font = new DevExpress.Drawing.DXFont("Arial", 14F);
this.xrLabel1.LocationFloat = new DevExpress.Utils.PointFloat(0F, 0F);
this.xrLabel1.Multiline = true;
this.xrLabel1.Name = "xrLabel1";
this.xrLabel1.SizeF = new System.Drawing.SizeF(560F, 25F);
this.xrLabel1.StyleName = "Title";
this.xrLabel1.StylePriority.UseFont = false;
this.xrLabel1.Text = "Auswertung über geleistete Stunden";
//
// pageFooterBand1
//
this.pageFooterBand1.Controls.AddRange(new DevExpress.XtraReports.UI.XRControl[] {
this.xrPageInfo2,
this.xrPageInfo1});
this.pageFooterBand1.HeightF = 48F;
this.pageFooterBand1.Name = "pageFooterBand1";
//
// xrPageInfo2
//
this.xrPageInfo2.Font = new DevExpress.Drawing.DXFont("Arial", 8F);
this.xrPageInfo2.LocationFloat = new DevExpress.Utils.PointFloat(938.9998F, 25F);
this.xrPageInfo2.Name = "xrPageInfo2";
this.xrPageInfo2.SizeF = new System.Drawing.SizeF(100F, 23F);
this.xrPageInfo2.StyleName = "PageInfo";
this.xrPageInfo2.StylePriority.UseFont = false;
this.xrPageInfo2.TextAlignment = DevExpress.XtraPrinting.TextAlignment.TopRight;
this.xrPageInfo2.TextFormatString = "Seite {0} von {1}";
//
// xrPageInfo1
//
this.xrPageInfo1.Font = new DevExpress.Drawing.DXFont("Arial", 8F);
this.xrPageInfo1.LocationFloat = new DevExpress.Utils.PointFloat(7.999878F, 25F);
this.xrPageInfo1.Name = "xrPageInfo1";
this.xrPageInfo1.PageInfo = DevExpress.XtraPrinting.PageInfo.DateTime;
this.xrPageInfo1.SizeF = new System.Drawing.SizeF(262.0001F, 23F);
this.xrPageInfo1.StyleName = "PageInfo";
this.xrPageInfo1.StylePriority.UseFont = false;
//
// Title
//
this.Title.BackColor = System.Drawing.Color.White;
this.Title.BorderColor = System.Drawing.SystemColors.ControlText;
this.Title.Borders = DevExpress.XtraPrinting.BorderSide.None;
this.Title.BorderWidth = 1F;
this.Title.Font = new DevExpress.Drawing.DXFont("Times New Roman", 24F);
this.Title.ForeColor = System.Drawing.Color.Black;
this.Title.Name = "Title";
//
// FieldCaption
//
this.FieldCaption.BackColor = System.Drawing.Color.White;
this.FieldCaption.BorderColor = System.Drawing.SystemColors.ControlText;
this.FieldCaption.Borders = DevExpress.XtraPrinting.BorderSide.None;
this.FieldCaption.BorderWidth = 1F;
this.FieldCaption.Font = new DevExpress.Drawing.DXFont("Times New Roman", 10F, DevExpress.Drawing.DXFontStyle.Bold);
this.FieldCaption.ForeColor = System.Drawing.Color.Black;
this.FieldCaption.Name = "FieldCaption";
//
// PageInfo
//
this.PageInfo.BackColor = System.Drawing.Color.White;
this.PageInfo.BorderColor = System.Drawing.SystemColors.ControlText;
this.PageInfo.Borders = DevExpress.XtraPrinting.BorderSide.None;
this.PageInfo.BorderWidth = 1F;
this.PageInfo.Font = new DevExpress.Drawing.DXFont("Times New Roman", 8F);
this.PageInfo.ForeColor = System.Drawing.Color.Black;
this.PageInfo.Name = "PageInfo";
//
// DataField
//
this.DataField.BackColor = System.Drawing.Color.White;
this.DataField.BorderColor = System.Drawing.SystemColors.ControlText;
this.DataField.Borders = DevExpress.XtraPrinting.BorderSide.None;
this.DataField.BorderWidth = 1F;
this.DataField.Font = new DevExpress.Drawing.DXFont("Times New Roman", 8F);
this.DataField.ForeColor = System.Drawing.SystemColors.ControlText;
this.DataField.Name = "DataField";
//
// fieldFLS
//
this.fieldFLS.DataMember = "FLSReportGroups";
this.fieldFLS.Expression = "[TotalFLM] / 60";
this.fieldFLS.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldFLS.Name = "fieldFLS";
//
// topMarginBand1
//
this.topMarginBand1.HeightF = 50F;
this.topMarginBand1.Name = "topMarginBand1";
//
// bottomMarginBand1
//
this.bottomMarginBand1.HeightF = 50F;
this.bottomMarginBand1.Name = "bottomMarginBand1";
//
// fieldDifferenzWoche1
//
this.fieldDifferenzWoche1.DataMember = "RootObjectList.Groups";
this.fieldDifferenzWoche1.Expression = "[Ist] - [Soll]";
this.fieldDifferenzWoche1.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldDifferenzWoche1.Name = "fieldDifferenzWoche1";
//
// fieldDifferenzWoche2
//
this.fieldDifferenzWoche2.DataMember = "RootObjectList.Groups";
this.fieldDifferenzWoche2.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldDifferenzWoche2.Name = "fieldDifferenzWoche2";
//
// fieldDifferenzWoche3
//
this.fieldDifferenzWoche3.DataMember = "RootObjectList.Groups";
this.fieldDifferenzWoche3.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldDifferenzWoche3.Name = "fieldDifferenzWoche3";
//
// fieldDifferenzWoche4
//
this.fieldDifferenzWoche4.DataMember = "RootObjectList.Groups";
this.fieldDifferenzWoche4.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldDifferenzWoche4.Name = "fieldDifferenzWoche4";
//
// fieldDifferenzGesamt
//
this.fieldDifferenzGesamt.DataMember = "RootObjectList.Groups";
this.fieldDifferenzGesamt.Expression = "[IstGesamt] - [SollGesamt]";
this.fieldDifferenzGesamt.FieldType = DevExpress.XtraReports.UI.FieldType.Decimal;
this.fieldDifferenzGesamt.Name = "fieldDifferenzGesamt";
//
// formattingRuleBetragNegativ
//
this.formattingRuleBetragNegativ.Condition = "ToDecimal([CustomValue4]) < 0";
this.formattingRuleBetragNegativ.DataMember = "RootObjectList";
this.formattingRuleBetragNegativ.Formatting.ForeColor = System.Drawing.Color.FromArgb(((int)(((byte)(255)))), ((int)(((byte)(0)))), ((int)(((byte)(0)))));
this.formattingRuleBetragNegativ.Name = "formattingRuleBetragNegativ";
//
// bindingSource1
//
this.bindingSource1.DataSource = typeof(BeWo.Report.ReportObjects.FLSSollIstReportRO);
//
// FLSSollIstReport
//
this.Bands.AddRange(new DevExpress.XtraReports.UI.Band[] {
this.Detail,
this.DetailReport,
this.ReportHeader,
this.pageFooterBand1,
this.topMarginBand1,
this.bottomMarginBand1});
this.CalculatedFields.AddRange(new DevExpress.XtraReports.UI.CalculatedField[] {
this.fieldFLS,
this.fieldDifferenzWoche1,
this.fieldDifferenzWoche2,
this.fieldDifferenzWoche3,
this.fieldDifferenzWoche4,
this.fieldDifferenzGesamt});
this.DataSource = this.bindingSource1;
this.FormattingRuleSheet.AddRange(new DevExpress.XtraReports.UI.FormattingRule[] {
this.formattingRuleDiffNegativ,
this.formattingRuleBetragNegativ});
this.Landscape = true;
this.Margins = new DevExpress.Drawing.DXMargins(60F, 60F, 50F, 50F);
this.PageHeight = 827;
this.PageWidth = 1169;
this.PaperKind = DevExpress.Drawing.Printing.DXPaperKind.A4;
this.StyleSheet.AddRange(new DevExpress.XtraReports.UI.XRControlStyle[] {
this.Title,
this.FieldCaption,
this.PageInfo,
this.DataField});
this.Version = "23.2";
xrWatermark1.Id = "Watermark1";
this.Watermarks.Add(xrWatermark1);
((System.ComponentModel.ISupportInitialize)(this.xrTable1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable4)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable2)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.xrTable3)).EndInit();
((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).EndInit();
((System.ComponentModel.ISupportInitialize)(this)).EndInit();
}
#endregion
private DevExpress.XtraReports.UI.DetailBand Detail;
private System.Windows.Forms.BindingSource bindingSource1;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell1;
private DevExpress.XtraReports.UI.XRTableRow xrTableRow1;
private DevExpress.XtraReports.UI.XRTable xrTable1;
private DevExpress.XtraReports.UI.DetailBand Detail1;
private DevExpress.XtraReports.UI.DetailReportBand DetailReport;
private DevExpress.XtraReports.UI.ReportHeaderBand ReportHeader;
private DevExpress.XtraReports.UI.XRLabel xrLabel1;
private DevExpress.XtraReports.UI.PageFooterBand pageFooterBand1;
private DevExpress.XtraReports.UI.XRPageInfo xrPageInfo2;
private DevExpress.XtraReports.UI.XRPageInfo xrPageInfo1;
private DevExpress.XtraReports.UI.XRControlStyle Title;
private DevExpress.XtraReports.UI.XRControlStyle FieldCaption;
private DevExpress.XtraReports.UI.XRControlStyle PageInfo;
private DevExpress.XtraReports.UI.XRControlStyle DataField;
private DevExpress.XtraReports.UI.XRTable xrTable2;
private DevExpress.XtraReports.UI.XRTableRow xrTableRow2;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell5;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell7;
private DevExpress.XtraReports.UI.DetailReportBand DetailReport1;
private DevExpress.XtraReports.UI.DetailBand Detail2;
private DevExpress.XtraReports.UI.XRTable xrTable4;
private DevExpress.XtraReports.UI.XRTableRow xrTableRow4;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell3;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell9;
private DevExpress.XtraReports.UI.XRLabel xrLabel5;
private DevExpress.XtraReports.UI.XRLabel xrLabel4;
private DevExpress.XtraReports.UI.XRLabel xrLabel3;
private DevExpress.XtraReports.UI.XRLabel xrLabel2;
private DevExpress.XtraReports.UI.GroupHeaderBand GroupHeader2;
private DevExpress.XtraReports.UI.CalculatedField fieldFLS;
private DevExpress.XtraReports.UI.TopMarginBand topMarginBand1;
private DevExpress.XtraReports.UI.BottomMarginBand bottomMarginBand1;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell13;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell12;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell4;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell2;
private DevExpress.XtraReports.UI.CalculatedField fieldDifferenzWoche1;
private DevExpress.XtraReports.UI.CalculatedField fieldDifferenzWoche2;
private DevExpress.XtraReports.UI.CalculatedField fieldDifferenzWoche3;
private DevExpress.XtraReports.UI.CalculatedField fieldDifferenzWoche4;
private DevExpress.XtraReports.UI.CalculatedField fieldDifferenzGesamt;
private DevExpress.XtraReports.UI.XRTable xrTable3;
private DevExpress.XtraReports.UI.XRTableRow xrTableRow3;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell6;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell8;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell10;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell11;
private DevExpress.XtraReports.UI.GroupFooterBand GroupFooter3;
private DevExpress.XtraReports.UI.FormattingRule formattingRuleDiffNegativ;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell14;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell15;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell16;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell17;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell18;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell19;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell20;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell21;
private DevExpress.XtraReports.UI.XRTableCell xrTableCell22;
private DevExpress.XtraReports.UI.FormattingRule formattingRuleBetragNegativ;
}
}

View File

@@ -0,0 +1,87 @@
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.DCEntityMapper;
using BS.Shared;
using BS.Shared.Extensions;
using System;
namespace LebenshilfeBadKreuznachAutismuszentrum
{
public partial class FLSSollIstReport : DevExpress.XtraReports.UI.XtraReport, IBeWoReport<FLSSollIstReportRO>
{
public FLSSollIstReport()
{
InitializeComponent();
}
public void SetReportDataSource(FLSSollIstReportRO pRO)
{
//foreach (var group in pRO.FLSReportGroups)
//{
// foreach (var sr in group.ServiceRecords)
// {
// if (!sr.DistanceInMeter.HasValue && sr.ServiceRecordOid.HasValue)
// {
// var srBO = DAOFactory.GenericDAO.LoadByID<ServiceRecord>(sr.ServiceRecordOid.Value);
// sr.DistanceInMeter = srBO.DistanceInMeter;
// }
// }
//}
BerechneBetraege(pRO);
this.bindingSource1.DataSource = pRO;
}
private void BerechneBetraege(FLSSollIstReportRO pRO)
{
decimal stundenSatz = BerechneStundensatz(pRO);
foreach (var item in pRO.RootObjectList)
{
foreach (var g in item.Groups)
{
decimal istPreisGruppe = 0;
decimal sollPreisGruppe = 0;
foreach (var week in g.WochenSummen)
{
istPreisGruppe += (week.IstStunden ?? 0) * stundenSatz;
sollPreisGruppe += (week.SollStunden ?? 0) * stundenSatz;
}
g.CustomValue1 = String.Format("{0:c}", istPreisGruppe);
}
item.CustomValue1 = String.Format("{0:c}", item.IstGesamt * stundenSatz);
item.CustomValue2 = String.Format("{0:c}", item.SollGesamt * stundenSatz);
item.CustomValue3 = String.Format("{0:c}", (item.IstGesamt - item.SollGesamt) * stundenSatz);
item.CustomValue4 = String.Format("{0:0.00}", (item.IstGesamt - item.SollGesamt) * stundenSatz);
}
}
private decimal BerechneStundensatz(FLSSollIstReportRO pRO)
{
decimal stundenSatz = 0;
if (pRO.ReportConfig.ServiceDescriptionOids != null && pRO.ReportConfig.ServiceDescriptionOids.Count > 0)
{
var cat = DAOFactory.GenericDAO.LoadByID<ServiceDescription>(pRO.ReportConfig.ServiceDescriptionOids[0]).ServiceCategory;
var crps = MapperFactory.CostRatePeriodDC_CostRatePeriod.MapToNewDCs(cat.CostRatePeriods);
var cp = crps.GetCostRatePeriodForDate(CostRatePeriodType.AmountOfMoney, pRO.ReportStartDate.Value);
if (cp != null && cp.CostRateValue.HasValue)
{
return cp.CostRateValue.Value;
}
}
return stundenSatz;
}
}
}

View File

@@ -0,0 +1,120 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -10,68 +10,5 @@ using System.Threading.Tasks;
namespace PerspektivenEV.Service
{
public class CustomEmployeeServiceImp : EmployeeServiceImp
{
public override Dictionary<string, decimal> GetSonderurlaubForEmployee(long empOid, int berechnungsjahr)
{
Dictionary<string, decimal> sonderurlaub = new Dictionary<string, decimal>();
try
{
var emp = DAOFactory.GenericDAO.GetByID<Employee>(empOid);
Contract contract = null;
foreach (var c in emp.Contracts)
{
if (c.EntryDate.HasValue && !c.ContractEndDate.HasValue || c.EntryDate.HasValue && c.ContractEndDate.HasValue &&
berechnungsjahr >= c.EntryDate.Value.Year && berechnungsjahr <= c.ContractEndDate.Value.Year)
{
contract = c;
break;
}
}
// Wenn eine Behinderung von mind. 50 vorliegt stehen standardmäßig 5 Sonderurlaubstage zu
if (contract != null && (contract.EntryDate.HasValue && contract.ContractEndDate.HasValue || contract.EntryDate.HasValue && !contract.ContractEndDate.HasValue))
{
var yearStart = new DateTime(berechnungsjahr, 1, 1);
var yearEnd = new DateTime(berechnungsjahr, 12, 31);
// Schnittmenge aus Vertrag + Ausweis
var overlapStart = contract.EntryDate > emp.AusweisGueltigVon ? contract.EntryDate : emp.AusweisGueltigVon;
var overlapEnd = (contract.ContractEndDate ?? DateTime.MaxValue) < (emp.AusweisGueltigBis ?? DateTime.MaxValue) ? (contract.ContractEndDate ?? DateTime.MaxValue) : (emp.AusweisGueltigBis ?? DateTime.MaxValue);
// Jetzt prüfen: gibt es davon etwas im Jahr?
if (overlapStart <= overlapEnd && overlapStart <= yearEnd && overlapEnd >= yearStart)
{
if (emp.GradDerBehinderung != null && emp.GradDerBehinderung != "")
{
int.TryParse(emp.GradDerBehinderung, out int grad);
if (grad >= 50)
{
// TODO Anteilig berechnen, (wenn Behinderung erst im Berechnungsjahr beginnt nur die "aktiven" Monate anrechnen und ab
// Wenn keine Anzahl der wöchentlichen Arbeitstage gesetzt ist, 5 Tage
// Sonst Anzahl der wöchentlichen Arbeitstage (gesdetzlich so geregelt)
sonderurlaub.Add("Sonderurlaub aufgrund von Behinderungsgrad über 50", 5);
}
}
}
// Anpassung für Perspektiven:
// CancellationPeriod im Vertrag sind die Regenerationstage hier.
// Die Anzahl Tage, die da drin steht, soll als Sonderurlaub gutgeschrieben werden
if (contract.CancellationPeriod != null && contract.CancellationPeriod > 0)
sonderurlaub.Add("Regenerationstage", contract.CancellationPeriod);
}
return sonderurlaub;
}
catch (Exception ex)
{
throw Utils.CreateBeWoFaultException(ex);
}
return sonderurlaub;
}
}
}

View File

@@ -30,281 +30,15 @@ namespace PerspektivenEV.Service
return new DateTime(year, 12, 31);
}
public override List<UrlaubskontoDarstellungDC> BerechneUrlaubskontoZurDarstellung(EmployeeDC emp, int year, DateTime? endeDerBerechnung = null)
public override List<UrlaubskontoDarstellungDC> BerechneUrlaubskontoZurDarstellung(Employee emp, int year, DateTime? endeDerBerechnung = null)
{
// Claude: Kein Urlaubskonto vor 2026
if (year < 2026)
return null;
// ab hier Standard
List<UrlaubskontoDarstellungDC> dcs = new List<UrlaubskontoDarstellungDC>();
EmployeeServiceImp es = PluginLoader.FindClass<EmployeeServiceImp>();
// Urlaubskonto erstellen
var ent = DAOFactory.GenericDAO.LoadByID<Employee>((long)emp.EmployeeOid);
var urlaubskonten = BerechneUrlaubskonto(ent, year);
var aktuellesKonto = urlaubskonten.First(u => u.Key == year);
var geschenkteUrlaubstage = es.GetGeschenkteUrlaubstageForEmployee((long)emp.EmployeeOid);
decimal sonderurlaub = 0;
// Benötigt werden:
// 1. Vetragliche Urlaubstage für´s Jahr
List<ContractDC> contracts = new List<ContractDC>();
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
// Vertrag für Jahr raussuchen
foreach (var c in emp.Contracts)
{
DateTime contractEndDate = new DateTime();
if (c.ContractEndDate == null)
contractEndDate = new DateTime(2099, 12, 31);
else
contractEndDate = c.ContractEndDate.Value;
DateTime contractStartDate = new DateTime();
if (c.EntryDate == null)
contractStartDate = new DateTime(year, 01, 01);
else
contractStartDate = c.EntryDate.Value;
if (year >= contractStartDate.Year && year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt
{
contracts.Add(c);
contractsAndWeeklyDays.Add(c, c.WeeklyDays);
}
}
if (contracts.Count == 0) // Kein Vertrag = kein Urlaubskonto
return null;
// 2. Abzuziehende Tage wegen Vertragsbeginn mitten im Jahr
foreach (var contractAndWeeklyDays in contractsAndWeeklyDays)
{
var contract = contractAndWeeklyDays.Key;
#region Vielleicht bald unnötig
// Zahlen für Darstellung in View
decimal tageNachAbzug = 0;
decimal abzuziehendeTage = 0;
int arbeitstage = contract.WeeklyDays; // Vertragliche Arbeitstage
DateTime? endDate = contract.ContractEndDate == null ? new DateTime(year, 12, 31) : contract.ContractEndDate; // Ende des Vertrags auf letzten Tag des Jahres setzen, wenn kein Ende
var leaveDays = contract.EmploymentType?.LeaveDays == null ? contract.LeaveDays : contract.EmploymentType.LeaveDays; // Vertragliche Urlaubstage
if (!leaveDays.HasValue)
{
leaveDays = 0;
}
if (contract.EntryDate.HasValue && (contract.EntryDate.Value.Year == year || endDate.Value.Year == year)) // Wenn Vertrag im gewählten Jahr beginnt oder endet
{
if (contract.EntryDate.Value.Year == year) // Wenn Vertrag im gewählten Jahr beginnt
{
if (endDate >= new DateTime(contract.EntryDate.Value.Year, 12, 31)) // Wenn Vertrag länger gilt als das gewählte Jahr
{
int restlicheTageImJahr = Convert.ToInt32((new DateTime(contract.EntryDate.Value.Year, 12, 31) - contract.EntryDate.Value.Date).TotalDays);
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, endDate, arbeitstage, restlicheTageImJahr, leaveDays);
}
else // Wenn Ende des Vertrags im gleichen Jahr vor Jahresende ist
{
int restlicheTageImJahr = Convert.ToInt32((contract.ContractEndDate.Value.Date - contract.EntryDate.Value.Date).TotalDays);
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, endDate, arbeitstage, restlicheTageImJahr, leaveDays);
}
}
else if (endDate.Value.Year == year) // Wenn Vertrag im gewählten Jahr endet
{
int restlicheTageImJahr = Convert.ToInt32(((DateTime)endDate - new DateTime(year, 1, 1)).TotalDays);
tageNachAbzug = CalcCorrectNumberOfLeaveDaysForSpecialContractSituation((DateTime)contract.EntryDate, endDate, arbeitstage, restlicheTageImJahr, leaveDays);
}
// Abzuziehende Tage = Vertragliche Urlaubstage - Tage, die nach Abzug der verfallenden Tage übrig bleiben
abzuziehendeTage = (decimal)leaveDays - tageNachAbzug;
}
#endregion
if (contract == null || contract != null && !contract.EntryDate.HasValue)
{
continue;
}
var contractStart = contract.EntryDate.Value.ToString().Split(' ');
var contractEnd = contract.ContractEndDate != null ? contract.ContractEndDate.Value.ToString().Split(' ') : null;
var anzahlTage = leaveDays - abzuziehendeTage;
var obereZeile = new UrlaubskontoDarstellungDC()
{
AnzahlTage = string.Format("{0:0.00}", anzahlTage),
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.EmployeeOid, contract.ContractOid),
Tooltip = null,
IsDeletable = false,
DatumZurSortierung = null
};
obereZeile.Erlaeuterung = contractEnd == null ? "Urlaubstage laut Vertrag vom " + contractStart[0] + ":" : "Urlaubstage laut Vertrag vom " + contractStart[0] + " bis " + contractEnd[0] + ":";
dcs.Add(obereZeile);
// Standardmäßig Sonderurlaub bei Schwerbehinderung, aber modifizierbar
List<UrlaubskontoDarstellungDC> sonderurlaubItems = CreateSonderurlaubItems(emp, contract, es.GetSonderurlaubForEmployee(emp.EmployeeOid.Value, year), dcs);
//List<UrlaubskontoDarstellungDC> sonderurlaubItems = AddSonderurlaub(emp, contract, year);
if (sonderurlaubItems.Count > 0 && !dcs.Any(d => d.Erlaeuterung == "Sonderurlaub aufgrund von Behinderungsgrad über 50"))
{
dcs.AddRange(sonderurlaubItems);
sonderurlaub += sonderurlaubItems.Sum(s => Convert.ToDecimal(s.AnzahlTage));
}
#region Würde Code von 2. sparen, klappt aber leider nur dann, wenn es nicht mehr als einen Vertrag im Jahr gibt
//decimal anzGeschenkteTage = 0.0m;
//if (geschenkteUrlaubstage != null)
//{
// foreach (var item in geschenkteUrlaubstage)
// {
// if (item.Date.Year == year)
// anzGeschenkteTage += item.AnzahlTage;
// }
//}
//var testvar = aktuellesKonto.Value.Urlaubsanspruch - anzGeschenkteTage;
//var obereZeile = new UrlaubskontoDarstellungDC()
//{
// AnzahlTage = testvar,
// Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.EmployeeOid, contract.ContractOid),
// Tooltip = null,
// IsDeletable = false,
// DatumZurSortierung = null
//};
//obereZeile.Erlaeuterung = contractEnd == null ? "Urlaubstage laut Vertrag vom " + contractStart[0] + ":" : "Urlaubstage laut Vertrag vom " + contractStart[0] + " bis " + contractEnd[0] + ":";
//dcs.Add(obereZeile);
#endregion
}
// 3. Geschenkte Urlaubstage im Jahr
if (geschenkteUrlaubstage.Count > 0 && geschenkteUrlaubstage.Any(g => g.Date.Year == year))
{
// Einen Eintrag pro geschenktem Urlaubstag
foreach (var eintrag in geschenkteUrlaubstage)
{
if (eintrag.Date.Year == year)
{
var tempDate = eintrag.Date.ToString().Split(' ');
dcs.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = string.Format("Tage geschenkt am {0} von {1} ({2})", tempDate[0], eintrag.InsUser, eintrag.GeschenkterUrlaubstagNotice),
AnzahlTage = eintrag.AnzahlTage > 0 ? string.Format("+{0:0.00}", eintrag.AnzahlTage) : string.Format("{0:0.00}", eintrag.AnzahlTage),
Herkunft = string.Format("GeschenkterUrlaubstagOid:{0}", eintrag.GeschenkterUrlaubstagOid),
Tooltip = eintrag.GeschenkterUrlaubstagNotice,
IsDeletable = true,
DatumZurSortierung = eintrag.Date
});
}
}
}
// 4. Verfallener Resturlaub
// Verfallsdatum der Urlaubstage des letzten Jahres zur Darstellung (also ohne Uhrzeit)
// Resturlaub und den verbleibenden Resturlaub nach Verfall erstellen
if (aktuellesKonto.Value.ResturlaubVorjahrTotal > 0) // Wenn Urlaub aus dem Vorjahr mitgenommen wurde
{
dcs.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = "Resturlaub aus " + (year - 1) + " :",
AnzahlTage = string.Format("+{0:0.00}", aktuellesKonto.Value.ResturlaubVorjahrTotal),
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.EmployeeOid, year),
Tooltip = null,
IsDeletable = false
});
}
else if (urlaubskonten.ContainsKey(year - 1) && urlaubskonten[year - 1].Resturlaub > 0)
{
var vorherigesKonto = urlaubskonten[year - 1];
aktuellesKonto.Value.ResturlaubVorjahrTotal += vorherigesKonto.Resturlaub;
aktuellesKonto.Value.ResturlaubVorjahr += vorherigesKonto.Resturlaub;
dcs.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = "Resturlaub aus " + (year - 1) + " :",
AnzahlTage = string.Format("+{0:0.00}", aktuellesKonto.Value.ResturlaubVorjahrTotal),
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.EmployeeOid, year),
Tooltip = null,
IsDeletable = false
});
}
var expDate = GetExpirationDate(year);
if (expDate != null)
{
var expDateString = GetExpirationDate(year).ToString().Split(' ');
if (aktuellesKonto.Value.VerfallenerUrlaub > 0) // Wenn Urlaubstage verfallen sind
{
dcs.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = string.Format("Urlaub am {0} verfallen: ", expDateString[0]),
AnzahlTage = string.Format("-{0:0.00}", aktuellesKonto.Value.VerfallenerUrlaub),
DatumZurSortierung = GetExpirationDate(year),
Tooltip = null,
IsDeletable = false
});
}
}
// 5. Alle Urlaube, die Anfang oder Ende im gewählten Jahr haben
var absences = GetAllVacationAbsences(emp.AbsenceTimes, year, true);
if (absences.Count > 0) // Wenn es Urlaube in dem Jahr gibt
{
// Urlaube durchgehen und die Tage zählen
foreach (var spanne in absences)
{
// Im Stundenkonto wird auch Resturlaub angezeigt. Geht eine Abwesenheit über das Ende des Stundenkontomonats hinaus,
// Abwesenheit auf endeDerBerechnung setzen, damit Urlaubstage vom nachfolgenden Monat nicht zu früh abgezogen werden
if (endeDerBerechnung.HasValue && spanne.End.HasValue && spanne.End.Value > endeDerBerechnung.Value)
spanne.End = endeDerBerechnung;
if (spanne.End.HasValue && spanne.End.Value.Year > year)
spanne.End = new DateTime(year, 12, 31);
if (spanne.Start.HasValue && spanne.Start.Value.Year < year)
spanne.Start = new DateTime(year, 01, 01);
decimal summeTage = 0;
#region Urlaubstage zählen
summeTage = CountAbwesenheitstage(emp, spanne, year, contractsAndWeeklyDays);
#endregion
// Start- und Enddatum des Urlaubs für Darstellung vorbereiten
var startAsArray = spanne.Start.Value.ToString().Split(' ');
var endAsArray = spanne.End.Value.ToString().Split(' ');
// Eintrag für Urlaubstag setzen (Erläuterung abhängig davon, ob Urlaub nur ein Tag geht oder über mehrere
dcs.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = startAsArray[0] == endAsArray[0] ? string.Format("Urlaub genommen am {0}", startAsArray[0]) :
string.Format("Urlaub genommen vom {0} bis {1}", startAsArray[0], endAsArray[0]),
AnzahlTage = string.Format("-{0:0.00}", summeTage),
AnzahlTageUrlaub = summeTage,
Herkunft = string.Format("AbsenceOid: {0}", spanne.AbsenceTimeOid),
Tooltip = spanne.Notice,
IsDeletable = false,
DatumZurSortierung = spanne.Start.Value
});
}
}
// 6. Anzahl der aus 1.-5. resultierenden Resturlaubstage fürs Jahr, also Resturlaub vom Urlaubskonto
var anzTage = aktuellesKonto.Value.ResturlaubVorjahrTotal > 0 && aktuellesKonto.Value.VerfallenerUrlaub <= 0 ? aktuellesKonto.Value.Resturlaub + aktuellesKonto.Value.ResturlaubVorjahr : aktuellesKonto.Value.Resturlaub;
dcs.Add(new UrlaubskontoDarstellungDC()
{
AnzahlTage = string.Format("{0:0.00}", anzTage),
Erlaeuterung = "Summe der verbleibenden Urlaubstage: ",
Herkunft = "UrlaubskontoEmpOid" + aktuellesKonto.Value.EmployeeOid,
Tooltip = null,
IsDeletable = false,
DatumZurSortierung = new DateTime(2999, 12, 31)
});
// 7. Liste der DCs nach Datum sortieren, um eine zeitliche Hierarchie zu schaffen
var sortierteDCs = dcs.OrderBy(dc => dc.DatumZurSortierung).ToList();
return sortierteDCs;
return base.BerechneUrlaubskontoZurDarstellung(emp, year, endeDerBerechnung);
}
public override Dictionary<int, UrlaubskontoDC> BerechneUrlaubskonto(Employee emp, int year)
{
try
@@ -346,12 +80,12 @@ namespace PerspektivenEV.Service
int? workdays = 0;
List<ArbeitszeitDC> arbeitszeiten = new List<ArbeitszeitDC>();
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
Dictionary<Contract, int> contractsAndWeeklyDays = new Dictionary<Contract, int>();
// Jahresurlaubanspruch berechnen (noch kein Resturlaub Vorjahr in dieser Schleife, nur Jahresanspruch + Sonderfall Vertragsstart oder -ende mitten im Jahr)
foreach (var contract in emp.Contracts)
{
contractsAndWeeklyDays.Add(MapperFactory.ContractDC_Contract.MapToNewDC(contract), contract.WeeklyDays.HasValue ? contract.WeeklyDays.Value : 0);
contractsAndWeeklyDays.Add(contract, contract.WeeklyDays ?? 5);
var start = contract.EntryDate?.Year ?? firstYear;
var end = contract.ContractEndDate?.Year ?? year;
@@ -436,7 +170,7 @@ namespace PerspektivenEV.Service
absencesYear = absencesYear.OrderBy(x => x.Item1).ToList();
Dictionary<int, decimal> zuVerfallZuAddieren = new Dictionary<int, decimal>();
var geschenkteUrlaubstage = empService.GetGeschenkteUrlaubstageForEmployee((long)emp.Oid);
var geschenkteUrlaubstage = GetGeschenkteUrlaubstageForEmployee((long)emp.Oid);
// Alle Abwesenheiten durchlaufen, deren Dauer berechnen und vom Resturlaub + Geschenkte Tage Vorjahr abziehen, sofern es nicht nutzbaren Resturlaub vom Vorjahr gibt
// Tuple = Key-Value-Paar
@@ -456,7 +190,7 @@ namespace PerspektivenEV.Service
while (berechnungsjahr < absYear)
{
var geschenkteTageFuerAbrechnungsjahr = geschenkteUrlaubstage.Where(g => g.Date.Year == berechnungsjahr).ToList();
var sonderurlaubFuerAbrechnungsjahr = empService.GetSonderurlaubForEmployee((long)emp.Oid, berechnungsjahr);
var sonderurlaubFuerAbrechnungsjahr = GetSonderurlaubForEmployee(emp, berechnungsjahr);
var tmp = konten[berechnungsjahr];
@@ -488,7 +222,7 @@ namespace PerspektivenEV.Service
if (absence.Start.HasValue && absence.Start.Value.Year < absYear)
absence.Start = new DateTime(absYear, 01, 01);
dauer = CountAbwesenheitstage(MapperFactory.EmployeeDC_Employee.MapToNewDC(emp), absence, absYear, contractsAndWeeklyDays);
dauer = CountAbwesenheitstage(emp, absence, absYear, contractsAndWeeklyDays);
//dauer = BerechneAnzahlUrlaubstage(absence, null, absYear, workdays); // HIER MÜSSEN PARAMETER FÜR ISTWOCHENENDE() MITGEGEBEN WERDEN
// Verfallsdatum des Urlaubs festlegen
@@ -573,7 +307,7 @@ namespace PerspektivenEV.Service
konto.Value.Resturlaub += anzGeschenkteTage;
}
// Wenn es Sonderurlaube gibt, Liste durchlaufen und für jeden Eintrag den Zähler entsprechend der Tage erhöhen
var sonderurlaube = empService.GetSonderurlaubForEmployee((long)emp.Oid, i);
var sonderurlaube = GetSonderurlaubForEmployee(emp, i);
if (sonderurlaube != null)
{
decimal anzSonderurlaubTage = 0.0m;
@@ -597,6 +331,59 @@ namespace PerspektivenEV.Service
}
}
public override Dictionary<string, decimal> GetSonderurlaubForEmployee(Employee employee, int berechnungsjahr)
{
Dictionary<string, decimal> sonderurlaub = new Dictionary<string, decimal>();
Contract contract = null;
foreach (var c in employee.Contracts)
{
if (c.EntryDate.HasValue && !c.ContractEndDate.HasValue || c.EntryDate.HasValue && c.ContractEndDate.HasValue &&
berechnungsjahr >= c.EntryDate.Value.Year && berechnungsjahr <= c.ContractEndDate.Value.Year)
{
contract = c;
break;
}
}
// Wenn eine Behinderung von mind. 50 vorliegt stehen standardmäßig 5 Sonderurlaubstage zu
if (contract != null && (contract.EntryDate.HasValue && contract.ContractEndDate.HasValue || contract.EntryDate.HasValue && !contract.ContractEndDate.HasValue))
{
var yearStart = new DateTime(berechnungsjahr, 1, 1);
var yearEnd = new DateTime(berechnungsjahr, 12, 31);
// Schnittmenge aus Vertrag + Ausweis
var overlapStart = contract.EntryDate > employee.AusweisGueltigVon ? contract.EntryDate : employee.AusweisGueltigVon;
var overlapEnd = (contract.ContractEndDate ?? DateTime.MaxValue) < (employee.AusweisGueltigBis ?? DateTime.MaxValue) ? (contract.ContractEndDate ?? DateTime.MaxValue) : (employee.AusweisGueltigBis ?? DateTime.MaxValue);
// Jetzt prüfen: gibt es davon etwas im Jahr?
if (overlapStart <= overlapEnd && overlapStart <= yearEnd && overlapEnd >= yearStart)
{
if (employee.GradDerBehinderung != null && employee.GradDerBehinderung != "")
{
int.TryParse(employee.GradDerBehinderung, out int grad);
if (grad >= 50)
{
// TODO Anteilig berechnen, (wenn Behinderung erst im Berechnungsjahr beginnt nur die "aktiven" Monate anrechnen und ab
// Wenn keine Anzahl der wöchentlichen Arbeitstage gesetzt ist, 5 Tage
// Sonst Anzahl der wöchentlichen Arbeitstage (gesdetzlich so geregelt)
sonderurlaub.Add("Sonderurlaub aufgrund von Behinderungsgrad über 50", 5);
}
}
}
// Anpassung für Perspektiven:
// CancellationPeriod im Vertrag sind die Regenerationstage hier.
// Die Anzahl Tage, die da drin steht, soll als Sonderurlaub gutgeschrieben werden
if (contract.CancellationPeriod > 0)
sonderurlaub.Add("Regenerationstage", contract.CancellationPeriod);
}
return sonderurlaub;
}
public override List<long> GetVacationReasonIDs()
{
var res = new List<long>();

View File

@@ -4,6 +4,7 @@ using System.Linq;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
using BeWo.Service.Dienstplanung;
using BS.Shared;
using BS.Shared.DataContracts;
@@ -365,13 +366,13 @@ namespace SHKServiceSBD
return false;
}
public override bool AddServiceRecordToDuration(ServiceRecord item)
public override bool AddServiceRecordToDuration(StundenkontoServiceRecord item)
{
if (item.ServiceDescription != null && item.ServiceDescription.ServiceCategory != null)
if (item.ServiceDescription != null && item.ServiceDescription.Category != null)
{
if (!item.ServiceDescription.Name.Contains("Pause") && item.ServiceDescription.Name != "Zeitabzug")
{
if (item.ServiceDescription.ServiceCategory.Name == "Arbeitszeit" || item.ServiceDescription.ServiceCategory.Name == "Buchhaltung")
if (item.ServiceDescription.Category.Name == "Arbeitszeit" || item.ServiceDescription.Category.Name == "Buchhaltung")
{
return true;
}
@@ -409,21 +410,21 @@ namespace SHKServiceSBD
}
protected override ServiceRecordSummary BerechneStunden(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList<ServiceRecord> groupFilteredRecords, DateTime berichtsAnfang,
protected override 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>();
//base.CorrectOverlappingTimes(groupFilteredRecords);
foreach (var item in groupFilteredRecords)
{
if (!IsServiceRecordFehlzeit(item))
{
if (item.Start.Value >= berichtsAnfang && item.Start.Value < berichtsEnde)
if (item.Start >= berichtsAnfang && item.Start < berichtsEnde)
{
//if (AddServiceRecordToDuration(item))
//{
@@ -431,9 +432,9 @@ namespace SHKServiceSBD
if (item.ServiceDescription != null &&
item.ServiceDescription.ServiceCategory != null)
item.ServiceDescription.Category != null)
{
if (item.ServiceDescription.ServiceCategory.Name == "Arbeitszeit" || item.ServiceDescription.ServiceCategory.Name == "Buchhaltung")
if (item.ServiceDescription.Category.Name == "Arbeitszeit" || item.ServiceDescription.Category.Name == "Buchhaltung")
{
if (!item.ServiceDescription.Name.Contains("Pause"))
{
@@ -444,7 +445,7 @@ namespace SHKServiceSBD
//arbeitszeit -= duration;
}
}
else if (item.ServiceDescription.ServiceCategory.IsBillable)
else if (item.ServiceDescription.Category.IsBillable)
{
flsGesamt += duration;
}
@@ -462,7 +463,7 @@ namespace SHKServiceSBD
}
public override IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
public override IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<StundenkontoServiceRecord> recordsAll)
{
var list = base.CreateDayDetails(berichtStart, berichtEnde, ed, recordsAll);
foreach (var dd in list)
@@ -471,7 +472,7 @@ namespace SHKServiceSBD
foreach (var sr in recordsAll)
{
if (sr.Start.HasValue && sr.Start >= berichtStart && sr.Start < berichtEnde && sr.End.HasValue && sr.Start.Value.Day == dd.Date.Day)
if (sr.Start >= berichtStart && sr.Start < berichtEnde && sr.Start.Day == dd.Date.Day)
{
decimal duration = GetDuration(sr, ed);
@@ -857,11 +858,11 @@ namespace SHKServiceSBD
return dd;
}
protected override decimal GetDuration(ServiceRecord sr, MitarbeiterstundenkontoRO.EmployeeDetail ed)
protected override decimal GetDuration(StundenkontoServiceRecord sr, MitarbeiterstundenkontoRO.EmployeeDetail ed)
{
var d = base.GetDuration(sr, ed);
if (sr.ServiceDescription.ServiceCategory.Name == "Buchhaltung" && sr.ServiceDescription.Name.Contains("negativ"))
if (sr.ServiceDescription.Category.Name == "Buchhaltung" && sr.ServiceDescription.Name.Contains("negativ"))
{
d *= -1;
}
@@ -891,13 +892,13 @@ namespace SHKServiceSBD
return base.GetFeiertagsFaktor(start);
}
public override decimal BerechnePauseMinuten(IList<ServiceRecord> srListAlle)
public override decimal BerechnePauseMinuten(IList<StundenkontoServiceRecord> srListAlle)
{
var srList = srListAlle.Where(s => s.ServiceDescription.ServiceCategory.Name == "Arbeitszeit");
var srList = srListAlle.Where(s => s.ServiceDescription.Category.Name == "Arbeitszeit");
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)
{

View File

@@ -1,48 +1,53 @@
using System;
using BeWo.Data.Entities;
using BeWo.Report;
using BeWo.Report.ReportObjects;
using BeWo.Service.Dienstplanung;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using BeWo.Report;
using BeWo.Data.Entities;
using BeWo.Report.ReportObjects;
namespace SHKServiceSBD
{
public class CustomMitarbeiterstundenkontoBerechnungMonate : MitarbeiterstundenkontoBerechnungMonate
{
public override void CreateReport(MitarbeiterstundenkontoMonateRO ro)
{
DateTime start = ro.ReportStartDate;
//public override void CreateReport(MitarbeiterstundenkontoMonateRO ro)
//{
// DateTime start = ro.ReportStartDate;
var roDieserMonat = MitarbeiterstundenkontoRO.Create(ro.EmployeeOid, ro.TeamOids, start, start.AddMonths(1), ro.EmployeeOids);
var b = CreateMitarbeiterstundenkontoBerechnung();
b.CreateReport(roDieserMonat);
// var roDieserMonat = MitarbeiterstundenkontoRO.Create(ro.EmployeeOid, ro.TeamOids, start, start.AddMonths(1), ro.EmployeeOids);
// var b = CreateMitarbeiterstundenkontoBerechnung();
// b.CreateReport(roDieserMonat);
var list = new List<MitarbeiterstundenkontoRO>();
while (start < ro.ReportEndDate)
{
DateTime monatStart = new DateTime(start.Year, start.Month, 1);
DateTime monatEnde = monatStart.AddMonths(1);
// var list = new List<MitarbeiterstundenkontoRO>();
// List<StundenkontoServiceRecord> allServiceRecords = roDieserMonat.AllServiceRecords;
if (monatStart == ro.ReportStartDate)
{
MitarbeiterstundenkontoRO roMonat = MitarbeiterstundenkontoRO.Create(ro.EmployeeOid, ro.TeamOids, monatStart, monatEnde, ro.EmployeeOids);
b = CreateMitarbeiterstundenkontoBerechnung();
b.CreateReport(roMonat);
// while (start < ro.ReportEndDate)
// {
// DateTime monatStart = new DateTime(start.Year, start.Month, 1);
// DateTime monatEnde = monatStart.AddMonths(1);
list.Add(roMonat);
}
else
{
//Schon oben erzeugt
list.Add(roDieserMonat);
}
start = start.AddMonths(1);
}
// if (monatStart == ro.ReportStartDate)
// {
// MitarbeiterstundenkontoRO roMonat = MitarbeiterstundenkontoRO.Create(ro.EmployeeOid, ro.TeamOids, monatStart, monatEnde, ro.EmployeeOids);
// roMonat.AllServiceRecords = allServiceRecords;
// b = CreateMitarbeiterstundenkontoBerechnung();
// b.CreateReport(roMonat);
// list.Add(roMonat);
// }
// else
// {
// //Schon oben erzeugt
// list.Add(roDieserMonat);
// }
// start = start.AddMonths(1);
// }
// InitData(ro, list);
//}
InitData(ro, list);
}
public override MitarbeiterstundenkontoBerechnung CreateMitarbeiterstundenkontoBerechnung()
{
return new CustomMitarbeiterstundenkontoBerechnung();

View File

@@ -870,10 +870,10 @@ namespace BeWo.Service.Dienstplanung
public static List<DienstplanerMonthlySummaryDC> BerechneSollSaldoUndIst(DienstplanerRootDC root, DateTime date, List<long> empOids)
{
VacationService vs = PluginLoader.FindClass<VacationService>();
var konto = MitarbeiterstundenkontoRO.Create(null, null, date, date.AddMonths(1), empOids);
var konto = MitarbeiterstundenkontoRONeu.Create(null, null, date, date.AddMonths(1), empOids);
DienstplanungsManager manager = PluginLoader.FindClass<DienstplanungsManager>();
var berechnung = PluginLoader.FindClass<MitarbeiterstundenkontoBerechnung>();
var berechnung = PluginLoader.FindClass<MitarbeiterstundenkontoBerechnungNeu>();
berechnung.CreateReport(konto);
List<DienstplanerMonthlySummaryDC> monatsZusammenfassung = new List<DienstplanerMonthlySummaryDC>();
root.StundenBeiAbwesenheit = new Dictionary<long?, decimal>();
@@ -1066,9 +1066,9 @@ namespace BeWo.Service.Dienstplanung
{
VacationService vs = new VacationService();
List<long> empOids = new List<long>() { empOid };
var konto = MitarbeiterstundenkontoRO.Create(null, null, date, date.AddMonths(1), empOids);
var konto = MitarbeiterstundenkontoRONeu.Create(null, null, date, date.AddMonths(1), empOids);
var berechnung = PluginLoader.FindClass<MitarbeiterstundenkontoBerechnung>();
var berechnung = PluginLoader.FindClass<MitarbeiterstundenkontoBerechnungNeu>();
berechnung.CreateReport(konto);
DienstplanerMonthlySummaryDC dc = new DienstplanerMonthlySummaryDC();

View File

@@ -11,7 +11,7 @@ using System.Diagnostics;
namespace BeWo.Service.Dienstplanung
{
public class MitarbeiterstundenkontoRO
public class MitarbeiterstundenkontoRONeu
{
List<EmployeeDetail> _EmployeeDetailList = new List<EmployeeDetail>();
List<TeamDetail> _TeamDetailList = new List<TeamDetail>();
@@ -48,13 +48,13 @@ namespace BeWo.Service.Dienstplanung
set { this._TeamDetailList = value; }
}
public static MitarbeiterstundenkontoRO Create(long? employeeOid, IList<long> teamOids, DateTime startDate, DateTime endDate, IEnumerable<long> employeeOids)
public static MitarbeiterstundenkontoRONeu Create(long? employeeOid, IList<long> teamOids, DateTime startDate, DateTime endDate, IEnumerable<long> employeeOids)
{
Team team = null;
Dictionary<long, bool> empOidDict = new Dictionary<long, bool>();
var ro = new MitarbeiterstundenkontoRO {ReportStartDate = startDate, ReportEndDate = endDate};
var ro = new MitarbeiterstundenkontoRONeu {ReportStartDate = startDate, ReportEndDate = endDate};
IList<Employee> employees = null;
@@ -324,7 +324,7 @@ namespace BeWo.Service.Dienstplanung
public decimal ArbeitstageImBerichtszeitraum { get; set; }
public AbsenceTimeDays AbsenceTimeDays { get; set; }
public AbsenceTimeDaysNeu AbsenceTimeDays { get; set; }
public decimal? HourlyRate { get; set; }
public decimal? WeeklyFLS { get; set; }
public decimal? EmployeeSalaryByContract { get; set; }

View File

@@ -14,27 +14,27 @@ using DevExpress.XtraCharts.Native;
namespace BeWo.Service.Dienstplanung
{
public class MitarbeiterstundenkontoBerechnung
public class MitarbeiterstundenkontoBerechnungNeu
{
private decimal maxWochenstunden = 40;
private AppSettings appSettings;
private const int ANZ_WOCHENTAGE = 5;
public MitarbeiterstundenkontoBerechnung()
public MitarbeiterstundenkontoBerechnungNeu()
{
appSettings = AppSettings.CreateSettings();
CheckIst = true;
}
public MitarbeiterstundenkontoBerechnung(decimal maxWochenstunden) : this()
public MitarbeiterstundenkontoBerechnungNeu(decimal maxWochenstunden) : this()
{
this.maxWochenstunden = maxWochenstunden;
}
public bool CheckIst { get; set; }
public virtual void CreateReport(MitarbeiterstundenkontoRO ro)
public virtual void CreateReport(MitarbeiterstundenkontoRONeu ro)
{
CreateEmployeeDetails(ro);
@@ -45,7 +45,7 @@ namespace BeWo.Service.Dienstplanung
}
public virtual void CreateTotals(MitarbeiterstundenkontoRO ro)
public virtual void CreateTotals(MitarbeiterstundenkontoRONeu ro)
{
foreach (var empDetail in ro.EmployeeDetailList)
{
@@ -65,7 +65,7 @@ namespace BeWo.Service.Dienstplanung
ro.RelationFlsZuMittelbar = (ro.FlsIstGesamt / (ro.FlsIstGesamt + ro.MittelbarIst)) * 100;
}
public virtual void CreateTeamDetails(MitarbeiterstundenkontoRO ro)
public virtual void CreateTeamDetails(MitarbeiterstundenkontoRONeu ro)
{
foreach (var teamDetail in ro.TeamDetailList)
{
@@ -89,7 +89,7 @@ namespace BeWo.Service.Dienstplanung
}
public virtual void CreateEmployeeDetails(MitarbeiterstundenkontoRO ro)
public virtual void CreateEmployeeDetails(MitarbeiterstundenkontoRONeu ro)
{
foreach (var empDetail in ro.EmployeeDetailList)
{
@@ -117,7 +117,7 @@ namespace BeWo.Service.Dienstplanung
empDetail.HasContract = true;
}
ServiceRecordSummary summaryTotal = new ServiceRecordSummary();
var summaryTotal = new ServiceRecordSummaryNeu();
summaryTotal.RecordsImBerichtszeitraum = new List<ServiceRecord>();
decimal pause1 = 0;
@@ -432,7 +432,7 @@ namespace BeWo.Service.Dienstplanung
}
protected virtual AbsenceTimeHours GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, Contract c, IList<ServiceRecord> groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde)
protected virtual AbsenceTimeHoursNeu GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRONeu.EmployeeDetail empDetail, Contract c, IList<ServiceRecord> groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde)
{
return null;
}
@@ -632,7 +632,7 @@ namespace BeWo.Service.Dienstplanung
return false;
}
protected virtual void CalculateEmployeeSalary(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, DateTime start, DateTime ende)
protected virtual void CalculateEmployeeSalary(MitarbeiterstundenkontoRONeu.EmployeeDetail empDetail, DateTime start, DateTime ende)
{
decimal maxpayment = 0;
@@ -689,9 +689,9 @@ namespace BeWo.Service.Dienstplanung
empDetail.EmployeeSalaryByHours = salary;
}
protected virtual ServiceRecordSummary BerechneStunden(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList<ServiceRecord> groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde)
protected virtual ServiceRecordSummaryNeu BerechneStunden(MitarbeiterstundenkontoRONeu.EmployeeDetail empDetail, IList<ServiceRecord> groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde)
{
var sum = new ServiceRecordSummary();
var sum = new ServiceRecordSummaryNeu();
sum.RecordsImBerichtszeitraum = new List<ServiceRecord>();
empDetail.ServiceRecordsInSelectedTimeSpan = new List<ServiceRecord>();
@@ -837,9 +837,9 @@ namespace BeWo.Service.Dienstplanung
return false;
}
public virtual List<MitarbeiterstundenkontoRO.EmployeeDetail> FilterEmployeeList(List<MitarbeiterstundenkontoRO.EmployeeDetail> employeeDetailList)
public virtual List<MitarbeiterstundenkontoRONeu.EmployeeDetail> FilterEmployeeList(List<MitarbeiterstundenkontoRONeu.EmployeeDetail> employeeDetailList)
{
List<MitarbeiterstundenkontoRO.EmployeeDetail> newEmpList = new List<MitarbeiterstundenkontoRO.EmployeeDetail>();
List<MitarbeiterstundenkontoRONeu.EmployeeDetail> newEmpList = new List<MitarbeiterstundenkontoRONeu.EmployeeDetail>();
foreach (var ed in employeeDetailList)
{
@@ -859,7 +859,7 @@ namespace BeWo.Service.Dienstplanung
return newEmpList;
}
public virtual void HandleServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList<ServiceRecord> groupFilteredRecords, Contract contract)
public virtual void HandleServiceRecords(MitarbeiterstundenkontoRONeu.EmployeeDetail empDetail, IList<ServiceRecord> groupFilteredRecords, Contract contract)
{
//do nothing
}
@@ -1037,7 +1037,7 @@ namespace BeWo.Service.Dienstplanung
return null;
}
public virtual void HandleServiceRecord(MitarbeiterstundenkontoRO.EmployeeDetail emp, ServiceRecord item)
public virtual void HandleServiceRecord(MitarbeiterstundenkontoRONeu.EmployeeDetail emp, ServiceRecord item)
{
//do nothing
}
@@ -1052,18 +1052,18 @@ namespace BeWo.Service.Dienstplanung
return false;
}
public virtual IList<MitarbeiterstundenkontoRO.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
public virtual IList<MitarbeiterstundenkontoRONeu.DayDetail> CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRONeu.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
{
if (ShouldCreateDayDetailsForEachServiceRecord())
{
return CreateDayDetailsForEachServiceRecord(berichtStart, berichtEnde, ed, recordsAll);
}
Dictionary<int, MitarbeiterstundenkontoRO.DayDetail> dayToDetail = new Dictionary<int, MitarbeiterstundenkontoRO.DayDetail>();
Dictionary<int, MitarbeiterstundenkontoRONeu.DayDetail> dayToDetail = new Dictionary<int, MitarbeiterstundenkontoRONeu.DayDetail>();
for (int i = berichtStart.Day; i <= berichtEnde.AddDays(-1).Day; i++)
{
MitarbeiterstundenkontoRO.DayDetail dd = CreateDayDetail(new DateTime(berichtStart.Year, berichtStart.Month, i), ed);
MitarbeiterstundenkontoRONeu.DayDetail dd = CreateDayDetail(new DateTime(berichtStart.Year, berichtStart.Month, i), ed);
dayToDetail.Add(i, dd);
}
@@ -1200,9 +1200,9 @@ namespace BeWo.Service.Dienstplanung
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<MitarbeiterstundenkontoRONeu.DayDetail> CreateDayDetailsForEachServiceRecord(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRONeu.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
{
var details = new List<MitarbeiterstundenkontoRO.DayDetail>();
var details = new List<MitarbeiterstundenkontoRONeu.DayDetail>();
foreach (var sr in recordsAll)
{
@@ -1268,7 +1268,7 @@ namespace BeWo.Service.Dienstplanung
return duration;
}
public virtual void CalculateSpecialHours(MitarbeiterstundenkontoRO.DayDetail dd, ServiceRecord sr, decimal duration)
public virtual void CalculateSpecialHours(MitarbeiterstundenkontoRONeu.DayDetail dd, ServiceRecord sr, decimal duration)
{
if (sr.Start.Value.DayOfWeek == DayOfWeek.Sunday)
{
@@ -1348,9 +1348,9 @@ namespace BeWo.Service.Dienstplanung
return 0;
}
public virtual MitarbeiterstundenkontoRO.DayDetail CreateDayDetail(DateTime date, MitarbeiterstundenkontoRO.EmployeeDetail ed)
public virtual MitarbeiterstundenkontoRONeu.DayDetail CreateDayDetail(DateTime date, MitarbeiterstundenkontoRONeu.EmployeeDetail ed)
{
MitarbeiterstundenkontoRO.DayDetail dd = new MitarbeiterstundenkontoRO.DayDetail();
MitarbeiterstundenkontoRONeu.DayDetail dd = new MitarbeiterstundenkontoRONeu.DayDetail();
dd.ZusammenhaengendeZeitraeume = new List<DateTimeSpan>();
dd.Date = date.Date;
@@ -1363,7 +1363,7 @@ namespace BeWo.Service.Dienstplanung
return dd;
}
public virtual void CalculateAbsenceTimesForDay(MitarbeiterstundenkontoRO.DayDetail dd, MitarbeiterstundenkontoRO.EmployeeDetail ed)
public virtual void CalculateAbsenceTimesForDay(MitarbeiterstundenkontoRONeu.DayDetail dd, MitarbeiterstundenkontoRONeu.EmployeeDetail ed)
{
var absenceTimes = ed.Employee.AbsenceTimes;
@@ -1483,9 +1483,9 @@ namespace BeWo.Service.Dienstplanung
return 1;
}
public virtual MitarbeiterstundenkontoRO.EmployeeDetail BerechneUeberstundenBis(MitarbeiterstundenkontoRO.EmployeeDetail edOrig, IList<ServiceRecord> records, DateTime monat, out decimal? ueberstunden, out decimal alteExtraUeberstunden)
public virtual MitarbeiterstundenkontoRONeu.EmployeeDetail BerechneUeberstundenBis(MitarbeiterstundenkontoRONeu.EmployeeDetail edOrig, IList<ServiceRecord> records, DateTime monat, out decimal? ueberstunden, out decimal alteExtraUeberstunden)
{
MitarbeiterstundenkontoRO.EmployeeDetail edTotal = new MitarbeiterstundenkontoRO.EmployeeDetail();
MitarbeiterstundenkontoRONeu.EmployeeDetail edTotal = new MitarbeiterstundenkontoRONeu.EmployeeDetail();
ueberstunden = null;
alteExtraUeberstunden = 0;
@@ -1630,7 +1630,7 @@ namespace BeWo.Service.Dienstplanung
}
MitarbeiterstundenkontoRO.EmployeeDetail ed = new MitarbeiterstundenkontoRO.EmployeeDetail();
MitarbeiterstundenkontoRONeu.EmployeeDetail ed = new MitarbeiterstundenkontoRONeu.EmployeeDetail();
ed.SollProTag = weeklyTotalHours / arbeitstageProWoche;
ed.ArbeitstageProWoche = arbeitstageProWoche;
ed.ArbeitstageImBerichtszeitraum = arbeitstage;
@@ -1764,12 +1764,12 @@ namespace BeWo.Service.Dienstplanung
return edTotal;
}
protected virtual decimal? BerechneUeberstunden(MitarbeiterstundenkontoRO.EmployeeDetail ed, decimal? ueberstundenStd, Contract contract, DateTime start, DateTime ende)
protected virtual decimal? BerechneUeberstunden(MitarbeiterstundenkontoRONeu.EmployeeDetail ed, decimal? ueberstundenStd, Contract contract, DateTime start, DateTime ende)
{
return ueberstundenStd;
}
public virtual decimal BerechneSollProWoche(Contract c, MitarbeiterstundenkontoRO.EmployeeDetail ed)
public virtual decimal BerechneSollProWoche(Contract c, MitarbeiterstundenkontoRONeu.EmployeeDetail ed)
{
if (c != null)
{
@@ -1796,7 +1796,7 @@ namespace BeWo.Service.Dienstplanung
}
public virtual decimal BerechneStundenDurchAbwesenheiten(AbsenceTimeDays ath, DateTime start, DateTime ende, Contract c, MitarbeiterstundenkontoRO.EmployeeDetail ed)
public virtual decimal BerechneStundenDurchAbwesenheiten(AbsenceTimeDaysNeu ath, DateTime start, DateTime ende, Contract c, MitarbeiterstundenkontoRONeu.EmployeeDetail ed)
{
if (BerechneAlteAbwesenheitsStunden(start))
{
@@ -1938,7 +1938,7 @@ namespace BeWo.Service.Dienstplanung
return false;
}
private decimal BerechneStundenDurchAbwesenheitenAlt(AbsenceTimeDays ath, DateTime start, DateTime ende, Contract c, MitarbeiterstundenkontoRO.EmployeeDetail ed)
private decimal BerechneStundenDurchAbwesenheitenAlt(AbsenceTimeDaysNeu ath, DateTime start, DateTime ende, Contract c, MitarbeiterstundenkontoRONeu.EmployeeDetail ed)
{
decimal? sollProMonat = BerechneSollProMonat(ed.Employee, start, ende);
@@ -1982,7 +1982,7 @@ namespace BeWo.Service.Dienstplanung
}
}
public virtual decimal GetSollArbeitszeitProArbeitstag(Contract contract, MitarbeiterstundenkontoRO.EmployeeDetail ed)
public virtual decimal GetSollArbeitszeitProArbeitstag(Contract contract, MitarbeiterstundenkontoRONeu.EmployeeDetail ed)
{
if (contract.MonthlyTotalHours.HasValue && contract.MonthlyTotalHours.Value > 0 && ed.ArbeitstageImBerichtszeitraum > 0)
{
@@ -1997,7 +1997,7 @@ namespace BeWo.Service.Dienstplanung
}
//Wird nicht mehr benutzt
public virtual decimal BerechneStundenDurchAbwesenheiten(AbsenceTimeDays ath, DateTime start, DateTime ende, int arbeitstageProWoche, decimal sollProWoche)
public virtual decimal BerechneStundenDurchAbwesenheiten(AbsenceTimeDaysNeu ath, DateTime start, DateTime ende, int arbeitstageProWoche, decimal sollProWoche)
{
decimal stunden = 0;
@@ -2057,7 +2057,7 @@ namespace BeWo.Service.Dienstplanung
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<MitarbeiterstundenkontoRONeu.DayDetail> days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRONeu.EmployeeDetail ed, IList<ServiceRecord> recordsAll)
{
decimal addHours = 0;
@@ -2077,7 +2077,7 @@ namespace BeWo.Service.Dienstplanung
return addHours;
}
public virtual decimal CalculateBreakMinutes(MitarbeiterstundenkontoRO.DayDetail dayDetail, int maxHoursUntilBreak, int breakMinutes)
public virtual decimal CalculateBreakMinutes(MitarbeiterstundenkontoRONeu.DayDetail dayDetail, int maxHoursUntilBreak, int breakMinutes)
{
decimal addHours = 0;
@@ -2175,7 +2175,7 @@ namespace BeWo.Service.Dienstplanung
return contractNextToStartDate;
}
public virtual AbsenceTimeDays GetAbsenceTimeDaysWithWorkWeeks(Employee emp, DateTime start, DateTime end, int arbeitstageProWoche)
public virtual AbsenceTimeDaysNeu GetAbsenceTimeDaysWithWorkWeeks(Employee emp, DateTime start, DateTime end, int arbeitstageProWoche)
{
if (HatArbeitszeitImZeitraum(emp.Arbeitszeiten, start, end))
{
@@ -2185,9 +2185,9 @@ namespace BeWo.Service.Dienstplanung
}
public virtual AbsenceTimeDays GetAbsenceTimeDaysNachArbeitszeiten(Employee emp, DateTime start, DateTime end, int arbeitstageProWoche)
public virtual AbsenceTimeDaysNeu GetAbsenceTimeDaysNachArbeitszeiten(Employee emp, DateTime start, DateTime end, int arbeitstageProWoche)
{
var atd = new AbsenceTimeDays();
var atd = new AbsenceTimeDaysNeu();
decimal? tage = null;
@@ -2204,7 +2204,7 @@ namespace BeWo.Service.Dienstplanung
return atd;
}
public virtual void AddAbsenceDaysNachArbeitszeitenFuerTag(AbsenceTimeDays atd, Employee emp, DateTime tag)
public virtual void AddAbsenceDaysNachArbeitszeitenFuerTag(AbsenceTimeDaysNeu atd, Employee emp, DateTime tag)
{
Dictionary<String, bool> daysDict = new Dictionary<String, bool>();
foreach (var az in emp.Arbeitszeiten)
@@ -2241,7 +2241,7 @@ namespace BeWo.Service.Dienstplanung
}
}
private void AddAbsenceDaysFuerTag(AbsenceTimeDays atd, Employee emp, DateTime arbeitstagStart, DateTime arbeitstagEnde)
private void AddAbsenceDaysFuerTag(AbsenceTimeDaysNeu atd, Employee emp, DateTime arbeitstagStart, DateTime arbeitstagEnde)
{
var hours = (decimal)arbeitstagEnde.Subtract(arbeitstagStart).TotalHours;
@@ -2290,9 +2290,9 @@ namespace BeWo.Service.Dienstplanung
}
public virtual AbsenceTimeDays GetAbsenceTimeDaysWithWorkWeeks(IList<AbsenceTime> absenceTimes, DateTime start, DateTime end, int arbeitstageProWoche)
public virtual AbsenceTimeDaysNeu GetAbsenceTimeDaysWithWorkWeeks(IList<AbsenceTime> absenceTimes, DateTime start, DateTime end, int arbeitstageProWoche)
{
var atd = new AbsenceTimeDays();
var atd = new AbsenceTimeDaysNeu();
var totalSpan = new DateTimeSpan();
totalSpan.StartDate = start;
totalSpan.EndDate = end.AddDays(-1);
@@ -2413,7 +2413,7 @@ namespace BeWo.Service.Dienstplanung
}
public virtual AbsenceTimeDays GetAbsenceTimeDays(IList<AbsenceTime> absenceTimes, DateTime start, DateTime end)
public virtual AbsenceTimeDaysNeu GetAbsenceTimeDays(IList<AbsenceTime> absenceTimes, DateTime start, DateTime end)
{
return GetAbsenceTimeDaysWithWorkWeeks(absenceTimes, start, end, ANZ_WOCHENTAGE);
}
@@ -2640,7 +2640,7 @@ namespace BeWo.Service.Dienstplanung
}
}
public class AbsenceTimeDays
public class AbsenceTimeDaysNeu
{
public decimal? TageUrlaub;
public decimal? TageKrankheit;
@@ -2650,14 +2650,14 @@ namespace BeWo.Service.Dienstplanung
public Dictionary<DateTimeSpan, decimal> RestStundenProWocheDict;
}
public class AbsenceTimeHours
public class AbsenceTimeHoursNeu
{
public decimal StundenUrlaub;
public decimal StundenKrankheit;
public decimal StundenSonstiges;
}
public class ServiceRecordSummary
public class ServiceRecordSummaryNeu
{
public decimal IstAbrechenbar { get; set; }

View File

@@ -0,0 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Ink;
using BS.Shared.Core;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BS.Shared;
using BS.Shared.Extensions;
using System.Diagnostics;
using BS.Shared.DataContracts;
namespace BeWo.Service.Dienstplanung
{
public class StundenkontoServiceRecord
{
public long? ServiceRecordOid { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public decimal RoundedDuration { get; set; }
public int? GroupEmployeeCount { get; set; }
public int? GroupPersonCount { get; set; }
public decimal? GroupRoundedDuration { get; set; }
public long? GroupOid { get; set; }
public decimal DistanceInMeter { get; set; }
public decimal? Betrag { get; set; }
public ServiceDescriptionDC ServiceDescription { get; set; }
public long? CostBearer2SupportConceptOid { get; set; }
public long? CustomerOid { get; set; }
public long? EmployeeOid { get; set; }
}
}

View File

@@ -330,7 +330,7 @@ namespace BeWo.Service.Plugins
//t = "5065709552"; // Biotop e.V.
//t = "9094672461"; // Transkulturelles Betreuungsbüro (Toprak GmbH)
//t = "9008813932"; // Aids Hilfe Giessen
//t = "4052216789"; // Perspektiven e.V.
t = "4052216789"; // Perspektiven e.V.
//t = "7663765314"; // Christina Frommen (Frommen BeWo)
//t = "5462295916"; // BeWo Dellbrueck
//t = "2120989920"; // Sozialbüro Schüßler und Wilckens GbR
@@ -407,7 +407,7 @@ namespace BeWo.Service.Plugins
//t = "9520730180"; // Arbeitskreis Jugend- und Drogenberatung Waf
//t = "8365918329"; // Lebenshilfe Stade e.V. Schulbegleitender Dienst
//t = "6203102637"; // BeWo Neuss-Lauth u. Lauth GbR
t = "7060431533"; // Arche Tecklenburg e.V.
//t = "7060431533"; // Arche Tecklenburg e.V.
//t = "1159580198"; // Wendepunkt Velbert gGmbH
//t = "5094575560"; // Christopherus Haus MID
//t = "5261046426"; // SelbstWerk EN / Bettina Heckrodt

View File

@@ -1,8 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using BeWo.Data.Access;
using BeWo.Data.Access;
using BeWo.Data.Entities;
using BeWo.Service.DCEntityMapper;
using BeWo.Service.ServiceImplementations;
@@ -11,12 +7,20 @@ using BS.Shared.Core;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using DevExpress.CodeParser;
using DevExpress.XtraRichEdit.Import.Html;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text.RegularExpressions;
namespace BeWo.Service.Plugins
{
public class VacationService : AbstractIDSpecificDefaultClass<VacationService>
{
private List<FeiertagDC> databaseFeiertage = null;
private IList<AbsenceReason> allAbsenceReasons = null;
private IList<GeschenkterUrlaubstag> allGeschenkteUrlaubstage = null;
private List<DateTime> _Feiertage { get;set; }
private string _Bundesland = "NRW";
@@ -141,6 +145,31 @@ namespace BeWo.Service.Plugins
return databaseFeiertage.Where(f => f.Datum >= new DateTime(year, 1, 1) && f.Datum < new DateTime(year + 1, 1, 1)).ToList();
}
private IList<AbsenceReason> AllAbsenceReasons
{
get
{
if (allAbsenceReasons == null)
{
allAbsenceReasons = DAOFactory.GenericDAO.GetAll<AbsenceReason>();
}
return allAbsenceReasons;
}
}
private IList<GeschenkterUrlaubstag> AllGeschenkteUrlaubstage
{
get
{
return allGeschenkteUrlaubstage;
}
set
{
allGeschenkteUrlaubstage = value;
}
}
public static DateTime GetOsterSonntag(int year)
{
@@ -456,54 +485,37 @@ namespace BeWo.Service.Plugins
_Feiertage = GetFeiertage(year);
}
public virtual List<AbsenceTimeDC> GetAllVacationAbsences(List<AbsenceTimeDC> absenceTimes, int year, bool inklEndeEinerAbsenceTime)
public virtual List<AbsenceTimeDC> GetAllVacationAbsences(IList<AbsenceTimeDC> absenceTimes, int year, bool inklEndeEinerAbsenceTime)
{
List<AbsenceTimeDC> absences = new List<AbsenceTimeDC>();
var absReason = GetVacationReasonIDs();
if (inklEndeEinerAbsenceTime)
{
absences = absenceTimes.Where(x => absReason.Contains(x.Reason.AbsenceReasonOid.Value) && (x.Start.HasValue && x.Start.Value.Year == year)
|| absReason.Contains(x.Reason.AbsenceReasonOid.Value) && (x.End.HasValue && x.End.Value.Year == year))
.OrderBy(x => x.Start).ToList();
}
else
{
absences = absenceTimes.Where(x => absReason.Contains(x.Reason.AbsenceReasonOid.Value) &&
(x.Start.HasValue && x.Start.Value.Year <= year))
.OrderBy(x => x.Start).ToList();
}
return absences;
return GetAllAbsencesWithReasonOid(absenceTimes, absReason, year, inklEndeEinerAbsenceTime);
}
public virtual List<AbsenceTimeDC> GetAllSickAbsences(List<AbsenceTimeDC> absenceTimes, int year, bool inklEndeEinerAbsenceTime)
public virtual List<AbsenceTimeDC> GetAllSickAbsences(IList<AbsenceTimeDC> absenceTimes, int year, bool inklEndeEinerAbsenceTime)
{
List<AbsenceTimeDC> absences = new List<AbsenceTimeDC>();
var absReason = GetSickReasonIDs();
return GetAllAbsencesWithReasonOid(absenceTimes, absReason, year, inklEndeEinerAbsenceTime);
}
public virtual List<AbsenceTimeDC> GetAllAbsencesWithReasonOid(IList<AbsenceTimeDC> absenceTimes, IList<long> reasonOids, int year, bool inklEndeEinerAbsenceTime)
{
if (inklEndeEinerAbsenceTime)
{
absences = absenceTimes.Where(x => absReason.Contains(x.Reason.AbsenceReasonOid.Value) && (x.Start.HasValue && x.Start.Value.Year == year)
|| absReason.Contains(x.Reason.AbsenceReasonOid.Value) && (x.End.HasValue && x.End.Value.Year == year))
return absenceTimes.Where(x => reasonOids.Contains(x.Reason.AbsenceReasonOid.Value) && (x.Start.HasValue && x.Start.Value.Year == year)
|| reasonOids.Contains(x.Reason.AbsenceReasonOid.Value) && (x.End.HasValue && x.End.Value.Year == year))
.OrderBy(x => x.Start).ToList();
}
else
{
absences = absenceTimes.Where(x => absReason.Contains(x.Reason.AbsenceReasonOid.Value) &&
return absenceTimes.Where(x => reasonOids.Contains(x.Reason.AbsenceReasonOid.Value) &&
(x.Start.HasValue && x.Start.Value.Year <= year))
.OrderBy(x => x.Start).ToList();
}
return absences;
}
public virtual List<long> GetVacationReasonIDs()
{
var res = new List<long>();
var filters = new List<string> { "URLAUB" };
var reasons = DAOFactory.GenericDAO.GetAll<AbsenceReason>();
var reasons = AllAbsenceReasons;
foreach (var reason in reasons)
{
@@ -525,7 +537,7 @@ namespace BeWo.Service.Plugins
{
var res = new List<long>();
var filters = new List<string> { "KRANK" };
var reasons = DAOFactory.GenericDAO.GetAll<AbsenceReason>();
var reasons = AllAbsenceReasons;
foreach (var reason in reasons)
{
@@ -579,24 +591,28 @@ namespace BeWo.Service.Plugins
// 6. Anzahl der aus 1.-5. resultierenden Resturlaubstage fürs Jahr, also Resturlaub vom Urlaubskonto
// 7. Liste der DCs nach Datum sortieren, um eine zeitliche Hierarchie zu schaffen
public virtual List<UrlaubskontoDarstellungDC> BerechneUrlaubskontoZurDarstellung(EmployeeDC emp, int year, DateTime? endeDerBerechnung = null)
public virtual List<UrlaubskontoDarstellungDC> BerechneUrlaubskontoZurDarstellung(Employee emp, int year, DateTime? endeDerBerechnung = null)
{
Stopwatch stopwatch = Stopwatch.StartNew();
List<UrlaubskontoDarstellungDC> dcs = new List<UrlaubskontoDarstellungDC>();
EmployeeServiceImp es = PluginLoader.FindClass<EmployeeServiceImp>();
//EmployeeServiceImp es = PluginLoader.FindClass<EmployeeServiceImp>();
// Urlaubskonto erstellen
var ent = DAOFactory.GenericDAO.LoadByID<Employee>((long)emp.EmployeeOid);
var urlaubskonten = BerechneUrlaubskonto(ent, year);
//var ent = DAOFactory.GenericDAO.LoadByID<Employee>((long)emp.EmployeeOid);
var urlaubskonten = BerechneUrlaubskonto(emp, year);
var aktuellesKonto = urlaubskonten.First(u => u.Key == year);
var geschenkteUrlaubstage = es.GetGeschenkteUrlaubstageForEmployee((long)emp.EmployeeOid);
var geschenkteUrlaubstage = GetGeschenkteUrlaubstageForEmployee(emp.Oid.Value);
decimal sonderurlaub = 0;
// Benötigt werden:
// 1. Vetragliche Urlaubstage für´s Jahr
List<ContractDC> contracts = new List<ContractDC>();
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
List<Contract> contracts = new List<Contract>();
Dictionary<Contract, int> contractsAndWeeklyDays = new Dictionary<Contract, int>();
// Vertrag für Jahr raussuchen
foreach (var c in emp.Contracts)
@@ -616,7 +632,7 @@ namespace BeWo.Service.Plugins
if (year >= contractStartDate.Year && year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt
{
contracts.Add(c);
contractsAndWeeklyDays.Add(c, c.WeeklyDays);
contractsAndWeeklyDays.Add(c, c.WeeklyDays ?? 5);
}
}
if (contracts.Count == 0) // Kein Vertrag = kein Urlaubskonto
@@ -632,7 +648,7 @@ namespace BeWo.Service.Plugins
decimal tageNachAbzug = 0;
decimal abzuziehendeTage = 0;
int arbeitstage = contract.WeeklyDays; // Vertragliche Arbeitstage
int arbeitstage = contract.WeeklyDays ?? 5; // Vertragliche Arbeitstage
DateTime? endDate = contract.ContractEndDate == null ? new DateTime(year, 12, 31) : contract.ContractEndDate; // Ende des Vertrags auf letzten Tag des Jahres setzen, wenn kein Ende
var leaveDays = contract.EmploymentType?.LeaveDays == null ? contract.LeaveDays : contract.EmploymentType.LeaveDays; // Vertragliche Urlaubstage
if (!leaveDays.HasValue)
@@ -675,7 +691,7 @@ namespace BeWo.Service.Plugins
var obereZeile = new UrlaubskontoDarstellungDC()
{
AnzahlTage = string.Format("{0:0.00}", anzahlTage),
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.EmployeeOid, contract.ContractOid),
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.Oid, contract.Oid),
Tooltip = null,
IsDeletable = false,
DatumZurSortierung = null
@@ -684,7 +700,7 @@ namespace BeWo.Service.Plugins
dcs.Add(obereZeile);
// Standardmäßig Sonderurlaub bei Schwerbehinderung, aber modifizierbar
List<UrlaubskontoDarstellungDC> sonderurlaubItems = CreateSonderurlaubItems(emp, contract, es.GetSonderurlaubForEmployee(emp.EmployeeOid.Value, year), dcs);
List<UrlaubskontoDarstellungDC> sonderurlaubItems = CreateSonderurlaubItems(emp, contract, GetSonderurlaubForEmployee(emp, year), dcs);
//List<UrlaubskontoDarstellungDC> sonderurlaubItems = AddSonderurlaub(emp, contract, year);
if (sonderurlaubItems.Count > 0 && !dcs.Any(d => d.Erlaeuterung == "Sonderurlaub aufgrund von Behinderungsgrad über 50"))
{
@@ -727,10 +743,10 @@ namespace BeWo.Service.Plugins
var tempDate = eintrag.Date.ToString().Split(' ');
dcs.Add(new UrlaubskontoDarstellungDC()
{
Erlaeuterung = string.Format("Tage geschenkt am {0} von {1} ({2})", tempDate[0], eintrag.InsUser, eintrag.GeschenkterUrlaubstagNotice),
Erlaeuterung = string.Format("Tage geschenkt am {0} von {1} ({2})", tempDate[0], eintrag.InsUser, eintrag.Notice),
AnzahlTage = eintrag.AnzahlTage > 0 ? string.Format("+{0:0.00}", eintrag.AnzahlTage) : string.Format("{0:0.00}", eintrag.AnzahlTage),
Herkunft = string.Format("GeschenkterUrlaubstagOid:{0}", eintrag.GeschenkterUrlaubstagOid),
Tooltip = eintrag.GeschenkterUrlaubstagNotice,
Herkunft = string.Format("GeschenkterUrlaubstagOid:{0}", eintrag.Oid),
Tooltip = eintrag.Notice,
IsDeletable = true,
DatumZurSortierung = eintrag.Date
});
@@ -749,7 +765,7 @@ namespace BeWo.Service.Plugins
{
Erlaeuterung = "Resturlaub aus " + (year - 1) + " :",
AnzahlTage = string.Format("+{0:0.00}", aktuellesKonto.Value.ResturlaubVorjahrTotal),
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.EmployeeOid, year),
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.Oid, year),
Tooltip = null,
IsDeletable = false
});
@@ -764,7 +780,7 @@ namespace BeWo.Service.Plugins
{
Erlaeuterung = "Resturlaub aus " + (year - 1) + " :",
AnzahlTage = string.Format("+{0:0.00}", aktuellesKonto.Value.ResturlaubVorjahrTotal),
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.EmployeeOid, year),
Herkunft = string.Format("EmpOid:{0} Urlaubskonto:{1}", emp.Oid, year),
Tooltip = null,
IsDeletable = false
});
@@ -787,10 +803,10 @@ namespace BeWo.Service.Plugins
}
}
var absDcs = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDCs(emp.AbsenceTimes);
// 5. Alle Urlaube, die Anfang oder Ende im gewählten Jahr haben
var absences = GetAllVacationAbsences(emp.AbsenceTimes, year, true); // Abwesenheiten nur auf Urlaube filtern
var absences = GetAllVacationAbsences(absDcs, year, true); // Abwesenheiten nur auf Urlaube filtern
if (absences.Count > 0) // Wenn es Urlaube in dem Jahr gibt
{
@@ -846,12 +862,18 @@ namespace BeWo.Service.Plugins
// 7. Liste der DCs nach Datum sortieren, um eine zeitliche Hierarchie zu schaffen
var sortierteDCs = dcs.OrderBy(dc => dc.DatumZurSortierung).ToList();
stopwatch.Stop();
Console.WriteLine($"Laufzeit: {stopwatch.ElapsedMilliseconds} ms");
Console.WriteLine($"Laufzeit: {stopwatch.Elapsed}");
return sortierteDCs;
}
public virtual List<UrlaubskontoDarstellungDC> CreateSonderurlaubItems(EmployeeDC emp, ContractDC contract, Dictionary<string, decimal> sonderurlaubDict, List<UrlaubskontoDarstellungDC> darstellungList)
public virtual List<UrlaubskontoDarstellungDC> CreateSonderurlaubItems(Employee emp, Contract contract, Dictionary<string, decimal> sonderurlaubDict, List<UrlaubskontoDarstellungDC> darstellungList)
{
List<UrlaubskontoDarstellungDC> sonderurlaubItems = new List<UrlaubskontoDarstellungDC>();
@@ -861,7 +883,7 @@ namespace BeWo.Service.Plugins
var sonderurlaub = new UrlaubskontoDarstellungDC()
{
AnzahlTage = string.Format("{0:0.00}", item.Value), // Standardmäßig 5 Tage
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.EmployeeOid, contract.ContractOid),
Herkunft = string.Format("EmpOid:{0} ContractOid:{1}", emp.Oid, contract.Oid),
Tooltip = "",
IsDeletable = false,
DatumZurSortierung = null,
@@ -903,7 +925,7 @@ namespace BeWo.Service.Plugins
return sonderurlaub;
}
public decimal CountAbwesenheitstage(EmployeeDC emp, AbsenceTimeDC spanne, int year, Dictionary<ContractDC, int> contractsAndWeeklyDays)
public decimal CountAbwesenheitstage(Employee emp, AbsenceTimeDC spanne, int year, Dictionary<Contract, int> contractsAndWeeklyDays)
{
decimal summeTage = 0;
if (emp.Arbeitszeiten != null && emp.Arbeitszeiten.Count > 0)
@@ -913,7 +935,7 @@ namespace BeWo.Service.Plugins
if (az.GueltigVon.HasValue)
{
var azEnde = !az.GueltigBis.HasValue ? new DateTime(year, 12, 31) : az.GueltigBis.Value;
if (new DateTimeSpan(az.GueltigVon.Value, azEnde).ContainsDate(spanne.AbsenceSpan.StartDate) && az.Eintraege != null && az.Eintraege.Count > 0)
if (new DateTimeSpan(az.GueltigVon.Value, azEnde).ContainsDate(spanne.AbsenceSpan.StartDate) && az.ArbeitszeitEintraege != null && az.ArbeitszeitEintraege.Count > 0)
{
summeTage = CountAbwesenheitstageArbeitszeiten(spanne, year, az);
break;
@@ -930,7 +952,7 @@ namespace BeWo.Service.Plugins
return summeTage;
}
public decimal CountAbwesenheistageStandard(AbsenceTimeDC spanne, int year, Dictionary<ContractDC, int> contractsAndWeeklyDays)
public decimal CountAbwesenheistageStandard(AbsenceTimeDC spanne, int year, Dictionary<Contract, int> contractsAndWeeklyDays)
{
var summeTage = 0m;
if (spanne.End == null) // Wenn es kein Ende gibt, Ende auf letzten Tag im Jahr setzen
@@ -985,7 +1007,7 @@ namespace BeWo.Service.Plugins
return summeTage;
}
public decimal CountAbwesenheitstageArbeitszeiten(AbsenceTimeDC spanne, int year, ArbeitszeitDC az)
public decimal CountAbwesenheitstageArbeitszeiten(AbsenceTimeDC spanne, int year, Arbeitszeit az)
{
//var feiertage = GetFeiertage(year);
var feiertage = GetFeiertage(year, Bundesland);
@@ -995,7 +1017,7 @@ namespace BeWo.Service.Plugins
spanne.End = new DateTime(year, 12, 31);
if (spanne.Start.Value.Date == spanne.End.Value.Date && spanne.Start.Value.TimeOfDay == spanne.End.Value.TimeOfDay &&
az.Eintraege.Any(e => e.DayOfWeek == spanne.Start.Value.DayOfWeek)) // ein ganzer Tag Urlaub
az.ArbeitszeitEintraege.Any(e => BS.Shared.Core.DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(e.Tag) == spanne.Start.Value.DayOfWeek)) // ein ganzer Tag Urlaub
{
if (!feiertage.Any(f => f.Datum == spanne.Start.Value.Date))
summeTage++;
@@ -1003,7 +1025,7 @@ namespace BeWo.Service.Plugins
summeTage += (1 - GetFeiertagsFaktor(spanne.Start.Value));
}
else if (spanne.Start.Value.Date == spanne.End.Value.Date && spanne.Start.Value.TimeOfDay != spanne.End.Value.TimeOfDay &&
az.Eintraege.Any(e => e.DayOfWeek == spanne.Start.Value.DayOfWeek) && !feiertage.Any(f => f.Datum == spanne.Start.Value.Date)) // ein halber Tag Urlaub
az.ArbeitszeitEintraege.Any(e => BS.Shared.Core.DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(e.Tag) == spanne.Start.Value.DayOfWeek) && !feiertage.Any(f => f.Datum == spanne.Start.Value.Date)) // ein halber Tag Urlaub
summeTage += 0.5m;
else // Mehr als ein Tag Urlaub
{
@@ -1017,7 +1039,7 @@ namespace BeWo.Service.Plugins
#endregion
while (startForLoop <= spanne.End.Value)
{
if (az.Eintraege.Any(e => e.DayOfWeek == startForLoop.DayOfWeek))
if (az.ArbeitszeitEintraege.Any(e => BS.Shared.Core.DateTimeUtils.ConvertAppointmentDayOfWeekToDayOfWeek(e.Tag) == startForLoop.DayOfWeek))
{
if (!feiertage.Any(f => f.Datum == startForLoop.Date) && GetFeiertagsFaktor(startForLoop.Date) == 0)
summeTage++;
@@ -1052,7 +1074,7 @@ namespace BeWo.Service.Plugins
SetLokaleFeiertagListe(year);
// Alle Abwesenheiten bis zu dem Jahr raussuchen, für das man das Urlaubskonto berechnen will
List<AbsenceTimeDC> absences = new List<AbsenceTimeDC>();
var absences = new List<AbsenceTimeDC>();
// Abwesenheiten nur auf Urlaube filtern
if (emp.AbsenceTimes != null && emp.AbsenceTimes.Count > 0)
@@ -1074,12 +1096,12 @@ namespace BeWo.Service.Plugins
int? workdays = 0;
List<ArbeitszeitDC> arbeitszeiten = new List<ArbeitszeitDC>();
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
Dictionary<Contract, int> contractsAndWeeklyDays = new Dictionary<Contract, int>();
// Jahresurlaubanspruch berechnen (noch kein Resturlaub Vorjahr in dieser Schleife, nur Jahresanspruch + Sonderfall Vertragsstart oder -ende mitten im Jahr)
foreach (var contract in emp.Contracts)
{
contractsAndWeeklyDays.Add(MapperFactory.ContractDC_Contract.MapToNewDC(contract), contract.WeeklyDays.HasValue ? contract.WeeklyDays.Value : 0);
contractsAndWeeklyDays.Add(contract, contract.WeeklyDays.HasValue ? contract.WeeklyDays.Value : 0);
var start = contract.EntryDate?.Year ?? firstYear;
var end = contract.ContractEndDate?.Year ?? year;
@@ -1164,7 +1186,7 @@ namespace BeWo.Service.Plugins
absencesYear = absencesYear.OrderBy(x => x.Item1).ToList();
Dictionary<int, decimal> zuVerfallZuAddieren = new Dictionary<int, decimal>();
var geschenkteUrlaubstage = empService.GetGeschenkteUrlaubstageForEmployee((long)emp.Oid);
var geschenkteUrlaubstage = GetGeschenkteUrlaubstageForEmployee((long)emp.Oid);
// Alle Abwesenheiten durchlaufen, deren Dauer berechnen und vom Resturlaub + Geschenkte Tage Vorjahr abziehen, sofern es nicht nutzbaren Resturlaub vom Vorjahr gibt
// Tuple = Key-Value-Paar
@@ -1224,7 +1246,7 @@ namespace BeWo.Service.Plugins
if (absence.Start.HasValue && absence.Start.Value.Year < absYear)
absence.Start = new DateTime(absYear, 01, 01);
dauer = CountAbwesenheitstage(MapperFactory.EmployeeDC_Employee.MapToNewDC(emp), absence, absYear, contractsAndWeeklyDays);
dauer = CountAbwesenheitstage(emp, absence, absYear, contractsAndWeeklyDays);
//dauer = BerechneAnzahlUrlaubstage(absence, null, absYear, workdays); // HIER MÜSSEN PARAMETER FÜR ISTWOCHENENDE() MITGEGEBEN WERDEN
@@ -1245,7 +1267,7 @@ namespace BeWo.Service.Plugins
// dauer und dauerVorjahr per Definition ueberein. (Behebt zugleich das falsche, ans Zieljahr gebundene workdays.)
var originalEnd = absence.End;
absence.End = firstEnd;
var dauerVorjahr = CountAbwesenheitstage(MapperFactory.EmployeeDC_Employee.MapToNewDC(emp), absence, absYear, contractsAndWeeklyDays);
var dauerVorjahr = CountAbwesenheitstage(emp, absence, absYear, contractsAndWeeklyDays);
absence.End = originalEnd;
var bucheVorjahr = Math.Min(current.ResturlaubVorjahr, dauerVorjahr);
@@ -1321,6 +1343,61 @@ namespace BeWo.Service.Plugins
}
}
public virtual IList<GeschenkterUrlaubstag> GetGeschenkteUrlaubstageForEmployee(long oid)
{
if (AllGeschenkteUrlaubstage == null)
{
AllGeschenkteUrlaubstage = DAOFactory.GenericDAO.GetAllActive<GeschenkterUrlaubstag>();
}
return AllGeschenkteUrlaubstage.Where(u => u.Employee == oid).ToList();
}
public virtual Dictionary<string, decimal> GetSonderurlaubForEmployee(Employee employee, int berechnungsjahr)
{
Dictionary<string, decimal> sonderurlaub = new Dictionary<string, decimal>();
Contract contract = null;
foreach (var c in employee.Contracts)
{
if (c.EntryDate.HasValue && !c.ContractEndDate.HasValue || c.EntryDate.HasValue && c.ContractEndDate.HasValue &&
berechnungsjahr >= c.EntryDate.Value.Year && berechnungsjahr <= c.ContractEndDate.Value.Year)
{
contract = c;
break;
}
}
// Wenn eine Behinderung von mind. 50 vorliegt stehen standardmäßig 5 Sonderurlaubstage zu
if (contract != null && (contract.EntryDate.HasValue && contract.ContractEndDate.HasValue || contract.EntryDate.HasValue && !contract.ContractEndDate.HasValue))
{
var yearStart = new DateTime(berechnungsjahr, 1, 1);
var yearEnd = new DateTime(berechnungsjahr, 12, 31);
// Schnittmenge aus Vertrag + Ausweis
var overlapStart = contract.EntryDate > employee.AusweisGueltigVon ? contract.EntryDate : employee.AusweisGueltigVon;
var overlapEnd = (contract.ContractEndDate ?? DateTime.MaxValue) < (employee.AusweisGueltigBis ?? DateTime.MaxValue) ? (contract.ContractEndDate ?? DateTime.MaxValue) : (employee.AusweisGueltigBis ?? DateTime.MaxValue);
// Jetzt prüfen: gibt es davon etwas im Jahr?
if (overlapStart <= overlapEnd && overlapStart <= yearEnd && overlapEnd >= yearStart)
{
if (employee.GradDerBehinderung.IsNotNullOrEmpty())
{
int.TryParse(employee.GradDerBehinderung, out int grad);
if (grad >= 50)
{
// TODO Anteilig berechnen, (wenn Behinderung erst im Berechnungsjahr beginnt nur die "aktiven" Monate anrechnen und ab
// Wenn keine Anzahl der wöchentlichen Arbeitstage gesetzt ist, 5 Tage
// Sonst Anzahl der wöchentlichen Arbeitstage (gesdetzlich so geregelt)
sonderurlaub.Add("Sonderurlaub aufgrund von Behinderungsgrad über 50", 5);
}
}
}
}
return sonderurlaub;
}
public virtual DateTime GetFirstEnd(DateTime? end, DateTime expiration)
{
return (DateTime)DateTimeExtensions.GetMin(end, expiration);

View File

@@ -424,6 +424,7 @@
<Compile Include="DCEntityMapper\ValueListEntryDC_ValueListEntry.cs" />
<Compile Include="DCEntityMapper\VarFieldDC_VarFieldDefMapper.cs" />
<Compile Include="Dienstplanung\DienstplanungsManager.cs" />
<Compile Include="Dienstplanung\StundenkontoServiceRecord.cs" />
<Compile Include="Dienstplanung\MitarbeiterstundenkontoBerechnung.cs" />
<Compile Include="Dienstplanung\Mitarbeiterstundenkonto.cs" />
<Compile Include="Dokumentverwaltung\WohnheimPlaceholderManager.cs" />

View File

@@ -1923,7 +1923,7 @@ namespace BeWo.Service.ServiceImplementations
{
try
{
UrlaubsplanungsManager manager = new UrlaubsplanungsManager();
var manager = PluginLoader.FindClass<UrlaubsplanungsManager>();
return manager.BuildUrlaubsplanerRootObject(filter);
}
catch (Exception exception)
@@ -2074,57 +2074,59 @@ namespace BeWo.Service.ServiceImplementations
}
public virtual Dictionary<string, decimal> GetSonderurlaubForEmployee(long empOid, int berechnungsjahr)
{
Dictionary<string, decimal> sonderurlaub = new Dictionary<string, decimal>();
try
{
var emp = DAOFactory.GenericDAO.GetByID<Employee>(empOid);
Contract contract = null;
foreach (var c in emp.Contracts)
{
if (c.EntryDate.HasValue && !c.ContractEndDate.HasValue || c.EntryDate.HasValue && c.ContractEndDate.HasValue &&
berechnungsjahr >= c.EntryDate.Value.Year && berechnungsjahr <= c.ContractEndDate.Value.Year)
{
contract = c;
break;
}
}
// Wenn eine Behinderung von mind. 50 vorliegt stehen standardmäßig 5 Sonderurlaubstage zu
if (contract != null && (contract.EntryDate.HasValue && contract.ContractEndDate.HasValue || contract.EntryDate.HasValue && !contract.ContractEndDate.HasValue))
{
var yearStart = new DateTime(berechnungsjahr, 1, 1);
var yearEnd = new DateTime(berechnungsjahr, 12, 31);
//Wird im Client nicht benutzt, daher in den VacationService ausgelagert
throw new NotSupportedException();
//Dictionary<string, decimal> sonderurlaub = new Dictionary<string, decimal>();
//try
//{
// var emp = DAOFactory.GenericDAO.GetByID<Employee>(empOid);
// Contract contract = null;
// foreach (var c in emp.Contracts)
// {
// if (c.EntryDate.HasValue && !c.ContractEndDate.HasValue || c.EntryDate.HasValue && c.ContractEndDate.HasValue &&
// berechnungsjahr >= c.EntryDate.Value.Year && berechnungsjahr <= c.ContractEndDate.Value.Year)
// {
// contract = c;
// break;
// }
// }
// // Wenn eine Behinderung von mind. 50 vorliegt stehen standardmäßig 5 Sonderurlaubstage zu
// if (contract != null && (contract.EntryDate.HasValue && contract.ContractEndDate.HasValue || contract.EntryDate.HasValue && !contract.ContractEndDate.HasValue))
// {
// var yearStart = new DateTime(berechnungsjahr, 1, 1);
// var yearEnd = new DateTime(berechnungsjahr, 12, 31);
// Schnittmenge aus Vertrag + Ausweis
var overlapStart = contract.EntryDate > emp.AusweisGueltigVon ? contract.EntryDate : emp.AusweisGueltigVon;
var overlapEnd = (contract.ContractEndDate ?? DateTime.MaxValue) < (emp.AusweisGueltigBis ?? DateTime.MaxValue) ? (contract.ContractEndDate ?? DateTime.MaxValue) : (emp.AusweisGueltigBis ?? DateTime.MaxValue);
// // Schnittmenge aus Vertrag + Ausweis
// var overlapStart = contract.EntryDate > emp.AusweisGueltigVon ? contract.EntryDate : emp.AusweisGueltigVon;
// var overlapEnd = (contract.ContractEndDate ?? DateTime.MaxValue) < (emp.AusweisGueltigBis ?? DateTime.MaxValue) ? (contract.ContractEndDate ?? DateTime.MaxValue) : (emp.AusweisGueltigBis ?? DateTime.MaxValue);
// Jetzt prüfen: gibt es davon etwas im Jahr?
if (overlapStart <= overlapEnd && overlapStart <= yearEnd && overlapEnd >= yearStart)
{
if (emp.GradDerBehinderung.IsNotNullOrEmpty())
{
int.TryParse(emp.GradDerBehinderung, out int grad);
if (grad >= 50)
{
// TODO Anteilig berechnen, (wenn Behinderung erst im Berechnungsjahr beginnt nur die "aktiven" Monate anrechnen und ab
// // Jetzt prüfen: gibt es davon etwas im Jahr?
// if (overlapStart <= overlapEnd && overlapStart <= yearEnd && overlapEnd >= yearStart)
// {
// if (emp.GradDerBehinderung.IsNotNullOrEmpty())
// {
// int.TryParse(emp.GradDerBehinderung, out int grad);
// if (grad >= 50)
// {
// // TODO Anteilig berechnen, (wenn Behinderung erst im Berechnungsjahr beginnt nur die "aktiven" Monate anrechnen und ab
// Wenn keine Anzahl der wöchentlichen Arbeitstage gesetzt ist, 5 Tage
// Sonst Anzahl der wöchentlichen Arbeitstage (gesdetzlich so geregelt)
sonderurlaub.Add("Sonderurlaub aufgrund von Behinderungsgrad über 50", 5);
}
}
}
}
// // Wenn keine Anzahl der wöchentlichen Arbeitstage gesetzt ist, 5 Tage
// // Sonst Anzahl der wöchentlichen Arbeitstage (gesdetzlich so geregelt)
// sonderurlaub.Add("Sonderurlaub aufgrund von Behinderungsgrad über 50", 5);
// }
// }
// }
// }
return sonderurlaub;
// return sonderurlaub;
}
catch (Exception ex)
{
throw Utils.CreateBeWoFaultException(ex);
}
//}
//catch (Exception ex)
//{
// throw Utils.CreateBeWoFaultException(ex);
//}
return sonderurlaub;
//return sonderurlaub;
}
public List<AbwesenheitsInformationPrintDC> InsertAbwesenheitsInformationPrint(List<AbwesenheitsInformationPrintDC> abwesenheitsInformationPrints)
{
@@ -2184,7 +2186,8 @@ namespace BeWo.Service.ServiceImplementations
try
{
var vs = PluginLoader.FindClass<VacationService>();
return vs.BerechneUrlaubskontoZurDarstellung(emp, year);
var entity = DAOFactory.GenericDAO.LoadByID<Employee>(emp.EmployeeOid.Value);
return vs.BerechneUrlaubskontoZurDarstellung(entity, year);
}
catch (Exception ex)
{
@@ -2208,7 +2211,8 @@ namespace BeWo.Service.ServiceImplementations
try
{
var manager = new UrlaubsplanungsManager();
return manager.CountKrankheitstage(infoDC);
manager.BerechneUrlaubsUndKrankheitstage(infoDC, null);
return infoDC.TageKrankheit;
}
catch (Exception ex)
{
@@ -2220,7 +2224,8 @@ namespace BeWo.Service.ServiceImplementations
try
{
var manager = new UrlaubsplanungsManager();
return manager.CountUrlaubstage(infoDC);
manager.BerechneUrlaubsUndKrankheitstage(infoDC, null);
return infoDC.TageUrlaub;
}
catch (Exception ex)
{
@@ -2232,69 +2237,9 @@ namespace BeWo.Service.ServiceImplementations
{
try
{
var res = new List<EmployeeDC>();
var vs = PluginLoader.FindClass<VacationService>();
var manager = PluginLoader.FindClass<UrlaubsplanungsManager>();
var allEmployees = DAOFactory.GenericDAO.GetAllActive<Employee>().ToList();
List<Team> teams = new List<Team>();
if (filter.Teams != null)
teams = DAOFactory.GenericDAO.GetActiveByIDs<Team>(filter.Teams) as List<Team>;
//foreach (var emp in allEmployees.OrderBy(x => x.Person.LastNameFirstName))
List<Employee> benoetigteMitarbeiter = new List<Employee>();
if (teams.Count == 0)
benoetigteMitarbeiter = allEmployees;
else
{
foreach (var team in teams)
{
benoetigteMitarbeiter.AddRange(team.MemberList);
}
}
benoetigteMitarbeiter.OrderBy(x => x.Person.LastNameFirstName).ToList();
foreach (var emp in benoetigteMitarbeiter)
{
if (filter.EmploymentType != null)
if (!emp.Contracts.Any(x => x.EmploymentType != null && filter.EmploymentType.Contains(x.EmploymentType.Oid.Value)))
continue;
if (res.Any(e => e.EmployeeOid == emp.Oid))
continue;
var dict = vs.BerechneUrlaubskonto(emp, filter.Year);
if (filter.AbsenceReasons != null)
emp.AbsenceTimes.RemoveRange(x => !filter.AbsenceReasons.Contains(x.AbsenceReason.Oid.Value));
//if (filter.Teams != null)
//{
// bool isInTeam = false;
// foreach (var team in teams)
// {
// if (team.MemberList.Contains(emp))
// isInTeam = true;
// }
// if (!isInTeam)
// continue;
//}
var empDC = MapperFactory.EmployeeDC_Employee.MapToNewDC(emp);
if (dict.ContainsKey(filter.Year))
{
empDC.Urlaubskonto = dict[filter.Year];
}
else
{
int test = 0;
}
res.Add(empDC);
}
return res.OrderBy(e => e.LastNameFirstName).ToList();
return manager.GetAbsenceOverview(filter);
}
catch (Exception exception)
{

View File

@@ -7296,8 +7296,6 @@ namespace BeWo.Service.ServiceImplementations
try
{
var vs = PluginLoader.FindClass<VacationService>();
var ber = PluginLoader.FindClass<MitarbeiterstundenkontoBerechnung>();
var altList = ber.GetFeiertage(year);
var list = vs.GetFeiertage(year, vs.Bundesland);
return list;
@@ -7486,77 +7484,78 @@ namespace BeWo.Service.ServiceImplementations
}
}
public List<EmployeeDC> GetAbsenceOverview(AbsenceOverviewFilterDC filter)
{
try
{
var res = new List<EmployeeDC>();
var vs = PluginLoader.FindClass<VacationService>();
//CB, 14.07.2026 Ist doppelt im EmployeeServiceImp vorhanden
//public List<EmployeeDC> GetAbsenceOverview(AbsenceOverviewFilterDC filter)
//{
// try
// {
// var res = new List<EmployeeDC>();
// var vs = PluginLoader.FindClass<VacationService>();
var allEmployees = DAOFactory.GenericDAO.GetAllActive<Employee>().ToList();
// var allEmployees = DAOFactory.GenericDAO.GetAllActive<Employee>().ToList();
List<Team> teams = new List<Team>();
if (filter.Teams != null)
teams = DAOFactory.GenericDAO.GetActiveByIDs<Team>(filter.Teams) as List<Team>;
// List<Team> teams = new List<Team>();
// if (filter.Teams != null)
// teams = DAOFactory.GenericDAO.GetActiveByIDs<Team>(filter.Teams) as List<Team>;
//foreach (var emp in allEmployees.OrderBy(x => x.Person.LastNameFirstName))
List<Employee> benoetigteMitarbeiter = new List<Employee>();
if (teams.Count == 0)
benoetigteMitarbeiter = allEmployees;
else
{
foreach (var team in teams)
{
benoetigteMitarbeiter.AddRange(team.MemberList);
}
}
benoetigteMitarbeiter.OrderBy(x => x.Person.LastNameFirstName).ToList();
// //foreach (var emp in allEmployees.OrderBy(x => x.Person.LastNameFirstName))
// List<Employee> benoetigteMitarbeiter = new List<Employee>();
// if (teams.Count == 0)
// benoetigteMitarbeiter = allEmployees;
// else
// {
// foreach (var team in teams)
// {
// benoetigteMitarbeiter.AddRange(team.MemberList);
// }
// }
// benoetigteMitarbeiter.OrderBy(x => x.Person.LastNameFirstName).ToList();
foreach (var emp in benoetigteMitarbeiter)
{
if (filter.EmploymentType != null)
if (!emp.Contracts.Any(x => x.EmploymentType != null && filter.EmploymentType.Contains(x.EmploymentType.Oid.Value)))
continue;
// foreach (var emp in benoetigteMitarbeiter)
// {
// if (filter.EmploymentType != null)
// if (!emp.Contracts.Any(x => x.EmploymentType != null && filter.EmploymentType.Contains(x.EmploymentType.Oid.Value)))
// continue;
var dict = vs.BerechneUrlaubskonto(emp, filter.Year);
// var dict = vs.BerechneUrlaubskonto(emp, filter.Year);
if (filter.AbsenceReasons != null)
emp.AbsenceTimes.RemoveRange(x => !filter.AbsenceReasons.Contains(x.AbsenceReason.Oid.Value));
// if (filter.AbsenceReasons != null)
// emp.AbsenceTimes.RemoveRange(x => !filter.AbsenceReasons.Contains(x.AbsenceReason.Oid.Value));
//if (filter.Teams != null)
//{
// bool isInTeam = false;
// foreach (var team in teams)
// {
// if (team.MemberList.Contains(emp))
// isInTeam = true;
// }
// if (!isInTeam)
// continue;
//}
// //if (filter.Teams != null)
// //{
// // bool isInTeam = false;
// // foreach (var team in teams)
// // {
// // if (team.MemberList.Contains(emp))
// // isInTeam = true;
// // }
// // if (!isInTeam)
// // continue;
// //}
var empDC = MapperFactory.EmployeeDC_Employee.MapToNewDC(emp);
if (dict.ContainsKey(filter.Year))
{
empDC.Urlaubskonto = dict[filter.Year];
}
else
{
int test = 0;
}
// var empDC = MapperFactory.EmployeeDC_Employee.MapToNewDC(emp);
// if (dict.ContainsKey(filter.Year))
// {
// empDC.Urlaubskonto = dict[filter.Year];
// }
// else
// {
// int test = 0;
// }
res.Add(empDC);
}
// res.Add(empDC);
// }
return res.OrderBy(e => e.LastNameFirstName).ToList();
}
catch (Exception exception)
{
throw Utils.CreateBeWoFaultException(exception);
}
}
// return res.OrderBy(e => e.LastNameFirstName).ToList();
// }
// catch (Exception exception)
// {
// throw Utils.CreateBeWoFaultException(exception);
// }
//}
public List<CompactTeamDC> GetCertainTeamsById(List<long> oids)
{
var teams = DAOFactory.GenericDAO.GetActiveByIDs<Team>(oids);
@@ -8518,36 +8517,36 @@ namespace BeWo.Service.ServiceImplementations
}
}
public UrlaubsplanerRootDC BuildUrlaubsplanerRootObject(AbsenceOverviewFilterDC filter)
{
UrlaubsplanerRootDC root = new UrlaubsplanerRootDC();
var empService = new EmployeeServiceImp();
//public UrlaubsplanerRootDC BuildUrlaubsplanerRootObject(AbsenceOverviewFilterDC filter)
//{
// UrlaubsplanerRootDC root = new UrlaubsplanerRootDC();
// var empService = new EmployeeServiceImp();
root.Feiertage = GetDefaultFeiertageForYear(filter.Year).Where(f => f.Datum.Month == filter.Month).ToList();
root.Abwesenheiten = empService.GetAllEmployeeAbsenceTimesForMonth(filter.Year, filter.Month);
root.GeschenkteUrlaubstage = empService.GetGeschenkteUrlaubstageForYear(filter.Year);
// root.Feiertage = GetDefaultFeiertageForYear(filter.Year).Where(f => f.Datum.Month == filter.Month).ToList();
// root.Abwesenheiten = empService.GetAllEmployeeAbsenceTimesForMonth(filter.Year, filter.Month);
// root.GeschenkteUrlaubstage = empService.GetGeschenkteUrlaubstageForYear(filter.Year);
var DCsToDelete = empService.GetAllAbwesenheitsInformationPrints();
empService.DeleteAbwesenheitsInformationPrints(DCsToDelete);
// var DCsToDelete = empService.GetAllAbwesenheitsInformationPrints();
// empService.DeleteAbwesenheitsInformationPrints(DCsToDelete);
//root.AlleAbwesenheitsInformationDCs = new List<AbwesenheitsInformationDC>();
// //root.AlleAbwesenheitsInformationDCs = new List<AbwesenheitsInformationDC>();
//var employee = GetAbsenceOverview(filter);
// //var employee = GetAbsenceOverview(filter);
//foreach (var emp in employee)
//{
// root.AlleAbwesenheitsInformationDCs.Add(new AbwesenheitsInformationDC()
// {
// Employee = emp,
// Month = filter.Month,
// Year = filter.Year,
// AbsenceTimes = root.Abwesenheiten.Where(a => a.EmployeeOid == emp.EmployeeOid).ToList(),
// GeschenkteUrlaubstage = root.GeschenkteUrlaubstage.Where(u => u.Employee == emp.EmployeeOid).ToList()
// });
//}
// //foreach (var emp in employee)
// //{
// // root.AlleAbwesenheitsInformationDCs.Add(new AbwesenheitsInformationDC()
// // {
// // Employee = emp,
// // Month = filter.Month,
// // Year = filter.Year,
// // AbsenceTimes = root.Abwesenheiten.Where(a => a.EmployeeOid == emp.EmployeeOid).ToList(),
// // GeschenkteUrlaubstage = root.GeschenkteUrlaubstage.Where(u => u.Employee == emp.EmployeeOid).ToList()
// // });
// //}
return root;
}
// return root;
//}
public string GetInformationStringForUrlaubsplaner(UrlaubskontoDC dc, decimal tageUrlaub, decimal tageKrank, bool urlaubVerfallen)
{

View File

@@ -5,6 +5,10 @@ using BeWo.Service.DCEntityMapper;
using BeWo.Service.Plugins;
using BeWo.Service.ServiceImplementations;
using BS.Shared.DataContracts;
using BS.Shared.Extensions;
using DevExpress.Pdf.Native;
using DevExpress.Utils.About;
using DevExpress.XtraPrinting;
using System;
using System.Collections.Generic;
using System.Linq;
@@ -13,17 +17,32 @@ using System.Threading.Tasks;
namespace BeWo.Service.Urlaubsplanung
{
class UrlaubsplanungsManager
public class UrlaubsplanungsManager
{
private VacationService vacationService;
public VacationService VacationService
{
get
{
if (vacationService == null)
{
vacationService = PluginLoader.FindClass<VacationService>();
}
return vacationService;
}
}
public UrlaubsplanerRootDC BuildUrlaubsplanerRootObject(AbsenceOverviewFilterDC filter)
{
var sw = System.Diagnostics.Stopwatch.StartNew();
UrlaubsplanerRootDC root = new UrlaubsplanerRootDC();
VacationService vs = PluginLoader.FindClass<VacationService>();
var empService = new EmployeeServiceImp();
var feiertagDaten = vs.GetFeiertage(filter.Year).Where(f => f.Month == filter.Month).ToList();
var feiertagDaten = VacationService.GetFeiertage(filter.Year).Where(f => f.Month == filter.Month).ToList();
root.Feiertage = new List<FeiertagDC>();
foreach (var datum in feiertagDaten)
root.Feiertage.Add(vs.GetFeiertag(datum));
root.Feiertage.Add(VacationService.GetFeiertag(datum));
root.Abwesenheiten = GetAllEmployeeAbsenceTimesForMonth(filter.Year, filter.Month);
@@ -32,11 +51,10 @@ namespace BeWo.Service.Urlaubsplanung
var DCsToDelete = GetAllAbwesenheitsInformationPrints();
DeleteAbwesenheitsInformationPrints(DCsToDelete);
#region auskommentiert
root.AlleAbwesenheitsInformationDCs = new List<AbwesenheitsInformationDC>();
var es = PluginLoader.FindClass<EmployeeServiceImp>();
var employee = es.GetAbsenceOverview(filter);
var employee = GetAllFilteredEmployees(filter);
foreach (var emp in employee)
{
@@ -44,37 +62,116 @@ namespace BeWo.Service.Urlaubsplanung
var infoDC = new AbwesenheitsInformationDC()
{
Employee = emp,
Employee = ErstelleCompactEmployeeDC(emp, filter),
Month = filter.Month,
Year = filter.Year,
AbsenceTimes = root.Abwesenheiten.Where(a => a.EmployeeOid == emp.EmployeeOid).ToList(),
GeschenkteUrlaubstage = root.GeschenkteUrlaubstage.Where(u => u.Employee == emp.EmployeeOid).ToList()
AbsenceTimes = root.Abwesenheiten.Where(a => a.EmployeeOid == emp.Oid).ToList(),
GeschenkteUrlaubstage = root.GeschenkteUrlaubstage.Where(u => u.Employee == emp.Oid).ToList()
};
infoDC.TageUrlaub = CountUrlaubstage(infoDC);
infoDC.TageKrankheit = CountKrankheitstage(infoDC);
BerechneUrlaubsUndKrankheitstage(infoDC, emp);
root.AlleAbwesenheitsInformationDCs.Add(infoDC);
}
#endregion
sw.Stop();
Console.WriteLine(sw.Elapsed.TotalMilliseconds);
return root;
}
public decimal CountUrlaubstage(AbwesenheitsInformationDC info)
private EmployeeDC ErstelleCompactEmployeeDC(Employee emp, AbsenceOverviewFilterDC filter)
{
var dc = new EmployeeDC();
dc.FirstName = emp.Person.FirstName;
dc.LastName = emp.Person.LastName;
dc.EmployeeOid = emp.Oid;
dc.PersonOid = emp.Person.Oid;
dc.Type = BS.Shared.PersonType.Employee;
var dict = VacationService.BerechneUrlaubskonto(emp, filter.Year);
dc.AbsenceTimes = MapperFactory.AbsenceTimeDC_AbsenceTime.MapToNewDCs(emp.AbsenceTimes);
if (filter.AbsenceReasons != null)
dc.AbsenceTimes.RemoveRange(x => !filter.AbsenceReasons.Contains(x.Reason.AbsenceReasonOid.Value));
if (dict.ContainsKey(filter.Year))
{
dc.Urlaubskonto = dict[filter.Year];
}
return dc;
}
public List<EmployeeDC> GetAbsenceOverview(AbsenceOverviewFilterDC filter)
{
var res = new List<EmployeeDC>();
var employees = GetAllFilteredEmployees(filter);
foreach (var emp in employees)
{
res.Add(ErstelleCompactEmployeeDC(emp, filter));
}
return res.OrderBy(e => e.LastNameFirstName).ToList();
}
public List<Employee> GetAllFilteredEmployees(AbsenceOverviewFilterDC filter)
{
var res = new List<Employee>();
var allEmployees = DAOFactory.GenericDAO.GetAllActive<Employee>().ToList();
List<Team> teams = new List<Team>();
if (filter.Teams != null)
teams = DAOFactory.GenericDAO.GetActiveByIDs<Team>(filter.Teams) as List<Team>;
List<Employee> benoetigteMitarbeiter = new List<Employee>();
if (teams.Count == 0)
benoetigteMitarbeiter = allEmployees;
else
{
foreach (var team in teams)
{
benoetigteMitarbeiter.AddRange(team.MemberList);
benoetigteMitarbeiter.Add(team.Leader);
}
}
benoetigteMitarbeiter.OrderBy(x => x.Person.LastNameFirstName).ToList();
foreach (var emp in benoetigteMitarbeiter)
{
if (filter.EmploymentType != null)
if (!emp.Contracts.Any(x => x.EmploymentType != null && filter.EmploymentType.Contains(x.EmploymentType.Oid.Value)))
continue;
if (res.Any(e => e.Oid == emp.Oid))
continue;
res.Add(emp);
}
return res.OrderBy(e => e.Person.LastNameFirstName).ToList();
}
public void BerechneUrlaubsUndKrankheitstage(AbwesenheitsInformationDC info, Employee employee)
{
decimal tageUrlaub = 0;
decimal tageKrankheit = 0;
VacationService vs = PluginLoader.FindClass<VacationService>();
if (employee == null)
{
employee = DAOFactory.GenericDAO.LoadByID<Employee>(info.Employee.EmployeeOid.Value);
}
// Urlaube setzen so wie im Urlaubskonto
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
Dictionary<Contract, int> contractsAndWeeklyDays = new Dictionary<Contract, int>();
// Vertrag für Jahr raussuchen
foreach (var c in info.Employee.Contracts)
foreach (var c in employee.Contracts)
{
DateTime contractEndDate = new DateTime();
if (c.ContractEndDate == null)
contractEndDate = new DateTime(2099, 12, 31);
contractEndDate = new DateTime(DateTime.Now.Year + 10, 12, 31);
else
contractEndDate = c.ContractEndDate.Value;
@@ -86,62 +183,32 @@ namespace BeWo.Service.Urlaubsplanung
if (info.Year >= contractStartDate.Year && info.Year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt
{
contractsAndWeeklyDays.Add(c, c.WeeklyDays);
contractsAndWeeklyDays.Add(c, c.WeeklyDays ?? 5);
}
}
// Urlaubstage im Zeitraum zählen
var urlaubAbsences = vs.GetAllVacationAbsences(info.AbsenceTimes, info.Year, true);
var urlaubAbsences = VacationService.GetAllVacationAbsences(info.AbsenceTimes, info.Year, true);
// Krankheitstage im Zeitraum zählen
var sickAbsences = VacationService.GetAllSickAbsences(info.AbsenceTimes, info.Year, true);
foreach (var abs in urlaubAbsences)
{
tageUrlaub += vs.CountAbwesenheitstage(info.Employee, abs, info.Year, contractsAndWeeklyDays);
tageUrlaub += VacationService.CountAbwesenheitstage(employee, abs, info.Year, contractsAndWeeklyDays);
}
return tageUrlaub;
}
public decimal CountKrankheitstage(AbwesenheitsInformationDC info)
{
decimal tageKrankheit = 0;
VacationService vs = PluginLoader.FindClass<VacationService>();
// Krankheiten setzen so wie Urlaube im Urlaubskonto
Dictionary<ContractDC, int> contractsAndWeeklyDays = new Dictionary<ContractDC, int>();
// Vertrag für Jahr raussuchen
foreach (var c in info.Employee.Contracts)
{
DateTime contractEndDate = new DateTime();
if (c.ContractEndDate == null)
contractEndDate = new DateTime(2099, 12, 31);
else
contractEndDate = c.ContractEndDate.Value;
DateTime contractStartDate = new DateTime();
if (c.EntryDate == null)
contractStartDate = new DateTime(info.Year, 01, 01);
else
contractStartDate = c.EntryDate.Value;
if (info.Year >= contractStartDate.Year && info.Year <= contractEndDate.Year) // Wenn das ausgewählte Jahr zwischen Vertragsbeginn und -ende liegt
{
contractsAndWeeklyDays.Add(c, c.WeeklyDays);
}
}
// Krankheitstage im Zeitraum zählen
var sickAbsences = vs.GetAllSickAbsences(info.AbsenceTimes, info.Year, true);
foreach (var abs in sickAbsences)
{
// CountAbwesenheitstage zählt nur eine Liste an Abwesenheiten, also kann hier auch auf Krankheiten gefiltert und diese
// Liste übergeben werden. Es werden dann nach den selben Regeln die Krankheiten gezählt.
tageKrankheit += vs.CountAbwesenheitstage(info.Employee, abs, info.Year, contractsAndWeeklyDays);
tageKrankheit += VacationService.CountAbwesenheitstage(employee, abs, info.Year, contractsAndWeeklyDays);
}
return tageKrankheit;
info.TageUrlaub = tageUrlaub;
info.TageKrankheit = tageKrankheit;
}
public List<AbsenceTimeDC> GetAllEmployeeAbsenceTimesForMonth(int year, int month)
{
try
@@ -207,8 +274,7 @@ namespace BeWo.Service.Urlaubsplanung
private List<DateTime> GetArbeitsfreieTage(AbwesenheitsInformationDC info)
{
VacationService vs = PluginLoader.FindClass<VacationService>();
var feiertage = vs.GetFeiertage(info.Year);
var feiertage = VacationService.GetFeiertage(info.Year);
List<DateTime> wochenendtage = new List<DateTime>();
for (int i = 1; i <= DateTime.DaysInMonth(info.Year, info.Month); i++)