diff --git a/Marco.Pms.Model/Filters/ImageFilter.cs b/Marco.Pms.Model/Filters/ImageFilter.cs index d044a9b..90f6208 100644 --- a/Marco.Pms.Model/Filters/ImageFilter.cs +++ b/Marco.Pms.Model/Filters/ImageFilter.cs @@ -8,6 +8,7 @@ public List? WorkCategoryIds { get; set; } public List? ActivityIds { get; set; } public List? UploadedByIds { get; set; } + public List? ServiceIds { get; set; } public DateTime? StartDate { get; set; } public DateTime? EndDate { get; set; } } diff --git a/Marco.Pms.Services/Controllers/ImageController.cs b/Marco.Pms.Services/Controllers/ImageController.cs index c8724de..46cb5fc 100644 --- a/Marco.Pms.Services/Controllers/ImageController.cs +++ b/Marco.Pms.Services/Controllers/ImageController.cs @@ -40,7 +40,7 @@ namespace Marco.Pms.Services.Controllers [HttpGet("images/{projectId}")] - public async Task GetImageList(Guid projectId, [FromQuery] string? filter, [FromQuery] int? pageNumber = 1, [FromQuery] int? pageSize = 10) + public async Task GetImageList(Guid projectId, [FromQuery] string? filter, [FromQuery] int pageNumber = 1, [FromQuery] int pageSize = 10) { _logger.LogInfo("[GetImageList] Called by Employee for ProjectId: {ProjectId}", projectId); @@ -79,6 +79,28 @@ namespace Marco.Pms.Services.Controllers } } + var taskQuery = _context.TaskAllocations + .Include(t => t.Employee) + .Include(t => t.ReportedBy) + .Include(t => t.ApprovedBy) + .Include(t => t.WorkStatus) + .Include(t => t.WorkItem) + .ThenInclude(wi => wi!.ActivityMaster) + .ThenInclude(a => a!.ActivityGroup) + .ThenInclude(ag => ag!.Service) + .Include(t => t.WorkItem) + .ThenInclude(wi => wi!.WorkArea) + .ThenInclude(wa => wa!.Floor) + .ThenInclude(f => f!.Building) + .Include(t => t.WorkItem) + .ThenInclude(wi => wi!.WorkCategoryMaster) + .Where(t => t.WorkItem != null && + t.WorkItem.WorkArea != null && + t.WorkItem.WorkArea.Floor != null && + t.WorkItem.WorkArea.Floor.Building != null && + t.WorkItem.WorkArea.Floor.Building.ProjectId != projectId && + t.TenantId == tenantId); + // Step 4: Extract filter values var buildingIds = imageFilter?.BuildingIds; var floorIds = imageFilter?.FloorIds; @@ -88,71 +110,60 @@ namespace Marco.Pms.Services.Controllers var startDate = imageFilter?.StartDate; var endDate = imageFilter?.EndDate; var uploadedByIds = imageFilter?.UploadedByIds; + var serviceIds = imageFilter?.ServiceIds; - // Step 5: Fetch building > floor > area > work item hierarchy - List? buildings = null; - List? floors = null; - List? workAreas = null; - - if (buildingIds != null && buildingIds.Count > 0) + if (buildingIds?.Any() ?? false) { - buildings = await _context.Buildings - .Where(b => b.ProjectId == projectId && buildingIds.Contains(b.Id)) - .ToListAsync(); - } - else - { - buildings = await _context.Buildings - .Where(b => b.ProjectId == projectId) - .ToListAsync(); - - buildingIds = buildings.Select(b => b.Id).ToList(); + taskQuery = taskQuery + .Where(t => t.WorkItem != null && + t.WorkItem.WorkArea != null && + t.WorkItem.WorkArea.Floor != null && + buildingIds.Contains(t.WorkItem.WorkArea.Floor.BuildingId)); } - if (floorIds != null && floorIds.Count > 0) + if (floorIds?.Any() ?? false) { - floors = await _context.Floor - .Where(f => buildingIds.Contains(f.BuildingId) && floorIds.Contains(f.Id)) - .ToListAsync(); - } - else - { - floors = await _context.Floor - .Where(f => buildingIds.Contains(f.BuildingId)) - .ToListAsync(); - - floorIds = floors.Select(f => f.Id).ToList(); - } - if (workAreaIds != null && workAreaIds.Count > 0) - { - workAreas = await _context.WorkAreas - .Where(wa => floorIds.Contains(wa.FloorId) && workAreaIds.Contains(wa.Id)) - .ToListAsync(); - } - else - { - workAreas = await _context.WorkAreas - .Where(wa => floorIds.Contains(wa.FloorId)) - .ToListAsync(); - - workAreaIds = workAreas.Select(wa => wa.Id).ToList(); + taskQuery = taskQuery + .Where(t => t.WorkItem != null && + t.WorkItem.WorkArea != null && + floorIds.Contains(t.WorkItem.WorkArea.FloorId)); } - var workItemsQuery = _context.WorkItems.Include(w => w.ActivityMaster).Include(w => w.WorkCategoryMaster) - .Where(wi => workAreaIds.Contains(wi.WorkAreaId)); - if (activityIds?.Any() == true) workItemsQuery = workItemsQuery.Where(wi => activityIds.Contains(wi.ActivityId)); + if (workAreaIds?.Any() ?? false) + { + taskQuery = taskQuery + .Where(t => t.WorkItem != null && + workAreaIds.Contains(t.WorkItem.WorkAreaId)); + } + + + if (activityIds?.Any() == true) + { + taskQuery = taskQuery + .Where(t => t.WorkItem != null && + activityIds.Contains(t.WorkItem.ActivityId)); + } if (workCategoryIds?.Any() == true) { - workItemsQuery = workItemsQuery.Where(wi => wi.WorkCategoryMaster != null && workCategoryIds.Contains(wi.WorkCategoryMaster.Id)); + taskQuery = taskQuery + .Where(t => t.WorkItem != null && + t.WorkItem.WorkCategoryId.HasValue && + workCategoryIds.Contains(t.WorkItem.WorkCategoryId.Value)); + } + + if (serviceIds?.Any() ?? false) + { + taskQuery = taskQuery.Where(t => t.WorkItem != null && + t.WorkItem.ActivityMaster != null && + t.WorkItem.ActivityMaster.ActivityGroup != null && + serviceIds.Contains(t.WorkItem.ActivityMaster.ActivityGroup.ServiceId)); } - var workItems = await workItemsQuery.ToListAsync(); - var workItemIds = workItems.Select(wi => wi.Id).ToList(); // Step 6: Fetch task allocations and comments - var tasks = await _context.TaskAllocations.Include(t => t.ReportedBy) - .Where(t => workItemIds.Contains(t.WorkItemId)).ToListAsync(); + var tasks = await taskQuery.ToListAsync(); + var taskIds = tasks.Select(t => t.Id).ToList(); var comments = await _context.TaskComments.Include(c => c.Employee) @@ -172,21 +183,21 @@ namespace Marco.Pms.Services.Controllers { docQuery = docQuery.Where(d => d.UploadedAt.Date >= startDate.Value.Date && d.UploadedAt.Date <= endDate.Value.Date); } - if (pageNumber != null && pageSize != null) + + int totalRecords = await docQuery.GroupBy(d => d.BatchId).CountAsync(); + int totalPages = (int)Math.Ceiling((double)totalRecords / pageSize); + + documents = await docQuery + .GroupBy(d => d.BatchId) + .OrderByDescending(g => g.Max(d => d.UploadedAt)) + .Skip((pageNumber - 1) * pageSize) + .Take(pageSize) + .Select(g => new DocumentBatchDto { - documents = await docQuery - .GroupBy(d => d.BatchId) - .OrderByDescending(g => g.Max(d => d.UploadedAt)) - .Skip((pageNumber.Value - 1) * pageSize.Value) - .Take(pageSize.Value) - .Select(g => new DocumentBatchDto - { - BatchId = g.Key, - Documents = g.ToList() - }) - .ToListAsync(); - Console.Write("Pagenation Success"); - } + BatchId = g.Key, + Documents = g.ToList() + }) + .ToListAsync(); // Step 8: Build response @@ -209,10 +220,10 @@ namespace Marco.Pms.Services.Controllers comment = comments.OrderBy(c => c.CommentDate).FirstOrDefault(c => c.TaskAllocationId == task.Id); } - var workItem = workItems.FirstOrDefault(w => w.Id == task?.WorkItemId); - var workArea = workAreas.FirstOrDefault(wa => wa.Id == workItem?.WorkAreaId); - var floor = floors.FirstOrDefault(f => f.Id == workArea?.FloorId); - var building = buildings.FirstOrDefault(b => b.Id == floor?.BuildingId); + var workItem = task!.WorkItem; + var workArea = task!.WorkItem!.WorkArea; + var floor = task!.WorkItem!.WorkArea!.Floor; + var building = task!.WorkItem!.WorkArea!.Floor!.Building; return new { @@ -249,8 +260,17 @@ namespace Marco.Pms.Services.Controllers documentVM = documentVM.Where(d => d.Documents != null && d.Documents.Any(x => uploadedByIds.Contains(x.UploadedBy?.Id ?? Guid.Empty))).ToList(); } + var VM = new + { + TotalCount = totalRecords, + TotalPages = totalPages, + CurrentPage = pageNumber, + PageSize = pageSize, + Data = documentVM + }; + _logger.LogInfo("[GetImageList] Fetched {Count} documents for ProjectId: {ProjectId}", documentVM.Count, projectId); - return Ok(ApiResponse.SuccessResponse(documentVM, $"{documentVM.Count} image records fetched successfully", 200)); + return Ok(ApiResponse.SuccessResponse(VM, $"{documentVM.Count} image records fetched successfully", 200)); } [HttpGet("batch/{batchId}")]