From c25af9c0534175d102ce2dc8c2eb57e32ed768e5 Mon Sep 17 00:00:00 2001 From: Lyndon Date: Mon, 29 Jun 2026 13:45:15 +0200 Subject: [PATCH 1/2] MoK-Kalender weitergemacht --- BeWo/Scheduler/View/NewSchedulerView.xaml.cs | 16 +- BeWoPlanerMobil/BeWoPlanerMobil.csproj | 14 +- BeWoPlanerMobil/BeWoPlanerMobil.csproj.user | 3 +- .../DevExpressSchedulerController.cs | 834 ++++++++++++++++-- .../Controllers/DevToolsController.cs | 53 +- BeWoPlanerMobil/Controllers/MainController.cs | 2 - BeWoPlanerMobil/Global.asax.cs | 2 +- BeWoPlanerMobil/Models/AbstractModel.cs | 18 + BeWoPlanerMobil/Models/AppointmentModel.cs | 52 +- .../Models/AppointmentSessionModel.cs | 5 +- .../Models/DevExpressSchedulerModel.cs | 56 +- .../Models/DevExpressSchedulerSessionModel.cs | 12 +- BeWoPlanerMobil/Models/DevToolsModel.cs | 22 +- .../Models/DevToolsSessionModel.cs | 117 +++ .../Service/ASPHibernateSessionManager.cs | 3 +- .../Service/MobileSessionFacade.cs | 6 + BeWoPlanerMobil/Util/MobileUtils.cs | 9 + .../CustomAppointmentDragToolTip.cshtml | 18 + .../CustomAppointmentFormPartial.cshtml | 394 +++++---- .../CustomAppointmentToolTipPartial.cshtml | 120 +++ .../CustomCustomerSelectPartial.cshtml | 17 +- .../CustomEmployeeSelectPartial.cshtml | 20 +- .../CustomResourceSelectPartial.cshtml | 18 +- .../CustomSelectionToolTip.cshtml | 1 + .../DevExpressScheduler/CustomerInfoObject.cs | 14 + .../CustomerMultiSelectPartial.cshtml | 50 -- .../DevExpressScheduler.cshtml | 284 +++--- .../EmployeeMultiSelectPartial.cshtml | 55 -- ...orizontalAppointmentTemplatePartial.cshtml | 6 +- .../NotificationPopupContent.cshtml | 77 -- .../NotificationsLinkPartial.cshtml | 10 + .../NotificationsPopupContent.cshtml | 26 +- ...OpenEmployee2AppointmentListPartial.cshtml | 64 ++ .../ParticipationInfoObject.cs | 18 + .../DevExpressScheduler/ResourceInfoObject.cs | 20 + .../ResourceMultiSelectPartial.cshtml | 48 - .../DevExpressScheduler/SchedulerHelper.cs | 4 + .../SchedulerNotificationPartial.cshtml | 67 +- .../SchedulerPagePartial.cshtml | 148 +++- ...OpenEmployee2AppointmentFormPartial.cshtml | 86 ++ .../VerticalAppointmentTemplatePartial.cshtml | 4 +- BeWoPlanerMobil/Views/Shared/_Layout.cshtml | 36 + Shared/Core/SchedulerUtils.cs | 1 + .../DataContracts/SchedulerAppointmentDC.cs | 4 + Shared/Extensions/DateTimeExtensions.cs | 2 +- 45 files changed, 2059 insertions(+), 777 deletions(-) create mode 100644 BeWoPlanerMobil/Models/DevToolsSessionModel.cs create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentDragToolTip.cshtml create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentToolTipPartial.cshtml create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/CustomSelectionToolTip.cshtml create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/CustomerInfoObject.cs delete mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/CustomerMultiSelectPartial.cshtml delete mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/EmployeeMultiSelectPartial.cshtml delete mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/NotificationPopupContent.cshtml create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/NotificationsLinkPartial.cshtml create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/OpenEmployee2AppointmentListPartial.cshtml create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/ParticipationInfoObject.cs create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/ResourceInfoObject.cs delete mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/ResourceMultiSelectPartial.cshtml create mode 100644 BeWoPlanerMobil/Views/DevExpressScheduler/SelectedOpenEmployee2AppointmentFormPartial.cshtml diff --git a/BeWo/Scheduler/View/NewSchedulerView.xaml.cs b/BeWo/Scheduler/View/NewSchedulerView.xaml.cs index 7e2cb7c13..a7c36cf3f 100644 --- a/BeWo/Scheduler/View/NewSchedulerView.xaml.cs +++ b/BeWo/Scheduler/View/NewSchedulerView.xaml.cs @@ -1595,7 +1595,9 @@ namespace BeWo.Scheduler.View private void AllowAppointmentCreateEvent(object sender, AppointmentOperationEventArgs e) { - e.Allow = BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderAnsehen) || BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderKliententermineAnlegen) || BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderMitarbeitertermineAnlegen); + e.Allow = BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderAnsehen) || + BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderKliententermineAnlegen) || + BeWoApp.LoggedOnUser.HasRight(UserRightType.KalenderMitarbeitertermineAnlegen); } private void UpdateOptionPanel() @@ -1733,9 +1735,9 @@ namespace BeWo.Scheduler.View } var empList = customFieldStorage.EmployeeList; - var or = customFieldStorage.Originator; + var originator = customFieldStorage.Originator; - return or.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid) && empList.Any(a => a.IsPChanged && a.ParticipationAnswer != ParticipationAnswer.Offen && a.ParticipationAnswer != ParticipationAnswer.Verstrichen && !a.Employee.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid)); + return originator.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid) && empList.Any(employee2AppointmentRelation => employee2AppointmentRelation.IsPChanged && employee2AppointmentRelation.ParticipationAnswer != ParticipationAnswer.Offen && employee2AppointmentRelation.ParticipationAnswer != ParticipationAnswer.Verstrichen && !employee2AppointmentRelation.Employee.EmployeeOid.Equals(BeWoApp.LoggedOnEmployee.EmployeeOid)); }).ToList(); } @@ -2176,7 +2178,7 @@ namespace BeWo.Scheduler.View { if(service.IsDataRefreshAllowed) { - GetCacheObjects((c, e, r) => + GetCacheObjects((customers, employees, resources) => { ServiceFacade.DoResourceServiceAsync(s2 => s2.LoadFilteredAppointmentsMitAufgaben( BeWoApp.HasLoggedOnUserRight(new[] @@ -2218,11 +2220,11 @@ namespace BeWo.Scheduler.View prefilteredAppointments = prefilteredAppointments.Where(app => !app.IsTask).ToList(); } - var vm = new SchedulerAppointmentListVM(prefilteredAppointments, c, e, r); + var vm = new SchedulerAppointmentListVM(prefilteredAppointments, customers, employees, resources); if(pShouldShowAbsenceTimes) { - vm.Appointments.AddRange(ViewModel.ConvertAbsenceTimesToAppointments(customerAbsenceTimes, end, e, c)); - vm.Appointments.AddRange(ViewModel.ConvertAbsenceTimesToAppointments(employeeAbsenceTimes, end, e, c)); + vm.Appointments.AddRange(ViewModel.ConvertAbsenceTimesToAppointments(customerAbsenceTimes, end, employees, customers)); + vm.Appointments.AddRange(ViewModel.ConvertAbsenceTimesToAppointments(employeeAbsenceTimes, end, employees, customers)); //vm.Appointments.AddRange(ViewModel.ConvertAbsenceTimesToAppointments(employeeAbsenceTimes.Where(w => { return SelectedEmployees.Count == 0 || SelectedEmployees.Any(a => a.EmployeeOid == w.EmployeeOid); }), end, e, c)); } diff --git a/BeWoPlanerMobil/BeWoPlanerMobil.csproj b/BeWoPlanerMobil/BeWoPlanerMobil.csproj index 19c62cd72..d4709a954 100644 --- a/BeWoPlanerMobil/BeWoPlanerMobil.csproj +++ b/BeWoPlanerMobil/BeWoPlanerMobil.csproj @@ -325,6 +325,7 @@ + @@ -406,6 +407,9 @@ + + + @@ -713,9 +717,6 @@ - - - @@ -725,11 +726,16 @@ - + + + + + + diff --git a/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user b/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user index 883ab72a1..7a4cc509d 100644 --- a/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user +++ b/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user @@ -28,8 +28,7 @@ - - + Views/Main/Main.cshtml CurrentPage True False diff --git a/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs b/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs index bf3a65098..466d9d9cd 100644 --- a/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs +++ b/BeWoPlanerMobil/Controllers/DevExpressSchedulerController.cs @@ -16,15 +16,13 @@ using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; +using CompactCustomerDC = BS.Shared.DataContracts.Compact.CompactCustomerDC; namespace BeWoPlanerMobil.Controllers { /* * ToDo: - * 1. Filterung einbauen (Mitarbeiter, Klienten, Ressourcen, Privat, Aufgaben, Abwesenheiten) - * 2. Benachrichtigungen einbauen - * 3. Rechte implementieren - * 4. Übersetzungen + * Übersetzungen */ public class DevExpressSchedulerController : AbstractBaseController @@ -118,6 +116,7 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedEmployeeOidsForFiltering = new List { employeeOid }; } + // Nach den Kalenderrechten filtern! Model.PossibleEmployees = EmployeeService.GetAllAuthorizedCompactEmployees(); Model.PossibleCustomers = CustomerService.GetAllAuthorizedCompactCustomers(); Model.PossibleResources = KalenderService.GetAllResources(); @@ -165,12 +164,14 @@ namespace BeWoPlanerMobil.Controllers var employeeOid = user.Employee.EmployeeOid; var userSettings = user.Settings.FirstOrDefault(f => f.Type.Equals(SettingsType.ApplicationSettings))?.Value; + var relatedCustomerOids = user.Employee.RelatedCustomerOIDList; + Model.CurrentViewType = (SchedulerViewType) UserSettingsUtils.GetSettingValueAsInteger(userSettings, SettingsKeys.SchedulerViewType); var intervalStart = DateTimeExtensions.GetDayOfWeek(DayOfWeek.Monday); var intervalEnd = intervalStart.AddDays(7); - var appointments = KalenderService.LoadFilteredAppointmentsMitAufgaben + var allAppointments = KalenderService.LoadFilteredAppointmentsMitAufgaben ( Model.HasRightKalenderMitarbeitertermineAnsehen, employeeOid, @@ -187,11 +188,83 @@ namespace BeWoPlanerMobil.Controllers Model.ShowTasks ); - var allCustomerOids = Model.PossibleCustomers.Select(s => s.CustomerOid).ToList(); - var allEmployeeOids = Model.PossibleEmployees.Select(s => s.EmployeeOid).ToList(); + var appointments = allAppointments; - var customerAbsenceTimes = KalenderService.GetAllActiveCustomersAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, allCustomerOids); - var employeeAbsenceTimes = KalenderService.GetAllActiveEmployeeAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, allEmployeeOids); + foreach(var appointment in appointments) + { + if(false == appointment.IsPrivate || appointment.Originator.EmployeeOid.Equals(employeeOid) || appointment.EmployeeList.Any(e => e.Employee.EmployeeOid.Equals(employeeOid))) + { + continue; + } + + appointment.Description = "Privater Termin"; + appointment.Subject = $"Privat ({appointment.Originator})"; + appointment.CanBeDeleted = false; + appointment.CanBeEdited = false; + appointment.CanBeViewed = false; + } + + // Den Rechten entsprechend filtern + if(Model.HasRightKalenderKliententermineAnsehen is false) + { + var relatedCustomers = Model.LoggedInEmployee.RelatedCustomers.Select(s => s.Customer); + var filteredAppointments = new List(); + + // Nur die der eigenen Klienten nicht filtern? + appointments = appointments.Where(appointment => + appointment.IsTask is false && + appointment.IsAbsenceTime is false && + appointment.CustomerList.Any(customer => relatedCustomers.Contains(customer)) || + appointment.CustomerList.Count == 0 + ).ToList(); + + foreach(var appointment in appointments) + { + if(appointment.CustomerList.Any() && false == appointment.CustomerList.Any(customer => relatedCustomers.Contains(customer))) + { + continue; + } + + filteredAppointments.Add(appointment); + } + + appointments = filteredAppointments; + } + + if(Model.HasRightKalenderMitarbeitertermineAnsehen is false) + { + appointments = appointments.Where(appointment => + appointment.IsTask is false && + appointment.IsAbsenceTime is false && + (appointment.Originator.Equals(Model.LoggedInCompactEmployee) ||appointment.EmployeeList.Any(employee2Appointment => employee2Appointment.Employee.Equals(Model.LoggedInCompactEmployee))) + ).ToList(); + } + + if(Model.HasRightKalenderRessourcentermineAnsehen is false) + { + appointments = appointments.Where(appointment => + appointment.IsTask is false && + appointment.IsAbsenceTime is false && + appointment.ResourceList.Count == 0 + ).ToList(); + } + + if(Model.ShowTasks is false) + { + appointments = appointments.Where(appointment => appointment.IsTask is false).ToList(); + } + else + { + appointments.AddRangeIfElementsNotIn(allAppointments.Where(appointment => appointment.IsTask)); + } + + if(Model.ShowEmployeeColors) + { + appointments.DoForEach(appointment => appointment.ShowEmployeeColors = true); + } + + var customerAbsenceTimes = KalenderService.GetAllActiveCustomersAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, Model.SelectedCustomerOidsForFiltering); + var employeeAbsenceTimes = KalenderService.GetAllActiveEmployeeAbsenceTimesInInterval(intervalStart, intervalEnd, employeeOid, Model.SelectedEmployeeOidsForFiltering); if(Model.ShowAbsenceTimes) { @@ -202,6 +275,27 @@ namespace BeWoPlanerMobil.Controllers appointments.AddRange(ConvertAbsenceTimesToAppointments(allAbsenceTimes, Model.PossibleCustomers, Model.PossibleEmployees)); } + if(Model.HasRightKalenderRessourcenTermineAndererAendern is false) + { + appointments + .Where(appointment => appointment.Originator.Equals(Model.LoggedInCompactEmployee) is false && appointment.ResourceList.Any()) + .DoForEach(appointment => appointment.CanBeEdited = false); + } + + if(Model.HasRightKalenderKlientenTermineAendern is false) + { + appointments + .Where(appointment => appointment.Originator.Equals(Model.LoggedInCompactEmployee) is false && appointment.CustomerList.Any(customer => relatedCustomerOids.Contains(customer.CustomerOid) is false)) + .DoForEach(appointment => appointment.CanBeEdited = false); + } + + if(Model.HasRightKalenderMitarbeiterTermineAendern is false) + { + appointments + .Where(appointment => appointment.Originator.Equals(Model.LoggedInCompactEmployee) is false) + .DoForEach(appointment => appointment.CanBeEdited = false); + } + Model.Appointments = appointments; LoadNotificationCount(); @@ -217,23 +311,41 @@ namespace BeWoPlanerMobil.Controllers private void LoadNotificationCount() { - Model.OpenAppointments = KalenderService.GetAllOpenAppointmentsForEmployee(LoggedInUser.Employee.EmployeeOid).OrderByDescending(openAppointment => openAppointment.StartDate).ToList(); - Model.OpenAppointmentOids = Model.OpenAppointments.Where(openAppointment => openAppointment.SchedulerAppointmentOid.HasValue).Select(openAppointment => openAppointment.SchedulerAppointmentOid.Value).ToList(); - - if(Model.AppointmentOid2Answer.HasValue) - { - Model.Appointment2Answer = Model.OpenAppointments.FirstOrDefault(openAppointment => openAppointment.SchedulerAppointmentOid?.Equals(Model.AppointmentOid2Answer.Value) ?? false); - } - else - { - var first = Model.OpenAppointments.FirstOrDefault(); + var openAppointments = KalenderService.GetAllOpenAppointmentsForEmployee(LoggedInUser.Employee.EmployeeOid).OrderBy(openAppointment => openAppointment.StartDate).ToList(); - if(first != null) - { - Model.Appointment2Answer = first; - Model.AppointmentOid2Answer = first.SchedulerAppointmentOid; - } + var employee2Appointments = new List(); + + foreach(var appointment in openAppointments) + { + // Termine, die von anderen Beantwortet wurden: + employee2Appointments.AddRangeIfElementsNotIn(appointment.EmployeeList.Where(e2a => + appointment.Originator.Equals(Model.LoggedInCompactEmployee) && + false == e2a.Employee.Equals(Model.LoggedInCompactEmployee) && + e2a.IsPChanged && + e2a.IsPC_CheckedTs is null && + e2a.ParticipationAnswer != ParticipationAnswer.Offen && + e2a.ParticipationAnswer != ParticipationAnswer.Verstrichen + )); + + // Termine zum Beantworten: + employee2Appointments.AddRangeIfElementsNotIn(appointment.EmployeeList.Where(e2A => + false == appointment.Originator.Equals(Model.LoggedInCompactEmployee) && + false == e2A.IsPChanged && + e2A.Employee.Equals(Model.LoggedInCompactEmployee) + )); } + + Model.OpenEmployee2AppointmentRels = new List(); + Model.OpenEmployee2AppointmentRelOids = new List(); + + Model.OpenAppointments = openAppointments; + Model.OpenAppointmentOids = openAppointments + .Where(schedulerAppointment => schedulerAppointment.SchedulerAppointmentOid.HasValue) + .Select(schedulerAppointment => schedulerAppointment.SchedulerAppointmentOid.Value) + .ToList(); + + Model.OpenEmployee2AppointmentRels.AddRange(employee2Appointments); + Model.OpenEmployee2AppointmentRelOids = employee2Appointments.Where(w => w.Employee2SchedulerAppointmentOid.HasValue).Select(s => s.Employee2SchedulerAppointmentOid.Value).ToList(); } private List ConvertAbsenceTimesToAppointments(List absenceTimes, List allCustomers, List allEmployees) @@ -356,10 +468,16 @@ namespace BeWoPlanerMobil.Controllers { appointment.CustomerList = AppointmentModel.SelectedCustomers; appointment.ResourceList = AppointmentModel.SelectedResources; - appointment.EmployeeList = AppointmentModel.SelectedEmployee2SchedulerAppointments; + + appointment.EmployeeList = new List(); + + foreach(var selectedEmployee in AppointmentModel.SelectedEmployees ?? new List()) + { + appointment.EmployeeList.Add(new Employee2SchedulerAppointmentDC { Employee = selectedEmployee }); + } appointment.Originator = Model.LoggedInUser.Employee; - + KalenderService.InsertSchedulerAppointment(appointment); ViewData["EditableAppointmentModel"] = appointment; } @@ -399,42 +517,6 @@ namespace BeWoPlanerMobil.Controllers ReloadAppointments(); } - //[HttpPost] - //public ActionResult CustomerMultiSelectPartial(string value) - //{ - // var selectedCustomerOids = GridLookupExtension.GetSelectedValues("CustomerGridLookup") ?? Array.Empty(); - - // AppointmentModel.SelectedCustomerOids = selectedCustomerOids.Where(oid => oid.HasValue).Select(oid => oid.Value).ToList(); - - // return PartialView("CustomerMultiSelectPartial", AppointmentModel); - //} - - //[HttpPost] - //public ActionResult ResourceGridLookupPartial(string value) - //{ - // var selectedResourceOids = GridLookupExtension.GetSelectedValues("ResourceGridLookup") ?? Array.Empty(); - - // AppointmentModel.SelectedResourceOids = selectedResourceOids.Where(oid => oid.HasValue).Select(oid => oid.Value).ToList(); - - // return PartialView("ResourceMultiSelectPartial", AppointmentModel); - //} - - //[HttpPost] - //public ActionResult EmployeeGridLookupPartial(string value) - //{ - // /* - // * Im AppointmentModel müssen die PossibleEmployees bleiben, denn daraus wählt man die Mitarbeiter, die noch nicht mit dem Termin - // * verknüpft sind und es müssen - zumindest beim Bearbeiten - die bereits mit dem Termin verbundenen Mitarbeiter-zu-Termin-Relationen - // * zwischengespeichert werden. - // * - // */ - // var selectedEmployeeOids = GridLookupExtension.GetSelectedValues("EmployeeGridLookup") ?? Array.Empty(); - - // AppointmentModel.SelectedEmployeeOids = selectedEmployeeOids.Where(oid => oid.HasValue).Select(oid => oid.Value).ToList(); - - // return PartialView("EmployeeMultiSelectPartial", AppointmentModel); - //} - [Authorize] public string SelectActiveViewType(string viewTypeName) { @@ -467,11 +549,510 @@ namespace BeWoPlanerMobil.Controllers case "Reload": ReloadAppointments(); break; + case "debug_DummyAppointments": + CreateDummyAppointments(); + break; } return PartialView("SchedulerPagePartial", Model); } + private void CreateDummyAppointments() + { + var today = DateTime.Today; + + var day1 = today; + var day2 = day1.AddDays(1); + + switch(day2.DayOfWeek) + { + case DayOfWeek.Saturday: + day2 = day1.AddDays(-2); // Samstag -> Donnerstag + break; + case DayOfWeek.Sunday: + day2 = day1.AddDays(-3); // Sonntag -> Donnerstag + break; + } + + var day3 = day2.AddDays(1); + + switch(day3.DayOfWeek) + { + case DayOfWeek.Saturday: + day3 = day2.AddDays(-2); // Samstag -> Donnerstag + break; + case DayOfWeek.Sunday: + day3 = day2.AddDays(-3); // Sonntag -> Donnerstag + break; + } + + var employees = EmployeeService.GetAllCompactEmployees(); + var customers = CustomerService.GetAllCompactCustomers(); + var resources = KalenderService.GetAllResources(); + + var ich = Model.LoggedInCompactEmployee; + var nichtIch = employees.First(employee => employee.EmployeeOid != ich.EmployeeOid); + var weiterer = employees.First(employee => employee.EmployeeOid != ich.EmployeeOid && employee.EmployeeOid != nichtIch.EmployeeOid); + + var eigenerKlient = customers.FirstOrDefault(customer => ich.RelatedCustomerOIDList.Contains(customer.CustomerOid)); + var fremderKlient = customers.FirstOrDefault(customer => ich.RelatedCustomerOIDList.Contains(customer.CustomerOid) is false); + var ressource = resources.FirstOrDefault(); + var ressource2 = resources.Count > 1 ? resources[1] : ressource; + + var nichtIchsKlient = customers.FirstOrDefault(customer => nichtIch.RelatedCustomerOIDList.Contains(customer.CustomerOid)); + var nichtIchsFremderKlient = customers.FirstOrDefault(customer => nichtIch.RelatedCustomerOIDList.Contains(customer.CustomerOid) is false); + + // 1a) Einfacher eigener Termin + var apt_1a = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(8,0,0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(9,0,0), + Subject = "Einfacher eigener Termin", + Location = "Datenbank", + Originator = ich, + Description = "Einfacher eigener Termin" + }; + + + // 1b) mit Mitarbeiter + var apt_1b = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(9, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(10, 0, 0), + Subject = "mit Mitarbeiter", + Location = "Datenbank", + Originator = ich, + Description = "mit Mitarbeiter", + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + } + }; + + + // 1c) mit eigenem Klient + var apt_1c = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(10, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(11, 0, 0), + Subject = "mit eigenem Klient", + Location = "Datenbank", + Originator = ich, + Description = "mit eigenem Klient", + CustomerList = new List{ eigenerKlient } + }; + + + // 1d) mit fremdem Klient + var apt_1d = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(11, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(12, 0, 0), + Subject = "mit fremdem Klient", + Location = "Datenbank", + Originator = ich, + Description = "mit fremdem Klient", + CustomerList = new List{ fremderKlient } + }; + + + // 1e) mit Ressource + var apt_1e = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(12, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(13, 0, 0), + Subject = "mit Ressource", + Location = "Datenbank", + Originator = ich, + Description = "mit Ressource", + ResourceList = new List{ ressource } + }; + + + // 1f) mit Mitarbeiter, eigenem Klient + var apt_1f = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(13, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(14, 0, 0), + Subject = "mit Mitarbeiter, eigenem Klient", + Location = "Datenbank", + Originator = ich, + Description = "mit Mitarbeiter, eigenem Klient", + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { eigenerKlient } + }; + + + // 1g) mit Mitarbeiter, fremdem Klient + var apt_1g = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(14, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(15, 0, 0), + Subject = "mit Mitarbeiter, fremdem Klient", + Location = "Datenbank", + Originator = ich, + Description = "mit Mitarbeiter, fremdem Klient", + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { fremderKlient } + }; + + + // 1h) mit eigenem Klient, Ressource + var apt_1h = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(15, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(16, 0, 0), + Subject = "mit eigenem Klient, Ressource", + Location = "Datenbank", + Originator = ich, + Description = "mit eigenem Klient, Ressource", + CustomerList = new List { eigenerKlient }, + ResourceList = new List { ressource } + }; + + + // 1i) mit fremdem Klient, Ressource + var apt_1i = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(16, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(17, 0, 0), + Subject = "mit fremdem Klient, Ressource", + Location = "Datenbank", + Originator = ich, + Description = "mit fremdem Klient, Ressource", + CustomerList = new List { fremderKlient }, + ResourceList = new List { ressource } + }; + + + // 1j) mit Mitarbeiter, eigenem Klient, Ressource + var apt_1j = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(17, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(18, 0, 0), + Subject = "mit Mitarbeiter, eigenem Klient, Ressource", + Location = "Datenbank", + Originator = ich, + Description = "mit Mitarbeiter, eigenem Klient, Ressource", + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { eigenerKlient }, + ResourceList = new List { ressource } + }; + + + // 1k) mit Mitarbeiter, fremdem Klient, Ressource + var apt_1k = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(18, 0, 0), + EndDate = day1.MergeDateWithHoursMinutesSeconds(19, 0, 0), + Subject = "mit Mitarbeiter, fremdem Klient, Ressource", + Location = "Datenbank", + Originator = ich, + Description = "mit Mitarbeiter, fremdem Klient, Ressource", + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { fremderKlient }, + ResourceList = new List { ressource } + }; + + + // ----------------------------------------------------------------------------- + // 2a) einfach + var apt_2a = new SchedulerAppointmentDC + { + StartDate = day1.MergeDateWithHoursMinutesSeconds(19), + EndDate = day1.MergeDateWithHoursMinutesSeconds(20), + Subject = "einfach", + Location = "Datenbank", + Originator = nichtIch, + Description = "einfach" + }; + + // 2b) mit Mitarbeiter + var apt_2b = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(8), + EndDate = day2.MergeDateWithHoursMinutesSeconds(9), + Subject = "mit Mitarbeiter", + Location = "Datenbank", + Description = "mit Mitarbeiter", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = weiterer } + } + }; + + // 2c) mit angemeldetem Mitarbeiter + var apt_2c = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(9), + EndDate = day2.MergeDateWithHoursMinutesSeconds(10), + Subject = "mit angemeldetem Mitarbeiter", + Location = "Datenbank", + Description = "mit angemeldetem Mitarbeiter", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + } + }; + + // 2d) mit eigenem Klient + var apt_2d = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(10), + EndDate = day2.MergeDateWithHoursMinutesSeconds(11), + Subject = "mit eigenem Klient", + Location = "Datenbank", + Description = "mit eigenem Klient", + Originator = nichtIch, + CustomerList = new List { nichtIchsKlient } + }; + + // 2e) mit fremdem Klient + var apt_2e = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(11), + EndDate = day2.MergeDateWithHoursMinutesSeconds(12), + Subject = "mit fremdem Klient", + Location = "Datenbank", + Description = "mit fremdem Klient", + Originator = nichtIch, + CustomerList = new List { nichtIchsFremderKlient } + }; + + // 2f) mit Ressource + var apt_2f = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(12), + EndDate = day2.MergeDateWithHoursMinutesSeconds(13), + Subject = "mit Ressource", + Location = "Datenbank", + Description = "mit Ressource", + Originator = nichtIch, + ResourceList = new List{ ressource2 } + }; + + // 2g) mit Mitarbeiter, eigenem Klient + var apt_2g = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(13), + EndDate = day2.MergeDateWithHoursMinutesSeconds(14), + Subject = "mit Mitarbeiter, eigenem Klient", + Location = "Datenbank", + Description = "mit Mitarbeiter, eigenem Klient", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = weiterer } + }, + CustomerList = new List { nichtIchsKlient } + }; + + // 2h) mit Mitarbeiter, fremdem Klient + var apt_2h = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(14), + EndDate = day2.MergeDateWithHoursMinutesSeconds(15), + Subject = "mit Mitarbeiter, fremdem Klient", + Location = "Datenbank", + Description = "mit Mitarbeiter, fremdem Klient", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = weiterer } + }, + CustomerList = new List { nichtIchsFremderKlient } + }; + + // 2i) mit eigenem Klient, Ressource + var apt_2i = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(15), + EndDate = day2.MergeDateWithHoursMinutesSeconds(16), + Subject = "mit eigenem Klient, Ressource", + Location = "Datenbank", + Description = "mit eigenem Klient, Ressource", + Originator = nichtIch, + CustomerList = new List{ nichtIchsKlient }, + ResourceList = new List{ ressource2 } + }; + + // 2j) mit fremdem Klient, Ressource + var apt_2j = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(16), + EndDate = day2.MergeDateWithHoursMinutesSeconds(17), + Subject = "mit fremdem Klient, Ressource", + Location = "Datenbank", + Description = "mit fremdem Klient, Ressource", + Originator = nichtIch, + CustomerList = new List { nichtIchsFremderKlient }, + ResourceList = new List { ressource2 } + }; + + // 2k) mit Mitarbeiter, eigenem Klient, Ressource + var apt_2k = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(17), + EndDate = day2.MergeDateWithHoursMinutesSeconds(18), + Subject = "mit Mitarbeiter, eigenem Klient, Ressource", + Location = "Datenbank", + Description = "mit Mitarbeiter, eigenem Klient, Ressource", + Originator = nichtIch + }; + + // 2l) mit Mitarbeiter, fremdem Klient, Ressource + var apt_2l = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(18), + EndDate = day2.MergeDateWithHoursMinutesSeconds(19), + Subject = "mit Mitarbeiter, fremdem Klient, Ressource", + Location = "Datenbank", + Description = "mit Mitarbeiter, fremdem Klient, Ressource", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = weiterer } + }, + CustomerList = new List { nichtIchsFremderKlient }, + ResourceList = new List { ressource2 } + }; + + // 2m) mit angemeldetem Mitarbeiter, dessen Klient + var apt_2m = new SchedulerAppointmentDC + { + StartDate = day2.MergeDateWithHoursMinutesSeconds(19), + EndDate = day2.MergeDateWithHoursMinutesSeconds(20), + Subject = "mit angemeldetem Mitarbeiter, dessen Klient", + Location = "Datenbank", + Description = "mit angemeldetem Mitarbeiter, dessen Klient", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { eigenerKlient } + }; + + // 2n) mit angemeldetem Mitarbeiter, diesem fremdem Klient + var apt_2n = new SchedulerAppointmentDC + { + StartDate = day3.MergeDateWithHoursMinutesSeconds(8), + EndDate = day3.MergeDateWithHoursMinutesSeconds(9), + Subject = "mit angemeldetem Mitarbeiter, diesem fremdem Klient", + Location = "Datenbank", + Description = "mit angemeldetem Mitarbeiter, diesem fremdem Klient", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { fremderKlient } + }; + + // 2o) mit angemeldetem Mitarbeiter, dessen Klient, Ressource + var apt_2o = new SchedulerAppointmentDC + { + StartDate = day3.MergeDateWithHoursMinutesSeconds(9), + EndDate = day3.MergeDateWithHoursMinutesSeconds(10), + Subject = "mit angemeldetem Mitarbeiter, dessen Klient, Ressource", + Location = "Datenbank", + Description = "mit angemeldetem Mitarbeiter, dessen Klient, Ressource", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { eigenerKlient }, + ResourceList = new List{ ressource } + }; + + // 2p) mit angemeldetem Mitarbeiter, diesem fremdem Klient, Ressource + var apt_2p = new SchedulerAppointmentDC + { + StartDate = day3.MergeDateWithHoursMinutesSeconds(10), + EndDate = day3.MergeDateWithHoursMinutesSeconds(11), + Subject = "mit angemeldetem Mitarbeiter, diesem fremdem Klient, Ressource", + Location = "Datenbank", + Description = "mit angemeldetem Mitarbeiter, diesem fremdem Klient, Ressource", + Originator = nichtIch, + EmployeeList = new List + { + new Employee2SchedulerAppointmentDC { Employee = nichtIch }, + new Employee2SchedulerAppointmentDC { Employee = ich } + }, + CustomerList = new List { fremderKlient }, + ResourceList = new List { ressource } + }; + + var appointmentsToInsert = new List + { + apt_1a, + apt_1b, + apt_1c, + apt_1d, + apt_1e, + apt_1f, + apt_1g, + apt_1h, + apt_1i, + apt_1j, + apt_1k, + apt_2a, + apt_2b, + apt_2c, + apt_2d, + apt_2e, + apt_2f, + apt_2g, + apt_2h, + apt_2i, + apt_2j, + apt_2k, + apt_2l, + apt_2m, + apt_2n, + apt_2o, + apt_2p + }; + + foreach(var appointment in appointmentsToInsert) + { + appointment.ActivationType = ActivationTypeId.Active; + } + + KalenderService.InsertSchedulerAppointments(appointmentsToInsert); + + ReloadAppointments(); + } + + [Authorize] private ActionResult ToServiceRecord(string apptID, string actionId, string[] args) { @@ -783,62 +1364,129 @@ namespace BeWoPlanerMobil.Controllers return PartialView("SchedulerPagePartial", Model); } + [Authorize] + public string UnselectAppointment2Answer() + { + Model.AppointmentOidToAnswerOrUpdate = null; + Model.AppointmentToAnswerOrUpdate = null; + + return LeerzeichenFuerGetMethoden; + } + [Authorize] public ActionResult LoadAppointmentToAnswer(long oid) { - Model.Appointment2Answer = Model.OpenAppointments.FirstOrDefault(openAppointment => openAppointment.SchedulerAppointmentOid?.Equals(oid) ?? false); + var relation = Model.OpenEmployee2AppointmentRels.FirstOrDefault(f => f.Employee2SchedulerAppointmentOid.HasValue && f.Employee2SchedulerAppointmentOid.Equals(oid)); - return PartialView("NotificationPopupContent", Model); + if(relation != null) + { + Model.Employee2AppointmentToAnswerOrUpdateRel = relation; + Model.Employee2AppointmentToAnswerOrUpdateRelOid = relation.Employee2SchedulerAppointmentOid; + + var appointment = Model.OpenAppointments.FirstOrDefault(f => f.EmployeeList.Any(a => a.Employee2SchedulerAppointmentOid.Equals(relation.Employee2SchedulerAppointmentOid.Value))); + + if(appointment != null) + { + Model.AppointmentToAnswerOrUpdate = appointment; + Model.AppointmentOidToAnswerOrUpdate = appointment.SchedulerAppointmentOid; + } + } + + return PartialView("SelectedOpenEmployee2AppointmentFormPartial", Model); } [Authorize] public ActionResult AnswerOpenAppointment(int answer) { - var appointment = Model.Appointment2Answer; + var appointmentOid = Model.AppointmentOidToAnswerOrUpdate; + var relationOid = Model.Employee2AppointmentToAnswerOrUpdateRelOid; - var employeeRelation = appointment.EmployeeList.FirstOrDefault(employee2Appointment => employee2Appointment.Employee.EmployeeOid == Model.LoggedInUser.Employee.EmployeeOid); + var appointment = Model.OpenAppointments.FirstOrDefault(f => f.SchedulerAppointmentOid.Equals(appointmentOid)); + var relation = Model.OpenEmployee2AppointmentRels.FirstOrDefault(f => f.Employee2SchedulerAppointmentOid.Equals(relationOid)); - if(employeeRelation != null) + if(relation is null) { - employeeRelation.ParticipationAnswer = (ParticipationAnswer) answer; - employeeRelation.IsPChanged = true; - employeeRelation.IsPC_CheckedTs = DateTime.Now; + throw new ArgumentNullException(nameof(relation), "Das Employee2NewSchedulerAppointmentDC-Objekt ist in der Funktion 'AnswerOpenAppointment' wider Erwarten null!"); } - KalenderService.UpdateSchedulerAppointments(new List { appointment }); + if(appointment is null) + { + throw new ArgumentNullException(nameof(appointment), "Das SchedulerAppointmentDC-Objekt ist in der Funktion 'AnswerOpenAppointment' wider Erwarten null!"); + } - Model.Appointment2Answer = null; - Model.AppointmentOid2Answer = null; + if(answer == 5) + { + relation.IsPC_CheckedTs = DateTime.Now; + } + else + { + var participationAnswer = (ParticipationAnswer) answer; + + relation.ParticipationAnswer = participationAnswer; + relation.IsPChanged = true; + } + + KalenderService.UpdateEmployee2SchedulerAppointments(new List { relation }); + + Model.AppointmentOidToAnswerOrUpdate = null; + Model.Employee2AppointmentToAnswerOrUpdateRelOid = null; ReloadAppointments(); return PartialView("NotificationsPopupContent", Model); } + [Authorize] + public ActionResult ReloadOpenAppointments() + { + ReloadAppointments(); + + return PartialView("OpenEmployee2AppointmentListPartial", Model); + } + [Authorize] public ActionResult ConfirmAllOpenAppointments() { - Model.OpenAppointments = KalenderService.GetAllOpenAppointmentsForEmployee(Model.LoggedInUser.Employee.EmployeeOid); + var rels = Model.OpenEmployee2AppointmentRels; - foreach(var openAppointment in Model.OpenAppointments) + var appointmentOids = rels + .Where(employee2Appointment => employee2Appointment.SchedulerAppointmentOid.HasValue) + .Select(employee2Appointment => employee2Appointment.SchedulerAppointmentOid.Value) + .ToList(); + + var appointments = Model.OpenAppointments.Where(appointment => appointment.SchedulerAppointmentOid.HasValue && appointmentOids.Contains(appointment.SchedulerAppointmentOid.Value)).ToList(); + + foreach(var appointment in appointments) { - var employee2Appointment = openAppointment.EmployeeList.First(first => first.Employee.Equals(Model.LoggedInUser.Employee)); - - employee2Appointment.ParticipationAnswer = openAppointment.EndDate is null || openAppointment.EndDate > DateTime.Now ? ParticipationAnswer.Zusage : ParticipationAnswer.Verstrichen; - employee2Appointment.IsPChanged = true; - employee2Appointment.IsPC_CheckedTs = DateTime.Now; + foreach(var employee2Appointment in appointment.EmployeeList) + { + if(employee2Appointment.Employee.Equals(Model.LoggedInCompactEmployee)) + { + employee2Appointment.IsPChanged = true; + employee2Appointment.ParticipationAnswer = ParticipationAnswer.Zusage; + } + } } - KalenderService.UpdateSchedulerAppointments(Model.OpenAppointments); - - Model.Appointment2Answer = null; - Model.AppointmentOid2Answer = null; + KalenderService.UpdateSchedulerAppointments(appointments); ReloadAppointments(); return PartialView("NotificationsPopupContent", Model); } + [Authorize] + public string GetOpenEmp2AppRelCount() + { + return JsonConvert.SerializeObject(Model.OpenEmployee2AppointmentRelOids.Count); + } + + [Authorize] + public ActionResult UpdateOpenEmp2AppCount() + { + return PartialView("NotificationsLinkPartial", Model); + } + [Authorize] public ActionResult RightClickConfirm(int answer, long id) { @@ -890,16 +1538,24 @@ namespace BeWoPlanerMobil.Controllers var selectedEmployeeOids = selectedOids.Length == 0 ? new List() : selectedOids.Split(',').Select(long.Parse).ToList(); - AppointmentModel.SelectedEmployee2SchedulerAppointments = new List(); + var relationsToKeep = AppointmentModel.SelectedEmployee2SchedulerAppointments?.Where(e2A => selectedEmployeeOids.Contains(e2A.Employee.EmployeeOid)).ToList() ?? new List(); - var employees = AppointmentModel.PossibleEmployees.Where(possibleEmployee => selectedEmployeeOids.Contains(possibleEmployee.EmployeeOid)).ToList(); + var newlySelectedEmployeeOids = selectedEmployeeOids.Except(relationsToKeep.Select(e2A => e2A.Employee.EmployeeOid)); + + AppointmentModel.SelectedEmployee2SchedulerAppointments = new List(relationsToKeep); + + var oids = AppointmentModel.PossibleEmployees.Where(e => selectedEmployeeOids.Contains(e.EmployeeOid)).Select(e => e.EmployeeOid).ToList(); + + var employees = AppointmentModel.PossibleEmployees.Where(possibleEmployee => newlySelectedEmployeeOids.Contains(possibleEmployee.EmployeeOid)).ToList(); foreach(var employee in employees) { AppointmentModel.SelectedEmployee2SchedulerAppointments.Add(new Employee2SchedulerAppointmentDC { Employee = employee }); } - return LeerzeichenFuerGetMethoden; + AppointmentModel.SelectedEmployeeOids = oids; + + return JsonConvert.SerializeObject(AppointmentModel.SelectedEmployee2SchedulerAppointments?.Count ?? 0); } [Authorize] @@ -912,7 +1568,7 @@ namespace BeWoPlanerMobil.Controllers AppointmentModel.SelectedCustomerOids = selectedOids.Length == 0 ? new List() : selectedOids.Split(',').Select(long.Parse).ToList(); - return LeerzeichenFuerGetMethoden; + return JsonConvert.SerializeObject(AppointmentModel.SelectedCustomerOids?.Count ?? 0); } [Authorize] @@ -925,7 +1581,7 @@ namespace BeWoPlanerMobil.Controllers AppointmentModel.SelectedResourceOids = selectedOids.Length == 0 ? new List() : selectedOids.Split(',').Select(long.Parse).ToList(); - return LeerzeichenFuerGetMethoden; + return JsonConvert.SerializeObject(AppointmentModel.SelectedResourceOids?.Count ?? 0); } } diff --git a/BeWoPlanerMobil/Controllers/DevToolsController.cs b/BeWoPlanerMobil/Controllers/DevToolsController.cs index 1fd7cfa8c..4b59d6de0 100644 --- a/BeWoPlanerMobil/Controllers/DevToolsController.cs +++ b/BeWoPlanerMobil/Controllers/DevToolsController.cs @@ -1,34 +1,75 @@ -using System.Web.Mvc; -using BeWoPlanerMobil.Models; +using BeWoPlanerMobil.Models; using BeWoPlanerMobil.Service; using Bogus; +using BS.Shared.Core; using BS.Shared.DataContracts; +using System.Web.Mvc; namespace BeWoPlanerMobil.Controllers { public class DevToolsController : AbstractBaseController { + /* + private DevExpressSchedulerModel _Model; + public DevExpressSchedulerModel Model + { + get + { + if(false == MobileSessionFacade.IsUserLoggedIn()) + { + Logout(); + return null; + } + + if(_Model != null) + { + return _Model; + } + + _Model = new DevExpressSchedulerModel(); + InitModel(_Model); + InitViewModel(); + + return _Model; + } + } + */ + private DevToolsModel _Model; public DevToolsModel Model { get { - if(!MobileSessionFacade.IsUserLoggedIn()) + if(MobileSessionFacade.IsUserLoggedIn() is false) { Logout(); return null; } - if(_Model is null) + if(_Model != null) { - _Model = new DevToolsModel(); - InitModel(_Model); + return _Model; } + _Model = new DevToolsModel(); + InitModel(_Model); + InitViewModel(); + return _Model; } } + public void InitViewModel() + { + Model.Employees = EmployeeService.GetAllCompactEmployees(); + Model.Customers = CustomerService.GetAllCompactCustomers(); + Model.Resources = KalenderService.GetAllResources(); + + var mandatorSettings = new MandatorSettings(Model.Mandator.Settings); + + + } + [Authorize] public ActionResult DevTools() { diff --git a/BeWoPlanerMobil/Controllers/MainController.cs b/BeWoPlanerMobil/Controllers/MainController.cs index bc8ef60dd..30e32a42b 100644 --- a/BeWoPlanerMobil/Controllers/MainController.cs +++ b/BeWoPlanerMobil/Controllers/MainController.cs @@ -264,7 +264,6 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedSupportConceptListObject = Model.SupportConceptListObjects.FirstOrDefault(f => f.CostBearer2SupportConceptOid == -1) ?? Model.SupportConceptListObjects.First(); Model.SelectedCostBearerSupportConceptOid = -1; - } else { @@ -1667,7 +1666,6 @@ namespace BeWoPlanerMobil.Controllers { var sc = GetCompactSupportConcept(mokSupportConceptListObject.SupportConceptOid, selectedCostbearerScRelOid); Model.NewServiceRecord.SupportConcept = sc; - Model.NewServiceRecord.Customer = sc.Customer; diff --git a/BeWoPlanerMobil/Global.asax.cs b/BeWoPlanerMobil/Global.asax.cs index 9df8e6a32..f66a4d2f7 100644 --- a/BeWoPlanerMobil/Global.asax.cs +++ b/BeWoPlanerMobil/Global.asax.cs @@ -35,7 +35,7 @@ namespace BeWoPlanerMobil XmlConfigurator.Configure(); } - protected void Application_BeginRequest(object sender, EventArgs e) + protected void Application_BeginRequest(object sender, EventArgs e) { ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; diff --git a/BeWoPlanerMobil/Models/AbstractModel.cs b/BeWoPlanerMobil/Models/AbstractModel.cs index 1ea7a92d8..dfb009623 100644 --- a/BeWoPlanerMobil/Models/AbstractModel.cs +++ b/BeWoPlanerMobil/Models/AbstractModel.cs @@ -371,6 +371,24 @@ namespace BeWoPlanerMobil.Models public bool HasRightToViewPersonDocuments => CheckForAtLeastOneRight(new[] { UserRightType.ViewAll, UserRightType.DokumentePersonen }); public bool HasRightToViewPersonUmfeld => CheckForAtLeastOneRight(new[] { UserRightType.ViewAll, UserRightType.Person_FamilyView }); + #region Kalenderrechte + + public bool HasRightKalenderAnsehen => CheckRight(UserRightType.KalenderAnsehen); public bool HasRightKalenderMitarbeitertermineAnsehen => CheckRight(UserRightType.KalenderMitarbeitertermineAnsehen); + public bool HasRightKalenderMitarbeiterTermineAnlegen => CheckRight(UserRightType.KalenderMitarbeitertermineAnlegen); + public bool HasRightKalenderMitarbeiterTermineAendern => CheckRight(UserRightType.KalenderMitarbeitertermineAendern); + + public bool HasRightKalenderKliententermineAnsehen => CheckRight(UserRightType.KalenderKliententermineAlleAnsehen); + public bool HasRightKalenderKlientenTermineAnlegen => CheckRight(UserRightType.KalenderKliententermineAnlegen); + public bool HasRightKalenderKlientenTermineAendern => CheckRight(UserRightType.KalenderKliententermineAendern); + public bool HasRightKalenderRessourcentermineAnsehen => CheckRight(UserRightType.KalenderRessourcentermineAnsehen); + public bool HasRightKalenderRessourcenTermineAnlegen => CheckRight(UserRightType.KalenderRessourcentermineAnlegen); + public bool HasRightKalenderRessourcenTermineAendern => CheckRight(UserRightType.KalenderRessourcentermineAendern); + public bool HasRightKalenderRessourcenTermineAndererAendern => CheckRight(UserRightType.KalenderRessourcentermineAndererAendern); + + public bool HasRightKalenderInZeiterfassungUebernehmen => CheckRight(UserRightType.KalenderInZeiterfassungUebernehmen); + public bool HasRightKalenderInAbwesenheitUebernehmen => CheckRight(UserRightType.KalenderInAbwesenheitenUebernehmen); + + #endregion } } diff --git a/BeWoPlanerMobil/Models/AppointmentModel.cs b/BeWoPlanerMobil/Models/AppointmentModel.cs index 4717ba820..83261653b 100644 --- a/BeWoPlanerMobil/Models/AppointmentModel.cs +++ b/BeWoPlanerMobil/Models/AppointmentModel.cs @@ -32,6 +32,9 @@ namespace BeWoPlanerMobil.Models public string CompletedUser { get; set; } public string TaskDescription { get; set; } public bool HasServiceRecordEntry { get; set; } + public long? OriginatorOid { get; set; } + + public bool ShowEmployeeColors { get; set; } public List ServiceRecordList { get; set; } #region Mitarbeiter @@ -51,10 +54,10 @@ namespace BeWoPlanerMobil.Models set => AppointmentSessionModel.SelectedEmployeeOids = value; } - public List SelectedEmployees2Appointments + public List SelectedEmployee2AppointmentOids { - get => AppointmentSessionModel.SelectedEmployees2Appointments; - set => AppointmentSessionModel.SelectedEmployees2Appointments = value; + get => AppointmentSessionModel.SelectedEmployees2AppointmentOids; + set => AppointmentSessionModel.SelectedEmployees2AppointmentOids = value; } #endregion @@ -121,12 +124,47 @@ namespace BeWoPlanerMobil.Models SessionModel = new AppointmentSessionModel(); } - public AppointmentModel(List possibleCustomers, List possibleResources, List possibleEmployees) + public AppointmentModel(List possibleCustomers, List possibleResources, List possibleEmployees, UserDC user, List selectedCustomers, List selectedResources, List employee2Appointments) { + LoggedInUser = user; + + SessionModel = new AppointmentSessionModel(); + + SelectedCustomers = selectedCustomers; + SelectedCustomerOids = selectedCustomers.Select(customer => customer.CustomerOid).ToList(); + + SelectedEmployee2SchedulerAppointments = employee2Appointments; + SelectedEmployee2AppointmentOids = employee2Appointments + .Where(employee2Appointment => employee2Appointment.Employee2SchedulerAppointmentOid.HasValue) + .Select(employee2Appointment => employee2Appointment.Employee2SchedulerAppointmentOid.Value).ToList(); + + SelectedEmployees = employee2Appointments.Select(employee2Appointment => employee2Appointment.Employee).ToList(); + SelectedEmployeeOids = employee2Appointments.Select(employee2Appointment => employee2Appointment.Employee.EmployeeOid).ToList(); + + SelectedResources = selectedResources; + SelectedResourceOids = selectedResources + .Where(resource => resource.ResourceOid.HasValue) + .Select(resource => resource.ResourceOid.Value).ToList(); + PossibleCustomers = possibleCustomers; PossibleResources = possibleResources; PossibleEmployees = possibleEmployees; + if(PossibleCustomers.Count == 0 && selectedCustomers.Count > 0) + { + PossibleCustomers = selectedCustomers; + } + + if(PossibleResources.Count == 0 && selectedResources.Count > 0) + { + PossibleResources = selectedResources; + } + + if(PossibleEmployees.Count == 0 && SelectedEmployees.Count > 0) + { + PossibleEmployees = SelectedEmployees; + } + ResourceCategories2Resources = new Dictionary>(); foreach(var resource in PossibleResources) @@ -134,7 +172,7 @@ namespace BeWoPlanerMobil.Models ResourceCategories2Resources.AddOrUpdateValueInDictionary(resource.ResourceCategory, resource); } - SessionModel = new AppointmentSessionModel(); + } public AppointmentModel(SchedulerAppointmentDC appointment) @@ -172,6 +210,8 @@ namespace BeWoPlanerMobil.Models CompletedNotice = appointment.CompletedNotice; CompletedUser = appointment.CompletedUser; TaskDescription = appointment.TaskDescription; + + OriginatorOid = appointment.Originator.EmployeeOid; } public virtual void Assign(AppointmentModel source) @@ -208,6 +248,8 @@ namespace BeWoPlanerMobil.Models CompletedNotice = source.CompletedNotice; CompletedUser = source.CompletedUser; TaskDescription = source.TaskDescription; + + OriginatorOid = source.OriginatorOid; } } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Models/AppointmentSessionModel.cs b/BeWoPlanerMobil/Models/AppointmentSessionModel.cs index 50d7814be..3e7d5bc09 100644 --- a/BeWoPlanerMobil/Models/AppointmentSessionModel.cs +++ b/BeWoPlanerMobil/Models/AppointmentSessionModel.cs @@ -8,7 +8,8 @@ namespace BeWoPlanerMobil.Models public List SelectedCustomerOids { get; set; } public List SelectedResourceOids { get; set; } - public List SelectedEmployees2Appointments { get; set; } = new List(); + public List SelectedEmployees2AppointmentOids { get; set; } = new List(); + public override void ResetValues() { @@ -17,7 +18,7 @@ namespace BeWoPlanerMobil.Models SelectedCustomerOids = new List(); SelectedEmployeeOids = new List(); SelectedResourceOids = new List(); - SelectedEmployees2Appointments = new List(); + SelectedEmployees2AppointmentOids = new List(); } } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs b/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs index 7d5f8d1c9..5719fc229 100644 --- a/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs +++ b/BeWoPlanerMobil/Models/DevExpressSchedulerModel.cs @@ -1,5 +1,7 @@ -using System.Collections; +using System; +using System.Collections; using System.Collections.Generic; +using System.Linq; using BeWoPlanerMobil.Util.SchedulerUtils; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; @@ -13,6 +15,8 @@ namespace BeWoPlanerMobil.Models { SessionModel = new DevExpressSchedulerSessionModel(); SessionModel.ResetValues(); + + ShowEmployeeColors = true; } public SchedulerViewType CurrentViewType @@ -69,13 +73,6 @@ namespace BeWoPlanerMobil.Models return null; } - public long? AppointmentOid2Answer - { - get => DevExpressSchedulerSessionModel.AppointmentOid2Answer; - set => DevExpressSchedulerSessionModel.AppointmentOid2Answer = value; - } - public SchedulerAppointmentDC Appointment2Answer { get; set; } - public List SelectedEmployeeOidsForFiltering { get => DevExpressSchedulerSessionModel.SelectedEmployeeOidsForFiltering; @@ -155,7 +152,13 @@ namespace BeWoPlanerMobil.Models #region Benachrichtigungen - public List OpenAppointments { get; set; } + public List OpenEmployee2AppointmentRels { get; set; } + + public List OpenEmployee2AppointmentRelOids + { + get => DevExpressSchedulerSessionModel.OpenEmployee2AppointmentRelOids; + set => DevExpressSchedulerSessionModel.OpenEmployee2AppointmentRelOids = value; + } public List OpenAppointmentOids { @@ -163,8 +166,41 @@ namespace BeWoPlanerMobil.Models set => DevExpressSchedulerSessionModel.OpenAppointmentOids = value; } - public int NotificationCount => OpenAppointmentOids?.Count ?? 0; + public List OpenAppointments { get; set; } + + public SchedulerAppointmentDC AppointmentToAnswerOrUpdate { get; set; } + + public long? AppointmentOidToAnswerOrUpdate + { + get => DevExpressSchedulerSessionModel.AppointmentOidToAnswerOrUpdate; + set => DevExpressSchedulerSessionModel.AppointmentOidToAnswerOrUpdate = value; + } + + public Employee2SchedulerAppointmentDC Employee2AppointmentToAnswerOrUpdateRel { get; set; } + + public long? Employee2AppointmentToAnswerOrUpdateRelOid + { + get => DevExpressSchedulerSessionModel.Employee2AppointmentToAnswerOrUpdateRelOid; + set => DevExpressSchedulerSessionModel.Employee2AppointmentToAnswerOrUpdateRelOid = value; + } + + public int NotificationCount => OpenEmployee2AppointmentRelOids.Count; + + public SchedulerAppointmentDC GetAppointment2AnswerByOid(long appointmentOid) + { + return OpenAppointments?.FirstOrDefault(f => f.SchedulerAppointmentOid?.Equals(appointmentOid) ?? false); + } + + public bool CanConfirmAllOpenAppointments() + { + return OpenAppointments?.Any(a => a.EndDate is null || a.EndDate.Value < DateTime.Now) is false; + } #endregion + + public string GetNotificationInfo() + { + return $"{NotificationCount} Benachrichtigung{(NotificationCount == 1 ? string.Empty : "en")}"; + } } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs b/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs index 8979a1800..731adad04 100644 --- a/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs +++ b/BeWoPlanerMobil/Models/DevExpressSchedulerSessionModel.cs @@ -14,8 +14,12 @@ namespace BeWoPlanerMobil.Models public List SelectedCustomerOidsForFiltering { get; set; } public List SelectedResourceOidsForFiltering { get; set; } + + + public List OpenEmployee2AppointmentRelOids { get; set; } public List OpenAppointmentOids { get; set; } - public long? AppointmentOid2Answer { get; set; } + public long? AppointmentOidToAnswerOrUpdate { get; set; } + public bool ShowTasks { get; set; } public bool ShowOnlyPrivateAppointments { get; set; } @@ -26,7 +30,8 @@ namespace BeWoPlanerMobil.Models public bool ShowEmployeeColors { get; set; } public bool ShowOnlyMyOwnAppointments { get; set; } - public int NotificationCount => OpenAppointmentOids?.Count ?? 0; + public int NotificationCount => OpenEmployee2AppointmentRelOids?.Count ?? 0; + public long? Employee2AppointmentToAnswerOrUpdateRelOid { get; set; } public override void ResetValues() { @@ -40,6 +45,7 @@ namespace BeWoPlanerMobil.Models SelectedCustomerOidsForFiltering = new List(); SelectedResourceOidsForFiltering = new List(); + OpenEmployee2AppointmentRelOids = new List(); OpenAppointmentOids = new List(); ShowTasks = false; @@ -50,6 +56,8 @@ namespace BeWoPlanerMobil.Models ShowAbsenceTimes = false; ShowEmployeeColors = false; ShowOnlyMyOwnAppointments = false; + AppointmentOidToAnswerOrUpdate = null; + Employee2AppointmentToAnswerOrUpdateRelOid = null; } } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Models/DevToolsModel.cs b/BeWoPlanerMobil/Models/DevToolsModel.cs index 671a1d760..7a30fbf3a 100644 --- a/BeWoPlanerMobil/Models/DevToolsModel.cs +++ b/BeWoPlanerMobil/Models/DevToolsModel.cs @@ -18,7 +18,20 @@ namespace BeWoPlanerMobil.Models public List UserRightTypes { get; set; } = new List(); public List Users { get; set; } = new List(); - public MandatorSettings MandatorSettings { get; set; } + public List Resources { get; set; } + + public MandatorSettings MandatorSettings + { + get => DevToolsSessionModel.MandatorSettings; + set => DevToolsSessionModel.MandatorSettings = value; + } + + public DevToolsSessionModel DevToolsSessionModel => SessionModel as DevToolsSessionModel; + + public DevToolsModel() + { + SessionModel = new DevToolsSessionModel(); + } } public class MandatorSettings @@ -97,14 +110,9 @@ namespace BeWoPlanerMobil.Models public bool ShowArbeitszeiten { get; set; } public bool ShowBetrag { get; set; } public bool ShowChat { get; set; } - private bool _ShowCustomerDistanceFields; - public bool ShowCustomerDistanceFields - { - get => _ShowCustomerDistanceFields; + public bool ShowCustomerDistanceFields { get; set; } - set => _ShowCustomerDistanceFields = value; - } public bool ShowDatevFields { get; set; } public bool ShowDienstplanung { get; set; } public bool ShowDistanceFields { get; set; } diff --git a/BeWoPlanerMobil/Models/DevToolsSessionModel.cs b/BeWoPlanerMobil/Models/DevToolsSessionModel.cs new file mode 100644 index 000000000..1d5681d00 --- /dev/null +++ b/BeWoPlanerMobil/Models/DevToolsSessionModel.cs @@ -0,0 +1,117 @@ +using System.Collections.Generic; + +namespace BeWoPlanerMobil.Models +{ + public class DevToolsSessionModel : BaseSessionModel + { + public List UserGroupOids { get; set; } + public List UserOids { get; set; } + + public MandatorSettings MandatorSettings { get; set; } + + public bool HideServiceRecordInsertedByAndInsertedOn { get; set; } + public bool IsEndDateVisible { get; set; } + public bool IsServiceRecordNoticeMandatory { get; set; } + public bool IsZeiterfassDateNormal { get; set; } + public bool SetStartTimeToEndTimeAfterSave { get; set; } + public bool ShowAdditionalService { get; set; } + public bool ShowAnnualReport { get; set; } + public bool ShowArbeitszeiten { get; set; } + public bool ShowBetrag { get; set; } + public bool ShowChat { get; set; } + + public bool ShowCustomerDistanceFields { get; set; } + + public bool ShowDatevFields { get; set; } + public bool ShowDienstplanung { get; set; } + public bool ShowDistanceFields { get; set; } + public bool ShowEmployeeSignature { get; set; } + public bool ShowHilfeplanBezeichnung { get; set; } + public bool ShowHilfeplanStatistikReport { get; set; } + public bool ShowInfoButtonInCalender { get; set; } + public bool ShowKlientenBetreuungszeiten { get; set; } + public bool ShowMarker { get; set; } + public bool ShowMedication { get; set; } + public bool ShowMultipleResourceColors { get; set; } + public bool ShowOnlyMySupportConcepts { get; set; } + public bool ShowOwnChatSettings { get; set; } + public bool ShowPivotGrid { get; set; } + public bool ShowRoundedDurationInEmployeeAnalysis { get; set; } + public bool ShowRtfTextfield { get; set; } + public bool ShowScheduler { get; set; } + public bool ShowServicesOverviewHalfOrWholeMonth { get; set; } + public bool ShowSignature { get; set; } + public bool ShowTeamNews { get; set; } + public bool ShowUrlaubsplanung { get; set; } + public bool ShowWohnheime { get; set; } + public bool AllowStorno { get; set; } + public bool DontShowSpitzabrechnung { get; set; } + public bool IsOnlyYearMonthVisible { get; set; } + public bool IsPasswordSecurityActiv { get; set; } + public bool PrinterSettingsUseLandscape { get; set; } + public bool PrinterSettingsUseMargins { get; set; } + public bool PrinterSettingsUsePaperKind { get; set; } + public bool ShowResources { get; set; } + public int MaxDaysEditServiceRecordsAllowed { get; set; } + public int ZeiterfassungsSchwellwert { get; set; } + public int AnzTageZeiterfassErfolgt { get; set; } + public int DienstplanungStandardZeilenAnzahl { get; set; } + public int HilfeplanAuslaufAuswahl { get; set; } + public int TimeUntilUILock { get; set; } + public int EinheitZeiterfassung { get; set; } + + public override void ResetValues() + { + base.ResetValues(); + + HideServiceRecordInsertedByAndInsertedOn = false; + IsEndDateVisible = false; + IsServiceRecordNoticeMandatory = false; + IsZeiterfassDateNormal = false; + SetStartTimeToEndTimeAfterSave = false; + ShowAdditionalService = false; + ShowAnnualReport = false; + ShowArbeitszeiten = false; + ShowBetrag = false; + ShowChat = false; + ShowCustomerDistanceFields = false; + ShowDatevFields = false; + ShowDienstplanung = false; + ShowDistanceFields = false; + ShowEmployeeSignature = false; + ShowHilfeplanBezeichnung = false; + ShowHilfeplanStatistikReport = false; + ShowInfoButtonInCalender = false; + ShowKlientenBetreuungszeiten = false; + ShowMarker = false; + ShowMedication = false; + ShowMultipleResourceColors = false; + ShowOnlyMySupportConcepts = false; + ShowOwnChatSettings = false; + ShowPivotGrid = false; + ShowRoundedDurationInEmployeeAnalysis = false; + ShowRtfTextfield = false; + ShowScheduler = false; + ShowServicesOverviewHalfOrWholeMonth = false; + ShowSignature = false; + ShowTeamNews = false; + ShowUrlaubsplanung = false; + ShowWohnheime = false; + AllowStorno = false; + DontShowSpitzabrechnung = false; + IsOnlyYearMonthVisible = false; + IsPasswordSecurityActiv = false; + PrinterSettingsUseLandscape = false; + PrinterSettingsUseMargins = false; + PrinterSettingsUsePaperKind = false; + ShowResources = false; + MaxDaysEditServiceRecordsAllowed = 0; + ZeiterfassungsSchwellwert = 0; + AnzTageZeiterfassErfolgt = 0; + DienstplanungStandardZeilenAnzahl = 0; + HilfeplanAuslaufAuswahl = 0; + TimeUntilUILock = 0; + EinheitZeiterfassung = 0; + } + } +} \ No newline at end of file diff --git a/BeWoPlanerMobil/Service/ASPHibernateSessionManager.cs b/BeWoPlanerMobil/Service/ASPHibernateSessionManager.cs index 8f06b5a6b..02b32e3d1 100644 --- a/BeWoPlanerMobil/Service/ASPHibernateSessionManager.cs +++ b/BeWoPlanerMobil/Service/ASPHibernateSessionManager.cs @@ -9,8 +9,6 @@ using System.Threading; using System.Web; using BeWo.Data.Access; -using BeWo.Data.Entities; -using BeWo.Service.DCEntityMapper; using BeWo.Service.ServiceImplementations; using BeWoPlanerMobil.Util; using BS.Shared; @@ -222,6 +220,7 @@ namespace BeWoPlanerMobil.Service MobileSessionFacade.LoggedInUserOid = user.Oid; MobileSessionFacade.EmployeeFullname = user.Employee.Person.FirstNameLastName; + MobileSessionFacade.LoggedInEmployeeOid = user.Employee.Oid; //MobileSessionFacade.LoggedInEmployee = MapperFactory.EmployeeDC_Employee.MapToNewDC(user.Employee); } diff --git a/BeWoPlanerMobil/Service/MobileSessionFacade.cs b/BeWoPlanerMobil/Service/MobileSessionFacade.cs index cd27e8d2a..8de2f0db9 100644 --- a/BeWoPlanerMobil/Service/MobileSessionFacade.cs +++ b/BeWoPlanerMobil/Service/MobileSessionFacade.cs @@ -45,6 +45,12 @@ namespace BeWoPlanerMobil.Service set => HttpContext.Current.Session["LoggedInUserOid"] = value; } + public static long? LoggedInEmployeeOid + { + get => HttpContext.Current.Session["LoggedInEmployeeOid"] as long?; + set => HttpContext.Current.Session["LoggedInEmployeeOid"] = value; + } + //public static UserDC LoggedInUser //{ // get => HttpContext.Current.Session["apuser"] as UserDC; diff --git a/BeWoPlanerMobil/Util/MobileUtils.cs b/BeWoPlanerMobil/Util/MobileUtils.cs index 7f4c98796..d13893736 100644 --- a/BeWoPlanerMobil/Util/MobileUtils.cs +++ b/BeWoPlanerMobil/Util/MobileUtils.cs @@ -16,6 +16,8 @@ using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Web; +using BeWo.Service.Plugins; +using BeWoPlanerMobil.Service; using static System.Int32; using static System.String; @@ -622,6 +624,13 @@ namespace BeWoPlanerMobil.Util public static string GetLeftAppointmentBorder(DevExpress.XtraScheduler.Appointment appointment) { + var showEmployeeColors = appointment.CustomFields["ShowEmployeeColors"] is true; + + if(false == showEmployeeColors) + { + return "5px solid #C0FFD0"; + } + if(appointment.CustomFields[nameof(SchedulerAppointmentDC.Originator)] is CompactEmployeeDC originator && originator.FilterableBrush?.Color != null) { var color = originator.FilterableBrush.Color; diff --git a/BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentDragToolTip.cshtml b/BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentDragToolTip.cshtml new file mode 100644 index 000000000..5baea0937 --- /dev/null +++ b/BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentDragToolTip.cshtml @@ -0,0 +1,18 @@ +@using BeWoPlanerMobil.Util + + +
+ + + AppointmentDrag + + +
+ Press ESC to cancel operation +
\ No newline at end of file diff --git a/BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentFormPartial.cshtml b/BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentFormPartial.cshtml index 6e39461a1..6e582814a 100644 --- a/BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentFormPartial.cshtml +++ b/BeWoPlanerMobil/Views/DevExpressScheduler/CustomAppointmentFormPartial.cshtml @@ -4,9 +4,86 @@ @using DevExpress.Web.Mvc.UI @{ - Html.EnableClientValidation(); - Html.EnableUnobtrusiveJavaScript(); + Html.EnableClientValidation(); + Html.EnableUnobtrusiveJavaScript(); + var isNew = Model.Oid is null; + + var cancelButtonText = "Abbrechen"; + + var isOriginator = Model.OriginatorOid?.Equals(Model.LoggedInCompactEmployee.EmployeeOid) ?? false; + var isInEmployeeList = Model.SelectedEmployee2SchedulerAppointments.Any(employee2Appointment => employee2Appointment.Employee.Equals(Model.LoggedInCompactEmployee)); + + var hasCustomers = Model.SelectedCustomers.Any(); + var hasEmployees = Model.SelectedEmployee2SchedulerAppointments.Any(); + var hasResources = Model.SelectedResources.Any(); + + var canEditCustomerApt = Model.HasRightKalenderKlientenTermineAendern; + + var canEditEmployeeApt = Model.HasRightKalenderMitarbeiterTermineAendern; + + var canEditResourceApt = Model.HasRightKalenderRessourcenTermineAendern; + var canEditOthersResourceApt = Model.HasRightKalenderRessourcenTermineAndererAendern; + + var areButtonsVisible = true; + + if(isOriginator is false || isNew is false) + { + if(canEditCustomerApt is false && hasCustomers) + { + areButtonsVisible = false; + } + + if(canEditEmployeeApt is false && hasEmployees && isInEmployeeList is false) + { + areButtonsVisible = false; + } + } + + // Es ist eigentlich unmöglich als jemand anderes einen Termin anzulegen, denn der angemeldete Mitarbeiter ist ja immer der InsUser. + if(isOriginator is false && isNew is false) + { + if(canEditOthersResourceApt is false && hasResources) + { + areButtonsVisible = false; + } + } + else if(isNew is false) + { + // Falls man beim Anlegen mehr Rechte hatte als beim Bearbeiten: + if(canEditResourceApt is false && hasResources) + { + areButtonsVisible = false; + } + } + + var disabled = string.Empty; + + if(areButtonsVisible is false) + { + cancelButtonText = "Schließen"; + disabled = "disabled"; + } + + var isDeleteButtonVisible = areButtonsVisible && isNew is false; + + var dateInputType = isNew is false && Model.AllDay ? "date" : "datetime-local"; + + var start = Model.StartTime.HasValue ? Model.AllDay ? $"{Model.StartTime:yyyy-MM-dd}" : $"{Model.StartTime:yyyy-MM-ddTHH:mm}" : string.Empty; + var end = Model.EndTime.HasValue ? Model.AllDay ? $"{Model.EndTime:yyyy-MM-dd}" : $"{Model.EndTime:yyyy-MM-ddTHH:mm}" : string.Empty; + + + var showEmployeeButton = (Model.HasRightKalenderMitarbeitertermineAnsehen && Model.Oid.HasValue) || + (Model.Oid.HasValue && Model.HasRightKalenderMitarbeiterTermineAendern) || + (Model.Oid is null && Model.HasRightKalenderMitarbeiterTermineAnlegen); + + var showCustomerButton = (Model.HasRightKalenderKliententermineAnsehen && Model.Oid.HasValue) || + (Model.Oid.HasValue && Model.HasRightKalenderKlientenTermineAendern) || + (Model.Oid is null && Model.HasRightKalenderKlientenTermineAnlegen); + + var showResourceButton = (Model.HasRightKalenderRessourcentermineAnsehen && Model.Oid.HasValue) || + (Model.Oid.HasValue && (Model.HasRightKalenderRessourcenTermineAendern && isOriginator || isOriginator is false && Model.HasRightKalenderRessourcenTermineAndererAendern)) || + (Model.Oid is null && Model.HasRightKalenderRessourcenTermineAnlegen); } @Html.DevExpress().GetStyleSheets( ASPxWebClientUIControl.ColorSchemeLight, diff --git a/Shared/Core/SchedulerUtils.cs b/Shared/Core/SchedulerUtils.cs index a293f26bb..b7618fa36 100644 --- a/Shared/Core/SchedulerUtils.cs +++ b/Shared/Core/SchedulerUtils.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using BS.Shared.DataContracts; using BS.Shared.Extensions; diff --git a/Shared/DataContracts/SchedulerAppointmentDC.cs b/Shared/DataContracts/SchedulerAppointmentDC.cs index 0bbcfc22d..8f7c672ad 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; } + // Nur im DC, damit man im MoK-Scheduler als CustomField darauf zugreifen kann. + public bool ShowEmployeeColors { get; set; } + public bool CanBeViewed { get; set; } = true; + public bool CanBeDeleted { get; set; } = true; public long? FormerAbsenceTimeOid { get; set; } public DateTime? Krankheitsmeldung { get; set; } public AbsenceReasonDC AbsenceReason { get; set; } diff --git a/Shared/Extensions/DateTimeExtensions.cs b/Shared/Extensions/DateTimeExtensions.cs index 5fe3a3853..120ab3aa2 100644 --- a/Shared/Extensions/DateTimeExtensions.cs +++ b/Shared/Extensions/DateTimeExtensions.cs @@ -614,7 +614,7 @@ namespace BS.Shared.Extensions $"{start.ToShortDateString()} {start.ToShortTimeString()} - {end.ToShortTimeString()}"; } - public static DateTime MergeDateWithHoursMinutesSeconds(this DateTime date, int hours, int minutes, int seconds = 0) + public static DateTime MergeDateWithHoursMinutesSeconds(this DateTime date, int hours, int minutes = 0, int seconds = 0) { var h = hours >= 0 && hours < 24 ? hours : 0; var m = minutes >= 0 && minutes < 60 ? minutes : 0; From c2ff4006a484b47f27c59b2c95e7b590ce3f812e Mon Sep 17 00:00:00 2001 From: Rene Evertz Date: Mon, 29 Jun 2026 13:56:01 +0200 Subject: [PATCH 2/2] fix: ai request mit tenant bezug + ai2 --- AiCoreUnitTest/OllamaFacadeTest.cs | 2 +- Data/SessionFacade.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/AiCoreUnitTest/OllamaFacadeTest.cs b/AiCoreUnitTest/OllamaFacadeTest.cs index f616ce1c2..2eeaf6d36 100644 --- a/AiCoreUnitTest/OllamaFacadeTest.cs +++ b/AiCoreUnitTest/OllamaFacadeTest.cs @@ -18,7 +18,7 @@ namespace AiCoreUnitTest [TestInitialize] public void TestInitialize() { - OllamaUrl = "https://w2.ownchat.de"; + OllamaUrl = "https://ai2.ownsoft.de"; OllamaKey = "mu9ZPuUXJ4aVGLU1WL2RfPCeSMRmJREwyjVJBP7bHfSz8quZRqN7e7UwnwCDi8GZ"; } diff --git a/Data/SessionFacade.cs b/Data/SessionFacade.cs index 7db40cc7b..d1eb47d5f 100644 --- a/Data/SessionFacade.cs +++ b/Data/SessionFacade.cs @@ -42,7 +42,7 @@ namespace BeWo.Data { get { - return HttpContext.Current.Session["tenant"] as string; + return HttpContext.Current?.Session["tenant"] as string; } set