From 6d6a2b60152436564d707f575be554fbde618d1c Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 6 May 2025 10:08:57 +0530 Subject: [PATCH 1/3] Implemented an API endpoint that allows the system to record attendance entries (e.g., check-in and check-out) for a specific employee. This helps track employee working hours, presence, and status. --- .../Controllers/AttendanceController.cs | 50 ++++++++++++++++--- 1 file changed, 42 insertions(+), 8 deletions(-) diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index b6c0e09..9b4fed1 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -67,22 +67,56 @@ namespace MarcoBMS.Services.Controllers return Ok(ApiResponse.SuccessResponse(attendanceLogVMs, System.String.Format("{0} Attendance records fetched successfully", lstAttendance.Count), 200)); } - [HttpGet("log/employee/{employeeid}")] + [HttpGet("log/employee/{employeeId}")] - public async Task GetAttendanceLogByEmployeeId(Guid employeeid, [FromQuery] string? date = null) + public async Task GetAttendanceLogByEmployeeId(Guid employeeId, [FromQuery] string? dateFrom = null, [FromQuery] string? dateTo = null) { Guid TenantId = GetTenantId(); - DateOnly forDate = new DateOnly(); + DateTime fromDate = new DateTime(); + DateTime toDate = new DateTime(); - if (date != null && DateOnly.TryParse(date, out forDate) == false) + if (dateFrom != null && DateTime.TryParse(dateFrom, out fromDate) == false) { + _logger.LogError("User sent Invalid from Date while featching attendance logs"); + return BadRequest(ApiResponse.ErrorResponse("Invalid Date", "Invalid Date", 400)); + } + if (dateTo != null && DateTime.TryParse(dateTo, out toDate) == false) + { + _logger.LogError("User sent Invalid to Date while featching attendance logs"); return BadRequest(ApiResponse.ErrorResponse("Invalid Date", "Invalid Date", 400)); - } - List lstAttendance = await _context.AttendanceLogs.Where(c => c.EmployeeID == employeeid && c.TenantId == TenantId).ToListAsync(); - _logger.LogInfo("{count} Attendance records fetched successfully", lstAttendance.Count); - return Ok(ApiResponse.SuccessResponse(lstAttendance, System.String.Format("{0} Attendance records fetched successfully", lstAttendance.Count), 200)); + if (employeeId == Guid.Empty) + { + _logger.LogError("The employee Id sent by user is empty"); + return BadRequest(ApiResponse.ErrorResponse("Employee ID is required and must not be Empty.", "Employee ID is required and must not be empty.", 400)); + } + List attendances = await _context.Attendes.Where(c => c.EmployeeID == employeeId && c.TenantId == TenantId).ToListAsync(); + Employee? employee = await _context.Employees.Include(e => e.JobRole).FirstOrDefaultAsync(e => e.Id == employeeId && e.TenantId == TenantId && e.IsActive); + List results = new List(); + + if (employee != null) + { + foreach (var attendance in attendances) + { + EmployeeAttendanceVM result = new EmployeeAttendanceVM + { + Id = attendance.Id, + EmployeeId = employee.Id, + FirstName = employee.FirstName, + LastName = employee.LastName, + CheckInTime = attendance.InTime, + CheckOutTime = attendance.OutTime, + JobRoleName = employee.JobRole != null ? employee.JobRole.Name : "", + Activity = attendance.Activity, + EmployeeAvatar = null + }; + results.Add(result); + } + } + + _logger.LogInfo("{count} Attendance records fetched successfully", results.Count); + return Ok(ApiResponse.SuccessResponse(results, System.String.Format("{0} Attendance records fetched successfully", results.Count), 200)); } From b059a733bb0958247eed36c31fe141a10681d37f Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 6 May 2025 12:42:29 +0530 Subject: [PATCH 2/3] Send "role name" property in project/log api --- .../Controllers/AttendanceController.cs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 9b4fed1..5ef92d0 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -164,6 +164,7 @@ namespace MarcoBMS.Services.Controllers List projectteam = await _projectsHelper.GetTeamByProject(TenantId, projectId, true); + var jobRole = await _context.JobRoles.ToListAsync(); foreach (Attendance? attendance in lstAttendance) { var result1 = new EmployeeAttendanceVM() @@ -178,8 +179,18 @@ namespace MarcoBMS.Services.Controllers { result1.EmployeeAvatar = null; result1.EmployeeId = teamMember.EmployeeId; - result1.FirstName = teamMember.Employee != null ? teamMember.Employee.FirstName : null; - result1.LastName = teamMember.Employee != null ? teamMember.Employee.LastName : null; + if (teamMember.Employee != null) + { + result1.FirstName = teamMember.Employee.FirstName; + result1.LastName = teamMember.Employee.LastName; + result1.JobRoleName = teamMember.Employee.JobRole != null ? teamMember.Employee.JobRole.Name : null; + } + else + { + result1.FirstName = null; + result1.LastName = null; + result1.JobRoleName = null; + } result.Add(result1); } From 68c5021085a07fb3caa28975eb2aeceb11545286 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Tue, 6 May 2025 17:38:51 +0530 Subject: [PATCH 3/3] Added condition to only fetch attendance record between dateFrom and dateTo --- Marco.Pms.Services/Controllers/AttendanceController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Marco.Pms.Services/Controllers/AttendanceController.cs b/Marco.Pms.Services/Controllers/AttendanceController.cs index 5ef92d0..baa7ce7 100644 --- a/Marco.Pms.Services/Controllers/AttendanceController.cs +++ b/Marco.Pms.Services/Controllers/AttendanceController.cs @@ -91,7 +91,7 @@ namespace MarcoBMS.Services.Controllers _logger.LogError("The employee Id sent by user is empty"); return BadRequest(ApiResponse.ErrorResponse("Employee ID is required and must not be Empty.", "Employee ID is required and must not be empty.", 400)); } - List attendances = await _context.Attendes.Where(c => c.EmployeeID == employeeId && c.TenantId == TenantId).ToListAsync(); + List attendances = await _context.Attendes.Where(c => c.EmployeeID == employeeId && c.TenantId == TenantId && c.AttendanceDate.Date >= fromDate && c.AttendanceDate.Date <= toDate).ToListAsync(); Employee? employee = await _context.Employees.Include(e => e.JobRole).FirstOrDefaultAsync(e => e.Id == employeeId && e.TenantId == TenantId && e.IsActive); List results = new List();