diff --git a/Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs b/Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs new file mode 100644 index 0000000..32a5097 --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs @@ -0,0 +1,12 @@ +namespace Marco.Pms.Model.ViewModels.DashBoard +{ + public class EmployeeAttendanceVM + { + public string? FirstName { get; set; } + public string? LastName { get; set; } + public string? MiddleName { get; set; } + public string? Comment { get; set; } + public DateTime InTime { get; set; } + public DateTime OutTime { get; set; } + } +} diff --git a/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceVM.cs b/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceVM.cs new file mode 100644 index 0000000..12d61ec --- /dev/null +++ b/Marco.Pms.Model/ViewModels/DashBoard/ProjectAttendanceVM.cs @@ -0,0 +1,9 @@ +namespace Marco.Pms.Model.ViewModels.DashBoard +{ + public class ProjectAttendanceVM + { + public List? AttendanceTable { get; set; } + public int CheckedInEmployee { get; set; } + public int AssignedEmployee { get; set; } + } +} diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index e1c6014..187e667 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1,6 +1,7 @@ using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Activities; using Marco.Pms.Model.Dtos.Attendance; +using Marco.Pms.Model.Employees; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.DashBoard; @@ -222,6 +223,58 @@ namespace Marco.Pms.Services.Controllers return NotFound(ApiResponse.ErrorResponse("No attendance entry was found for this employee", "No attendance entry was found for this employee", 404)); } + [HttpGet("project-attdendance/{projectId}")] + public async Task GetProjectAttendance(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 project attendance for date {Date}, but project not found in database", LoggedInEmployee.Id, currentDate); + return NotFound(ApiResponse.ErrorResponse("Project not found", "Project not found", 404)); + } + List? projectAllocation = await _context.ProjectAllocations.Where(p => p.ProjectId == projectId && p.IsActive && p.TenantId == tenantId).ToListAsync(); + var employeeIds = projectAllocation.Select(p => p.EmployeeId).Distinct().ToList(); + List? employees = await _context.Employees.Where(e => employeeIds.Contains(e.Id)).ToListAsync(); + + var attendances = await _context.Attendes.Where(a => employeeIds.Contains(a.EmployeeID) && a.ProjectID == projectId && a.InTime.HasValue && a.InTime.Value.Date == currentDate.Date).ToListAsync(); + List employeeAttendanceVMs = new List(); + foreach (var attendance in attendances) + { + + Employee? employee = employees.FirstOrDefault(e => e.Id == attendance.EmployeeID); + if (employee != null) + { + EmployeeAttendanceVM employeeAttendanceVM = new EmployeeAttendanceVM + { + FirstName = employee.FirstName, + LastName = employee.LastName, + MiddleName = employee.MiddleName, + Comment = attendance.Comment, + InTime = attendance.InTime ?? DateTime.UtcNow, + OutTime = attendance.OutTime ?? DateTime.UtcNow + }; + + employeeAttendanceVMs.Add(employeeAttendanceVM); + } + } + ProjectAttendanceVM projectAttendanceVM = new ProjectAttendanceVM(); + projectAttendanceVM.AttendanceTable = employeeAttendanceVMs; + projectAttendanceVM.CheckedInEmployee = attendances.Count; + projectAttendanceVM.AssignedEmployee = employeeIds.Count; + + _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)); + } } }