public ActionResult Create(VacationRequestVM requestVM, int id)
        {
            try
            {
                requestVM.Id               = 0;
                requestVM.EmployeeId       = id;
                requestVM.EmployeeName     = _db.Employees.Find(requestVM.EmployeeId).fullname;
                requestVM.VacationTypeName = _db.VacationTypes.Find(requestVM.VacationTypeId).Name;
                requestVM.DateRequested    = DateTime.Now;
                requestVM.Status           = false;
                requestVM.Cancelled        = false;


                var vacationtypes = _db.VacationTypes.Select(q => new SelectListItem
                {
                    Text  = q.Name,
                    Value = q.Id.ToString()
                });

                requestVM.vacationtypes = vacationtypes;
                VacationRequest request = Map(requestVM);


                _db.VacationRequests.Add(request);
                _db.SaveChanges();

                return(RedirectToAction(nameof(Index)));
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", "Something went wrong...");
                return(View(requestVM));
            }
        }
        // GET: VacationRequestController/Details/5
        public ActionResult Review(int id)
        {
            VacationRequestVM request         = new VacationRequestVM();
            VacationRequest   vacationrequest = _db.VacationRequests.Include(q => q.Employee).Include(q => q.VacationType).FirstOrDefault(q => q.Id == id);

            request = ReverseMap(vacationrequest);

            return(View(request));
        }
        /*public ActionResult Delete(VacationRequestVM model)
         * {
         *
         *      VacationRequest request = _db.VacationRequests.Find(id);
         *      _db.VacationRequests.Remove(request);
         *      _db.SaveChanges();
         *      return RedirectToAction(nameof(Index));
         * }*/
        public List <VacationRequestVM> Maplist(List <VacationRequest> list)
        {
            List <VacationRequestVM> listVM = new List <VacationRequestVM>();

            for (int i = 0; i < list.Count(); i++)
            {
                VacationRequestVM obj = ReverseMap(list[i]);
                listVM.Add(obj);
            }
            return(listVM);
        }
        // GET: VacationRequestController/Create
        public ActionResult Create(int id)
        {
            VacationRequestVM requestVM = new VacationRequestVM();
            var vacationtypes           = _db.VacationTypes.Select(q => new SelectListItem
            {
                Text  = q.Name,
                Value = q.Id.ToString()
            });

            requestVM.vacationtypes = vacationtypes;
            return(View(requestVM));
        }
        // GET: VacationRequestController/Edit/5
        public ActionResult Edit(int id)
        {
            VacationRequest   request   = _db.VacationRequests.Include(q => q.Employee).Include(q => q.VacationType).FirstOrDefault(q => q.Id == id);
            VacationRequestVM requestVM = ReverseMap(request);
            var vacationtypes           = _db.VacationTypes.Select(q => new SelectListItem
            {
                Text  = q.Name,
                Value = q.Id.ToString()
            });

            requestVM.vacationtypes = vacationtypes;

            return(View(requestVM));
        }
        public VacationRequestVM ReverseMap(VacationRequest request)
        {
            VacationRequestVM obj = new VacationRequestVM();

            obj.Id               = request.Id;
            obj.EmployeeId       = request.EmployeeId;
            obj.EmployeeName     = _db.Employees.Find(request.EmployeeId).fullname;
            obj.VacationTypeId   = request.VacationTypeId;
            obj.VacationTypeName = _db.VacationTypes.Find(request.VacationTypeId).Name;
            obj.StartDate        = request.StartDate;
            obj.EndDate          = request.EndDate;
            obj.DateRequested    = request.DateRequested;
            obj.Status           = request.Status;

            return(obj);
        }
        public VacationRequest Map(VacationRequestVM requestVM)
        {
            VacationRequest obj = new VacationRequest();

            obj.Id = requestVM.Id;
            obj.VacationAllocationId = requestVM.Id;
            obj.EmployeeId           = requestVM.EmployeeId;
            obj.Employee             = _db.Employees.Find(requestVM.EmployeeId);
            obj.StartDate            = requestVM.StartDate;
            obj.EndDate        = requestVM.EndDate;
            obj.VacationTypeId = requestVM.VacationTypeId;
            obj.VacationType   = _db.VacationTypes.Find(requestVM.VacationTypeId);
            obj.Cancelled      = requestVM.Cancelled;
            obj.Status         = requestVM.Status;


            return(obj);
        }
        public ActionResult Edit(VacationRequestVM requestVM)
        {
            try
            {
                var vacationtypes = _db.VacationTypes.Select(q => new SelectListItem
                {
                    Text  = q.Name,
                    Value = q.Id.ToString()
                });
                requestVM.vacationtypes = vacationtypes;

                VacationRequest request = Map(requestVM);
                _db.VacationRequests.Update(request);
                _db.SaveChanges();

                return(RedirectToAction(nameof(Index)));
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", "Something went wrong...");
                return(View(requestVM));
            }
        }
        public async Task <ActionResult> Create(CreateVacationRequestVM model)
        {
            var startDate     = Convert.ToDateTime(model.StartDate);
            var endDate       = Convert.ToDateTime(model.EndDate);
            var vacationtypes = await _typerepo.FindAll();

            var vacationtypeItems = vacationtypes.Select(q => new SelectListItem
            {
                Text  = q.Name,
                Value = q.Id.ToString()
            });

            model.VacationTypes = vacationtypeItems;
            try
            {
                if (!ModelState.IsValid)
                {
                    return(View(model));
                }

                if (DateTime.Compare(startDate, endDate) > 1)
                {
                    ModelState.AddModelError("", "Start Date cannot be further in the fiuture than the End Date...");
                    return(View(model));
                }

                var employee = await _userManager.GetUserAsync(User);

                var allocation = await _allocationrepo.GetVacationAllocationsByEmployeeAndType(employee.Id, model.VacationTypeId);

                int daysRequested = (int)(endDate - startDate).TotalDays;

                if (daysRequested > allocation.NumberOfDays)
                {
                    ModelState.AddModelError("", "You don't have sufficient days for this request...");
                    return(View(model));
                }

                var VacationRequestModel = new VacationRequestVM
                {
                    RequestingEmployeeId = employee.Id,
                    StartDate            = startDate,
                    EndDate        = endDate,
                    Approved       = null,
                    Cancelled      = false,
                    DateRequested  = DateTime.Now,
                    DateActioned   = DateTime.Now,
                    VacationTypeId = model.VacationTypeId
                };

                var vacationrequest = _mapper.Map <VacationRequest>(VacationRequestModel);
                var isSuccess       = await _requestrepo.Create(vacationrequest);

                if (!isSuccess)
                {
                    ModelState.AddModelError("", "Something went wrong when submitting your record...");
                    return(View(model));
                }

                return(RedirectToAction(nameof(MyLeave)));
            }
            catch (Exception ex)
            {
                ModelState.AddModelError("", "Something went wrong...");
                return(View(model));
            }
        }