using System; using System.Collections.Generic; using System.Linq; using System.Web.Mvc; using BeWo.Report.DefaultReports; using BeWo.View.Navigation.Filter; using BeWoPlanerMobil.Models; using BeWoPlanerMobil.Service; using BeWoPlanerMobil.Util; using BS.Shared; using BS.Shared.Core; using BS.Shared.DataContracts; using BS.Shared.DataContracts.Compact; using BS.Shared.Extensions; namespace BeWoPlanerMobil.Controllers { public class CustomerController : AbstractBaseController { private CustomerModel _Model; public CustomerModel Model { get { if (!MobileSessionFacade.IsUserLoggedIn()) { Logout(); return null; } if (((CustomerModel) Session[ModelSessionConstants.CustomerModelKey])?.Employee is null) { _Model = new CustomerModel{Employee = MobileSessionFacade.LoggedInEmployee}; Session[ModelSessionConstants.CustomerModelKey] = _Model; } else { _Model = (CustomerModel)Session[ModelSessionConstants.CustomerModelKey]; } return _Model; } } [Authorize] public ActionResult Customer(long? id) { try { if (!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { return Logout(); } var customerFilter = MobileUserSettingsUtils.GetSettingValueAsEnum(AbstractModel.UserSettings, SettingsKeys.CustomerFilterCustomers, CustomerFilterEnum.MyCustomer); Model.SelectedCustomerFilter = customerFilter; InitViewModel(); if(id.HasValue) { LoadCustomerToModel(id); } } catch (Exception e) { Log.Info("Exception: " + e.Message + "\n" + e.StackTrace); if (e.InnerException != null) { Log.Info("\n\nInnerException: " + e.InnerException.Message + "\n" + e.InnerException.StackTrace); } throw; } return View(Model); } private void InitViewModel() { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { Logout(); return; } if(Model.Employee?.EmployeeOid.HasValue ?? false) { Model.Customers = EmployeeService.GetActiveCustomersForEmployee(Model.Employee.EmployeeOid.Value, Model.SelectedCustomerFilter).OrderBy(customer => customer.LastName).ToList(); } else { Model.Customers = new List(); } if(AbstractModel.IsAllowedToSeeMedikamentenliste) { Model.ReportTypes = new List { CustomerReportType.Medikamentenliste, CustomerReportType.Bedarfsmedikation, CustomerReportType.Historie }; } Model.AllAbsenceReasons = AbstractModel.HasRightToViewCustomerAbsenceTimes ? CustomerService.GetAllAbsenceReasons() : new List(); } private void LoadCustomerToModel(long? customerOid) { if(!(customerOid > 0) || !Model.Customers.Any(c => c.CustomerOid.Equals(customerOid.Value))) return; Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, customerOid.Value); Model.SelectedCustomerOid = customerOid; var customer = CustomerService.LoadCustomer(customerOid.Value); if(!(customer is null)) { Model.ICD10Diagnosen = OperationsService.GetDiagiosisStringsForICD10Codes(customer.ICD10DiagnosisCodes); } Model.SelectedCustomer = customer; var bargeldkassen = OperationsService.LoadBargeldkassenForObject(TableID.Customer, customerOid.Value); Model.Bargeldkassen = bargeldkassen; } [Authorize] [HttpPost] public ActionResult SelectCustomer(FormCollection formCollection) { try { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { return Logout(); } var selectedCustomerOidString = formCollection[FormCollectionConstants.SelectedCustomerOidKey]; if (long.TryParse(selectedCustomerOidString, out var selectedCustomerOid)) { LoadCustomerToModel(selectedCustomerOid); } return RedirectToActionPermanent("Customer"); } catch (Exception exception) { Log.Error(exception.Message, exception); } return RedirectToActionPermanent("Customer"); } [HttpPost] [Authorize] public ActionResult SetCustomerFilter(FormCollection formCollection) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { return Logout(); } var selectedCustomerFilter = formCollection[nameof(Model.SelectedCustomerFilter)]; if(!Enum.TryParse(selectedCustomerFilter, out CustomerFilterEnum customerFilter)) { customerFilter = CustomerFilterEnum.MyCustomer; } UpdateApplicationSettings(SettingsKeys.CustomerFilterCustomers, customerFilter.ToString()); return RedirectToActionPermanent("Customer"); } [Authorize] public FileResult DownloadFile(long fileOid) { if (Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { Logout(); return null; } var fileAttachment = DownloadService.GetFileAttachmentForMobile(fileOid, MobileSessionFacade.Tenant); return File(fileAttachment.BinaryData, "application/octet-stream", fileAttachment.FileName); } [Authorize] public string SaveEditedNotice(string newNotice) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { Logout(); return LeerzeichenFuerGetMethoden; } var isAllowedToEdit = MobileSessionFacade.LoggedInUser.CheckForAtLeastOneRight(new List { UserRightType.CustomerView_Edit, UserRightType.EditAll }); if(isAllowedToEdit && Model.SelectedCustomer != null) { Model.SelectedCustomer.Notice = newNotice?.RemoveUppercaseEsszett(); var customerOid = CustomerService.UpdateCustomer(Model.SelectedCustomer); Model.SelectedCustomer = CustomerService.LoadCustomer(customerOid); } return LeerzeichenFuerGetMethoden; } [Authorize] [HttpPost] public ActionResult SelectReport(FormCollection formCollection) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || !AbstractModel.IsAllowedToSeeMedikamentenliste) { return Logout(); } Model.Report = null; if(int.TryParse(formCollection["report-type-input"], out var selectedReportTypeInt)) { var selectedReportType = (CustomerReportType) selectedReportTypeInt; SelectReport(selectedReportType); } return RedirectToActionPermanent("Customer"); } private void SelectReport(CustomerReportType selectedReportType) { Model.SelectedReportType = selectedReportType; GenerateMobileMedListForSelectedCustomer(); } public void GenerateMobileMedListForSelectedCustomer(long? selectedMedListOid = null) { if(Model.SelectedCustomerOid is null) { return; } long? medListOid = null; var customerOid = Model.SelectedCustomerOid.Value; switch(Model.SelectedReportType) { case CustomerReportType.Medikamentenliste: medListOid = CustomerService.GetActiveMedListByTypeForCustomer(customerOid, false); break; case CustomerReportType.Bedarfsmedikation: medListOid = CustomerService.GetActiveMedListByTypeForCustomer(customerOid, true); break; case CustomerReportType.Historie: medListOid = selectedMedListOid; break; } var medList = Model.SelectedCustomer.Medikamentenverordnungslisten.FirstOrDefault(f => f.MedikamentenverordnungslistenOid == medListOid); if(medList?.MedikamentenverordnungslistenOid is null || Request?.Url is null) { return; } Model.ReportName = $"Medikamentenverordnung vom {medList.ErstellDatum}"; using (var memoryStream = ReportService.CreateMedikamentenlistenReport(medList.MedikamentenverordnungslistenOid.Value, MobileSessionFacade.Tenant)) { var medikamentenverordnungslistenReport = new MedikamentenverordnungslistenReport(); medikamentenverordnungslistenReport.PrintingSystem.LoadDocument(memoryStream); Model.Report = medikamentenverordnungslistenReport; } } public ActionResult UpdateCustomer(FormCollection formCollection) { if(Model is null) { return Logout(); } var firstname = formCollection["vorname"]?.RemoveUppercaseEsszett(); var lastname = formCollection["nachname"]?.RemoveUppercaseEsszett(); var geburtdatum = formCollection["geburtstag"]?.RemoveUppercaseEsszett(); var geschlecht = formCollection["geschlecht"]?.RemoveUppercaseEsszett(); var adresszusatz = formCollection["adresszusatz"]?.RemoveUppercaseEsszett(); var street = formCollection["strasse"]?.RemoveUppercaseEsszett(); var postalCode = formCollection["plz"]?.RemoveUppercaseEsszett(); var city = formCollection["ort"]?.RemoveUppercaseEsszett(); var nameInvoiceAddress = formCollection["name-rechnungsadresse"]?.RemoveUppercaseEsszett(); var streetInvoiceAddress = formCollection["strasse-rechnungsadresse"]?.RemoveUppercaseEsszett(); var postalCodeInvoiceAddress = formCollection["plz-rechnungsadresse"]?.RemoveUppercaseEsszett(); var cityInvoiceAddress = formCollection["ort-rechnungsadresse"]?.RemoveUppercaseEsszett(); var mobile = formCollection["handy"]?.RemoveUppercaseEsszett(); var phone = formCollection["telefon"]?.RemoveUppercaseEsszett(); var fax = formCollection["fax"]?.RemoveUppercaseEsszett(); var eMailAddress = formCollection["mail"]?.RemoveUppercaseEsszett(); var notice = formCollection["notiz"]?.RemoveUppercaseEsszett(); 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("Customer", new { id = customer.CustomerOid }); } [Authorize] [HttpPost] public ActionResult ViewMedListFromHistoryList(FormCollection formCollection) { if(long.TryParse(formCollection["med-list-oid"], out var medListOid)) { Model.SelectedReportType = CustomerReportType.Historie; GenerateMobileMedListForSelectedCustomer(medListOid); } return RedirectToActionPermanent("Customer"); } [Authorize] [HttpPost] public ActionResult DeleteMedListFromHistoryList(FormCollection formCollection) { if(long.TryParse(formCollection["med-list-oid"], out var medListOid)) { Model.SelectedReportType = CustomerReportType.Historie; CustomerService.DeleteMedikamentenverordnungsliste(medListOid); } return RedirectToActionPermanent("Customer"); } [Authorize] public string ResetReport() { Model.Report = null; return LeerzeichenFuerGetMethoden; } #region Bargeldkassen // GetBargeldkassenName // SaveBargeldkassenName // DeleteBargeldkasse // DownloadBargeldkassenPdf // DownloadTransactionPdf // SaveTransactionSignature [Authorize] public string GetBargeldkassenName(long oid) { if(Model is null) { Logout(); return LeerzeichenFuerGetMethoden; } var bargeldkassenname = Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.BargeldkassenOid.HasValue && bargeldkasse.BargeldkassenOid.Value.Equals(oid))?.Kassenname; return bargeldkassenname ?? LeerzeichenFuerGetMethoden; } // ToDo: Erstmal durch Get [Authorize] public string SaveBargeldkassenName(string newName, long oid) { if(Model is null) { Logout(); return LeerzeichenFuerGetMethoden; } var bargeldkasse = Model.Bargeldkassen.FirstOrDefault(bk => bk.BargeldkassenOid.HasValue && bk.BargeldkassenOid.Value.Equals(oid)); if(bargeldkasse is null || string.IsNullOrWhiteSpace(newName) || newName.Equals(bargeldkasse.Kassenname) || Model.SelectedCustomerOid is null) { return LeerzeichenFuerGetMethoden; } bargeldkasse.Kassenname = newName; OperationsService.UpdateBargeldkasse(bargeldkasse); Model.Bargeldkassen = OperationsService.LoadBargeldkassenForObject(TableID.Customer, Model.SelectedCustomerOid.Value); return LeerzeichenFuerGetMethoden; } [Authorize] [HttpPost] public ActionResult DeleteBargeldkasse(FormCollection formCollection) { if(Model is null || !long.TryParse(formCollection["bk-to-delete-oid"], out var bargeldkassenOid) || Model.SelectedCustomerOid is null) { return Logout(); } var bargeldkasse = Model.Bargeldkassen.FirstOrDefault(f => f.BargeldkassenOid.HasValue && f.BargeldkassenOid.Value.Equals(bargeldkassenOid)); if(bargeldkasse?.BargeldkassenVersion is null) { return RedirectToActionPermanent("Customer"); } var bargeldkassenVersion = bargeldkasse.BargeldkassenVersion.Value; OperationsService.DeactivateBargeldkasse(bargeldkassenOid, bargeldkassenVersion); Model.Bargeldkassen = OperationsService.LoadBargeldkassenForObject(TableID.Customer, Model.SelectedCustomerOid.Value); return RedirectToActionPermanent("Customer"); } #endregion #region Abwesenheiten // ToDo: Zu CreateOrUpdateAbsenceTime umbauen! [Authorize] [HttpPost] public ActionResult CreateOrUpdateAbsenceTime(FormCollection formCollection) { var selectedAbsenceTime = Model.SelectedAbsenceTime; var oid = selectedAbsenceTime?.AbsenceTimeOid; var isNew = oid is null; var startDateString = formCollection["customer-absence-time-start-date"]; var startTimeString = formCollection["customer-absence-time-start-time"]; var endDateString = formCollection["customer-absence-time-end-date"]; var endTimeString = formCollection["customer-absence-time-end-time"]; var category = formCollection["customer-absence-time-category"]; var notice = formCollection["customer-absence-time-notice"]; var startString = $"{startDateString} {startTimeString ?? "00:00"}"; var endString = $"{endDateString} {endTimeString ?? "00:00"}"; var start = DateTime.Parse(startString); var end = string.IsNullOrWhiteSpace(endDateString) && string.IsNullOrWhiteSpace(endTimeString) ? null : (DateTime?) DateTime.Parse(endString); var categoryOid = long.Parse(category); var absenceReason = Model.AllAbsenceReasons.FirstOrDefault(ar => ar.AbsenceReasonOid.HasValue && ar.AbsenceReasonOid.Value.Equals(categoryOid)); var customer = Model.SelectedCustomer; if(isNew) { var absenceTime = new AbsenceTimeDC { CustomerOid = customer.CustomerOid, Reason = absenceReason, Start = start, End = end, Notice = notice }; OperationsService.InsertNewCustomerAbsenceTime(customer.CustomerOid.Value, absenceTime); } else { selectedAbsenceTime.Start = start; selectedAbsenceTime.End = end; selectedAbsenceTime.Reason = absenceReason; selectedAbsenceTime.Notice = notice; OperationsService.UpdateAbsenceTime(selectedAbsenceTime); } LoadCustomerToModel(customer.CustomerOid); Model.SelectedAbsenceTime = null; Model.SelectedAbsenceReason = -1; return RedirectToActionPermanent("Customer", new { id = customer.CustomerOid }); } [Authorize] [HttpPost] public ActionResult DeleteAbsenceTime(FormCollection formCollection) { var customer = Model.SelectedCustomer; var isParsingSuccessful = long.TryParse(formCollection["customer-absence-time-to-delete-oid"], out var absenceTimeOid); if(isParsingSuccessful) { var absenceTime2Delete = customer.AbsenceTimes.FirstOrDefault(at => at.AbsenceTimeOid.HasValue && at.AbsenceTimeOid.Value.Equals(absenceTimeOid)); if(!(absenceTime2Delete is null)) { customer.AbsenceTimes.Remove(absenceTime2Delete); CustomerService.UpdateCustomer(customer); } } return RedirectToActionPermanent("Customer", new { id = customer?.CustomerOid }); } // ToDo: Fehlermeldungen einbauen! [Authorize] [HttpPost] public ActionResult SelectAbsenceTime(long absenceTimeOid) { if(absenceTimeOid == 0) { return RedirectToActionPermanent("Customer", Model); //return "Es ist ein Fehler bei der Auswahl der zu bearbeitenden Abwesenheit aufgetreten.
Bitte wenden Sie sich an Ihren Systemadministrator."; } var selectedAbsenceTime = Model.SelectedCustomer.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid.HasValue && absenceTime.AbsenceTimeOid.Value.Equals(absenceTimeOid)); if(selectedAbsenceTime is null) { return RedirectToActionPermanent("Customer", Model); //return "Es ist ein Fehler bei der Auswahl der zu bearbeitenden Abwesenheit aufgetreten.
Bitte wenden Sie sich an Ihren Systemadministrator."; } Model.SelectedAbsenceTime = selectedAbsenceTime; Model.SelectedAbsenceReason = selectedAbsenceTime.Reason.AbsenceReasonOid; //return LeerzeichenFuerGetMethoden; return RedirectToActionPermanent("Customer", Model); } [Authorize] public string SetSelectedAbsenceTimeOid(long absenceTimeOid) { var selectedAbsenceTime = Model.SelectedCustomer.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid.HasValue && absenceTime.AbsenceTimeOid.Value.Equals(absenceTimeOid)); if(selectedAbsenceTime is null) { return "Es ist ein Fehler bei der Auswahl der zu bearbeitenden Abwesenheit aufgetreten.
Bitte wenden Sie sich an Ihren Systemadministrator."; } Model.SelectedAbsenceTime = selectedAbsenceTime; Model.SelectedAbsenceReason = selectedAbsenceTime.Reason.AbsenceReasonOid; return LeerzeichenFuerGetMethoden; } [Authorize] public ActionResult LoadAbsenceTimeToForm() { return PartialView("CustomerAbsenceTimeFormPartial", Model); } [Authorize] public string DeselectAbsenceTime() { Model.SelectedAbsenceTime = null; Model.SelectedAbsenceReason = -1; return LeerzeichenFuerGetMethoden; } #endregion } public enum CustomerReportType { Medikamentenliste = 0, Bedarfsmedikation = 1, Historie = 2 } }