using System; using System.Collections.Generic; using System.Globalization; using System.IO; 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; using DevExpress.XtraReports.UI; namespace BeWoPlanerMobil.Controllers { public class CustomerController : ReportBaseController { public CustomerController() { } private CustomerModel _Model; public CustomerModel Model { get { if (!MobileSessionFacade.IsUserLoggedIn()) { Logout(); return null; } if (_Model == null) { _Model = new CustomerModel(); InitModel(_Model); InitViewModel(); } //if (((CustomerModel) Session[ModelSessionConstants.CustomerModelKey])?.LoggedInEmployee is null) //{ // _Model = new CustomerModel(); // InitModel(_Model); // 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(); } 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(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { Logout(); return; } if (Model.LoggedInEmployee?.EmployeeOid.HasValue ?? false) { Model.Customers = EmployeeService.GetActiveCustomersForEmployee(Model.LoggedInEmployee.EmployeeOid.Value, Model.SelectedCustomerFilter).OrderBy(customer => customer.LastName).ToList(); } else { Model.Customers = new List(); } if (Model.CustomerSessionModel.SelectedCustomerOid.HasValue) { Model.SelectedCustomer = CustomerService.LoadCustomer(Model.CustomerSessionModel.SelectedCustomerOid.Value); } if (Model.IsAllowedToSeeMedikamentenliste) { Model.ReportTypes = new List { CustomerReportType.Medikamentenliste, CustomerReportType.Bedarfsmedikation, CustomerReportType.Historie }; } Model.AllAbsenceReasons = Model.HasRightToViewCustomerAbsenceTimes ? CustomerService.GetAllAbsenceReasons() : new List(); if (Model.CustomerSessionModel.SelectedAbsenceTimeOid.HasValue && Model.SelectedCustomer != null) { Model.SelectedAbsenceTime = Model.SelectedCustomer.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid.HasValue && absenceTime.AbsenceTimeOid.Value.Equals(Model.CustomerSessionModel.SelectedAbsenceTimeOid.Value)); } ReloadBargeldkassen(); if (Model.CustomerSessionModel.SelectedBargeldkasseOid.HasValue && Model.Bargeldkassen != null) { Model.SelectedBargeldkasse = Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.BargeldkassenOid.HasValue && bargeldkasse.BargeldkassenOid.Value.Equals(Model.CustomerSessionModel.SelectedBargeldkasseOid.Value)); } if (Model.CustomerSessionModel.SelectedBargeldtransaktionOid.HasValue) { var kassenbuch = GetBargeldkasseByTransaktionsOid(Model.CustomerSessionModel.SelectedBargeldtransaktionOid.Value); var zahlung = kassenbuch?.Bargeldtransaktionen.FirstOrDefault(bargeldtransaktion => bargeldtransaktion.BargeldtransaktionOid.Equals(Model.CustomerSessionModel.SelectedBargeldtransaktionOid.Value)); Model.SelectedBargeldtransaktion = zahlung; } if (Model.SelectedCustomer != null) { Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, Model.SelectedCustomer.CustomerOid.Value); Model.ICD10Diagnosen = OperationsService.GetDiagiosisStringsForICD10Codes(Model.SelectedCustomer.ICD10DiagnosisCodes); } var customerFilter = MobileUserSettingsUtils.GetSettingValueAsEnum(Model.UserSettings, SettingsKeys.CustomerFilterCustomers, CustomerFilterEnum.MyCustomer); Model.SelectedCustomerFilter = customerFilter; } private void LoadCustomerToModel(long? customerOid) { if(customerOid is null || (customerOid.Value > 0 && !Model.Customers.Any(c => c.CustomerOid.Equals(customerOid.Value)))) { return; } if (customerOid == -1) { Model.CustomerSessionModel.ResetValues(); //Model.SelectedCustomer = null; //Model.SelectedCustomerOid = null; //Model.SelectedAbsenceTimeOid = null; //Model.SelectedAbsenceReason = null; //Model.FolderTree = null; //Model.ICD10Diagnosen = null; //Model.Bargeldkassen = new List(); //Model.BargeldtransaktionshistoryEntries = new List(); //Model.TransaktionsOid2HasHistoryEntries = new Dictionary(); //Model.SelectedBargeldtransaktion = null; } else { if (Model.SelectedCustomerOid.HasValue && Model.SelectedCustomerOid != customerOid) { Model.CustomerSessionModel.ResetValues(); } Model.SelectedCustomerOid = customerOid; } } [Authorize] [HttpPost] public ActionResult SelectCustomer(FormCollection formCollection) { try { if(!MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { TempData[TempDataConstants.DoLogoutKey] = true; 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")) { TempData[TempDataConstants.DoLogoutKey] = true; 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"); } #region Dokumente [Authorize] public ActionResult SaveDescriptionChange(string descriptionText, long? fileOid) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn()) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("DocumentPartial"); } if(Model.SelectedCustomerOid is null || fileOid is null) { TempData[TempDataConstants.ErrorAlertPopupMessage] = "Es ist leider ein unbekannter Fehler aufgetreten.

Bitte kontaktieren Sie einen Administrator."; return PartialView("DocumentPartial", Model); } var file = DownloadService.GetFileAttachmentForMobile(fileOid.Value, MobileSessionFacade.Tenant); if(file != null) { file.Description = descriptionText; OperationsService.UpdateFileAttachment(file); } Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, Model.SelectedCustomerOid.Value); return PartialView("DocumentPartial", Model); } [Authorize] public FileResult DownloadFile(long fileOid) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { TempData[TempDataConstants.DoLogoutKey] = true; return null; } var fileAttachment = DownloadService.GetFileAttachmentForMobile(fileOid, MobileSessionFacade.Tenant); return File(fileAttachment.BinaryData, "application/octet-stream", fileAttachment.FileName); } [Authorize] public ActionResult DeleteFile(long? fileOid, long? fileVersion) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn()) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("DocumentPartial"); } if(fileOid is null || fileVersion is null || Model.SelectedCustomerOid is null) { return PartialView("DocumentPartial", Model); } OperationsService.DeleteFileAttachment(fileOid.Value, fileVersion.Value); Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, Model.SelectedCustomerOid.Value); return PartialView("DocumentPartial", Model); } [Authorize] [HttpPost] public ActionResult UploadFile(FormCollection formCollection) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("DocumentPartial"); } if(Request.Files.Count > 0) { var folderOidAsString = formCollection["folder-oid-input"]; var description = formCollection["file-description-input"]; var folderOid = string.IsNullOrWhiteSpace(folderOidAsString) ? null : (long?) long.Parse(folderOidAsString); var file = Request.Files[0]; if(file != null && file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); byte[] fileData; using(var binaryReader = new BinaryReader(file.InputStream)) { fileData = binaryReader.ReadBytes(file.ContentLength); } var fileAttachment = new FileAttachmentDC { BeWoFolderOid = folderOid, Description = description, FileName = fileName, ObjectTid = TableID.Customer, ObjectOid = Model.SelectedCustomerOid, BinaryData = fileData, FileAttachmentType = FileAttachmentType.NotSpecified, InsertedBy = $"{Model.LoggedInEmployee.FirstName} {Model.LoggedInEmployee.LastName}", InsertedOn = DateTime.Now }; OperationsService.InsertFileAttachment(fileAttachment); } } return RedirectToActionPermanent("Customer", new { id = Model.SelectedCustomerOid, model = Model }); } [Authorize] public ActionResult DeleteFolder(long? folderOid) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("DocumentPartial"); } if(folderOid is null) { return PartialView("DocumentPartial", Model); } var folder = OperationsService.GetFolderById(folderOid.Value); if(folder?.BeWoFolderOid != null && folder.BeWoFolderVersion.HasValue && Model.SelectedCustomerOid.HasValue && folder.ObjectOid.Equals(Model.SelectedCustomerOid.Value) && folder.ObjectTid == TableID.Customer) { OperationsService.DeleteFolder(folder.BeWoFolderOid.Value, folder.BeWoFolderVersion.Value); Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, Model.SelectedCustomerOid.Value); } return PartialView("DocumentPartial", Model); } [Authorize] public ActionResult RenameFolder(string newName, long folderOid) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("DocumentPartial"); } if(string.IsNullOrWhiteSpace(newName)) { TempData[TempDataConstants.ErrorMessageKey] = "Ungültiger Name"; return PartialView("DocumentPartial", Model); } var folder2Rename = OperationsService.GetFolderById(folderOid); if(folder2Rename != null && Model.SelectedCustomerOid.HasValue && folder2Rename.ObjectTid == TableID.Customer && folder2Rename.ObjectOid == Model.SelectedCustomerOid.Value) { folder2Rename.Name = newName; OperationsService.UpdateFolder(folder2Rename); Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, Model.SelectedCustomerOid.Value); } return PartialView("DocumentPartial", Model); } [Authorize] public ActionResult AddNewFolder(string folderName, long? parentFolderOid) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("DocumentPartial"); } if(Model.SelectedCustomerOid is null) { return PartialView("DocumentPartial", Model); } if(string.IsNullOrWhiteSpace(folderName)) { folderName = "Neuer Ordner"; } var folder = new BeWoFolderDC { Name = folderName, ObjectTid = TableID.Customer, ObjectOid = Model.SelectedCustomerOid, ParentBeWoFolderOid = parentFolderOid }; OperationsService.InsertNewFolder(folder); Model.FolderTree = OperationsService.GetFolderTree(TableID.Customer, Model.SelectedCustomerOid.Value); return PartialView("DocumentPartial", Model); } #endregion [Authorize] public string SaveEditedNotice(string newNotice) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer")) { Logout(); return LeerzeichenFuerGetMethoden; } var isAllowedToEdit = 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] public ActionResult UpdateCustomer(FormCollection formCollection) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return Logout(); } var firstname = formCollection["vorname"]?.RemoveUppercaseEsszett(); var lastname = formCollection["nachname"]?.RemoveUppercaseEsszett(); var alias = formCollection["alias"]?.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 krankenkasse = formCollection["krankenkasse"]; var versichertennummer = formCollection["versichertennummer"]; var versichertenstatus = formCollection["versichertenstatus"]; var customer = Model.SelectedCustomer; if(customer is null) { return RedirectToActionPermanent("Customer"); } customer.FirstName = firstname; customer.LastName = lastname; customer.CustomerAlias = alias; 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.HealthInsurance = krankenkasse; customer.InsuranceNumber = versichertennummer; customer.VersichertenStatus = versichertenstatus; 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); LoadCustomerToModel(customer.CustomerOid); return RedirectToActionPermanent("Customer", new { id = customer.CustomerOid }); } [Authorize] public override string ResetReport() { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return LeerzeichenFuerGetMethoden; } Model.Report = null; Model.ReportName = null; return LeerzeichenFuerGetMethoden; } #region Medikamentenverordnungen [Authorize] public ActionResult ShowMedList(int reportType) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || !Model.IsAllowedToSeeMedikamentenliste) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("BeWoReportPartial", Model); } var selectedReportType = (CustomerReportType)reportType; SelectReport(selectedReportType); return PartialView("BeWoReportPartial", Model); } [Authorize] public ActionResult ShowHistoricalMedList(long medListOid) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || !Model.IsAllowedToSeeMedikamentenliste) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("BeWoReportPartial", Model); } Model.SelectedReportType = CustomerReportType.Historie; GenerateMobileMedListForSelectedCustomer(medListOid); return PartialView("BeWoReportPartial", Model); } [Authorize] public ActionResult DeleteHistoricalMedList(long medListOid) { if(Model is null || !MobileSessionFacade.IsUserLoggedIn() || Request.Browser.Browser.Equals("InternetExplorer") || !Model.IsAllowedToSeeMedikamentenliste) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerMedListPartial", Model); } Model.SelectedReportType = CustomerReportType.Historie; CustomerService.DeleteMedikamentenverordnungsliste(medListOid); LoadCustomerToModel(Model.SelectedCustomerOid); return PartialView("CustomerMedListPartial", Model); } private void SelectReport(CustomerReportType selectedReportType) { Model.SelectedReportType = selectedReportType; GenerateMobileMedListForSelectedCustomer(); } private 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; Model.BargeldkassenReportName = null; Model.BargeldkassenReportObject = null; Model.ZahlungsbelegsReportObject = null; } } #endregion #region Bargeldkassen [Authorize] private void ReloadBargeldkassen() { if(Model?.SelectedCustomer?.CustomerOid is null) { return; } Model.Bargeldkassen = OperationsService.LoadBargeldkassenForObject(TableID.Customer, Model.SelectedCustomer.CustomerOid.Value); // ToDo: alle Transaktionen durchgehen und schauen, ob es HistoryEntries gibt und in Model.TransaktionsOids2HasHistoryEntries speichern // ToDo: Funktion für das Laden aller Transaktionen durch BargeldkassenOids implementieren im SearchDAO-Objekt var transactions = new List(); Model.Bargeldkassen.DoForEach(bargeldkasse => { transactions.AddRangeIfElementsNotIn(bargeldkasse.Bargeldtransaktionen.Where(t => t.BargeldtransaktionOid.HasValue)); }); var historyEntries = OperationsService.LoadBargeldtransaktionshistoryEntriesByTransaktionsOids(transactions.Where(t => t.BargeldtransaktionOid.HasValue).Select(t => t.BargeldtransaktionOid.Value).ToList()); Model.TransaktionsOid2HasHistoryEntries = new Dictionary(); transactions.DoForEach(transaction => { if(transaction.BargeldtransaktionOid is null) { return; } Model.TransaktionsOid2HasHistoryEntries.AddOrUpdate(transaction.BargeldtransaktionOid.Value, historyEntries.Any(a => a.BargeldtransaktionOid.HasValue && a.BargeldtransaktionOid.Value.Equals(transaction.BargeldtransaktionOid.Value))); }); } [Authorize] public string SelectBargeldkasse(long oid) { if(Model is null) { Logout(); return LeerzeichenFuerGetMethoden; } //var selectedBargeldkasse = Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.BargeldkassenOid.HasValue && bargeldkasse.BargeldkassenOid.Value.Equals(oid)); //Model.SelectedBargeldkasse = selectedBargeldkasse; Model.SelectedBargeldkasseOid = oid; return LeerzeichenFuerGetMethoden; } [Authorize] public string DeselectBargeldkasse() { if(Model is null) { Logout(); return LeerzeichenFuerGetMethoden; } //Model.SelectedBargeldkasse = null; Model.SelectedBargeldkasseOid = null; return LeerzeichenFuerGetMethoden; } [Authorize] public ActionResult LoadFormPartial() { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldkassenFormPartial", Model); } Model.SelectedBargeldkasseOid = null; Model.SelectedAuszahlungsintervall = 0; return PartialView("CustomerBargeldkassenFormPartial", Model); } [Authorize] public ActionResult LoadEditFormPartial(long bargeldkassenOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldkassenFormPartial", Model); } Model.SelectedBargeldkasseOid = bargeldkassenOid; Model.SelectedBargeldkasse = Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.BargeldkassenOid.HasValue && bargeldkasse.BargeldkassenOid.Value.Equals(bargeldkassenOid)); if(Model.SelectedBargeldkasse != null) { Model.SelectedAuszahlungsintervall = (int) Model.SelectedBargeldkasse.Auszahlungsintervall; } return PartialView("CustomerBargeldkassenFormPartial", Model); } [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) { TempData[TempDataConstants.DoLogoutKey] = true; 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); //ReloadBargeldkassen(); return RedirectToActionPermanent("Customer"); } [Authorize] [HttpPost] public ActionResult CreateOrUpdateBargeldkasse(FormCollection formCollection) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return Logout(); } var name = formCollection["bargeldkassenname"]; var rawAnfangsbestand = formCollection["bargeldkassenanfangsbestand"]; decimal.TryParse(rawAnfangsbestand.Replace(".", ","), out var anfangsbestand); var auszahlungsintervall = (Auszahlungsintervall) Model.SelectedAuszahlungsintervall; if(Model.SelectedBargeldkasse is null) { var newBargeldkasse = new BargeldkassenDC { Anfangsbestand = anfangsbestand, Kassenname = name, Auszahlungsintervall = auszahlungsintervall, ObjectOid = Model.SelectedCustomerOid, ObjectTid = TableID.Customer }; OperationsService.InsertNewBargeldkasse(newBargeldkasse); //LoadCustomerToModel(Model.SelectedCustomerOid); } else { var bargeldkasse = Model.SelectedBargeldkasse; if(!string.IsNullOrWhiteSpace(name)) { bargeldkasse.Kassenname = name; } bargeldkasse.Auszahlungsintervall = auszahlungsintervall; bargeldkasse.Anfangsbestand = anfangsbestand; OperationsService.UpdateBargeldkasse(bargeldkasse); //LoadCustomerToModel(Model.SelectedCustomerOid); } //Model.SelectedBargeldkasse = null; Model.SelectedBargeldkasseOid = null; return RedirectToActionPermanent("Customer"); } [Authorize] public ActionResult PrintBargeldkasse(long kassenbuchOid, string reportStartDate, string reportEndDate) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("BeWoReportPartial", Model); } var bargeldkasse = Model.Bargeldkassen.FirstOrDefault(f => f.BargeldkassenOid.HasValue && f.BargeldkassenOid.Value.Equals(kassenbuchOid)); var startDate = DateTime.TryParse(reportStartDate, out var parsedStartDate) ? parsedStartDate : DateTime.Today.GetFirstOfMonth(); var endDate = DateTime.TryParse(reportEndDate, out var parsedEndDate) ? parsedEndDate : DateTime.Today.GetLastOfMonth(); if(bargeldkasse?.ObjectOid is null) { return PartialView("BeWoReportPartial", Model); } var bargeldkassenReportZeitraum = startDate.Equals(startDate.GetFirstOfMonth()) && endDate.Equals(startDate.GetLastOfMonth()) ? $"{startDate:MMMM} {startDate:yyyy}" : $"{startDate:dd.MM.yyyy} bis {endDate:dd.MM.yyyy}"; var name = $"Kassenbuch \"{bargeldkasse.Kassenname}\" {bargeldkassenReportZeitraum} von {Model.SelectedCustomer.FirstName} {Model.SelectedCustomer.LastName}"; var memoryStream = ReportService.CreateKassenbuchReportImZeitraum(startDate, endDate, bargeldkasse, bargeldkasse.ObjectOid.Value, bargeldkasse.ObjectTid); var report = new XtraReport(); report.PrintingSystem.LoadDocument(memoryStream); Model.Report = report; Model.ReportName = name; return PartialView("BeWoReportPartial", Model); } [Authorize] public string SetSelectedAuszahlungsintervall(int auszahlungsintervall) { Model.SelectedAuszahlungsintervall = auszahlungsintervall < 4 && auszahlungsintervall >= 0 ? auszahlungsintervall : 0; return LeerzeichenFuerGetMethoden; } [Authorize] public ActionResult DownloadZahlungsbeleg(long transaktionsOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("BeWoReportPartial", Model); } var kassenbuch = Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.Bargeldtransaktionen.Any(transaktion => transaktion.BargeldtransaktionOid.Equals(transaktionsOid))); var zahlung = kassenbuch?.Bargeldtransaktionen.FirstOrDefault(bargeldtransaktion => bargeldtransaktion.BargeldtransaktionOid.Equals(transaktionsOid)); if(zahlung != null && kassenbuch.ObjectOid.HasValue) { var memoryStream = ReportService.CreateKassenbelegReport(zahlung, kassenbuch.ObjectOid.Value, kassenbuch.ObjectTid); var report = new XtraReport(); report.PrintingSystem.LoadDocument(memoryStream); Model.Report = report; Model.ReportName = "Zahlungsbeleg"; } return PartialView("BeWoReportPartial", Model); } [Authorize] public ActionResult LoadBargeldtransaktionsEditForm(long transaktionsOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldtransaktionenFormPartial"); } var kassenbuch = GetBargeldkasseByTransaktionsOid(transaktionsOid); var zahlung = kassenbuch?.Bargeldtransaktionen.FirstOrDefault(bargeldtransaktion => bargeldtransaktion.BargeldtransaktionOid.Equals(transaktionsOid)); Model.SelectedBargeldtransaktion = zahlung; if(zahlung != null) { Model.SelectedTransaktionsart = (int) zahlung.Zahlungstyp; } //Model.SelectedBargeldkasse = kassenbuch; Model.SelectedBargeldkasseOid = kassenbuch.BargeldkassenOid; return PartialView("CustomerBargeldtransaktionenFormPartial", Model); } private BargeldkassenDC GetBargeldkasseByTransaktionsOid(long transaktionsOid) { return Model.Bargeldkassen.FirstOrDefault(bargeldkasse => bargeldkasse.Bargeldtransaktionen.Any(transaktion => transaktion.BargeldtransaktionOid.Equals(transaktionsOid))); } [Authorize] public string SetTransaktionsart(int transaktionsart) { Model.SelectedTransaktionsart = transaktionsart < 2 && transaktionsart >= 0 ? transaktionsart : 0; return LeerzeichenFuerGetMethoden; } [Authorize] public ActionResult LoadBargeldtransaktionsForm(long bargeldkassenOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldtransaktionenFormPartial"); } Model.SelectedBargeldtransaktion = null; Model.SelectedTransaktionsart = 0; Model.SelectedBargeldkasseOid = bargeldkassenOid; //Model.SelectedBargeldkasse = Model.Bargeldkassen.FirstOrDefault(bk => bk.BargeldkassenOid.HasValue && bk.BargeldkassenOid.Equals(bargeldkassenOid)); return PartialView("CustomerBargeldtransaktionenFormPartial", Model); } [Authorize] public ActionResult CreateOrUpdateBargeldTransaktion2(string rawDate, string rawArt, string rawBetrag, string belegnummer, string notice) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldkassen"); } var transaktion2Edit = Model.SelectedBargeldtransaktion; var bargeldkasse = Model.SelectedBargeldkasse; var isNew = transaktion2Edit is null; var isArtValid = Enum.TryParse(rawArt, out Zahlungstyp art); var isDateValid = DateTime.TryParse(rawDate, out var datum); var isBetragValid = decimal.TryParse(rawBetrag.Replace('.', ','), NumberStyles.AllowDecimalPoint, new CultureInfo("DE-de"), out var betrag); if(!isDateValid || !isBetragValid || betrag <= 0) { TempData[TempDataConstants.CustomerBargeldkassenErrorMessageKey] = "Datum oder Betrag sind ungültig!"; return PartialView("CustomerBargeldkassen", Model); } if(bargeldkasse is null) { TempData[TempDataConstants.CustomerBargeldkassenErrorMessageKey] = "Beim Speichern der Transaktion ist ein Fehler aufgetreten. Bitte wenden Sie sich an Ihren Administrator."; return PartialView("CustomerBargeldkassen", Model); } if(isNew) { bargeldkasse.Bargeldtransaktionen.Add(new BargeldtransaktionDC { Belegnummer = belegnummer, Betrag = betrag, Notice = notice, Zahlungsdatum = datum, Zahlungstyp = art }); } else { foreach(var bargeldtransaktion in bargeldkasse.Bargeldtransaktionen) { if(transaktion2Edit.BargeldtransaktionOid.HasValue && (bargeldtransaktion.BargeldtransaktionOid?.Equals(transaktion2Edit.BargeldtransaktionOid.Value) ?? false)) { bargeldtransaktion.Belegnummer = belegnummer; bargeldtransaktion.Betrag = betrag; bargeldtransaktion.Notice = notice; bargeldtransaktion.Zahlungsdatum = datum; bargeldtransaktion.Zahlungstyp = art; break; } } } OperationsService.UpdateBargeldkasse(bargeldkasse); Model.SelectedBargeldkasseOid = null; ReloadBargeldkassen(); return PartialView("CustomerBargeldkassen", Model); } [Authorize] public ActionResult DeleteBargeldtransaktion(long? bargeldtransaktionsOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldkassen"); } if(bargeldtransaktionsOid is null) { TempData[TempDataConstants.CustomerBargeldkassenErrorMessageKey] = "Es ist ein Fehler beim Löschen der Bargeldtransaktion aufgetreten. Bitte wenden Sie sich an Ihren Administrator."; return PartialView("CustomerBargeldkassen", Model); } var bargeldkasse = GetBargeldkasseByTransaktionsOid(bargeldtransaktionsOid.Value); var bargeldtransaktion = bargeldkasse.Bargeldtransaktionen.FirstOrDefault(f => f.BargeldtransaktionOid.HasValue && f.BargeldtransaktionOid.Value.Equals(bargeldtransaktionsOid)); if(bargeldtransaktion is null) { TempData[TempDataConstants.CustomerBargeldkassenErrorMessageKey] = "Es ist ein Fehler beim Löschen der Bargeldtransaktion aufgetreten. Bitte wenden Sie sich an Ihren Administrator."; return PartialView("CustomerBargeldkassen", Model); } bargeldkasse.Bargeldtransaktionen.Remove(bargeldtransaktion); OperationsService.UpdateBargeldkasse(bargeldkasse); if(Model.SelectedCustomer?.CustomerOid is null) { TempData[TempDataConstants.CustomerBargeldkassenErrorMessageKey] = "Es ist ein Fehler beim Laden der Bargeldkassen aufgetreten. Bitte wenden Sie sich an Ihren Administrator."; return PartialView("CustomerBargeldkassen", Model); } // ReloadBargeldkassen(); return PartialView("CustomerBargeldkassen", Model); } [Authorize] public ActionResult SaveTransaktionsunterschrift(long transaktionsOid, string signatureAsBase64) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldkassen"); } var bargeldkasse = GetBargeldkasseByTransaktionsOid(transaktionsOid); var transaktion = bargeldkasse?.Bargeldtransaktionen.FirstOrDefault(f => f.BargeldtransaktionOid.HasValue && f.BargeldtransaktionOid.Value.Equals(transaktionsOid)); if(transaktion is null) { TempData[TempDataConstants.CustomerBargeldkassenErrorMessageKey] = "Beim Speichern der Transaktionsunterschrift ist ein Fehler aufgetreten. Bitte wenden Sie sich an Ihren Administrator."; return PartialView("CustomerBargeldkassen", Model); } long? signatureOid; using(var signatureBitmap = SignatureUtils.Base64StringToBitmap(signatureAsBase64.Split(',')[1])) { var isValid = SignatureUtils.ValidateSignature(signatureBitmap); if(!isValid) { TempData[TempDataConstants.CustomerBargeldkassenErrorMessageKey] = "Das Unterschriftenfeld darf nicht leer sein."; } signatureOid = OperationsService.InsertSignature(new SignatureDC { DataBild = signatureAsBase64, BargeldtransaktionsOid = transaktionsOid, Zeitstempel = DateTime.Now }).SignatureOid; } if(signatureOid.HasValue) { foreach(var bargeldtransaktion in bargeldkasse.Bargeldtransaktionen) { if(bargeldtransaktion.BargeldtransaktionOid.HasValue && bargeldtransaktion.BargeldtransaktionOid.Value.Equals(transaktionsOid)) { bargeldtransaktion.SignatureOid = signatureOid; } } OperationsService.UpdateBargeldkasse(bargeldkasse); } //ReloadBargeldkassen(); return PartialView("CustomerBargeldkassen", Model); } [Authorize] public ActionResult DeleteTransactionSignature(long transactionOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldkassen"); } BargeldkassenDC bargeldkasse = null; BargeldtransaktionDC transaction = null; foreach(var item in Model.Bargeldkassen) { transaction = item.Bargeldtransaktionen.FirstOrDefault(t => t.BargeldtransaktionOid.Equals(transactionOid)); if(transaction == null) { continue; } bargeldkasse = item; break; } var signatureOid = transaction?.SignatureOid; if(signatureOid.HasValue) { bargeldkasse.Bargeldtransaktionen.DoForEach(t => { if(t.BargeldtransaktionOid.Equals(transactionOid)) { t.SignatureOid = null; } }); OperationsService.DeleteBargeldtransaktionSignature(signatureOid.Value); OperationsService.UpdateBargeldkasse(bargeldkasse); //ReloadBargeldkassen(); } return PartialView("CustomerBargeldkassen", Model); } [Authorize] public ActionResult LoadHistoryEntries(long transactionOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerBargeldtransaktionshistorienPartial"); } var historyEntries = OperationsService.LoadBargeldtransaktionshistoryEntries(transactionOid); Model.BargeldtransaktionshistoryEntries = historyEntries.OrderByDescending(he => he.InsertedOn).ToList(); return PartialView("CustomerBargeldtransaktionshistorienPartial", Model); } [Authorize] public string ClearHistoryEntries() { Model?.BargeldtransaktionshistoryEntries.Clear(); return LeerzeichenFuerGetMethoden; } [Authorize] public string CheckForExistingSignature() { return (Model?.SelectedBargeldtransaktion?.SignatureOid.HasValue ?? false) ? "1" : "0"; } #endregion #region Abwesenheiten [Authorize] [HttpPost] public ActionResult CreateOrUpdateAbsenceTime(FormCollection formCollection) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return Logout(); } 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 allDay = "on" == formCollection["customer-absence-time-allday-cb"]; if(allDay) { startTimeString = null; endTimeString = null; } 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.SelectedAbsenceReasonOid = -1; return RedirectToActionPermanent("Customer", new { id = customer.CustomerOid }); } [Authorize] [HttpPost] public ActionResult SelectAbsenceTime(long absenceTimeOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return Logout(); } 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.SelectedAbsenceTimeOid = absenceTimeOid; Model.SelectedAbsenceReasonOid = 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.SelectedAbsenceTimeOid = absenceTimeOid; Model.SelectedAbsenceReasonOid = selectedAbsenceTime.Reason.AbsenceReasonOid; return LeerzeichenFuerGetMethoden; } [Authorize] public ActionResult LoadAbsenceTimeToForm() { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; } return PartialView("CustomerAbsenceTimeFormPartial", Model); } [Authorize] public string DeselectAbsenceTime() { Model.SelectedAbsenceTimeOid = null; Model.SelectedAbsenceReasonOid = -1; return LeerzeichenFuerGetMethoden; } [Authorize] public ActionResult DeleteAbsenceTime(long absenceTimeOid) { if(Model is null) { TempData[TempDataConstants.DoLogoutKey] = true; return PartialView("CustomerAbsenceTimePartial"); } var absenceTime2Delete = Model.SelectedCustomer.AbsenceTimes.FirstOrDefault(absenceTime => absenceTime.AbsenceTimeOid.HasValue && absenceTime.AbsenceTimeOid.Equals(absenceTimeOid)); if(absenceTime2Delete is null) { ViewData["AbsenceTimeError"] = "Beim Löschen der Abwesenheit ist ein Fehler aufgetreten!

Bitte wenden Sie sich an Ihren Administrator."; } var customer = Model.SelectedCustomer; customer.AbsenceTimes.Remove(absenceTime2Delete); CustomerService.UpdateCustomer(customer); LoadCustomerToModel(customer.CustomerOid); return PartialView("CustomerAbsenceTimePartial", Model); } #endregion [Authorize] public override string SaveCollapsibleStatus(bool isOpen, string identifier) { Model.Collapsibles2IsShown[identifier] = isOpen; return LeerzeichenFuerGetMethoden; } } public enum CustomerReportType { Medikamentenliste = 0, Bedarfsmedikation = 1, Historie = 2 } }