Implemented an API endpoint that retrieves the attendance records for a specific project on a given date #71
12
Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs
Normal file
12
Marco.Pms.Model/ViewModels/DashBoard/EmployeeAttendanceVM.cs
Normal file
@ -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; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
namespace Marco.Pms.Model.ViewModels.DashBoard
|
||||||
|
{
|
||||||
|
public class ProjectAttendanceVM
|
||||||
|
{
|
||||||
|
public List<EmployeeAttendanceVM>? AttendanceTable { get; set; }
|
||||||
|
public int CheckedInEmployee { get; set; }
|
||||||
|
public int AssignedEmployee { get; set; }
|
||||||
|
}
|
||||||
|
}
|
@ -1,6 +1,7 @@
|
|||||||
using Marco.Pms.DataAccess.Data;
|
using Marco.Pms.DataAccess.Data;
|
||||||
using Marco.Pms.Model.Activities;
|
using Marco.Pms.Model.Activities;
|
||||||
using Marco.Pms.Model.Dtos.Attendance;
|
using Marco.Pms.Model.Dtos.Attendance;
|
||||||
|
using Marco.Pms.Model.Employees;
|
||||||
using Marco.Pms.Model.Projects;
|
using Marco.Pms.Model.Projects;
|
||||||
using Marco.Pms.Model.Utilities;
|
using Marco.Pms.Model.Utilities;
|
||||||
using Marco.Pms.Model.ViewModels.DashBoard;
|
using Marco.Pms.Model.ViewModels.DashBoard;
|
||||||
@ -222,6 +223,58 @@ namespace Marco.Pms.Services.Controllers
|
|||||||
return NotFound(ApiResponse<object>.ErrorResponse("No attendance entry was found for this employee", "No attendance entry was found for this employee", 404));
|
return NotFound(ApiResponse<object>.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<IActionResult> GetProjectAttendance(Guid projectId, [FromQuery] string? date)
|
||||||
|
{
|
||||||
|
Guid tenantId = _userHelper.GetTenantId();
|
||||||
|
var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
|
||||||
|
|
||||||
|
DateTime currentDate = DateTime.UtcNow;
|
||||||
|
List<ProjectProgressionVM>? projectProgressionVMs = new List<ProjectProgressionVM>();
|
||||||
|
if (date != null && DateTime.TryParse(date, out currentDate) == false)
|
||||||
|
{
|
||||||
|
_logger.LogError($"user send invalid date");
|
||||||
|
return BadRequest(ApiResponse<object>.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<object>.ErrorResponse("Project not found", "Project not found", 404));
|
||||||
|
}
|
||||||
|
List<ProjectAllocation>? 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<Employee>? 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<EmployeeAttendanceVM> employeeAttendanceVMs = new List<EmployeeAttendanceVM>();
|
||||||
|
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<object>.SuccessResponse(projectAttendanceVM, $"Attendance record for project {project.Name} for date {currentDate.Date}", 200));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user