diff --git a/Data/Security/UserRightHelper.cs b/Data/Security/UserRightHelper.cs index 57af77f48..5043ccdd7 100644 --- a/Data/Security/UserRightHelper.cs +++ b/Data/Security/UserRightHelper.cs @@ -193,6 +193,8 @@ namespace BeWo.Data.Security return "3.30"; if (isRightVersion331(r)) return "3.31"; + if (isRightVersion332(r)) + return "3.32"; return BASE_VERSION; } @@ -252,5 +254,10 @@ namespace BeWo.Data.Security || r == UserRightType.Customer_DeleteMedication; } + private static bool isRightVersion332(UserRightType r) + { + return r == UserRightType.Employee_AllowDeleteAbsenceTimesAfterExpiry; + } + } } diff --git a/Service/ServiceImplementations/CustomerServiceImp.cs b/Service/ServiceImplementations/CustomerServiceImp.cs index 5ed56b8ec..8ef2fb5bc 100644 --- a/Service/ServiceImplementations/CustomerServiceImp.cs +++ b/Service/ServiceImplementations/CustomerServiceImp.cs @@ -1569,7 +1569,24 @@ namespace BeWo.Service.ServiceImplementations { try { - ServiceLogic.SetActivationType(pOid2Version, ActivationTypeId.Deleted); + var user = GetLoggedInUser(); + if (!UserRightHelper.UserHasRight(user, UserRightType.Employee_AllowDeleteAbsenceTimesAfterExpiry)) + { + var forbiddenOids = DAOFactory.GenericDAO.LoadByIDs(pOid2Version.Keys) + .Where(a => a.EmployeeOid != null && a.End.HasValue && a.End.Value.Date < DateTime.Today) + .Select(a => a.Oid.Value) + .ToList(); + + foreach (var oid in forbiddenOids) + { + pOid2Version.Remove(oid); + } + } + + if (pOid2Version.Count > 0) + { + ServiceLogic.SetActivationType(pOid2Version, ActivationTypeId.Deleted); + } } catch (Exception e) { diff --git a/Service/ServiceImplementations/OperationsServiceImp.cs b/Service/ServiceImplementations/OperationsServiceImp.cs index 9215779a4..6f02e5b03 100644 --- a/Service/ServiceImplementations/OperationsServiceImp.cs +++ b/Service/ServiceImplementations/OperationsServiceImp.cs @@ -3,6 +3,7 @@ using BeWo.Data.Access; using BeWo.Data.Entities; using BeWo.Data.ICD10; using BeWo.Data.ICF; +using BeWo.Data.Security; using BeWo.Data.Utils; using BeWo.Service.AI; using BeWo.Service.Configuration; @@ -4391,8 +4392,15 @@ namespace BeWo.Service.ServiceImplementations { //ServiceLogic.SetActivationType(pOid2Version, ActivationTypeId.Deleted); - var lOriginals = DAOFactory.GenericDAO.LoadByIDs(pOid2Version.Select(e => e.Key)).Where(e => e.SystemEntryID == null).ToList(); - DAOFactory.GenericDAO.Delete(lOriginals); + var abwesenheiten = DAOFactory.GenericDAO.LoadByIDs(pOid2Version.Select(e => e.Key)).Where(e => e.SystemEntryID == null).ToList(); + + var user = SecurityUtils.GetLoggedInUser(); + if (!UserRightHelper.UserHasRight(user, UserRightType.Employee_AllowDeleteAbsenceTimesAfterExpiry)) + { + abwesenheiten = abwesenheiten.Where(a => a.EmployeeOid == null || !a.End.HasValue || a.End.Value.Date >= DateTime.Today).ToList(); + } + + DAOFactory.GenericDAO.Delete(abwesenheiten); } catch (Exception e) { @@ -6876,6 +6884,12 @@ namespace BeWo.Service.ServiceImplementations { try { + var user = SecurityUtils.GetLoggedInUser(); + if (absenceTimeDC.IsInThePast && !UserRightHelper.UserHasRight(user, UserRightType.Employee_AllowDeleteAbsenceTimesAfterExpiry)) + { + throw new InvalidOperationException("Sie haben nicht das Recht, bereits vergangene Abwesenheiten zu löschen."); + } + var emp = DAOFactory.GenericDAO.GetByID(absenceTimeDC.EmployeeOid.Value); emp.AbsenceTimes.Remove(emp.AbsenceTimes.First(a => a.Oid == absenceTimeDC.AbsenceTimeOid)); DAOFactory.GenericDAO.Update(emp); diff --git a/Shared/BeWoEntityEnums.cs b/Shared/BeWoEntityEnums.cs index 539db34d0..28d9f78e7 100644 --- a/Shared/BeWoEntityEnums.cs +++ b/Shared/BeWoEntityEnums.cs @@ -463,6 +463,7 @@ namespace BS.Shared Employee_AllowViewOwnTeam = 20006, Employee_AllowEditAbsenceTimes = 20007, Employee_AllowEditOvertimes = 20008, + Employee_AllowDeleteAbsenceTimesAfterExpiry = 20009, Employee_ViewNotizen = 20010, Employee_EditNotizen = 20011, diff --git a/Shared/Core/EnumTranslations.cs b/Shared/Core/EnumTranslations.cs index edadf4387..8445c1784 100644 --- a/Shared/Core/EnumTranslations.cs +++ b/Shared/Core/EnumTranslations.cs @@ -747,6 +747,7 @@ namespace BS.Shared.Core dict.Add(UserRightType.Employee_ViewNotizen, Translator.Translate("MitarbeiterSingular") + " Notizen ansehen"); dict.Add(UserRightType.Employee_EditNotizen, Translator.Translate("MitarbeiterSingular") + " Notizen bearbeiten"); dict.Add(UserRightType.Employee_DeleteNotizen, Translator.Translate("MitarbeiterSingular") + " Notizen löschen"); + dict.Add(UserRightType.Employee_AllowDeleteAbsenceTimesAfterExpiry, Translator.Translate("MitarbeiterSingular") + " Abwesenheiten löschen nach Ablauf"); dict.Add(UserRightType.OrganisationView_Create, Translator.Translate("Organisationen anlegen")); dict.Add(UserRightType.OrganisationView_Delete, Translator.Translate("Organisationen löschen")); @@ -909,6 +910,7 @@ namespace BS.Shared.Core dict.Add(UserRightType.KalenderRessourcentermineAndererAendern, "Termine mit Ressourcen anderer " + Translator.Translate("MitarbeiterPlural") + " ändern"); dict.Add(UserRightType.KalenderInZeiterfassungUebernehmen, Translator.Translate("Termine in Zeiterfassung übernehmen")); dict.Add(UserRightType.KalenderInAbwesenheitenUebernehmen, Translator.Translate("Termine in Abwesenheiten übernehmen")); + dict.Add(UserRightType.KalenderRessourcenDoppeltBuchen, Translator.Translate("Ressourcen doppelt buchen")); dict.Add(UserRightType.TextbausteineAlleAnsehen, Translator.Translate("Textbausteine ansehen (allgemeine)")); dict.Add(UserRightType.TextbausteineNurEigeneAnsehen, Translator.Translate("Textbausteine ansehen (eigene)")); dict.Add(UserRightType.TextbausteineAlleBearbeiten, Translator.Translate("Textbausteine bearbeiten (allgemeine)")); diff --git a/Shared/DataContracts/AbsenceTimeDC.cs b/Shared/DataContracts/AbsenceTimeDC.cs index 421712735..df04aa0d0 100644 --- a/Shared/DataContracts/AbsenceTimeDC.cs +++ b/Shared/DataContracts/AbsenceTimeDC.cs @@ -38,6 +38,8 @@ namespace BS.Shared.DataContracts [DataMember] public string BackgroundColor { get; set; } + public bool IsInThePast => End.HasValue && End.Value.Date < DateTime.Today; + public bool IsAllDay { get