/// <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); }
/// <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); }
/// <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); }
/// <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); }
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); }
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); }
/// <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); }
/// <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); }