public List <IApprovalRuleBase> GetRulesWithImpossibleRoles() { var roles = _obj.ApprovalRoles.Where(r => r != null).Select(r => r.ApprovalRole.Type).ToList(); if (_obj.ApprovalRole != null) { roles.Add(_obj.ApprovalRole.Type); } if (_obj.ReworkApprovalRole != null) { roles.Add(_obj.ReworkApprovalRole.Type); } if (roles.Any()) { var rules = Functions.ApprovalStage.GetApprovalRules(_obj).Where(r => r.Status == Sungero.CoreEntities.DatabookEntry.Status.Active).ToList(); // Проверка на адресата, подписывающего и их помощников. var impossibleRules = rules.Where(x => Functions.ApprovalRuleBase.GetAllStagesVariants(x).AllSteps.Any(y => Functions.ApprovalRuleBase.CheckImpossibleRoles(x, y, false, roles).Any())).ToList(); // Проверка ответственного за договор и руководителя ответственного за договор. if (roles.Any(x => Equals(x, Docflow.ApprovalRoleBase.Type.ContractResp) || Equals(x, Docflow.ApprovalRoleBase.Type.ContRespManager))) { foreach (var role in rules.Where(x => ApprovalRules.Is(x))) { impossibleRules.Add(role); } } return(impossibleRules); } return(new List <IApprovalRuleBase>()); }
public static void CreateApprovalRule(string name, List <Enumeration> stages) { // Проверить наличие правил НЕ по умолчанию. var hasNotDefaultRule = ApprovalRuleBases.GetAll().Any(r => r.IsDefaultRule != true); // Проверить, есть ли похожее правило: по умолчанию, внутренний документопоток, // в правиле указаны виды документов, все виды документов проектного типа. var hasDefaultRule = ApprovalRuleBases.GetAll().Any(r => r.IsDefaultRule == true && r.DocumentFlow == Sungero.Docflow.ApprovalRuleBase.DocumentFlow.Inner && r.DocumentKinds.Any() && !r.DocumentKinds.Any(dk => !Equals(dk.DocumentKind.DocumentType.DocumentTypeGuid, ProjectDocument.ClassTypeGuid.ToString()))); if (hasNotDefaultRule || hasDefaultRule) { return; } var projectDocumentKinds = Docflow.DocumentKinds.GetAll().Where(pdk => pdk.DocumentType.DocumentTypeGuid == ProjectDocument.ClassTypeGuid.ToString()).ToList(); var rule = ApprovalRules.Create(); rule.Status = Sungero.Docflow.ApprovalRuleBase.Status.Active; rule.Name = name; rule.DocumentFlow = Sungero.Docflow.ApprovalRuleBase.DocumentFlow.Inner; rule.IsDefaultRule = true; // Задать виды документов в правиле. if (projectDocumentKinds != null && !rule.DocumentKinds.Any()) { foreach (var documentKind in projectDocumentKinds) { rule.DocumentKinds.AddNew().DocumentKind = documentKind; } } // Проверить, есть ли этап согласования с РП. var projectManagerRole = Docflow.PublicFunctions.ApprovalRoleBase.GetRole(Docflow.ApprovalRoleBase.Type.ProjectManager); var projectManagerApprovingStage = ApprovalStages.GetAll().FirstOrDefault(s => s.StageType == Docflow.ApprovalStage.StageType.Approvers && s.ApprovalRoles.Any(ar => Equals(ar.ApprovalRole, projectManagerRole)) && s.ApprovalRoles.Count() == 1); // Создать этап согласования с РП, если это необходимо. var stage = ApprovalStages.Create(); if (projectManagerApprovingStage == null) { stage.StageType = Docflow.ApprovalStage.StageType.Approvers; stage.Name = Sungero.Projects.Resources.ApprovingByProjectManager; stage.DeadlineInDays = 1; stage.ApprovalRoles.AddNew().ApprovalRole = projectManagerRole; stage.Save(); } else { stage = projectManagerApprovingStage; } // Добавить стандартные этапы. Docflow.PublicInitializationFunctions.Module.SetRuleStages(rule, stages); // Заменяем созданный по умолчанию этап согласования с обязательными согласующими созданным/найденным ранее этапом. // Функция SetRuleStages при генерации подставляет первый попавшийся этап с нужным типом. var replacedDefaultStage = rule.Stages.FirstOrDefault(s => Equals(s.StageType, Docflow.ApprovalStage.StageType.Approvers)); if (replacedDefaultStage != null) { rule.Stages.Single(s => Equals(s, replacedDefaultStage)).Stage = stage; } // Создать связи по умолчанию. Docflow.PublicFunctions.ApprovalRuleBase.CreateAutoTransitions(rule); rule.Save(); }