diff --git a/src/Controller/OrganizationController.php b/src/Controller/OrganizationController.php index 3eb3de1..c98c354 100644 --- a/src/Controller/OrganizationController.php +++ b/src/Controller/OrganizationController.php @@ -2,6 +2,7 @@ namespace App\Controller; +use App\Entity\Actions; use App\Entity\Apps; use App\Entity\Roles; use App\Entity\User; @@ -139,5 +140,52 @@ class OrganizationController extends AbstractController ]); } + #[Route(path: '/{id}', name: 'show', methods: ['GET'])] + public function show($id) + { + $this->denyAccessUnlessGranted('ROLE_ADMIN'); + $organization = $this->entityManager->getRepository(Organizations::class)->find($id); + $actingUser = $this->userService->getUserByIdentifier($this->getUser()->getUserIdentifier()); + if (!$organization) { + $this->addFlash('error', self::NOT_FOUND); + return $this->redirectToRoute('organization_index'); + } + //check if the user is admin of the organization + if (!$this->isGranted("ROLE_SUPER_ADMIN") && !$this->userService->isAdminOfOrganization($organization)) { + $this->createNotFoundException(self::NOT_FOUND); + } + $newUO = $this->entityManager->getRepository(UsersOrganizations::class)->findNewestUO($organization); + $newUsers = []; + foreach ($newUO as $uo) { + $newUsers[] = $uo->getUsers(); + } + $adminUO = $this->entityManager->getRepository(UsersOrganizations::class)->findAdminsInOrganization($organization); + $adminUsers = []; + foreach ($adminUO as $uo) { + $adminUsers[] = $uo->getUsers(); + } + $uos = $this->entityManager + ->getRepository(UsersOrganizations::class) + ->findBy(['organization' => $organization, 'isActive' => true]); + + $users = $this->userService->formatOrgUsers($uos); + + $allApps = $this->entityManager->getRepository(Apps::class)->findAll(); // appsAll + $orgApps = $organization->getApps()->toArray(); // apps + + $apps = $this->organizationsService->appsAccess($allApps, $orgApps); + + $actions = $this->entityManager->getRepository(Actions::class)->findBy(['Organization' => $organization]); + $activities = $this->actionService->formatActivities($actions); + return $this->render('organization/show.html.twig', [ + 'organization' => $organization, + 'newUsers' => $newUsers, + 'adminUsers' => $adminUsers, + 'users' => $users, + 'applications' => $apps, + 'activities' => $activities, + ]); + } + } diff --git a/src/Repository/UsersOrganizationsRepository.php b/src/Repository/UsersOrganizationsRepository.php index a1a5388..c15ce1c 100644 --- a/src/Repository/UsersOrganizationsRepository.php +++ b/src/Repository/UsersOrganizationsRepository.php @@ -2,6 +2,8 @@ namespace App\Repository; +use App\Entity\Organizations; +use App\Entity\User; use App\Entity\UsersOrganizations; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Persistence\ManagerRegistry; @@ -79,4 +81,59 @@ class UsersOrganizationsRepository extends ServiceEntityRepository return $qb->getQuery()->getResult(); } + + /** + * Find 10 newest Users in an Organization. + * + * @param Organizations $organization + * @return User[] + */ + public function findNewestUO(Organizations $organization): array + { + $qb = $this->createQueryBuilder('uo') + ->select('uo', 'u') + ->leftJoin('uo.users', 'u') + ->where('uo.organization = :org') + ->andWhere('uo.isActive = :uoActive') + ->andWhere('u.isActive = :uActive') + ->andWhere('u.isDeleted = :uDeleted') + ->orderBy('u.createdAt', 'DESC') + ->setMaxResults(10) + ->setParameter('org', $organization) + ->setParameter('uoActive', true) + ->setParameter('uActive', true) + ->setParameter('uDeleted', false); + + return $qb->getQuery()->getResult(); + } + + /** + * Find all the admins of an Organization. + * limited to 10 results. + * + * @param Organizations $organization + * @return User[] + */ + public function findAdminsInOrganization(Organizations $organization): array + { + $qb = $this->createQueryBuilder('uo') + ->select('uo', 'u') + ->leftJoin('uo.users', 'u') + ->leftJoin('uo.userOrganizatonApps', 'uoa') + ->leftJoin('uoa.role', 'r') + ->where('uo.organization = :org') + ->andWhere('uo.isActive = :uoActive') + ->andWhere('u.isActive = :uActive') + ->andWhere('u.isDeleted = :uDeleted') + ->andWhere('r.name = :roleAdmin') + ->orderBy('u.surname', 'ASC') + ->setMaxResults(10) + ->setParameter('org', $organization) + ->setParameter('uoActive', true) + ->setParameter('uActive', true) + ->setParameter('uDeleted', false) + ->setParameter('roleAdmin', 'ADMIN'); + + return $qb->getQuery()->getResult(); + } } diff --git a/src/Service/ActionService.php b/src/Service/ActionService.php index 52f8c57..1474569 100644 --- a/src/Service/ActionService.php +++ b/src/Service/ActionService.php @@ -30,6 +30,26 @@ readonly class ActionService return '#C76633'; } + /** + * Format activities to include the computed color. + * + * @param Actions[] $activities + * @return array> + */ + public function formatActivities(array $activities): array + { + return array_map(function (Actions $activity) { + return [ + 'date' => $activity->getDate(), + 'actionType' => $activity->getActionType(), + 'users' => $activity->getUsers(), + 'organization' => $activity->getOrganization(), + 'description' => $activity->getDescription(), + 'color' => $this->getActivityColor($activity->getDate()) + ]; + }, $activities); + } + public function createAction( string $actionType, User $user, diff --git a/src/Service/OrganizationsService.php b/src/Service/OrganizationsService.php index 3e437d1..35bc53e 100644 --- a/src/Service/OrganizationsService.php +++ b/src/Service/OrganizationsService.php @@ -45,4 +45,27 @@ class OrganizationsService } } + /** + * Merge all apps with org apps and add a "hasAccess" flag. + * + * @param array $appsAll + * @param array $apps + * @return array + */ + public function appsAccess(array $appsAll, array $apps): array + { + // Build a quick lookup of app IDs the org has access to + $orgAppIds = array_map(static fn(Apps $app) => $app->getId(), $apps); + + $result = []; + foreach ($appsAll as $app) { + $result[] = [ + 'entity' => $app, // Keep the full entity for Twig + 'hasAccess' => in_array($app->getId(), $orgAppIds, true), + ]; + } + + return $result; + } + } diff --git a/src/Service/UserService.php b/src/Service/UserService.php index c4a2dfd..8d522e4 100644 --- a/src/Service/UserService.php +++ b/src/Service/UserService.php @@ -266,4 +266,27 @@ class UserService throw new FileException('File upload failed: ' . $e->getMessage()); } } + + /** + * Format users of a specific organization. + * + * @param UsersOrganizations[] $userOrganizations + * @return array + */ + public function formatOrgUsers(array $userOrganizations): array + { + $users = []; + + foreach ($userOrganizations as $uo) { + $user = $uo->getUsers(); + + $users[] = [ + 'entity' => $user, + 'connected' => $this->isUserConnected($user->getUserIdentifier()), + 'isActive' => (bool)$uo->isActive(), + ]; + } + + return $users; + } } diff --git a/templates/applications/appSmall.html.twig b/templates/applications/appSmall.html.twig index 356ddc6..8c8652c 100644 --- a/templates/applications/appSmall.html.twig +++ b/templates/applications/appSmall.html.twig @@ -3,21 +3,21 @@
-

