private async Task <IEnumerable <string> > VerifyHourEntries(FullTimeEntryViewModel vm)
        {
            var issues = new List <String>();

            if (vm.TimeEntryRow != null)
            {
                if (vm.TimeEntryRow.Any(z => z.AllDays().Any(x => x.Hours < 0 || x.OvertimeHours < 0)))
                {
                    issues.Add("Hours must be a non-negative number.");
                }
                if (vm.TimeEntryRow.Any(z => z.AllDays().Any(x => x.Hours + x.OvertimeHours > 24)))
                {
                    issues.Add("Regular + Overtime must never exceed 24 hours.");
                }
                if (vm.TimeEntryRow.Sum(x => x.AllDays().Sum(z => z.Hours)) > 40)
                {
                    issues.Add("Regular hours must never exceed 40 hours");
                }


                var entriesByJob = vm.TimeEntryRow.Select(te => new { jobId = te.SelectedJobId.Value, hasTime = te.AllDays().Any(h => h.Hours > 0 || h.OvertimeHours > 0) });
                var grouped      = entriesByJob.GroupBy(x => x.jobId);
                foreach (var jobGroup in grouped)
                {
                    var job = await _jobsRepository.GetForJobId(jobGroup.Key);

                    if (job.CoreInfo.JobStatusId != JobStatus.Enabled)
                    {
                        issues.Add($"Job {job.CoreInfo.FullJobCodeWithName} has been closed, either remove this entry, or have an administrator re-open the job");
                    }
                }
            }
            return(issues);
        }
        private WeekOfTimeDTO ToDTO(int employeeId, int weekId, FullTimeEntryViewModel vm)
        {
            var w = WeekDTO.CreateForWeekId(weekId);

            return(new WeekOfTimeDTO()
            {
                WeekId = weekId,
                Monday = ToDaysEntries(employeeId, weekId, w.GetDateFor(DayOfWeek.Monday), vm.TimeEntryRow, x => x.Monday),
                Tuesday = ToDaysEntries(employeeId, weekId, w.GetDateFor(DayOfWeek.Tuesday), vm.TimeEntryRow, x => x.Tuesday),
                Wednesday = ToDaysEntries(employeeId, weekId, w.GetDateFor(DayOfWeek.Wednesday), vm.TimeEntryRow, x => x.Wednesday),
                Thursday = ToDaysEntries(employeeId, weekId, w.GetDateFor(DayOfWeek.Thursday), vm.TimeEntryRow, x => x.Thursday),
                Friday = ToDaysEntries(employeeId, weekId, w.GetDateFor(DayOfWeek.Friday), vm.TimeEntryRow, x => x.Friday),
                Saturday = ToDaysEntries(employeeId, weekId, w.GetDateFor(DayOfWeek.Saturday), vm.TimeEntryRow, x => x.Saturday),
                Sunday = ToDaysEntries(employeeId, weekId, w.GetDateFor(DayOfWeek.Sunday), vm.TimeEntryRow, x => x.Sunday)
            });
        }
        public async Task <Result> SaveTimeEntriesAsync(int employeeId, int weekId, FullTimeEntryViewModel vm)
        {
            var statusAllowsSave = await GetSaveStatus(employeeId, weekId);

            if (!statusAllowsSave)
            {
                return(new Result(false, "Current status does not allow saving"));
            }
            var hoursIssues = (await VerifyHourEntries(vm)).ToList();

            if (hoursIssues.Any())
            {
                hoursIssues.Add(" -- NO CHANGES WHERE SAVED -- ");
                return(new Result(false, hoursIssues.ToArray()));
            }

            if (vm.TimeEntryRow != null)
            {
                await _timeService.SaveWeekAsync(employeeId, ToDTO(employeeId, weekId, vm));
            }
            return(new Result(true));
        }
Esempio n. 4
0
        private async Task <ActionResult> ReloadPageForErrorCorrection(int weekId, int employeeId, FullTimeEntryViewModel vm, Result res)
        {
            var req = new WeekOfTimeEntriesRequest()
            {
                EmployeeId            = employeeId,
                RequestingUserIsAdmin = User.IsInRole(UserRoleName.Admin),
                RequestingUserName    = User.Identity.Name,
                WeekId = weekId
            };
            var vmDefault = await weekOfTimeEntriesQuery.GetFullTimeEntryViewModelAsync(req);

            foreach (var day in vmDefault.TimeEntryRow)
            {
                var match = vm.TimeEntryRow.Single(x => x.RowId == day.RowId);

                day.Monday.Hours    = match.Monday.Hours;
                day.Tuesday.Hours   = match.Tuesday.Hours;
                day.Wednesday.Hours = match.Wednesday.Hours;
                day.Thursday.Hours  = match.Thursday.Hours;
                day.Friday.Hours    = match.Friday.Hours;
                day.Saturday.Hours  = match.Saturday.Hours;
                day.Sunday.Hours    = match.Sunday.Hours;

                day.Monday.OvertimeHours    = match.Monday.OvertimeHours;
                day.Tuesday.OvertimeHours   = match.Tuesday.OvertimeHours;
                day.Wednesday.OvertimeHours = match.Wednesday.OvertimeHours;
                day.Thursday.OvertimeHours  = match.Thursday.OvertimeHours;
                day.Friday.OvertimeHours    = match.Friday.OvertimeHours;
                day.Saturday.OvertimeHours  = match.Saturday.OvertimeHours;
                day.Sunday.OvertimeHours    = match.Sunday.OvertimeHours;
            }
            NotificationsController.AddNotification(User.SafeUserName(), $"Timesheet was not saved {string.Join("<br />", res.Errors)}");
            ModelState.Clear();
            foreach (var err in res.Errors)
            {
                ModelState.AddModelError("", err);
            }
            return(View("Week", vmDefault));
        }
