private async Task <bool> GetSaveStatus(int employeeId, int id) { var status = await _timeApprovalService.GetAsync(id, employeeId); var statusAllowsSave = status.TimeApprovalStatus != TimeApprovalStatus.Submitted && status.TimeApprovalStatus != TimeApprovalStatus.Approved; return(statusAllowsSave); }
public async Task <FullTimeEntryViewModel> GetFullTimeEntryViewModelAsync(WeekOfTimeEntriesRequest request) { var employeeForWeek = await employeeService.GetSingleEmployeeAsync(request.EmployeeId); if (!request.RequestingUserIsAdmin && employeeForWeek.UserName != request.RequestingUserName) { throw new UnauthorizedAccessException($"You are not allowed to view others time sheets"); } var currentWeek = WeekDTO.CreateForWeekId(request.WeekId); var weekOfTimeEntries = await timeService.GetWeekAsync(request.EmployeeId, request.WeekId); //var timeEntries = await timeService.GetAsync(request.WeekId, request.EmployeeId); var allJobList = (await jobService.GetAsync()).ToList(); var taskList = (await taskService.GetTasks()).ToList().OrderBy(x => x.Name).ThenBy(x => x.Description); var entries = new List <TimeEntryViewModel>(); var status = await timeApprovalService.GetAsync(request.WeekId, request.EmployeeId); var existingJobWithTasks = weekOfTimeEntries.AsEnumerable().GroupBy(x => new JobWithTaskDTO() { JobId = x.JobId, TaskId = x.JobTaskId }); foreach (var entry in existingJobWithTasks) { var tasky = taskList.FirstOrDefault(x => x.TaskId == entry.Key.TaskId); var SelectedEntryTaskName = $"{tasky?.LegacyCode} - {tasky?.Name}"; var SelectedEntryJob = allJobList.FirstOrDefault(x => x.JobId == entry.Key.JobId); var jobCode = ""; if (SelectedEntryJob != null) { jobCode = SelectedEntryJob.JobCode; } var item = new TimeEntryViewModel() { SelectedJobId = entry.Key.JobId, SelectedTaskId = entry.Key.TaskId, SelectedEntryTaskName = SelectedEntryTaskName, SelectedEntryJobName = SelectedEntryJob?.JobName, SelectedJobCode = jobCode, SelectedTaskCategory = tasky?.Category?.Name, Monday = MapToViewModel(currentWeek, DayOfWeek.Monday, entry), Tuesday = MapToViewModel(currentWeek, DayOfWeek.Tuesday, entry), Wednesday = MapToViewModel(currentWeek, DayOfWeek.Wednesday, entry), Thursday = MapToViewModel(currentWeek, DayOfWeek.Thursday, entry), Friday = MapToViewModel(currentWeek, DayOfWeek.Friday, entry), Saturday = MapToViewModel(currentWeek, DayOfWeek.Saturday, entry), Sunday = MapToViewModel(currentWeek, DayOfWeek.Sunday, entry), }; entries.Add(item); } entries = entries.OrderBy(x => x.SelectedJobCode).ThenBy(x => x.SelectedTaskId).ToList(); var nextWeek = currentWeek.Next(); var prevWeek = currentWeek.Previous(); return(new FullTimeEntryViewModel() { TimeEntryRow = entries, EmployeeId = employeeForWeek.EmployeeId, EmployeeDisplayName = $"{employeeForWeek.First} {employeeForWeek.Last}", NewEntry = await GenerateEmptyJobTaskAsync(request.WeekId, request.EmployeeId), Week = new WeekIdentifier() { WeekEnd = currentWeek.WeekEnd, WeekStart = currentWeek.WeekStart, WeekId = currentWeek.WeekId.Value, Year = currentWeek.Year }, ApprovalStatus = status.TimeApprovalStatus, Expenses = await _expenseService.GetExpensesForEmployee(request.EmployeeId, request.WeekId) }); }
public async Task <Result> ApplyApproval(TimeApprovalRequest request) { var current = await timeApprovalService.GetAsync(request.WeekId, request.EmployeeId); var isValidSubmit = request.NewApprovalState == TimeEntries.TimeApprovalStatus.Submitted && !(current.TimeApprovalStatus == TimeApprovalStatus.Submitted || current.TimeApprovalStatus == TimeApprovalStatus.Approved); var isValidReject = request.NewApprovalState == TimeEntries.TimeApprovalStatus.Rejected && (current.TimeApprovalStatus == TimeApprovalStatus.Submitted || current.TimeApprovalStatus == TimeApprovalStatus.Approved) && request.ApprovingUserIsAdmin; var isValidApprove = request.NewApprovalState == TimeApprovalStatus.Approved && request.ApprovingUserIsAdmin; if (isValidSubmit) { var time = await timeService.GetAsync(request.WeekId, request.EmployeeId); var totalOt = time.Sum(x => x.OvertimeHours); var totalReg = time.Sum(x => x.Hours); current.TotalOverTimeHours = totalOt; current.TotalRegularHours = totalReg; if (totalOt > 0 || totalReg > 40) { current.TimeApprovalStatus = TimeApprovalStatus.Submitted; } else { current.TimeApprovalStatus = TimeApprovalStatus.Approved; } } if (isValidReject || isValidApprove) { current.TimeApprovalStatus = request.NewApprovalState; } if (isValidApprove) { var approvedBy = request.ApprovingUserId == request.EmployeeId ? "[AUTO APPROVED BY SYSTEM]" : "approved by manager"; var approver = await employeeService.GetSingleEmployeeAsync(request.ApprovingUserId); current.ApproverName = approver.UserName; current.ApprovalDate = DateTime.Now; var week = WeekDTO.CreateForWeekId(request.WeekId); var emp = await employeeService.GetSingleEmployeeAsync(request.EmployeeId); string finalEmailText = await CreateEmailBody(week, emp, greetingName : emp.First, action : $"Time sheet approved (for the week {week.WeekStart.ToShortDateString()}-{week.WeekEnd.ToShortDateString()})", actionBy : approvedBy, followup : "No further action is required."); var recipient = emp.UserName; smtpProxy.SendMail(recipient, finalEmailText, $"Time approved for week {week.WeekStart.ToShortDateString()}-{week.WeekEnd.ToShortDateString()}"); } await timeApprovalService.Save(current); if (isValidSubmit && current.TimeApprovalStatus == TimeApprovalStatus.Submitted) { var time = await timeService.GetAsync(request.WeekId, request.EmployeeId); var JobsThatCauseApprovalRequired = time.Where(x => x.OvertimeHours > 0).GroupBy(x => x.JobId); var jobDetails = await Task.WhenAll(JobsThatCauseApprovalRequired.Select(async x => (await jobService.GetForJobId(x.Key)).CoreInfo)); int[] projectManagersToNotifiy = jobDetails.Select(x => x.ProjectManagerEmployeeId).ToArray(); var week = WeekDTO.CreateForWeekId(request.WeekId); foreach (var pm in projectManagersToNotifiy) { var emp = await employeeService.GetSingleEmployeeAsync(request.EmployeeId); var approver = await employeeService.GetSingleEmployeeAsync(pm); var recipient = approver.UserName; string finalEmailText = await CreateEmailBody(week, emp, greetingName : approver.First, action : $"submitted for approval (for the week {week.WeekStart.ToShortDateString()}-{week.WeekEnd.ToShortDateString()})", actionBy : $"{emp.First} {emp.Last}", followup : $"You will need to review the timesheet as you are marked as a project manager a job in this week."); smtpProxy.SendMail(recipient, finalEmailText, $"Time submitted for week {week.WeekStart.ToShortDateString()}-{week.WeekEnd.ToShortDateString()}"); } } if (isValidReject) { var week = WeekDTO.CreateForWeekId(request.WeekId); var emp = await employeeService.GetSingleEmployeeAsync(request.EmployeeId); var approver = await employeeService.GetSingleEmployeeAsync(request.ApprovingUserId); var recipient = emp.UserName; string finalEmailText = await CreateEmailBody(week, emp, greetingName : emp.First, action : $"{request.NewApprovalState}", actionBy : $"{approver.First} {approver.Last}", followup : $"Please review and resubmit for the week {week.WeekStart.ToShortDateString()}-{week.WeekEnd.ToShortDateString()}."); smtpProxy.SendMail(recipient, finalEmailText, $"Time {request.NewApprovalState} for week {week.WeekStart.ToShortDateString()}-{week.WeekEnd.ToShortDateString()}"); } return(new Result(true)); }