Logo application - {{ application.application.name }}

+

Logo application + {{ application.entity.name }}

-

{{ application.application.descriptionSmall }}

- {% if application.has_access %} +

{{ application.entity.descriptionSmall }}

+ {% if application.hasAccess %}
- Y + Y accéder Gérer l'application
{% else %}Demander l'accès - +{#TODO: page d'accès#} {% endif %}
diff --git a/templates/organization/index.html.twig b/templates/organization/index.html.twig index 5e71f04..2977229 100644 --- a/templates/organization/index.html.twig +++ b/templates/organization/index.html.twig @@ -39,9 +39,10 @@ {{ organization.name }} {{ organization.email }} - {# #} - {# {{ ux_icon('fa6-regular:eye', {height: '30px', width: '30px'}) }} #} - {# #} + + {{ ux_icon('fa6-regular:eye', {height: '30px', width: '30px'}) }} + {% endfor %} diff --git a/templates/organization/show.html.twig b/templates/organization/show.html.twig index 2f1790b..e4e3f5a 100644 --- a/templates/organization/show.html.twig +++ b/templates/organization/show.html.twig @@ -5,7 +5,7 @@
{% if organization.logoUrl %} - Organization logo {% endif %}

{{ organization.name|title }} - Dashboard

@@ -14,13 +14,13 @@ {% if is_granted("ROLE_SUPER_ADMIN") %} Gérer l'organisation - {% if organization.active %} - Désactiver l'organisation - {% else %} - Activer l'organisation - {% endif %} +{# {% if organization.active %}#} +{# Désactiver l'organisation#} +{# {% else %}#} +{# Activer l'organisation#} +{# {% endif %}#} {% elseif is_granted("ROLE_ADMIN") %} Gérer mon organisation @@ -48,13 +48,13 @@ } %}
-
+{#
#} {% include 'user/userList.html.twig' with { title: 'Mes utilisateurs', organizationId: organization.id, empty_message: 'Aucun utilisateurs trouvé.' } %} -
+{#
#} {# APPLICATION ROW #}
{% for application in applications %}