diff --git a/BeWoPlanerMobil/BeWoPlanerMobil.csproj b/BeWoPlanerMobil/BeWoPlanerMobil.csproj index 0daee286c..3d7cc6c33 100644 --- a/BeWoPlanerMobil/BeWoPlanerMobil.csproj +++ b/BeWoPlanerMobil/BeWoPlanerMobil.csproj @@ -713,6 +713,12 @@ + + + + + + diff --git a/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs b/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs index 2b2c6bed8..6fc46c6c4 100644 --- a/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs +++ b/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs @@ -22,10 +22,10 @@ namespace BeWoPlanerMobil.Controllers /* * ToDo: * 1. Filterung einbauen (Mitarbeiter, Klienten, Ressourcen, Privat, Aufgaben, Abwesenheiten) + * Das Filtern muss über den CustomCallback geschehen, damit die Termin-Liste aktualisiert wird. * 2. "In die Zeiterfassung übertragen" und "Verfügbare Mitarbeiter prüfen" einbauen * 3. Rechte implementieren! - * 4. Ressourcen-Farben einbauen -> Templates wie im DemoCenter benutzen - * 5. Übersetzungen + * 4. Übersetzungen */ public class DevExpressSchedulerController : AbstractBaseController @@ -111,11 +111,11 @@ namespace BeWoPlanerMobil.Controllers { if(Model.LoggedInEmployee.EmployeeOid is null) { - throw new Exception("Bei DevExpressSchedulerController.ReloadAppointments() ist die Oid des angemeldeten Benutzers ist wider Erwarten NULL!"); + throw new Exception("Bei DevExpressSchedulerController.ReloadAppointments() ist die Oid des angemeldeten Benutzers wider Erwarten NULL!"); } - // ToDo: ausgewählte Ansicht laden und speichern! - //Model.ShowBetrag = UserSettingsUtils.GetSettingValueAsBool(Model.Mandator.Settings, SettingsKeys.ShowBetrag); + var employeeOid = Model.LoggedInEmployee.EmployeeOid.Value; + var user = LoggedInUser; var userSettings = user?.Settings.FirstOrDefault(f => f.Type.Equals(SettingsType.ApplicationSettings))?.Value; @@ -127,7 +127,7 @@ namespace BeWoPlanerMobil.Controllers var appointments = KalenderService.LoadFilteredAppointmentsMitAufgaben ( Model.HasRightKalenderMitarbeitertermineAnsehen, - Model.LoggedInEmployee.EmployeeOid.Value, + employeeOid, intervalStart, intervalEnd, new List(), @@ -141,9 +141,87 @@ namespace BeWoPlanerMobil.Controllers true ); + var selectedCustomerOids = Model.PossibleCustomers.Select(s => s.CustomerOid).ToList(); + var selectedEmployeeOids = Model.PossibleEmployees.Select(s => s.EmployeeOid).ToList(); + + var customerAbsenceTimes = KalenderService.GetAllActiveCustomersAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, selectedCustomerOids); + var employeeAbsenceTimes = KalenderService.GetAllActiveEmployeeAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, selectedEmployeeOids); + + var allAbsenceTimes = new List(); + allAbsenceTimes.AddRange(customerAbsenceTimes); + allAbsenceTimes.AddRange(employeeAbsenceTimes); + + appointments.AddRange(ConvertAbsenceTimesToAppointments(allAbsenceTimes, Model.PossibleCustomers, Model.PossibleEmployees)); + Model.Appointments = appointments; } + private List ConvertAbsenceTimesToAppointments(List absenceTimes, List allCustomers, List allEmployees) + { + var appointments = new List(); + + foreach(var absenceTime in absenceTimes) + { + var subject = $"{absenceTime.Reason.Description}"; + var employee = absenceTime.EmployeeOid.HasValue ? allEmployees.FirstOrDefault(f => f.EmployeeOid == absenceTime.EmployeeOid.Value) : null; + var customer = absenceTime.CustomerOid.HasValue ? allCustomers.FirstOrDefault(f => f.CustomerOid == absenceTime.CustomerOid.Value) : null; + var allDay = absenceTime.IsAllDay; + + var isEmployeeAbsenceTime = absenceTime.EmployeeOid.HasValue; + + IFilterableDC dc = employee; + var originator = employee; + if(false == isEmployeeAbsenceTime) + { + dc = customer; + originator = EmployeeService.FindCompactEmployeeByFullname(absenceTime.InsUser); + } + + if(false == dc is null) + { + subject += $" ({dc.SimpleDescription})"; + } + + var absenceTimeEnd = absenceTime.End; + var end = absenceTime.End ?? DateTime.MaxValue; + + var isMultipleDayAbsenceTime = absenceTime.End is null || absenceTime.Start.Value.Date != absenceTime.End.Value.Date; + + if(isMultipleDayAbsenceTime && allDay && end != DateTime.MaxValue) + { + absenceTimeEnd = end.AddDays(1); + } + + if(originator is null) + { + originator = LoggedInUser.Employee; + } + + var appointment = new SchedulerAppointmentDC + { + AbsenceReason = absenceTime.Reason, + AllDay = true, + Description = absenceTime.Notice, + StartDate = absenceTime.Start, + EndDate = absenceTimeEnd, + ActivationType = ActivationTypeId.Active, + FormerAbsenceTimeOid = absenceTime.AbsenceTimeOid, + Originator = originator, + Subject = subject, + Krankheitsmeldung = absenceTime.KrankheitsMeldung + }; + + if(false == customer is null && employee is null) + { + appointment.CustomerList = new List { customer }; + } + + appointments.Add(appointment); + } + + return appointments; + } + [Authorize] public ActionResult DevExpressScheduler() { @@ -366,5 +444,31 @@ namespace BeWoPlanerMobil.Controllers return PartialView("SchedulerPagePartial", Model); } + + [Authorize] + public ActionResult SelectAllEmployeesForFiltering() + { + Model.SelectedEmployeesForFiltering = Model.PossibleEmployees.Select(employee => employee.EmployeeOid).ToList(); + + return PartialView("AptFltEmployeePopupListPartial"); + } + + [Authorize] + public ActionResult SelectAllCustomersForFiltering() + { + Model.SelectedCustomersForFiltering = Model.PossibleCustomers.Select(customer => customer.CustomerOid).ToList(); + + return PartialView("AptFltCustomerPopupListPartial"); + } + + [Authorize] + public ActionResult SelectAllResourcesForFiltering() + { + Model.SelectedResourcesForFiltering = Model.PossibleResources.Where(resource => resource.ResourceOid.HasValue).Select(resource => resource.ResourceOid.Value).ToList(); + + return PartialView("AptFltResourcePopupListPartial"); + } + + } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Models/AbstractModel.cs b/BeWoPlanerMobil/Models/AbstractModel.cs index 36e2080aa..bceaec876 100644 --- a/BeWoPlanerMobil/Models/AbstractModel.cs +++ b/BeWoPlanerMobil/Models/AbstractModel.cs @@ -13,6 +13,7 @@ namespace BeWoPlanerMobil.Models { public class AbstractModel { + public bool HasRightToEditEmployeeAbsenceTimes => CheckRight(UserRightType.Employee_AllowEditAbsenceTimes); public bool IsDeleteBtnVisible => CheckRight(UserRightType.ServiceRecordView_Delete); public bool IsAllowedToSeeScheduler => LoggedInUser != null && CheckRight(UserRightType.KalenderAnsehen) || CheckRight(UserRightType.ViewAll); diff --git a/BeWoPlanerMobil/Models/CustomerModel.cs b/BeWoPlanerMobil/Models/CustomerModel.cs index b9683e832..4a8f3ce42 100644 --- a/BeWoPlanerMobil/Models/CustomerModel.cs +++ b/BeWoPlanerMobil/Models/CustomerModel.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Web.Mvc; using BeWo.View.Navigation.Filter; using BeWoPlanerMobil.Controllers; +using BeWoPlanerMobil.Service; using BeWoPlanerMobil.Util; using BS.Shared; using BS.Shared.DataContracts; @@ -13,6 +14,8 @@ namespace BeWoPlanerMobil.Models { public class CustomerModel : AbstractModel, ISignable, IAbsenceTimeModel, IDocumentsModel { + public bool HasRightToEdit => HasRightToEditCustomers; + public bool HasRightToDelete => HasRightToEditCustomers; public long? ObjectOid => SelectedCustomerOid; public TableID ObjectTid => TableID.Customer; public string HtmlPrefix => "customer"; diff --git a/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs b/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs index 03d22df9d..04b6fee00 100644 --- a/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs +++ b/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs @@ -66,5 +66,23 @@ namespace BeWoPlanerMobil.Models return null; } + + public List SelectedEmployeesForFiltering + { + get => DevExpressSchedulerSessionModel.SelectedEmployeesForFiltering; + set => DevExpressSchedulerSessionModel.SelectedEmployeesForFiltering = value; + } + + public List SelectedCustomersForFiltering + { + get => DevExpressSchedulerSessionModel.SelectedCustomersForFiltering; + set => DevExpressSchedulerSessionModel.SelectedCustomersForFiltering = value; + } + + public List SelectedResourcesForFiltering + { + get => DevExpressSchedulerSessionModel.SelectedResourcesForFiltering; + set => DevExpressSchedulerSessionModel.SelectedResourcesForFiltering = value; + } } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs b/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs index 1a5999d9d..61d604311 100644 --- a/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs +++ b/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs @@ -10,6 +10,10 @@ namespace BeWoPlanerMobil.Models public List SelectedResourceOids { get; set; } public SchedulerViewType CurrentSchedulerViewType { get; set; } + public List SelectedEmployeesForFiltering { get; set; } + public List SelectedCustomersForFiltering { get; set; } + public List SelectedResourcesForFiltering { get; set; } + public override void ResetValues() { base.ResetValues(); @@ -17,6 +21,9 @@ namespace BeWoPlanerMobil.Models SelectedCustomerOids = null; SelectedEmployeeOids = null; SelectedResourceOids = null; + SelectedEmployeesForFiltering = null; + SelectedCustomersForFiltering = null; + SelectedResourcesForFiltering = null; } } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Models/EmployeeModel.cs b/BeWoPlanerMobil/Models/EmployeeModel.cs index 9bb3547b7..c33cb4a4d 100644 --- a/BeWoPlanerMobil/Models/EmployeeModel.cs +++ b/BeWoPlanerMobil/Models/EmployeeModel.cs @@ -7,6 +7,8 @@ namespace BeWoPlanerMobil.Models { public class EmployeeModel : AbstractModel, IAbsenceTimeModel { + public bool HasRightToEdit => HasRightToEditEmployeeAbsenceTimes; + public bool HasRightToDelete => HasRightToEditEmployeeAbsenceTimes; public string HtmlPrefix => "employee"; public EmployeeSessionModel EmployeeSessionModel => SessionModel as EmployeeSessionModel; diff --git a/BeWoPlanerMobil/Models/IAbsenceTimeModel.cs b/BeWoPlanerMobil/Models/IAbsenceTimeModel.cs index ef1969be4..9471cd7fa 100644 --- a/BeWoPlanerMobil/Models/IAbsenceTimeModel.cs +++ b/BeWoPlanerMobil/Models/IAbsenceTimeModel.cs @@ -14,5 +14,7 @@ namespace BeWoPlanerMobil.Models Dictionary Collapsibles2IsShown { get; set; } List AbsenceReasonItems { get; } long? AbsenteeOid { get; } + bool HasRightToEdit { get; } + bool HasRightToDelete { get; } } } diff --git a/BeWoPlanerMobil/Util/MobileUtils.cs b/BeWoPlanerMobil/Util/MobileUtils.cs index 201718bbb..74daf2526 100644 --- a/BeWoPlanerMobil/Util/MobileUtils.cs +++ b/BeWoPlanerMobil/Util/MobileUtils.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Globalization; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using System.Web; +using BeWo.Report.DefaultReports; using BeWoPlanerMobil.Models; using BS.Shared; using BS.Shared.Core; @@ -15,6 +8,14 @@ using BS.Shared.Extensions; using BS.Shared.Services; using Newtonsoft.Json; using RestSharp; +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; +using System.Web; using static System.Int32; using static System.String; diff --git a/BeWoPlanerMobil/Views/DevExpressScheduler/DevExpressScheduler.cshtml b/BeWoPlanerMobil/Views/DevExpressScheduler/DevExpressScheduler.cshtml index 8f6fab724..e4c98ce5a 100644 --- a/BeWoPlanerMobil/Views/DevExpressScheduler/DevExpressScheduler.cshtml +++ b/BeWoPlanerMobil/Views/DevExpressScheduler/DevExpressScheduler.cshtml @@ -137,6 +137,96 @@ } + + @using(Html.BeginForm()) {
diff --git a/BeWoPlanerMobil/Views/Scheduler/EmployeeSelectionPopupPartial.cshtml b/BeWoPlanerMobil/Views/Scheduler/EmployeeSelectionPopupPartial.cshtml index 9eb078c6d..6e8ef058b 100644 --- a/BeWoPlanerMobil/Views/Scheduler/EmployeeSelectionPopupPartial.cshtml +++ b/BeWoPlanerMobil/Views/Scheduler/EmployeeSelectionPopupPartial.cshtml @@ -1,5 +1,4 @@ -@using BeWoPlanerMobil.Models -@using BeWoPlanerMobil.Util +@using BeWoPlanerMobil.Util @using BS.Shared.Extensions @model BeWoPlanerMobil.Models.SchedulerModel diff --git a/BeWoPlanerMobil/Views/Shared/AbsenceTimePartial.cshtml b/BeWoPlanerMobil/Views/Shared/AbsenceTimePartial.cshtml index 02d804c95..4893fd78c 100644 --- a/BeWoPlanerMobil/Views/Shared/AbsenceTimePartial.cshtml +++ b/BeWoPlanerMobil/Views/Shared/AbsenceTimePartial.cshtml @@ -75,30 +75,40 @@
-
-
-
- -
-

- @absenceTime.Start.Value.GetIntervalDescription(absenceTime.End) -

-
-
-
-
-
- -
-
- -
-
-
+
+
+
+ +
+

+ @absenceTime.Start.Value.GetIntervalDescription(absenceTime.End) +

+
+
+ @if(Model.HasRightToEdit || Model.HasRightToDelete) + { +
+
+ @if(Model.HasRightToEdit) + { +
+ +
+ } + + @if(Model.HasRightToDelete) + { +
+ +
+ } +
+
+ }
diff --git a/Shared/DataContracts/AbsenceTimeDC.cs b/Shared/DataContracts/AbsenceTimeDC.cs index 15b6bf977..421712735 100644 --- a/Shared/DataContracts/AbsenceTimeDC.cs +++ b/Shared/DataContracts/AbsenceTimeDC.cs @@ -38,6 +38,26 @@ namespace BS.Shared.DataContracts [DataMember] public string BackgroundColor { get; set; } + public bool IsAllDay + { + get + { + if(End is null && Start is null || (End != null && Start is null)) + { + return false; + } + + var start = Start.Value; + var end = End.HasValue == false ? DateTime.MaxValue : End.Value; + + return start.Hour == 0 && + start.Minute == 0 && + start.Second == 0 && + (end == DateTime.MaxValue || end.Hour == 0 && + end.Minute == 0 && + end.Second == 0); + } + } public override bool Equals(object obj) { diff --git a/Shared/DataContracts/SchedulerAppointmentDC.cs b/Shared/DataContracts/SchedulerAppointmentDC.cs index ab1120e3b..834ad557e 100644 --- a/Shared/DataContracts/SchedulerAppointmentDC.cs +++ b/Shared/DataContracts/SchedulerAppointmentDC.cs @@ -162,6 +162,10 @@ namespace BS.Shared.DataContracts [DataMember] public List ServiceRecordList { get; set; } + public long? FormerAbsenceTimeOid { get; set; } + public DateTime? Krankheitsmeldung { get; set; } + public AbsenceReasonDC AbsenceReason { get; set; } + public override bool Equals(object obj) { if (!(obj is SchedulerAppointmentDC schedulerAppointmentDC))