diff --git a/Marco.Pms.Services/Controllers/DashboardController.cs b/Marco.Pms.Services/Controllers/DashboardController.cs index 9c739fb..f44cdfc 100644 --- a/Marco.Pms.Services/Controllers/DashboardController.cs +++ b/Marco.Pms.Services/Controllers/DashboardController.cs @@ -1,10 +1,13 @@ -using Marco.Pms.DataAccess.Data; +using AutoMapper; +using Marco.Pms.DataAccess.Data; using Marco.Pms.Model.Activities; using Marco.Pms.Model.Dtos.Attendance; using Marco.Pms.Model.Employees; +using Marco.Pms.Model.Entitlements; using Marco.Pms.Model.Projects; using Marco.Pms.Model.Utilities; using Marco.Pms.Model.ViewModels.DashBoard; +using Marco.Pms.Model.ViewModels.Expanses; using Marco.Pms.Services.Service; using Marco.Pms.Services.Service.ServiceInterfaces; using MarcoBMS.Services.Helpers; @@ -25,20 +28,29 @@ namespace Marco.Pms.Services.Controllers private readonly IProjectServices _projectServices; private readonly ILoggingService _logger; private readonly PermissionServices _permissionServices; + private readonly IServiceScopeFactory _serviceScopeFactory; 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 Review = Guid.Parse("6537018f-f4e9-4cb3-a210-6c3b2da999d7"); + private static readonly Guid Approve = Guid.Parse("4068007f-c92f-4f37-a907-bc15fe57d4d8"); 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, + IServiceScopeFactory serviceScopeFactory, + ILoggingService logger, + PermissionServices permissionServices) { _context = context; _userHelper = userHelper; _projectServices = projectServices; _logger = logger; + _serviceScopeFactory = serviceScopeFactory; _permissionServices = permissionServices; tenantId = userHelper.GetTenantId(); } @@ -608,7 +620,7 @@ namespace Marco.Pms.Services.Controllers { var expensesQuery = _context.Expenses .Include(e => e.Project) - .Where(e => e.TenantId == tenantId && e.StatusId != Draft && e.Project != null); + .Where(e => e.TenantId == tenantId && e.IsActive && e.StatusId != Draft && e.Project != null); if (startDate.HasValue && endDate.HasValue) { @@ -641,12 +653,13 @@ namespace Marco.Pms.Services.Controllers 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); + .Where(e => e.TenantId == tenantId && e.IsActive && e.StatusId != Draft && e.Project != null); if (projectId.HasValue) { @@ -684,5 +697,60 @@ namespace Marco.Pms.Services.Controllers return Ok(ApiResponse.SuccessResponse(response, "Expense report by expense type fetched successfully", 200)); } + + [HttpGet("expense/pendings")] + public async Task GetPendingExpenseListAsync() + { + var loggedInEmployee = await _userHelper.GetCurrentEmployeeAsync(); + + using var scope = _serviceScopeFactory.CreateScope(); + var _mapper = scope.ServiceProvider.GetRequiredService(); + + var hasReviewPermissionTask = Task.Run(async () => + { + var _permission = scope.ServiceProvider.GetRequiredService(); + return await _permission.HasPermission(PermissionsMaster.ExpenseReview, loggedInEmployee.Id); + }); + + var hasApprovePermissionTask = Task.Run(async () => + { + var _permission = scope.ServiceProvider.GetRequiredService(); + return await _permission.HasPermission(PermissionsMaster.ExpenseApprove, loggedInEmployee.Id); + }); + + var hasProcessPermissionTask = Task.Run(async () => + { + var _permission = scope.ServiceProvider.GetRequiredService(); + return await _permission.HasPermission(PermissionsMaster.ExpenseProcess, loggedInEmployee.Id); + }); + + await Task.WhenAll(hasReviewPermissionTask, hasApprovePermissionTask, hasProcessPermissionTask); + + var hasReviewPermission = hasReviewPermissionTask.Result; + var hasApprovePermission = hasApprovePermissionTask.Result; + var hasProcessPermission = hasProcessPermissionTask.Result; + + var expenses = await _context.Expenses + .Include(e => e.PaidBy) + .Include(e => e.CreatedBy) + .Include(e => e.ProcessedBy) + .Include(e => e.ApprovedBy) + .Include(e => e.ReviewedBy) + .Include(e => e.PaymentMode) + .Include(e => e.Project) + .Include(e => e.PaymentMode) + .Include(e => e.ExpensesType) + .Include(e => e.Status) + .Where(e => e.IsActive && e.TenantId == tenantId && + e.StatusId == Draft || + (hasReviewPermission && e.StatusId == Review) || + (hasApprovePermission && e.StatusId == Approve) || + (hasProcessPermission && e.StatusId == ProcessPending) + ).ToListAsync(); + + var response = _mapper.Map>(expenses); + + return Ok(ApiResponse.SuccessResponse(new { }, "Pending Expenses fetched successfully", 200)); + } } }