From f682dbde0df7063124d9d1d7e983f9f83d95c9d6 Mon Sep 17 00:00:00 2001 From: Lyndon Jetten Date: Thu, 7 Jan 2021 19:40:15 +0100 Subject: [PATCH] =?UTF-8?q?Mobilklient:=20=20=20=20=20-=20Leistungen=20und?= =?UTF-8?q?=20Kategorien=20werden=20gem=C3=A4=C3=9F=20den=20Einstellungen?= =?UTF-8?q?=20des=20ausgew=C3=A4hlten=20Hilfeplans=20geladen=20und=20angez?= =?UTF-8?q?eigt.=20=20=20=20=20-=20=C3=84nderungen=20an=20der=20Entwickler?= =?UTF-8?q?seite=20(um=20Testdaten=20zu=20erzeugen)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/DevelopmentController.cs | 243 ++++++++++++------ BeWoPlanerMobil/Controllers/MainController.cs | 3 +- Data/Access/SearchDAO.cs | 35 ++- 3 files changed, 198 insertions(+), 83 deletions(-) diff --git a/BeWoPlanerMobil/Controllers/DevelopmentController.cs b/BeWoPlanerMobil/Controllers/DevelopmentController.cs index e50195ebf..455b2665f 100644 --- a/BeWoPlanerMobil/Controllers/DevelopmentController.cs +++ b/BeWoPlanerMobil/Controllers/DevelopmentController.cs @@ -535,6 +535,8 @@ namespace BeWoPlanerMobil.Controllers var originator = Model.AllEmployees.FirstOrDefault(f => f.EmployeeOid.Equals(originatorOid)); + _IntervalStart = start; + // Keine Mitarbeiter, Ressourcen und Klienten ausgewählt -> nur Einzeltermine erstellen /* * Nur Originator (4): @@ -546,6 +548,7 @@ namespace BeWoPlanerMobil.Controllers * Originator und Mitarbeiter (4) * Originator und Ressourcen (4) * Originator und Klienten (4) + * * Originator und Mitarbeiter und Ressourcen (4) * Originator und Mitarbeiter und Klienten (4) * Originator und Ressourcen und Klienten (4) @@ -562,107 +565,189 @@ namespace BeWoPlanerMobil.Controllers * */ - var appointments = new List(); + var app1 = CreateTestAppointment("Normaler Termin", originator); + var app2 = CreateTestAppointment("Normaler, privater Termin", originator, true); + var app3 = CreateTestAppointment("Ganztägiger Termin", originator, false, true); + var app4 = CreateTestAppointment("Ganztägiger, privater Termin", originator, true, true); - var appNormalOnlyOriginator = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(5, 0), start.MergeDateWithHoursMinutesSeconds(6, 0), "Normaler Termin", originator); - - var appPrivateOnlyOriginator = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(6, 15), start.MergeDateWithHoursMinutesSeconds(7, 15), "Normaler, privater Termin", originator); - appPrivateOnlyOriginator.IsPrivate = true; - - var appAllDayOnlyOriginator = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(7, 30), start.MergeDateWithHoursMinutesSeconds(8, 30), "Ganztägiger Termin", originator); - appAllDayOnlyOriginator.AllDay = true; - - var appAllDayPrivateOnlyOriginator = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(8, 45), start.MergeDateWithHoursMinutesSeconds(9, 45), "Ganztägiger, privater Termin", originator); - appAllDayPrivateOnlyOriginator.AllDay = true; - appAllDayPrivateOnlyOriginator.IsPrivate = true; - - appointments.Add(appNormalOnlyOriginator); - appointments.Add(appPrivateOnlyOriginator); - appointments.Add(appAllDayOnlyOriginator); - appointments.Add(appAllDayPrivateOnlyOriginator); + var appointments = new List{app1, app2, app3, app4}; if(Model.SelectedResources.Count > 0) { - var appResourcesNormalOnlyOriginator = CreateTestAppointment( - start.MergeDateWithHoursMinutesSeconds(9, 0), - start.MergeDateWithHoursMinutesSeconds(11, 0), - "Normaler Ressourcentermin", - originator); + var a1 = CreateTestAppointment("Normaler Ressourcentermin", originator); + var a2 = CreateTestAppointment("Normaler, privater Ressourcentermin", originator, true); + var a3 = CreateTestAppointment("Normaler, ganztägiger Ressourcentermin", originator, false, true); + var a4 = CreateTestAppointment("Normaler, ganztägiger, privater Ressourcentermin", originator, true, true); - var appResourcesPrivateOnlyOriginator = CreateTestAppointment( - start.MergeDateWithHoursMinutesSeconds(10, 15), - start.MergeDateWithHoursMinutesSeconds(11, 15), - "Normaler, privater Ressourcentermin", - originator); + var apps = new List { a1, a2, a3, a4 }; - appResourcesPrivateOnlyOriginator.IsPrivate = true; + AddResourcesToAppointments(apps); - var appResourcesAllDayOnlyOriginator = CreateTestAppointment( - start.MergeDateWithHoursMinutesSeconds(11, 30), - start.MergeDateWithHoursMinutesSeconds(12, 30), - "Normaler, ganztägiger Ressourcentermin", - originator); - - appResourcesAllDayOnlyOriginator.AllDay = true; - - var appResourcesAllDayPrivateOnlyOriginator = CreateTestAppointment( - start.MergeDateWithHoursMinutesSeconds(11, 15), - start.MergeDateWithHoursMinutesSeconds(11, 0), - "Normaler, ganztägiger, privater Ressourcentermin", - originator); - - appResourcesAllDayPrivateOnlyOriginator.AllDay = true; - appResourcesAllDayPrivateOnlyOriginator.IsPrivate = true; - - appResourcesNormalOnlyOriginator.ResourceList = Model.SelectedResources; - appResourcesPrivateOnlyOriginator.ResourceList = Model.SelectedResources; - appResourcesAllDayOnlyOriginator.ResourceList = Model.SelectedResources; - appResourcesAllDayPrivateOnlyOriginator.ResourceList = Model.SelectedResources; - - appointments.Add(appResourcesNormalOnlyOriginator); - appointments.Add(appResourcesPrivateOnlyOriginator); - appointments.Add(appResourcesAllDayOnlyOriginator); - appointments.Add(appResourcesAllDayPrivateOnlyOriginator); + appointments.AddRange(apps); } if(Model.SelectedEmployees.Count > 0) { - var a1 = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(10, 0), start.MergeDateWithHoursMinutesSeconds(11, 0), "Normaler Mitarbeitertermin", originator); - var a2 = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(11, 15), start.MergeDateWithHoursMinutesSeconds(12, 15), "Normaler, privater Ressourcentermin", originator); - a2.IsPrivate = true; - var a3 = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(12, 30), start.MergeDateWithHoursMinutesSeconds(13, 30), "Normaler, ganztägiger Ressourcentermin", originator); - a3.AllDay = true; - var a4 = CreateTestAppointment(start.MergeDateWithHoursMinutesSeconds(13, 45), start.MergeDateWithHoursMinutesSeconds(14, 45), "Normaler, ganztägiger und privater Ressourcentermin", originator); - a4.IsPrivate = true; - a4.AllDay = true; + var a1 = CreateTestAppointment("Normaler Mitarbeitertermin", originator); + var a2 = CreateTestAppointment("Normaler, privater Mitarbeitertermin", originator, true); + var a3 = CreateTestAppointment("Normaler, ganztägiger Mitarbeitertermin", originator, false, true); + var a4 = CreateTestAppointment("Normaler, ganztägiger und privater Mitarbeitertermin", originator, true, true); + + var apps = new List {a1, a2, a3, a4}; + + AddEmployeesToAppointments(apps); + + appointments.AddRange(apps); } - /* - * Normal - * Privat - * Ganztägig - * Privat und Ganztägig - */ + if(Model.SelectedCustomers.Count > 0) { + var a1 = CreateTestAppointment("Normaler Kliententermin", originator); + var a2 = CreateTestAppointment("Normaler, privater Kliententermin", originator, true); + var a3 = CreateTestAppointment("Normaler, ganztägiger Kliententermin", originator, false ,true); + var a4 = CreateTestAppointment("Normaler, ganztägiger privater Kliententermin", originator, true, true); + var onlyCustomerAppointments = new List {a1, a2, a3, a4}; + + AddCustomersToAppointments(onlyCustomerAppointments); + + appointments.AddRange(onlyCustomerAppointments); } + appointments.AddRange(CreateEmployeeAndResourceAppointments(originator)); + + if(Model.SelectedEmployees.Count > 0 && Model.SelectedResources.Count > 0) + { + appointments.AddRange(CreateEmployeeAndResourceAppointments(originator)); + } + + /* + * Originator und Mitarbeiter und Ressourcen (4) + * Originator und Mitarbeiter und Klienten (4) + * Originator und Ressourcen und Klienten (4) + * Originator und Mitarbeiter und Ressourcen und Klienten (4) + */ + //KalenderService.InsertSchedulerAppointments(appointments); return View("Development", Model); } - private SchedulerAppointmentDC CreateTestAppointment(DateTime start, DateTime end, string subject, CompactEmployeeDC originator) + private IEnumerable CreateEmployeeAndResourceAppointments(CompactEmployeeDC originator) { + if(Model == null || Model?.SelectedResources?.Count == 0 || Model?.SelectedEmployees?.Count == 0) + { + return new List(); + } + + var a1 = CreateTestAppointment("Termin mit Mitarbeitern und Ressourcen", originator); + var a2 = CreateTestAppointment("Privater Termin mit Mitarbeitern und Ressourcen", originator, true); + var a3 = CreateTestAppointment("Ganztägiger Termin mit Mitarbeitern und Ressourcen", originator, false, true); + var a4 = CreateTestAppointment("Ganztätiger, privater Termin mit Mitarbeitern und Ressourcen", originator, true, true); + + var result = new List { a1, a2, a3, a4 }; + + AddCustomersToAppointments(result); + + AddEmployeesToAppointments(result); + + return result; + } + + private IEnumerable CreateEmployeeAndCustomerAppointments(CompactEmployeeDC originator) + { + if(Model == null || Model?.SelectedCustomers?.Count == 0 || Model?.SelectedEmployees?.Count == 0) + { + return new List(); + } + + var a1 = CreateTestAppointment("Termin mit Mitarbeitern und Klienten", originator); + var a2 = CreateTestAppointment("Privater Termin mit Mitarbeitern und Klienten", originator, true); + var a3 = CreateTestAppointment("Ganztägiger Termin mit Mitarbeitern und Klienten", originator, false, true); + var a4 = CreateTestAppointment("Ganztägiger, privater Termin mit Mitarbeitern und Klienten", originator); + + var result = new List {a1, a2, a3, a4}; + + AddEmployeesToAppointments(result); + + return result; + } + + private void AddEmployeesToAppointments(List appointments) + { + if(Model.SelectedEmployees?.Count == 0) + { + return; + } + + var employee2SchedulerAppointmentList = new List(); + + Model.SelectedEmployees.DoForEach(employee => { employee2SchedulerAppointmentList.AddIfNotIn(new Employee2SchedulerAppointmentDC { Employee = employee }); }); + + appointments.DoForEach(era => era.EmployeeList = employee2SchedulerAppointmentList); + } + + private void AddCustomersToAppointments(IEnumerable appointments) + { + if(Model.SelectedCustomers?.Count == 0) + { + return; + } + + appointments.DoForEach(appointment => appointment.CustomerList = Model.SelectedCustomers); + } + + private void AddResourcesToAppointments(IEnumerable appointments) + { + if(Model.SelectedResources?.Count == 0) + { + return; + } + + appointments.DoForEach(appointment => appointment.ResourceList = Model.SelectedResources); + } + + private static DateTime _IntervalStart; + private static DateTime _AppointmentStart = DateTime.Today.MergeDatesByDate(new DateTime(2000, 1, 1, 6, 0, 0)); + + private static AppointmentDates CalcAppointmentDates(int minHour = 5, int maxHour = 23) + { + var s = _AppointmentStart; + var e = s.AddHours(1); + + var min = s.MergeDateWithHoursMinutesSeconds(minHour, 0); + var max = s.MergeDateWithHoursMinutesSeconds(maxHour, 0); + + var result = new AppointmentDates(s, e); + + if(!s.InBetween(min, max, false) || !e.InBetween(min, max, false)) + { + s = _AppointmentStart.AddDays(1).MergeDateWithHoursMinutesSeconds(minHour, 0); + e = s.AddHours(1); + + result = new AppointmentDates(s, e); + } + + _AppointmentStart = e.AddMinutes(15); + + return result; + } + + private static SchedulerAppointmentDC CreateTestAppointment(string subject, CompactEmployeeDC originator, bool isPrivate = false, bool isAllDay = false) + { + var appointmentDate = CalcAppointmentDates(); + return new SchedulerAppointmentDC { - StartDate = start, - EndDate = end, + StartDate = appointmentDate.Start, + EndDate = appointmentDate.End, Subject = subject, Description = "mob-dev-app", - Location = "Köln", - Originator = originator + Location = "Kölle", + Originator = originator, + IsPrivate = isPrivate, + AllDay = isAllDay }; } @@ -749,4 +834,16 @@ namespace BeWoPlanerMobil.Controllers Translation = translation; } } + + public struct AppointmentDates + { + public DateTime Start { get; set; } + public DateTime End { get; set; } + + public AppointmentDates(DateTime start, DateTime end) + { + Start = start; + End = end; + } + } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Controllers/MainController.cs b/BeWoPlanerMobil/Controllers/MainController.cs index 1cfc6362f..31437b12e 100644 --- a/BeWoPlanerMobil/Controllers/MainController.cs +++ b/BeWoPlanerMobil/Controllers/MainController.cs @@ -2199,7 +2199,8 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedEmployees = new List { MobileSessionFacade.LoggedInCompactEmployee }; Model.SelectedEmployee = MobileSessionFacade.LoggedInCompactEmployee; - Model.ServiceCategories = CreateServiceCategoryModels(OperationsService.GetAllServiceDescriptions()); + //Model.ServiceCategories = CreateServiceCategoryModels(OperationsService.GetAllServiceDescriptions()); + LoadServiceCategoriesToModel(Model.CostBearer2SupportConceptOid); var serviceDescriptions = Model.GetServiceDesctiptions(); diff --git a/Data/Access/SearchDAO.cs b/Data/Access/SearchDAO.cs index ac3731147..4b3545790 100644 --- a/Data/Access/SearchDAO.cs +++ b/Data/Access/SearchDAO.cs @@ -1307,16 +1307,31 @@ namespace BeWo.Data.Access public bool OverlappingAppointmentsExist(DateTime start, DateTime end, IEnumerable employees, IEnumerable customers, IEnumerable resources, long originator, long? appointmentOid, string recurrenceId = "", int occurrenceIndex = 0) { + if(employees == null) + { + employees = new List(); + } + + if(customers == null) + { + customers = new List(); + } + + if(resources == null) + { + resources = new List(); + } + var isRecurrenceException = appointmentOid == null; var isBeingUpdatedToNormalAppointment = false; Guid? recurrenceIdToIgnore = null; if(appointmentOid != null) { - // Das Patter wird geladen, bzw. mit der Ausnahme mit Index 0 verglichen + // Das Pattern wird geladen, bzw. mit der Ausnahme mit Index 0 verglichen // Wird die Serie in einen Einzeltermin geändert und es existiert eine Ausnahme mit Index 0, sollte die Ausnahme behalten werden und nicht der Root-Termin var original = DAOFactory.GenericDAO.LoadByID(appointmentOid.Value); - var ri = original.GetRecurrenceId(); + var ri = original?.GetRecurrenceId(); if(ri != null && IsNullOrWhiteSpace(recurrenceId)) { isBeingUpdatedToNormalAppointment = true; @@ -1409,16 +1424,18 @@ namespace BeWo.Data.Access // Das Muster für die Terminserie wird berechnet var pattern = StaticAppointmentFactory.CreateAppointment(AppointmentType.Pattern); + + if(pattern == null) + { + continue; + } + pattern.RecurrenceInfo.FromXml(appointment.RecurrenceInfo); pattern.Start = pattern.RecurrenceInfo.Start; pattern.End = appointment.EndDate.Value;//pattern.RecurrenceInfo.End; var patternId = pattern.RecurrenceInfo.Id.ToString(); - var appointmentType = appointment.Type; - var patternDuration = pattern.Duration; - var appointmentDuration = new TimeSpan((appointment.EndDate.Value - appointment.StartDate.Value).Ticks); - // In diesem Fall die Start- und Enddaten des zu überprüfenden, neuen Termins var interval = new TimeInterval(start, end); @@ -1446,9 +1463,9 @@ namespace BeWo.Data.Access var isInIntervalTest = start.IsInInterval(end, occurrence.Start, occurrence.Start.AddMinutes(duration)); if(!isInIntervalTest || - changedOccurences.Any(changedOccurence => changedOccurence.PatternId.Equals(patternId) && changedOccurence.Index == index) || - deletedOccurences.Any(deletedOccurence => deletedOccurence.PatternId.Equals(patternId) && deletedOccurence.Index == index) || - index == occurrenceIndex && guidParsingSuccessful && recurrenceGuid.Equals(occurrenceGuid)) + changedOccurences != null && changedOccurences.Any(changedOccurence => changedOccurence.PatternId.Equals(patternId) && changedOccurence.Index == index) || + deletedOccurences != null && deletedOccurences.Any(deletedOccurence => deletedOccurence.PatternId.Equals(patternId) && deletedOccurence.Index == index) || + index == occurrenceIndex && guidParsingSuccessful && recurrenceGuid!= null && recurrenceGuid.Equals(occurrenceGuid)) { continue; }