コード例 #1
0
        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);
        }
コード例 #2
0
        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)
            });
        }
コード例 #3
0
        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));
        }