diff --git a/BeWo/Scheduler/View/NewSchedulerView.xaml b/BeWo/Scheduler/View/NewSchedulerView.xaml index c68ec66c4..a48f1e3c2 100644 --- a/BeWo/Scheduler/View/NewSchedulerView.xaml +++ b/BeWo/Scheduler/View/NewSchedulerView.xaml @@ -145,9 +145,11 @@ - + - + @@ -188,7 +190,7 @@ + Visibility="{Binding ViewInfo.View.AppointmentToolTipVisibility, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource ToolTipVisibilityConverter}}"> + @@ -272,7 +275,11 @@ dxschint:VerticalAppointmentContentPanel.AlwaysOnNewRow="True" TextWrapping="Wrap" Margin="11,6,0,0" Foreground="{Binding Path=CustomViewInfo[CustomFieldStorage].ForegroundColor}" /> - + + @@ -284,6 +291,7 @@ + @@ -292,12 +300,15 @@ - + - + + diff --git a/BeWo/Scheduler/ViewModel/SchedulerAppointmentListVM.cs b/BeWo/Scheduler/ViewModel/SchedulerAppointmentListVM.cs index 4e1fbffb4..fb1c60f5f 100644 --- a/BeWo/Scheduler/ViewModel/SchedulerAppointmentListVM.cs +++ b/BeWo/Scheduler/ViewModel/SchedulerAppointmentListVM.cs @@ -343,6 +343,7 @@ namespace BeWo.Scheduler.ViewModel vm.TaskDescription = app.CF_TaskDescription(); vm.SupportConceptList = app.CF_SupportConceptList(); vm.HasServiceRecordEntry = app.CF_HasServiceRecordEntry(); + vm.ServiceRecordList = app.CF_ServiceRecordList(); if(vm.IsTask) { diff --git a/BeWo/View/HomeView.xaml.cs b/BeWo/View/HomeView.xaml.cs index 405b79987..1d15c4472 100644 --- a/BeWo/View/HomeView.xaml.cs +++ b/BeWo/View/HomeView.xaml.cs @@ -477,6 +477,8 @@ namespace BeWo.View Login _login = new Login(kundennummer, "kihqx-PiGka", "cb", "bewo", "0b50c09aff87f20d9ced75340e04e5ccaa11dd3e7bcf25e9c4f94dc20d3cbb97"); + _login = new Login("4368658436", "B7x0b-FhhJA", "jettenl", "n8-yR+3Q=6nX#", "0000"); + var x1 = _login.AnmeldevorgangDurchFuehren(); ServiceChatView = new ChatView(x1); diff --git a/BeWo/ownChat/ChatView.xaml.cs b/BeWo/ownChat/ChatView.xaml.cs index f4aa5b5ea..7a90dd78d 100644 --- a/BeWo/ownChat/ChatView.xaml.cs +++ b/BeWo/ownChat/ChatView.xaml.cs @@ -153,13 +153,10 @@ namespace BeWo.ownChat stringBuilder.Append($"{m.SendTime:dd.MM.yyyy HH:mm} - {m.Username}: {m.UserMessage}"); } - var utf8 = Encoding.UTF8; - var encodedBytes = utf8.GetBytes(stringBuilder.ToString()); - var convertedBytes = Encoding.Convert(Encoding.UTF8, Encoding.ASCII, encodedBytes); - var ascii = Encoding.ASCII; + var finalString = stringBuilder.ToString(); + + finalString = finalString.Replace("ẞ", "ß"); - var finalString = ascii.GetString(convertedBytes); - var firstTime = messages.Min(r => { var dt = r.SendTime; diff --git a/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user b/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user index c804c5282..8c20a4286 100644 --- a/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user +++ b/BeWoPlanerMobil/BeWoPlanerMobil.csproj.user @@ -8,7 +8,7 @@ - Release|Any CPU + Debug|Any CPU ShowAllFiles 600 MvcControllerEmptyScaffolder diff --git a/BeWoPlanerMobil/Controllers/AbstractBaseController.cs b/BeWoPlanerMobil/Controllers/AbstractBaseController.cs index 005f4096e..57cc8f524 100644 --- a/BeWoPlanerMobil/Controllers/AbstractBaseController.cs +++ b/BeWoPlanerMobil/Controllers/AbstractBaseController.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Web.Mvc; using System.Web.Security; using BeWo.Service.ServiceContracts; @@ -22,7 +23,7 @@ namespace BeWoPlanerMobil.Controllers protected readonly IDownloadService DownloadService = new MobileSessionFacade().DownloadService; protected readonly IReportService ReportService = new MobileSessionFacade().ReportService; - protected const string _LeerzeichenFuerGetMethoden = " "; + protected const string LeerzeichenFuerGetMethoden = " "; protected static readonly log4net.ILog Log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); @@ -31,7 +32,11 @@ namespace BeWoPlanerMobil.Controllers protected ActionResult Logout() { - MobileSessionFacade.LogUserOut(); +#if DEBUG + Debug.WriteLine($"+++>Logout aufrufende Methode: {(new StackTrace()).GetFrame(1).GetMethod().Name}"); +#endif + + MobileSessionFacade.LogUserOut(); FormsAuthentication.SignOut(); AbstractModel.TimeOfLastAction = null; diff --git a/BeWoPlanerMobil/Controllers/CustomerController.cs b/BeWoPlanerMobil/Controllers/CustomerController.cs index 47e1d09c0..46c0be946 100644 --- a/BeWoPlanerMobil/Controllers/CustomerController.cs +++ b/BeWoPlanerMobil/Controllers/CustomerController.cs @@ -8,6 +8,7 @@ using BeWoPlanerMobil.Service; using BeWoPlanerMobil.Util; using BS.Shared; using BS.Shared.Core; +using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using DevExpress.XtraReports.UI; @@ -86,6 +87,8 @@ namespace BeWoPlanerMobil.Controllers Model.Customers = new List(); } + + // ReportTypes laden! Erstmal nur Medikamentenansicht if(AbstractModel.IsAllowedToSeeMedikamentenliste) { @@ -187,7 +190,7 @@ namespace BeWoPlanerMobil.Controllers if(Model == null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var isAllowedToEdit = MobileSessionFacade.LoggedInUser.CheckForAtLeastOneRight(new List { UserRightType.CustomerView_Edit, UserRightType.EditAll }); @@ -200,7 +203,7 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedCustomer = CustomerService.LoadCustomer(customerOid); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -246,6 +249,108 @@ namespace BeWoPlanerMobil.Controllers } } } + + public ActionResult UpdateCustomer(FormCollection formCollection) + { + if(Model is null) + { + return Logout(); + } + + // ToDo: Stammdaten aus formCollection holen, validieren und Customer-Objekt aktualisieren. + + var firstname = formCollection["vorname"]; + var lastname = formCollection["nachname"]; + var geburtdatum = formCollection["geburtstag"]; + var geschlecht = formCollection["geschlecht"]; + + var adresszusatz = formCollection["adresszusatz"]; + var street = formCollection["strasse"]; + var postalCode = formCollection["plz"]; + var city = formCollection["ort"]; + + var nameInvoiceAddress = formCollection["name-rechnungsadresse"]; + var streetInvoiceAddress = formCollection["strasse-rechnungsadresse"]; + var postalCodeInvoiceAddress = formCollection["plz-rechnungsadresse"]; + var cityInvoiceAddress = formCollection["ort-rechnungsadresse"]; + + var mobile = formCollection["handy"]; + var phone = formCollection["telefon"]; + var fax = formCollection["fax"]; + var eMailAddress = formCollection["mail"]; + + var notice = formCollection["notiz"]; + + var customer = Model.SelectedCustomer; + + if(customer is null) + { + return RedirectToActionPermanent("Customer"); + } + + customer.FirstName = firstname; + customer.LastName = lastname; + + if(DateTime.TryParse(geburtdatum, out var dateOfBirth)) + { + customer.DateOfBirth = dateOfBirth; + } + + if(int.TryParse(geschlecht, out var sexIndex)) + { + var castSex = sexIndex >= 0 ? (Sex?)sexIndex : null; + + customer.Sex = castSex; + } + + customer.AddressLine1 = adresszusatz; + customer.Street = street; + customer.PostalCode = postalCode; + customer.Town = city; + + customer.InvoiceAddressLine1 = nameInvoiceAddress; + customer.InvoiceAddressStreet = streetInvoiceAddress; + customer.InvoiceAddressPostalCode = postalCodeInvoiceAddress; + customer.InvoiceAddressTown = cityInvoiceAddress; + + var mobileContactInfo = customer.ContactInformations.FirstOrDefault(contactInformation => contactInformation.ContactType == ContactType.business_MobilePhone) ?? new ContactDC { ContactType = ContactType.business_MobilePhone }; + mobileContactInfo.ContactValue = mobile; + + if(customer.ContactInformations.All(a => a.ContactType != ContactType.business_MobilePhone)) + { + customer.ContactInformations.Add(mobileContactInfo); + } + + var phoneContactInfo = customer.ContactInformations.FirstOrDefault(contactInformation => contactInformation.ContactType == ContactType.business_Phone) ?? new ContactDC { ContactType = ContactType.business_Phone }; + phoneContactInfo.ContactValue = phone; + + if(customer.ContactInformations.All(a => a.ContactType != ContactType.business_Phone)) + { + customer.ContactInformations.Add(phoneContactInfo); + } + + var faxContactInfo = customer.ContactInformations.FirstOrDefault(contactInformation => contactInformation.ContactType == ContactType.business_Fax) ?? new ContactDC { ContactType = ContactType.business_Fax }; + faxContactInfo.ContactValue = fax; + + if(customer.ContactInformations.All(a => a.ContactType != ContactType.business_Fax)) + { + customer.ContactInformations.Add(faxContactInfo); + } + + var eMailContactInfo = customer.ContactInformations.FirstOrDefault(contactInformation => contactInformation.ContactType == ContactType.business_Mail) ?? new ContactDC { ContactType = ContactType.business_Mail }; + eMailContactInfo.ContactValue = eMailAddress; + + if(customer.ContactInformations.All(a => a.ContactType != ContactType.business_Mail)) + { + customer.ContactInformations.Add(eMailContactInfo); + } + + customer.Notice = notice; + + CustomerService.UpdateCustomer(customer); + + return RedirectToActionPermanent("PreselectCustomer", new { customerOid = customer.CustomerOid }); + } } public enum CustomerReportType diff --git a/BeWoPlanerMobil/Controllers/MainController.cs b/BeWoPlanerMobil/Controllers/MainController.cs index 3bc804563..36a9e36d5 100644 --- a/BeWoPlanerMobil/Controllers/MainController.cs +++ b/BeWoPlanerMobil/Controllers/MainController.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Text; using System.Web.Mvc; using System.Windows.Forms; +using BeWo.Service.Plugins; using BeWo.Service.ServiceImplementations; using BeWo.View.Navigation.Filter; using BeWoPlanerMobil.Models; @@ -21,6 +22,7 @@ using BS.Shared.DataContracts.Compact; using BS.Shared.Extensions; using BS.Shared.Services; using Newtonsoft.Json; +using NHibernate.Criterion; using static BS.Shared.ServiceRecordValidationResult; using FormCollection = System.Web.Mvc.FormCollection; using ServiceRecordDC = BS.Shared.DataContracts.ServiceRecordDC; @@ -98,6 +100,7 @@ namespace BeWoPlanerMobil.Controllers Model.ShowExpiredSupportConcepts = UserSettingsUtils.GetSettingValueAsBool(userSettings, SettingsKeys.ShowExpiredSupportConcepts); Model.ShowOnlyOwnSupportConcepts = UserSettingsUtils.GetSettingValueAsBool(userSettings, SettingsKeys.ShowOnlyMySupportConcepts); + Model.IsOnlyYearMonthVisible = UserSettingsUtils.GetSettingValueAsBool(userSettings, SettingsKeys.IsOnlyYearMonthVisible); InitializeInterval(userSettings); @@ -289,7 +292,7 @@ namespace BeWoPlanerMobil.Controllers { if(Model is null || ratingTypeOid is null || goalOid is null || !AbstractModel.HasRightToRateGoals) { - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(!Model.IsInGroupBookingMode) @@ -369,7 +372,7 @@ namespace BeWoPlanerMobil.Controllers [HttpPost] public new ActionResult Logout() - { + { return base.Logout(); } @@ -515,7 +518,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var isLoaded = false; @@ -661,7 +664,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } using (var signatureBitmap = SignatureUtils.Base64StringToBitmap(blob.Split(',')[1])) @@ -683,7 +686,7 @@ namespace BeWoPlanerMobil.Controllers }); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } catch (Exception e) { @@ -740,7 +743,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } try @@ -767,7 +770,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var textModule = Model.AllTextModules.FirstOrDefault(f => f.Oid == pTextbausteinOid); @@ -1492,14 +1495,7 @@ namespace BeWoPlanerMobil.Controllers long? cb2ScOid = Convert.ToInt64(formCollection[FormCollectionConstants.CostBearer2SupportConceptOidKey]); Log.Info($"SelectSupportConcept: {cb2ScOid}"); - LoadServiceCategoriesToModel(cb2ScOid); - - LoadRecordsToModel(); - - LoadGoalRatings(); - - // ToDo: Hier LoadGoals aufrufen! - LoadGoals(); + LoadSupportConceptThings(cb2ScOid); return ResetEditingMode(); } @@ -1610,20 +1606,20 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var sc = Model.SelectedSupportConcept; if (sc is null) { - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(string.IsNullOrEmpty(pGoalOids)) { Model.SelectedGoals.Clear(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var splitOids = pGoalOids.Trim(';').Split(';'); @@ -1646,7 +1642,7 @@ namespace BeWoPlanerMobil.Controllers //Model.SelectedGoals = goals; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -1655,11 +1651,11 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.SelectedServiceDescriptionOid = pServiceDescriptionOid; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [HttpPost] @@ -1888,10 +1884,10 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } - var result = _LeerzeichenFuerGetMethoden; + var result = LeerzeichenFuerGetMethoden; if (Model.SelectedServiceRecordOid.HasValue) { @@ -1907,7 +1903,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } LoadRecordsToModel(); @@ -1921,7 +1917,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Log.Info($"CheckRights: von:{von};bis:{bis};inEditMode:{inEditMode};dateString:{dateString};startString:{startString};endString:{endString}"); @@ -2263,7 +2259,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var isSuccessful = long.TryParse(serviceRecordOidString, out var serviceRecordOid); @@ -2279,7 +2275,7 @@ namespace BeWoPlanerMobil.Controllers if(serviceRecord is null) { - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var allowDeleteAfterEmployeeSignature = MobileSessionFacade.CheckForUserRight(UserRightType.ServiceRecord_AllowDeleteAfterEmployeeSignature); @@ -2317,11 +2313,11 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.SelectedEmployee = Model.AllEmployees.First(f => f.EmployeeOid.Equals(employeeOid)); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } catch (Exception e) { @@ -2362,7 +2358,7 @@ namespace BeWoPlanerMobil.Controllers return SerializeObject("localhost;demo"); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } // Menünavigation @@ -2580,7 +2576,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var rawRelOids = string.IsNullOrEmpty(pRelOids) ? new string[0] : pRelOids.Split(','); @@ -2650,7 +2646,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } long.TryParse(pRelOid, out var supportConceptCostBearerRelationOid); @@ -2677,7 +2673,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(string.IsNullOrEmpty(pEmployeeOids)) @@ -2705,7 +2701,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var signatureServiceRecord = Model.GetServiceRecord(serviceRecordOid); @@ -2992,16 +2988,170 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.IsShowingDurationInHours = isInHoursMode; UpdateUserSettingsWithoutReload(SettingsKeys.LetzteZeiterfassungsDauer, Model.IsShowingDurationInHours ? "1" : "0"); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } + [Authorize] + public void LoadSupportConceptThings(long? cb2ScOid) + { + if(Model is null) + { + Logout(); + return; + } + + LoadServiceCategoriesToModel(cb2ScOid); + + LoadRecordsToModel(); + + LoadGoalRatings(); + + LoadGoals(); + } + + [Authorize] + public ActionResult PrepareServiceRecordInsert() + { + if(Model is null) + { + return Logout(); + } + + // Nach dem Speichern das SchedulerAppointmentDC-Objekt updaten! + if(TempData["AppointmentListItem"] is AppointmentListItem appointmentListItem && Model.Employee.EmployeeOid.HasValue) + { + var appointment = appointmentListItem.SchedulerAppointment; + + var start = appointment.StartDate; + var end = appointment.EndDate; + var customerOids = appointment.CustomerList.Select(customer => customer.CustomerOid).ToList(); + var employeeOids = appointment.EmployeeList.Select(e2a => e2a.Employee.EmployeeOid).ToList(); + var notice = appointment.Description; + + if(start is null || end is null) + { + // ToDo: Fehler anzeigen! + return View("Main", Model); + } + + var customerService = PluginLoader.FindClass(); + var supportConcepts = customerService.GetAllActiveSupportConceptCostbearer(false, true, Model.Employee.EmployeeOid.Value); + supportConcepts = supportConcepts.Where(sc => customerOids.Contains(sc.Customer.CustomerOid) && sc.StartDate.HasValue && sc.EndDate.HasValue && start.Value.AreInBetweenDates(end.Value, sc.StartDate.Value, sc.EndDate.Value)).ToList(); + + var supportConceptList = new List(); + + foreach(var customerOid in customerOids) + { + var supportConcept = supportConcepts.FirstOrDefault(sc => sc.Customer.CustomerOid.Equals(customerOid)); + + if(supportConcept is null) + { + continue; + } + + supportConceptList.AddIfNotIn(supportConcept); + } + + // ToDo: Hier weitermachen: Update des Termins durchführen. In TempData speichern/belassen und beim Speichern dann Updaten? + + // Ohne Hilfeplan + if(supportConceptList.Count == 0) + { + Model.IsInGroupBookingMode = false; + Model.SelectedEmployee = Model.AllEmployees.FirstOrDefault(e => e.EmployeeOid.Equals(Model.Employee.EmployeeOid.Value)); + + LoadSupportConceptThings(-2); + + var serviceCategory = Model.ServiceCategories.FirstOrDefault(); + var serviceDescription = serviceCategory?.ServiceDescriptions.FirstOrDefault(); + + if(!(serviceDescription is null)) + { + Model.SelectedServiceCategoryOid = serviceDescription.Category.ServiceCategoryOid; + var serviceRecord = CreateServiceRecordFromScratch(start.Value, end.Value, null, Model.SelectedEmployee, notice); + serviceRecord.ServiceDescription = serviceDescription; + Model.SelectedServiceRecord = serviceRecord; + } + } + // Einzelbuchung + + else if(supportConceptList.Count == 1 && employeeOids.Count == 1) + { + Model.IsInGroupBookingMode = false; + Model.SelectedEmployee = Model.AllEmployees.FirstOrDefault(e => e.EmployeeOid.Equals(Model.Employee.EmployeeOid.Value)); + + // ToDo: Beim Wählen des CostBearers den nehmen, der aktiv ist? + var compactSupportConcept = supportConceptList.First(); + var supportConcept = Model.SupportConcepts.FirstOrDefault(f => f.SupportConceptOid.HasValue && f.SupportConceptOid.Value.Equals(compactSupportConcept.SupportConceptOid)); + + var serviceRecord = CreateServiceRecordFromScratch(start.Value, end.Value, supportConcept?.Customer, Model.SelectedEmployee, notice); + + var costBearer2SupportConcept = supportConcept.CostBearerRelations.FirstOrDefault(); + + + + Model.SelectedServiceRecord = serviceRecord; + } + // Gruppenbuchung + else + { + Model.IsInGroupBookingMode = true; + Model.GroupBookingSelectedEmployees = Model.AllEmployees.Where(w => employeeOids.Contains(w.EmployeeOid)).ToList(); + } + } + + return View("Main", Model); + } + + private ServiceRecordDC CreateServiceRecordFromScratch(DateTime start, DateTime end, CompactCustomerDC customer, CompactEmployeeDC employee, string notice) + { + var serviceRecord = new ServiceRecordDC + { + Employee = employee, + Customer = customer, + Notice = notice, + InsertedOn = DateTime.Now, + InsUser = employee?.ToString(), + IsCreatedInMobileClient = true + }; + + if(start.Date != end.Date) + { + serviceRecord.Start = end; + serviceRecord.End = end; + serviceRecord.RoundedDuration = 0; + } + else + { + serviceRecord.Start = start; + serviceRecord.End = end; + serviceRecord.RoundedDuration = (decimal)end.Subtract(start).TotalMinutes; + } + + if(Model.IsEndDateVisible) + { + serviceRecord.ServiceRecordFormat = ServiceRecordFormate.ZeiterfassungMitEndDatum; + } + else if(Model.IsOnlyYearMonthVisible) + { + serviceRecord.ServiceRecordFormat = ServiceRecordFormate.ZeiterfassungMitMonatJahr; + } + else + { + serviceRecord.ServiceRecordFormat = ServiceRecordFormate.OriginaleZeiterfassung; + } + + serviceRecord.DurationInStunden = Model.IsShowingDurationInHours ? ZeiterfassungsDauer.Stunden : ZeiterfassungsDauer.Minuten; + + return serviceRecord; + } #region Mehrfachbuchung @@ -3196,7 +3346,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var rawRelOids = string.IsNullOrEmpty(pRelOids) ? Array.Empty() : pRelOids.Split(','); @@ -3266,7 +3416,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } long.TryParse(pRelOid, out var supportConceptCostBearerRelationOid); @@ -3293,7 +3443,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(string.IsNullOrEmpty(pEmployeeOids)) diff --git a/BeWoPlanerMobil/Controllers/ReportController.cs b/BeWoPlanerMobil/Controllers/ReportController.cs index 291fbe3cc..3f90e7d9c 100644 --- a/BeWoPlanerMobil/Controllers/ReportController.cs +++ b/BeWoPlanerMobil/Controllers/ReportController.cs @@ -462,12 +462,12 @@ namespace BeWoPlanerMobil.Controllers { if(Model == null) { - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.SelectedCustomer = Model.Customers.FirstOrDefault(customer => customer.CustomerOid == customerOid); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -476,7 +476,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var isParsingSuccessful1 = int.TryParse(startDayString, out var startDay); @@ -495,7 +495,7 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedYear = year; } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -504,7 +504,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var isParsingSuccessful2 = long.TryParse(organisationOidStr, out var organisationOid); @@ -514,7 +514,7 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedServiceCategory = isParsingSuccessful3 ? OperationsService.LoadServiceCategory(categoryOid) : null; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -523,13 +523,13 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.IsForSelectedEmployeesOnly = isForSelectedEmployeeOnly ?? false; Model.SelectedEmployee = employeeOid.HasValue ? Model.Employees.FirstOrDefault(employee => employee.EmployeeOid.Equals(employeeOid.Value)) : null; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -538,12 +538,12 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.SelectedEmployee = employeeOid.HasValue ? Model.Employees.FirstOrDefault(employee => employee.EmployeeOid.Equals(employeeOid)) : null; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -552,13 +552,13 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.IsForSelectedCostbearersOnly = isForSelectedOrganisationOnly ?? false; Model.SelectedOrganisation = organisationOid.HasValue ? Model.Organisations.FirstOrDefault(organisation => organisation.OrganisationOid.Equals(organisationOid)) : null; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -567,12 +567,12 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.SelectedOrganisation = organisationOid.HasValue ? Model.Organisations.FirstOrDefault(organisation => organisation.OrganisationOid.Equals(organisationOid)) : null; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -581,7 +581,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.IsForSelectedCategoryOnly = isForSelectedServiceCategoryOnly ?? false; @@ -590,7 +590,7 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedServiceCategory = Model.ServiceCategories.FirstOrDefault(serviceCategory => serviceCategory.ServiceCategoryOid == serviceCategoryOid); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -599,7 +599,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(serviceCategoryOid.HasValue) @@ -607,7 +607,7 @@ namespace BeWoPlanerMobil.Controllers Model.SelectedServiceCategory = Model.ServiceCategories.FirstOrDefault(serviceCategory => serviceCategory.ServiceCategoryOid == serviceCategoryOid); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } /// @@ -621,7 +621,7 @@ namespace BeWoPlanerMobil.Controllers if(Model == null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var isParsingSuccessful = int.TryParse(filterEnumString, out var filterEnumValue); @@ -643,7 +643,7 @@ namespace BeWoPlanerMobil.Controllers } } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -653,7 +653,7 @@ namespace BeWoPlanerMobil.Controllers if(Model == null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var shouldOverwrite = overwrite.HasValue && overwrite.Value; @@ -735,7 +735,7 @@ namespace BeWoPlanerMobil.Controllers OperationsService.InsertConfirmationReceiptSignature(confirmationReceiptSignature); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -746,7 +746,7 @@ namespace BeWoPlanerMobil.Controllers if(Model == null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(!string.IsNullOrWhiteSpace(oidsAsString)) @@ -775,7 +775,7 @@ namespace BeWoPlanerMobil.Controllers return MobileUtils.SerializeObject(imageStrings); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } catch(Exception exception) { diff --git a/BeWoPlanerMobil/Controllers/SchedulerController.cs b/BeWoPlanerMobil/Controllers/SchedulerController.cs index 58d7c5ec7..8d3dafc51 100644 --- a/BeWoPlanerMobil/Controllers/SchedulerController.cs +++ b/BeWoPlanerMobil/Controllers/SchedulerController.cs @@ -524,7 +524,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var oidList = ConvertOidStringToList(resourceOids); @@ -544,7 +544,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var oidList = ConvertOidStringToList(oidString); @@ -560,7 +560,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var oidList = ConvertOidStringToList(oidString); @@ -575,7 +575,7 @@ namespace BeWoPlanerMobil.Controllers { if(!AbstractModel.HasRightToInsertRessourceAppointments) { - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(!string.IsNullOrWhiteSpace(start) && !string.IsNullOrWhiteSpace(end) && !string.IsNullOrWhiteSpace(resourceOids) && Model != null) @@ -597,7 +597,7 @@ namespace BeWoPlanerMobil.Controllers return JsonConvert.SerializeObject(unavailableResources); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -659,7 +659,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var employeeOids = ConvertOidStringToList(oidString); @@ -675,7 +675,7 @@ namespace BeWoPlanerMobil.Controllers if (Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var customerOids = ConvertOidStringToList(oidString); @@ -691,7 +691,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var resourceOidList = ConvertOidStringToList(resourceOids); @@ -784,14 +784,14 @@ namespace BeWoPlanerMobil.Controllers { if(Model is null) { - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.SelectedCustomersForIntervalFinder.Clear(); Model.SelectedEmployeesForIntervalFinder.Clear(); Model.SelectedResourcesForIntervalFinder.Clear(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -808,7 +808,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var oidList = ConvertOidStringToList(resourceOids); @@ -828,7 +828,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var oidList = ConvertOidStringToList(oidString); @@ -844,7 +844,7 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var oidList = ConvertOidStringToList(oidString); @@ -872,19 +872,20 @@ namespace BeWoPlanerMobil.Controllers if(Model?.Employee?.EmployeeOid is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } if(long.TryParse(teamOidString, out var teamOid)) { var team = EmployeeService.FindTeamByOid(teamOid, Model.Employee.EmployeeOid.Value); + if(!(team is null)) { Model.SelectedEmployeesForFiltering.AddRangeIfElementsNotIn(team.Member); } } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -893,7 +894,7 @@ namespace BeWoPlanerMobil.Controllers if(Model?.Employee?.EmployeeOid is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var teamMemberOids = new List(); @@ -931,19 +932,19 @@ namespace BeWoPlanerMobil.Controllers if(Model is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } Model.ShouldLoadTasks = isChecked; - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } catch(Exception exception) { Log.Error(exception.Message, exception); } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } [Authorize] @@ -952,7 +953,7 @@ namespace BeWoPlanerMobil.Controllers if(Model?.Employee?.EmployeeOid is null) { Logout(); - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; } var appointment = Model.Appointments.FirstOrDefault(app => app.SchedulerAppointmentOid?.Equals(appointmentOid) ?? false); @@ -979,7 +980,76 @@ namespace BeWoPlanerMobil.Controllers } } - return _LeerzeichenFuerGetMethoden; + return LeerzeichenFuerGetMethoden; + } + + [Authorize] + public string SelectTeamForIntervalFinder(string teamOidString) + { + if(Model?.Employee?.EmployeeOid is null) + { + Logout(); + return LeerzeichenFuerGetMethoden; + } + + if(long.TryParse(teamOidString, out var teamOid)) + { + var team = EmployeeService.FindTeamByOid(teamOid, Model.Employee.EmployeeOid.Value); + + if(!(team is null)) + { + var memberOids = team.Member.Select(member => member.EmployeeOid).ToList(); + + return JsonConvert.SerializeObject(memberOids); + } + } + + return LeerzeichenFuerGetMethoden; + } + + [Authorize] + [HttpPost] + public ActionResult TransformAppointmentToServiceRecord(FormCollection formCollection) + { + if(Model is null) + { + return Logout(); + } + + // ToDo Serienausnahme erstellen möglich machen? Wenn ja, dann auch für das Bearbeiten und Löschen. + if(Guid.TryParse(formCollection["appointment-id-input"], out var identifier)) + { + var ids = Model.AppointmentListItems.Select(s => s.Identifier).ToList(); + + var appointmentListItem = Model.AppointmentListItems.FirstOrDefault(f => f.Identifier.Equals(identifier)); + + if(!(appointmentListItem is null)) + { + var appointment = appointmentListItem.SchedulerAppointment; + + var employeeOids = appointment.EmployeeList.Select(e2a => e2a.Employee.EmployeeOid).ToList(); + if(employeeOids.Count == 0) + { + employeeOids.Add(appointment.Originator.EmployeeOid); + } + + var employeeOids2 = employeeOids.ToArray(); + + var customerOids = appointment.CustomerList.Select(c => c.CustomerOid).ToArray(); + + var notice = appointment.Description; + var start = appointment.StartDate; + var end = appointment.EndDate; + + // ToDo: Appointment aktualisieren, bzw. eine Serienausnahme erstellen! + + TempData["AppointmentListItem"] = appointmentListItem; + + return RedirectToActionPermanent("PrepareServiceRecordInsert", "Main"); + } + } + + return RedirectToActionPermanent("PrepareServiceRecordInsert", "Main"); } } } diff --git a/BeWoPlanerMobil/Models/AbstractModel.cs b/BeWoPlanerMobil/Models/AbstractModel.cs index 51b55a239..19a8b6337 100644 --- a/BeWoPlanerMobil/Models/AbstractModel.cs +++ b/BeWoPlanerMobil/Models/AbstractModel.cs @@ -52,7 +52,6 @@ namespace BeWoPlanerMobil.Models public static bool IsAllowedToSeeSupportConceptFilter { - get { var user = MobileSessionFacade.LoggedInUser; diff --git a/BeWoPlanerMobil/Models/MainModel.cs b/BeWoPlanerMobil/Models/MainModel.cs index 379902aa5..ce6fd616a 100644 --- a/BeWoPlanerMobil/Models/MainModel.cs +++ b/BeWoPlanerMobil/Models/MainModel.cs @@ -651,6 +651,8 @@ namespace BeWoPlanerMobil.Models public int SelectedDayCount { get; set; } public NullableDateTimeSpan SelectedZeitraum { get; set; } + public bool IsOnlyYearMonthVisible { get; set; } + #region Mehrfachbuchung diff --git a/BeWoPlanerMobil/Models/SchedulerModel.cs b/BeWoPlanerMobil/Models/SchedulerModel.cs index 9fde270a1..c025d18f4 100644 --- a/BeWoPlanerMobil/Models/SchedulerModel.cs +++ b/BeWoPlanerMobil/Models/SchedulerModel.cs @@ -19,19 +19,37 @@ namespace BeWoPlanerMobil.Models public SchedulerAppointmentDC SelectedAppointment { get; set; } - public List Appointments { get; set; } = new List(); + private List _Appointments; - public List AppointmentListItems + public List Appointments { - get + get => _Appointments ?? (_Appointments = new List()); + + set { - var result = new List(); + var oldAppointments = AppointmentListItems.Select(li => li.SchedulerAppointment).ToList(); - Appointments.DoForEach(app => result.AddIfNotIn(new AppointmentListItem(app))); + _Appointments = value ?? new List(); - return result; + if(_Appointments.AreListEqual(oldAppointments)) + { + return; + } + + _AppointmentListItems = new List(); + + foreach(var appointment in _Appointments) + { + var listItem = new AppointmentListItem(appointment); + listItem.GenerateIdentifier(_AppointmentListItems.Select(a => a.Identifier).ToList()); + + _AppointmentListItems.Add(listItem); + } } } + + private List _AppointmentListItems; + public List AppointmentListItems => _AppointmentListItems ?? (_AppointmentListItems = new List()); public bool HasRightToEditAppointment(long? appointmentOid) { diff --git a/BeWoPlanerMobil/Scripts/utils/dateUtils.js b/BeWoPlanerMobil/Scripts/utils/dateUtils.js index 46cddaf16..b5e69dbd1 100644 --- a/BeWoPlanerMobil/Scripts/utils/dateUtils.js +++ b/BeWoPlanerMobil/Scripts/utils/dateUtils.js @@ -10,15 +10,14 @@ function getDateFromPicker(pickerId) { try { var picker = $("#" + pickerId); - if (picker.length > 0) { + if(picker.length > 0) { picker.datetimepicker("show"); picker.datetimepicker("hide"); var unixTime = picker.datetimepicker("date"); var targetDate = new Date(unixTime); - if (isValidDate(targetDate)) { - logError(dateToShortDateString(targetDate)); + if(isValidDate(targetDate)) { return targetDate; } } @@ -62,6 +61,8 @@ function getTimeFromPicker(pickerId) { function dateToShortDateString(date) { try { + logInfo2("Konvertiere Datum zu kurzem Datum: " + date); + if (isValidDate(date)) { var ddNum = date.getDate(); var mmNum = date.getMonth(); @@ -90,7 +91,7 @@ function dateToShortDateString(date) { return dd + "." + mm + "." + yyyy; } } catch (error) { - logError(error.message); + logError("Fehler in dateToShortDateString:" + error.message); } } @@ -114,6 +115,7 @@ function mergeDateAndTime(date, time) { } } +// ToDo: Löst Exception aus bei einem Wert von z.B. "06.02.2023". function isValidDate(date) { return Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date); } \ No newline at end of file diff --git a/BeWoPlanerMobil/Scripts/utils/list-utils.js b/BeWoPlanerMobil/Scripts/utils/list-utils.js index 070dd96c9..9b9cb1fb6 100644 --- a/BeWoPlanerMobil/Scripts/utils/list-utils.js +++ b/BeWoPlanerMobil/Scripts/utils/list-utils.js @@ -1,54 +1,34 @@ // Wird aufgerufen, wenn sich der Wert der CheckBox ändert. -function changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids) { +function changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, checkBoxIdSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) { try { - if (url === undefined || url === null) { + if(url === undefined || url === null) { logError("url ist undefined oder null"); return; } - var oidStr = ""; - var oids = []; - var allChecked = true; - - $("#" + popupId + " input[type=checkbox]").each(function () { - var id = $(this).attr("id").split("-")[1]; - - if($.isNumeric(id) === false) { - return; - } - - if ($(this).prop("checked")) { - oids.push(id); - oidStr += id + ","; - } else { - allChecked = false; - } - }); + var selectedItemOids = $("#" + popupId + " .popup-list-item-container input:checked").map(function () { return $(this).attr("id").split("-")[1]; }).get(); + var allItemOids = $("#" + popupId + " .popup-list-item-container input[type=checkbox]").map(function () { return $(this).attr("id").split("-")[1]; }).get(); if(!isCustomer) { - $("#my-teams-checkbox" + allItemsCheckBoxSuffix).prop("checked", arrayContainsAllItems(oids, teamMemberOids)); + $("#my-teams-checkbox" + allItemsCheckBoxSuffix).prop("checked", arrayContainsAllItems(selectedItemOids, teamMemberOids)); } - if (allChecked === true) { - $("#all-" + (isCustomer ? "customers" : "employees") + "-checkbox" + allItemsCheckBoxSuffix).prop("checked", true); - } else { - $("#all-" + (isCustomer ? "customers" : "employees") + "-checkbox" + allItemsCheckBoxSuffix).prop("checked", false); - } + $("#" + allItemsCheckBoxId).prop("checked", arrayContainsAllItems(selectedItemOids, allItemOids)); - $.get(url, { oidString: oidStr }).done(function (jsonResult) { + $.get(url, { oidString: selectedItemOids.toString() }).done(function (jsonResult) { updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupId, checkBoxIdSuffix, url, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids); $("#one-day-scheduler-partial-container").load(filterAppointmentsUrl); }); } catch(error) { - logError(error.message); + logError("Fehler in changeItemListSelection: " + error.message); } } // Wird aufgerufen, um die Liste mit den ausgewählten Objekten zu aktualisieren -function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupId, checkBoxIdSuffix, url, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids) { +function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupId, checkBoxIdSuffix, url, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) { try { - if (isEmptyOrSpaces(jsonResult)) { + if(isEmptyOrSpaces(jsonResult)) { return; } @@ -98,11 +78,11 @@ function updateSelectedList(jsonResult, listId, itemIdPrefix, isCustomer, popupI list.append(html); }); } catch(error) { - logError(error.message); + logError("Fehler in updateSelectedList: " + error.message); } } -function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listId, itemIdPrefix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids) { +function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listId, itemIdPrefix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId) { try { var prefix = isCustomer ? "customer-" : "employee-"; @@ -112,8 +92,8 @@ function removeSelectedItem(itemOid, itemSuffix, isCustomer, url, popupId, listI checkBox.prop("checked", false); } - changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, itemSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids); + changeItemListSelection(url, popupId, listId, itemIdPrefix, isCustomer, itemSuffix, filterAppointmentsUrl, allItemsCheckBoxSuffix, teamMemberOids, allItemsCheckBoxId); } catch(error) { - logError(error); + logError("Fehler in removeSelectedItem: " + error); } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Scripts/utils/logging.js b/BeWoPlanerMobil/Scripts/utils/logging.js index eea9a61be..802eede7d 100644 --- a/BeWoPlanerMobil/Scripts/utils/logging.js +++ b/BeWoPlanerMobil/Scripts/utils/logging.js @@ -1,21 +1,21 @@ function logInfo(message) { - logColorfulMessage(message, "purple"); + logColorfulMessage(message, "#FF0094"); } function logWarning(message) { - logColorfulMessage(message, "darkorange"); + logColorfulMessage(message, "#FF5A00"); } function logError(message) { - console.error("%c" + message, "font-size: 16px; font-weight:bold; color: red"); + console.error("%c" + message, "font-size: 14px; font-family: monospace; color: red"); } function logDebug(message) { - logColorfulMessage(message, "green"); + logColorfulMessage(message, "#AAF500"); } function logColorfulMessage(message, color) { - console.log("%c" + message, "font-size: 16px; font-weight: bold; color: " + color); + console.log("%c" + message, "font-size: 14px; font-family: monospace; color: " + color); } function logInfo2(message) { diff --git a/BeWoPlanerMobil/Scripts/view-scripts/scheduler.js b/BeWoPlanerMobil/Scripts/view-scripts/scheduler.js index a9e8e34cf..71582d567 100644 --- a/BeWoPlanerMobil/Scripts/view-scripts/scheduler.js +++ b/BeWoPlanerMobil/Scripts/view-scripts/scheduler.js @@ -199,18 +199,15 @@ function insertOrUpdateAppointment(formattedStartDate, formattedEndDate, formatt } function hideAppointmentForm() { - logDebug("hiding appointment form"); $("#form-container").addClass("d-none d-sm-none"); } function showAppointmentForm() { - logDebug("showing appointment form"); $("#form-container").removeClass("d-none d-sm-none"); + calcPrependTextSizes(); } function toggleAppointmentForm() { - logError("toggling appointment form"); - var isVisible = $("#form-container").css("display") === "block"; if (isVisible) { diff --git a/BeWoPlanerMobil/Util/AppointmentListItem.cs b/BeWoPlanerMobil/Util/AppointmentListItem.cs index 90a03d4be..37ebc62d9 100644 --- a/BeWoPlanerMobil/Util/AppointmentListItem.cs +++ b/BeWoPlanerMobil/Util/AppointmentListItem.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Drawing; using System.Linq; using BS.Shared.DataContracts; @@ -8,7 +9,7 @@ namespace BeWoPlanerMobil.Util { public class AppointmentListItem { - public Guid Identifier { get; } + public Guid Identifier { get; private set; } public long? Oid { get; } @@ -62,10 +63,27 @@ namespace BeWoPlanerMobil.Util public bool HasEmployeesCustomersOrResources => !string.IsNullOrWhiteSpace(EmployeeListInfo + CustomerListInfo + ResourceListInfo); public bool AllDay { get; } + public bool HasServiceRecord { get; } + + public SchedulerAppointmentDC SchedulerAppointment { get; } + + public void GenerateIdentifier(List existingIdentifiers) + { + var identifier = Guid.NewGuid(); + while(existingIdentifiers.Contains(identifier)) + { + identifier = Guid.NewGuid(); + } + + Identifier = identifier; + } + public AppointmentListItem(SchedulerAppointmentDC schedulerAppointment) { Identifier = Guid.NewGuid(); + SchedulerAppointment = schedulerAppointment; + CanBeEdited = schedulerAppointment.CanBeEdited; Oid = schedulerAppointment.SchedulerAppointmentOid; @@ -81,6 +99,8 @@ namespace BeWoPlanerMobil.Util var customerColor = string.Empty; var resourceColor = string.Empty; + HasServiceRecord = schedulerAppointment.ServiceRecordList?.Any() ?? false; + if(string.IsNullOrWhiteSpace(employeeColor) && schedulerAppointment.EmployeeList.Count == 0 && !string.IsNullOrWhiteSpace(schedulerAppointment.Originator?.EmployeeColor)) { employeeColor = schedulerAppointment.Originator.EmployeeColor; diff --git a/BeWoPlanerMobil/Util/JsonCustomer.cs b/BeWoPlanerMobil/Util/JsonCustomer.cs index a5cbabe9c..4d58b1b91 100644 --- a/BeWoPlanerMobil/Util/JsonCustomer.cs +++ b/BeWoPlanerMobil/Util/JsonCustomer.cs @@ -1,6 +1,8 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Web; +using System.Web.Mvc; using BS.Shared; using BS.Shared.DataContracts; using BS.Shared.Extensions; @@ -48,6 +50,8 @@ namespace BeWoPlanerMobil.Util public List AbsenceTimes { get; set; } = new List(); public List Organisations { get; set; } = new List(); + + public Sex? CustomerSex { get; set; } public JsonCustomer(CustomerDC customer, List folderTree) { @@ -71,6 +75,8 @@ namespace BeWoPlanerMobil.Util break; } + CustomerSex = customer.Sex; + Adresszusatz = customer.AddressLine1; Strasse = customer.Street; Postleitzahl = customer.PostalCode; diff --git a/BeWoPlanerMobil/Views/Customer/Customer.cshtml b/BeWoPlanerMobil/Views/Customer/Customer.cshtml index 251404490..112828600 100644 --- a/BeWoPlanerMobil/Views/Customer/Customer.cshtml +++ b/BeWoPlanerMobil/Views/Customer/Customer.cshtml @@ -1,11 +1,53 @@ @using BeWoPlanerMobil.Models; @using BeWoPlanerMobil.Util +@using BS.Shared @model CustomerModel @{ ViewBag.Title = "Klient"; } + + @if(AbstractModel.IsAllowedToSeeCustomerFilter) { @@ -36,514 +78,590 @@ @if(Model?.SelectedJsonCustomer != null) { - - - - - - Eigenschaften - - - - Vorname: - - - @Model.SelectedJsonCustomer.Vorname - - - - - Nachname: - - - @Model.SelectedJsonCustomer.Nachname - - - - - Geburtstag: - - - @Model.SelectedJsonCustomer.Geburtstag - - - - - Geschlecht: - - - @Model.SelectedJsonCustomer.Geschlecht - - - - - - - - - - Adresse - - - - Adresszusatz: - - - @Model.SelectedJsonCustomer.Adresszusatz - - - - - Straße: - - - @Model.SelectedJsonCustomer.Strasse - - - - - PLZ: - - - @Model.SelectedJsonCustomer.Postleitzahl - - - - - Ort: - - - @Model.SelectedJsonCustomer.Ort - - - - - - - - - - Rechnungsadresse - - - - Name: - - - @Model.SelectedJsonCustomer.RechnungsadresseName - - - - - Straße: - - - @Model.SelectedJsonCustomer.RechnungsadresseStrasse - - - - - PLZ: - - - @Model.SelectedJsonCustomer.RechnungsadressePostleitzahl - - - - - Ort: - - - @Model.SelectedJsonCustomer.RechnungsadresseOrt - - - - - - - - - - Kontakt - - - - Handy: - - - @Model.SelectedJsonCustomer.Handy - - - - - Telefon: - - - @Model.SelectedJsonCustomer.Telefon - - - - - Fax: - - - @Model.SelectedJsonCustomer.Fax - - - - - Mail: - - - @Model.SelectedJsonCustomer.EMail - - - - - - - - - @if (Model.SelectedJsonCustomer.Kommentar != null) - { - - - - - - - Kommentar - - - - - - - - @Model.SelectedJsonCustomer.Kommentar - - @Model.SelectedJsonCustomer.Kommentar - Abbrechen - Speichern - - - - - } - - - @if (Model.SelectedJsonCustomer.ReferenceNumbers.Any()) - { - - - - Aktenzeichen pro Kostenträger - - - - - - - - Kostenträger - - - Aktenzeichen - - - - - @foreach (var x in Model.SelectedJsonCustomer.ReferenceNumbers) - { - - - @x.Costbearer - - - @x.ReferenceNumber - - - } - - - - - - - } - - - @if (Model.SelectedJsonCustomer.Umfeldpersonen.Any()) - { - - - - Umfeld - - - - @foreach (var umfeldPerson in Model.SelectedJsonCustomer.Umfeldpersonen) - { - - - - - - - - @umfeldPerson.FormattedName - + using(Html.BeginForm("UpdateCustomer", "Customer", FormMethod.Post, new { id = "stammdaten-form" })) + { + + + + + + Eigenschaften + + + + + + + Vorname + + + - - - - - - Rolle: - - - @umfeldPerson.Rolle - + + + + + + + Nachname - - - Adresse: - - - @umfeldPerson.StrNameNr@umfeldPerson.PLZOrt - + + + + + + + + + + + Geburtstag - - - Tel.: - - - @umfeldPerson.TelNr - - - - - Mobil: - - - @umfeldPerson.Mobil - - - - - E-Mail: - - - @umfeldPerson.EMail - - - - - Fax: - - - @umfeldPerson.Fax - + + + + + - } - - - - - } + + + + + + Geschlecht + + + @{ + var selectedMale = Model.SelectedJsonCustomer.CustomerSex == Sex.Male ? "selected" : string.Empty; + var selectedFemale = Model.SelectedJsonCustomer.CustomerSex == Sex.Female ? "selected" : string.Empty; + var selectedDiverse = Model.SelectedJsonCustomer.CustomerSex == Sex.Divers ? "selected" : string.Empty; + var selectedNull = Model.SelectedJsonCustomer.CustomerSex is null ? "selected" : string.Empty; + } - - @if (Model.SelectedJsonCustomer.Organisations.Any()) - { - - - - Organisationen des Umfelds - - - - @foreach (var organisation in Model.SelectedJsonCustomer.Organisations) - { - - - - - - - - @organisation.Name - + + + Männlich + Weiblich + Divers + - - - - - - Ansprechpartner - - - @organisation.ContactPerson - + + + + + + + + + Adresse + + + + + + + Adresszusatz - - - Rolle - - - @organisation.Role - + + + + + + + + + + + Straße - - - Adresse - - - @organisation.StreetName - @if (!string.IsNullOrEmpty(organisation.StreetName) && !string.IsNullOrEmpty(organisation.ZipCode2Town)) - { - - } - @organisation.ZipCode2Town - + + + + + + + + + + + PLZ - - - Tel.: - - - @organisation.PhoneNumber - + + + + + + + + + + + Ort - - - Fax: - - - @organisation.FaxNumber - + + + + + + + + + + + + + Rechnungsadresse + + + + + + + Name - - - E-Mail: - - - @organisation.Email - + + + + + + + + + + + Straße - - - Internet: - - - @organisation.Website - + + + + + + + + + + + PLZ - - - Info - - - @organisation.Info - + + + + + + + + + + + Ort - - - Notiz - - - @organisation.Notice - + + + + + + + + + + + + + Kontakt + + + + + + + Handy + + + + + + - } - - - - - } - - - - - - Dokumente - - - - @Html.Partial("DocumentPartial", Model) - - - - - - - @if (Html.IsInDebugMode() && AbstractModel.IsAllowedToSeeMedikamentenliste && Html.IsInDebugMode()) - { - - - - Berichte - - - - @using (Html.BeginForm("SelectReport", "Customer", FormMethod.Post, new { })) - { - @Html.DropDownListFor(m => m.SelectedReportType, Model.ReportTypeItems, new { @class = "custom-select", name = "SelectedReportType" }) - - Bericht anzeigen - - - - - - - - - Medikamentenliste - - - - - - @Html.Partial("CustomerReportPartial", Model) + + + + + + Telefon + + + + + + + + - } + + + + + + Fax + + + + + + + + + + + + Mail + + + + + + + + + + + + + + @if(Model.SelectedJsonCustomer.Kommentar != null) + { + + + + + Kommentar + + + + + @Model.SelectedJsonCustomer.Kommentar + + + + + } + + + Speichern + + + + + + + + @if(Model.SelectedJsonCustomer.ReferenceNumbers.Any()) + { + + + + Aktenzeichen pro Kostenträger + + + + + + + + Kostenträger + + + Aktenzeichen + + + + + @foreach(var x in Model.SelectedJsonCustomer.ReferenceNumbers) + { + + + @x.Costbearer + + + @x.ReferenceNumber + + + } + + + + + + + } + + + @if(Model.SelectedJsonCustomer.Umfeldpersonen.Any()) + { + + + + Umfeld + + + + @foreach(var umfeldPerson in Model.SelectedJsonCustomer.Umfeldpersonen) + { + + + + + + + + @umfeldPerson.FormattedName + + + + + + + + + Rolle: + + + @umfeldPerson.Rolle + + + + + Adresse: + + + @umfeldPerson.StrNameNr@umfeldPerson.PLZOrt + + + + + Tel.: + + + @umfeldPerson.TelNr + + + + + Mobil: + + + @umfeldPerson.Mobil + + + + + E-Mail: + + + @umfeldPerson.EMail + + + + + Fax: + + + @umfeldPerson.Fax + + + + + + + } + + + + + } + + + @if(Model.SelectedJsonCustomer.Organisations.Any()) + { + + + + Organisationen des Umfelds + + + + @foreach(var organisation in Model.SelectedJsonCustomer.Organisations) + { + + + + + + + + @organisation.Name + + + + + + + + + Ansprechpartner + + + @organisation.ContactPerson + + + + + Rolle + + + @organisation.Role + + + + + Adresse + + + @organisation.StreetName + @if(!string.IsNullOrEmpty(organisation.StreetName) && !string.IsNullOrEmpty(organisation.ZipCode2Town)) + { + + } + @organisation.ZipCode2Town + + + + + Tel.: + + + @organisation.PhoneNumber + + + + + Fax: + + + @organisation.FaxNumber + + + + + E-Mail: + + + @organisation.Email + + + + + Internet: + + + @organisation.Website + + + + + Info + + + @organisation.Info + + + + + Notiz + + + @organisation.Notice + + + + + + + } + + + + + } + + + + + + Dokumente + + + + @Html.Partial("DocumentPartial", Model) + + + + + + + @if(Html.IsInDebugMode() && AbstractModel.IsAllowedToSeeMedikamentenliste && Html.IsInDebugMode()) + { + + + + Berichte + + + + @using(Html.BeginForm("SelectReport", "Customer", FormMethod.Post, new { })) + { + @Html.DropDownListFor(m => m.SelectedReportType, Model.ReportTypeItems, new { @class = "custom-select", name = "SelectedReportType" }) + + Bericht anzeigen + + + + + + + + + Medikamentenliste + + + + + + @Html.Partial("CustomerReportPartial", Model) + + + + } + + + + + } - - } - + } } \ No newline at end of file diff --git a/BeWoPlanerMobil/Views/Main/GoalTreePartial.cshtml b/BeWoPlanerMobil/Views/Main/GoalTreePartial.cshtml index 73c2b3551..726cedd44 100644 --- a/BeWoPlanerMobil/Views/Main/GoalTreePartial.cshtml +++ b/BeWoPlanerMobil/Views/Main/GoalTreePartial.cshtml @@ -38,12 +38,14 @@ var isLeaf = $(item).parent().prop("class").includes("goal-text"); + // ToDo: Auch die Ziele beachten! + if(goalText.toLowerCase().includes(text)) { $.each($($(item).parents(".goal-card")), function(cardIndex, card) { $(card).show(); $(card).find(".collapse").collapse("show"); }); - } else if (isLeaf) { + } else if(isLeaf) { var parent1 = $($(item).parent()); if(parent1 !== undefined && parent1 !== null) { diff --git a/BeWoPlanerMobil/Views/Report/QuittierungsbelegsResultPartial.cshtml b/BeWoPlanerMobil/Views/Report/QuittierungsbelegsResultPartial.cshtml index c8c5f3336..70d52a507 100644 --- a/BeWoPlanerMobil/Views/Report/QuittierungsbelegsResultPartial.cshtml +++ b/BeWoPlanerMobil/Views/Report/QuittierungsbelegsResultPartial.cshtml @@ -136,31 +136,7 @@ break; } } - - - diff --git a/BeWoPlanerMobil/Views/Scheduler/AppointmentFormPartial.cshtml b/BeWoPlanerMobil/Views/Scheduler/AppointmentFormPartial.cshtml index 8e3fd9e3a..39b22833c 100644 --- a/BeWoPlanerMobil/Views/Scheduler/AppointmentFormPartial.cshtml +++ b/BeWoPlanerMobil/Views/Scheduler/AppointmentFormPartial.cshtml @@ -11,9 +11,22 @@ } $("#insert-appointment-form").ready(function() { - var width = getMaxWidth("scheduler-form-prepend-text"); - $(".scheduler-form-prepend-text").width(width); + calcPrependTextSizes(); }); + + function calcPrependTextSizes() { + try { + var width = getMaxWidth("scheduler-form-prepend-text"); + + if(width <= 0) { + return; + } + + $(".scheduler-form-prepend-text").width(width); + } catch(error) { + logError(error); + } + } @using(Html.BeginForm("InsertOrUpdateAppointment", "Scheduler", FormMethod.Post, new { id = "insert-appointment-form" })) { @@ -373,30 +386,22 @@ $.each(entries, function (index, item) { var employee = $(item); - if (employee.find(".employee-name-label").text().toLowerCase().includes(text)) { + if(employee.find(".employee-name-label").text().toLowerCase().includes(text)) { employee.show(); } else { employee.hide(); } }); - } catch (error) { + } catch(error) { logError(error.message); } } function selectAllEmployeesOnChange() { try { - var value = $("#all-employees-checkbox").prop("checked"); + var allChecked = $("#all-employees-checkbox").prop("checked"); - $("#employees-popup input[type=checkbox]").each(function() { - var id = $(this).attr("id").split("-")[1]; - - if($.isNumeric(id) === false) { - return; - } - - $(this).prop("checked", value); - }); + $("#employees-popup .employee-input-container input[type=checkbox]").map(function() { $(this).prop("checked", allChecked); }); changeEmployeeListSelection(); } catch(error) { @@ -406,32 +411,17 @@ function changeEmployeeListSelection() { try { - var oidStr = ""; - var oids = []; - var allChecked = true; + var selectedEmployeeOids = $("#employees-popup .employee-input-container input:checked").map(function() { return $(this).attr("id").split("-")[1]; }).get(); + var allEmployeesCount = $("#employees-popup .employee-input-container input[type=checkbox]").map(function () { return $(this).attr("id").split("-")[1]; }).get().length; + var selectedEmployeesCount = selectedEmployeeOids.length; - $("#employees-popup input[type=checkbox]").each(function () { - var id = $(this).attr("id").split("-")[1]; + $("#all-employees-checkbox").prop("checked", (allEmployeesCount === selectedEmployeesCount)); - if ($.isNumeric(id) === false) { - return; - } - - if ($(this).prop("checked")) { - oids.push(id); - oidStr += id + ","; - } else { - allChecked = false; - } - }); - - $("#all-employees-checkbox").prop("checked", allChecked); - - $.get('@Url.Action("SelectEmployeesForAppointment")', {oidString: oidStr}).done(function(jsonResult) { + $.get('@Url.Action("SelectEmployeesForAppointment")', { oidString: selectedEmployeeOids.toString()}).done(function(jsonResult) { updateSelectedEmployees(jsonResult); $("#one-day-scheduler-partial-container").load('@Url.Action("FetchAppointments", "Scheduler")'); }); - } catch (error) { + } catch(error) { logError(error); } } @@ -494,7 +484,7 @@ $.get('@Url.Action("SelectTeamForAppointment")', { teamOidString: teamOid }).done(function(jsonResult) { var oids = $.parseJSON(jsonResult); - $("#employees-popup input[type=checkbox]").each(function () { + $("#employees-popup .employee-input-container input[type=checkbox]").each(function () { var id = $(this).attr("id").split("-")[1]; if ($.isNumeric(id) === false) { @@ -569,16 +559,18 @@ } + + + @foreach(var employee in Model.AllEmployees) + { + var checkedValue = Model.SelectedEmployees.Contains(employee) ? "checked" : string.Empty; - @foreach(var employee in Model.AllEmployees) - { - var checkedValue = Model.SelectedEmployees.Contains(employee) ? "checked" : string.Empty; - - - - @employee.DetailDescription - - } + + + @employee.DetailDescription + + } + + + + @foreach(var customer in Model.AllCustomers) + { + var checkedValue = Model.SelectedCustomers.Contains(customer) ? "checked" : string.Empty; - @foreach(var customer in Model.AllCustomers) - { - var checkedValue = Model.SelectedCustomers.Contains(customer) ? "checked" : string.Empty; - - - - @customer.DetailDescription - - } + + + @customer.DetailDescription + + } + +