/// <summary>
        /// Валидация старта задачи на продление срока.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateDeadlineExtensionTaskStart(Sungero.Core.IValidationArgs e)
        {
            var isValid = Docflow.PublicFunctions.Module.ValidateTaskAuthor(_obj, e);

            // Проверить заполненность причины продления срока.
            if (string.IsNullOrWhiteSpace(_obj.ActiveText))
            {
                e.AddError(DeadlineExtensionTasks.Resources.SpecifyReason);
                isValid = false;
            }

            // Проверить корректность срока.
            if (!Docflow.PublicFunctions.Module.CheckDeadline(_obj.NewDeadline, Calendar.Now))
            {
                e.AddError(_obj.Info.Properties.NewDeadline, RecordManagement.Resources.ImpossibleSpecifyDeadlineLessThanToday);
                isValid = false;
            }

            // Новый срок должен быть больше старого.
            if (e.IsValid && !Docflow.PublicFunctions.Module.CheckDeadline(_obj.NewDeadline, _obj.CurrentDeadline))
            {
                e.AddError(_obj.Info.Properties.NewDeadline, DeadlineExtensionTasks.Resources.DesiredDeadlineIsNotCorrect);
                isValid = false;
            }

            return(isValid);
        }
        /// <summary>
        /// Валидация старта задачи на свободное согласование.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateFreeApprovalTaskStart(Sungero.Core.IValidationArgs e)
        {
            var errorMessages = this.GetStartValidationMessages();

            if (errorMessages.Any())
            {
                foreach (var error in errorMessages)
                {
                    if (error.IsCantSendTaskByNonEmployeeMessage)
                    {
                        e.AddError(_obj.Info.Properties.Author, error.Message);
                    }
                    else if (error.IsImpossibleSpecifyDeadlineLessThanTodayMessage)
                    {
                        e.AddError(_obj.Info.Properties.MaxDeadline, error.Message);
                    }
                    else
                    {
                        e.AddError(error.Message);
                    }
                }
                return(false);
            }

            return(true);
        }
Example #3
0
        /// <summary>
        /// Валидация старта задачи на ознакомление.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateAcquaintanceTaskStart(Sungero.Core.IValidationArgs e)
        {
            var errorMessages = Sungero.RecordManagement.Functions.AcquaintanceTask.Remote.GetStartValidationMessage(_obj);

            if (errorMessages.Any())
            {
                foreach (var error in errorMessages)
                {
                    if (error.IsShowNotAutomatedEmployeesMessage)
                    {
                        e.AddError(error.Message, _obj.Info.Actions.ShowNotAutomatedEmployees);
                    }
                    else if (error.IsCantSendTaskByNonEmployeeMessage)
                    {
                        e.AddError(_obj.Info.Properties.Author, error.Message);
                    }
                    else
                    {
                        e.AddError(error.Message);
                    }
                }
                return(false);
            }

            return(true);
        }
Example #4
0
        /// <summary>
        /// Валидация сохранения задачи на исполнение поручения.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateActionItemExecutionTaskSave(Sungero.Core.IValidationArgs e)
        {
            var isValid = true;

            // Проверить заполненость Общего срока (а также корректность), исполнителей, текста поручения у составного поручения.
            var isCompoundActionItem = _obj.IsCompoundActionItem ?? false;

            if (isCompoundActionItem)
            {
                if (_obj.ActionItemParts.Count == 0)
                {
                    e.AddError(_obj.Info.Properties.ActionItemParts, ActionItemExecutionTasks.Resources.ActionItemsNotFilled);
                    isValid = false;
                }

                if (_obj.FinalDeadline == null && _obj.ActionItemParts.Any(i => i.Deadline == null))
                {
                    e.AddError(_obj.Info.Properties.FinalDeadline, ActionItemExecutionTasks.Resources.EmptyFinalDeadline);
                    isValid = false;
                }

                if (string.IsNullOrEmpty(_obj.ActionItem) && _obj.ActionItemParts.Any(i => string.IsNullOrEmpty(i.ActionItemPart)))
                {
                    e.AddError(_obj.Info.Properties.ActionItem, ActionItemExecutionTasks.Resources.EmptyActionItem);
                    isValid = false;
                }
            }

            return(isValid);
        }
