Example #1
0
        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
            });
        }