using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using TaskTrackingSystem.Shared; using TaskTrackingSystem.Shared.Enums; using TaskTrackingSystem.Shared.Models.Report; using TaskTrackingSystem.Shared.Models.Issue; using TaskTrackingSystem.WebApi.Infrastructure; namespace TaskTrackingSystem.WebApi.Features.Report { [Route("api/[controller]")] [ApiController] [Authorize] public class ReportController : ControllerBase { private readonly ReportService _reportService; public ReportController(ReportService reportService) { _reportService = reportService; } [HttpGet("issues")] [ProducesResponseType(typeof(List), StatusCodes.Status200OK)] public async Task>>> GetIssuesReport() { var result = await _reportService.GetIssuesReportAsync(User.GetRoleId(), User.GetUserId()); return StatusCode(result.StatusCode, result); } [HttpGet("tasks")] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task>> GetTasksReport( [FromQuery] DateTime? startDate, [FromQuery] DateTime? endDate, [FromQuery] string? status, [FromQuery] int? projectId, [FromQuery] bool? assignedToMe, [FromQuery] bool? assignedToMyTeam, [FromQuery] PaginationQuery? paging = null) { if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { var full = await _reportService.GetTasksReportAsync( startDate, endDate, status, projectId, User.GetRoleId(), User.GetUserId(), assignedToMe, assignedToMyTeam); return StatusCode(full.StatusCode, full); } var page = PaginationExtensions.NormalizePage(paging.Page); var limit = PaginationExtensions.NormalizePageSize(paging.Limit ?? 0); var result = await _reportService.GetPagedTasksReportAsync( startDate, endDate, status, projectId, User.GetRoleId(), User.GetUserId(), page, limit, assignedToMe, assignedToMyTeam); return Ok(result); } [HttpGet("user-productivity")] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task>> GetUserProductivityReport( [FromQuery] PaginationQuery? paging = null) { var users = await _reportService.GetUserProductivityReportAsync(User.GetRoleId(), User.GetUserId()); if (!users.IsSuccess || users.Value == null) { return StatusCode(users.StatusCode, new PagedResult()); } if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { return StatusCode(users.StatusCode, users); } var page = PaginationExtensions.NormalizePage(paging?.Page); var limit = PaginationExtensions.NormalizePageSize(paging?.Limit ?? 0); var query = users.Value.AsQueryable(); var paged = await query.ToPagedResultAsync(page, limit); return Ok(paged); } [HttpGet("task-status-summary")] public async Task>>> GetTaskStatusSummary( [FromQuery] string? search, [FromQuery] AppTaskStatus? statusId, [FromQuery] long? projectId) { var result = await _reportService.GetTaskStatusSummaryAsync(search, statusId, projectId, User.GetRoleId(), User.GetUserId()); return StatusCode(result.StatusCode, result); } [HttpGet("task-status-summary/excel")] public async Task DownloadTaskStatusSummaryExcel( [FromQuery] string? search, [FromQuery] AppTaskStatus? statusId, [FromQuery] long? projectId) { var result = await _reportService.GetTaskStatusSummaryAsync(search, statusId, projectId, User.GetRoleId(), User.GetUserId()); if (!result.IsSuccess || result.Value == null) return BadRequest(new { message = result.ErrorMessage }); var bytes = _reportService.ExportTaskStatusSummaryToExcel(result.Value); return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"TaskStatusSummary_{DateTime.Today:yyyyMMdd}.xlsx"); } [HttpGet("team-productivity")] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task>> GetTeamProductivity( [FromQuery] string? search, [FromQuery] PaginationQuery? paging = null) { if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { var full = await _reportService.GetTeamProductivityAsync(search, User.GetRoleId(), User.GetUserId()); return StatusCode(full.StatusCode, full); } var page = PaginationExtensions.NormalizePage(paging?.Page); var limit = PaginationExtensions.NormalizePageSize(paging?.Limit ?? 0); var result = await _reportService.GetPagedTeamProductivityAsync(search, User.GetRoleId(), User.GetUserId(), page, limit); return Ok(result); } [HttpGet("team-productivity/excel")] public async Task DownloadTeamProductivityExcel([FromQuery] string? search) { var result = await _reportService.GetTeamProductivityAsync(search, User.GetRoleId(), User.GetUserId()); if (!result.IsSuccess || result.Value == null) return BadRequest(new { message = result.ErrorMessage }); var bytes = _reportService.ExportTeamProductivityToExcel(result.Value); return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"TeamProductivity_{DateTime.Today:yyyyMMdd}.xlsx"); } [HttpGet("overdue-critical")] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task>> GetOverdueCritical( [FromQuery] string? search, [FromQuery] long? projectId, [FromQuery] int? priorityId, [FromQuery] string? delayType, [FromQuery] bool? assignedToMe, [FromQuery] bool? assignedToMyTeam, [FromQuery] PaginationQuery? paging = null) { if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { var full = await _reportService.GetOverdueCriticalTasksAsync( search, projectId, User.GetRoleId(), User.GetUserId(), priorityId, delayType, assignedToMe, assignedToMyTeam); return StatusCode(full.StatusCode, full); } var page = PaginationExtensions.NormalizePage(paging?.Page); var limit = PaginationExtensions.NormalizePageSize(paging?.Limit ?? 0); var result = await _reportService.GetPagedOverdueCriticalTasksAsync( search, projectId, User.GetRoleId(), User.GetUserId(), page, limit, priorityId, delayType, assignedToMe, assignedToMyTeam); return Ok(result); } [HttpGet("overdue-critical/excel")] public async Task DownloadOverdueCriticalExcel( [FromQuery] string? search, [FromQuery] long? projectId, [FromQuery] bool? assignedToMe, [FromQuery] bool? assignedToMyTeam) { var result = await _reportService.GetOverdueCriticalTasksAsync( search, projectId, User.GetRoleId(), User.GetUserId(), assignedToMe: assignedToMe, assignedToMyTeam: assignedToMyTeam); if (!result.IsSuccess || result.Value == null) return BadRequest(new { message = result.ErrorMessage }); var bytes = _reportService.ExportOverdueCriticalToExcel(result.Value); return File(bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"OverdueCriticalTasks_{DateTime.Today:yyyyMMdd}.xlsx"); } [HttpGet("employee-productivity")] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task>> GetEmployeeProductivity( [FromQuery] string? search, [FromQuery] DateTime? startDate, [FromQuery] DateTime? endDate, [FromQuery] string? status, [FromQuery] bool? assignedToMe, [FromQuery] bool? assignedToMyTeam, [FromQuery] PaginationQuery? paging = null) { if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { var reportData = await _reportService.GetEmployeeProductivityReportAsync( search, startDate, endDate, status, User.GetRoleId(), User.GetUserId(), assignedToMe, assignedToMyTeam); return StatusCode(reportData.StatusCode, reportData); } var reportDataPaged = await _reportService.GetPagedEmployeeProductivityReportAsync( search, startDate, endDate, status, User.GetRoleId(), User.GetUserId(), paging.Page ?? 1, paging.Limit ?? 10, assignedToMe, assignedToMyTeam); return Ok(reportDataPaged); } [HttpGet("project-progress")] [ProducesResponseType(typeof(PagedResult), StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] public async Task>> GetProjectProgress( [FromQuery] string? search, [FromQuery] DateTime? startDate, [FromQuery] DateTime? endDate, [FromQuery] string? status, [FromQuery] bool? assignedToMe, [FromQuery] bool? assignedToMyTeam, [FromQuery] PaginationQuery? paging = null) { if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue)) { var reportData = await _reportService.GetProjectProgressReportAsync( search, startDate, endDate, status, User.GetRoleId(), User.GetUserId(), assignedToMe, assignedToMyTeam); return StatusCode(reportData.StatusCode, reportData); } var reportDataPaged = await _reportService.GetPagedProjectProgressReportAsync( search, startDate, endDate, status, User.GetRoleId(), User.GetUserId(), paging.Page ?? 1, paging.Limit ?? 10, assignedToMe, assignedToMyTeam); return Ok(reportDataPaged); } } }