Added the new deashboard report of expenses

This commit is contained in:
ashutosh.nehete 2025-10-01 17:32:48 +05:30
parent 0e1d20156f
commit 541ed28bd2

View File

@ -26,6 +26,13 @@ namespace Marco.Pms.Services.Controllers
private readonly ILoggingService _logger; private readonly ILoggingService _logger;
private readonly PermissionServices _permissionServices; private readonly PermissionServices _permissionServices;
public static readonly Guid ActiveId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731"); public static readonly Guid ActiveId = Guid.Parse("b74da4c2-d07e-46f2-9919-e75e49b12731");
private static readonly Guid Draft = Guid.Parse("297e0d8f-f668-41b5-bfea-e03b354251c8");
private static readonly Guid ProcessPending = Guid.Parse("f18c5cfd-7815-4341-8da2-2c2d65778e27");
private static readonly Guid Processed = Guid.Parse("61578360-3a49-4c34-8604-7b35a3787b95");
private static readonly Guid RejectedByReviewer = Guid.Parse("965eda62-7907-4963-b4a1-657fb0b2724b");
private static readonly Guid RejectedByApprover = Guid.Parse("d1ee5eec-24b6-4364-8673-a8f859c60729");
private readonly Guid tenantId;
public DashboardController(ApplicationDbContext context, UserHelper userHelper, IProjectServices projectServices, ILoggingService logger, PermissionServices permissionServices) public DashboardController(ApplicationDbContext context, UserHelper userHelper, IProjectServices projectServices, ILoggingService logger, PermissionServices permissionServices)
{ {
_context = context; _context = context;
@ -33,11 +40,11 @@ namespace Marco.Pms.Services.Controllers
_projectServices = projectServices; _projectServices = projectServices;
_logger = logger; _logger = logger;
_permissionServices = permissionServices; _permissionServices = permissionServices;
tenantId = userHelper.GetTenantId();
} }
[HttpGet("progression")] [HttpGet("progression")]
public async Task<IActionResult> GetGraph([FromQuery] double days, [FromQuery] string FromDate, [FromQuery] Guid? projectId) public async Task<IActionResult> GetGraph([FromQuery] double days, [FromQuery] string FromDate, [FromQuery] Guid? projectId)
{ {
var tenantId = _userHelper.GetTenantId();
var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
DateTime fromDate = new DateTime(); DateTime fromDate = new DateTime();
@ -149,7 +156,6 @@ namespace Marco.Pms.Services.Controllers
[HttpGet("projects")] [HttpGet("projects")]
public async Task<IActionResult> GetProjectCount() public async Task<IActionResult> GetProjectCount()
{ {
var tenantId = _userHelper.GetTenantId();
var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var projects = await _context.Projects.Where(p => p.TenantId == tenantId).ToListAsync(); var projects = await _context.Projects.Where(p => p.TenantId == tenantId).ToListAsync();
@ -176,7 +182,6 @@ namespace Marco.Pms.Services.Controllers
{ {
try try
{ {
var tenantId = _userHelper.GetTenantId();
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
_logger.LogInfo("GetTotalEmployees called by user {UserId} for ProjectId: {ProjectId}", loggedInEmployee.Id, projectId ?? Guid.Empty); _logger.LogInfo("GetTotalEmployees called by user {UserId} for ProjectId: {ProjectId}", loggedInEmployee.Id, projectId ?? Guid.Empty);
@ -269,7 +274,6 @@ namespace Marco.Pms.Services.Controllers
{ {
try try
{ {
var tenantId = _userHelper.GetTenantId();
var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
_logger.LogInfo("GetTotalTasks called by user {UserId} for ProjectId: {ProjectId}", loggedInEmployee.Id, projectId ?? Guid.Empty); _logger.LogInfo("GetTotalTasks called by user {UserId} for ProjectId: {ProjectId}", loggedInEmployee.Id, projectId ?? Guid.Empty);
@ -348,10 +352,10 @@ namespace Marco.Pms.Services.Controllers
return StatusCode(500, ApiResponse<object>.ErrorResponse("An internal server error occurred.", null, 500)); return StatusCode(500, ApiResponse<object>.ErrorResponse("An internal server error occurred.", null, 500));
} }
} }
[HttpGet("pending-attendance")] [HttpGet("pending-attendance")]
public async Task<IActionResult> GetPendingAttendance() public async Task<IActionResult> GetPendingAttendance()
{ {
Guid tenantId = _userHelper.GetTenantId();
var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
var attendance = await _context.Attendes.Where(a => a.EmployeeId == LoggedInEmployee.Id && a.TenantId == tenantId).ToListAsync(); var attendance = await _context.Attendes.Where(a => a.EmployeeId == LoggedInEmployee.Id && a.TenantId == tenantId).ToListAsync();
@ -374,7 +378,6 @@ namespace Marco.Pms.Services.Controllers
[HttpGet("project-attendance/{projectId}")] [HttpGet("project-attendance/{projectId}")]
public async Task<IActionResult> GetProjectAttendance(Guid projectId, [FromQuery] string? date) public async Task<IActionResult> GetProjectAttendance(Guid projectId, [FromQuery] string? date)
{ {
Guid tenantId = _userHelper.GetTenantId();
var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
DateTime currentDate = DateTime.UtcNow; DateTime currentDate = DateTime.UtcNow;
@ -428,7 +431,6 @@ namespace Marco.Pms.Services.Controllers
[HttpGet("activities/{projectId}")] [HttpGet("activities/{projectId}")]
public async Task<IActionResult> GetActivities(Guid projectId, [FromQuery] string? date) public async Task<IActionResult> GetActivities(Guid projectId, [FromQuery] string? date)
{ {
Guid tenantId = _userHelper.GetTenantId();
var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync();
DateTime currentDate = DateTime.UtcNow; DateTime currentDate = DateTime.UtcNow;
@ -600,5 +602,87 @@ namespace Marco.Pms.Services.Controllers
return Ok(ApiResponse<object>.SuccessResponse(sortedResult, $"{sortedResult.Count} records fetched for attendance overview", 200)); return Ok(ApiResponse<object>.SuccessResponse(sortedResult, $"{sortedResult.Count} records fetched for attendance overview", 200));
} }
[HttpGet("expense/project")]
public async Task<IActionResult> GetExpenseReportByProjects([FromQuery] DateTime? startDate, [FromQuery] DateTime? endDate)
{
var expensesQuery = _context.Expenses
.Include(e => e.Project)
.Where(e => e.TenantId == tenantId && e.StatusId != Draft && e.Project != null);
if (startDate.HasValue && endDate.HasValue)
{
expensesQuery = expensesQuery.Where(e => e.TransactionDate.Date >= startDate.Value.Date && e.TransactionDate.Date <= endDate.Value.Date);
}
var expenses = await expensesQuery.GroupBy(e => e.Project).ToListAsync();
var report = expenses.Select(g =>
{
var totalAmount = g.Sum(e => e.Amount);
var totalPendingAmount = g.Where(e => e.StatusId != Processed && e.StatusId != RejectedByReviewer && e.StatusId != RejectedByApprover).Sum(e => e.Amount);
var totalRejectedAmount = g.Where(e => e.StatusId == RejectedByReviewer || e.StatusId == RejectedByApprover).Sum(e => e.Amount);
var totalProcessedAmount = g.Where(e => e.StatusId == Processed || e.StatusId == ProcessPending).Sum(e => e.Amount);
return new
{
ProjectName = g.Key!.Name,
TotalPendingAmount = totalPendingAmount,
TotalRejectedAmount = totalRejectedAmount,
TotalProcessedAmount = totalProcessedAmount,
TotalApprovedAmount = totalAmount
};
}).OrderBy(r => r.ProjectName).ToList();
var response = new
{
Report = report,
TotalAmount = report.Sum(r => r.TotalApprovedAmount)
};
return Ok(ApiResponse<object>.SuccessResponse(response, "Expense report by project fetched successfully", 200));
}
[HttpGet("expense/type")]
public async Task<IActionResult> GetExpenseReportByExpenseType([FromQuery] Guid? projectId, [FromQuery] DateTime? startDate, [FromQuery] DateTime? endDate)
{
var expensesQuery = _context.Expenses
.Include(e => e.Project)
.Where(e => e.TenantId == tenantId && e.StatusId != Draft && e.Project != null);
if (projectId.HasValue)
{
expensesQuery = expensesQuery.Where(e => e.ProjectId == projectId);
}
if (startDate.HasValue && endDate.HasValue)
{
expensesQuery = expensesQuery.Where(e => e.TransactionDate.Date >= startDate.Value.Date && e.TransactionDate.Date <= endDate.Value.Date);
}
var expenses = await expensesQuery.GroupBy(e => e.ExpensesType).ToListAsync();
var report = expenses.Select(g =>
{
var totalAmount = g.Sum(e => e.Amount);
var totalPendingAmount = g.Where(e => e.StatusId != Processed && e.StatusId != RejectedByReviewer && e.StatusId != RejectedByApprover).Sum(e => e.Amount);
var totalRejectedAmount = g.Where(e => e.StatusId == RejectedByReviewer || e.StatusId == RejectedByApprover).Sum(e => e.Amount);
var totalProcessedAmount = g.Where(e => e.StatusId == Processed || e.StatusId == ProcessPending).Sum(e => e.Amount);
return new
{
ProjectName = g.Key!.Name,
TotalPendingAmount = totalPendingAmount,
TotalRejectedAmount = totalRejectedAmount,
TotalProcessedAmount = totalProcessedAmount,
TotalApprovedAmount = totalAmount
};
}).OrderBy(r => r.ProjectName).ToList();
var response = new
{
Report = report,
TotalAmount = report.Sum(r => r.TotalApprovedAmount)
};
return Ok(ApiResponse<object>.SuccessResponse(response, "Expense report by expense type fetched successfully", 200));
}
} }
} }