From 541ed28bd2eb807663581535547815e14e1c1605 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Wed, 1 Oct 2025 17:32:48 +0530 Subject: [PATCH] Added the new deashboard report of expenses --- .../Controllers/DashboardController.cs | 98 +++++++++++++++++-- 1 file changed, 91 insertions(+), 7 deletions(-) diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index b720eca..9c739fb 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -26,6 +26,13 @@ namespace Marco.Pms.Services.Controllers private readonly ILoggingService _logger; private readonly PermissionServices _permissionServices; 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) { _context = context; @@ -33,11 +40,11 @@ namespace Marco.Pms.Services.Controllers _projectServices = projectServices; _logger = logger; _permissionServices = permissionServices; + tenantId = userHelper.GetTenantId(); } [HttpGet("progression")] public async Task GetGraph([FromQuery] double days, [FromQuery] string FromDate, [FromQuery] Guid? projectId) { - var tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); DateTime fromDate = new DateTime(); @@ -149,7 +156,6 @@ namespace Marco.Pms.Services.Controllers [HttpGet("projects")] public async Task GetProjectCount() { - var tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); var projects = await _context.Projects.Where(p => p.TenantId == tenantId).ToListAsync(); @@ -176,7 +182,6 @@ namespace Marco.Pms.Services.Controllers { try { - var tenantId = _userHelper.GetTenantId(); var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); _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 { - var tenantId = _userHelper.GetTenantId(); var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); _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.ErrorResponse("An internal server error occurred.", null, 500)); } } + [HttpGet("pending-attendance")] public async Task GetPendingAttendance() { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); 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}")] public async Task GetProjectAttendance(Guid projectId, [FromQuery] string? date) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); DateTime currentDate = DateTime.UtcNow; @@ -428,7 +431,6 @@ namespace Marco.Pms.Services.Controllers [HttpGet("activities/{projectId}")] public async Task GetActivities(Guid projectId, [FromQuery] string? date) { - Guid tenantId = _userHelper.GetTenantId(); var LoggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); DateTime currentDate = DateTime.UtcNow; @@ -600,5 +602,87 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(sortedResult, $"{sortedResult.Count} records fetched for attendance overview", 200)); } + + [HttpGet("expense/project")] + public async Task 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.SuccessResponse(response, "Expense report by project fetched successfully", 200)); + } + [HttpGet("expense/type")] + public async Task 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.SuccessResponse(response, "Expense report by expense type fetched successfully", 200)); + } } }