diff --git a/Marco.Pms.Model/ViewModels/DashBoard/ActivityReport.cs b/Marco.Pms.Model/ViewModels/DashBoard/ActivityReport.cs new file mode 100644 index 0000000..02cc945 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DashBoard/ActivityReport.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.ViewModels.DashBoard +{ + public class ActivityReport + { + public List? PerformedActivites { get; set; } + public double TotalPlannedWork { get; set; } + public double TotalCompletedWork { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/DashBoard/PerformedActivites.cs b/Marco.Pms.Model/ViewModels/DashBoard/PerformedActivites.cs new file mode 100644 index 0000000..473b4e3 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DashBoard/PerformedActivites.cs @@ -0,0 +1,15 @@ +namespace Marco.Pms.Model.ViewModels.DashBoard +{ + public class PerformedActivites + { + public string? BuldingName { get; set; } + public string? FloorName { get; set; } + public string? WorkAreaName { get; set; } + public string? ActivityName { get; set; } + public string? Comment { get; set; } + public double Pending { get; set; } + public double AssignedToday { get; set; } + public double CompletedToday { get; set; } + + } +} diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index 187e667..72ca31d 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -276,5 +276,86 @@ namespace Marco.Pms.Services.Controllers _logger.LogInfo($"Attendance record for project {projectId} for date {currentDate.Date} by employee {LoggedInEmployee.Id}"); return Ok(ApiResponse.SuccessResponse(projectAttendanceVM, $"Attendance record for project {project.Name} for date {currentDate.Date}", 200)); } + + + [HttpGet("activities/{projectId}")] + public async Task GetActivities(Guid projectId, [FromQuery] string? date) + { + Guid tenantId = _userHelper.GetTenantId(); + var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + DateTime currentDate = DateTime.UtcNow; + List? projectProgressionVMs = new List(); + if (date != null && DateTime.TryParse(date, out currentDate) == false) + { + _logger.LogError($"user send invalid date"); + return BadRequest(ApiResponse.ErrorResponse("Invalid date.", "Invalid date.", 400)); + + } + Project? project = await _context.Projects.FirstOrDefaultAsync(p => p.Id == projectId); + if (project == null) + { + _logger.LogError("Employee {EmployeeId} was attempted to get activities performed for date {Date}, but project not found in database", LoggedInEmployee.Id, currentDate); + return NotFound(ApiResponse.ErrorResponse("Project not found", "Project not found", 404)); + } + + var buildings = await _context.Buildings.Where(b => b.ProjectId == project.Id).ToListAsync(); + var buildingIds = buildings.Select(b => b.Id).Distinct().ToList(); + + var floors = await _context.Floor.Where(f => buildingIds.Contains(f.BuildingId)).ToListAsync(); + var floorIds = floors.Select(f => f.Id).Distinct().ToList(); + + var areas = await _context.WorkAreas.Where(a => floorIds.Contains(a.FloorId)).ToListAsync(); + var areaIds = areas.Select(a => a.Id).Distinct().ToList(); + + var workItems = await _context.WorkItems.Include(i => i.ActivityMaster).Where(i => areaIds.Contains(i.WorkAreaId)).ToListAsync(); + var itemIds = workItems.Select(i => i.Id).Distinct().ToList(); + + var tasks = await _context.TaskAllocations.Where(t => itemIds.Contains(t.WorkItemId) && t.AssignmentDate.Date == currentDate.Date).ToListAsync(); + double totalPlannedTask = 0; + double totalCompletedTask = 0; + List performedActivites = new List(); + + foreach (var task in tasks) + { + totalPlannedTask += task.PlannedTask; + totalCompletedTask += task.CompletedTask; + + WorkItem workItem = workItems.FirstOrDefault(i => i.Id == task.WorkItemId) ?? new WorkItem(); + string activityName = (workItem.ActivityMaster != null ? workItem.ActivityMaster.ActivityName : "") ?? ""; + + WorkArea workArea = areas.FirstOrDefault(a => a.Id == workItem.WorkAreaId) ?? new WorkArea(); + string areaName = workArea.AreaName ?? ""; + + Floor floor = floors.FirstOrDefault(f => f.Id == workArea.FloorId) ?? new Floor(); + string floorName = floor.FloorName ?? ""; + + Building building = buildings.FirstOrDefault(b => b.Id == floor.BuildingId) ?? new Building(); + string buildingName = building.Name ?? ""; + + double pending = workItem.PlannedWork - workItem.CompletedWork; + + PerformedActivites performedTask = new PerformedActivites + { + ActivityName = activityName, + BuldingName = buildingName, + FloorName = floorName, + WorkAreaName = areaName, + AssignedToday = task.PlannedTask, + Pending = pending, + CompletedToday = task.CompletedTask, + Comment = task.Description + }; + performedActivites.Add(performedTask); + } + ActivityReport report = new ActivityReport + { + PerformedActivites = performedActivites, + TotalCompletedWork = totalCompletedTask, + TotalPlannedWork = totalPlannedTask + }; + _logger.LogInfo($"Record of performed activities for project {projectId} for date {currentDate.Date} by employee {LoggedInEmployee.Id}"); + return Ok(ApiResponse.SuccessResponse(report, $"Record of performed activities for project {project.Name} for date {currentDate.Date}", 200)); + } } }