コード例 #1
0
        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>());
        }
コード例 #2
0
        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();
        }