/// <summary> /// Выдать права на документ по правилу. /// </summary> /// <param name="document">Документ.</param> /// <param name="rule">Правило.</param> /// <returns>Возвращает true, если права удалось выдать, false - если надо повторить позже.</returns> public static bool TryGrantRightsToDocument(IOfficialDocument document, IAccessRightsRule rule) { Logger.DebugFormat("TryGrantRightsToDocument: document {0}, rule {1}", document.Id, rule.Id); var isChanged = false; foreach (var member in rule.Members) { if (!document.AccessRights.IsGrantedDirectly(Docflow.PublicFunctions.Module.GetRightTypeGuid(member.RightType), member.Recipient)) { if (Locks.GetLockInfo(document).IsLockedByOther) { return(false); } document.AccessRights.Grant(member.Recipient, Docflow.PublicFunctions.Module.GetRightTypeGuid(member.RightType)); isChanged = true; } } if (isChanged) { ((Domain.Shared.IExtendedEntity)document).Params[Constants.OfficialDocument.DontUpdateModified] = true; document.Save(); } return(true); }
/// <summary> /// Фильтр для категорий договоров. /// </summary> /// <param name="rule">Правило.</param> /// <param name="query">Ленивый запрос документов.</param> /// <returns>Относительно ленивый запрос с категориями.</returns> private static IEnumerable <int> FilterDocumentsByGroups(IAccessRightsRule rule, IQueryable <IOfficialDocument> query) { foreach (var document in query) { var documentGroup = Functions.OfficialDocument.GetDocumentGroup(document); if (rule.DocumentGroups.Any(k => Equals(k.DocumentGroup, documentGroup))) { yield return(document.Id); } } }
/// <summary> /// Получить документы по правилу. /// </summary> /// <param name="rule">Правило.</param> /// <returns>Документы по правилу.</returns> private static IEnumerable <int> GetDocumentsByRule(IAccessRightsRule rule) { var documentKinds = rule.DocumentKinds.Select(t => t.DocumentKind).ToList(); var businessUnits = rule.BusinessUnits.Select(t => t.BusinessUnit).ToList(); var departments = rule.Departments.Select(t => t.Department).ToList(); var documents = OfficialDocuments.GetAll() .Where(d => !documentKinds.Any() || documentKinds.Contains(d.DocumentKind)) .Where(d => !businessUnits.Any() || businessUnits.Contains(d.BusinessUnit)) .Where(d => !departments.Any() || departments.Contains(d.Department)); if (rule.DocumentGroups.Any()) { return(FilterDocumentsByGroups(rule, documents)); } else { return(documents.Select(d => d.Id)); } }
/// <summary> /// Создать элемент очереди выдачи прав. /// </summary> /// <param name="documentId">ИД документа.</param> /// <param name="rule">Правило.</param> /// <param name="rightType">Тип элемента.</param> /// <returns>Структура для сохранения в таблицу очереди выдачи прав.</returns> private static Structures.DocumentGrantRightsQueueItem.ProxyQueueItem CreateAccessRightsQueueItem(int documentId, IAccessRightsRule rule, Enumeration rightType) { Logger.DebugFormat("CreateAccessRightsQueueItem: document {0}, rule {1}, rightType {2}", documentId, rule.Id, rightType); var queueItem = Structures.DocumentGrantRightsQueueItem.ProxyQueueItem.Create(); queueItem.Discriminator = DocumentGrantRightsQueueItem.ClassTypeGuid; queueItem.DocumentId_Docflow_Sungero = documentId; queueItem.AccessRights_Docflow_Sungero = rule.Id; queueItem.ChangedType_Docflow_Sungero = rightType.Value; return(queueItem); }