Merge pull request 'Implemented an API endpoint that retrieves the attendance records for a specific project on a given date' (#71) from Ashutosh_Task#347_Project_Attendance_Report into Issue_May_4W
Reviewed-on: #71
This commit is contained in:
commit
52ee06d47e
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.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<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