public bool RemoveRoleFromUser(Guid userID, Guid departmentID, int roleCode)
        {
            DepartmentMemberService departmentMemberService = new DepartmentMemberService(this.UnitOfWork);
            var data = departmentMemberService.GetList(departmentID, roleCode, userID).FirstOrDefault();

            if (data != null)
            {
                departmentMemberService.Delete(data.ID);
            }
            return(true);
        }
        public bool AddRoleToUser(Guid userID, Guid departmentID, int roleCode)
        {
            DepartmentMemberService departmentMemberService = new DepartmentMemberService(this.UnitOfWork);

            if (departmentMemberService.GetList(departmentID, roleCode, userID).Count == 0)
            {
                sysBpmsDepartmentMember sysBpmsDepartmentMember = new sysBpmsDepartmentMember();
                sysBpmsDepartmentMember.Update(departmentID, userID, roleCode);
                departmentMemberService.Add(sysBpmsDepartmentMember);
            }
            return(true);
        }
        /// <summary>
        /// this method check whether current user has access to this task or not.
        /// </summary>
        /// <param name="userId">set to currnet User ID if user has logined otherwise set to null</param>
        /// <returns></returns>
        public (bool, string) CheckAccess(Guid threadTaskID, Guid?userId, Guid processId, bool isPost, bool accessByTracking = false)
        {
            sysBpmsThreadTask threadTask = this.GetInfo(threadTaskID);

            if (isPost && !new ProcessService(base.UnitOfWork).GetInfo(processId).AllowNextFlow())
            {
                return(false, LangUtility.Get("NotAllowNextFlow.Text", nameof(sysBpmsThreadTask)));
            }

            if (threadTask.StatusLU == (int)sysBpmsThreadTask.e_StatusLU.New ||
                threadTask.StatusLU == (int)sysBpmsThreadTask.e_StatusLU.Ongoing)
            {
                if (threadTask.OwnerUserID.HasValue && threadTask.OwnerUserID == userId)
                {
                    return(true, "");
                }

                if (userId.HasValue)
                {
                    List <sysBpmsDepartmentMember> listDepartmentMember = new DepartmentMemberService(base.UnitOfWork).GetList(null, null, userId.Value);
                    if (listDepartmentMember.Any(c => threadTask.GetDepartmentRoles.Any(d => (!d.Item1.HasValue || d.Item1 == c.DepartmentID) && d.Item2.ToIntObj() == c.RoleLU)))
                    {
                        return(true, "");
                    }
                }
                else
                {
                    if (!threadTask.Thread.UserID.HasValue && !threadTask.OwnerUserID.HasValue && string.IsNullOrWhiteSpace(threadTask.OwnerRole))
                    {
                        return(true, "");
                    }
                }
                if (threadTask.Task.UserTaskRuleModel?.AccessType != (int)UserTaskRuleModel.e_UserAccessType.Static &&
                    threadTask.Task.UserTaskRuleModel?.AccessType != (int)UserTaskRuleModel.e_UserAccessType.Variable)
                {
                    return(true, "");
                }

                if (accessByTracking && threadTask.Task.IsInRole(null, (int)sysBpmsDepartmentMember.e_RoleLU.Requester))
                {
                    return(true, "");
                }
            }
            return(false, LangUtility.Get("AccessError.Text", nameof(sysBpmsThreadTask)));
        }
        public ResultOperation Delete(Guid departmentId)
        {
            ResultOperation resultOperation = new ResultOperation();

            try
            {
                sysBpmsDepartment department = this.GetInfo(departmentId);
                if (department.DepartmentID.HasValue)
                {
                    resultOperation.AddError("This Organization has children, so delete the children first.");
                }
                if (resultOperation.IsSuccess)
                {
                    DepartmentMemberService      departmentMemberService      = new DepartmentMemberService(base.UnitOfWork);
                    ApplicationPageAccessService applicationPageAccessService = new ApplicationPageAccessService(base.UnitOfWork);
                    var members  = departmentMemberService.GetList(departmentId, null, null);
                    var accesses = applicationPageAccessService.GetList(departmentId);
                    this.BeginTransaction();

                    foreach (var item in members)
                    {
                        departmentMemberService.Delete(item.ID);
                    }
                    foreach (var item in accesses)
                    {
                        applicationPageAccessService.Delete(item.ID);
                    }
                    this.UnitOfWork.Repository <IDepartmentRepository>().Delete(departmentId);
                    this.UnitOfWork.Save();
                }
            }
            catch (Exception ex)
            {
                return(base.ExceptionHandler(ex));
            }
            base.FinalizeService(resultOperation);

            return(resultOperation);
        }
        public ResultOperation Delete(Guid userId)
        {
            ResultOperation resultOperation = new ResultOperation();

            if (resultOperation.IsSuccess)
            {
                try
                {
                    this.BeginTransaction();
                    //delete email accounts
                    EmailAccountService emailAccountService = new EmailAccountService(base.UnitOfWork);
                    var emailList = emailAccountService.GetList((int)sysBpmsEmailAccount.e_ObjectTypeLU.User, userId, null);
                    foreach (var item in emailList)
                    {
                        emailAccountService.Delete(item.ID);
                    }

                    //delete department member.
                    DepartmentMemberService departmentMemberService = new DepartmentMemberService(base.UnitOfWork);
                    var members = departmentMemberService.GetList(null, null, userId);
                    foreach (var item in members)
                    {
                        departmentMemberService.Delete(item.ID);
                    }

                    this.UnitOfWork.Repository <IUserRepository>().Delete(userId);
                    this.UnitOfWork.Save();
                }
                catch (Exception ex)
                {
                    resultOperation.AddError(LangUtility.Get("UserUsedError.Text", nameof(sysBpmsUser)));
                    return(base.ExceptionHandler(new Exception(LangUtility.Get("UserUsedError.Text", nameof(sysBpmsUser)))));
                }
            }
            base.FinalizeService(resultOperation);
            return(resultOperation);
        }
 public Guid?GetDepartmentHierarchyByUserId(Guid userID, int roleCode, bool goUpDepartment = true)
 {
     Guid[] departments = new DepartmentMemberService(this.UnitOfWork).GetList(null, null, userID).Select(c => c.DepartmentID).Distinct().ToArray();
     return(new DepartmentMemberService(this.UnitOfWork).GetListHierarchy(departments, roleCode, goUpDepartment).FirstOrDefault()?.DepartmentID);
 }
        public List <sysBpmsThreadTask> GetMultiInstanceTask(Domain.sysBpmsTask task, EngineSharedModel engineSharedModel)
        {
            sysBpmsThreadTask        threadTask = null;
            List <sysBpmsThreadTask> list       = new List <sysBpmsThreadTask>();

            switch ((sysBpmsTask.e_OwnerTypeLU)task.OwnerTypeLU)
            {
            case sysBpmsTask.e_OwnerTypeLU.User:
                switch ((UserTaskRuleModel.e_UserAccessType)task.UserTaskRuleModel.AccessType)
                {
                case UserTaskRuleModel.e_UserAccessType.Static:
                case UserTaskRuleModel.e_UserAccessType.Variable:
                    string userId = task.UserID;
                    if (task.UserTaskRuleModel.AccessType == (int)UserTaskRuleModel.e_UserAccessType.Variable)
                    {
                        userId = new DataManageEngine(engineSharedModel, base.UnitOfWork).GetValueByBinding(task.UserTaskRuleModel.Variable).ToStringObj();
                    }
                    int i = 0;
                    foreach (string item in userId.Split(','))
                    {
                        threadTask = new sysBpmsThreadTask();
                        threadTask.Update(engineSharedModel.CurrentThreadID.Value, task.ID, DateTime.Now.AddSeconds(i++), null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                        threadTask.UpdateAccessInfo(item.ToGuidObj(), null);
                        list.Add(threadTask);
                    }
                    break;
                }
                break;

            case sysBpmsTask.e_OwnerTypeLU.Role:
                switch ((UserTaskRuleModel.e_RoleAccessType)task.UserTaskRuleModel.AccessType)
                {
                case UserTaskRuleModel.e_RoleAccessType.Static:
                case UserTaskRuleModel.e_RoleAccessType.Variable:
                    if (task.UserTaskRuleModel.AccessType == (int)UserTaskRuleModel.e_RoleAccessType.Variable)
                    {
                        task.SetRoleDepartment(new DataManageEngine(engineSharedModel, base.UnitOfWork).GetValueByBinding(task.UserTaskRuleModel.Variable).ToStringObj(), task.UserTaskRuleModel.SpecificDepartmentId);
                    }
                    foreach (var item in task.GetDepartmentRoles)
                    {
                        List <Guid> users = new DepartmentMemberService(base.UnitOfWork).GetList(item.Item1, item.Item2.ToIntObj(), null).Select(c => c.UserID).ToList();
                        //It is used  for sequential task.
                        int i = 0;
                        foreach (Guid uId in users)
                        {
                            threadTask = new sysBpmsThreadTask();
                            threadTask.Update(engineSharedModel.CurrentThreadID.Value, task.ID, DateTime.Now.AddSeconds(i++), null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                            threadTask.UpdateAccessInfo(uId, null);
                            list.Add(threadTask);
                        }
                    }
                    break;

                case UserTaskRuleModel.e_RoleAccessType.CorrespondentRole:

                    Guid?userId       = task.UserTaskRuleModel.UserType == (int)UserTaskRuleModel.e_UserType.CurrentUserID ? new UserService(base.UnitOfWork).GetInfo(engineSharedModel.CurrentUserName ?? "")?.ID : engineSharedModel.CurrentThread?.UserID;
                    Guid?departmentId = new AccessCodeHelper(base.UnitOfWork).GetDepartmentHierarchyByUserId(userId.ToGuidObj(), task.UserTaskRuleModel.RoleCode.ToIntObj(), task.UserTaskRuleModel.GoUpDepartment);
                    if (!departmentId.HasValue)
                    {
                        throw new Exception(LangUtility.Get("OrganizationNotFound.Text", nameof(sysBpmsThreadTask)));
                    }
                    {
                        List <Guid> users = new DepartmentMemberService(base.UnitOfWork).GetList(departmentId, task.UserTaskRuleModel.RoleCode.ToIntObj(), null).Select(c => c.UserID).ToList();
                        //It is used  for sequential task.
                        int i = 0;
                        foreach (Guid uId in users)
                        {
                            threadTask = new sysBpmsThreadTask();
                            threadTask.Update(engineSharedModel.CurrentThreadID.Value, task.ID, DateTime.Now.AddSeconds(i++), null, string.Empty, 0, (int)sysBpmsThreadTask.e_StatusLU.New);
                            threadTask.UpdateAccessInfo(uId, null);
                            list.Add(threadTask);
                        }
                    }
                    break;
                }

                break;
            }
            return(list);
        }