diff --git a/BeWo/BeWo.csproj b/BeWo/BeWo.csproj index 84087528f..854da3dc2 100644 --- a/BeWo/BeWo.csproj +++ b/BeWo/BeWo.csproj @@ -43,12 +43,12 @@ de-DE BeWoPlaner ownSoft GmbH - 2.0.1.298 + 2.0.1.299 true publish.htm false true - 299 + 300 2.0.1.%2a false true diff --git a/BeWo/View/Detail/Report/AbwesenheitsView.xaml.cs b/BeWo/View/Detail/Report/AbwesenheitsView.xaml.cs index a7ac71d0b..fff4fd6d4 100644 --- a/BeWo/View/Detail/Report/AbwesenheitsView.xaml.cs +++ b/BeWo/View/Detail/Report/AbwesenheitsView.xaml.cs @@ -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 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(); 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 diff --git a/BeWo/View/Detail/UrlaubskontoView.xaml.cs b/BeWo/View/Detail/UrlaubskontoView.xaml.cs index b0193d78b..4e70a7d04 100755 --- a/BeWo/View/Detail/UrlaubskontoView.xaml.cs +++ b/BeWo/View/Detail/UrlaubskontoView.xaml.cs @@ -71,7 +71,7 @@ namespace BeWo.View.Detail urlaubskonto = new List(); 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; } diff --git a/Host/ReportView.aspx.cs b/Host/ReportView.aspx.cs index 073f4443b..500022f1a 100644 --- a/Host/ReportView.aspx.cs +++ b/Host/ReportView.aspx.cs @@ -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") { diff --git a/Report/DefaultReportCreator.cs b/Report/DefaultReportCreator.cs index fb21bde87..f0211b5ad 100644 --- a/Report/DefaultReportCreator.cs +++ b/Report/DefaultReportCreator.cs @@ -1369,17 +1369,18 @@ namespace BeWo.Report public override XtraReport CreateAbsenceReport(DateTime dt, List abs, List empTypes, List teams, List feiertage) { var report = FindReportImp(); - 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 compactTeams = new List(); 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; } diff --git a/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs b/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs index 583ef64c9..03af4d755 100644 --- a/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs +++ b/Report/ReportObjects/MitarbeiterstundenkontoBerechnung.cs @@ -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 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(); + summaryTotal.RecordsImBerichtszeitraum = new List(); decimal pause1 = 0; decimal pause2 = 0; @@ -169,14 +176,14 @@ namespace BeWo.Report.ReportObjects decimal tatSollStdGesamt = 0; decimal azDurchFeiertage = 0; - IList groupFilteredRecords = empDetail.AllServiceRecords; + IList groupFilteredRecords = empDetail.AllServiceRecords; if (groupFilteredRecords == null) { - IList recordsAll = DAOFactory.SearchDAO.FindServiceRecords(emp.Oid, null); - recordsAll = AnalysisServiceImp.FilterActiveServiceRecords(recordsAll); - - // - groupFilteredRecords = new List(); + Debug.WriteLine($"Hole ServiceRecords with EmpOid: {emp.Oid}"); + IList recordsAll = ro.AllServiceRecords.Where(s => s.EmployeeOid.HasValue && s.EmployeeOid == emp.Oid).ToList(); + //IList recordsAll = new List(); + + groupFilteredRecords = new List(); Dictionary groupBookingDict = new Dictionary(); 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().Where(d => d.EmployeeOid == empDetail.Employee.Oid).ToList(); - var alleDienstvertretungen = DAOFactory.GenericDAO.GetAllActive().Where(d => d.EmployeeOid == empDetail.Employee.Oid).ToList(); + //var alleDiensteintraege = DAOFactory.GenericDAO.GetAllActive().Where(d => d.EmployeeOid == empDetail.Employee.Oid).ToList(); + //var alleDienstvertretungen = DAOFactory.GenericDAO.GetAllActive().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(); - // Darstellungsvariante, da das normale Urlaubskonto nur den Resturlaubsstand vom Ende des Jahres anzeigt. - var konto = vs.BerechneUrlaubskontoZurDarstellung(MapperFactory.EmployeeDC_Employee.MapToNewDC(emp), ro.ReportStartDate.Year, berichtsEnde.AddDays(-1)); + // Darstellungsvariante, da das normale Urlaubskonto nur den Resturlaubsstand vom Ende des Jahres anzeigt. + var konto = vacationService.BerechneUrlaubskontoZurDarstellung(emp, ro.ReportStartDate.Year, berichtsEnde.AddDays(-1)); if (konto != null && konto.Count > 0) { var alleVertraglichenBudgets = konto @@ -505,7 +511,7 @@ namespace BeWo.Report.ReportObjects .ToList(); empDetail.Resturlaub = alleVertraglichenBudgets.Sum(b => Convert.ToDecimal(b.AnzahlTage)); - + // Jeder Entry enthält den Zeitraum und die abzuziehenden Tage vom Gesamtbudget. foreach (var entry in konto) { @@ -520,7 +526,7 @@ namespace BeWo.Report.ReportObjects } } } - + CalculateEmployeeSalary(empDetail, berichtsAnfang, berichtsEnde); } @@ -766,7 +772,7 @@ namespace BeWo.Report.ReportObjects } - protected virtual AbsenceTimeHours GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, Contract c, IList groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde) + protected virtual AbsenceTimeHours GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, Contract c, IList 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 groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde) + protected virtual ServiceRecordSummary BerechneStunden(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde) { decimal flsGesamt = 0; decimal arbeitszeit = 0; var sum = new ServiceRecordSummary(); - sum.RecordsImBerichtszeitraum = new List(); + sum.RecordsImBerichtszeitraum = new List(); - empDetail.ServiceRecordsInSelectedTimeSpan = new List(); + empDetail.ServiceRecordsInSelectedTimeSpan = new List(); 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 recordsThisMonth) + public virtual decimal BerechneAutoPausen(IList recordsThisMonth) { return 0; } - public virtual decimal BerechnePauseMinuten(IList srList) + public virtual decimal BerechnePauseMinuten(IList srList) { decimal pausenZeit = 0; - List pausen = new List(); - List nichtpausen = new List(); + List pausen = new List(); + List nichtpausen = new List(); 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 groupFilteredRecords, Contract contract) + public virtual void HandleServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList groupFilteredRecords, Contract contract) { //do nothing } - public virtual void CorrectOverlappingTimes(IList serviceRecords) + public virtual void CorrectOverlappingTimes(IList serviceRecords) { - List oldRecords = new List(); + List oldRecords = new List(); 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 CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) + public virtual IList CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList 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(); + dd.ServiceRecords = new List(); 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 CreateDayDetailsForEachServiceRecord(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) + public virtual IList CreateDayDetailsForEachServiceRecord(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) { var details = new List(); 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(); + dd.ServiceRecords = new List(); 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 records, DateTime monat, out decimal? ueberstunden, out decimal alteExtraUeberstunden) + public virtual MitarbeiterstundenkontoRO.EmployeeDetail BerechneUeberstundenBis(MitarbeiterstundenkontoRO.EmployeeDetail edOrig, IList 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> srDict = CreateServiceRecordDictByDate(records); + Dictionary> 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 recordsThisMonth = new List(); + IList recordsThisMonth = new List(); 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> CreateServiceRecordDictByDate(IList records) + public virtual Dictionary> CreateServiceRecordDictByDate(IList records) { - var dict = new Dictionary>(); + var dict = new Dictionary>(); foreach (var item in records) { if (!IsServiceRecordFehlzeit(item)) { - if (item.Start.HasValue) - { - String key = String.Format("{0:yyyyMM}", item.Start.Value); + + String key = String.Format("{0:yyyyMM}", item.Start); - IList list; - if (!dict.ContainsKey(key)) - { - list = new List(); - dict.Add(key, list); - } - else - { - list = dict[key]; - } - list.Add(item); + IList list; + if (!dict.ContainsKey(key)) + { + list = new List(); + dict.Add(key, list); } + else + { + list = dict[key]; + } + list.Add(item); + } } return dict; } - public virtual decimal GetAdditionalHours(IList days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) + public virtual decimal GetAdditionalHours(IList days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) { decimal addHours = 0; @@ -3497,13 +3498,13 @@ namespace BeWo.Report.ReportObjects return GetAbsenceTimeDaysWithWorkWeeks(absenceTimes, start, end, ANZ_WOCHENTAGE); } - public virtual decimal? GetFehlzeiten(IList records, DateTime monat) + public virtual decimal? GetFehlzeiten(IList records, DateTime monat) { return GetFehlzeiten(records, monat, monat.AddMonths(1)); } - public virtual decimal? GetFehlzeiten(IList records, DateTime start, DateTime ende) + public virtual decimal? GetFehlzeiten(IList 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 RecordsImBerichtszeitraum { get; set; } + public IList RecordsImBerichtszeitraum { get; set; } } } diff --git a/Report/ReportObjects/MitarbeiterstundenkontoBerechnungMonate.cs b/Report/ReportObjects/MitarbeiterstundenkontoBerechnungMonate.cs index a18bdf4c8..96640750d 100644 --- a/Report/ReportObjects/MitarbeiterstundenkontoBerechnungMonate.cs +++ b/Report/ReportObjects/MitarbeiterstundenkontoBerechnungMonate.cs @@ -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(); + List 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); diff --git a/Report/ReportObjects/MitarbeiterstundenkontoRO.cs b/Report/ReportObjects/MitarbeiterstundenkontoRO.cs index 9d7fd5ee9..9b571ef3d 100644 --- a/Report/ReportObjects/MitarbeiterstundenkontoRO.cs +++ b/Report/ReportObjects/MitarbeiterstundenkontoRO.cs @@ -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 _EmployeeDetailList = new List(); List _TeamDetailList = new List(); - - public DateTime ReportStartDate { get; set; } + List _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 teamOids, DateTime startDate, DateTime endDate, IEnumerable employeeOids) + public List AllServiceRecords + { + get { return this._AllServiceRecords; } + set { this._AllServiceRecords = value; } + } + + public static MitarbeiterstundenkontoRO Create(long? employeeOid, IList teamOids, DateTime startDate, DateTime endDate, IEnumerable employeeOids) { Team team = null; @@ -171,7 +179,73 @@ namespace BeWo.Report.ReportObjects return ro; } - + public void BerechneServiceRecordPool() + { + _AllServiceRecords = new List(); + + var allServiceDescs = DAOFactory.GenericDAO.GetAll(); + Dictionary serviceDict = new Dictionary(); + 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 serviceDict) + { + var dc = new StundenkontoServiceRecord(); + //"SELECT Oid, StartDate, EndDate, RoundedDuration, GroupEmployeeCount, GroupPersonCount, GroupRoundedDuration, GroupOid, DistanceInMeter, Betrag, CostBearer2SupportConceptOid, ServiceDescriptionOid, CustomerOid, EmployeeOid FROM servicerecord"; + dc.ServiceRecordOid = (long?)sqlRow[0]; + dc.Start = (DateTime)sqlRow[1]; + dc.End = (DateTime)sqlRow[2]; + dc.RoundedDuration = (decimal)sqlRow[3]; + dc.GroupEmployeeCount = (int?)sqlRow[4]; + dc.GroupPersonCount = (int?)sqlRow[5]; + dc.GroupRoundedDuration = (decimal?)sqlRow[6]; + dc.GroupOid = (long?)sqlRow[7]; + + var test = sqlRow[8]; + if (test != null) + { + decimal meter = 0; + + if (Decimal.TryParse(test.ToString(), out meter)) + { + dc.DistanceInMeter = meter; + } + } + dc.Betrag = (decimal?)sqlRow[9]; + + dc.CostBearer2SupportConceptOid = (long?)sqlRow[10]; + + + long? sdOid = (long?)sqlRow[11]; + if (sdOid.HasValue && serviceDict.ContainsKey(sdOid.Value)) + { + dc.ServiceDescription = serviceDict[sdOid.Value]; + } + + dc.CustomerOid = (long?)sqlRow[12]; + dc.EmployeeOid = (long?)sqlRow[13]; + + return dc; + + } + private static Contract GetNextValidContractForDate(DateTime dt, Employee emp) { Contract contractNextToStartDate = emp.GetValidContractForDate(dt); @@ -277,9 +351,9 @@ namespace BeWo.Report.ReportObjects public IList Days { get; set; } - public IList AllServiceRecords { get; set; } + public IList AllServiceRecords { get; set; } - public IList ServiceRecordsInSelectedTimeSpan { get; set; } + public IList ServiceRecordsInSelectedTimeSpan { get; set; } public Employee Employee { get; set; } @@ -488,7 +562,7 @@ namespace BeWo.Report.ReportObjects public String Custom10 { get; set; } - public IList ServiceRecords { get; set; } + public IList ServiceRecords { get; set; } public int? NightStart { get; set; } diff --git a/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/CustomReportCreator.cs b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/CustomReportCreator.cs new file mode 100644 index 000000000..423fec9d2 --- /dev/null +++ b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/CustomReportCreator.cs @@ -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 { teamOid }; + } + } + + var plugin = PluginLoader.FindClass(); + + var reportDcList = plugin.GetCustomerFLSAnalysis(config); + + return FLSSollIstReportRO.Create(reportDcList, config); + } + return null; + } + + } +} diff --git a/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.Designer.cs b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.Designer.cs new file mode 100644 index 000000000..2c27f0b1f --- /dev/null +++ b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.Designer.cs @@ -0,0 +1,835 @@ +using BeWo.Report.ReportObjects; +namespace LebenshilfeBadKreuznachAutismuszentrum +{ + partial class FLSSollIstReport + { + /// + /// Required designer variable. + /// + private System.ComponentModel.IContainer components = null; + + /// + /// Clean up any resources being used. + /// + /// true if managed resources should be disposed; otherwise, false. + protected override void Dispose(bool disposing) + { + if (disposing && (components != null)) + { + components.Dispose(); + } + base.Dispose(disposing); + } + + #region Designer generated code + + /// + /// Required method for Designer support - do not modify + /// the contents of this method with the code editor. + /// + 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; + } +} diff --git a/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.cs b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.cs new file mode 100644 index 000000000..768f7809b --- /dev/null +++ b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.cs @@ -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 + { + 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(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(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; + } + + } +} diff --git a/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.resx b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.resx new file mode 100644 index 000000000..d58980a38 --- /dev/null +++ b/ReportImp/LebenshilfeBadKreuznachAutismuszentrum/FLSSollIstReport.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/ReportImp/PerspektivenEV/Service/CustomEmployeeServiceImp.cs b/ReportImp/PerspektivenEV/Service/CustomEmployeeServiceImp.cs index 6ec02153b..091e37c5b 100644 --- a/ReportImp/PerspektivenEV/Service/CustomEmployeeServiceImp.cs +++ b/ReportImp/PerspektivenEV/Service/CustomEmployeeServiceImp.cs @@ -10,68 +10,5 @@ using System.Threading.Tasks; namespace PerspektivenEV.Service { - public class CustomEmployeeServiceImp : EmployeeServiceImp - { - public override Dictionary GetSonderurlaubForEmployee(long empOid, int berechnungsjahr) - { - Dictionary sonderurlaub = new Dictionary(); - try - { - var emp = DAOFactory.GenericDAO.GetByID(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; - } - } + } diff --git a/ReportImp/PerspektivenEV/Service/CustomVacationService.cs b/ReportImp/PerspektivenEV/Service/CustomVacationService.cs index e834c2624..afdf46724 100644 --- a/ReportImp/PerspektivenEV/Service/CustomVacationService.cs +++ b/ReportImp/PerspektivenEV/Service/CustomVacationService.cs @@ -30,281 +30,15 @@ namespace PerspektivenEV.Service return new DateTime(year, 12, 31); } - public override List BerechneUrlaubskontoZurDarstellung(EmployeeDC emp, int year, DateTime? endeDerBerechnung = null) + public override List BerechneUrlaubskontoZurDarstellung(Employee emp, int year, DateTime? endeDerBerechnung = null) { // Claude: Kein Urlaubskonto vor 2026 if (year < 2026) return null; - // ab hier Standard - List dcs = new List(); - EmployeeServiceImp es = PluginLoader.FindClass(); - - // Urlaubskonto erstellen - var ent = DAOFactory.GenericDAO.LoadByID((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 contracts = new List(); - Dictionary contractsAndWeeklyDays = new Dictionary(); - - // 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 sonderurlaubItems = CreateSonderurlaubItems(emp, contract, es.GetSonderurlaubForEmployee(emp.EmployeeOid.Value, year), dcs); - //List 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 BerechneUrlaubskonto(Employee emp, int year) { try @@ -346,12 +80,12 @@ namespace PerspektivenEV.Service int? workdays = 0; List arbeitszeiten = new List(); - Dictionary contractsAndWeeklyDays = new Dictionary(); + Dictionary contractsAndWeeklyDays = new Dictionary(); // 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 zuVerfallZuAddieren = new Dictionary(); - 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 GetSonderurlaubForEmployee(Employee employee, int berechnungsjahr) + { + Dictionary sonderurlaub = new Dictionary(); + + 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 GetVacationReasonIDs() { var res = new List(); diff --git a/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnung.cs b/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnung.cs index 64cb7ce0d..3f8fa0068 100644 --- a/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnung.cs +++ b/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnung.cs @@ -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 groupFilteredRecords, DateTime berichtsAnfang, + protected override ServiceRecordSummary BerechneStunden(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde) { decimal flsGesamt = 0; decimal arbeitszeit = 0; var sum = new ServiceRecordSummary(); - sum.RecordsImBerichtszeitraum = new List(); + sum.RecordsImBerichtszeitraum = new List(); //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 CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) + public override IList CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList 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 srListAlle) + public override decimal BerechnePauseMinuten(IList 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 pausen = new List(); - List nichtpausen = new List(); + List pausen = new List(); + List nichtpausen = new List(); foreach (var sr in srList) { diff --git a/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnungMonate.cs b/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnungMonate.cs index c03a0841c..c873a0f69 100644 --- a/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnungMonate.cs +++ b/ReportImp/SHKServiceSBD/CustomMitarbeiterstundenkontoBerechnungMonate.cs @@ -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(); - while (start < ro.ReportEndDate) - { - DateTime monatStart = new DateTime(start.Year, start.Month, 1); - DateTime monatEnde = monatStart.AddMonths(1); + // var list = new List(); + // List 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(); diff --git a/Service/Dienstplanung/DienstplanungsManager.cs b/Service/Dienstplanung/DienstplanungsManager.cs index 7f8739239..df33270e3 100644 --- a/Service/Dienstplanung/DienstplanungsManager.cs +++ b/Service/Dienstplanung/DienstplanungsManager.cs @@ -870,10 +870,10 @@ namespace BeWo.Service.Dienstplanung public static List BerechneSollSaldoUndIst(DienstplanerRootDC root, DateTime date, List empOids) { VacationService vs = PluginLoader.FindClass(); - 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(); - var berechnung = PluginLoader.FindClass(); + var berechnung = PluginLoader.FindClass(); berechnung.CreateReport(konto); List monatsZusammenfassung = new List(); root.StundenBeiAbwesenheit = new Dictionary(); @@ -1066,9 +1066,9 @@ namespace BeWo.Service.Dienstplanung { VacationService vs = new VacationService(); List empOids = new List() { 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(); + var berechnung = PluginLoader.FindClass(); berechnung.CreateReport(konto); DienstplanerMonthlySummaryDC dc = new DienstplanerMonthlySummaryDC(); diff --git a/Service/Dienstplanung/Mitarbeiterstundenkonto.cs b/Service/Dienstplanung/Mitarbeiterstundenkonto.cs index 50bca5ab1..52e696209 100644 --- a/Service/Dienstplanung/Mitarbeiterstundenkonto.cs +++ b/Service/Dienstplanung/Mitarbeiterstundenkonto.cs @@ -11,7 +11,7 @@ using System.Diagnostics; namespace BeWo.Service.Dienstplanung { - public class MitarbeiterstundenkontoRO + public class MitarbeiterstundenkontoRONeu { List _EmployeeDetailList = new List(); List _TeamDetailList = new List(); @@ -48,13 +48,13 @@ namespace BeWo.Service.Dienstplanung set { this._TeamDetailList = value; } } - public static MitarbeiterstundenkontoRO Create(long? employeeOid, IList teamOids, DateTime startDate, DateTime endDate, IEnumerable employeeOids) + public static MitarbeiterstundenkontoRONeu Create(long? employeeOid, IList teamOids, DateTime startDate, DateTime endDate, IEnumerable employeeOids) { Team team = null; Dictionary empOidDict = new Dictionary(); - var ro = new MitarbeiterstundenkontoRO {ReportStartDate = startDate, ReportEndDate = endDate}; + var ro = new MitarbeiterstundenkontoRONeu {ReportStartDate = startDate, ReportEndDate = endDate}; IList 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; } diff --git a/Service/Dienstplanung/MitarbeiterstundenkontoBerechnung.cs b/Service/Dienstplanung/MitarbeiterstundenkontoBerechnung.cs index c215c9d92..1fe76aedc 100644 --- a/Service/Dienstplanung/MitarbeiterstundenkontoBerechnung.cs +++ b/Service/Dienstplanung/MitarbeiterstundenkontoBerechnung.cs @@ -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(); decimal pause1 = 0; @@ -432,7 +432,7 @@ namespace BeWo.Service.Dienstplanung } - protected virtual AbsenceTimeHours GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, Contract c, IList groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde) + protected virtual AbsenceTimeHoursNeu GetAbwesenheitenDurchServiceRecords(MitarbeiterstundenkontoRONeu.EmployeeDetail empDetail, Contract c, IList 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 groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde) + protected virtual ServiceRecordSummaryNeu BerechneStunden(MitarbeiterstundenkontoRONeu.EmployeeDetail empDetail, IList groupFilteredRecords, DateTime berichtsAnfang, DateTime berichtsEnde) { - var sum = new ServiceRecordSummary(); + var sum = new ServiceRecordSummaryNeu(); sum.RecordsImBerichtszeitraum = new List(); empDetail.ServiceRecordsInSelectedTimeSpan = new List(); @@ -837,9 +837,9 @@ namespace BeWo.Service.Dienstplanung return false; } - public virtual List FilterEmployeeList(List employeeDetailList) + public virtual List FilterEmployeeList(List employeeDetailList) { - List newEmpList = new List(); + List newEmpList = new List(); foreach (var ed in employeeDetailList) { @@ -859,7 +859,7 @@ namespace BeWo.Service.Dienstplanung return newEmpList; } - public virtual void HandleServiceRecords(MitarbeiterstundenkontoRO.EmployeeDetail empDetail, IList groupFilteredRecords, Contract contract) + public virtual void HandleServiceRecords(MitarbeiterstundenkontoRONeu.EmployeeDetail empDetail, IList 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 CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) + public virtual IList CreateDayDetails(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRONeu.EmployeeDetail ed, IList recordsAll) { if (ShouldCreateDayDetailsForEachServiceRecord()) { return CreateDayDetailsForEachServiceRecord(berichtStart, berichtEnde, ed, recordsAll); } - Dictionary dayToDetail = new Dictionary(); + Dictionary dayToDetail = new Dictionary(); 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 CreateDayDetailsForEachServiceRecord(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) + public virtual IList CreateDayDetailsForEachServiceRecord(DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRONeu.EmployeeDetail ed, IList recordsAll) { - var details = new List(); + var details = new List(); 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(); 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 records, DateTime monat, out decimal? ueberstunden, out decimal alteExtraUeberstunden) + public virtual MitarbeiterstundenkontoRONeu.EmployeeDetail BerechneUeberstundenBis(MitarbeiterstundenkontoRONeu.EmployeeDetail edOrig, IList 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; @@ -1628,9 +1628,9 @@ namespace BeWo.Service.Dienstplanung sollMitarbeiter -= fehlzeit.Value; } - - 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 days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRO.EmployeeDetail ed, IList recordsAll) + public virtual decimal GetAdditionalHours(IList days, DateTime berichtStart, DateTime berichtEnde, MitarbeiterstundenkontoRONeu.EmployeeDetail ed, IList 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 daysDict = new Dictionary(); 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 absenceTimes, DateTime start, DateTime end, int arbeitstageProWoche) + public virtual AbsenceTimeDaysNeu GetAbsenceTimeDaysWithWorkWeeks(IList 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 absenceTimes, DateTime start, DateTime end) + public virtual AbsenceTimeDaysNeu GetAbsenceTimeDays(IList 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 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; } diff --git a/Service/Dienstplanung/StundenkontoServiceRecord.cs b/Service/Dienstplanung/StundenkontoServiceRecord.cs new file mode 100644 index 000000000..d50f8e02e --- /dev/null +++ b/Service/Dienstplanung/StundenkontoServiceRecord.cs @@ -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; } + } +} \ No newline at end of file diff --git a/Service/Plugins/PluginLoader.cs b/Service/Plugins/PluginLoader.cs index 428f78c1a..18f4175c4 100644 --- a/Service/Plugins/PluginLoader.cs +++ b/Service/Plugins/PluginLoader.cs @@ -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 diff --git a/Service/Plugins/VacationService.cs b/Service/Plugins/VacationService.cs index 6a5042316..56563fc57 100644 --- a/Service/Plugins/VacationService.cs +++ b/Service/Plugins/VacationService.cs @@ -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 { private List databaseFeiertage = null; + private IList allAbsenceReasons = null; + private IList allGeschenkteUrlaubstage = null; private List _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 AllAbsenceReasons + { + get + { + if (allAbsenceReasons == null) + { + allAbsenceReasons = DAOFactory.GenericDAO.GetAll(); + } + + return allAbsenceReasons; + } + } + + private IList 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 GetAllVacationAbsences(List absenceTimes, int year, bool inklEndeEinerAbsenceTime) + public virtual List GetAllVacationAbsences(IList absenceTimes, int year, bool inklEndeEinerAbsenceTime) { - List absences = new List(); 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 GetAllSickAbsences(List absenceTimes, int year, bool inklEndeEinerAbsenceTime) + public virtual List GetAllSickAbsences(IList absenceTimes, int year, bool inklEndeEinerAbsenceTime) { - List absences = new List(); var absReason = GetSickReasonIDs(); + return GetAllAbsencesWithReasonOid(absenceTimes, absReason, year, inklEndeEinerAbsenceTime); + } + + public virtual List GetAllAbsencesWithReasonOid(IList absenceTimes, IList 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 GetVacationReasonIDs() { var res = new List(); var filters = new List { "URLAUB" }; - var reasons = DAOFactory.GenericDAO.GetAll(); + var reasons = AllAbsenceReasons; foreach (var reason in reasons) { @@ -525,7 +537,7 @@ namespace BeWo.Service.Plugins { var res = new List(); var filters = new List { "KRANK" }; - var reasons = DAOFactory.GenericDAO.GetAll(); + 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 BerechneUrlaubskontoZurDarstellung(EmployeeDC emp, int year, DateTime? endeDerBerechnung = null) + public virtual List BerechneUrlaubskontoZurDarstellung(Employee emp, int year, DateTime? endeDerBerechnung = null) { + Stopwatch stopwatch = Stopwatch.StartNew(); + + + List dcs = new List(); - EmployeeServiceImp es = PluginLoader.FindClass(); + //EmployeeServiceImp es = PluginLoader.FindClass(); // Urlaubskonto erstellen - var ent = DAOFactory.GenericDAO.LoadByID((long)emp.EmployeeOid); - var urlaubskonten = BerechneUrlaubskonto(ent, year); + //var ent = DAOFactory.GenericDAO.LoadByID((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 contracts = new List(); - Dictionary contractsAndWeeklyDays = new Dictionary(); + List contracts = new List(); + Dictionary contractsAndWeeklyDays = new Dictionary(); // 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 sonderurlaubItems = CreateSonderurlaubItems(emp, contract, es.GetSonderurlaubForEmployee(emp.EmployeeOid.Value, year), dcs); + List sonderurlaubItems = CreateSonderurlaubItems(emp, contract, GetSonderurlaubForEmployee(emp, year), dcs); //List 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 CreateSonderurlaubItems(EmployeeDC emp, ContractDC contract, Dictionary sonderurlaubDict, List darstellungList) + public virtual List CreateSonderurlaubItems(Employee emp, Contract contract, Dictionary sonderurlaubDict, List darstellungList) { List sonderurlaubItems = new List(); @@ -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 contractsAndWeeklyDays) + public decimal CountAbwesenheitstage(Employee emp, AbsenceTimeDC spanne, int year, Dictionary 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 contractsAndWeeklyDays) + public decimal CountAbwesenheistageStandard(AbsenceTimeDC spanne, int year, Dictionary 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 absences = new List(); + var absences = new List(); // 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 arbeitszeiten = new List(); - Dictionary contractsAndWeeklyDays = new Dictionary(); + Dictionary contractsAndWeeklyDays = new Dictionary(); // 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 zuVerfallZuAddieren = new Dictionary(); - 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 GetGeschenkteUrlaubstageForEmployee(long oid) + { + if (AllGeschenkteUrlaubstage == null) + { + AllGeschenkteUrlaubstage = DAOFactory.GenericDAO.GetAllActive(); + } + return AllGeschenkteUrlaubstage.Where(u => u.Employee == oid).ToList(); + } + + public virtual Dictionary GetSonderurlaubForEmployee(Employee employee, int berechnungsjahr) + { + Dictionary sonderurlaub = new Dictionary(); + + 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); diff --git a/Service/Service.csproj b/Service/Service.csproj index ddef7c116..a2425e7f6 100644 --- a/Service/Service.csproj +++ b/Service/Service.csproj @@ -424,6 +424,7 @@ + diff --git a/Service/ServiceImplementations/EmployeeServiceImp.cs b/Service/ServiceImplementations/EmployeeServiceImp.cs index 3c0be7d17..f0302bf4d 100644 --- a/Service/ServiceImplementations/EmployeeServiceImp.cs +++ b/Service/ServiceImplementations/EmployeeServiceImp.cs @@ -1923,7 +1923,7 @@ namespace BeWo.Service.ServiceImplementations { try { - UrlaubsplanungsManager manager = new UrlaubsplanungsManager(); + var manager = PluginLoader.FindClass(); return manager.BuildUrlaubsplanerRootObject(filter); } catch (Exception exception) @@ -2074,57 +2074,59 @@ namespace BeWo.Service.ServiceImplementations } public virtual Dictionary GetSonderurlaubForEmployee(long empOid, int berechnungsjahr) { - Dictionary sonderurlaub = new Dictionary(); - try - { - var emp = DAOFactory.GenericDAO.GetByID(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 sonderurlaub = new Dictionary(); + //try + //{ + // var emp = DAOFactory.GenericDAO.GetByID(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 InsertAbwesenheitsInformationPrint(List abwesenheitsInformationPrints) { @@ -2184,7 +2186,8 @@ namespace BeWo.Service.ServiceImplementations try { var vs = PluginLoader.FindClass(); - return vs.BerechneUrlaubskontoZurDarstellung(emp, year); + var entity = DAOFactory.GenericDAO.LoadByID(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(); - var vs = PluginLoader.FindClass(); + var manager = PluginLoader.FindClass(); - var allEmployees = DAOFactory.GenericDAO.GetAllActive().ToList(); - - List teams = new List(); - if (filter.Teams != null) - teams = DAOFactory.GenericDAO.GetActiveByIDs(filter.Teams) as List; - - - //foreach (var emp in allEmployees.OrderBy(x => x.Person.LastNameFirstName)) - List benoetigteMitarbeiter = new List(); - 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) { diff --git a/Service/ServiceImplementations/OperationsServiceImp.cs b/Service/ServiceImplementations/OperationsServiceImp.cs index a0a44bf57..9215779a4 100644 --- a/Service/ServiceImplementations/OperationsServiceImp.cs +++ b/Service/ServiceImplementations/OperationsServiceImp.cs @@ -7296,8 +7296,6 @@ namespace BeWo.Service.ServiceImplementations try { var vs = PluginLoader.FindClass(); - var ber = PluginLoader.FindClass(); - var altList = ber.GetFeiertage(year); var list = vs.GetFeiertage(year, vs.Bundesland); return list; @@ -7486,77 +7484,78 @@ namespace BeWo.Service.ServiceImplementations } } - public List GetAbsenceOverview(AbsenceOverviewFilterDC filter) - { - try - { - var res = new List(); - var vs = PluginLoader.FindClass(); + //CB, 14.07.2026 Ist doppelt im EmployeeServiceImp vorhanden + //public List GetAbsenceOverview(AbsenceOverviewFilterDC filter) + //{ + // try + // { + // var res = new List(); + // var vs = PluginLoader.FindClass(); - var allEmployees = DAOFactory.GenericDAO.GetAllActive().ToList(); + // var allEmployees = DAOFactory.GenericDAO.GetAllActive().ToList(); - List teams = new List(); - if (filter.Teams != null) - teams = DAOFactory.GenericDAO.GetActiveByIDs(filter.Teams) as List; + // List teams = new List(); + // if (filter.Teams != null) + // teams = DAOFactory.GenericDAO.GetActiveByIDs(filter.Teams) as List; - //foreach (var emp in allEmployees.OrderBy(x => x.Person.LastNameFirstName)) - List benoetigteMitarbeiter = new List(); - 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 benoetigteMitarbeiter = new List(); + // 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 GetCertainTeamsById(List oids) { var teams = DAOFactory.GenericDAO.GetActiveByIDs(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(); + // //root.AlleAbwesenheitsInformationDCs = new List(); - //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) { diff --git a/Service/Urlaubsplanung/UrlaubsplanungsManager.cs b/Service/Urlaubsplanung/UrlaubsplanungsManager.cs index 33ba1a655..1bc719e20 100644 --- a/Service/Urlaubsplanung/UrlaubsplanungsManager.cs +++ b/Service/Urlaubsplanung/UrlaubsplanungsManager.cs @@ -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(); + } + return vacationService; + } + } + public UrlaubsplanerRootDC BuildUrlaubsplanerRootObject(AbsenceOverviewFilterDC filter) { + var sw = System.Diagnostics.Stopwatch.StartNew(); + UrlaubsplanerRootDC root = new UrlaubsplanerRootDC(); - VacationService vs = PluginLoader.FindClass(); - 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(); 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(); - var es = PluginLoader.FindClass(); - 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 GetAbsenceOverview(AbsenceOverviewFilterDC filter) + { + var res = new List(); + var employees = GetAllFilteredEmployees(filter); + + foreach (var emp in employees) + { + res.Add(ErstelleCompactEmployeeDC(emp, filter)); + } + + return res.OrderBy(e => e.LastNameFirstName).ToList(); + } + + public List GetAllFilteredEmployees(AbsenceOverviewFilterDC filter) + { + var res = new List(); + + var allEmployees = DAOFactory.GenericDAO.GetAllActive().ToList(); + + List teams = new List(); + if (filter.Teams != null) + teams = DAOFactory.GenericDAO.GetActiveByIDs(filter.Teams) as List; + + + List benoetigteMitarbeiter = new List(); + 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(); - + if (employee == null) + { + employee = DAOFactory.GenericDAO.LoadByID(info.Employee.EmployeeOid.Value); + } // Urlaube setzen so wie im Urlaubskonto - Dictionary contractsAndWeeklyDays = new Dictionary(); + Dictionary contractsAndWeeklyDays = new Dictionary(); // 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(); - - // Krankheiten setzen so wie Urlaube im Urlaubskonto - Dictionary contractsAndWeeklyDays = new Dictionary(); - - // 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 GetAllEmployeeAbsenceTimesForMonth(int year, int month) { try @@ -207,8 +274,7 @@ namespace BeWo.Service.Urlaubsplanung private List GetArbeitsfreieTage(AbwesenheitsInformationDC info) { - VacationService vs = PluginLoader.FindClass(); - var feiertage = vs.GetFeiertage(info.Year); + var feiertage = VacationService.GetFeiertage(info.Year); List wochenendtage = new List(); for (int i = 1; i <= DateTime.DaysInMonth(info.Year, info.Month); i++)