Example #5
0
        /// <summary>
        /// Валидация старта задачи на исполнение поручения.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <param name="startedFromUI">Признак того, что задача была стартована через UI.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateActionItemExecutionTaskStart(Sungero.Core.IValidationArgs e, bool startedFromUI)
        {
            var isValid = Docflow.PublicFunctions.Module.ValidateTaskAuthor(_obj, e);

            // Проверить корректность заполнения свойства Выдал.
            if (!(Sungero.Company.Employees.Current == null && Users.Current.IncludedIn(Roles.Administrators)) &&
                !Docflow.PublicFunctions.Module.Remote.IsUsersCanBeResolutionAuthor(_obj.DocumentsGroup.OfficialDocuments.SingleOrDefault(), _obj.AssignedBy))
            {
                e.AddError(_obj.Info.Properties.AssignedBy, ActionItemExecutionTasks.Resources.ActionItemCanNotAssignedByUser);
                isValid = false;
            }

            // Проверить количество исполнителей по поручению.
            if (_obj.ActionItemParts.Count() + _obj.CoAssignees.Count() > Constants.ActionItemExecutionTask.MaxActionItemAssignee)
            {
                e.AddError(Sungero.RecordManagement.ActionItemExecutionTasks.Resources.ActionItemAsigneeTooMatchFormat(Constants.ActionItemExecutionTask.MaxActionItemAssignee));
                isValid = false;
            }

            // Проверить корректность срока (только при старте через UI).
            if (startedFromUI && Functions.ActionItemExecutionTask.CheckOverdueActionItemExecutionTask(_obj))
            {
                e.AddError(RecordManagement.Resources.ImpossibleSpecifyDeadlineLessThanToday);
                isValid = false;
            }

            return(isValid);
        }
Example #6
0
        public static bool ValidateTaskAuthor(ITask task, Sungero.Core.IValidationArgs e)
        {
            var authorIsNonEmployeeMessage = ValidateTaskAuthor(task);

            if (!string.IsNullOrWhiteSpace(authorIsNonEmployeeMessage))
            {
                e.AddError(task.Info.Properties.Author, authorIsNonEmployeeMessage);
                return(false);
            }
            return(true);
        }
Example #7
0
        public override void CreateActionItemsFromDocumentDialog(Sungero.Core.IValidationArgs e)
        {
            // Не доступно, если нет лицензии на модуль Совещания.
            var moduleGuid = Sungero.Meetings.Constants.Module.MeetingsUIGuid;

            if (!Docflow.PublicFunctions.Module.Remote.IsModuleAvailableByLicense(moduleGuid))
            {
                Dialogs.NotifyMessage(Minuteses.Resources.ActionItemCreationDialogNoMeetingsLicense);
                return;
            }

            base.CreateActionItemsFromDocumentDialog(e);
        }
Example #8
0
        /// <summary>
        /// Валидация задания на приемку работ контролером при отправке на доработку.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateActionItemSupervisorAssignment(Sungero.Core.IValidationArgs e)
        {
            bool isValid = true;

            if (string.IsNullOrWhiteSpace(_obj.ActiveText))
            {
                e.AddError(ActionItemSupervisorAssignments.Resources.ReportCommentIsEmpty);
                isValid = false;
            }
            if (_obj.NewDeadline == null)
            {
                e.AddError(_obj.Info.Properties.NewDeadline, ActionItemSupervisorAssignments.Resources.EmptyNewDeadline);
                isValid = false;
            }
            return(isValid);
        }
