public async Task <IActionResult> RemoveEmployee(string id, int projectId, LineManagerManagement lineManagerManagement)
        {
            var projectEmployees = await _context.ProjectEmployees
                                   .Include(pe => pe.Employee)
                                   .Where(pe => pe.EmployeeId == id)
                                   .Where(pe => pe.ProjectId == projectId)
                                   .ToListAsync();

            lineManagerManagement.ProjectEmployee = new ProjectEmployee();
            if (ModelState.IsValid)
            {
                foreach (ProjectEmployee projectEmployee in projectEmployees)
                {
                    if (projectEmployee.Role == ProjectEmployee.PROJECT_MANAGER)
                    {
                        await _userManager.RemoveFromRoleAsync(projectEmployee.Employee, ApplicationRole.PM);
                    }
                    if (projectEmployee.Role == ProjectEmployee.PROJECT_ASSISTANT)
                    {
                        await _userManager.RemoveFromRoleAsync(projectEmployee.Employee, ApplicationRole.PA);
                    }
                    projectEmployee.Role   = ProjectEmployee.NOT_ASSIGNED;
                    projectEmployee.Status = ProjectEmployee.NOT_WORKING;
                    lineManagerManagement.ProjectEmployee.ProjectId = projectEmployee.ProjectId;
                    _context.Update(projectEmployee);
                    await _context.SaveChangesAsync();
                }
            }
            return(RedirectToAction(nameof(RemoveEmployees), new { id = lineManagerManagement.ProjectEmployee.ProjectId }));
        }
        public async Task <IActionResult> ChangeTA(LineManagerManagement lineManagerManagement)
        {
            if (ModelState.IsValid)
            {
                var employees = await _context.Employees.ToListAsync();

                var oldEmployee = _context.Employees.Find(lineManagerManagement.Employee.Id);

                if (lineManagerManagement.Employee.Id == lineManagerManagement.Employee.ApproverId)
                {
                    ViewData["Approvers"] = new SelectList(employees, "Id", "Email", oldEmployee.ApproverId);
                    ViewBag.ErrorMessage  = "Timesheet Approver should not be the person self";
                    return(View(lineManagerManagement));
                }
                var oldApprover = _context.Employees.Find(oldEmployee.ApproverId);
                await _userManager.RemoveFromRoleAsync(oldApprover, ApplicationRole.TA);

                var employeeToBeEdited = await _userManager.FindByIdAsync(lineManagerManagement.Employee.Id);

                employeeToBeEdited.ApproverId = lineManagerManagement.Employee.ApproverId;
                await _userManager.UpdateAsync(employeeToBeEdited);

                var newApprover = _context.Employees.Find(employeeToBeEdited.ApproverId);
                await _userManager.AddToRoleAsync(newApprover, ApplicationRole.TA);
            }
            return(RedirectToAction(nameof(Index)));
        }
        public async Task <IActionResult> TimesheetView(int id)
        {
            if (id == 0)
            {
                return(NotFound());
            }
            try
            {
                ViewBag.ErrorMessage = TempData["TimesheetMessage"].ToString();
            }
            catch (NullReferenceException e)
            {
                Console.WriteLine(e.ToString());
            }
            var projects = await _context.Projects.ToListAsync();

            var workpackages = await _context.WorkPackages.ToListAsync();

            var timesheet = await _context.Timesheets
                            .Include(t => t.TimesheetRows)
                            .FirstOrDefaultAsync(t => t.TimesheetId == id);

            if (timesheet == null)
            {
                return(NotFound());
            }
            var lineManagerManagement = new LineManagerManagement
            {
                Timesheet = timesheet
            };

            return(View(lineManagerManagement));
        }
        public async Task <IActionResult> Details(string id)
        {
            if (id == null)
            {
                return(NotFound());
            }

            var employee = await _context.Employees
                           .Include(e => e.Timesheets)
                           .FirstOrDefaultAsync(e => e.Id == id);

            if (employee == null)
            {
                return(NotFound());
            }
            var timesheets = await _context.Timesheets
                             .Where(t => t.Status == Timesheet.SUBMITTED_NOT_APPROVED)
                             .Where(t => t.EmployeeId == employee.Id)
                             .ToListAsync();

            employee.Timesheets = timesheets;
            var lineManagerManagement = new LineManagerManagement
            {
                Employee = employee
            };

            return(View(lineManagerManagement));
        }
        public async Task <IActionResult> ViewRequests(int id)
        {
            var project = await _context.Projects
                          .Where(p => p.ProjectId == id)
                          .FirstOrDefaultAsync();

            var projectRequests = await _context.ProjectRequests
                                  .Where(pr => pr.ProjectId == id)
                                  .Where(pr => pr.Status == ProjectRequest.VALID)
                                  .Where(pr => pr.AmountRequested != 0)
                                  .Include(pr => pr.PayGrade)
                                  .Include(pr => pr.Project)
                                  .ToListAsync();

            var employeeNum = new Dictionary <int, int>();
            // paygradeid & number of employees
            var currentUser = await _userManager.GetUserAsync(User);

            foreach (ProjectRequest projectRequest in projectRequests)
            {
                var employeePays = await _context.EmployeePays
                                   .Include(e => e.Employee)
                                   .Include(e => e.PayGrade)
                                   .Where(ep => ep.PayGradeId == projectRequest.PayGradeId)
                                   .Where(ep => ep.Status == EmployeePay.VALID)
                                   .ToListAsync();

                foreach (var employeePay in employeePays)
                {
                    var projectEmployee = await _context.ProjectEmployees
                                          .Where(pe => pe.EmployeeId == employeePay.EmployeeId)
                                          .Where(pe => pe.ProjectId == projectRequest.ProjectId)
                                          .Where(pe => pe.Status == ProjectEmployee.CURRENTLY_WORKING)
                                          .FirstOrDefaultAsync();

                    if ((employeePay.Employee.SupervisorId == currentUser.Id || User.IsInRole("AD")) && projectEmployee == null)
                    {
                        if (employeeNum.ContainsKey(employeePay.PayGradeId.GetValueOrDefault()))
                        {
                            employeeNum[employeePay.PayGradeId.GetValueOrDefault()] += 1;
                        }
                        else
                        {
                            employeeNum[employeePay.PayGradeId.GetValueOrDefault()] = 1;
                        }
                    }
                }
            }

            ViewData["num"] = employeeNum;

            project.ProjectRequests = projectRequests;
            LineManagerManagement lineManagerManagement = new LineManagerManagement
            {
                Project = project,
            };

            return(View(lineManagerManagement));
        }
        public async Task <IActionResult> Reject(LineManagerManagement lineManagerManagement)
        {
            var timesheetToBeChanged = await _context.Timesheets.FindAsync(lineManagerManagement.Timesheet.TimesheetId);

            timesheetToBeChanged.Status   = Timesheet.REJECTED_NEED_RESUBMISSION;
            timesheetToBeChanged.Comments = lineManagerManagement.Timesheet.Comments;
            _context.Update(timesheetToBeChanged);
            await _context.SaveChangesAsync();

            return(RedirectToAction(nameof(Index)));
        }
        public async Task <IActionResult> ChangeTA(string id)
        {
            var employee = await _context.Employees.FindAsync(id);

            LineManagerManagement lineManagerManagement = new LineManagerManagement
            {
                Employee = employee
            };
            var employees = await _context.Employees.ToListAsync();

            ViewData["Approvers"] = new SelectList(employees, "Id", "Email", employee.ApproverId);
            return(View(lineManagerManagement));
        }
        public async Task <IActionResult> AssignEmployees(int id)
        {
            var projectRequest = await _context.ProjectRequests
                                 .Include(pr => pr.PayGrade)
                                 .Include(pr => pr.Project)
                                 .Where(pr => pr.ProjectRequestId == id)
                                 .FirstOrDefaultAsync();

            var currentUser = await _userManager.GetUserAsync(User);

            var employeePays = await _context.EmployeePays
                               .Include(e => e.Employee)
                               .Include(e => e.PayGrade)
                               .Where(ep => ep.PayGradeId == projectRequest.PayGradeId)
                               .Where(ep => ep.Status == EmployeePay.VALID)
                               .ToListAsync();

            var employees = new List <Employee>();

            foreach (var employeePay in employeePays)
            {
                var projectEmployee = await _context.ProjectEmployees
                                      .Where(pe => pe.EmployeeId == employeePay.EmployeeId)
                                      .Where(pe => pe.ProjectId == projectRequest.ProjectId)
                                      .Where(pe => pe.Status == ProjectEmployee.CURRENTLY_WORKING)
                                      .FirstOrDefaultAsync();

                if ((employeePay.Employee.SupervisorId == currentUser.Id || User.IsInRole("AD")) && projectEmployee == null)
                {
                    employees.Add(employeePay.Employee);
                }
            }
            ViewData["Employees"] = new SelectList(employees, "Id", "Email");
            LineManagerManagement lineManagerManagement = new LineManagerManagement
            {
                ProjectRequest = projectRequest,
                Employees      = new List <Employee>
                {
                    new Employee
                    {
                    }
                }
            };

            return(View(lineManagerManagement));
        }
        public async Task <IActionResult> RemoveEmployees(int id)
        {
            bool isAdmin = await _userManager.IsInRoleAsync(await _userManager.GetUserAsync(User), "AD");

            var managerId = (await _context.ProjectEmployees
                             .Where(pe => pe.ProjectId == id)
                             .Where(pe => pe.Role == ProjectEmployee.PROJECT_MANAGER)
                             .FirstOrDefaultAsync())
                            .EmployeeId;

            var employeesPositions = await _context.ProjectEmployees
                                     .Where(pe => pe.ProjectId == id)
                                     .Where(pe => isAdmin || pe.Employee.SupervisorId == _userManager.GetUserId(User))
                                     .Where(pe => pe.Status == ProjectEmployee.CURRENTLY_WORKING)
                                     .GroupBy(pe => pe.EmployeeId)
                                     .Join(_context.Employees, g => g.Key, e => e.Id, (g, e) => new { E = e, PEs = g.ToList() })
                                     .ToListAsync();

            List <ProjectEmployee> PEs = new List <ProjectEmployee>();

            foreach (var g in employeesPositions)
            {
                g.PEs.Sort((a, b) => { return(a.Role - b.Role); }); //so we get the most senior role
                var pe = g.PEs.First();
                pe.Employee = g.E;
                PEs.Add(pe);
            }

            PEs.Sort((a, b) => { return(a.Role - b.Role); });

            LineManagerManagement lineManagerManagement = new LineManagerManagement
            {
                ProjectEmployees = PEs,
                Project          = await _context.Projects.FindAsync(id)
            };

            return(View(lineManagerManagement));
        }
        public async Task <IActionResult> AssignEmployees(LineManagerManagement lineManagerManagement)
        {
            if (ModelState.IsValid)
            {
                var projectRequest = await _context.ProjectRequests.FindAsync(lineManagerManagement.ProjectRequest.ProjectRequestId);

                var currentUser = await _userManager.GetUserAsync(User);

                var employeePays = await _context.EmployeePays
                                   .Include(e => e.Employee)
                                   .Include(e => e.PayGrade)
                                   .Where(ep => ep.PayGradeId == projectRequest.PayGradeId)
                                   .Where(ep => ep.Status == EmployeePay.VALID)
                                   .ToListAsync();

                var employees = new List <Employee>();
                foreach (var employeePay in employeePays)
                {
                    var projectEmployee = await _context.ProjectEmployees
                                          .Where(pe => pe.EmployeeId == employeePay.EmployeeId)
                                          .Where(pe => pe.ProjectId == projectRequest.ProjectId)
                                          .Where(pe => pe.Status == ProjectEmployee.CURRENTLY_WORKING)
                                          .FirstOrDefaultAsync();

                    if (employeePay.Employee.SupervisorId == currentUser.Id && projectEmployee == null)
                    {
                        employees.Add(employeePay.Employee);
                    }
                }
                ViewData["Employees"] = new SelectList(employees, "Id", "Email");
                if (projectRequest == null)
                {
                    return(View(lineManagerManagement));
                }
                if (projectRequest.AmountRequested < lineManagerManagement.EmployeeIds.Count)
                {
                    ViewBag.ErrorMessage = "You cannot assign more employees than reqeusted amount.";
                    return(View(lineManagerManagement));
                }
                // end of validation
                var projectEmployees = new List <ProjectEmployee>();
                foreach (var id in lineManagerManagement.EmployeeIds)
                {
                    projectEmployees.Add(new ProjectEmployee
                    {
                        EmployeeId = id,
                        ProjectId  = projectRequest.ProjectId,
                        Status     = ProjectEmployee.CURRENTLY_WORKING,
                        Role       = ProjectEmployee.NOT_ASSIGNED
                    });
                }
                await _context.ProjectEmployees.AddRangeAsync(projectEmployees);

                await _context.SaveChangesAsync();

                projectRequest.AmountRequested -= lineManagerManagement.EmployeeIds.Count;
                _context.ProjectRequests.Update(projectRequest);
                await _context.SaveChangesAsync();
            }
            return(RedirectToAction(nameof(ViewRequests), new { id = lineManagerManagement.ProjectRequest.ProjectId }));
        }