2 次代碼提交 6844a22526 ... 9b5c5e5641

作者 SHA1 備註 提交日期
  zinab_elgendy 9b5c5e5641 enhancement 2 月之前
  zinab_elgendy 3bb37b4241 attendance distplay all employees 2 月之前

+ 1 - 0
MTWorkHR.Application/Dtos/Attendance/AttendancePagingInputDto.cs

@@ -11,6 +11,7 @@ namespace MTWorkHR.Application.Models
     {
         public DateTime? SearchDate { get; set; }
         public string? UserId { get; set; }
+        public string? UserName { get; set; }
 
 
     }

+ 110 - 74
MTWorkHR.Application/Services/User/AttendanceService.cs

@@ -31,105 +31,141 @@ namespace MTWorkHR.Application.Services
             _globalInfo = globalInfo;
             _userService = userService;
         }
-        public async Task<PagingResultDto<AttendanceDto>> GetAll(AttendancePagingInputDto PagingInputDto)
+        public async Task<PagingResultDto<AttendanceDto>> GetAll(AttendancePagingInputDto pagingInputDto)
         {
-            var res = await _unitOfWork.Attendance.GetAllWithChildrenAsync();
-            var query = res.Item1;
+            // Fetch all attendances with related data
+            var attendanceResult = await _unitOfWork.Attendance.GetAllWithChildrenAsync();
+            var query = attendanceResult.Item1.AsQueryable();
 
+            // Apply filters based on user type and input
             if (_globalInfo.UserType != UserTypeEnum.Business)
             {
                 query = query.Where(m => m.UserId == _globalInfo.UserId);
+            }
 
+            if (!string.IsNullOrEmpty(pagingInputDto.Filter))
+            {
+                query = query.Where(u => u.LeaveReason!.Contains(pagingInputDto.Filter) || u.UserName!.Contains(pagingInputDto.Filter));
             }
-            if (PagingInputDto.Filter != null)
+
+            if (pagingInputDto.SearchDate != null)
             {
-                var filter = PagingInputDto.Filter;
-                query = query.Where(u => u.LeaveReason!.Contains(filter) || u.UserName!.Contains(filter));
+                query = query.Where(u => u.AttendanceDate.Date == pagingInputDto.SearchDate.Value.Date);
             }
-                  
-            if (PagingInputDto.SearchDate != null)
+
+            if (!string.IsNullOrEmpty(pagingInputDto.UserId))
             {
-                query = query.Where(u => u.AttendanceDate.Date == PagingInputDto.SearchDate.Value.Date);
+                query = query.Where(u => u.UserId == pagingInputDto.UserId);
             }
 
-            if (PagingInputDto.UserId != null)
+            // Apply sorting
+            var orderedQuery = query.OrderBy($"{pagingInputDto.OrderByField} {pagingInputDto.OrderType}");
+
+            // Apply paging
+            var pagedQuery = orderedQuery
+                .Skip((pagingInputDto.PageNumber - 1) * pagingInputDto.PageSize)
+                .Take(pagingInputDto.PageSize);
+
+            // Fetch total count for pagination
+            var totalCount = await query.CountAsync();
+
+            // Map attendance data to DTOs
+            var attendanceDtos = MapperObject.Mapper.Map<IList<AttendanceDto>>(await pagedQuery.ToListAsync());
+
+
+            // Fetch all company employees
+            var employeesList = await _userService.GetAllCompanyEmployees();
+
+            // Filter employees by name if provided
+            if (!string.IsNullOrEmpty(pagingInputDto.UserName))
             {
-                query = query.Where(u => u.UserId == PagingInputDto.UserId);
+                var filter = pagingInputDto.UserName;
+                var filters = filter.Split(" ");
+                var firstNameFilter = filters[0];
+                var lastNameFilter = filters.Length > 1 ? filters[1] : "";
+
+                employeesList = employeesList.Where(u =>
+                    u.UserName.Contains(filter) || u.Email.Contains(filter) || u.FavoriteName.Contains(filter) ||
+                    u.FirstName.Contains(filter) || u.LastName.Contains(filter) ||
+                    (u.FirstName.Contains(firstNameFilter) && (string.IsNullOrEmpty(lastNameFilter) || u.LastName.Contains(lastNameFilter))) ||
+                    (u.LastName.Contains(lastNameFilter) && (string.IsNullOrEmpty(firstNameFilter) || u.FirstName.Contains(firstNameFilter)))
+                ).ToList();
             }
-            //var dayGroupByUser = query.GroupBy(m => new { m.UserId, m.UserName, AttendanceDate = m.AttendanceDate.Date }).Select
-            //  (g => new Attendance
-            //  {
-            //      UserId = g.Key.UserId,
-            //      UserName = g.Key.UserName,
-            //      AttendanceDate = g.Key.AttendanceDate,
-            //      TotalHours = g.Sum(s => (s.CheckInTime.HasValue && s.CheckOutTime.HasValue) ? (s.CheckOutTime.Value - s.CheckInTime.Value).TotalHours : 0)
-            //  });
-
-            var order = query.OrderBy(PagingInputDto.OrderByField + " " + PagingInputDto.OrderType);
-
-            var page = order.Skip((PagingInputDto.PageNumber * PagingInputDto.PageSize) - PagingInputDto.PageSize).Take(PagingInputDto.PageSize);
-
-            var total = await query.CountAsync();
-
-            var list = MapperObject.Mapper
-                .Map<IList<AttendanceDto>>(await page.ToListAsync());
-
-
-            //var dayGroupByUser = list.GroupBy(m => new { m.UserId,m.WeekDay, m.UserName, AttendanceDate = m.AttendanceDate.Date }).Select
-            //  (g => new AttendanceDto { 
-            //      UserId = g.Key.UserId, UserName=g.Key.UserName,
-            //      WeekDay= g.Key.WeekDay,
-            //      AttendanceDate = g.Key.AttendanceDate, 
-            //      TotalHours = g.Sum(s=> s.TotalHours) 
-            //  }).ToList();
-            var employeesList = list.Select(a => a.UserId).Distinct();
-            Dictionary<string, UserBasicInfoDto> employeeDictList = new Dictionary<string, UserBasicInfoDto>();
-            foreach (var RequestingEmployeeId in employeesList)
+
+            // Create a dictionary to store user data
+            var userDataDictionary = new Dictionary<string, UserBasicInfoDto>();
+
+            // Fetch user data for all employees
+            foreach (var employee in employeesList)
             {
-                if (RequestingEmployeeId != null)
+                var user = await _userService.GetUserWithAttachmentById(employee.Id);
+                if (user != null)
                 {
-                    var user = await _userService.GetUserWithAttachmentById(RequestingEmployeeId);
-                    if (user != null)
+                    var userDto = MapperObject.Mapper.Map<UserBasicInfoDto>(user);
+                    userDto.ProfileImage = await GetProfileImageAsync(user.UserAttachments);
+                    userDataDictionary[employee.Id] = userDto;
+                }
+            }
+
+            // Combine attendance data with user data
+            var result = new List<AttendanceDto>();
+            if (string.IsNullOrEmpty(pagingInputDto.UserId))
+            {
+                foreach (var employee in employeesList)
+                {
+                    var latestAttendance = attendanceDtos.LastOrDefault(a => a.UserId == employee.Id);
+                    if (latestAttendance != null)
+                    {
+                        latestAttendance.Employee = userDataDictionary[employee.Id];
+                    }
+                    else
                     {
-                        var entitiy = MapperObject.Mapper.Map<UserBasicInfoDto>(user);
-                        //item.Employee = entitiy;
-                        var attach = user.UserAttachments?.FirstOrDefault(a => a.AttachmentTypeId == 9);
-                        if (attach != null)
-                            using (var stream = new MemoryStream(attach.Content))
-                            {
-                                var file = new FormFile(stream, 0, stream.Length, Path.GetFileNameWithoutExtension(attach.FileName), attach.FileName)
-                                {
-                                    Headers = new HeaderDictionary(),
-                                    ContentType = attach.ContentType,
-                                };
-
-                                System.Net.Mime.ContentDisposition cd = new System.Net.Mime.ContentDisposition
-                                {
-                                    FileName = file.FileName
-                                };
-                                file.ContentDisposition = cd.ToString();
-                                entitiy.ProfileImage = file;
-                                
-                            }
-                        employeeDictList.Add(RequestingEmployeeId, entitiy);
+                        latestAttendance = new AttendanceDto
+                        {
+                            UserId = employee.Id,
+                            UserName = employee.UserName,
+                            Employee = userDataDictionary[employee.Id]
+                        };
                     }
+                    result.Add(latestAttendance);
                 }
             }
-            foreach (var item in list)
+            else
             {
-                UserBasicInfoDto? employee;
-                bool success = employeeDictList.TryGetValue(item.UserId, out employee);
-               // var employee2 = employeeDictList[item.UserId];
-                if(success && employee != null) item.Employee = employee;
+                foreach (var attendance in attendanceDtos)
+                {
+                    attendance.Employee = userDataDictionary[pagingInputDto.UserId];
+                }
+                result = attendanceDtos.ToList();
             }
-            var response = new PagingResultDto<AttendanceDto>
+
+            // Return the paged result
+            return new PagingResultDto<AttendanceDto>
             {
-                Result = list ,
-                //Result = ! string.IsNullOrEmpty( PagingInputDto.UserId ) ? list : dayGroupByUser,
-                Total = total
+                Result = result,
+                Total = string.IsNullOrEmpty(pagingInputDto.UserId) ? result.Count : totalCount
             };
+        }
 
