public static UserActionAssignment GetActionAssignmentForActionAndUser(Guid userActionId, Guid appUserId)
        {
            ApplicationDbContext db         = new ApplicationDbContext();
            UserActionAssignment assignment = GetActionAssignmentForActionAndUser(db, userActionId, appUserId);

            db.Dispose();
            return(assignment);
        }
        public static UserActionAssignment GetActionAssignmentForActionAndUser(ApplicationDbContext db, Guid userActionId, Guid appUserId)
        {
            UserActionAssignment assignment = (from uaa in db.UserActionAssignments
                                               where (uaa.UserActionId == userActionId && uaa.AppUserId == appUserId)
                                               select uaa).FirstOrDefault();

            return(assignment);
        }
        public static UserActionAssignment CreateActionAssignment(Guid userActionId, Guid appUserId)
        {
            ApplicationDbContext db         = new ApplicationDbContext();
            UserActionAssignment assignment = CreateActionAssignment(db, userActionId, appUserId);

            db.Dispose();
            return(assignment);
        }
        public static List <UserActionAssignment> CreateActionAssignmentForGroupMembers(ApplicationDbContext db, Guid userActionId, Group group)
        {
            List <UserActionAssignment> list = new List <UserActionAssignment>();

            //get list of members that are accepted within this group only
            List <GroupMember> groupMembers = (from gm in db.GroupMembers
                                               where gm.Status == GroupMemberStatusEnum.Accepted
                                               select gm).ToList();

            //depdending on type of group will depend on the users we need to find, i.e. branch group = members are branches, therefore only find SuperAdmin, Admin or Manager for that branch to send this to
            foreach (GroupMember member in groupMembers)
            {
                switch (group.Type)
                {
                case LevelEnum.Company:
                    List <AppUser> adminUsers = AppUserHelpers.GetAdminAppUsersForCompany(db, member.ReferenceId);
                    foreach (AppUser adminUser in adminUsers)
                    {
                        UserActionAssignment adminUserAssignment = CreateActionAssignment(db, userActionId, adminUser.AppUserId);
                        list.Add(adminUserAssignment);
                    }
                    break;

                case LevelEnum.Branch:
                    List <AppUser> branchUsers = AppUserHelpers.GetManagerAppUsersForBranch(db, member.ReferenceId);
                    foreach (AppUser branchUser in branchUsers)
                    {
                        UserActionAssignment branchUserAssignment = CreateActionAssignment(db, userActionId, branchUser.AppUserId);
                        list.Add(branchUserAssignment);
                    }
                    //Note, Admin users can also approve these requests so list them in the assignment list also
                    List <AppUser> adminUsersForBranchApproval = AppUserHelpers.GetAdminAppUsersForCompany(db, BranchHelpers.GetBranch(member.ReferenceId).CompanyId);
                    foreach (AppUser adminUser in adminUsersForBranchApproval)
                    {
                        //Don't duplicate user entries
                        if (GetActionAssignmentForActionAndUser(db, userActionId, adminUser.AppUserId) == null)
                        {
                            UserActionAssignment adminUserAssignment = CreateActionAssignment(db, userActionId, adminUser.AppUserId);
                            list.Add(adminUserAssignment);
                        }
                    }
                    break;

                case LevelEnum.User:
                    UserActionAssignment assignment = CreateActionAssignment(db, userActionId, member.ReferenceId);
                    list.Add(assignment);
                    break;
                }
            }

            return(list);
        }
        public static UserActionAssignment CreateActionAssignment(ApplicationDbContext db, Guid userActionId, Guid appUserId)
        {
            UserActionAssignment assignment = new UserActionAssignment()
            {
                UserActionAssignmentId = Guid.NewGuid(),
                UserActionId           = userActionId,
                AppUserId = appUserId
            };

            db.UserActionAssignments.Add(assignment);
            db.SaveChanges();

            return(assignment);
        }
        /// <summary>
        /// Build the list of assignments for this Action.  At user level there is the one, at Branch level there is the 'Manager' of the branch and the 'Admin' of the company, and at
        ///     Admin level there is the 'Admin' of the company.  There could be multiple for Branch and Admin levels
        /// </summary>
        /// <param name="db"></param>
        /// <param name="level">level of request, User, Branch, Company</param>
        /// <param name="ofReferenceId">id based on level, so AppUserId, BranchId, CompanyId</param>
        /// <param name="byReferenceId">id based on level, so AppUserId, BranchId, CompanyId</param>
        /// <returns></returns>
        public static List <UserActionAssignment> CreateUserAssignmentForAction(ApplicationDbContext db, Guid userActionId, LevelEnum level, Guid ofReferenceId, Guid byReferenceId)
        {
            List <UserActionAssignment> list = new List <UserActionAssignment>();

            switch (level)
            {
            case LevelEnum.Company:
                List <AppUser> adminUsers = AppUserHelpers.GetAdminAppUsersForCompany(db, ofReferenceId);
                foreach (AppUser adminUser in adminUsers)
                {
                    UserActionAssignment adminUserAssignment = CreateActionAssignment(db, userActionId, adminUser.AppUserId);
                    list.Add(adminUserAssignment);
                }
                break;

            case LevelEnum.Branch:
                List <AppUser> branchUsers = AppUserHelpers.GetManagerAppUsersForBranch(db, ofReferenceId);
                foreach (AppUser branchUser in branchUsers)
                {
                    UserActionAssignment branchUserAssignment = CreateActionAssignment(db, userActionId, branchUser.AppUserId);
                    list.Add(branchUserAssignment);
                }
                //Note, Admin users can also approve these requests so list them in the assignment list also
                List <AppUser> adminUsersForBranchApproval = AppUserHelpers.GetAdminAppUsersForCompany(db, BranchHelpers.GetBranch(ofReferenceId).CompanyId);
                foreach (AppUser adminUser in adminUsersForBranchApproval)
                {
                    //Don't duplicate user entries
                    if (GetActionAssignmentForActionAndUser(db, userActionId, adminUser.AppUserId) == null)
                    {
                        UserActionAssignment adminUserAssignment = CreateActionAssignment(db, userActionId, adminUser.AppUserId);
                        list.Add(adminUserAssignment);
                    }
                }
                break;

            case LevelEnum.User:
                UserActionAssignment assignment = CreateActionAssignment(db, userActionId, ofReferenceId);
                list.Add(assignment);
                break;
            }

            return(list);
        }
        public static UserAction CreateActionForGroupMemberAccceptance(ApplicationDbContext db, Group group, GroupMember member)
        {
            //Create action for group member acceptance....
            UserAction action = CreateAction(db, ActionTypeEnum.AwaitGroupMemberAcceptance, group.Type, EnumHelpers.GetDescription(group.Type) + " level request.", group.GroupOriginatorAppUserId, group.GroupOriginatorAppUserId, DateTime.Now, EntityStatusEnum.Active);

            //..then assign action to users... it will only add actions to those members that are active on the list (Should really have this level set for new groups, only adding new members)
            List <UserActionAssignment> list = new List <UserActionAssignment>();

            switch (group.AcceptanceLevel)
            {
            case GroupInviteAcceptanceLevelEnum.Owner:
            case GroupInviteAcceptanceLevelEnum.Invitee:
                UserActionAssignment userAssignment = CreateActionAssignment(db, action.UserActionId, group.GroupOriginatorAppUserId);
                break;

            case GroupInviteAcceptanceLevelEnum.Member:
                List <UserActionAssignment> userAssignmentList = CreateActionAssignmentForGroupMembers(db, action.UserActionId, group);
                break;
            }

            return(action);
        }