Example #9
0
        /// <summary>
        /// Валидация задания на отказ в продлении срока при повторном запросе.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateDeadlineRejectionAssignment(Sungero.Core.IValidationArgs e)
        {
            bool isValid = true;

            // Проверить заполненность комментария к повторному запросу.
            if (string.IsNullOrWhiteSpace(_obj.ActiveText))
            {
                e.AddError(DeadlineRejectionAssignments.Resources.RequestCommentNotFilled);
                isValid = false;
            }

            // Новый срок должен быть позже старого.
            if (!Functions.Module.CheckDeadline(_obj.NewDeadline, _obj.CurrentDeadline))
            {
                e.AddError(_obj.Info.Properties.NewDeadline, DeadlineExtensionTasks.Resources.DesiredDeadlineIsNotCorrect);
                isValid = false;
            }

            return(isValid);
        }
        /// <summary>
        /// Валидация старта задачи на согласование по регламенту.
        /// </summary>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateApprovalTaskStart(Sungero.Core.IValidationArgs e)
        {
            var haveError = false;
            var document  = _obj.DocumentGroup.OfficialDocuments.FirstOrDefault();

            if (!Sungero.Company.Employees.Is(_obj.Author))
            {
                e.AddError(_obj.Info.Properties.Author, Docflow.Resources.CantSendTaskByNonEmployee);
                haveError = true;
            }

            if (!document.AccessRights.CanUpdate())
            {
                e.AddError(ApprovalTasks.Resources.CantSendDocumentsWithoutUpdateRights);
                haveError = true;
            }

            // Проверить указанность регламента.
            if (_obj.ApprovalRule == null)
            {
                e.AddError(_obj.Info.Properties.ApprovalRule, ApprovalTasks.Resources.ToSendDocumentApprovalSpecifyRule);
                return(false);
            }

            // Если регламент указан, но есть ошибки в определении условий - значит, не все поля документа заполнены.
            var getStagesResult = Functions.ApprovalTask.Remote.GetStages(_obj);

            if (_obj.ApprovalRule != null && !getStagesResult.IsConditionsDefined)
            {
                e.AddError(getStagesResult.ErrorMessage);
                haveError = true;
            }

            // Если регламент указан, а срок не определен - значит, не хватает календаря рабочего времени.
            if (_obj.ApprovalRule != null && !_obj.MaxDeadline.HasValue && Functions.ApprovalTask.Remote.GetExpectedDate(_obj) == null)
            {
                e.AddError(ApprovalTasks.Resources.EmptyNextWorkingCalendar);
                haveError = true;
            }

            // Проверить актуальность регламента.
            var documentRules = Functions.OfficialDocument.Remote.GetApprovalRules(document).ToList();

            if (!documentRules.Contains(_obj.ApprovalRule))
            {
                e.AddError(_obj.Info.Properties.ApprovalRule, ApprovalTasks.Resources.RuleOrDocumentHasBeenChanged);
                haveError = true;
            }

            // Проверить, имеет ли сотрудник, указанный в поле "На подпись", право подписи документов.
            if (!Functions.ApprovalTask.Remote.CheckSignatory(_obj, _obj.Signatory, getStagesResult.Stages))
            {
                e.AddError(_obj.Info.Properties.Signatory, Docflow.Resources.TheSpecifiedEmployeeIsNotAuthorizedToSignDocuments);
                haveError = true;
            }

            // Проверить, определился ли для этапа регистрации исполнитель.
            var registerStage = getStagesResult.Stages.Where(s => s.StageType == Docflow.ApprovalStage.StageType.Register).FirstOrDefault();

            if (registerStage != null)
            {
                var registerStageAssignee = Functions.ApprovalRuleBase.Remote.GetEmployeeByAssignee(registerStage.Stage.Assignee);
                var clerk = registerStageAssignee ?? Docflow.PublicFunctions.ApprovalStage.Remote.GetRemoteStagePerformer(_obj, registerStage.Stage);
                if (clerk == null)
                {
                    e.AddError(ApprovalTasks.Resources.DetermineRegistrarCurrentRuleError);
                    haveError = true;
                }
            }

            // Проверить, определился ли для этапа создания поручений исполнитель.
            var stages           = getStagesResult.Stages;
            var executionStage   = stages.Where(s => s.Stage.StageType == Docflow.ApprovalStage.StageType.Execution).FirstOrDefault();
            var reviewStage      = stages.Where(s => s.Stage.StageType == Docflow.ApprovalStage.StageType.Review).FirstOrDefault();
            var signStage        = stages.Where(s => s.Stage.StageType == Docflow.ApprovalStage.StageType.Sign).FirstOrDefault();
            var reviewStageIndex = stages.IndexOf(reviewStage);
            var signStageIndex   = stages.IndexOf(signStage);

            if (executionStage != null)
            {
                var executionStageAssignee = Functions.ApprovalRuleBase.Remote.GetEmployeeByAssignee(executionStage.Stage.Assignee);
                var performer = executionStageAssignee ?? Docflow.PublicFunctions.ApprovalStage.Remote.GetRemoteStagePerformer(_obj, executionStage.Stage);
                if (performer == null && signStageIndex > reviewStageIndex)
                {
                    e.AddError(ApprovalTasks.Resources.NoExecutionAssignee);
                    haveError = true;
                }
            }

            // Проверить, заполнен ли проект, когда его требует роль в правиле.
            if (document.Project == null && stages.Any(s => Functions.ApprovalStage.HasRole(s.Stage, Docflow.ApprovalRoleBase.Type.ProjectManager) ||
                                                       Functions.ApprovalStage.HasRole(s.Stage, Docflow.ApprovalRoleBase.Type.ProjectAdmin)))
            {
                e.AddError(ApprovalTasks.Resources.DocumentMustHaveProject);
                haveError = true;
            }

            return(!haveError);
        }
        /// <summary>
        /// Валидация задания на доработку.
        /// </summary>
        /// <param name="approvalStages">Этапы регламента.</param>
        /// <param name="e">Аргументы действия.</param>
        /// <returns>True, если валидация прошла успешно, и False, если были ошибки.</returns>
        public virtual bool ValidateApprovalReworkAssignment(Structures.Module.DefinedApprovalStages approvalStages, Sungero.Core.IValidationArgs e)
        {
            var hasError         = false;
            var deletedApprovers = _obj.State.Properties.Approvers.Deleted;
            var addedApprovers   = _obj.State.Properties.Approvers.Added;

            // Запрещено изменять действие, если результат согласования отрицателен.
            if (_obj.Approvers.Any(a => a.Approved == Sungero.Docflow.ApprovalReworkAssignmentApprovers.Approved.NotApproved &&
                                   a.Action != Sungero.Docflow.ApprovalReworkAssignmentApprovers.Action.SendForApproval))
            {
                e.AddError(ApprovalReworkAssignments.Resources.CannotChangeAction);
                hasError = true;
            }

            // Запрещено удалять обязательных согласующих.
            if (deletedApprovers.Any(app => app.IsRequiredApprover == true))
            {
                e.AddError(ApprovalReworkAssignments.Resources.CannotDeleteRequiredApprovers);
                hasError = true;
            }

            // Запрещено добавлять согласующих, если нет этапа согласования с дополнительными согласующими.
            if (addedApprovers.Any(a => a.IsRequiredApprover != true) &&
                !approvalStages.Stages.Any(s => s.StageType == Docflow.ApprovalStage.StageType.Approvers && s.Stage.AllowAdditionalApprovers == true))
            {
                e.AddError(ApprovalReworkAssignments.Resources.CannotAddApproversIfNoAdditionalInRule);
                hasError = true;
            }

            return(!hasError);
        }