public OutputBase AssignLeave(AssignLeaveInput input) { var employee = _employeeRepository.FirstOrDefault(e => e.Number == input.EmployeeNumber); if (employee == null) { return new OutputBase { Message = "Invalid Employee number", Success = false } } ; var leavType = _leaveTypeRepository.FirstOrDefault(lt => lt.Id == input.LeaveTypeId); if (leavType == null) { return new OutputBase { Message = "Invalid leave type ID", Success = false } } ; var period = _leavePeriodRepository.FirstOrDefault(p => input.StartDate >= p.StatDate && input.EndDate <= p.EndDate); if (period == null) { return new OutputBase { Message = "The selected date range does not fall into any leave period", Success = false } } ; var entitement = _leaveEntitlmentRepository.FirstOrDefault( ent => ent.EmployeeId == employee.Id && ent.LeaveTypeId == input.LeaveTypeId && ent.PeriodId == period.Id); if (entitement == null) { return(new OutputBase { Message = string.Format("{0} {1} {2} has no {3} for to selected period", employee.FirstName, employee.LastName, employee.MiddleName, leavType.Name), Success = false }); } var leavesTaken = _leaveRepository.GetAllList( l => l.LeaveEntitlment.EmployeeId == employee.Id && l.LeaveEntitlment.LeaveTypeId == leavType.Id && l.LeaveEntitlment.PeriodId == period.Id); var daysTaken = leavesTaken.Any() ? leavesTaken.Sum(l => l.NumberOfDays) : 0; var daysLeft = entitement.NumberOfDays - daysTaken; var numberOfDays = Math.Abs(new TimeStamp(input.EndDate).DaysDifference(new TimeStamp(input.StartDate))); if (numberOfDays > daysLeft) { return(new OutputBase { Message = string.Format("{0} has alredy taken {1} days from his {2}. The leave balance is now {3}", employee.Fullname, daysTaken, leavType.Name, daysLeft), Success = false }); } _leaveRepository.Insert(new Leave { Comment = input.Comment, EndDate = input.EndDate, StartDate = input.StartDate, EntitlementId = entitement.Id, NumberOfDays = numberOfDays, Status = LeaveStatus.Approved }); return(new OutputBase { Message = "Leave scheduled", Success = true }); }