public async Task <LeaveMainResponse> GetAllLeaveRecordByEmployee(LeaveRequestByEmployee FilterRequest)
        {
            FilterRequest.Page  = FilterRequest.Page == 0 ? 1 : FilterRequest.Page;
            FilterRequest.Limit = FilterRequest.Limit == 0 ? 10 : FilterRequest.Limit;
            IQueryable <LeaveResponse> data;
            LeaveMainResponse          leaveMainResponse = new LeaveMainResponse();

            data = from l1 in ObjContext.Leave
                   join GC1 in ObjContext.GlobalCodes on l1.LeaveType equals GC1.GlobalCodeId into gcode1
                   from gcd1 in gcode1.DefaultIfEmpty()
                   join GC2 in ObjContext.GlobalCodes on l1.RequestStatus equals GC2.GlobalCodeId into gcode2
                   from gcd2 in gcode2.DefaultIfEmpty()
                   join GC3 in ObjContext.GlobalCodes on l1.Duration equals GC3.GlobalCodeId into gcode3
                   from gcd3 in gcode3.DefaultIfEmpty()
                   join U in ObjContext.Users on l1.EmployeeId equals U.UserId into US1
                   from US in US1.DefaultIfEmpty()
                   orderby FilterRequest.OrderBy
                   where l1.IsDeleted == false && l1.IsActive == true && l1.EmployeeId == FilterRequest.EmployeeId
                   select new LeaveResponse
            {
                EmployeeId        = l1.EmployeeId,
                LeaveType         = gcd1.CodeName,
                Duration          = (gcd3.CodeName == null ? String.Empty : gcd3.CodeName),
                StartDate         = l1.StartDate,
                EndDate           = l1.EndDate,
                NumberOfDays      = l1.NumberOfDays,
                CreatedOn         = l1.CreatedOn,
                LeaveId           = l1.LeaveId,
                Reason            = l1.Reason,
                RequestStatusName = (gcd2.CodeName == null ? String.Empty : gcd2.CodeName),
                PendingLeaves     = l1.PendingLeaves,
                RequestStatus     = l1.RequestStatus,
                Username          = US.UserName,
                Email             = US.Email
            };

            if (FilterRequest.OrderByDescending == true)
            {
                data = data.OrderByDescending(x => x.GetType().GetProperty(FilterRequest.OrderBy).GetValue(x));
            }
            else
            {
                data = data.OrderBy(x => x.GetType().GetProperty(FilterRequest.OrderBy).GetValue(x));
            }
            leaveMainResponse.totalRecords = data.Count();
            if (FilterRequest.AllRecords)
            {
                leaveMainResponse.leaveResponse = await data.ToListAsync();
            }
            else
            {
                leaveMainResponse.leaveResponse = data.Skip((FilterRequest.Page - 1) * FilterRequest.Limit).Take(FilterRequest.Limit).ToList();
            }

            return(leaveMainResponse);
        }
        public async Task <LeaveMainResponse> GetAllLeaveRecordofEmployees(EmployeeLeaveRequestByAdmin employeeLeaveRequestByAdmin)
        {
            IQueryable <LeaveResponse>     data;
            IQueryable <LeaveTypeResponse> count;
            IQueryable <DurationResponse>  durationcount;
            LeaveMainResponse leaveMainResponse = new LeaveMainResponse();
            Double            monthlyBalance    = 0;
            Double            availedLeaves     = 0;
            Double            balance           = 0;

            data = from l1 in ObjContext.Leave
                   join GC1 in ObjContext.GlobalCodes on l1.LeaveType equals GC1.GlobalCodeId into gcode1
                   from gcd1 in gcode1.DefaultIfEmpty()
                   join GC2 in ObjContext.GlobalCodes on l1.RequestStatus equals GC2.GlobalCodeId into gcode2
                   from gcd2 in gcode2.DefaultIfEmpty()
                   join GC3 in ObjContext.GlobalCodes on l1.Duration equals GC3.GlobalCodeId into gcode3
                   from gcd3 in gcode3.DefaultIfEmpty()
                   join GC4 in ObjContext.GlobalCodes on l1.RequestStatus equals GC4.GlobalCodeId into gcode4
                   from gcd4 in gcode4.DefaultIfEmpty()
                   join U in ObjContext.Users on l1.EmployeeId equals U.UserId into US1
                   from US in US1.DefaultIfEmpty()
                   where l1.IsDeleted == false && l1.IsActive == true
                   //&& gcd4.CodeName == "Pending"
                   //&& (l1.EmployeeId == leaveRequest.EmployeeId)
                   select new LeaveResponse
            {
                EmployeeId    = l1.EmployeeId,
                LeaveType     = gcd1.CodeName,
                StartDate     = l1.StartDate,
                Duration      = gcd3.CodeName,
                EndDate       = l1.EndDate,
                NumberOfDays  = l1.NumberOfDays,
                RequestStatus = l1.RequestStatus,
                PendingLeaves = l1.PendingLeaves,
                Username      = US.UserName,
                Reason        = l1.Reason,
                LeaveId       = l1.LeaveId,
                Email         = US.Email,
                Status        = gcd4.CodeName
            };


            int approved = await GetGlobalCode("Approved");

            int pending = await GetGlobalCode("Pending");

            if (data != null)
            {
                var monthlyJobCount = from leave in ObjContext.Leave
                                      where leave.CreatedOn.Month <= DateTime.Now.Month &&
                                      leave.CreatedOn.Year == DateTime.Now.Year &&
                                      // leave.EmployeeId == leaveRequest.EmployeeId &&
                                      leave.RequestStatus == approved
                                      group leave by leave.CreatedOn.Month into g
                                      select new ResponseMonthlyCount
                {
                    MonthName   = g.First().CreatedOn.Month,
                    TotalLeaves = g.Sum(pc => pc.NumberOfDays),
                };
                foreach (var leave in monthlyJobCount)
                {
                    monthlyBalance = 1.5 + balance;
                    availedLeaves  = leave.TotalLeaves;
                    balance        = monthlyBalance - availedLeaves;
                }
                if (employeeLeaveRequestByAdmin.OrderByDescending == true)
                {
                    data = data.OrderByDescending(x => x.GetType().GetProperty(employeeLeaveRequestByAdmin.OrderBy).GetValue(x));
                }
                else
                {
                    data = data.OrderBy(x => x.GetType().GetProperty(employeeLeaveRequestByAdmin.OrderBy).GetValue(x));
                }
                if (employeeLeaveRequestByAdmin.AllRecords)
                {
                    leaveMainResponse.leaveResponse = data.ToList();
                }
                else
                {
                    leaveMainResponse.leaveResponse = data.Skip((employeeLeaveRequestByAdmin.Page - 1) * employeeLeaveRequestByAdmin.Limit).Take(employeeLeaveRequestByAdmin.Limit).ToList();
                }
                if (employeeLeaveRequestByAdmin.PendingLeaves == true)
                {
                    data = data.Where(l => l.RequestStatus == pending);
                }
                if (employeeLeaveRequestByAdmin.ApprovedLeaves == true)
                {
                    data = data.Where(x => x.RequestStatus == approved);
                }

                leaveMainResponse.leaveResponse = await data.ToListAsync();

                leaveMainResponse.totalRecords = data.Count();

                data  = data.Where(x => x.RequestStatus == approved);
                count = data.GroupBy(x => new { x.LeaveType }).Select(g => new LeaveTypeResponse {
                    LeaveType = g.FirstOrDefault().LeaveType, Count = g.Count()
                });
                durationcount = data.GroupBy(x => new { x.Duration }).Select(g => new DurationResponse {
                    DurationType = g.FirstOrDefault().Duration, Count = g.Count()
                });
                leaveMainResponse.Status            = true;
                leaveMainResponse.monthlyBalance    = monthlyBalance;
                leaveMainResponse.availedLeaves     = availedLeaves;
                leaveMainResponse.balance           = balance;
                leaveMainResponse.leaveTypeResponse = await count.ToListAsync();

                leaveMainResponse.durationResponse = await durationcount.ToListAsync();
            }
            return(leaveMainResponse);
        }