-            return response;
+        // Helper method to get profile image
+        private async Task<FormFile> GetProfileImageAsync(ICollection<AttachmentDto> attachments)
+        {
+            var profileImage = attachments?.FirstOrDefault(a => a.AttachmentTypeId == 9);
+            if (profileImage == null) return null;
+
+            using (var stream = new MemoryStream(profileImage.Content))
+            {
+                var file = new FormFile(stream, 0, stream.Length, Path.GetFileNameWithoutExtension(profileImage.FileName), profileImage.FilePath)
+                {
+                    Headers = new HeaderDictionary(),
+                    ContentType = profileImage.ContentType,
+                    ContentDisposition = new System.Net.Mime.ContentDisposition
+                    {
+                        FileName = profileImage.FileName
+                    }.ToString()
+                };
+                return file;
+            }
         }
 
         public override async Task<AttendanceDto> Create(AttendanceDto input)

+ 9 - 3
MTWorkHR.Application/Services/User/UserService.cs

@@ -24,6 +24,7 @@ using Countries.NET.Database;
 using Microsoft.AspNetCore.Http;
 using System.Collections;
 using System.Linq;
+using System.ComponentModel.Design;
 
 namespace MTWorkHR.Application.Services
 {
@@ -278,9 +279,14 @@ namespace MTWorkHR.Application.Services
 
         public async Task<List<UserAllDto>> GetAllCompanyEmployees()
         {
-            var employees = await _userManager.GetUsersInRoleAsync("Employee");
-            var res = employees.Where(e => e.CompanyId == _globalInfo.CompanyId).ToList();
-            var response = MapperObject.Mapper.Map<List<UserAllDto>>(res);
+            var AllEmployees = await _userManager.GetUsersInRoleAsync("Employee");
+            var AllContractors = await _userManager.GetUsersInRoleAsync("Contractor");
+
+            var employees = AllEmployees.Where(e => e.CompanyId == _globalInfo.CompanyId).ToList();
+            var contractors = AllContractors.Where(e => e.CompanyId == _globalInfo.CompanyId).ToList();
+
+            var allUsers = employees.Union(contractors);
+            var response = MapperObject.Mapper.Map<List<UserAllDto>>(allUsers);
 
             return response;
         }

+ 1 - 0
MTWorkHR.Core/IDto/IAttendancePagingInputDto.cs

@@ -6,6 +6,7 @@ namespace MTWorkHR.Core.IDto
     {
         public DateTime? SearchDate { get; set; }
         public string? UserId { get; set; }
+        public string? UserName { get; set; }
 
     }
 }