Added the new deashboard report of expenses
This commit is contained in:
parent
0e1d20156f
commit
541ed28bd2
@ -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));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user