diff --git a/Marco.Pms.Services/Service/ProjectServices.cs b/Marco.Pms.Services/Service/ProjectServices.cs index 324c282..3cbd794 100644 --- a/Marco.Pms.Services/Service/ProjectServices.cs +++ b/Marco.Pms.Services/Service/ProjectServices.cs @@ -2634,14 +2634,36 @@ namespace Marco.Pms.Services.Service var permissionService = scope.ServiceProvider.GetRequiredService(); // Retrieve the project by projectId and tenantId - var project = await _context.Projects - .AsNoTracking() - .FirstOrDefaultAsync(p => p.Id == projectId && p.TenantId == tenantId); - - if (project == null) + var projectTask = Task.Run(async () => { - _logger.LogWarning("Project not found. ProjectId: {ProjectId}, TenantId: {TenantId}", projectId, tenantId); - return ApiResponse.ErrorResponse("Project not found", "Project not found in database", 404); + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Projects.AsNoTracking().Include(p => p.Promoter).Include(p => p.PMC).FirstOrDefaultAsync(p => p.Id == projectId && p.TenantId == tenantId); + }); + + var tenantTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.Tenants.AsNoTracking().Include(t => t.Organization).FirstOrDefaultAsync(t => t.Id == tenantId); + }); + var projectServiceTask = Task.Run(async () => + { + await using var context = await _dbContextFactory.CreateDbContextAsync(); + return await context.ProjectServiceMappings + .AsNoTracking() + .Include(ps => ps!.Service) + .Where(ps => ps.ProjectId == projectId && ps.TenantId == tenantId).ToListAsync(); + }); + + await Task.WhenAll(projectTask, tenantTask, projectServiceTask); + + var project = projectTask.Result; + var tenant = tenantTask.Result; + var projectService = projectServiceTask.Result; + + if (project == null || tenant == null) + { + _logger.LogWarning("Project {ProjectId} not found in database for tenant {TenantId}", projectId, tenantId); + return ApiResponse.ErrorResponse("Project not found", "Project not found", 404); } // Check if the logged in employee has permission to access the project @@ -2653,14 +2675,21 @@ namespace Marco.Pms.Services.Service } // Fetch all project-organization mappings with related service and organization data - var projectOrgMappings = await _context.ProjectOrgMappings + var projectOrgMappingsQuery = _context.ProjectOrgMappings .AsNoTracking() .Include(po => po.ProjectService) .ThenInclude(ps => ps!.Service) .Include(po => po.Organization) .Where(po => po.ProjectService != null && po.ProjectService.ProjectId == projectId - && po.TenantId == tenantId) + && po.TenantId == tenantId); + + if (loggedInEmployee.OrganizationId != project.PMCId && loggedInEmployee.OrganizationId != project.PromoterId && loggedInEmployee.OrganizationId != tenant.OrganizationId) + { + projectOrgMappingsQuery = projectOrgMappingsQuery.Where(po => po.ParentOrganizationId == loggedInEmployee.OrganizationId || po.OrganizationId == loggedInEmployee.OrganizationId); + } + + var projectOrgMappings = await projectOrgMappingsQuery .Distinct() .ToListAsync(); @@ -2682,6 +2711,65 @@ namespace Marco.Pms.Services.Service }) .ToList(); + if (loggedInEmployee.OrganizationId == project.PMCId || loggedInEmployee.OrganizationId == project.PromoterId || loggedInEmployee.OrganizationId == tenant.OrganizationId) + { + var pmc = project.PMC; + var promoter = project.Promoter; + var organization = tenant.Organization; + + var employee = await _context.Employees.AsNoTracking().Include(e => e.JobRole).FirstOrDefaultAsync(e => e.OrganizationId == loggedInEmployee.OrganizationId && e.IsPrimary); + + var assignedBy = _mapper.Map(employee); + var assignedDate = project.StartDate.HasValue ? project.StartDate.Value : DateTime.UtcNow; + var completionDate = project.EndDate; + + if (!response.Any(r => r.Id == project.PMCId) && pmc != null) + { + response.Add(new ProjectOrganizationVM + { + Id = pmc.Id, + Name = pmc.Name, + Email = pmc.Email, + ContactPerson = pmc.ContactPerson, + SPRID = pmc.SPRID, + logoImage = pmc.logoImage, + AssignedBy = assignedBy, + AssignedDate = assignedDate, + CompletionDate = completionDate + }); + } + if (!response.Any(r => r.Id == project.PromoterId) && promoter != null) + { + response.Add(new ProjectOrganizationVM + { + Id = promoter.Id, + Name = promoter.Name, + Email = promoter.Email, + ContactPerson = promoter.ContactPerson, + SPRID = promoter.SPRID, + logoImage = promoter.logoImage, + AssignedBy = assignedBy, + AssignedDate = assignedDate, + CompletionDate = completionDate + }); + } + if (!response.Any(r => r.Id == tenant.OrganizationId) && organization != null) + { + response.Add(new ProjectOrganizationVM + { + Id = organization.Id, + Name = organization.Name, + Email = organization.Email, + ContactPerson = organization.ContactPerson, + SPRID = organization.SPRID, + logoImage = organization.logoImage, + AssignedBy = assignedBy, + AssignedDate = assignedDate, + CompletionDate = completionDate + }); + } + } + _logger.LogInfo("Fetched {Count} assigned organizations for ProjectId: {ProjectId}", response.Count, projectId); return ApiResponse.SuccessResponse(response, "Successfully fetched the list of organizations assigned to the project", 200);