From 809d64e29656875b009e75df84f97d6dda802f34 Mon Sep 17 00:00:00 2001 From: "ashutosh.nehete" Date: Thu, 24 Jul 2025 16:03:23 +0530 Subject: [PATCH] Added permission IDs in expesne status master View model --- .../Master/ExpensesStatusMasterVM.cs | 1 + Marco.Pms.Services/Service/ExpensesService.cs | 88 ++++++++++++++----- 2 files changed, 68 insertions(+), 21 deletions(-) diff --git a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs index 73a6487..8f6f02a 100644 --- a/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs +++ b/Marco.Pms.Model/ViewModels/Master/ExpensesStatusMasterVM.cs @@ -6,6 +6,7 @@ public string Name { get; set; } = string.Empty; public string DisplayName { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; + public List? PermissionIds { get; set; } public string? Color { get; set; } public bool IsSystem { get; set; } = false; } diff --git a/Marco.Pms.Services/Service/ExpensesService.cs b/Marco.Pms.Services/Service/ExpensesService.cs index ce77f08..416ecc3 100644 --- a/Marco.Pms.Services/Service/ExpensesService.cs +++ b/Marco.Pms.Services/Service/ExpensesService.cs @@ -181,13 +181,13 @@ namespace Marco.Pms.Services.Service return ApiResponse.SuccessResponse(new List(), "No expenses found for the given criteria.", 200); } - expenseVM = await GetAllExpnesRelatedTables(expensesList); + expenseVM = await GetAllExpnesRelatedTables(expensesList, tenantId); totalPages = (int)Math.Ceiling((double)totalEntites / pageSize); } else { - expenseVM = await GetAllExpnesRelatedTables(_mapper.Map>(expenseList)); + expenseVM = await GetAllExpnesRelatedTables(_mapper.Map>(expenseList), tenantId); totalEntites = (int)totalCount; } // 7. --- Return Final Success Response --- @@ -249,7 +249,7 @@ namespace Marco.Pms.Services.Service return ApiResponse.ErrorResponse("Expense Not Found", "Expense Not Found", 404); } } - var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails); + var vm = await GetAllExpnesRelatedTablesFromMongoDB(expenseDetails, tenantId); _logger.LogInfo("Employee {EmployeeId} successfully fetched expense details with ID {ExpenseId}", loggedInEmployee.Id, vm.Id); return ApiResponse.SuccessResponse(vm, "Successfully fetched the details of expense", 200); @@ -991,7 +991,7 @@ namespace Marco.Pms.Services.Service #region =================================================================== Helper Functions =================================================================== - private async Task> GetAllExpnesRelatedTables(List model) + private async Task> GetAllExpnesRelatedTables(List model, Guid tenantId) { List expenseList = new List(); var projectIds = model.Select(m => m.ProjectId).ToList(); @@ -1004,27 +1004,27 @@ namespace Marco.Pms.Services.Service var projectTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id)).ToListAsync(); + return await dbContext.Projects.AsNoTracking().Where(p => projectIds.Contains(p.Id) && p.TenantId == tenantId).ToListAsync(); }); var paidByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id)).ToListAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => paidByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); }); var createdByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id)).ToListAsync(); + return await dbContext.Employees.AsNoTracking().Where(e => createdByIds.Contains(e.Id) && e.TenantId == tenantId).ToListAsync(); }); var expenseTypeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id)).ToListAsync(); + return await dbContext.ExpensesTypeMaster.AsNoTracking().Where(et => expensesTypeIds.Contains(et.Id) && et.TenantId == tenantId).ToListAsync(); }); var paymentModeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id)).ToListAsync(); + return await dbContext.PaymentModeMatser.AsNoTracking().Where(pm => paymentModeIds.Contains(pm.Id) && pm.TenantId == tenantId).ToListAsync(); }); var statusMappingTask = Task.Run(async () => { @@ -1033,7 +1033,7 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => statusIds.Contains(es.StatusId) && es.Status != null) + .Where(es => statusIds.Contains(es.StatusId) && es.Status != null && es.TenantId == tenantId) .GroupBy(s => s.StatusId) .Select(g => new { @@ -1047,17 +1047,30 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMaster .AsNoTracking() - .Where(es => statusIds.Contains(es.Id)) + .Where(es => statusIds.Contains(es.Id) && es.TenantId == tenantId) .ToListAsync(); }); + var permissionStatusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping + .Where(ps => ps.TenantId == tenantId) + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + }); // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask, permissionStatusMappingTask); var projects = projectTask.Result; var expenseTypes = expenseTypeTask.Result; var paymentModes = paymentModeTask.Result; var statusMappings = statusMappingTask.Result; + var permissionStatusMappings = permissionStatusMappingTask.Result; var paidBys = paidByTask.Result; var createdBys = createdByTask.Result; @@ -1074,7 +1087,18 @@ namespace Marco.Pms.Services.Service var status = statusTask.Result; response.Status = status.Where(s => s.Id == m.StatusId).Select(s => _mapper.Map(s)).FirstOrDefault(); } + if (response.Status != null) + { + response.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == m.StatusId).Select(ps => ps.PermissionIds).FirstOrDefault(); + } response.NextStatus = statusMappings.Where(s => s.StatusId == m.StatusId).Select(s => _mapper.Map>(s.NextStatus)).FirstOrDefault(); + if (response.NextStatus != null) + { + foreach (var status in response.NextStatus) + { + status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + } response.PaymentMode = paymentModes.Where(pm => pm.Id == m.PaymentModeId).Select(pm => _mapper.Map(pm)).FirstOrDefault(); response.ExpensesType = expenseTypes.Where(et => et.Id == m.ExpensesTypeId).Select(et => _mapper.Map(et)).FirstOrDefault(); @@ -1083,32 +1107,32 @@ namespace Marco.Pms.Services.Service return expenseList; } - private async Task GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model) + private async Task GetAllExpnesRelatedTablesFromMongoDB(ExpenseDetailsMongoDB model, Guid tenantId) { var projectTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == Guid.Parse(model.ProjectId)); + return await dbContext.Projects.AsNoTracking().FirstOrDefaultAsync(p => p.Id == Guid.Parse(model.ProjectId) && p.TenantId == tenantId); }); var paidByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById)); + return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.PaidById) && e.TenantId == tenantId); }); var createdByTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById)); + return await dbContext.Employees.AsNoTracking().FirstOrDefaultAsync(e => e.Id == Guid.Parse(model.CreatedById) && e.TenantId == tenantId); }); var expenseTypeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == Guid.Parse(model.ExpensesTypeId)); + return await dbContext.ExpensesTypeMaster.AsNoTracking().FirstOrDefaultAsync(et => et.Id == Guid.Parse(model.ExpensesTypeId) && et.TenantId == tenantId); }); var paymentModeTask = Task.Run(async () => { await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); - return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == Guid.Parse(model.PaymentModeId)); + return await dbContext.PaymentModeMatser.AsNoTracking().FirstOrDefaultAsync(pm => pm.Id == Guid.Parse(model.PaymentModeId) && pm.TenantId == tenantId); }); var statusMappingTask = Task.Run(async () => { @@ -1117,7 +1141,7 @@ namespace Marco.Pms.Services.Service .Include(s => s.Status) .Include(s => s.NextStatus) .AsNoTracking() - .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null) + .Where(es => es.StatusId == Guid.Parse(model.StatusId) && es.Status != null && es.TenantId == tenantId) .GroupBy(s => s.StatusId) .Select(g => new { @@ -1130,15 +1154,29 @@ namespace Marco.Pms.Services.Service await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); return await dbContext.ExpensesStatusMaster .AsNoTracking() - .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId)); + .FirstOrDefaultAsync(es => es.Id == Guid.Parse(model.StatusId) && es.TenantId == tenantId); }); + var permissionStatusMappingTask = Task.Run(async () => + { + await using var dbContext = await _dbContextFactory.CreateDbContextAsync(); + return await dbContext.StatusPermissionMapping + .Where(ps => ps.TenantId == tenantId) + .GroupBy(ps => ps.StatusId) + .Select(g => new + { + StatusId = g.Key, + PermissionIds = g.Select(ps => ps.PermissionId).ToList() + }).ToListAsync(); + }); + // Await all prerequisite checks at once. - await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask); + await Task.WhenAll(projectTask, expenseTypeTask, paymentModeTask, statusMappingTask, paidByTask, createdByTask, statusTask, permissionStatusMappingTask); var project = projectTask.Result; var expenseType = expenseTypeTask.Result; var paymentMode = paymentModeTask.Result; var statusMapping = statusMappingTask.Result; + var permissionStatusMappings = permissionStatusMappingTask.Result; var paidBy = paidByTask.Result; var createdBy = createdByTask.Result; @@ -1157,7 +1195,15 @@ namespace Marco.Pms.Services.Service var status = statusTask.Result; response.Status = _mapper.Map(status); } + response.Status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == Guid.Parse(model.StatusId)).Select(ps => ps.PermissionIds).FirstOrDefault(); response.NextStatus = _mapper.Map>(statusMapping.NextStatus); + if (response.NextStatus != null) + { + foreach (var status in response.NextStatus) + { + status.PermissionIds = permissionStatusMappings.Where(ps => ps.StatusId == status.Id).Select(ps => ps.PermissionIds).FirstOrDefault(); + } + } } foreach (var document in model.Documents)