Exemple #1
0
        public async Task <EmployeeLeavesValidationStatus> ValidateUpdate(int id, EmployeeLeavesUpdateParameters parameters)
        {
            if (!await _dbContext.Employees
                .Include(e => e.Department)
                .AnyAsync(e => e.Department.ManagerId.HasValue && e.Department.ManagerId == parameters.ManagerId))
            {
                return(EmployeeLeavesValidationStatus.NotAuthorized);
            }

            if (await _dbContext.EmployeeLeaves.AnyAsync(l => l.Id.Equals(id) &&
                                                         l.Status == LeaveStatus.Approved ||
                                                         l.Status == LeaveStatus.Pending))
            {
                return(EmployeeLeavesValidationStatus.NotApplicable);
            }

            var employeeDuration = _dbContext.EmployeeLeaves.Include(l => l.LeaveCategory)
                                   .Include(e => e.Employee)
                                   .Where(e => (e.Id != id &&
                                                e.EmployeeId.Equals(parameters.EmployeeId) &&
                                                e.Status == LeaveStatus.Approved) &&
                                          e.LeaveCategory.Name.Equals(LeaveType.annual))
                                   .Sum(d => d.Duration);

            var duration = employeeDuration + (parameters.EndDate.Subtract(parameters.StartDate).Days);

            var leaveBalance = _dbContext.LeavesCategories.Where(l => l.Name.Equals(LeaveType.annual)).Select(l => l.Balance).FirstOrDefault();

            if (employeeDuration.Equals(leaveBalance) || duration > leaveBalance)
            {
                return(EmployeeLeavesValidationStatus.LeaveBalanceExceeded);
            }

            return(EmployeeLeavesValidationStatus.Success);
        }
Exemple #2
0
        public async Task <EmployeeLeavesUpdateResult> Update(int id, EmployeeLeavesUpdateParameters parameters)
        {
            var validationResult = await ValidateUpdate(id, parameters);

            var leave = await _dbContext.EmployeeLeaves
                        .Include(e => e.Employee)
                        .FirstOrDefaultAsync(c => c.Id == id);

            if (validationResult != EmployeeLeavesValidationStatus.Success)
            {
                return(new EmployeeLeavesUpdateResult
                {
                    EmployeeName = leave.Employee?.Name,
                    ValidationStatus = validationResult,
                    StartDate = parameters.StartDate,
                    EndDate = parameters.EndDate,
                    AttachmentFile = parameters.AttachmentFile,
                    Status = LeaveStatus.Pending,
                    RejectReason = parameters.RejectReason,
                    Duration = parameters.EndDate.Day - parameters.StartDate.Day
                });
            }

            if (leave != null)
            {
                leave.StartDate      = parameters.StartDate;
                leave.EndDate        = parameters.EndDate;
                leave.AttachmentFile = parameters.AttachmentFile;
                leave.RejectReason   = parameters.RejectReason;
                leave.Duration       = parameters.EndDate.Day - parameters.StartDate.Day;
                leave.Status         = parameters.LeaveStatus;

                await _dbContext.SaveChangesAsync();
            }
            return(new EmployeeLeavesUpdateResult()
            {
                EmployeeName = leave.Employee?.Name,
                StartDate = parameters.StartDate,
                EndDate = parameters.EndDate,
                AttachmentFile = parameters.AttachmentFile,
                RejectReason = parameters.RejectReason,
                Status = parameters.LeaveStatus,
                Duration = parameters.EndDate.Day - parameters.StartDate.Day
            });
        }
 public async Task <EmployeeLeavesUpdateResult> Put(int id, EmployeeLeavesUpdateParameters parameters)
 {
     return(await _employeeLeaveService.Update(id, parameters));
 }