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); }
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)); }