Esempio n. 5
0
        public async Task <ActionResult> Save(int weekId, int employeeId, FullTimeEntryViewModel vm, string postType)
        {
            var currentUserId = await sessionAdapter.EmployeeIdAsync();

            if (!User.IsInRole(UserRoleName.Admin) && employeeId != currentUserId)
            {
                return(RedirectToAction("Index", new { weekId }));
            }

            if (postType == "Save" || postType == "Add Task" || postType == "Submit")
            {
                var res = await saveTimeEntriesCommand.SaveTimeEntriesAsync(employeeId, weekId, vm);

                if (res.Successful)
                {
                    NotificationsController.AddNotification(User.SafeUserName(), "Timesheet has been saved");
                }
                else
                {
                    return(await ReloadPageForErrorCorrection(weekId, employeeId, vm, res));
                }
            }

            if (postType == "Add Task")
            {
                var AddResult = await addNewJobTaskComboCommand.AddNewJobTaskCombo(employeeId, weekId, vm.NewEntry.SelectedTaskId ?? 0, vm.NewEntry.SelectedJobId ?? 0);

                if (AddResult.Successful)
                {
                    NotificationsController.AddNotification(User.SafeUserName(), "The selected task has been added.");
                }
                else
                {
                    NotificationsController.AddNotification(User.SafeUserName(), "Select task could not be added.");
                    return(await ReloadPageForErrorCorrection(weekId, employeeId, vm, AddResult));
                }
            }

            if (postType == "Copy Job/Tasks From Previous Week")
            {
                await copyPreviousWeekTimeCommand.CopyPreviousWeekTime(employeeId, weekId);
            }

            if (postType == "Submit")
            {
                var req = new TimeApprovalRequest(
                    approvingUserId: await sessionAdapter.EmployeeIdAsync(),
                    approvingUserIsAdmin: User.IsInRole(UserRoleName.Admin),
                    employeeId: employeeId,
                    newApprovalState: TimeApprovalStatus.Submitted,
                    weekId: weekId
                    );
                var res = await approveTimeCommand.ApplyApproval(req);

                NotificationsController.AddNotification(User.SafeUserName(), $"Timesheet is {TimeApprovalStatus.Submitted}");
            }

            if (postType == "Approve")
            {
                var req = new TimeApprovalRequest(
                    approvingUserId: await sessionAdapter.EmployeeIdAsync(),
                    approvingUserIsAdmin: User.IsInRole(UserRoleName.Admin),
                    employeeId: employeeId,
                    newApprovalState: TimeApprovalStatus.Approved,
                    weekId: weekId
                    );
                var res = await approveTimeCommand.ApplyApproval(req);

                NotificationsController.AddNotification(User.SafeUserName(), $"Timesheet is {TimeApprovalStatus.Submitted}");
            }

            if (postType == "Reject")
            {
                var req = new TimeApprovalRequest(
                    approvingUserId: await sessionAdapter.EmployeeIdAsync(),
                    approvingUserIsAdmin: User.IsInRole(UserRoleName.Admin),
                    employeeId: employeeId,
                    newApprovalState: TimeApprovalStatus.Rejected,
                    weekId: weekId
                    );
                var res = await approveTimeCommand.ApplyApproval(req);

                NotificationsController.AddNotification(User.SafeUserName(), $"Timesheet is {TimeApprovalStatus.Rejected}");
            }
            if (postType == "Save New Combination")
            {
                var rowId     = vm.SelectedRowId;
                var oldJobId  = int.Parse(rowId.Substring(0, rowId.IndexOf(".")));
                var oldTaskId = int.Parse(rowId.Substring(rowId.IndexOf(".") + 1));
                var res       = await modifyJobTaskComboCommand.ModifyJobTaskCombo(employeeId, weekId, vm.NewEntry.SelectedTaskId ?? 0, vm.NewEntry.SelectedJobId ?? 0, oldTaskId, oldJobId);
            }

            if (postType == "RemoveRow")
            {
                var rowId  = vm.SelectedRowId;
                var jobId  = rowId.Substring(0, rowId.IndexOf("."));
                var taskId = rowId.Substring(rowId.IndexOf(".") + 1);
                var res    = await removeRowCommand.RemoveRow(employeeId, weekId, int.Parse(taskId), int.Parse(jobId));
            }
            return(RedirectToAction(nameof(Edit), new { weekId = weekId, employeeId = employeeId }));
        }