Modyfied the attendance report API

This commit is contained in:
ashutosh.nehete 2025-10-01 15:09:51 +05:30
parent 8ddb414e91
commit eb3a65428e

View File

@ -449,7 +449,7 @@ namespace Marco.Pms.Services.Controllers
} }
[HttpGet("report-attendance")] [HttpGet("report-attendance")]
public async Task<IActionResult> GetAttendanceReportAsync() public async Task<IActionResult> GetAttendanceReportAsync([FromQuery] bool isCurrentMonth = false)
{ {
Guid tenantId = _userHelper.GetTenantId(); Guid tenantId = _userHelper.GetTenantId();
using var scope = _serviceScopeFactory.CreateScope(); using var scope = _serviceScopeFactory.CreateScope();
@ -458,32 +458,54 @@ namespace Marco.Pms.Services.Controllers
DateTime firstDayOfMonth = new DateTime(today.Year, today.Month, 1); DateTime firstDayOfMonth = new DateTime(today.Year, today.Month, 1);
DateTime firstDayOfNextMonth = firstDayOfMonth.AddMonths(1); DateTime firstDayOfNextMonth = firstDayOfMonth.AddMonths(1);
if (!isCurrentMonth)
{
firstDayOfNextMonth = firstDayOfMonth;
firstDayOfMonth = firstDayOfMonth.AddMonths(-1);
}
// Generate list of all dates in the month // Generate list of all dates in the month
var allDates = Enumerable.Range(0, (firstDayOfNextMonth - firstDayOfMonth).Days) var allDates = Enumerable.Range(0, (firstDayOfNextMonth - firstDayOfMonth).Days)
.Select(offset => firstDayOfMonth.AddDays(offset)) .Select(offset => firstDayOfMonth.AddDays(offset))
.ToList(); .ToList();
var attendances = await _context.Attendes var attendancesTask = Task.Run(async () =>
.Include(a => a.Employee) {
await using var context = await _dbContextFactory.CreateDbContextAsync();
return await context.Attendes
.Where(a => a.AttendanceDate >= firstDayOfMonth && a.AttendanceDate < firstDayOfNextMonth && a.Employee != null && a.TenantId == tenantId) .Where(a => a.AttendanceDate >= firstDayOfMonth && a.AttendanceDate < firstDayOfNextMonth && a.Employee != null && a.TenantId == tenantId)
.GroupBy(a => a.ProjectID) .GroupBy(a => a.ProjectID)
.ToListAsync(); .ToListAsync();
});
var projectAllocationTask = Task.Run(async () =>
{
await using var context = await _dbContextFactory.CreateDbContextAsync();
return await context.ProjectAllocations
.Include(pa => pa.Employee)
.Where(pa => pa.TenantId == tenantId && pa.IsActive)
.ToListAsync();
});
await Task.WhenAll(attendancesTask, projectAllocationTask);
var attendances = attendancesTask.Result;
var projectAllocations = projectAllocationTask.Result;
var result = attendances.Select(g => var result = attendances.Select(g =>
{ {
var projectAllocation = projectAllocations.Where(pa => pa.ProjectId == g.Key && pa.Employee != null).ToList();
var projectAttendance = projectAllocation.Select(pa =>
{
var attendances = g.Where(a => a.EmployeeId == pa.EmployeeId).ToList();
var attendanceDate = attendances.Select(a => a.AttendanceDate.Date).ToList();
return new return new
{ {
ProjectName = _context.Projects.Where(p => p.Id == g.Key && p.TenantId == tenantId).Select(p => p.Name).FirstOrDefault(), FirstName = pa.Employee!.FirstName,
ProjectAttendance = g.GroupBy(a => a.Employee).Select(gp => LastName = pa.Employee.LastName,
{
var attendanceDate = gp.Select(a => a.AttendanceDate.Date).ToList();
return new
{
FirstName = gp.Key!.FirstName,
LastName = gp.Key.LastName,
Attendances = allDates.Select(d => Attendances = allDates.Select(d =>
{ {
var attendance = gp.FirstOrDefault(a => a.AttendanceDate.Date == d); var attendance = attendances.FirstOrDefault(a => a.AttendanceDate.Date == d);
return new return new
{ {
AttendanceDate = d, AttendanceDate = d,
@ -493,13 +515,18 @@ namespace Marco.Pms.Services.Controllers
IsApproved = attendance?.ApprovedById.HasValue, IsApproved = attendance?.ApprovedById.HasValue,
}; };
}).ToList(), }).ToList(),
CheckInCheckOutDone = gp.Where(a => a.InTime.HasValue && a.OutTime.HasValue && a.Activity == ATTENDANCE_MARK_TYPE.REGULARIZE).Count(), CheckInCheckOutDone = attendances.Where(a => a.InTime.HasValue && a.OutTime.HasValue && a.Activity == ATTENDANCE_MARK_TYPE.REGULARIZE).Count(),
CheckInDone = gp.Where(a => a.InTime.HasValue).Count(), CheckInDone = attendances.Where(a => a.InTime.HasValue).Count(),
CheckOutPending = gp.Where(a => a.InTime.HasValue && !a.OutTime.HasValue).Count(), CheckOutPending = attendances.Where(a => a.InTime.HasValue && !a.OutTime.HasValue).Count(),
RejectedRegularize = gp.Where(a => a.Activity == ATTENDANCE_MARK_TYPE.REGULARIZE_REJECT).Count(), RejectedRegularize = attendances.Where(a => a.Activity == ATTENDANCE_MARK_TYPE.REGULARIZE_REJECT).Count(),
AbsentAttendance = allDates.Where(d => !attendanceDate.Contains(d) && d.DayOfWeek != DayOfWeek.Sunday).Count() AbsentAttendance = allDates.Where(d => !attendanceDate.Contains(d) && d.DayOfWeek != DayOfWeek.Sunday).Count()
}; };
}).OrderBy(ar => ar.FirstName).ThenBy(ar => ar.LastName).ToList() }).OrderBy(ar => ar.FirstName).ThenBy(ar => ar.LastName).ToList();
return new
{
ProjectName = _context.Projects.Where(p => p.Id == g.Key && p.TenantId == tenantId).Select(p => p.Name).FirstOrDefault(),
ProjectAttendance = projectAttendance
}; };
}).ToList(); }).ToList();